From 0e6c5d97c12ae5eb100dc835a2ec6df30c9ebb95 Mon Sep 17 00:00:00 2001 From: "Chang.H.S" Date: Fri, 30 Nov 2012 18:09:08 +0900 Subject: [PATCH] relocate packages on recipes-base/recipes-enigma2/recipes-wlan. --- .../dreambox-keymaps/dreambox-keymaps.bb | 18 - .../dreambox-keymaps/dreambox-keymaps/GPL-1.0 | 252 - .../dreambox-keymaps/dream-de.info | 2 - .../dreambox-keymaps/dream-de.kmap | Bin 2823 -> 0 bytes .../dreambox-keymaps/dreambox-keymaps/eng.info | 2 - .../dreambox-keymaps/dreambox-keymaps/eng.kmap | Bin 2823 -> 0 bytes ...020_auto_net_path_sortlocale_mountoptions.patch | 19 - .../037_let_debian_rules_decide_on_CFLAGS.patch | 34 - ...042_default_auto_master_all_commented_out.patch | 18 - .../autofs-4.1.4/060_non_replicated_ping.patch | 228 - .../autofs/autofs-4.1.4/061_multi_parse_fix.patch | 60 - .../autofs/autofs-4.1.4/062_fix_memory_leak.patch | 32 - .../autofs/autofs-4.1.4/063_misc_fixes.patch | 82 - .../064_support_options_on_nis_maps.patch | 45 - .../autofs-4.1.4/065_fix_master_map_in_ldap.patch | 22 - .../066_canonicalise_mount_points.patch | 24 - .../067_allow_disabling_bind_mounts.patch | 77 - .../autofs-4.1.4/067_ldap_no_first_message.patch | 28 - .../autofs-4.1.4/068_fix_invalid_rpcgen_code.patch | 21 - .../069_support_spaces_in_smb_share_names.patch | 19 - .../autofs/autofs-4.1.4/070_fix_regex_typo.patch | 19 - .../autofs/autofs-4.1.4/071_fix_ldap_mounts.patch | 19 - .../autofs-4.1.4/072_fix_auto_net_sort.patch | 19 - .../autofs-4.1.4/073_configurable_locking.patch | 173 - .../autofs/autofs-4.1.4/074_auto_smb_cifs.patch | 19 - .../autofs-4.1.4/075_auto_net_escape_hash.patch | 16 - .../autofs/autofs-4.1.4/076_ldap_deprecated.patch | 265 - .../autofs/autofs-4.1.4/078_locking_fix_1.patch | 82 - .../autofs-4.1.4/079_no_unlink_upstream.patch | 55 - .../080_auto_smb_probe_credentials.patch | 37 - .../081_auto_net_showmount_quotes.patch | 19 - .../autofs-4.1.4/082_samples_makefile_typo.patch | 18 - .../083_clarify_program_map_outputsyntax.patch | 19 - .../autofs/autofs-4.1.4/084_init_lsb_header.patch | 26 - .../autofs-4.1.4/085_auto_net_lp111612.patch | 20 - .../autofs/autofs-4.1.4/Makefile.rules-cross.patch | 19 - .../recipes-base/autofs/autofs-4.1.4/auto.hotplug | 1 - .../recipes-base/autofs/autofs-4.1.4/auto.master | 11 - .../recipes-base/autofs/autofs-4.1.4/auto.network | 2 - .../autofs/autofs-4.1.4/autofs.default | 2 - .../recipes-base/autofs/autofs-4.1.4/autofs.init | 803 - .../recipes-base/autofs/autofs-4.1.4/cross.patch | 42 - .../recipes-base/autofs/autofs-4.1.4/install.patch | 71 - .../recipes-base/autofs/autofs-4.1.4/no-bash.patch | 18 - .../autofs/autofs-4.1.4/volatiles.99_autofs | 2 - .../recipes-base/autofs/autofs_4.1.4.bb | 80 - .../dreambox-keymaps/dreambox-keymaps.bb | 18 - .../dreambox-keymaps/dreambox-keymaps/GPL-1.0 | 252 - .../dreambox-keymaps/dream-de.info | 2 - .../dreambox-keymaps/dream-de.kmap | Bin 2823 -> 0 bytes .../dreambox-keymaps/dreambox-keymaps/eng.info | 2 - .../dreambox-keymaps/dreambox-keymaps/eng.kmap | Bin 2823 -> 0 bytes .../recipes-base/fakelocale/fakelocale.bb | 48 - .../recipes-base/fakelocale/files/locale.alias | 28 - .../firmwares/files/Marvell-Licence.txt | 40 - .../recipes-base/firmwares/firmware-drxd-a2.bb | 9 - .../recipes-base/firmwares/firmware-dvb-af9005.bb | 9 - .../firmwares/firmware-dvb-fe-af9013.bb | 9 - .../firmwares/firmware-dvb-usb-af9015.bb | 9 - .../firmwares/firmware-dvb-usb-af9035.bb | 9 - .../firmwares/firmware-dvb-usb-avertv-a800.bb | 9 - .../firmwares/firmware-dvb-usb-dib0700.bb | 12 - .../firmwares/firmware-dvb-usb-dibusb.bb | 11 - .../firmwares/firmware-dvb-usb-digitv.bb | 9 - .../firmwares/firmware-dvb-usb-ec168.bb | 9 - .../firmwares/firmware-dvb-usb-nova-t-usb2.bb | 10 - .../firmwares/firmware-dvb-usb-sms1xxx-hcw-dvbt.bb | 11 - .../firmware-dvb-usb-sms1xxx-nova-dvbt.bb | 10 - .../firmwares/firmware-dvb-usb-ttusb-budget.bb | 9 - .../firmwares/firmware-dvb-usb-umt-010.bb | 9 - .../firmwares/firmware-dvb-usb-wt220u-zl0353.bb | 9 - .../firmwares/firmware-dvb-usb-xc5000.bb | 10 - .../recipes-base/firmwares/firmware-dvb-usb.bb | 13 - .../recipes-base/firmwares/firmware-htc9271.bb | 9 - .../recipes-base/firmwares/firmware-rt2561.bb | 9 - .../recipes-base/firmwares/firmware-rt3070.bb | 10 - .../recipes-base/firmwares/firmware-rtl8721u.bb | 9 - .../recipes-base/firmwares/linux-firmware.inc | 11 - .../firmwares/marvell-gspi-fw/9.70.3-p37.tar.gz | Bin 92016 -> 0 bytes .../firmwares/marvell-gspi-fw_9.70.3-p37.bb | 20 - .../firmwares/marvell-sdio-fw/9.70.3-p37.tar.gz | Bin 88003 -> 0 bytes .../firmwares/marvell-sdio-fw_9.70.3-p37.bb | 19 - .../hddtemp/hddtemp/hddtemp-no-nls-support.patch | 66 - .../recipes-base/hddtemp/hddtemp_0.3-beta15.bb | 22 - meta-openvuplus/recipes-base/joe/joe_3.7.bb | 14 - .../mc/mc-4.8.1/optional-extfs-dir.patch | 18 - .../recipes-base/mc/mc-4.8.1/optional-hints.patch | 17 - .../mc/mc-4.8.1/optional-sfs-ini.patch | 17 - .../mc/mc-4.8.1/optional-syntax-file.patch | 18 - meta-openvuplus/recipes-base/mc/mc_4.8.1.bbappend | 26 - .../mtd/mtd-utils-1.4.9/disable-ubi.patch | 19 - .../recipes-base/mtd/mtd-utils_1.4.9.bbappend | 7 - meta-openvuplus/recipes-base/ncdu/ncdu_1.8.bb | 11 - .../recipes-base/opkg/opkg-collateral.bbappend | 3 - .../recipes-base/opkg/opkg-collateral/dest | 5 - ...g-losing-auto_installed-flag-on-upgrading.patch | 32 - .../0002-Don-t-mark-Conflicts-as-Depends.patch | 29 - .../0003-Statically-link-libopkg-and-libbb.patch | 107 - ...Makefile.am-remove-g-and-O-compiler-flags.patch | 50 - ...-remove-unused-variables-to-fix-compiler-.patch | 48 - ...sh_fetch_conflicts-fix-possible-segfaults.patch | 34 - ...tch_conflicts-move-iteration-over-conflic.patch | 94 - ...tch_conflicts-take-into-account-conflicts.patch | 49 - ...Recommended-packages-to-the-depended_upon.patch | 100 - .../0010-opkg_remove-auto-delete-.pyo-files.patch | 33 - .../recipes-base/opkg/opkg_svn.bbappend | 14 - .../recipes-base/ppp/ppp_2.4.5.bbappend | 8 - ...-client-Push-the-domain-and-netbios-name-.patch | 31 - .../samba/samba-3.0.37/configure.patch | 213 - .../samba/samba-3.0.37/kernel-oplocks.patch | 20 - .../samba-3.0.37/samba-3.0-CVE-2012-0870.patch | 91 - .../samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch | 59 - .../samba-3.0.37/uclibc-strlcpy-strlcat.patch | 46 - .../recipes-base/samba/samba/01samba-kill | 5 - .../recipes-base/samba/samba/01samba-start | 3 - .../recipes-base/samba/samba/config-lfs.patch | 47 - meta-openvuplus/recipes-base/samba/samba/init | 58 - .../recipes-base/samba/samba/quota.patch | 11 - meta-openvuplus/recipes-base/samba/samba/smb.conf | 29 - meta-openvuplus/recipes-base/samba/samba/tdb.pc | 11 - .../recipes-base/samba/samba/volatiles.03_samba | 2 - meta-openvuplus/recipes-base/samba/samba_3.0.37.bb | 20 - .../recipes-base/samba/samba_3.0.37.bbappend | 31 - .../recipes-base/shadow/shadow-securetty/securetty | 275 - .../shadow/shadow-securetty_4.1.4.3.bbappend | 3 - .../recipes-base/smartmontools/smartmontools.inc | 10 - .../smartmontools/smartmontools_5.42.bb | 6 - .../recipes-base/tasks/task-vuplus-base.bb | 8 - .../recipes-base/tasks/task-vuplus-base.inc | 77 - .../recipes-base/timezones/files/GPL-1.0 | 252 - .../recipes-base/timezones/files/zoneinfo.tar.bz2 | Bin 38585 -> 0 bytes .../timezones/timezones-alternative.bb | 25 - .../recipes-base/tuxbox/tuxbox-common_0.1.bb | 19 - .../recipes-base/tuxcom/tuxbox-tuxcom-32bpp.bb | 32 - .../tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff | 1136 - .../tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff | 48 - .../tuxcom/tuxbox-tuxcom-32bpp/add_font.diff | Bin 67589 -> 0 bytes .../tuxcom/tuxbox-tuxcom-32bpp/fix_smstext.diff | 48 - .../tuxcom/tuxbox-tuxcom-32bpp/largefile.diff | 11 - .../tuxcom/tuxbox-tuxcom-32bpp/makefiles.diff | 505 - .../support_newer_freetype.diff | 78 - .../recipes-base/tuxtxt/tuxbox-libtuxtxt.bb | 28 - .../tuxtxt/tuxbox-libtuxtxt/32bpp.diff | 738 - .../tuxtxt/tuxbox-libtuxtxt/acinclude.m4 | 385 - .../tuxbox-libtuxtxt/allow_different_demux.diff | 95 - .../tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch | 11 - .../tuxtxt/tuxbox-libtuxtxt/libz.patch | 10 - .../tuxbox-libtuxtxt/resize_framebuffer.diff | 48 - .../tuxtxt/tuxbox-libtuxtxt/videodev2.patch | 11 - .../recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp.bb | 32 - .../tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff | 388 - .../tuxbox-tuxtxt-32bpp/add_advanced_rc.diff | 161 - .../tuxbox-tuxtxt-32bpp/add_new_default_conf.diff | 36 - .../tuxbox-tuxtxt-32bpp/allow_different_demux.diff | 77 - .../tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff | 548 - .../tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff | 142 - .../tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py | 60 - .../tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch | 12 - .../recipes-base/usbtunerhelper/usbtunerhelper.bb | 23 - .../usbtunerhelper/usbtunerhelper/GPL-2.0 | 132 - .../usbtunerhelper/usbtunerhelper.sh | 24 - .../recipes-base/vsftpd/vsftpd/01-builddefs.patch | 18 - .../recipes-base/vsftpd/vsftpd/02-config.patch | 120 - .../recipes-base/vsftpd/vsftpd/03-db-doc.patch | 19 - .../recipes-base/vsftpd/vsftpd/04-link-local.patch | 91 - .../vsftpd/vsftpd/05-whitespaces.patch | 81 - .../recipes-base/vsftpd/vsftpd/06-greedy.patch | 32 - .../recipes-base/vsftpd/vsftpd/07-utf8.patch | 58 - .../recipes-base/vsftpd/vsftpd/08-manpage.patch | 23 - .../recipes-base/vsftpd/vsftpd/09-s390.patch | 15 - .../recipes-base/vsftpd/vsftpd/10-remote-dos.patch | 69 - .../recipes-base/vsftpd/vsftpd/vsftpd.conf | 105 - .../recipes-base/vsftpd/vsftpd/vsftpd.socket | 8 - .../recipes-base/vsftpd/vsftpd/vsftpd.xinetd.in | 7 - .../recipes-base/vsftpd/vsftpd/vsftpd@.service | 5 - .../recipes-base/vsftpd/vsftpd_2.3.5.bb | 100 - .../vuplus-compat/vuplus-compat_1.0.bb | 22 - .../recipes-base/vuplus-vucamd/vuplus-vucamd.bb | 25 - .../vuplus-vucamd/vuplus-vucamd/Proprietary | 1 - .../vuplus-vucamd/vuplus-vucamd/vucamd | Bin 70300 -> 0 bytes .../vuplus-vucamd/vuplus-vucamd/vucamd.sh | 38 - .../recipes-base/zeroconf/zeroconf_0.9.bbappend | 5 - ...020_auto_net_path_sortlocale_mountoptions.patch | 19 + .../037_let_debian_rules_decide_on_CFLAGS.patch | 34 + ...042_default_auto_master_all_commented_out.patch | 18 + .../autofs-4.1.4/060_non_replicated_ping.patch | 228 + .../autofs/autofs-4.1.4/061_multi_parse_fix.patch | 60 + .../autofs/autofs-4.1.4/062_fix_memory_leak.patch | 32 + .../autofs/autofs-4.1.4/063_misc_fixes.patch | 82 + .../064_support_options_on_nis_maps.patch | 45 + .../autofs-4.1.4/065_fix_master_map_in_ldap.patch | 22 + .../066_canonicalise_mount_points.patch | 24 + .../067_allow_disabling_bind_mounts.patch | 77 + .../autofs-4.1.4/067_ldap_no_first_message.patch | 28 + .../autofs-4.1.4/068_fix_invalid_rpcgen_code.patch | 21 + .../069_support_spaces_in_smb_share_names.patch | 19 + .../autofs/autofs-4.1.4/070_fix_regex_typo.patch | 19 + .../autofs/autofs-4.1.4/071_fix_ldap_mounts.patch | 19 + .../autofs-4.1.4/072_fix_auto_net_sort.patch | 19 + .../autofs-4.1.4/073_configurable_locking.patch | 173 + .../autofs/autofs-4.1.4/074_auto_smb_cifs.patch | 19 + .../autofs-4.1.4/075_auto_net_escape_hash.patch | 16 + .../autofs/autofs-4.1.4/076_ldap_deprecated.patch | 265 + .../autofs/autofs-4.1.4/078_locking_fix_1.patch | 82 + .../autofs-4.1.4/079_no_unlink_upstream.patch | 55 + .../080_auto_smb_probe_credentials.patch | 37 + .../081_auto_net_showmount_quotes.patch | 19 + .../autofs-4.1.4/082_samples_makefile_typo.patch | 18 + .../083_clarify_program_map_outputsyntax.patch | 19 + .../autofs/autofs-4.1.4/084_init_lsb_header.patch | 26 + .../autofs-4.1.4/085_auto_net_lp111612.patch | 20 + .../autofs/autofs-4.1.4/Makefile.rules-cross.patch | 19 + .../autofs/autofs-4.1.4/auto.hotplug | 1 + .../autofs/autofs-4.1.4/auto.master | 11 + .../autofs/autofs-4.1.4/auto.network | 2 + .../autofs/autofs-4.1.4/autofs.default | 2 + .../autofs/autofs-4.1.4/autofs.init | 803 + .../autofs/autofs-4.1.4/cross.patch | 42 + .../autofs/autofs-4.1.4/install.patch | 71 + .../autofs/autofs-4.1.4/no-bash.patch | 18 + .../autofs/autofs-4.1.4/volatiles.99_autofs | 2 + .../recipes-connectivity/autofs/autofs_4.1.4.bb | 80 + .../hostap/hostap-daemon-0.7.3/defconfig | 145 + .../hostap/hostap-daemon-0.7.3/init | 37 + .../hostap/hostap-daemon-0.7.inc | 25 + .../hostap/hostap-daemon_0.7.3.bb | 17 + .../openssl/openssl-0.9.8x/configure-targets.patch | 25 + .../openssl/openssl-0.9.8x/debian/ca.patch | 22 + .../openssl-0.9.8x/debian/config-hurd.patch | 17 + .../openssl-0.9.8x/debian/debian-targets.patch | 56 + .../openssl-0.9.8x/debian/engines-path.patch | 49 + .../openssl-0.9.8x/debian/kfreebsd-pipe.patch | 15 + .../openssl-0.9.8x/debian/make-targets.patch | 15 + .../openssl/openssl-0.9.8x/debian/man-dir.patch | 15 + .../openssl-0.9.8x/debian/man-section.patch | 34 + .../openssl/openssl-0.9.8x/debian/no-rpath.patch | 15 + .../openssl-0.9.8x/debian/no-symbolic.patch | 15 + .../openssl/openssl-0.9.8x/debian/perl-path.diff | 762 + .../openssl/openssl-0.9.8x/debian/pic.patch | 303 + .../openssl/openssl-0.9.8x/debian/pkg-config.patch | 36 + .../openssl/openssl-0.9.8x/debian/rc4-amd64.patch | 16 + .../openssl/openssl-0.9.8x/debian/rehash-crt.patch | 35 + .../openssl/openssl-0.9.8x/debian/rehash_pod.patch | 62 + .../openssl/openssl-0.9.8x/debian/series | 20 + .../openssl-0.9.8x/debian/shared-lib-ext.patch | 16 + .../openssl/openssl-0.9.8x/debian/stddef.patch | 14 + .../openssl-0.9.8x/debian/version-script.patch | 35 + .../openssl/openssl-0.9.8x/parallel-make-fix.patch | 20 + .../openssl/openssl-0.9.8x/shared-libs.patch | 50 + .../recipes-connectivity/openssl/openssl_0.9.8x.bb | 38 + .../recipes-connectivity/ppp/ppp_2.4.5.bbappend | 8 + .../ralink/rt3070-2.5.0.3/config.patch | 16 + .../ralink/rt3070-2.5.0.3/makefile.patch | 22 + .../recipes-connectivity/ralink/rt3070_2.5.0.3.bb | 26 + .../r8192cu-3.1.2590.20110922/linux_3.1.patch | 24 + .../r8192cu-3.1.2590.20110922/makefile.patch | 26 + .../rtl8192_8188CU_linux_v3.1.2590.20110922.tar.gz | Bin 0 -> 908652 bytes .../realtek/r8192cu_3.1.2590.20110922.bb | 34 + .../recipes-connectivity/realtek/r8712u/config | 27 + .../realtek/r8712u/strcasecmp.patch | 14 + .../realtek/r8712u_2.6.6.0.20101111.bb | 30 + .../rt2870sta/files/RT2870STA.dat | 79 + .../rt2870sta/rt2870sta_1.0.0.bb | 18 + .../rt73-firmware/rt73-firmware_1.8.bb | 17 + ...-client-Push-the-domain-and-netbios-name-.patch | 31 + .../samba/samba-3.0.37/configure.patch | 213 + .../samba/samba-3.0.37/kernel-oplocks.patch | 20 + .../samba-3.0.37/samba-3.0-CVE-2012-0870.patch | 91 + .../samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch | 59 + .../samba-3.0.37/uclibc-strlcpy-strlcat.patch | 46 + .../recipes-connectivity/samba/samba/01samba-kill | 5 + .../recipes-connectivity/samba/samba/01samba-start | 3 + .../samba/samba/config-lfs.patch | 47 + .../recipes-connectivity/samba/samba/init | 58 + .../recipes-connectivity/samba/samba/quota.patch | 11 + .../recipes-connectivity/samba/samba/smb.conf | 29 + .../recipes-connectivity/samba/samba/tdb.pc | 11 + .../samba/samba/volatiles.03_samba | 2 + .../recipes-connectivity/samba/samba_3.0.37.bb | 20 + .../samba/samba_3.0.37.bbappend | 31 + .../recipes-connectivity/tasks/task-vuplus-wlan.bb | 55 + .../vsftpd/vsftpd/01-builddefs.patch | 18 + .../vsftpd/vsftpd/02-config.patch | 120 + .../vsftpd/vsftpd/03-db-doc.patch | 19 + .../vsftpd/vsftpd/04-link-local.patch | 91 + .../vsftpd/vsftpd/05-whitespaces.patch | 81 + .../vsftpd/vsftpd/06-greedy.patch | 32 + .../vsftpd/vsftpd/07-utf8.patch | 58 + .../vsftpd/vsftpd/08-manpage.patch | 23 + .../vsftpd/vsftpd/09-s390.patch | 15 + .../vsftpd/vsftpd/10-remote-dos.patch | 69 + .../recipes-connectivity/vsftpd/vsftpd/vsftpd.conf | 105 + .../vsftpd/vsftpd/vsftpd.socket | 8 + .../vsftpd/vsftpd/vsftpd.xinetd.in | 7 + .../vsftpd/vsftpd/vsftpd@.service | 5 + .../recipes-connectivity/vsftpd/vsftpd_2.3.5.bb | 100 + .../wlan-rt73/files/changeiface.patch | 38 + .../wlan-rt73/files/make.patch | 20 + .../recipes-connectivity/wlan-rt73/wlan-rt73.bb | 43 + .../wpa-supplicant-0.7.3/action_wpa.sh | 50 + .../wpa-supplicant-0.7.3/functions.sh | 1015 + .../wpa-supplicant-0.7.3/ifupdown.sh | 172 + .../wpa-supplicant/wpa-supplicant-0.7.3/wpa_action | 81 + .../wpa-supplicant-0.7.3/wpa_action.8 | 148 + .../wpa-supplicant/wpa-supplicant_0.7.3.bbappend | 40 + .../zd1211/zd1211-firmware_1.4.bb | 25 + .../zd1211/zd1211b/cross_compile.patch | 41 + .../zd1211/zd1211b/zdiface.patch | 12 + .../zd1211/zd1211b_2.22.0.0.bb | 32 + .../zeroconf/zeroconf_0.9.bbappend | 5 + .../libsigc++-1.2-1.2.5/autofoo.patch | 125 + .../libsigc++-1.2-1.2.5/fix-install.patch | 15 + .../libsigc++-1.2-1.2.5/pkgconfig.patch | 13 + .../libsigc++-1.2-1.2.5/to_1.2.7.patch | 159 + .../libsigc++-1.2/libsigc++-1.2_1.2.5.bb | 21 + .../mtd/mtd-utils-1.4.9/disable-ubi.patch | 19 + .../recipes-devtools/mtd/mtd-utils_1.4.9.bbappend | 7 + .../recipes-devtools/opkg/opkg-collateral.bbappend | 3 + .../recipes-devtools/opkg/opkg-collateral/dest | 5 + ...g-losing-auto_installed-flag-on-upgrading.patch | 32 + .../0002-Don-t-mark-Conflicts-as-Depends.patch | 29 + .../0003-Statically-link-libopkg-and-libbb.patch | 107 + ...Makefile.am-remove-g-and-O-compiler-flags.patch | 50 + ...-remove-unused-variables-to-fix-compiler-.patch | 48 + ...sh_fetch_conflicts-fix-possible-segfaults.patch | 34 + ...tch_conflicts-move-iteration-over-conflic.patch | 94 + ...tch_conflicts-take-into-account-conflicts.patch | 49 + ...Recommended-packages-to-the-depended_upon.patch | 100 + .../0010-opkg_remove-auto-delete-.pyo-files.patch | 33 + .../recipes-devtools/opkg/opkg_svn.bbappend | 14 + .../python/python-coherence_git.bb | 33 + .../python/python-daap/python-daap.patch | 57 + .../recipes-devtools/python/python-daap_0.7.1.bb | 17 + .../python/python-daap_0.7.1.bbappend | 5 + .../python/python-flickrapi_1.4.2.bb | 31 + .../recipes-devtools/python/python-gdata_2.0.14.bb | 21 + .../python/python-mutagen/patch.diff | 12 + .../recipes-devtools/python/python-mutagen_1.18.bb | 22 + .../python/python-native_2.7.2.bbappend | 2 + .../python/python-pycrypto/no-usr-include.patch | 11 + .../recipes-devtools/python/python-pycrypto_2.5.bb | 17 + .../python/python-transmissionrpc_hg.bb | 17 + .../python/python-twisted_12.0.0.bb | 237 + .../recipes-devtools/python/python-wifi_0.5.0.bb | 29 + .../python/python/ctypes-error-handling-fix.patch | 40 + .../python/python/fix_pthread_site.patch | 38 + .../python/python/no-ldconfig.patch | 23 + .../python/python/some_configure_fixes.patch | 32 + .../recipes-devtools/python/python_2.7.2.bbappend | 19 + .../recipes-devtools/swig/swig_2.0.4.bb | 11 + .../aio-grab/aio-grab/aio-grab_vuplus.patch | 94 - .../recipes-enigma2/aio-grab/aio-grab_0.8.bb | 7 - .../recipes-enigma2/aio-grab/aio-grab_0.8.bbappend | 8 - .../cdparanoia/cdparanoia/Makefile.in.patch | 13 - .../cdparanoia-III-10.2-privatefix.patch | 561 - .../cdparanoia/cdparanoia/configure.in.patch | 13 - .../cdparanoia/cdparanoia/fixes10.patch | 25 - .../cdparanoia/interface_Makefile.in.patch | 11 - .../cdparanoia/paranoia_Makefile.in.patch | 11 - .../recipes-enigma2/cdparanoia/cdparanoia_svn.bb | 43 - .../dreambox-dvbincludes/dreambox-dvbincludes.bb | 34 - .../dreambox-dvbincludes_1.1.bb | 26 - .../dreambox-modem-ppp-scripts/01peerdns | 3 - .../dreambox-modem-ppp-scripts/01peerdns-remove | 5 - .../dreambox-modem-ppp-scripts/dial.modem | 20 - .../dreambox-modem-ppp-scripts/disconnect.modem | 10 - .../dreambox-modem-ppp-scripts/dm800/options | 18 - .../dreambox-modem-ppp-scripts/options | 18 - .../dreambox-modem-ppp-scripts/pap-secrets | 3 - .../dreambox-modem-ppp-scripts_0.1.bb | 25 - .../dvbtools/dvb-apps-1.1.1/update-to-tip.diff | 37589 --------- .../dvbtools/dvb-apps-1.1.1/update-to-trunk.diff | 84321 ------------------- .../recipes-enigma2/dvbtools/dvb-apps_1.1.1.bb | 112 - .../recipes-enigma2/dvbtools/dvbstream_cvs.bb | 18 - .../recipes-enigma2/dvbtools/dvbtune_cvs.bb | 23 - .../recipes-enigma2/dvbtools/wscan_20101204.bb | 15 - .../enigma2/enigma2-defaultservices.bb | 20 - .../enigma2/enigma2-defaultservices/lamedb.130 | 6492 -- .../enigma2/enigma2-defaultservices/lamedb.192 | 4962 -- .../enigma2/enigma2-defaultservices/lamedb.282 | 3414 - .../enigma2/enigma2-defaultservices/sat130.info | 17 - .../enigma2/enigma2-defaultservices/sat192.info | 17 - .../enigma2/enigma2-defaultservices/sat282.info | 17 - .../recipes-enigma2/enigma2/enigma2-plugins.bb | 120 - .../enigma2/enigma2-plugins/vuplus/dreamboxweb.png | Bin 2619 -> 0 bytes .../enigma2-plugins/vuplus/dreamboxwebtv.png | Bin 1905 -> 0 bytes .../vuplus/enigma2_plugins_20110810.patch | 1808 - .../vuplus/enigma2_plugins_ac3lipsync_dolby.patch | 13 - .../enigma2_plugins_autoresolution_fix.patch | 14 - .../vuplus/enigma2_plugins_dependency.patch | 10 - .../enigma2_plugins_mytube_entry_vuplus.patch | 13 - .../vuplus/enigma2_plugins_mytube_tpm.patch | 149 - .../vuplus/enigma2_plugins_mytube_vuplus.patch | 74 - .../vuplus/enigma2_plugins_webinterface_tpm.patch | 31 - .../enigma2/enigma2-plugins/vuplus/favicon.ico | Bin 4286 -> 0 bytes .../recipes-enigma2/enigma2/enigma2-skins.bb | 39 - .../recipes-enigma2/enigma2/enigma2-streamproxy.bb | 24 - .../enigma2/enigma2-streamproxy/streamproxy.socket | 8 - .../enigma2-streamproxy/streamproxy.xinetd.in | 10 - .../enigma2-streamproxy/streamproxy@.service | 5 - meta-openvuplus/recipes-enigma2/enigma2/enigma2.bb | 226 - .../enigma2/enigma2/750S/arrowdown.png | Bin 1370 -> 0 bytes .../enigma2/enigma2/750S/arrowleft.png | Bin 1475 -> 0 bytes .../enigma2/enigma2/750S/arrowright.png | Bin 1406 -> 0 bytes .../enigma2/enigma2/750S/arrowup.png | Bin 1251 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/b_b.png | Bin 171 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/b_bl.png | Bin 253 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/b_br.png | Bin 256 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/b_l.png | Bin 181 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/b_r.png | Bin 169 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/b_t.png | Bin 3933 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/b_tl.png | Bin 4005 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/b_tr.png | Bin 3990 -> 0 bytes .../enigma2/enigma2/750S/bar_ber.png | Bin 2047 -> 0 bytes .../enigma2/enigma2/750S/bar_snr.png | Bin 2051 -> 0 bytes .../enigma2/enigma2/750S/bg_list.png | Bin 9369 -> 0 bytes .../enigma2/enigma2/750S/bg_main.png | Bin 9356 -> 0 bytes .../enigma2/enigma2/750S/bg_setup_600.png | Bin 12783 -> 0 bytes .../enigma2/enigma2/750S/bg_setup_650.png | Bin 13252 -> 0 bytes .../enigma2/enigma2/750S/border_epg.png | Bin 1920 -> 0 bytes .../enigma2/enigma2/750S/border_eventinfo.png | Bin 451 -> 0 bytes .../enigma2/enigma2/750S/border_info.png | Bin 5011 -> 0 bytes .../enigma2/enigma2/750S/border_menu.png | Bin 4424 -> 0 bytes .../enigma2/enigma2/750S/border_menu_300.png | Bin 1987 -> 0 bytes .../enigma2/enigma2/750S/border_menu_350.png | Bin 2754 -> 0 bytes .../enigma2/enigma2/750S/border_menu_a.png | Bin 1083 -> 0 bytes .../enigma2/enigma2/750S/border_menu_c.png | Bin 1083 -> 0 bytes .../enigma2/enigma2/750S/border_multiepg.png | Bin 1096 -> 0 bytes .../enigma2/enigma2/750S/bottombar.png | Bin 3247 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_130x23px.png | Bin 3688 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_170x23px.png | Bin 3689 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_230x23px.png | Bin 3699 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_230x27px.png | Bin 287 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_250x32px.png | Bin 292 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_290x23px.png | Bin 3722 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_360x23px.png | Bin 3716 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_360x32px.png | Bin 315 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_380x23px.png | Bin 3713 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_400x23px.png | Bin 3718 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_440x23px.png | Bin 3722 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_450x32px.png | Bin 513 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_480x23px.png | Bin 3719 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_500x23px.png | Bin 3723 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_520x23px.png | Bin 3721 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_520x27px.png | Bin 320 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_550x27px.png | Bin 2915 -> 0 bytes .../enigma2/750S/buttons/Selected_bar_560x23px.png | Bin 3731 -> 0 bytes .../enigma2/enigma2/750S/buttons/Thumbs.db | Bin 7168 -> 0 bytes .../enigma2/enigma2/750S/buttons/blue.png | Bin 601 -> 0 bytes .../enigma2/enigma2/750S/buttons/blue_pressed.png | Bin 671 -> 0 bytes .../enigma2/enigma2/750S/buttons/button_blue.png | Bin 217 -> 0 bytes .../enigma2/750S/buttons/button_blue_off.png | Bin 217 -> 0 bytes .../enigma2/enigma2/750S/buttons/button_green.png | Bin 217 -> 0 bytes .../enigma2/750S/buttons/button_green_off.png | Bin 217 -> 0 bytes .../enigma2/enigma2/750S/buttons/button_red.png | Bin 217 -> 0 bytes .../enigma2/750S/buttons/button_red_off.png | Bin 217 -> 0 bytes .../enigma2/enigma2/750S/buttons/button_yellow.png | Bin 217 -> 0 bytes .../enigma2/750S/buttons/button_yellow_off.png | Bin 217 -> 0 bytes .../enigma2/enigma2/750S/buttons/green-big.png | Bin 864 -> 0 bytes .../enigma2/enigma2/750S/buttons/green.png | Bin 601 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_0.png | Bin 1277 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_1.png | Bin 1245 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_2.png | Bin 1278 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_3.png | Bin 1294 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_4.png | Bin 1274 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_5.png | Bin 1287 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_6.png | Bin 1290 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_7.png | Bin 1256 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_8.png | Bin 1300 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_9.png | Bin 1294 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_blue.png | Bin 226 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_green.png | Bin 226 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_info.png | Bin 1335 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_menu.png | Bin 1370 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_red.png | Bin 226 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_text.png | Bin 596 -> 0 bytes .../enigma2/enigma2/750S/buttons/key_yellow.png | Bin 226 -> 0 bytes .../enigma2/enigma2/750S/buttons/red-big.png | Bin 853 -> 0 bytes .../enigma2/enigma2/750S/buttons/red.png | Bin 601 -> 0 bytes .../750S/buttons/singlelineList_left_arrow.png | Bin 242 -> 0 bytes .../750S/buttons/singlelineList_right_arrow.png | Bin 242 -> 0 bytes .../750S/buttons/singlelineList_selected_23p.png | Bin 301 -> 0 bytes .../750S/buttons/singlelineList_selected_23px.png | Bin 279 -> 0 bytes .../750S/buttons/singlelineList_selected_39p.png | Bin 318 -> 0 bytes .../750S/buttons/singlelineList_selected_39px.png | Bin 283 -> 0 bytes .../750S/buttons/singlelineList_selected_43p.png | Bin 292 -> 0 bytes .../750S/buttons/singlelineList_selected_48p.png | Bin 334 -> 0 bytes .../750S/buttons/singlelineList_selected_48px.png | Bin 3347 -> 0 bytes .../750S/buttons/singlelineList_selected_72p.png | Bin 363 -> 0 bytes .../750S/buttons/singlelineList_selected_72px.png | Bin 683 -> 0 bytes .../enigma2/enigma2/750S/buttons/yellow.png | Bin 601 -> 0 bytes .../enigma2/enigma2/750S/countries/Thumbs.db | Bin 7680 -> 0 bytes .../enigma2/enigma2/750S/countries/ad.png | Bin 3730 -> 0 bytes .../enigma2/enigma2/750S/countries/ae.png | Bin 4127 -> 0 bytes .../enigma2/enigma2/750S/countries/cz.png | Bin 3855 -> 0 bytes .../enigma2/enigma2/750S/countries/de.png | Bin 3750 -> 0 bytes .../enigma2/enigma2/750S/countries/dk.png | Bin 3862 -> 0 bytes .../enigma2/enigma2/750S/countries/en.png | Bin 4750 -> 0 bytes .../enigma2/enigma2/750S/countries/es.png | Bin 4121 -> 0 bytes .../enigma2/enigma2/750S/countries/fi.png | Bin 4027 -> 0 bytes .../enigma2/enigma2/750S/countries/fr.png | Bin 3796 -> 0 bytes .../enigma2/enigma2/750S/countries/gr.png | Bin 4110 -> 0 bytes .../enigma2/enigma2/750S/countries/hr.png | Bin 4100 -> 0 bytes .../enigma2/enigma2/750S/countries/hu.png | Bin 3794 -> 0 bytes .../enigma2/enigma2/750S/countries/is.png | Bin 3912 -> 0 bytes .../enigma2/enigma2/750S/countries/it.png | Bin 3796 -> 0 bytes .../enigma2/enigma2/750S/countries/lt.png | Bin 4319 -> 0 bytes .../enigma2/enigma2/750S/countries/missing.png | Bin 4640 -> 0 bytes .../enigma2/enigma2/750S/countries/nl.png | Bin 3790 -> 0 bytes .../enigma2/enigma2/750S/countries/no.png | Bin 4183 -> 0 bytes .../enigma2/enigma2/750S/countries/pl.png | Bin 3740 -> 0 bytes .../enigma2/enigma2/750S/countries/pt.png | Bin 4119 -> 0 bytes .../enigma2/enigma2/750S/countries/ro.png | Bin 3798 -> 0 bytes .../enigma2/enigma2/750S/countries/ru.png | Bin 3807 -> 0 bytes .../enigma2/enigma2/750S/countries/se.png | Bin 3988 -> 0 bytes .../enigma2/enigma2/750S/countries/si.png | Bin 4159 -> 0 bytes .../enigma2/enigma2/750S/countries/tr.png | Bin 4098 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/div-h.png | Bin 151 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/div-v.png | Bin 154 -> 0 bytes .../enigma2/enigma2/750S/epg_more.png | Bin 985 -> 0 bytes .../enigma2/enigma2/750S/epg_next.png | Bin 1036 -> 0 bytes .../enigma2/enigma2/750S/epg_now.png | Bin 979 -> 0 bytes .../enigma2/enigma2/750S/expandable-plugins.png | Bin 229 -> 0 bytes .../enigma2/enigma2/750S/expanded-plugins.png | Bin 226 -> 0 bytes .../enigma2/enigma2/750S/icons/Thumbs.db | Bin 8704 -> 0 bytes .../enigma2/enigma2/750S/icons/clock.png | Bin 209 -> 0 bytes .../enigma2/enigma2/750S/icons/dish.png | Bin 20003 -> 0 bytes .../enigma2/enigma2/750S/icons/dish_scan.png | Bin 13366 -> 0 bytes .../enigma2/enigma2/750S/icons/dmm_logo.png | Bin 475 -> 0 bytes .../enigma2/enigma2/750S/icons/epgclock.png | Bin 209 -> 0 bytes .../enigma2/enigma2/750S/icons/epgclock_add.png | Bin 358 -> 0 bytes .../enigma2/enigma2/750S/icons/epgclock_post.png | Bin 354 -> 0 bytes .../enigma2/enigma2/750S/icons/epgclock_pre.png | Bin 360 -> 0 bytes .../enigma2/750S/icons/epgclock_prepost.png | Bin 359 -> 0 bytes .../enigma2/enigma2/750S/icons/folder.png | Bin 610 -> 0 bytes .../enigma2/enigma2/750S/icons/ico_mp_forward.png | Bin 810 -> 0 bytes .../enigma2/enigma2/750S/icons/ico_mp_pause.png | Bin 715 -> 0 bytes .../enigma2/enigma2/750S/icons/ico_mp_play.png | Bin 736 -> 0 bytes .../enigma2/enigma2/750S/icons/ico_mp_rewind.png | Bin 801 -> 0 bytes .../enigma2/enigma2/750S/icons/ico_mp_stop.png | Bin 664 -> 0 bytes .../750S/icons/icon_channelselection_radio.png | Bin 767 -> 0 bytes .../750S/icons/icon_channelselection_tv.png | Bin 566 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_crypt.png | Bin 163 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_crypt_off.png | Bin 163 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_dolby.png | Bin 198 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_dolby_off.png | Bin 198 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_epg.png | Bin 1084 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_event.png | Bin 245 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_format.png | Bin 202 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_format_off.png | Bin 202 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_mainmenu.png | Bin 514 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_media.png | Bin 1113 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_note.png | Bin 212 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_rec.png | Bin 326 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_rec_off.png | Bin 326 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_recorded.png | Bin 397 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_timerlist.png | Bin 904 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_txt.png | Bin 168 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_txt_off.png | Bin 168 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_txt_x.png | Bin 176 -> 0 bytes .../enigma2/enigma2/750S/icons/icon_view.png | Bin 376 -> 0 bytes .../enigma2/enigma2/750S/icons/icons_off.png | Bin 268 -> 0 bytes .../enigma2/enigma2/750S/icons/icons_off_1.png | Bin 268 -> 0 bytes .../enigma2/enigma2/750S/icons/icons_off_X.png | Bin 249 -> 0 bytes .../enigma2/enigma2/750S/icons/input_error.png | Bin 2677 -> 0 bytes .../enigma2/enigma2/750S/icons/input_info.png | Bin 1510 -> 0 bytes .../enigma2/enigma2/750S/icons/input_question.png | Bin 2422 -> 0 bytes .../enigma2/enigma2/750S/icons/lock.png | Bin 201 -> 0 bytes .../enigma2/enigma2/750S/icons/lock_error.png | Bin 230 -> 0 bytes .../enigma2/enigma2/750S/icons/lock_off.png | Bin 165 -> 0 bytes .../enigma2/enigma2/750S/icons/lock_on.png | Bin 223 -> 0 bytes .../enigma2/enigma2/750S/icons/marker.png | Bin 229 -> 0 bytes .../enigma2/enigma2/750S/icons/mp_buttons.png | Bin 9981 -> 0 bytes .../enigma2/enigma2/750S/icons/plugin.png | Bin 1778 -> 0 bytes .../enigma2/enigma2/750S/icons/rass_logo.png | Bin 1121 -> 0 bytes .../enigma2/enigma2/750S/icons/rass_page1.png | Bin 255 -> 0 bytes .../enigma2/enigma2/750S/icons/rass_page2.png | Bin 344 -> 0 bytes .../enigma2/enigma2/750S/icons/rass_page3.png | Bin 344 -> 0 bytes .../enigma2/enigma2/750S/icons/rass_page4.png | Bin 344 -> 0 bytes .../enigma2/enigma2/750S/icons/record.png | Bin 216 -> 0 bytes .../enigma2/enigma2/750S/icons/redx.png | Bin 230 -> 0 bytes .../enigma2/enigma2/750S/icons/repeat_off.png | Bin 1096 -> 0 bytes .../enigma2/enigma2/750S/icons/repeat_on.png | Bin 1367 -> 0 bytes .../enigma2/enigma2/750S/icons/scan-c.png | Bin 2454 -> 0 bytes .../enigma2/enigma2/750S/icons/scan-s.png | Bin 5570 -> 0 bytes .../enigma2/enigma2/750S/icons/scan-t.png | Bin 1471 -> 0 bytes .../enigma2/enigma2/750S/icons/selectioncross.png | Bin 230 -> 0 bytes .../enigma2/enigma2/750S/info-bg.png | Bin 947 -> 0 bytes .../enigma2/enigma2/750S/info-bg_mp.png | Bin 929 -> 0 bytes .../enigma2/enigma2/750S/mediaplayer_bg.png | Bin 1840 -> 0 bytes .../enigma2/enigma2/750S/menu/Thumbs.db | Bin 7168 -> 0 bytes .../enigma2/enigma2/750S/menu/dvd_player.png | Bin 10165 -> 0 bytes .../enigma2/enigma2/750S/menu/information.png | Bin 21004 -> 0 bytes .../enigma2/enigma2/750S/menu/media_player.png | Bin 24816 -> 0 bytes .../enigma2/enigma2/750S/menu/plugins.png | Bin 23588 -> 0 bytes .../enigma2/enigma2/750S/menu/scart.png | Bin 15022 -> 0 bytes .../enigma2/enigma2/750S/menu/setup.png | Bin 20213 -> 0 bytes .../enigma2/enigma2/750S/menu/shutdown.png | Bin 19528 -> 0 bytes .../enigma2/enigma2/750S/menu/subtitles.png | Bin 24511 -> 0 bytes .../enigma2/enigma2/750S/menu/timer.png | Bin 22409 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/mute.png | Bin 974 -> 0 bytes .../enigma2/enigma2/750S/nim_active.png | Bin 265 -> 0 bytes .../enigma2/enigma2/750S/no_coverArt.png | Bin 17284 -> 0 bytes .../enigma2/enigma2/750S/output.png | Bin 3689 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/pal.png | Bin 14858 -> 0 bytes .../enigma2/enigma2/750S/picon_default.png | Bin 1989 -> 0 bytes .../enigma2/enigma2/750S/position_arrow.png | Bin 418 -> 0 bytes .../enigma2/enigma2/750S/position_pointer.png | Bin 3617 -> 0 bytes .../enigma2/enigma2/750S/position_pointer_580.png | Bin 3622 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/prev.png | Bin 9103 -> 0 bytes .../enigma2/enigma2/750S/progress_bg.png | Bin 3620 -> 0 bytes .../enigma2/enigma2/750S/progress_big.png | Bin 3671 -> 0 bytes .../enigma2/enigma2/750S/progress_medium.png | Bin 3670 -> 0 bytes .../enigma2/enigma2/750S/progress_recording.png | Bin 3715 -> 0 bytes .../enigma2/enigma2/750S/progress_small.png | Bin 3668 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/rc.png | Bin 33838 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/750S/rcold.png | Bin 33846 -> 0 bytes .../enigma2/enigma2/750S/screws.png | Bin 2165 -> 0 bytes .../enigma2/enigma2/750S/screws_mp.png | Bin 2481 -> 0 bytes .../enigma2/enigma2/750S/scroll.png | Bin 197 -> 0 bytes .../enigma2/750S/singlelineList_selected_23p.png | Bin 301 -> 0 bytes .../enigma2/enigma2/750S/sleeptimer.png | Bin 15602 -> 0 bytes .../enigma2/enigma2/750S/spinner/Thumbs.db | Bin 7168 -> 0 bytes .../enigma2/enigma2/750S/spinner/wait1.png | Bin 1652 -> 0 bytes .../enigma2/enigma2/750S/spinner/wait2.png | Bin 2259 -> 0 bytes .../enigma2/enigma2/750S/spinner/wait3.png | Bin 1803 -> 0 bytes .../enigma2/enigma2/750S/spinner/wait4.png | Bin 2226 -> 0 bytes .../enigma2/enigma2/750S/timeline-now.png | Bin 962 -> 0 bytes .../enigma2/enigma2/750S/timeline.png | Bin 149 -> 0 bytes .../enigma2/enigma2/750S/unhandled-key.png | Bin 1335 -> 0 bytes .../enigma2/enigma2/750S/verticalline-plugins.png | Bin 183 -> 0 bytes .../enigma2/enigma2/750S/vkey_backspace.png | Bin 783 -> 0 bytes .../enigma2/enigma2/750S/vkey_bg.png | Bin 577 -> 0 bytes .../enigma2/enigma2/750S/vkey_clr.png | Bin 955 -> 0 bytes .../enigma2/enigma2/750S/vkey_esc.png | Bin 1321 -> 0 bytes .../enigma2/enigma2/750S/vkey_icon.png | Bin 2512 -> 0 bytes .../enigma2/enigma2/750S/vkey_left.png | Bin 819 -> 0 bytes .../enigma2/enigma2/750S/vkey_ok.png | Bin 990 -> 0 bytes .../enigma2/enigma2/750S/vkey_right.png | Bin 817 -> 0 bytes .../enigma2/enigma2/750S/vkey_sel.png | Bin 173 -> 0 bytes .../enigma2/enigma2/750S/vkey_shift.png | Bin 767 -> 0 bytes .../enigma2/enigma2/750S/vkey_shift_sel.png | Bin 1395 -> 0 bytes .../enigma2/enigma2/750S/vkey_space.png | Bin 577 -> 0 bytes .../enigma2/enigma2/750S/vkey_text.png | Bin 262 -> 0 bytes .../enigma2/enigma2/750S/volume.png | Bin 2075 -> 0 bytes .../enigma2/enigma2/750S/volume_box.png | Bin 303 -> 0 bytes .../enigma2/enigma2/750S/wizard.png | Bin 4465 -> 0 bytes .../enigma2/enigma2/MyriadPro-Regular.otf | Bin 79364 -> 0 bytes .../enigma2/enigma2/MyriadPro-Semibold.otf | Bin 97332 -> 0 bytes .../enigma2/enigma2/MyriadPro-SemiboldIt.otf | Bin 101776 -> 0 bytes .../enigma2/enigma2/Vu_HD/Bg_EPG_list.png | Bin 2191 -> 0 bytes .../enigma2/enigma2/Vu_HD/Bg_EPG_view.png | Bin 2235 -> 0 bytes .../enigma2/enigma2/Vu_HD/Bg_List.png | Bin 52623 -> 0 bytes .../enigma2/enigma2/Vu_HD/Bg_Media.png | Bin 8652 -> 0 bytes .../enigma2/enigma2/Vu_HD/Bg_Media_info.png | Bin 2470 -> 0 bytes .../enigma2/enigma2/Vu_HD/Bg_Subtitle.png | Bin 2149 -> 0 bytes .../enigma2/enigma2/Vu_HD/Bg_divideline.png | Bin 823 -> 0 bytes .../enigma2/enigma2/Vu_HD/Solo_Menu_bg520.png | Bin 2639 -> 0 bytes .../enigma2/enigma2/Vu_HD/Statusbar_white.png | Bin 822 -> 0 bytes .../enigma2/enigma2/Vu_HD/arrowdown.png | Bin 989 -> 0 bytes .../enigma2/enigma2/Vu_HD/arrowleft.png | Bin 939 -> 0 bytes .../enigma2/enigma2/Vu_HD/arrowright.png | Bin 940 -> 0 bytes .../enigma2/enigma2/Vu_HD/arrowup.png | Bin 950 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/b_b.png | Bin 221 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/b_bl.png | Bin 427 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/b_br.png | Bin 429 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/b_l.png | Bin 300 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/b_r.png | Bin 301 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/b_t.png | Bin 231 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/b_tl.png | Bin 435 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/b_tr.png | Bin 426 -> 0 bytes .../enigma2/enigma2/Vu_HD/bar_ber.png | Bin 1357 -> 0 bytes .../enigma2/enigma2/Vu_HD/bar_snr.png | Bin 1262 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/bg.png | Bin 2650 -> 0 bytes .../enigma2/enigma2/Vu_HD/border_eventinfo.png | Bin 451 -> 0 bytes .../enigma2/enigma2/Vu_HD/border_info.png | Bin 5011 -> 0 bytes .../enigma2/enigma2/Vu_HD/border_menu.png | Bin 945 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/FocusBar_H36.png | Bin 852 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/FocusBar_H42.png | Bin 860 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/FocusBar_H45.png | Bin 825 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/blue.png | Bin 363 -> 0 bytes .../enigma2/Vu_HD/buttons/button_bluekey.png | Bin 1807 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/button_off.png | Bin 362 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/green.png | Bin 362 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_0.png | Bin 945 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_1.png | Bin 883 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_2.png | Bin 935 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_3.png | Bin 951 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_4.png | Bin 935 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_5.png | Bin 950 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_6.png | Bin 977 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_7.png | Bin 900 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_8.png | Bin 971 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_9.png | Bin 944 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/key_text.png | Bin 596 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/red.png | Bin 363 -> 0 bytes .../enigma2/enigma2/Vu_HD/buttons/yellow.png | Bin 363 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/ad.png | Bin 1156 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/ae.png | Bin 1287 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/cz.png | Bin 1231 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/de.png | Bin 1022 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/dk.png | Bin 1424 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/ee.png | Bin 919 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/en.png | Bin 1996 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/es.png | Bin 1406 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/fi.png | Bin 1522 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/fr.png | Bin 1249 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/gr.png | Bin 1451 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/hr.png | Bin 1492 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/hu.png | Bin 1148 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/is.png | Bin 1558 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/it.png | Bin 1244 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/lt.png | Bin 1856 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/lv.png | Bin 819 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/missing.png | Bin 1600 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/nl.png | Bin 1160 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/no.png | Bin 1584 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/pl.png | Bin 900 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/pt.png | Bin 1490 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/ro.png | Bin 1202 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/ru.png | Bin 1186 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/se.png | Bin 1512 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/si.png | Bin 1526 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/sk.png | Bin 1397 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/tr.png | Bin 1459 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/ua.png | Bin 1262 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/x-fy.png | Bin 2009 -> 0 bytes .../enigma2/enigma2/Vu_HD/countries/yu.png | Bin 1478 -> 0 bytes .../enigma2/enigma2/Vu_HD/div-h.png | Bin 151 -> 0 bytes .../enigma2/enigma2/Vu_HD/div-v.png | Bin 154 -> 0 bytes .../enigma2/enigma2/Vu_HD/epg_more.png | Bin 1699 -> 0 bytes .../enigma2/enigma2/Vu_HD/epg_next.png | Bin 1746 -> 0 bytes .../enigma2/enigma2/Vu_HD/epg_now.png | Bin 1683 -> 0 bytes .../enigma2/Vu_HD/icons/Mediaplayerbar_gray.png | Bin 480 -> 0 bytes .../enigma2/Vu_HD/icons/Mediaplayerbar_purple.png | Bin 503 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/clock.png | Bin 198 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/dish.png | Bin 5974 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/dish_scan.png | Bin 4574 -> 0 bytes .../enigma2/Vu_HD/icons/ico_Chlist_title.png | Bin 570 -> 0 bytes .../enigma2/Vu_HD/icons/ico_Radio_title.png | Bin 583 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/ico_folder.png | Bin 516 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/ico_noreplay.png | Bin 362 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/ico_player.png | Bin 3908 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/ico_replay.png | Bin 655 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_crypt.png | Bin 820 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_crypt_off.png | Bin 820 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_dolby.png | Bin 1587 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_dolby_off.png | Bin 1010 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_event.png | Bin 245 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_format.png | Bin 858 -> 0 bytes .../enigma2/Vu_HD/icons/icon_format_off.png | Bin 858 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_rec.png | Bin 703 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_rec_off.png | Bin 508 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_txt.png | Bin 824 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_txt_off.png | Bin 824 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icon_view.png | Bin 376 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/icons_off.png | Bin 268 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/input_error.png | Bin 1663 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/input_info.png | Bin 1409 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/input_question.png | Bin 1668 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/lock.png | Bin 201 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/lock_error.png | Bin 1322 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/lock_off.png | Bin 540 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/lock_on.png | Bin 1232 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/mp_buttons.png | Bin 1295 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/mp_wb_buttons.png | Bin 534 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/plugin.png | Bin 1778 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/rass_logo.png | Bin 1121 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/record.png | Bin 216 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/redx.png | Bin 710 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/scan-c.png | Bin 2454 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/scan-s.png | Bin 1799 -> 0 bytes .../enigma2/enigma2/Vu_HD/icons/scan-t.png | Bin 1471 -> 0 bytes .../enigma2/enigma2/Vu_HD/info-bg.png | Bin 2589 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_EPG_title.png | Bin 801 -> 0 bytes .../enigma2/Vu_HD/menu/ico_Plugin_All_title.png | Bin 2798 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_menu_Info.png | Bin 2874 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_menu_Media.png | Bin 2843 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_menu_Plugin.png | Bin 3059 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_menu_Setup.png | Bin 3450 -> 0 bytes .../enigma2/Vu_HD/menu/ico_menu_Standby.png | Bin 3170 -> 0 bytes .../enigma2/Vu_HD/menu/ico_menu_Subtitles.png | Bin 3171 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_menu_Timer.png | Bin 2392 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_title_Info.png | Bin 1306 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_title_MENU.png | Bin 3443 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_title_Media.png | Bin 1325 -> 0 bytes .../enigma2/Vu_HD/menu/ico_title_Plugin.png | Bin 1290 -> 0 bytes .../enigma2/Vu_HD/menu/ico_title_Pluginall.png | Bin 1298 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_title_Setup.png | Bin 1340 -> 0 bytes .../enigma2/Vu_HD/menu/ico_title_Standby.png | Bin 1428 -> 0 bytes .../enigma2/Vu_HD/menu/ico_title_Subtitles.png | Bin 1350 -> 0 bytes .../enigma2/enigma2/Vu_HD/menu/ico_title_Timer.png | Bin 1194 -> 0 bytes .../enigma2/Vu_HD/menu/ico_title_media-info.png | Bin 3432 -> 0 bytes .../enigma2/enigma2/Vu_HD/mp_wb_background.png | Bin 3656 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/mute.png | Bin 1894 -> 0 bytes .../enigma2/enigma2/Vu_HD/no_coverArt.png | Bin 2116 -> 0 bytes .../enigma2/enigma2/Vu_HD/position_arrow.png | Bin 418 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/prev.png | Bin 19574 -> 0 bytes .../enigma2/enigma2/Vu_HD/progress_bg.png | Bin 3620 -> 0 bytes .../enigma2/enigma2/Vu_HD/progress_big.png | Bin 1438 -> 0 bytes .../enigma2/enigma2/Vu_HD/progress_medium.png | Bin 812 -> 0 bytes .../enigma2/enigma2/Vu_HD/progress_small.png | Bin 1438 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/Vu_HD/rc.png | Bin 14127 -> 0 bytes .../enigma2/enigma2/Vu_HD/rc_wb_desc.png | Bin 72279 -> 0 bytes .../enigma2/enigma2/Vu_HD/rcold.png | Bin 14127 -> 0 bytes .../enigma2/enigma2/Vu_HD/sleeptimer.png | Bin 6503 -> 0 bytes .../enigma2/enigma2/Vu_HD/timeline-now.png | Bin 369 -> 0 bytes .../enigma2/enigma2/Vu_HD/timeline.png | Bin 149 -> 0 bytes .../enigma2/enigma2/Vu_HD/unhandled-key.png | Bin 2773 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_backspace.png | Bin 783 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_bg.png | Bin 577 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_clr.png | Bin 955 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_esc.png | Bin 1321 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_icon.png | Bin 2512 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_left.png | Bin 819 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_ok.png | Bin 990 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_right.png | Bin 817 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_sel.png | Bin 173 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_shift.png | Bin 767 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_shift_sel.png | Bin 1395 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_space.png | Bin 577 -> 0 bytes .../enigma2/enigma2/Vu_HD/vkey_text.png | Bin 262 -> 0 bytes .../enigma2/enigma2/Vu_HD/volume_background.png | Bin 1970 -> 0 bytes .../enigma2/enigma2/Vu_HD/volume_up.png | Bin 1290 -> 0 bytes .../enigma2/enigma2/Vu_HD/wizard.png | Bin 4465 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/analog.ttf | Bin 41168 -> 0 bytes .../enigma2/enigma2_vuplus_addlibpythondeps.patch | 28 - .../enigma2/enigma2_vuplus_mediaplayer.patch | 218 - .../enigma2_vuplus_mediaplayer_subtitle.patch | 104 - .../enigma2_vuplus_mediaplayer_unpause.patch | 20 - .../enigma2/enigma2/enigma2_vuplus_misc.patch | 12 - .../enigma2/enigma2_vuplus_networksetup.patch | 45 - .../enigma2_vuplus_remove_dreambox_enigma.patch | 40 - .../enigma2/enigma2/enigma2_vuplus_skin.patch | 6753 -- .../enigma2/enigma2/enigma2_vuplus_textvfd.patch | 43 - .../enigma2/enigma2/enigma2_vuplus_vfd.patch | 141 - .../enigma2/enigma2/enigma2_vuplus_vfd_mode.patch | 124 - .../enigma2/enigma2/number_key/key_0.png | Bin 572 -> 0 bytes .../enigma2/enigma2/number_key/key_1.png | Bin 463 -> 0 bytes .../enigma2/enigma2/number_key/key_2.png | Bin 501 -> 0 bytes .../enigma2/enigma2/number_key/key_3.png | Bin 564 -> 0 bytes .../enigma2/enigma2/number_key/key_4.png | Bin 513 -> 0 bytes .../enigma2/enigma2/number_key/key_5.png | Bin 528 -> 0 bytes .../enigma2/enigma2/number_key/key_6.png | Bin 558 -> 0 bytes .../enigma2/enigma2/number_key/key_7.png | Bin 486 -> 0 bytes .../enigma2/enigma2/number_key/key_8.png | Bin 590 -> 0 bytes .../enigma2/enigma2/number_key/key_9.png | Bin 577 -> 0 bytes .../recipes-enigma2/enigma2/enigma2/skin_user.xml | 243 - .../enigma2/enigma2/vfd_icons/vfd_icon_crypt.png | Bin 961 -> 0 bytes .../enigma2/enigma2/vfd_icons/vfd_icon_dolby.png | Bin 985 -> 0 bytes .../enigma2/enigma2/vfd_icons/vfd_icon_format.png | Bin 996 -> 0 bytes .../enigma2/enigma2/vfd_icons/vfd_icon_rec.png | Bin 1009 -> 0 bytes .../enigma2/enigma2/vfd_icons/vfd_icon_txt.png | Bin 975 -> 0 bytes .../gstreamer/gst-plugin-dvbmediasink_0.10.bb | 17 - ...gtsdemux-fix-bd-streamtype-detection.diff.patch | 201 - ...g-capabilities-to-generate-a-SPN-PTS-map-.patch | 423 - .../0003-mpegpsdemux_speedup.diff.patch | 112 - ...fix-location-of-orcc-when-cross-compiling.patch | 39 - .../gstreamer/gst-plugins-bad_0.10.23.bbappend | 15 - ...fix-location-of-orcc-when-cross-compiling.patch | 39 - .../gstreamer/gst-plugins-base_0.10.36.bbappend | 8 - .../audioparser-raise-ranks.patch | 19 - ...fix-location-of-orcc-when-cross-compiling.patch | 39 - .../gstreamer/gst-plugins-good_0.10.31.bbappend | 9 - .../dvdsubdec-addproperty-singlebuffer.patch | 103 - .../fix-opencore-amr-1.patch | 55 - .../fix-opencore-amr-2.patch | 105 - ...fix-location-of-orcc-when-cross-compiling.patch | 39 - .../gstreamer/gst-plugins-ugly_0.10.19.bbappend | 11 - .../recipes-enigma2/libav/libav_0.7.4.bbappend | 4 - .../recipes-enigma2/libdreamdvd/libdreamdvd_0.9.bb | 8 - .../recipes-enigma2/libdvbsi++/libdvbsi++_0.3.6.bb | 12 - ...-dvdnavmini.pc-link-against-libdvdnavmini.patch | 25 - .../recipes-enigma2/libdvdnav/libdvdnav_svn.bb | 24 - .../recipes-enigma2/libdvdread/libdvdread_svn.bb | 13 - .../libsigc++-1.2-1.2.5/autofoo.patch | 125 - .../libsigc++-1.2-1.2.5/fix-install.patch | 15 - .../libsigc++-1.2-1.2.5/pkgconfig.patch | 13 - .../libsigc++-1.2-1.2.5/to_1.2.7.patch | 159 - .../libsigc++-1.2/libsigc++-1.2_1.2.5.bb | 21 - .../libungif/libungif-native_4.1.3.bb | 7 - .../recipes-enigma2/libungif/libungif_4.1.3.bb | 15 - .../libxmlccwrap/files/disable_libxslt.patch | 96 - .../libxmlccwrap/files/dont_build_unneeded.patch | 6 - .../files/fix_assignment_operator.patch | 10 - .../libxmlccwrap/libxmlccwrap_0.0.12.bb | 21 - .../opencore-amr/opencore-amr_0.1.3.bb | 20 - .../openssl/openssl-0.9.8x/configure-targets.patch | 25 - .../openssl/openssl-0.9.8x/debian/ca.patch | 22 - .../openssl-0.9.8x/debian/config-hurd.patch | 17 - .../openssl-0.9.8x/debian/debian-targets.patch | 56 - .../openssl-0.9.8x/debian/engines-path.patch | 49 - .../openssl-0.9.8x/debian/kfreebsd-pipe.patch | 15 - .../openssl-0.9.8x/debian/make-targets.patch | 15 - .../openssl/openssl-0.9.8x/debian/man-dir.patch | 15 - .../openssl-0.9.8x/debian/man-section.patch | 34 - .../openssl/openssl-0.9.8x/debian/no-rpath.patch | 15 - .../openssl-0.9.8x/debian/no-symbolic.patch | 15 - .../openssl/openssl-0.9.8x/debian/perl-path.diff | 762 - .../openssl/openssl-0.9.8x/debian/pic.patch | 303 - .../openssl/openssl-0.9.8x/debian/pkg-config.patch | 36 - .../openssl/openssl-0.9.8x/debian/rc4-amd64.patch | 16 - .../openssl/openssl-0.9.8x/debian/rehash-crt.patch | 35 - .../openssl/openssl-0.9.8x/debian/rehash_pod.patch | 62 - .../openssl/openssl-0.9.8x/debian/series | 20 - .../openssl-0.9.8x/debian/shared-lib-ext.patch | 16 - .../openssl/openssl-0.9.8x/debian/stddef.patch | 14 - .../openssl-0.9.8x/debian/version-script.patch | 35 - .../openssl/openssl-0.9.8x/parallel-make-fix.patch | 20 - .../openssl/openssl-0.9.8x/shared-libs.patch | 50 - .../recipes-enigma2/openssl/openssl_0.9.8x.bb | 38 - .../recipes-enigma2/python/python-coherence_git.bb | 33 - .../python/python-daap/python-daap.patch | 57 - .../recipes-enigma2/python/python-daap_0.7.1.bb | 17 - .../python/python-daap_0.7.1.bbappend | 5 - .../python/python-flickrapi_1.4.2.bb | 31 - .../recipes-enigma2/python/python-gdata_2.0.14.bb | 21 - .../python/python-mutagen/patch.diff | 12 - .../recipes-enigma2/python/python-mutagen_1.18.bb | 22 - .../python/python-native_2.7.2.bbappend | 2 - .../python/python-pycrypto/no-usr-include.patch | 11 - .../recipes-enigma2/python/python-pycrypto_2.5.bb | 17 - .../python/python-transmissionrpc_hg.bb | 17 - .../python/python-twisted_12.0.0.bb | 237 - .../recipes-enigma2/python/python-wifi_0.5.0.bb | 29 - .../python/python/ctypes-error-handling-fix.patch | 40 - .../python/python/fix_pthread_site.patch | 38 - .../python/python/no-ldconfig.patch | 23 - .../python/python/some_configure_fixes.patch | 32 - .../recipes-enigma2/python/python_2.7.2.bbappend | 19 - .../recipes-enigma2/showiframe/showiframe_1.8.bb | 9 - .../recipes-enigma2/sqlite/sqlite3_3.7.10.bbappend | 3 - .../streamripper/streamripper_1.64.6.bb | 17 - meta-openvuplus/recipes-enigma2/swig/swig_2.0.4.bb | 11 - .../recipes-enigma2/tasks/task-vuplus-enigma2.bb | 7 - .../recipes-enigma2/tasks/task-vuplus-enigma2.inc | 85 - .../recipes-enigma2/timezones/files/GPL-1.0 | 252 - .../timezones/files/zoneinfo.tar.bz2 | Bin 38585 -> 0 bytes .../timezones/timezones-alternative.bb | 25 - .../hddtemp/hddtemp/hddtemp-no-nls-support.patch | 66 + .../recipes-extended/hddtemp/hddtemp_0.3-beta15.bb | 22 + meta-openvuplus/recipes-extended/joe/joe_3.7.bb | 14 + .../mc/mc-4.8.1/optional-extfs-dir.patch | 18 + .../mc/mc-4.8.1/optional-hints.patch | 17 + .../mc/mc-4.8.1/optional-sfs-ini.patch | 17 + .../mc/mc-4.8.1/optional-syntax-file.patch | 18 + .../recipes-extended/mc/mc_4.8.1.bbappend | 26 + meta-openvuplus/recipes-extended/ncdu/ncdu_1.8.bb | 11 + .../shadow/shadow-securetty/securetty | 275 + .../shadow/shadow-securetty_4.1.4.3.bbappend | 3 + .../smartmontools/smartmontools.inc | 10 + .../smartmontools/smartmontools_5.42.bb | 6 + .../cdparanoia/cdparanoia/Makefile.in.patch | 13 + .../cdparanoia-III-10.2-privatefix.patch | 561 + .../cdparanoia/cdparanoia/configure.in.patch | 13 + .../cdparanoia/cdparanoia/fixes10.patch | 25 + .../cdparanoia/interface_Makefile.in.patch | 11 + .../cdparanoia/paranoia_Makefile.in.patch | 11 + .../cdparanoia/cdparanoia_svn.bb | 43 + .../dvbtools/dvb-apps-1.1.1/update-to-tip.diff | 37589 +++++++++ .../dvbtools/dvb-apps-1.1.1/update-to-trunk.diff | 84321 +++++++++++++++++++ .../recipes-multimedia/dvbtools/dvb-apps_1.1.1.bb | 112 + .../recipes-multimedia/dvbtools/dvbstream_cvs.bb | 18 + .../recipes-multimedia/dvbtools/dvbtune_cvs.bb | 23 + .../recipes-multimedia/dvbtools/wscan_20101204.bb | 15 + .../gstreamer/gst-plugin-dvbmediasink_0.10.bb | 17 + ...gtsdemux-fix-bd-streamtype-detection.diff.patch | 201 + ...g-capabilities-to-generate-a-SPN-PTS-map-.patch | 423 + .../0003-mpegpsdemux_speedup.diff.patch | 112 + ...fix-location-of-orcc-when-cross-compiling.patch | 39 + .../gstreamer/gst-plugins-bad_0.10.23.bbappend | 15 + ...fix-location-of-orcc-when-cross-compiling.patch | 39 + .../gstreamer/gst-plugins-base_0.10.36.bbappend | 8 + .../audioparser-raise-ranks.patch | 19 + ...fix-location-of-orcc-when-cross-compiling.patch | 39 + .../gstreamer/gst-plugins-good_0.10.31.bbappend | 9 + .../dvdsubdec-addproperty-singlebuffer.patch | 103 + .../fix-opencore-amr-1.patch | 55 + .../fix-opencore-amr-2.patch | 105 + ...fix-location-of-orcc-when-cross-compiling.patch | 39 + .../gstreamer/gst-plugins-ugly_0.10.19.bbappend | 11 + .../recipes-multimedia/libav/libav_0.7.4.bbappend | 4 + .../libdreamdvd/libdreamdvd_0.9.bb | 8 + .../libdvbsi++/libdvbsi++_0.3.6.bb | 12 + ...-dvdnavmini.pc-link-against-libdvdnavmini.patch | 25 + .../recipes-multimedia/libdvdnav/libdvdnav_svn.bb | 24 + .../libdvdread/libdvdread_svn.bb | 13 + .../opencore-amr/opencore-amr_0.1.3.bb | 20 + .../streamripper/streamripper_1.64.6.bb | 17 + .../libxmlccwrap/files/disable_libxslt.patch | 96 + .../libxmlccwrap/files/dont_build_unneeded.patch | 6 + .../files/fix_assignment_operator.patch | 10 + .../libxmlccwrap/libxmlccwrap_0.0.12.bb | 21 + .../recipes-support/sqlite/sqlite3_3.7.10.bbappend | 3 + .../aio-grab/aio-grab/aio-grab_vuplus.patch | 94 + .../recipes-vuplus/aio-grab/aio-grab_0.8.bb | 7 + .../recipes-vuplus/aio-grab/aio-grab_0.8.bbappend | 8 + .../dreambox-dvbincludes/dreambox-dvbincludes.bb | 34 + .../dreambox-dvbincludes_1.1.bb | 26 + .../dreambox-keymaps/dreambox-keymaps.bb | 18 + .../dreambox-keymaps/dreambox-keymaps/GPL-1.0 | 252 + .../dreambox-keymaps/dream-de.info | 2 + .../dreambox-keymaps/dream-de.kmap | Bin 0 -> 2823 bytes .../dreambox-keymaps/dreambox-keymaps/eng.info | 2 + .../dreambox-keymaps/dreambox-keymaps/eng.kmap | Bin 0 -> 2823 bytes .../dreambox-modem-ppp-scripts/01peerdns | 3 + .../dreambox-modem-ppp-scripts/01peerdns-remove | 5 + .../dreambox-modem-ppp-scripts/dial.modem | 20 + .../dreambox-modem-ppp-scripts/disconnect.modem | 10 + .../dreambox-modem-ppp-scripts/dm800/options | 18 + .../dreambox-modem-ppp-scripts/options | 18 + .../dreambox-modem-ppp-scripts/pap-secrets | 3 + .../dreambox-modem-ppp-scripts_0.1.bb | 25 + .../enigma2/enigma2-defaultservices.bb | 20 + .../enigma2/enigma2-defaultservices/lamedb.130 | 6492 ++ .../enigma2/enigma2-defaultservices/lamedb.192 | 4962 ++ .../enigma2/enigma2-defaultservices/lamedb.282 | 3414 + .../enigma2/enigma2-defaultservices/sat130.info | 17 + .../enigma2/enigma2-defaultservices/sat192.info | 17 + .../enigma2/enigma2-defaultservices/sat282.info | 17 + .../recipes-vuplus/enigma2/enigma2-plugins.bb | 120 + .../enigma2/enigma2-plugins/vuplus/dreamboxweb.png | Bin 0 -> 2619 bytes .../enigma2-plugins/vuplus/dreamboxwebtv.png | Bin 0 -> 1905 bytes .../vuplus/enigma2_plugins_20110810.patch | 1808 + .../vuplus/enigma2_plugins_ac3lipsync_dolby.patch | 13 + .../enigma2_plugins_autoresolution_fix.patch | 14 + .../vuplus/enigma2_plugins_dependency.patch | 10 + .../enigma2_plugins_mytube_entry_vuplus.patch | 13 + .../vuplus/enigma2_plugins_mytube_tpm.patch | 149 + .../vuplus/enigma2_plugins_mytube_vuplus.patch | 74 + .../vuplus/enigma2_plugins_webinterface_tpm.patch | 31 + .../enigma2/enigma2-plugins/vuplus/favicon.ico | Bin 0 -> 4286 bytes .../recipes-vuplus/enigma2/enigma2-skins.bb | 39 + .../recipes-vuplus/enigma2/enigma2-streamproxy.bb | 24 + .../enigma2/enigma2-streamproxy/streamproxy.socket | 8 + .../enigma2-streamproxy/streamproxy.xinetd.in | 10 + .../enigma2-streamproxy/streamproxy@.service | 5 + meta-openvuplus/recipes-vuplus/enigma2/enigma2.bb | 226 + .../enigma2/enigma2/750S/arrowdown.png | Bin 0 -> 1370 bytes .../enigma2/enigma2/750S/arrowleft.png | Bin 0 -> 1475 bytes .../enigma2/enigma2/750S/arrowright.png | Bin 0 -> 1406 bytes .../enigma2/enigma2/750S/arrowup.png | Bin 0 -> 1251 bytes .../recipes-vuplus/enigma2/enigma2/750S/b_b.png | Bin 0 -> 171 bytes .../recipes-vuplus/enigma2/enigma2/750S/b_bl.png | Bin 0 -> 253 bytes .../recipes-vuplus/enigma2/enigma2/750S/b_br.png | Bin 0 -> 256 bytes .../recipes-vuplus/enigma2/enigma2/750S/b_l.png | Bin 0 -> 181 bytes .../recipes-vuplus/enigma2/enigma2/750S/b_r.png | Bin 0 -> 169 bytes .../recipes-vuplus/enigma2/enigma2/750S/b_t.png | Bin 0 -> 3933 bytes .../recipes-vuplus/enigma2/enigma2/750S/b_tl.png | Bin 0 -> 4005 bytes .../recipes-vuplus/enigma2/enigma2/750S/b_tr.png | Bin 0 -> 3990 bytes .../enigma2/enigma2/750S/bar_ber.png | Bin 0 -> 2047 bytes .../enigma2/enigma2/750S/bar_snr.png | Bin 0 -> 2051 bytes .../enigma2/enigma2/750S/bg_list.png | Bin 0 -> 9369 bytes .../enigma2/enigma2/750S/bg_main.png | Bin 0 -> 9356 bytes .../enigma2/enigma2/750S/bg_setup_600.png | Bin 0 -> 12783 bytes .../enigma2/enigma2/750S/bg_setup_650.png | Bin 0 -> 13252 bytes .../enigma2/enigma2/750S/border_epg.png | Bin 0 -> 1920 bytes .../enigma2/enigma2/750S/border_eventinfo.png | Bin 0 -> 451 bytes .../enigma2/enigma2/750S/border_info.png | Bin 0 -> 5011 bytes .../enigma2/enigma2/750S/border_menu.png | Bin 0 -> 4424 bytes .../enigma2/enigma2/750S/border_menu_300.png | Bin 0 -> 1987 bytes .../enigma2/enigma2/750S/border_menu_350.png | Bin 0 -> 2754 bytes .../enigma2/enigma2/750S/border_menu_a.png | Bin 0 -> 1083 bytes .../enigma2/enigma2/750S/border_menu_c.png | Bin 0 -> 1083 bytes .../enigma2/enigma2/750S/border_multiepg.png | Bin 0 -> 1096 bytes .../enigma2/enigma2/750S/bottombar.png | Bin 0 -> 3247 bytes .../enigma2/750S/buttons/Selected_bar_130x23px.png | Bin 0 -> 3688 bytes .../enigma2/750S/buttons/Selected_bar_170x23px.png | Bin 0 -> 3689 bytes .../enigma2/750S/buttons/Selected_bar_230x23px.png | Bin 0 -> 3699 bytes .../enigma2/750S/buttons/Selected_bar_230x27px.png | Bin 0 -> 287 bytes .../enigma2/750S/buttons/Selected_bar_250x32px.png | Bin 0 -> 292 bytes .../enigma2/750S/buttons/Selected_bar_290x23px.png | Bin 0 -> 3722 bytes .../enigma2/750S/buttons/Selected_bar_360x23px.png | Bin 0 -> 3716 bytes .../enigma2/750S/buttons/Selected_bar_360x32px.png | Bin 0 -> 315 bytes .../enigma2/750S/buttons/Selected_bar_380x23px.png | Bin 0 -> 3713 bytes .../enigma2/750S/buttons/Selected_bar_400x23px.png | Bin 0 -> 3718 bytes .../enigma2/750S/buttons/Selected_bar_440x23px.png | Bin 0 -> 3722 bytes .../enigma2/750S/buttons/Selected_bar_450x32px.png | Bin 0 -> 513 bytes .../enigma2/750S/buttons/Selected_bar_480x23px.png | Bin 0 -> 3719 bytes .../enigma2/750S/buttons/Selected_bar_500x23px.png | Bin 0 -> 3723 bytes .../enigma2/750S/buttons/Selected_bar_520x23px.png | Bin 0 -> 3721 bytes .../enigma2/750S/buttons/Selected_bar_520x27px.png | Bin 0 -> 320 bytes .../enigma2/750S/buttons/Selected_bar_550x27px.png | Bin 0 -> 2915 bytes .../enigma2/750S/buttons/Selected_bar_560x23px.png | Bin 0 -> 3731 bytes .../enigma2/enigma2/750S/buttons/Thumbs.db | Bin 0 -> 7168 bytes .../enigma2/enigma2/750S/buttons/blue.png | Bin 0 -> 601 bytes .../enigma2/enigma2/750S/buttons/blue_pressed.png | Bin 0 -> 671 bytes .../enigma2/enigma2/750S/buttons/button_blue.png | Bin 0 -> 217 bytes .../enigma2/750S/buttons/button_blue_off.png | Bin 0 -> 217 bytes .../enigma2/enigma2/750S/buttons/button_green.png | Bin 0 -> 217 bytes .../enigma2/750S/buttons/button_green_off.png | Bin 0 -> 217 bytes .../enigma2/enigma2/750S/buttons/button_red.png | Bin 0 -> 217 bytes .../enigma2/750S/buttons/button_red_off.png | Bin 0 -> 217 bytes .../enigma2/enigma2/750S/buttons/button_yellow.png | Bin 0 -> 217 bytes .../enigma2/750S/buttons/button_yellow_off.png | Bin 0 -> 217 bytes .../enigma2/enigma2/750S/buttons/green-big.png | Bin 0 -> 864 bytes .../enigma2/enigma2/750S/buttons/green.png | Bin 0 -> 601 bytes .../enigma2/enigma2/750S/buttons/key_0.png | Bin 0 -> 1277 bytes .../enigma2/enigma2/750S/buttons/key_1.png | Bin 0 -> 1245 bytes .../enigma2/enigma2/750S/buttons/key_2.png | Bin 0 -> 1278 bytes .../enigma2/enigma2/750S/buttons/key_3.png | Bin 0 -> 1294 bytes .../enigma2/enigma2/750S/buttons/key_4.png | Bin 0 -> 1274 bytes .../enigma2/enigma2/750S/buttons/key_5.png | Bin 0 -> 1287 bytes .../enigma2/enigma2/750S/buttons/key_6.png | Bin 0 -> 1290 bytes .../enigma2/enigma2/750S/buttons/key_7.png | Bin 0 -> 1256 bytes .../enigma2/enigma2/750S/buttons/key_8.png | Bin 0 -> 1300 bytes .../enigma2/enigma2/750S/buttons/key_9.png | Bin 0 -> 1294 bytes .../enigma2/enigma2/750S/buttons/key_blue.png | Bin 0 -> 226 bytes .../enigma2/enigma2/750S/buttons/key_green.png | Bin 0 -> 226 bytes .../enigma2/enigma2/750S/buttons/key_info.png | Bin 0 -> 1335 bytes .../enigma2/enigma2/750S/buttons/key_menu.png | Bin 0 -> 1370 bytes .../enigma2/enigma2/750S/buttons/key_red.png | Bin 0 -> 226 bytes .../enigma2/enigma2/750S/buttons/key_text.png | Bin 0 -> 596 bytes .../enigma2/enigma2/750S/buttons/key_yellow.png | Bin 0 -> 226 bytes .../enigma2/enigma2/750S/buttons/red-big.png | Bin 0 -> 853 bytes .../enigma2/enigma2/750S/buttons/red.png | Bin 0 -> 601 bytes .../750S/buttons/singlelineList_left_arrow.png | Bin 0 -> 242 bytes .../750S/buttons/singlelineList_right_arrow.png | Bin 0 -> 242 bytes .../750S/buttons/singlelineList_selected_23p.png | Bin 0 -> 301 bytes .../750S/buttons/singlelineList_selected_23px.png | Bin 0 -> 279 bytes .../750S/buttons/singlelineList_selected_39p.png | Bin 0 -> 318 bytes .../750S/buttons/singlelineList_selected_39px.png | Bin 0 -> 283 bytes .../750S/buttons/singlelineList_selected_43p.png | Bin 0 -> 292 bytes .../750S/buttons/singlelineList_selected_48p.png | Bin 0 -> 334 bytes .../750S/buttons/singlelineList_selected_48px.png | Bin 0 -> 3347 bytes .../750S/buttons/singlelineList_selected_72p.png | Bin 0 -> 363 bytes .../750S/buttons/singlelineList_selected_72px.png | Bin 0 -> 683 bytes .../enigma2/enigma2/750S/buttons/yellow.png | Bin 0 -> 601 bytes .../enigma2/enigma2/750S/countries/Thumbs.db | Bin 0 -> 7680 bytes .../enigma2/enigma2/750S/countries/ad.png | Bin 0 -> 3730 bytes .../enigma2/enigma2/750S/countries/ae.png | Bin 0 -> 4127 bytes .../enigma2/enigma2/750S/countries/cz.png | Bin 0 -> 3855 bytes .../enigma2/enigma2/750S/countries/de.png | Bin 0 -> 3750 bytes .../enigma2/enigma2/750S/countries/dk.png | Bin 0 -> 3862 bytes .../enigma2/enigma2/750S/countries/en.png | Bin 0 -> 4750 bytes .../enigma2/enigma2/750S/countries/es.png | Bin 0 -> 4121 bytes .../enigma2/enigma2/750S/countries/fi.png | Bin 0 -> 4027 bytes .../enigma2/enigma2/750S/countries/fr.png | Bin 0 -> 3796 bytes .../enigma2/enigma2/750S/countries/gr.png | Bin 0 -> 4110 bytes .../enigma2/enigma2/750S/countries/hr.png | Bin 0 -> 4100 bytes .../enigma2/enigma2/750S/countries/hu.png | Bin 0 -> 3794 bytes .../enigma2/enigma2/750S/countries/is.png | Bin 0 -> 3912 bytes .../enigma2/enigma2/750S/countries/it.png | Bin 0 -> 3796 bytes .../enigma2/enigma2/750S/countries/lt.png | Bin 0 -> 4319 bytes .../enigma2/enigma2/750S/countries/missing.png | Bin 0 -> 4640 bytes .../enigma2/enigma2/750S/countries/nl.png | Bin 0 -> 3790 bytes .../enigma2/enigma2/750S/countries/no.png | Bin 0 -> 4183 bytes .../enigma2/enigma2/750S/countries/pl.png | Bin 0 -> 3740 bytes .../enigma2/enigma2/750S/countries/pt.png | Bin 0 -> 4119 bytes .../enigma2/enigma2/750S/countries/ro.png | Bin 0 -> 3798 bytes .../enigma2/enigma2/750S/countries/ru.png | Bin 0 -> 3807 bytes .../enigma2/enigma2/750S/countries/se.png | Bin 0 -> 3988 bytes .../enigma2/enigma2/750S/countries/si.png | Bin 0 -> 4159 bytes .../enigma2/enigma2/750S/countries/tr.png | Bin 0 -> 4098 bytes .../recipes-vuplus/enigma2/enigma2/750S/div-h.png | Bin 0 -> 151 bytes .../recipes-vuplus/enigma2/enigma2/750S/div-v.png | Bin 0 -> 154 bytes .../enigma2/enigma2/750S/epg_more.png | Bin 0 -> 985 bytes .../enigma2/enigma2/750S/epg_next.png | Bin 0 -> 1036 bytes .../enigma2/enigma2/750S/epg_now.png | Bin 0 -> 979 bytes .../enigma2/enigma2/750S/expandable-plugins.png | Bin 0 -> 229 bytes .../enigma2/enigma2/750S/expanded-plugins.png | Bin 0 -> 226 bytes .../enigma2/enigma2/750S/icons/Thumbs.db | Bin 0 -> 8704 bytes .../enigma2/enigma2/750S/icons/clock.png | Bin 0 -> 209 bytes .../enigma2/enigma2/750S/icons/dish.png | Bin 0 -> 20003 bytes .../enigma2/enigma2/750S/icons/dish_scan.png | Bin 0 -> 13366 bytes .../enigma2/enigma2/750S/icons/dmm_logo.png | Bin 0 -> 475 bytes .../enigma2/enigma2/750S/icons/epgclock.png | Bin 0 -> 209 bytes .../enigma2/enigma2/750S/icons/epgclock_add.png | Bin 0 -> 358 bytes .../enigma2/enigma2/750S/icons/epgclock_post.png | Bin 0 -> 354 bytes .../enigma2/enigma2/750S/icons/epgclock_pre.png | Bin 0 -> 360 bytes .../enigma2/750S/icons/epgclock_prepost.png | Bin 0 -> 359 bytes .../enigma2/enigma2/750S/icons/folder.png | Bin 0 -> 610 bytes .../enigma2/enigma2/750S/icons/ico_mp_forward.png | Bin 0 -> 810 bytes .../enigma2/enigma2/750S/icons/ico_mp_pause.png | Bin 0 -> 715 bytes .../enigma2/enigma2/750S/icons/ico_mp_play.png | Bin 0 -> 736 bytes .../enigma2/enigma2/750S/icons/ico_mp_rewind.png | Bin 0 -> 801 bytes .../enigma2/enigma2/750S/icons/ico_mp_stop.png | Bin 0 -> 664 bytes .../750S/icons/icon_channelselection_radio.png | Bin 0 -> 767 bytes .../750S/icons/icon_channelselection_tv.png | Bin 0 -> 566 bytes .../enigma2/enigma2/750S/icons/icon_crypt.png | Bin 0 -> 163 bytes .../enigma2/enigma2/750S/icons/icon_crypt_off.png | Bin 0 -> 163 bytes .../enigma2/enigma2/750S/icons/icon_dolby.png | Bin 0 -> 198 bytes .../enigma2/enigma2/750S/icons/icon_dolby_off.png | Bin 0 -> 198 bytes .../enigma2/enigma2/750S/icons/icon_epg.png | Bin 0 -> 1084 bytes .../enigma2/enigma2/750S/icons/icon_event.png | Bin 0 -> 245 bytes .../enigma2/enigma2/750S/icons/icon_format.png | Bin 0 -> 202 bytes .../enigma2/enigma2/750S/icons/icon_format_off.png | Bin 0 -> 202 bytes .../enigma2/enigma2/750S/icons/icon_mainmenu.png | Bin 0 -> 514 bytes .../enigma2/enigma2/750S/icons/icon_media.png | Bin 0 -> 1113 bytes .../enigma2/enigma2/750S/icons/icon_note.png | Bin 0 -> 212 bytes .../enigma2/enigma2/750S/icons/icon_rec.png | Bin 0 -> 326 bytes .../enigma2/enigma2/750S/icons/icon_rec_off.png | Bin 0 -> 326 bytes .../enigma2/enigma2/750S/icons/icon_recorded.png | Bin 0 -> 397 bytes .../enigma2/enigma2/750S/icons/icon_timerlist.png | Bin 0 -> 904 bytes .../enigma2/enigma2/750S/icons/icon_txt.png | Bin 0 -> 168 bytes .../enigma2/enigma2/750S/icons/icon_txt_off.png | Bin 0 -> 168 bytes .../enigma2/enigma2/750S/icons/icon_txt_x.png | Bin 0 -> 176 bytes .../enigma2/enigma2/750S/icons/icon_view.png | Bin 0 -> 376 bytes .../enigma2/enigma2/750S/icons/icons_off.png | Bin 0 -> 268 bytes .../enigma2/enigma2/750S/icons/icons_off_1.png | Bin 0 -> 268 bytes .../enigma2/enigma2/750S/icons/icons_off_X.png | Bin 0 -> 249 bytes .../enigma2/enigma2/750S/icons/input_error.png | Bin 0 -> 2677 bytes .../enigma2/enigma2/750S/icons/input_info.png | Bin 0 -> 1510 bytes .../enigma2/enigma2/750S/icons/input_question.png | Bin 0 -> 2422 bytes .../enigma2/enigma2/750S/icons/lock.png | Bin 0 -> 201 bytes .../enigma2/enigma2/750S/icons/lock_error.png | Bin 0 -> 230 bytes .../enigma2/enigma2/750S/icons/lock_off.png | Bin 0 -> 165 bytes .../enigma2/enigma2/750S/icons/lock_on.png | Bin 0 -> 223 bytes .../enigma2/enigma2/750S/icons/marker.png | Bin 0 -> 229 bytes .../enigma2/enigma2/750S/icons/mp_buttons.png | Bin 0 -> 9981 bytes .../enigma2/enigma2/750S/icons/plugin.png | Bin 0 -> 1778 bytes .../enigma2/enigma2/750S/icons/rass_logo.png | Bin 0 -> 1121 bytes .../enigma2/enigma2/750S/icons/rass_page1.png | Bin 0 -> 255 bytes .../enigma2/enigma2/750S/icons/rass_page2.png | Bin 0 -> 344 bytes .../enigma2/enigma2/750S/icons/rass_page3.png | Bin 0 -> 344 bytes .../enigma2/enigma2/750S/icons/rass_page4.png | Bin 0 -> 344 bytes .../enigma2/enigma2/750S/icons/record.png | Bin 0 -> 216 bytes .../enigma2/enigma2/750S/icons/redx.png | Bin 0 -> 230 bytes .../enigma2/enigma2/750S/icons/repeat_off.png | Bin 0 -> 1096 bytes .../enigma2/enigma2/750S/icons/repeat_on.png | Bin 0 -> 1367 bytes .../enigma2/enigma2/750S/icons/scan-c.png | Bin 0 -> 2454 bytes .../enigma2/enigma2/750S/icons/scan-s.png | Bin 0 -> 5570 bytes .../enigma2/enigma2/750S/icons/scan-t.png | Bin 0 -> 1471 bytes .../enigma2/enigma2/750S/icons/selectioncross.png | Bin 0 -> 230 bytes .../enigma2/enigma2/750S/info-bg.png | Bin 0 -> 947 bytes .../enigma2/enigma2/750S/info-bg_mp.png | Bin 0 -> 929 bytes .../enigma2/enigma2/750S/mediaplayer_bg.png | Bin 0 -> 1840 bytes .../enigma2/enigma2/750S/menu/Thumbs.db | Bin 0 -> 7168 bytes .../enigma2/enigma2/750S/menu/dvd_player.png | Bin 0 -> 10165 bytes .../enigma2/enigma2/750S/menu/information.png | Bin 0 -> 21004 bytes .../enigma2/enigma2/750S/menu/media_player.png | Bin 0 -> 24816 bytes .../enigma2/enigma2/750S/menu/plugins.png | Bin 0 -> 23588 bytes .../enigma2/enigma2/750S/menu/scart.png | Bin 0 -> 15022 bytes .../enigma2/enigma2/750S/menu/setup.png | Bin 0 -> 20213 bytes .../enigma2/enigma2/750S/menu/shutdown.png | Bin 0 -> 19528 bytes .../enigma2/enigma2/750S/menu/subtitles.png | Bin 0 -> 24511 bytes .../enigma2/enigma2/750S/menu/timer.png | Bin 0 -> 22409 bytes .../recipes-vuplus/enigma2/enigma2/750S/mute.png | Bin 0 -> 974 bytes .../enigma2/enigma2/750S/nim_active.png | Bin 0 -> 265 bytes .../enigma2/enigma2/750S/no_coverArt.png | Bin 0 -> 17284 bytes .../recipes-vuplus/enigma2/enigma2/750S/output.png | Bin 0 -> 3689 bytes .../recipes-vuplus/enigma2/enigma2/750S/pal.png | Bin 0 -> 14858 bytes .../enigma2/enigma2/750S/picon_default.png | Bin 0 -> 1989 bytes .../enigma2/enigma2/750S/position_arrow.png | Bin 0 -> 418 bytes .../enigma2/enigma2/750S/position_pointer.png | Bin 0 -> 3617 bytes .../enigma2/enigma2/750S/position_pointer_580.png | Bin 0 -> 3622 bytes .../recipes-vuplus/enigma2/enigma2/750S/prev.png | Bin 0 -> 9103 bytes .../enigma2/enigma2/750S/progress_bg.png | Bin 0 -> 3620 bytes .../enigma2/enigma2/750S/progress_big.png | Bin 0 -> 3671 bytes .../enigma2/enigma2/750S/progress_medium.png | Bin 0 -> 3670 bytes .../enigma2/enigma2/750S/progress_recording.png | Bin 0 -> 3715 bytes .../enigma2/enigma2/750S/progress_small.png | Bin 0 -> 3668 bytes .../recipes-vuplus/enigma2/enigma2/750S/rc.png | Bin 0 -> 33838 bytes .../recipes-vuplus/enigma2/enigma2/750S/rcold.png | Bin 0 -> 33846 bytes .../recipes-vuplus/enigma2/enigma2/750S/screws.png | Bin 0 -> 2165 bytes .../enigma2/enigma2/750S/screws_mp.png | Bin 0 -> 2481 bytes .../recipes-vuplus/enigma2/enigma2/750S/scroll.png | Bin 0 -> 197 bytes .../enigma2/750S/singlelineList_selected_23p.png | Bin 0 -> 301 bytes .../enigma2/enigma2/750S/sleeptimer.png | Bin 0 -> 15602 bytes .../enigma2/enigma2/750S/spinner/Thumbs.db | Bin 0 -> 7168 bytes .../enigma2/enigma2/750S/spinner/wait1.png | Bin 0 -> 1652 bytes .../enigma2/enigma2/750S/spinner/wait2.png | Bin 0 -> 2259 bytes .../enigma2/enigma2/750S/spinner/wait3.png | Bin 0 -> 1803 bytes .../enigma2/enigma2/750S/spinner/wait4.png | Bin 0 -> 2226 bytes .../enigma2/enigma2/750S/timeline-now.png | Bin 0 -> 962 bytes .../enigma2/enigma2/750S/timeline.png | Bin 0 -> 149 bytes .../enigma2/enigma2/750S/unhandled-key.png | Bin 0 -> 1335 bytes .../enigma2/enigma2/750S/verticalline-plugins.png | Bin 0 -> 183 bytes .../enigma2/enigma2/750S/vkey_backspace.png | Bin 0 -> 783 bytes .../enigma2/enigma2/750S/vkey_bg.png | Bin 0 -> 577 bytes .../enigma2/enigma2/750S/vkey_clr.png | Bin 0 -> 955 bytes .../enigma2/enigma2/750S/vkey_esc.png | Bin 0 -> 1321 bytes .../enigma2/enigma2/750S/vkey_icon.png | Bin 0 -> 2512 bytes .../enigma2/enigma2/750S/vkey_left.png | Bin 0 -> 819 bytes .../enigma2/enigma2/750S/vkey_ok.png | Bin 0 -> 990 bytes .../enigma2/enigma2/750S/vkey_right.png | Bin 0 -> 817 bytes .../enigma2/enigma2/750S/vkey_sel.png | Bin 0 -> 173 bytes .../enigma2/enigma2/750S/vkey_shift.png | Bin 0 -> 767 bytes .../enigma2/enigma2/750S/vkey_shift_sel.png | Bin 0 -> 1395 bytes .../enigma2/enigma2/750S/vkey_space.png | Bin 0 -> 577 bytes .../enigma2/enigma2/750S/vkey_text.png | Bin 0 -> 262 bytes .../recipes-vuplus/enigma2/enigma2/750S/volume.png | Bin 0 -> 2075 bytes .../enigma2/enigma2/750S/volume_box.png | Bin 0 -> 303 bytes .../recipes-vuplus/enigma2/enigma2/750S/wizard.png | Bin 0 -> 4465 bytes .../enigma2/enigma2/MyriadPro-Regular.otf | Bin 0 -> 79364 bytes .../enigma2/enigma2/MyriadPro-Semibold.otf | Bin 0 -> 97332 bytes .../enigma2/enigma2/MyriadPro-SemiboldIt.otf | Bin 0 -> 101776 bytes .../enigma2/enigma2/Vu_HD/Bg_EPG_list.png | Bin 0 -> 2191 bytes .../enigma2/enigma2/Vu_HD/Bg_EPG_view.png | Bin 0 -> 2235 bytes .../enigma2/enigma2/Vu_HD/Bg_List.png | Bin 0 -> 52623 bytes .../enigma2/enigma2/Vu_HD/Bg_Media.png | Bin 0 -> 8652 bytes .../enigma2/enigma2/Vu_HD/Bg_Media_info.png | Bin 0 -> 2470 bytes .../enigma2/enigma2/Vu_HD/Bg_Subtitle.png | Bin 0 -> 2149 bytes .../enigma2/enigma2/Vu_HD/Bg_divideline.png | Bin 0 -> 823 bytes .../enigma2/enigma2/Vu_HD/Solo_Menu_bg520.png | Bin 0 -> 2639 bytes .../enigma2/enigma2/Vu_HD/Statusbar_white.png | Bin 0 -> 822 bytes .../enigma2/enigma2/Vu_HD/arrowdown.png | Bin 0 -> 989 bytes .../enigma2/enigma2/Vu_HD/arrowleft.png | Bin 0 -> 939 bytes .../enigma2/enigma2/Vu_HD/arrowright.png | Bin 0 -> 940 bytes .../enigma2/enigma2/Vu_HD/arrowup.png | Bin 0 -> 950 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/b_b.png | Bin 0 -> 221 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/b_bl.png | Bin 0 -> 427 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/b_br.png | Bin 0 -> 429 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/b_l.png | Bin 0 -> 300 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/b_r.png | Bin 0 -> 301 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/b_t.png | Bin 0 -> 231 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/b_tl.png | Bin 0 -> 435 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/b_tr.png | Bin 0 -> 426 bytes .../enigma2/enigma2/Vu_HD/bar_ber.png | Bin 0 -> 1357 bytes .../enigma2/enigma2/Vu_HD/bar_snr.png | Bin 0 -> 1262 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/bg.png | Bin 0 -> 2650 bytes .../enigma2/enigma2/Vu_HD/border_eventinfo.png | Bin 0 -> 451 bytes .../enigma2/enigma2/Vu_HD/border_info.png | Bin 0 -> 5011 bytes .../enigma2/enigma2/Vu_HD/border_menu.png | Bin 0 -> 945 bytes .../enigma2/enigma2/Vu_HD/buttons/FocusBar_H36.png | Bin 0 -> 852 bytes .../enigma2/enigma2/Vu_HD/buttons/FocusBar_H42.png | Bin 0 -> 860 bytes .../enigma2/enigma2/Vu_HD/buttons/FocusBar_H45.png | Bin 0 -> 825 bytes .../enigma2/enigma2/Vu_HD/buttons/blue.png | Bin 0 -> 363 bytes .../enigma2/Vu_HD/buttons/button_bluekey.png | Bin 0 -> 1807 bytes .../enigma2/enigma2/Vu_HD/buttons/button_off.png | Bin 0 -> 362 bytes .../enigma2/enigma2/Vu_HD/buttons/green.png | Bin 0 -> 362 bytes .../enigma2/enigma2/Vu_HD/buttons/key_0.png | Bin 0 -> 945 bytes .../enigma2/enigma2/Vu_HD/buttons/key_1.png | Bin 0 -> 883 bytes .../enigma2/enigma2/Vu_HD/buttons/key_2.png | Bin 0 -> 935 bytes .../enigma2/enigma2/Vu_HD/buttons/key_3.png | Bin 0 -> 951 bytes .../enigma2/enigma2/Vu_HD/buttons/key_4.png | Bin 0 -> 935 bytes .../enigma2/enigma2/Vu_HD/buttons/key_5.png | Bin 0 -> 950 bytes .../enigma2/enigma2/Vu_HD/buttons/key_6.png | Bin 0 -> 977 bytes .../enigma2/enigma2/Vu_HD/buttons/key_7.png | Bin 0 -> 900 bytes .../enigma2/enigma2/Vu_HD/buttons/key_8.png | Bin 0 -> 971 bytes .../enigma2/enigma2/Vu_HD/buttons/key_9.png | Bin 0 -> 944 bytes .../enigma2/enigma2/Vu_HD/buttons/key_text.png | Bin 0 -> 596 bytes .../enigma2/enigma2/Vu_HD/buttons/red.png | Bin 0 -> 363 bytes .../enigma2/enigma2/Vu_HD/buttons/yellow.png | Bin 0 -> 363 bytes .../enigma2/enigma2/Vu_HD/countries/ad.png | Bin 0 -> 1156 bytes .../enigma2/enigma2/Vu_HD/countries/ae.png | Bin 0 -> 1287 bytes .../enigma2/enigma2/Vu_HD/countries/cz.png | Bin 0 -> 1231 bytes .../enigma2/enigma2/Vu_HD/countries/de.png | Bin 0 -> 1022 bytes .../enigma2/enigma2/Vu_HD/countries/dk.png | Bin 0 -> 1424 bytes .../enigma2/enigma2/Vu_HD/countries/ee.png | Bin 0 -> 919 bytes .../enigma2/enigma2/Vu_HD/countries/en.png | Bin 0 -> 1996 bytes .../enigma2/enigma2/Vu_HD/countries/es.png | Bin 0 -> 1406 bytes .../enigma2/enigma2/Vu_HD/countries/fi.png | Bin 0 -> 1522 bytes .../enigma2/enigma2/Vu_HD/countries/fr.png | Bin 0 -> 1249 bytes .../enigma2/enigma2/Vu_HD/countries/gr.png | Bin 0 -> 1451 bytes .../enigma2/enigma2/Vu_HD/countries/hr.png | Bin 0 -> 1492 bytes .../enigma2/enigma2/Vu_HD/countries/hu.png | Bin 0 -> 1148 bytes .../enigma2/enigma2/Vu_HD/countries/is.png | Bin 0 -> 1558 bytes .../enigma2/enigma2/Vu_HD/countries/it.png | Bin 0 -> 1244 bytes .../enigma2/enigma2/Vu_HD/countries/lt.png | Bin 0 -> 1856 bytes .../enigma2/enigma2/Vu_HD/countries/lv.png | Bin 0 -> 819 bytes .../enigma2/enigma2/Vu_HD/countries/missing.png | Bin 0 -> 1600 bytes .../enigma2/enigma2/Vu_HD/countries/nl.png | Bin 0 -> 1160 bytes .../enigma2/enigma2/Vu_HD/countries/no.png | Bin 0 -> 1584 bytes .../enigma2/enigma2/Vu_HD/countries/pl.png | Bin 0 -> 900 bytes .../enigma2/enigma2/Vu_HD/countries/pt.png | Bin 0 -> 1490 bytes .../enigma2/enigma2/Vu_HD/countries/ro.png | Bin 0 -> 1202 bytes .../enigma2/enigma2/Vu_HD/countries/ru.png | Bin 0 -> 1186 bytes .../enigma2/enigma2/Vu_HD/countries/se.png | Bin 0 -> 1512 bytes .../enigma2/enigma2/Vu_HD/countries/si.png | Bin 0 -> 1526 bytes .../enigma2/enigma2/Vu_HD/countries/sk.png | Bin 0 -> 1397 bytes .../enigma2/enigma2/Vu_HD/countries/tr.png | Bin 0 -> 1459 bytes .../enigma2/enigma2/Vu_HD/countries/ua.png | Bin 0 -> 1262 bytes .../enigma2/enigma2/Vu_HD/countries/x-fy.png | Bin 0 -> 2009 bytes .../enigma2/enigma2/Vu_HD/countries/yu.png | Bin 0 -> 1478 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/div-h.png | Bin 0 -> 151 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/div-v.png | Bin 0 -> 154 bytes .../enigma2/enigma2/Vu_HD/epg_more.png | Bin 0 -> 1699 bytes .../enigma2/enigma2/Vu_HD/epg_next.png | Bin 0 -> 1746 bytes .../enigma2/enigma2/Vu_HD/epg_now.png | Bin 0 -> 1683 bytes .../enigma2/Vu_HD/icons/Mediaplayerbar_gray.png | Bin 0 -> 480 bytes .../enigma2/Vu_HD/icons/Mediaplayerbar_purple.png | Bin 0 -> 503 bytes .../enigma2/enigma2/Vu_HD/icons/clock.png | Bin 0 -> 198 bytes .../enigma2/enigma2/Vu_HD/icons/dish.png | Bin 0 -> 5974 bytes .../enigma2/enigma2/Vu_HD/icons/dish_scan.png | Bin 0 -> 4574 bytes .../enigma2/Vu_HD/icons/ico_Chlist_title.png | Bin 0 -> 570 bytes .../enigma2/Vu_HD/icons/ico_Radio_title.png | Bin 0 -> 583 bytes .../enigma2/enigma2/Vu_HD/icons/ico_folder.png | Bin 0 -> 516 bytes .../enigma2/enigma2/Vu_HD/icons/ico_noreplay.png | Bin 0 -> 362 bytes .../enigma2/enigma2/Vu_HD/icons/ico_player.png | Bin 0 -> 3908 bytes .../enigma2/enigma2/Vu_HD/icons/ico_replay.png | Bin 0 -> 655 bytes .../enigma2/enigma2/Vu_HD/icons/icon_crypt.png | Bin 0 -> 820 bytes .../enigma2/enigma2/Vu_HD/icons/icon_crypt_off.png | Bin 0 -> 820 bytes .../enigma2/enigma2/Vu_HD/icons/icon_dolby.png | Bin 0 -> 1587 bytes .../enigma2/enigma2/Vu_HD/icons/icon_dolby_off.png | Bin 0 -> 1010 bytes .../enigma2/enigma2/Vu_HD/icons/icon_event.png | Bin 0 -> 245 bytes .../enigma2/enigma2/Vu_HD/icons/icon_format.png | Bin 0 -> 858 bytes .../enigma2/Vu_HD/icons/icon_format_off.png | Bin 0 -> 858 bytes .../enigma2/enigma2/Vu_HD/icons/icon_rec.png | Bin 0 -> 703 bytes .../enigma2/enigma2/Vu_HD/icons/icon_rec_off.png | Bin 0 -> 508 bytes .../enigma2/enigma2/Vu_HD/icons/icon_txt.png | Bin 0 -> 824 bytes .../enigma2/enigma2/Vu_HD/icons/icon_txt_off.png | Bin 0 -> 824 bytes .../enigma2/enigma2/Vu_HD/icons/icon_view.png | Bin 0 -> 376 bytes .../enigma2/enigma2/Vu_HD/icons/icons_off.png | Bin 0 -> 268 bytes .../enigma2/enigma2/Vu_HD/icons/input_error.png | Bin 0 -> 1663 bytes .../enigma2/enigma2/Vu_HD/icons/input_info.png | Bin 0 -> 1409 bytes .../enigma2/enigma2/Vu_HD/icons/input_question.png | Bin 0 -> 1668 bytes .../enigma2/enigma2/Vu_HD/icons/lock.png | Bin 0 -> 201 bytes .../enigma2/enigma2/Vu_HD/icons/lock_error.png | Bin 0 -> 1322 bytes .../enigma2/enigma2/Vu_HD/icons/lock_off.png | Bin 0 -> 540 bytes .../enigma2/enigma2/Vu_HD/icons/lock_on.png | Bin 0 -> 1232 bytes .../enigma2/enigma2/Vu_HD/icons/mp_buttons.png | Bin 0 -> 1295 bytes .../enigma2/enigma2/Vu_HD/icons/mp_wb_buttons.png | Bin 0 -> 534 bytes .../enigma2/enigma2/Vu_HD/icons/plugin.png | Bin 0 -> 1778 bytes .../enigma2/enigma2/Vu_HD/icons/rass_logo.png | Bin 0 -> 1121 bytes .../enigma2/enigma2/Vu_HD/icons/record.png | Bin 0 -> 216 bytes .../enigma2/enigma2/Vu_HD/icons/redx.png | Bin 0 -> 710 bytes .../enigma2/enigma2/Vu_HD/icons/scan-c.png | Bin 0 -> 2454 bytes .../enigma2/enigma2/Vu_HD/icons/scan-s.png | Bin 0 -> 1799 bytes .../enigma2/enigma2/Vu_HD/icons/scan-t.png | Bin 0 -> 1471 bytes .../enigma2/enigma2/Vu_HD/info-bg.png | Bin 0 -> 2589 bytes .../enigma2/enigma2/Vu_HD/menu/ico_EPG_title.png | Bin 0 -> 801 bytes .../enigma2/Vu_HD/menu/ico_Plugin_All_title.png | Bin 0 -> 2798 bytes .../enigma2/enigma2/Vu_HD/menu/ico_menu_Info.png | Bin 0 -> 2874 bytes .../enigma2/enigma2/Vu_HD/menu/ico_menu_Media.png | Bin 0 -> 2843 bytes .../enigma2/enigma2/Vu_HD/menu/ico_menu_Plugin.png | Bin 0 -> 3059 bytes .../enigma2/enigma2/Vu_HD/menu/ico_menu_Setup.png | Bin 0 -> 3450 bytes .../enigma2/Vu_HD/menu/ico_menu_Standby.png | Bin 0 -> 3170 bytes .../enigma2/Vu_HD/menu/ico_menu_Subtitles.png | Bin 0 -> 3171 bytes .../enigma2/enigma2/Vu_HD/menu/ico_menu_Timer.png | Bin 0 -> 2392 bytes .../enigma2/enigma2/Vu_HD/menu/ico_title_Info.png | Bin 0 -> 1306 bytes .../enigma2/enigma2/Vu_HD/menu/ico_title_MENU.png | Bin 0 -> 3443 bytes .../enigma2/enigma2/Vu_HD/menu/ico_title_Media.png | Bin 0 -> 1325 bytes .../enigma2/Vu_HD/menu/ico_title_Plugin.png | Bin 0 -> 1290 bytes .../enigma2/Vu_HD/menu/ico_title_Pluginall.png | Bin 0 -> 1298 bytes .../enigma2/enigma2/Vu_HD/menu/ico_title_Setup.png | Bin 0 -> 1340 bytes .../enigma2/Vu_HD/menu/ico_title_Standby.png | Bin 0 -> 1428 bytes .../enigma2/Vu_HD/menu/ico_title_Subtitles.png | Bin 0 -> 1350 bytes .../enigma2/enigma2/Vu_HD/menu/ico_title_Timer.png | Bin 0 -> 1194 bytes .../enigma2/Vu_HD/menu/ico_title_media-info.png | Bin 0 -> 3432 bytes .../enigma2/enigma2/Vu_HD/mp_wb_background.png | Bin 0 -> 3656 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/mute.png | Bin 0 -> 1894 bytes .../enigma2/enigma2/Vu_HD/no_coverArt.png | Bin 0 -> 2116 bytes .../enigma2/enigma2/Vu_HD/position_arrow.png | Bin 0 -> 418 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/prev.png | Bin 0 -> 19574 bytes .../enigma2/enigma2/Vu_HD/progress_bg.png | Bin 0 -> 3620 bytes .../enigma2/enigma2/Vu_HD/progress_big.png | Bin 0 -> 1438 bytes .../enigma2/enigma2/Vu_HD/progress_medium.png | Bin 0 -> 812 bytes .../enigma2/enigma2/Vu_HD/progress_small.png | Bin 0 -> 1438 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/rc.png | Bin 0 -> 14127 bytes .../enigma2/enigma2/Vu_HD/rc_wb_desc.png | Bin 0 -> 72279 bytes .../recipes-vuplus/enigma2/enigma2/Vu_HD/rcold.png | Bin 0 -> 14127 bytes .../enigma2/enigma2/Vu_HD/sleeptimer.png | Bin 0 -> 6503 bytes .../enigma2/enigma2/Vu_HD/timeline-now.png | Bin 0 -> 369 bytes .../enigma2/enigma2/Vu_HD/timeline.png | Bin 0 -> 149 bytes .../enigma2/enigma2/Vu_HD/unhandled-key.png | Bin 0 -> 2773 bytes .../enigma2/enigma2/Vu_HD/vkey_backspace.png | Bin 0 -> 783 bytes .../enigma2/enigma2/Vu_HD/vkey_bg.png | Bin 0 -> 577 bytes .../enigma2/enigma2/Vu_HD/vkey_clr.png | Bin 0 -> 955 bytes .../enigma2/enigma2/Vu_HD/vkey_esc.png | Bin 0 -> 1321 bytes .../enigma2/enigma2/Vu_HD/vkey_icon.png | Bin 0 -> 2512 bytes .../enigma2/enigma2/Vu_HD/vkey_left.png | Bin 0 -> 819 bytes .../enigma2/enigma2/Vu_HD/vkey_ok.png | Bin 0 -> 990 bytes .../enigma2/enigma2/Vu_HD/vkey_right.png | Bin 0 -> 817 bytes .../enigma2/enigma2/Vu_HD/vkey_sel.png | Bin 0 -> 173 bytes .../enigma2/enigma2/Vu_HD/vkey_shift.png | Bin 0 -> 767 bytes .../enigma2/enigma2/Vu_HD/vkey_shift_sel.png | Bin 0 -> 1395 bytes .../enigma2/enigma2/Vu_HD/vkey_space.png | Bin 0 -> 577 bytes .../enigma2/enigma2/Vu_HD/vkey_text.png | Bin 0 -> 262 bytes .../enigma2/enigma2/Vu_HD/volume_background.png | Bin 0 -> 1970 bytes .../enigma2/enigma2/Vu_HD/volume_up.png | Bin 0 -> 1290 bytes .../enigma2/enigma2/Vu_HD/wizard.png | Bin 0 -> 4465 bytes .../recipes-vuplus/enigma2/enigma2/analog.ttf | Bin 0 -> 41168 bytes .../enigma2/enigma2_vuplus_addlibpythondeps.patch | 28 + .../enigma2/enigma2_vuplus_mediaplayer.patch | 218 + .../enigma2_vuplus_mediaplayer_subtitle.patch | 104 + .../enigma2_vuplus_mediaplayer_unpause.patch | 20 + .../enigma2/enigma2/enigma2_vuplus_misc.patch | 12 + .../enigma2/enigma2_vuplus_networksetup.patch | 45 + .../enigma2_vuplus_remove_dreambox_enigma.patch | 40 + .../enigma2/enigma2/enigma2_vuplus_skin.patch | 6753 ++ .../enigma2/enigma2/enigma2_vuplus_textvfd.patch | 43 + .../enigma2/enigma2/enigma2_vuplus_vfd.patch | 141 + .../enigma2/enigma2/enigma2_vuplus_vfd_mode.patch | 124 + .../enigma2/enigma2/number_key/key_0.png | Bin 0 -> 572 bytes .../enigma2/enigma2/number_key/key_1.png | Bin 0 -> 463 bytes .../enigma2/enigma2/number_key/key_2.png | Bin 0 -> 501 bytes .../enigma2/enigma2/number_key/key_3.png | Bin 0 -> 564 bytes .../enigma2/enigma2/number_key/key_4.png | Bin 0 -> 513 bytes .../enigma2/enigma2/number_key/key_5.png | Bin 0 -> 528 bytes .../enigma2/enigma2/number_key/key_6.png | Bin 0 -> 558 bytes .../enigma2/enigma2/number_key/key_7.png | Bin 0 -> 486 bytes .../enigma2/enigma2/number_key/key_8.png | Bin 0 -> 590 bytes .../enigma2/enigma2/number_key/key_9.png | Bin 0 -> 577 bytes .../recipes-vuplus/enigma2/enigma2/skin_user.xml | 243 + .../enigma2/enigma2/vfd_icons/vfd_icon_crypt.png | Bin 0 -> 961 bytes .../enigma2/enigma2/vfd_icons/vfd_icon_dolby.png | Bin 0 -> 985 bytes .../enigma2/enigma2/vfd_icons/vfd_icon_format.png | Bin 0 -> 996 bytes .../enigma2/enigma2/vfd_icons/vfd_icon_rec.png | Bin 0 -> 1009 bytes .../enigma2/enigma2/vfd_icons/vfd_icon_txt.png | Bin 0 -> 975 bytes .../recipes-vuplus/fakelocale/fakelocale.bb | 48 + .../recipes-vuplus/fakelocale/files/locale.alias | 28 + .../firmwares/files/Marvell-Licence.txt | 40 + .../recipes-vuplus/firmwares/firmware-drxd-a2.bb | 9 + .../firmwares/firmware-dvb-af9005.bb | 9 + .../firmwares/firmware-dvb-fe-af9013.bb | 9 + .../firmwares/firmware-dvb-usb-af9015.bb | 9 + .../firmwares/firmware-dvb-usb-af9035.bb | 9 + .../firmwares/firmware-dvb-usb-avertv-a800.bb | 9 + .../firmwares/firmware-dvb-usb-dib0700.bb | 12 + .../firmwares/firmware-dvb-usb-dibusb.bb | 11 + .../firmwares/firmware-dvb-usb-digitv.bb | 9 + .../firmwares/firmware-dvb-usb-ec168.bb | 9 + .../firmwares/firmware-dvb-usb-nova-t-usb2.bb | 10 + .../firmwares/firmware-dvb-usb-sms1xxx-hcw-dvbt.bb | 11 + .../firmware-dvb-usb-sms1xxx-nova-dvbt.bb | 10 + .../firmwares/firmware-dvb-usb-ttusb-budget.bb | 9 + .../firmwares/firmware-dvb-usb-umt-010.bb | 9 + .../firmwares/firmware-dvb-usb-wt220u-zl0353.bb | 9 + .../firmwares/firmware-dvb-usb-xc5000.bb | 10 + .../recipes-vuplus/firmwares/firmware-dvb-usb.bb | 13 + .../recipes-vuplus/firmwares/firmware-htc9271.bb | 9 + .../recipes-vuplus/firmwares/firmware-rt2561.bb | 9 + .../recipes-vuplus/firmwares/firmware-rt3070.bb | 10 + .../recipes-vuplus/firmwares/firmware-rtl8721u.bb | 9 + .../recipes-vuplus/firmwares/linux-firmware.inc | 11 + .../firmwares/marvell-gspi-fw/9.70.3-p37.tar.gz | Bin 0 -> 92016 bytes .../firmwares/marvell-gspi-fw_9.70.3-p37.bb | 20 + .../firmwares/marvell-sdio-fw/9.70.3-p37.tar.gz | Bin 0 -> 88003 bytes .../firmwares/marvell-sdio-fw_9.70.3-p37.bb | 19 + .../libungif/libungif-native_4.1.3.bb | 7 + .../recipes-vuplus/libungif/libungif_4.1.3.bb | 15 + .../recipes-vuplus/showiframe/showiframe_1.8.bb | 9 + .../recipes-vuplus/tasks/task-vuplus-base.inc | 2 - .../recipes-vuplus/tasks/task-vuplus-enigma2.bb | 7 + .../recipes-vuplus/tasks/task-vuplus-enigma2.inc | 85 + .../recipes-vuplus/timezones/files/GPL-1.0 | 252 + .../timezones/files/zoneinfo.tar.bz2 | Bin 0 -> 38585 bytes .../timezones/timezones-alternative.bb | 25 + .../recipes-vuplus/tuxbox/tuxbox-common_0.1.bb | 19 + .../recipes-vuplus/tuxcom/tuxbox-tuxcom-32bpp.bb | 32 + .../tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff | 1136 + .../tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff | 48 + .../tuxcom/tuxbox-tuxcom-32bpp/add_font.diff | Bin 0 -> 67589 bytes .../tuxcom/tuxbox-tuxcom-32bpp/fix_smstext.diff | 48 + .../tuxcom/tuxbox-tuxcom-32bpp/largefile.diff | 11 + .../tuxcom/tuxbox-tuxcom-32bpp/makefiles.diff | 505 + .../support_newer_freetype.diff | 78 + .../recipes-vuplus/tuxtxt/tuxbox-libtuxtxt.bb | 28 + .../tuxtxt/tuxbox-libtuxtxt/32bpp.diff | 738 + .../tuxtxt/tuxbox-libtuxtxt/acinclude.m4 | 385 + .../tuxbox-libtuxtxt/allow_different_demux.diff | 95 + .../tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch | 11 + .../tuxtxt/tuxbox-libtuxtxt/libz.patch | 10 + .../tuxbox-libtuxtxt/resize_framebuffer.diff | 48 + .../tuxtxt/tuxbox-libtuxtxt/videodev2.patch | 11 + .../recipes-vuplus/tuxtxt/tuxbox-tuxtxt-32bpp.bb | 32 + .../tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff | 388 + .../tuxbox-tuxtxt-32bpp/add_advanced_rc.diff | 161 + .../tuxbox-tuxtxt-32bpp/add_new_default_conf.diff | 36 + .../tuxbox-tuxtxt-32bpp/allow_different_demux.diff | 77 + .../tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff | 548 + .../tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff | 142 + .../tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py | 60 + .../tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch | 12 + .../usbtunerhelper/usbtunerhelper.bb | 23 + .../usbtunerhelper/usbtunerhelper/GPL-2.0 | 132 + .../usbtunerhelper/usbtunerhelper.sh | 24 + .../vuplus-compat/vuplus-compat_1.0.bb | 22 + .../recipes-vuplus/vuplus-vucamd/vuplus-vucamd.bb | 25 + .../vuplus-vucamd/vuplus-vucamd/Proprietary | 1 + .../vuplus-vucamd/vuplus-vucamd/vucamd | Bin 0 -> 70300 bytes .../vuplus-vucamd/vuplus-vucamd/vucamd.sh | 38 + .../hostap/hostap-daemon-0.7.3/defconfig | 145 - .../recipes-wlan/hostap/hostap-daemon-0.7.3/init | 37 - .../recipes-wlan/hostap/hostap-daemon-0.7.inc | 25 - .../recipes-wlan/hostap/hostap-daemon_0.7.3.bb | 17 - .../ralink/rt3070-2.5.0.3/config.patch | 16 - .../ralink/rt3070-2.5.0.3/makefile.patch | 22 - .../recipes-wlan/ralink/rt3070_2.5.0.3.bb | 26 - .../r8192cu-3.1.2590.20110922/linux_3.1.patch | 24 - .../r8192cu-3.1.2590.20110922/makefile.patch | 26 - .../rtl8192_8188CU_linux_v3.1.2590.20110922.tar.gz | Bin 908652 -> 0 bytes .../realtek/r8192cu_3.1.2590.20110922.bb | 34 - meta-openvuplus/recipes-wlan/realtek/r8712u/config | 27 - .../recipes-wlan/realtek/r8712u/strcasecmp.patch | 14 - .../realtek/r8712u_2.6.6.0.20101111.bb | 30 - .../recipes-wlan/rt2870sta/files/RT2870STA.dat | 79 - .../recipes-wlan/rt2870sta/rt2870sta_1.0.0.bb | 18 - .../rt73-firmware/rt73-firmware_1.8.bb | 17 - .../recipes-wlan/tasks/task-vuplus-wlan.bb | 55 - .../recipes-wlan/wlan-rt73/files/changeiface.patch | 38 - .../recipes-wlan/wlan-rt73/files/make.patch | 20 - .../recipes-wlan/wlan-rt73/wlan-rt73.bb | 43 - .../wpa-supplicant-0.7.3/action_wpa.sh | 50 - .../wpa-supplicant-0.7.3/functions.sh | 1015 - .../wpa-supplicant-0.7.3/ifupdown.sh | 172 - .../wpa-supplicant/wpa-supplicant-0.7.3/wpa_action | 81 - .../wpa-supplicant-0.7.3/wpa_action.8 | 148 - .../wpa-supplicant/wpa-supplicant_0.7.3.bbappend | 40 - .../recipes-wlan/zd1211/zd1211-firmware_1.4.bb | 25 - .../zd1211/zd1211b/cross_compile.patch | 41 - .../recipes-wlan/zd1211/zd1211b/zdiface.patch | 12 - .../recipes-wlan/zd1211/zd1211b_2.22.0.0.bb | 32 - 1594 files changed, 165905 insertions(+), 166543 deletions(-) delete mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps.bb delete mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps/GPL-1.0 delete mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.info delete mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.kmap delete mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.info delete mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.kmap delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/020_auto_net_path_sortlocale_mountoptions.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/037_let_debian_rules_decide_on_CFLAGS.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/042_default_auto_master_all_commented_out.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/060_non_replicated_ping.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/061_multi_parse_fix.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/062_fix_memory_leak.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/063_misc_fixes.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/064_support_options_on_nis_maps.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/065_fix_master_map_in_ldap.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/066_canonicalise_mount_points.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/067_allow_disabling_bind_mounts.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/067_ldap_no_first_message.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/068_fix_invalid_rpcgen_code.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/069_support_spaces_in_smb_share_names.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/070_fix_regex_typo.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/071_fix_ldap_mounts.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/072_fix_auto_net_sort.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/073_configurable_locking.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/074_auto_smb_cifs.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/075_auto_net_escape_hash.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/076_ldap_deprecated.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/078_locking_fix_1.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/079_no_unlink_upstream.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/080_auto_smb_probe_credentials.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/081_auto_net_showmount_quotes.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/082_samples_makefile_typo.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/083_clarify_program_map_outputsyntax.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/084_init_lsb_header.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/085_auto_net_lp111612.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/Makefile.rules-cross.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.hotplug delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.master delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.network delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/autofs.default delete mode 100755 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/autofs.init delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/cross.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/install.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/no-bash.patch delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs-4.1.4/volatiles.99_autofs delete mode 100644 meta-openvuplus/recipes-base/autofs/autofs_4.1.4.bb delete mode 100644 meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps.bb delete mode 100644 meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/GPL-1.0 delete mode 100644 meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/dream-de.info delete mode 100644 meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/dream-de.kmap delete mode 100644 meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/eng.info delete mode 100644 meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/eng.kmap delete mode 100644 meta-openvuplus/recipes-base/fakelocale/fakelocale.bb delete mode 100644 meta-openvuplus/recipes-base/fakelocale/files/locale.alias delete mode 100644 meta-openvuplus/recipes-base/firmwares/files/Marvell-Licence.txt delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-drxd-a2.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-af9005.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-fe-af9013.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9015.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9035.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-avertv-a800.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dib0700.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dibusb.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-digitv.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ec168.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-nova-t-usb2.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-hcw-dvbt.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-nova-dvbt.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ttusb-budget.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-umt-010.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-wt220u-zl0353.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-xc5000.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-htc9271.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-rt2561.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-rt3070.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/firmware-rtl8721u.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/linux-firmware.inc delete mode 100644 meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw/9.70.3-p37.tar.gz delete mode 100644 meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw_9.70.3-p37.bb delete mode 100644 meta-openvuplus/recipes-base/firmwares/marvell-sdio-fw/9.70.3-p37.tar.gz delete mode 100644 meta-openvuplus/recipes-base/firmwares/marvell-sdio-fw_9.70.3-p37.bb delete mode 100644 meta-openvuplus/recipes-base/hddtemp/hddtemp/hddtemp-no-nls-support.patch delete mode 100644 meta-openvuplus/recipes-base/hddtemp/hddtemp_0.3-beta15.bb delete mode 100644 meta-openvuplus/recipes-base/joe/joe_3.7.bb delete mode 100644 meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-extfs-dir.patch delete mode 100644 meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-hints.patch delete mode 100644 meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-sfs-ini.patch delete mode 100644 meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-syntax-file.patch delete mode 100644 meta-openvuplus/recipes-base/mc/mc_4.8.1.bbappend delete mode 100644 meta-openvuplus/recipes-base/mtd/mtd-utils-1.4.9/disable-ubi.patch delete mode 100644 meta-openvuplus/recipes-base/mtd/mtd-utils_1.4.9.bbappend delete mode 100644 meta-openvuplus/recipes-base/ncdu/ncdu_1.8.bb delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg-collateral.bbappend delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg-collateral/dest delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch delete mode 100644 meta-openvuplus/recipes-base/opkg/opkg_svn.bbappend delete mode 100644 meta-openvuplus/recipes-base/ppp/ppp_2.4.5.bbappend delete mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch delete mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/configure.patch delete mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/kernel-oplocks.patch delete mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch delete mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch delete mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch delete mode 100644 meta-openvuplus/recipes-base/samba/samba/01samba-kill delete mode 100644 meta-openvuplus/recipes-base/samba/samba/01samba-start delete mode 100644 meta-openvuplus/recipes-base/samba/samba/config-lfs.patch delete mode 100644 meta-openvuplus/recipes-base/samba/samba/init delete mode 100644 meta-openvuplus/recipes-base/samba/samba/quota.patch delete mode 100644 meta-openvuplus/recipes-base/samba/samba/smb.conf delete mode 100644 meta-openvuplus/recipes-base/samba/samba/tdb.pc delete mode 100644 meta-openvuplus/recipes-base/samba/samba/volatiles.03_samba delete mode 100644 meta-openvuplus/recipes-base/samba/samba_3.0.37.bb delete mode 100644 meta-openvuplus/recipes-base/samba/samba_3.0.37.bbappend delete mode 100644 meta-openvuplus/recipes-base/shadow/shadow-securetty/securetty delete mode 100644 meta-openvuplus/recipes-base/shadow/shadow-securetty_4.1.4.3.bbappend delete mode 100644 meta-openvuplus/recipes-base/smartmontools/smartmontools.inc delete mode 100644 meta-openvuplus/recipes-base/smartmontools/smartmontools_5.42.bb delete mode 100644 meta-openvuplus/recipes-base/tasks/task-vuplus-base.bb delete mode 100644 meta-openvuplus/recipes-base/tasks/task-vuplus-base.inc delete mode 100644 meta-openvuplus/recipes-base/timezones/files/GPL-1.0 delete mode 100644 meta-openvuplus/recipes-base/timezones/files/zoneinfo.tar.bz2 delete mode 100644 meta-openvuplus/recipes-base/timezones/timezones-alternative.bb delete mode 100644 meta-openvuplus/recipes-base/tuxbox/tuxbox-common_0.1.bb delete mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp.bb delete mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff delete mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff delete mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_font.diff delete mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/fix_smstext.diff delete mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/largefile.diff delete mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/makefiles.diff delete mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/support_newer_freetype.diff delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt.bb delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/32bpp.diff delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/acinclude.m4 delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/allow_different_demux.diff delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/libz.patch delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/resize_framebuffer.diff delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/videodev2.patch delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp.bb delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_advanced_rc.diff delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_new_default_conf.diff delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/allow_different_demux.diff delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py delete mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch delete mode 100644 meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper.bb delete mode 100644 meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/GPL-2.0 delete mode 100644 meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/usbtunerhelper.sh delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/01-builddefs.patch delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/02-config.patch delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/03-db-doc.patch delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/04-link-local.patch delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/05-whitespaces.patch delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/06-greedy.patch delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/07-utf8.patch delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/08-manpage.patch delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/09-s390.patch delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/10-remote-dos.patch delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.conf delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.socket delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.xinetd.in delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd@.service delete mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd_2.3.5.bb delete mode 100644 meta-openvuplus/recipes-base/vuplus-compat/vuplus-compat_1.0.bb delete mode 100644 meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd.bb delete mode 100644 meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/Proprietary delete mode 100755 meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/vucamd delete mode 100644 meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/vucamd.sh delete mode 100644 meta-openvuplus/recipes-base/zeroconf/zeroconf_0.9.bbappend create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/020_auto_net_path_sortlocale_mountoptions.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/037_let_debian_rules_decide_on_CFLAGS.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/042_default_auto_master_all_commented_out.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/060_non_replicated_ping.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/061_multi_parse_fix.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/062_fix_memory_leak.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/063_misc_fixes.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/064_support_options_on_nis_maps.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/065_fix_master_map_in_ldap.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/066_canonicalise_mount_points.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/067_allow_disabling_bind_mounts.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/067_ldap_no_first_message.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/068_fix_invalid_rpcgen_code.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/069_support_spaces_in_smb_share_names.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/070_fix_regex_typo.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/071_fix_ldap_mounts.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/072_fix_auto_net_sort.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/073_configurable_locking.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/074_auto_smb_cifs.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/075_auto_net_escape_hash.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/076_ldap_deprecated.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/078_locking_fix_1.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/079_no_unlink_upstream.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/080_auto_smb_probe_credentials.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/081_auto_net_showmount_quotes.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/082_samples_makefile_typo.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/083_clarify_program_map_outputsyntax.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/084_init_lsb_header.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/085_auto_net_lp111612.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/Makefile.rules-cross.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.hotplug create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.master create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.network create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/autofs.default create mode 100755 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/autofs.init create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/cross.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/install.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/no-bash.patch create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/volatiles.99_autofs create mode 100644 meta-openvuplus/recipes-connectivity/autofs/autofs_4.1.4.bb create mode 100644 meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.3/defconfig create mode 100644 meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.3/init create mode 100644 meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.inc create mode 100644 meta-openvuplus/recipes-connectivity/hostap/hostap-daemon_0.7.3.bb create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/configure-targets.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/ca.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/config-hurd.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/debian-targets.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/engines-path.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/kfreebsd-pipe.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/make-targets.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/man-dir.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/man-section.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/no-rpath.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/no-symbolic.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/perl-path.diff create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/pic.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/pkg-config.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rc4-amd64.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rehash-crt.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rehash_pod.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/series create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/shared-lib-ext.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/stddef.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/version-script.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/parallel-make-fix.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/shared-libs.patch create mode 100644 meta-openvuplus/recipes-connectivity/openssl/openssl_0.9.8x.bb create mode 100644 meta-openvuplus/recipes-connectivity/ppp/ppp_2.4.5.bbappend create mode 100644 meta-openvuplus/recipes-connectivity/ralink/rt3070-2.5.0.3/config.patch create mode 100644 meta-openvuplus/recipes-connectivity/ralink/rt3070-2.5.0.3/makefile.patch create mode 100644 meta-openvuplus/recipes-connectivity/ralink/rt3070_2.5.0.3.bb create mode 100644 meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/linux_3.1.patch create mode 100755 meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/makefile.patch create mode 100644 meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/rtl8192_8188CU_linux_v3.1.2590.20110922.tar.gz create mode 100644 meta-openvuplus/recipes-connectivity/realtek/r8192cu_3.1.2590.20110922.bb create mode 100644 meta-openvuplus/recipes-connectivity/realtek/r8712u/config create mode 100644 meta-openvuplus/recipes-connectivity/realtek/r8712u/strcasecmp.patch create mode 100644 meta-openvuplus/recipes-connectivity/realtek/r8712u_2.6.6.0.20101111.bb create mode 100644 meta-openvuplus/recipes-connectivity/rt2870sta/files/RT2870STA.dat create mode 100644 meta-openvuplus/recipes-connectivity/rt2870sta/rt2870sta_1.0.0.bb create mode 100644 meta-openvuplus/recipes-connectivity/rt73-firmware/rt73-firmware_1.8.bb create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/configure.patch create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/kernel-oplocks.patch create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba/01samba-kill create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba/01samba-start create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba/config-lfs.patch create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba/init create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba/quota.patch create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba/smb.conf create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba/tdb.pc create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba/volatiles.03_samba create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba_3.0.37.bb create mode 100644 meta-openvuplus/recipes-connectivity/samba/samba_3.0.37.bbappend create mode 100644 meta-openvuplus/recipes-connectivity/tasks/task-vuplus-wlan.bb create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/01-builddefs.patch create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/02-config.patch create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/03-db-doc.patch create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/04-link-local.patch create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/05-whitespaces.patch create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/06-greedy.patch create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/07-utf8.patch create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/08-manpage.patch create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/09-s390.patch create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/10-remote-dos.patch create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.conf create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.socket create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.xinetd.in create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd@.service create mode 100644 meta-openvuplus/recipes-connectivity/vsftpd/vsftpd_2.3.5.bb create mode 100644 meta-openvuplus/recipes-connectivity/wlan-rt73/files/changeiface.patch create mode 100644 meta-openvuplus/recipes-connectivity/wlan-rt73/files/make.patch create mode 100644 meta-openvuplus/recipes-connectivity/wlan-rt73/wlan-rt73.bb create mode 100644 meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/action_wpa.sh create mode 100644 meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/functions.sh create mode 100644 meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/ifupdown.sh create mode 100644 meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/wpa_action create mode 100644 meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/wpa_action.8 create mode 100644 meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant_0.7.3.bbappend create mode 100644 meta-openvuplus/recipes-connectivity/zd1211/zd1211-firmware_1.4.bb create mode 100644 meta-openvuplus/recipes-connectivity/zd1211/zd1211b/cross_compile.patch create mode 100644 meta-openvuplus/recipes-connectivity/zd1211/zd1211b/zdiface.patch create mode 100644 meta-openvuplus/recipes-connectivity/zd1211/zd1211b_2.22.0.0.bb create mode 100644 meta-openvuplus/recipes-connectivity/zeroconf/zeroconf_0.9.bbappend create mode 100644 meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch create mode 100644 meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch create mode 100644 meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch create mode 100644 meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch create mode 100644 meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2_1.2.5.bb create mode 100644 meta-openvuplus/recipes-devtools/mtd/mtd-utils-1.4.9/disable-ubi.patch create mode 100644 meta-openvuplus/recipes-devtools/mtd/mtd-utils_1.4.9.bbappend create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg-collateral.bbappend create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg-collateral/dest create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch create mode 100644 meta-openvuplus/recipes-devtools/opkg/opkg_svn.bbappend create mode 100644 meta-openvuplus/recipes-devtools/python/python-coherence_git.bb create mode 100644 meta-openvuplus/recipes-devtools/python/python-daap/python-daap.patch create mode 100644 meta-openvuplus/recipes-devtools/python/python-daap_0.7.1.bb create mode 100644 meta-openvuplus/recipes-devtools/python/python-daap_0.7.1.bbappend create mode 100644 meta-openvuplus/recipes-devtools/python/python-flickrapi_1.4.2.bb create mode 100644 meta-openvuplus/recipes-devtools/python/python-gdata_2.0.14.bb create mode 100644 meta-openvuplus/recipes-devtools/python/python-mutagen/patch.diff create mode 100644 meta-openvuplus/recipes-devtools/python/python-mutagen_1.18.bb create mode 100644 meta-openvuplus/recipes-devtools/python/python-native_2.7.2.bbappend create mode 100644 meta-openvuplus/recipes-devtools/python/python-pycrypto/no-usr-include.patch create mode 100644 meta-openvuplus/recipes-devtools/python/python-pycrypto_2.5.bb create mode 100644 meta-openvuplus/recipes-devtools/python/python-transmissionrpc_hg.bb create mode 100644 meta-openvuplus/recipes-devtools/python/python-twisted_12.0.0.bb create mode 100644 meta-openvuplus/recipes-devtools/python/python-wifi_0.5.0.bb create mode 100644 meta-openvuplus/recipes-devtools/python/python/ctypes-error-handling-fix.patch create mode 100644 meta-openvuplus/recipes-devtools/python/python/fix_pthread_site.patch create mode 100644 meta-openvuplus/recipes-devtools/python/python/no-ldconfig.patch create mode 100644 meta-openvuplus/recipes-devtools/python/python/some_configure_fixes.patch create mode 100644 meta-openvuplus/recipes-devtools/python/python_2.7.2.bbappend create mode 100644 meta-openvuplus/recipes-devtools/swig/swig_2.0.4.bb delete mode 100644 meta-openvuplus/recipes-enigma2/aio-grab/aio-grab/aio-grab_vuplus.patch delete mode 100644 meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bb delete mode 100644 meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bbappend delete mode 100644 meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/Makefile.in.patch delete mode 100644 meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/cdparanoia-III-10.2-privatefix.patch delete mode 100644 meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/configure.in.patch delete mode 100644 meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/fixes10.patch delete mode 100644 meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/interface_Makefile.in.patch delete mode 100644 meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/paranoia_Makefile.in.patch delete mode 100644 meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia_svn.bb delete mode 100644 meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes.bb delete mode 100644 meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes_1.1.bb delete mode 100644 meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns delete mode 100644 meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns-remove delete mode 100644 meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dial.modem delete mode 100644 meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/disconnect.modem delete mode 100644 meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dm800/options delete mode 100644 meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/options delete mode 100644 meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/pap-secrets delete mode 100644 meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts_0.1.bb delete mode 100644 meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-tip.diff delete mode 100644 meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-trunk.diff delete mode 100644 meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps_1.1.1.bb delete mode 100644 meta-openvuplus/recipes-enigma2/dvbtools/dvbstream_cvs.bb delete mode 100644 meta-openvuplus/recipes-enigma2/dvbtools/dvbtune_cvs.bb delete mode 100644 meta-openvuplus/recipes-enigma2/dvbtools/wscan_20101204.bb delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices.bb delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.130 delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.192 delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.282 delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat130.info delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat192.info delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat282.info delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins.bb delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxweb.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxwebtv.png delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_20110810.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_ac3lipsync_dolby.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_autoresolution_fix.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_dependency.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_entry_vuplus.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_tpm.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_vuplus.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_webinterface_tpm.patch delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/favicon.ico delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2-skins.bb delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy.bb delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy.socket delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy.xinetd.in delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy@.service delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2.bb delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowdown.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowleft.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowright.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowup.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_b.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_bl.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_br.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_l.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_r.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_t.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tl.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_ber.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_snr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_list.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_main.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_600.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_650.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_epg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_eventinfo.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_info.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_300.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_350.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_a.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_c.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_multiepg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bottombar.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_130x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_170x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x27px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_250x32px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_290x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x32px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_380x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_400x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_440x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_450x32px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_480x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_500x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x27px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_550x27px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_560x23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Thumbs.db delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/blue.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/blue_pressed.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_red.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_red_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_yellow.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_yellow_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green-big.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_0.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_1.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_2.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_3.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_4.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_5.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_6.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_7.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_8.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_9.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_blue.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_green.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_info.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_menu.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_red.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_text.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_yellow.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red-big.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_left_arrow.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_right_arrow.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_23p.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_23px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39p.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_43p.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48p.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72p.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72px.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/yellow.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/Thumbs.db delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ad.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ae.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/cz.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/de.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/dk.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/en.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/es.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fi.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/gr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hu.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/is.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/it.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/lt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/missing.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/nl.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/no.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pl.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ro.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ru.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/se.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/si.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/tr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-h.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-v.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_more.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_next.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_now.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expandable-plugins.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expanded-plugins.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/Thumbs.db delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/clock.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish_scan.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dmm_logo.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_add.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_post.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_pre.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_prepost.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/folder.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_forward.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_pause.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_play.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_rewind.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_stop.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_radio.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_tv.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_epg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_event.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_mainmenu.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_media.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_note.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_recorded.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_timerlist.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_x.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_view.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_1.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_X.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_error.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_info.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_question.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_error.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_on.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/marker.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/mp_buttons.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/plugin.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_logo.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page1.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page2.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page3.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page4.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/record.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/redx.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/repeat_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/repeat_on.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-c.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-s.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-t.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/selectioncross.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg_mp.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mediaplayer_bg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/Thumbs.db delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/dvd_player.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/information.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/media_player.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/plugins.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/scart.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/setup.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/shutdown.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/subtitles.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/timer.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mute.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/nim_active.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/no_coverArt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/output.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/pal.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/picon_default.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_arrow.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer_580.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/prev.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_bg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_big.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_medium.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_recording.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_small.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/rc.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/rcold.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws_mp.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/scroll.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/singlelineList_selected_23p.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/sleeptimer.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/Thumbs.db delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait1.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait2.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait3.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait4.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline-now.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/unhandled-key.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/verticalline-plugins.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_backspace.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_bg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_clr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_esc.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_icon.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_left.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_ok.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_right.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_sel.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift_sel.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_space.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_text.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume_box.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/wizard.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Regular.otf delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Semibold.otf delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-SemiboldIt.otf delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_list.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_view.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_List.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media_info.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Subtitle.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_divideline.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Solo_Menu_bg520.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Statusbar_white.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowdown.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowleft.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowright.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowup.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_b.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_bl.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_br.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_l.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_r.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_t.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tl.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_ber.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_snr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_eventinfo.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_info.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_menu.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H36.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H42.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H45.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/blue.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_bluekey.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/green.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_0.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_1.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_2.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_3.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_4.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_5.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_6.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_7.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_8.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_9.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_text.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/red.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/yellow.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ad.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ae.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/cz.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/de.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/dk.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ee.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/en.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/es.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/fi.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/fr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/gr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hu.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/is.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/it.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lv.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/missing.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/nl.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/no.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pl.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ro.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ru.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/se.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/si.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/sk.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/tr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ua.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/x-fy.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/yu.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-h.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-v.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_more.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_next.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_now.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_gray.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_purple.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/clock.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish_scan.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Chlist_title.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Radio_title.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_folder.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_noreplay.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_player.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_replay.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_event.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_rec.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_rec_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_view.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icons_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_error.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_info.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_question.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_error.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_off.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_on.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_buttons.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_wb_buttons.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/plugin.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/rass_logo.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/record.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/redx.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-c.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-s.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-t.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/info-bg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_EPG_title.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_Plugin_All_title.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Info.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Media.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Plugin.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Setup.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Standby.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Subtitles.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Timer.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Info.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_MENU.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Media.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Plugin.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Pluginall.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Setup.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Standby.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Subtitles.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Timer.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_media-info.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mp_wb_background.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mute.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/no_coverArt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/position_arrow.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/prev.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_bg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_big.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_medium.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_small.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc_wb_desc.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rcold.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/sleeptimer.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline-now.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/unhandled-key.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_backspace.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_bg.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_clr.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_esc.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_icon.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_left.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_ok.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_right.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_sel.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift_sel.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_space.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_text.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_background.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_up.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/wizard.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/analog.ttf delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_addlibpythondeps.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_subtitle.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_unpause.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_misc.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_networksetup.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_remove_dreambox_enigma.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_skin.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_textvfd.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd.patch delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd_mode.patch delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_0.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_1.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_2.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_3.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_4.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_5.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_6.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_7.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_8.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_9.png delete mode 100644 meta-openvuplus/recipes-enigma2/enigma2/enigma2/skin_user.xml delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_crypt.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_dolby.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_format.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_rec.png delete mode 100755 meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_txt.png delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugin-dvbmediasink_0.10.bb delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0001-mpegtsdemux-fix-bd-streamtype-detection.diff.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0002-add-indexing-capabilities-to-generate-a-SPN-PTS-map-.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0003-mpegpsdemux_speedup.diff.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/orc.m4-fix-location-of-orcc-when-cross-compiling.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad_0.10.23.bbappend delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base-0.10.36/orc.m4-fix-location-of-orcc-when-cross-compiling.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base_0.10.36.bbappend delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/audioparser-raise-ranks.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/orc.m4-fix-location-of-orcc-when-cross-compiling.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good_0.10.31.bbappend delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/dvdsubdec-addproperty-singlebuffer.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-1.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-2.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/orc.m4-fix-location-of-orcc-when-cross-compiling.patch delete mode 100644 meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly_0.10.19.bbappend delete mode 100644 meta-openvuplus/recipes-enigma2/libav/libav_0.7.4.bbappend delete mode 100644 meta-openvuplus/recipes-enigma2/libdreamdvd/libdreamdvd_0.9.bb delete mode 100644 meta-openvuplus/recipes-enigma2/libdvbsi++/libdvbsi++_0.3.6.bb delete mode 100644 meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav/0001-dvdnavmini.pc-link-against-libdvdnavmini.patch delete mode 100644 meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav_svn.bb delete mode 100644 meta-openvuplus/recipes-enigma2/libdvdread/libdvdread_svn.bb delete mode 100644 meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch delete mode 100644 meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch delete mode 100644 meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch delete mode 100644 meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch delete mode 100644 meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2_1.2.5.bb delete mode 100644 meta-openvuplus/recipes-enigma2/libungif/libungif-native_4.1.3.bb delete mode 100644 meta-openvuplus/recipes-enigma2/libungif/libungif_4.1.3.bb delete mode 100644 meta-openvuplus/recipes-enigma2/libxmlccwrap/files/disable_libxslt.patch delete mode 100644 meta-openvuplus/recipes-enigma2/libxmlccwrap/files/dont_build_unneeded.patch delete mode 100644 meta-openvuplus/recipes-enigma2/libxmlccwrap/files/fix_assignment_operator.patch delete mode 100644 meta-openvuplus/recipes-enigma2/libxmlccwrap/libxmlccwrap_0.0.12.bb delete mode 100644 meta-openvuplus/recipes-enigma2/opencore-amr/opencore-amr_0.1.3.bb delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/configure-targets.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/ca.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/config-hurd.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/debian-targets.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/engines-path.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/kfreebsd-pipe.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/make-targets.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/man-dir.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/man-section.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/no-rpath.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/no-symbolic.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/perl-path.diff delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/pic.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/pkg-config.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rc4-amd64.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rehash-crt.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rehash_pod.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/series delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/shared-lib-ext.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/stddef.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/version-script.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/parallel-make-fix.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/shared-libs.patch delete mode 100644 meta-openvuplus/recipes-enigma2/openssl/openssl_0.9.8x.bb delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-coherence_git.bb delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-daap/python-daap.patch delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bb delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bbappend delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-flickrapi_1.4.2.bb delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-gdata_2.0.14.bb delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-mutagen/patch.diff delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-mutagen_1.18.bb delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-native_2.7.2.bbappend delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-pycrypto/no-usr-include.patch delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-pycrypto_2.5.bb delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-transmissionrpc_hg.bb delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-twisted_12.0.0.bb delete mode 100644 meta-openvuplus/recipes-enigma2/python/python-wifi_0.5.0.bb delete mode 100644 meta-openvuplus/recipes-enigma2/python/python/ctypes-error-handling-fix.patch delete mode 100644 meta-openvuplus/recipes-enigma2/python/python/fix_pthread_site.patch delete mode 100644 meta-openvuplus/recipes-enigma2/python/python/no-ldconfig.patch delete mode 100644 meta-openvuplus/recipes-enigma2/python/python/some_configure_fixes.patch delete mode 100644 meta-openvuplus/recipes-enigma2/python/python_2.7.2.bbappend delete mode 100644 meta-openvuplus/recipes-enigma2/showiframe/showiframe_1.8.bb delete mode 100644 meta-openvuplus/recipes-enigma2/sqlite/sqlite3_3.7.10.bbappend delete mode 100644 meta-openvuplus/recipes-enigma2/streamripper/streamripper_1.64.6.bb delete mode 100644 meta-openvuplus/recipes-enigma2/swig/swig_2.0.4.bb delete mode 100644 meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.bb delete mode 100644 meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.inc delete mode 100644 meta-openvuplus/recipes-enigma2/timezones/files/GPL-1.0 delete mode 100644 meta-openvuplus/recipes-enigma2/timezones/files/zoneinfo.tar.bz2 delete mode 100644 meta-openvuplus/recipes-enigma2/timezones/timezones-alternative.bb create mode 100644 meta-openvuplus/recipes-extended/hddtemp/hddtemp/hddtemp-no-nls-support.patch create mode 100644 meta-openvuplus/recipes-extended/hddtemp/hddtemp_0.3-beta15.bb create mode 100644 meta-openvuplus/recipes-extended/joe/joe_3.7.bb create mode 100644 meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-extfs-dir.patch create mode 100644 meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-hints.patch create mode 100644 meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-sfs-ini.patch create mode 100644 meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-syntax-file.patch create mode 100644 meta-openvuplus/recipes-extended/mc/mc_4.8.1.bbappend create mode 100644 meta-openvuplus/recipes-extended/ncdu/ncdu_1.8.bb create mode 100644 meta-openvuplus/recipes-extended/shadow/shadow-securetty/securetty create mode 100644 meta-openvuplus/recipes-extended/shadow/shadow-securetty_4.1.4.3.bbappend create mode 100644 meta-openvuplus/recipes-extended/smartmontools/smartmontools.inc create mode 100644 meta-openvuplus/recipes-extended/smartmontools/smartmontools_5.42.bb create mode 100644 meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/Makefile.in.patch create mode 100644 meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/cdparanoia-III-10.2-privatefix.patch create mode 100644 meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/configure.in.patch create mode 100644 meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/fixes10.patch create mode 100644 meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/interface_Makefile.in.patch create mode 100644 meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/paranoia_Makefile.in.patch create mode 100644 meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia_svn.bb create mode 100644 meta-openvuplus/recipes-multimedia/dvbtools/dvb-apps-1.1.1/update-to-tip.diff create mode 100644 meta-openvuplus/recipes-multimedia/dvbtools/dvb-apps-1.1.1/update-to-trunk.diff create mode 100644 meta-openvuplus/recipes-multimedia/dvbtools/dvb-apps_1.1.1.bb create mode 100644 meta-openvuplus/recipes-multimedia/dvbtools/dvbstream_cvs.bb create mode 100644 meta-openvuplus/recipes-multimedia/dvbtools/dvbtune_cvs.bb create mode 100644 meta-openvuplus/recipes-multimedia/dvbtools/wscan_20101204.bb create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugin-dvbmediasink_0.10.bb create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-bad-0.10.23/0001-mpegtsdemux-fix-bd-streamtype-detection.diff.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-bad-0.10.23/0002-add-indexing-capabilities-to-generate-a-SPN-PTS-map-.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-bad-0.10.23/0003-mpegpsdemux_speedup.diff.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-bad-0.10.23/orc.m4-fix-location-of-orcc-when-cross-compiling.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-bad_0.10.23.bbappend create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-base-0.10.36/orc.m4-fix-location-of-orcc-when-cross-compiling.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-base_0.10.36.bbappend create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-good-0.10.31/audioparser-raise-ranks.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-good-0.10.31/orc.m4-fix-location-of-orcc-when-cross-compiling.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-good_0.10.31.bbappend create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-ugly-0.10.19/dvdsubdec-addproperty-singlebuffer.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-1.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-2.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-ugly-0.10.19/orc.m4-fix-location-of-orcc-when-cross-compiling.patch create mode 100644 meta-openvuplus/recipes-multimedia/gstreamer/gst-plugins-ugly_0.10.19.bbappend create mode 100644 meta-openvuplus/recipes-multimedia/libav/libav_0.7.4.bbappend create mode 100644 meta-openvuplus/recipes-multimedia/libdreamdvd/libdreamdvd_0.9.bb create mode 100644 meta-openvuplus/recipes-multimedia/libdvbsi++/libdvbsi++_0.3.6.bb create mode 100644 meta-openvuplus/recipes-multimedia/libdvdnav/libdvdnav/0001-dvdnavmini.pc-link-against-libdvdnavmini.patch create mode 100644 meta-openvuplus/recipes-multimedia/libdvdnav/libdvdnav_svn.bb create mode 100644 meta-openvuplus/recipes-multimedia/libdvdread/libdvdread_svn.bb create mode 100644 meta-openvuplus/recipes-multimedia/opencore-amr/opencore-amr_0.1.3.bb create mode 100644 meta-openvuplus/recipes-multimedia/streamripper/streamripper_1.64.6.bb create mode 100644 meta-openvuplus/recipes-support/libxmlccwrap/files/disable_libxslt.patch create mode 100644 meta-openvuplus/recipes-support/libxmlccwrap/files/dont_build_unneeded.patch create mode 100644 meta-openvuplus/recipes-support/libxmlccwrap/files/fix_assignment_operator.patch create mode 100644 meta-openvuplus/recipes-support/libxmlccwrap/libxmlccwrap_0.0.12.bb create mode 100644 meta-openvuplus/recipes-support/sqlite/sqlite3_3.7.10.bbappend create mode 100644 meta-openvuplus/recipes-vuplus/aio-grab/aio-grab/aio-grab_vuplus.patch create mode 100644 meta-openvuplus/recipes-vuplus/aio-grab/aio-grab_0.8.bb create mode 100644 meta-openvuplus/recipes-vuplus/aio-grab/aio-grab_0.8.bbappend create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-dvbincludes/dreambox-dvbincludes.bb create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-dvbincludes/dreambox-dvbincludes_1.1.bb create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-keymaps/dreambox-keymaps.bb create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-keymaps/dreambox-keymaps/GPL-1.0 create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-keymaps/dreambox-keymaps/dream-de.info create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-keymaps/dreambox-keymaps/dream-de.kmap create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-keymaps/dreambox-keymaps/eng.info create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-keymaps/dreambox-keymaps/eng.kmap create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns-remove create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dial.modem create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/disconnect.modem create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dm800/options create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/options create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/pap-secrets create mode 100644 meta-openvuplus/recipes-vuplus/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts_0.1.bb create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2-defaultservices.bb create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-defaultservices/lamedb.130 create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2-defaultservices/lamedb.192 create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-defaultservices/lamedb.282 create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-defaultservices/sat130.info create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-defaultservices/sat192.info create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-defaultservices/sat282.info create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins.bb create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/dreamboxweb.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/dreamboxwebtv.png create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/enigma2_plugins_20110810.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/enigma2_plugins_ac3lipsync_dolby.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/enigma2_plugins_autoresolution_fix.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/enigma2_plugins_dependency.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_entry_vuplus.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_tpm.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_vuplus.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/enigma2_plugins_webinterface_tpm.patch create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2-plugins/vuplus/favicon.ico create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2-skins.bb create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-streamproxy.bb create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-streamproxy/streamproxy.socket create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-streamproxy/streamproxy.xinetd.in create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2-streamproxy/streamproxy@.service create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2.bb create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/arrowdown.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/arrowleft.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/arrowright.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/arrowup.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/b_b.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/b_bl.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/b_br.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/b_l.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/b_r.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/b_t.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/b_tl.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/b_tr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/bar_ber.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/bar_snr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/bg_list.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/bg_main.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/bg_setup_600.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/bg_setup_650.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/border_epg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/border_eventinfo.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/border_info.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/border_menu.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/border_menu_300.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/border_menu_350.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/border_menu_a.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/border_menu_c.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/border_multiepg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/bottombar.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_130x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_170x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_230x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_230x27px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_250x32px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_290x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_360x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_360x32px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_380x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_400x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_440x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_450x32px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_480x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_500x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_520x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_520x27px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_550x27px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Selected_bar_560x23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/Thumbs.db create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/blue.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/blue_pressed.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/button_blue.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/button_blue_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/button_green.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/button_green_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/button_red.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/button_red_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/button_yellow.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/button_yellow_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/green-big.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/green.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_0.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_1.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_2.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_3.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_4.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_5.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_6.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_7.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_8.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_9.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_blue.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_green.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_info.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_menu.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_red.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_text.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/key_yellow.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/red-big.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/red.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_left_arrow.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_right_arrow.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_selected_23p.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_selected_23px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_selected_39p.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_selected_39px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_selected_43p.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_selected_48p.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_selected_48px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_selected_72p.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/singlelineList_selected_72px.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/buttons/yellow.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/Thumbs.db create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/ad.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/ae.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/cz.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/de.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/dk.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/en.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/es.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/fi.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/fr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/gr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/hr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/hu.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/is.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/it.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/lt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/missing.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/nl.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/no.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/pl.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/pt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/ro.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/ru.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/se.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/si.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/countries/tr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/div-h.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/div-v.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/epg_more.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/epg_next.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/epg_now.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/expandable-plugins.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/expanded-plugins.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/Thumbs.db create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/clock.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/dish.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/dish_scan.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/dmm_logo.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/epgclock.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/epgclock_add.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/epgclock_post.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/epgclock_pre.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/epgclock_prepost.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/folder.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/ico_mp_forward.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/ico_mp_pause.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/ico_mp_play.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/ico_mp_rewind.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/ico_mp_stop.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_channelselection_radio.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_channelselection_tv.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_crypt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_crypt_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_dolby.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_dolby_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_epg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_event.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_format.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_format_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_mainmenu.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_media.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_note.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_rec.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_rec_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_recorded.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_timerlist.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_txt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_txt_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_txt_x.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icon_view.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icons_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icons_off_1.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/icons_off_X.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/input_error.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/input_info.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/input_question.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/lock.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/lock_error.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/lock_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/lock_on.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/marker.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/mp_buttons.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/plugin.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/rass_logo.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/rass_page1.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/rass_page2.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/rass_page3.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/rass_page4.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/record.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/redx.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/repeat_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/repeat_on.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/scan-c.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/scan-s.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/scan-t.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/icons/selectioncross.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/info-bg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/info-bg_mp.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/mediaplayer_bg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/menu/Thumbs.db create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/menu/dvd_player.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/menu/information.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/menu/media_player.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/menu/plugins.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/menu/scart.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/menu/setup.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/menu/shutdown.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/menu/subtitles.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/menu/timer.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/mute.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/nim_active.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/no_coverArt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/output.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/pal.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/picon_default.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/position_arrow.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/position_pointer.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/position_pointer_580.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/prev.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/progress_bg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/progress_big.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/progress_medium.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/progress_recording.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/progress_small.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/rc.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/rcold.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/screws.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/screws_mp.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/scroll.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/singlelineList_selected_23p.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/sleeptimer.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/spinner/Thumbs.db create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/spinner/wait1.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/spinner/wait2.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/spinner/wait3.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/spinner/wait4.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/timeline-now.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/timeline.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/unhandled-key.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/verticalline-plugins.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_backspace.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_bg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_clr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_esc.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_icon.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_left.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_ok.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_right.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_sel.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_shift.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_shift_sel.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_space.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/vkey_text.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/volume.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/volume_box.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/750S/wizard.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/MyriadPro-Regular.otf create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/MyriadPro-Semibold.otf create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/MyriadPro-SemiboldIt.otf create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/Bg_EPG_list.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/Bg_EPG_view.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/Bg_List.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/Bg_Media.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/Bg_Media_info.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/Bg_Subtitle.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/Bg_divideline.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/Solo_Menu_bg520.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/Statusbar_white.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/arrowdown.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/arrowleft.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/arrowright.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/arrowup.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/b_b.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/b_bl.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/b_br.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/b_l.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/b_r.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/b_t.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/b_tl.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/b_tr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/bar_ber.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/bar_snr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/bg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/border_eventinfo.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/border_info.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/border_menu.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/FocusBar_H36.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/FocusBar_H42.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/FocusBar_H45.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/blue.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/button_bluekey.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/button_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/green.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_0.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_1.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_2.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_3.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_4.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_5.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_6.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_7.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_8.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_9.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/key_text.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/red.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/buttons/yellow.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/ad.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/ae.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/cz.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/de.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/dk.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/ee.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/en.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/es.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/fi.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/fr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/gr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/hr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/hu.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/is.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/it.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/lt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/lv.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/missing.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/nl.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/no.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/pl.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/pt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/ro.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/ru.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/se.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/si.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/sk.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/tr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/ua.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/x-fy.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/countries/yu.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/div-h.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/div-v.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/epg_more.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/epg_next.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/epg_now.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_gray.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_purple.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/clock.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/dish.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/dish_scan.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/ico_Chlist_title.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/ico_Radio_title.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/ico_folder.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/ico_noreplay.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/ico_player.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/ico_replay.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_crypt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_crypt_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_dolby.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_dolby_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_event.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_format.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_format_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_rec.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_rec_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_txt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_txt_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icon_view.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/icons_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/input_error.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/input_info.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/input_question.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/lock.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/lock_error.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/lock_off.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/lock_on.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/mp_buttons.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/mp_wb_buttons.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/plugin.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/rass_logo.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/record.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/redx.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/scan-c.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/scan-s.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/icons/scan-t.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/info-bg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_EPG_title.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_Plugin_All_title.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_menu_Info.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_menu_Media.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_menu_Plugin.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_menu_Setup.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_menu_Standby.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_menu_Subtitles.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_menu_Timer.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_title_Info.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_title_MENU.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_title_Media.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_title_Plugin.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_title_Pluginall.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_title_Setup.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_title_Standby.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_title_Subtitles.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_title_Timer.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/menu/ico_title_media-info.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/mp_wb_background.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/mute.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/no_coverArt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/position_arrow.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/prev.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/progress_bg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/progress_big.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/progress_medium.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/progress_small.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/rc.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/rc_wb_desc.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/rcold.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/sleeptimer.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/timeline-now.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/timeline.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/unhandled-key.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_backspace.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_bg.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_clr.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_esc.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_icon.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_left.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_ok.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_right.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_sel.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_shift.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_shift_sel.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_space.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/vkey_text.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/volume_background.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/volume_up.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/Vu_HD/wizard.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/analog.ttf create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_addlibpythondeps.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_mediaplayer.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_mediaplayer_subtitle.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_mediaplayer_unpause.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_misc.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_networksetup.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_remove_dreambox_enigma.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_skin.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_textvfd.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_vfd.patch create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/enigma2_vuplus_vfd_mode.patch create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/number_key/key_0.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/number_key/key_1.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/number_key/key_2.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/number_key/key_3.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/number_key/key_4.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/number_key/key_5.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/number_key/key_6.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/number_key/key_7.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/number_key/key_8.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/number_key/key_9.png create mode 100644 meta-openvuplus/recipes-vuplus/enigma2/enigma2/skin_user.xml create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/vfd_icons/vfd_icon_crypt.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/vfd_icons/vfd_icon_dolby.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/vfd_icons/vfd_icon_format.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/vfd_icons/vfd_icon_rec.png create mode 100755 meta-openvuplus/recipes-vuplus/enigma2/enigma2/vfd_icons/vfd_icon_txt.png create mode 100644 meta-openvuplus/recipes-vuplus/fakelocale/fakelocale.bb create mode 100644 meta-openvuplus/recipes-vuplus/fakelocale/files/locale.alias create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/files/Marvell-Licence.txt create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-drxd-a2.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-af9005.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-fe-af9013.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-af9015.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-af9035.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-avertv-a800.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-dib0700.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-dibusb.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-digitv.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-ec168.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-nova-t-usb2.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-sms1xxx-hcw-dvbt.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-sms1xxx-nova-dvbt.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-ttusb-budget.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-umt-010.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-wt220u-zl0353.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb-xc5000.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-dvb-usb.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-htc9271.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-rt2561.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-rt3070.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/firmware-rtl8721u.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/linux-firmware.inc create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/marvell-gspi-fw/9.70.3-p37.tar.gz create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/marvell-gspi-fw_9.70.3-p37.bb create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/marvell-sdio-fw/9.70.3-p37.tar.gz create mode 100644 meta-openvuplus/recipes-vuplus/firmwares/marvell-sdio-fw_9.70.3-p37.bb create mode 100644 meta-openvuplus/recipes-vuplus/libungif/libungif-native_4.1.3.bb create mode 100644 meta-openvuplus/recipes-vuplus/libungif/libungif_4.1.3.bb create mode 100644 meta-openvuplus/recipes-vuplus/showiframe/showiframe_1.8.bb create mode 100644 meta-openvuplus/recipes-vuplus/tasks/task-vuplus-enigma2.bb create mode 100644 meta-openvuplus/recipes-vuplus/tasks/task-vuplus-enigma2.inc create mode 100644 meta-openvuplus/recipes-vuplus/timezones/files/GPL-1.0 create mode 100644 meta-openvuplus/recipes-vuplus/timezones/files/zoneinfo.tar.bz2 create mode 100644 meta-openvuplus/recipes-vuplus/timezones/timezones-alternative.bb create mode 100644 meta-openvuplus/recipes-vuplus/tuxbox/tuxbox-common_0.1.bb create mode 100644 meta-openvuplus/recipes-vuplus/tuxcom/tuxbox-tuxcom-32bpp.bb create mode 100644 meta-openvuplus/recipes-vuplus/tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxcom/tuxbox-tuxcom-32bpp/add_font.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxcom/tuxbox-tuxcom-32bpp/fix_smstext.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxcom/tuxbox-tuxcom-32bpp/largefile.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxcom/tuxbox-tuxcom-32bpp/makefiles.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxcom/tuxbox-tuxcom-32bpp/support_newer_freetype.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-libtuxtxt.bb create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-libtuxtxt/32bpp.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-libtuxtxt/acinclude.m4 create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-libtuxtxt/allow_different_demux.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-libtuxtxt/libz.patch create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-libtuxtxt/resize_framebuffer.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-libtuxtxt/videodev2.patch create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-tuxtxt-32bpp.bb create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-tuxtxt-32bpp/add_advanced_rc.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-tuxtxt-32bpp/add_new_default_conf.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-tuxtxt-32bpp/allow_different_demux.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py create mode 100644 meta-openvuplus/recipes-vuplus/tuxtxt/tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch create mode 100644 meta-openvuplus/recipes-vuplus/usbtunerhelper/usbtunerhelper.bb create mode 100644 meta-openvuplus/recipes-vuplus/usbtunerhelper/usbtunerhelper/GPL-2.0 create mode 100644 meta-openvuplus/recipes-vuplus/usbtunerhelper/usbtunerhelper/usbtunerhelper.sh create mode 100644 meta-openvuplus/recipes-vuplus/vuplus-compat/vuplus-compat_1.0.bb create mode 100644 meta-openvuplus/recipes-vuplus/vuplus-vucamd/vuplus-vucamd.bb create mode 100644 meta-openvuplus/recipes-vuplus/vuplus-vucamd/vuplus-vucamd/Proprietary create mode 100755 meta-openvuplus/recipes-vuplus/vuplus-vucamd/vuplus-vucamd/vucamd create mode 100644 meta-openvuplus/recipes-vuplus/vuplus-vucamd/vuplus-vucamd/vucamd.sh delete mode 100644 meta-openvuplus/recipes-wlan/hostap/hostap-daemon-0.7.3/defconfig delete mode 100644 meta-openvuplus/recipes-wlan/hostap/hostap-daemon-0.7.3/init delete mode 100644 meta-openvuplus/recipes-wlan/hostap/hostap-daemon-0.7.inc delete mode 100644 meta-openvuplus/recipes-wlan/hostap/hostap-daemon_0.7.3.bb delete mode 100644 meta-openvuplus/recipes-wlan/ralink/rt3070-2.5.0.3/config.patch delete mode 100644 meta-openvuplus/recipes-wlan/ralink/rt3070-2.5.0.3/makefile.patch delete mode 100644 meta-openvuplus/recipes-wlan/ralink/rt3070_2.5.0.3.bb delete mode 100644 meta-openvuplus/recipes-wlan/realtek/r8192cu-3.1.2590.20110922/linux_3.1.patch delete mode 100755 meta-openvuplus/recipes-wlan/realtek/r8192cu-3.1.2590.20110922/makefile.patch delete mode 100644 meta-openvuplus/recipes-wlan/realtek/r8192cu-3.1.2590.20110922/rtl8192_8188CU_linux_v3.1.2590.20110922.tar.gz delete mode 100644 meta-openvuplus/recipes-wlan/realtek/r8192cu_3.1.2590.20110922.bb delete mode 100644 meta-openvuplus/recipes-wlan/realtek/r8712u/config delete mode 100644 meta-openvuplus/recipes-wlan/realtek/r8712u/strcasecmp.patch delete mode 100644 meta-openvuplus/recipes-wlan/realtek/r8712u_2.6.6.0.20101111.bb delete mode 100644 meta-openvuplus/recipes-wlan/rt2870sta/files/RT2870STA.dat delete mode 100644 meta-openvuplus/recipes-wlan/rt2870sta/rt2870sta_1.0.0.bb delete mode 100644 meta-openvuplus/recipes-wlan/rt73-firmware/rt73-firmware_1.8.bb delete mode 100644 meta-openvuplus/recipes-wlan/tasks/task-vuplus-wlan.bb delete mode 100644 meta-openvuplus/recipes-wlan/wlan-rt73/files/changeiface.patch delete mode 100644 meta-openvuplus/recipes-wlan/wlan-rt73/files/make.patch delete mode 100644 meta-openvuplus/recipes-wlan/wlan-rt73/wlan-rt73.bb delete mode 100644 meta-openvuplus/recipes-wlan/wpa-supplicant/wpa-supplicant-0.7.3/action_wpa.sh delete mode 100644 meta-openvuplus/recipes-wlan/wpa-supplicant/wpa-supplicant-0.7.3/functions.sh delete mode 100644 meta-openvuplus/recipes-wlan/wpa-supplicant/wpa-supplicant-0.7.3/ifupdown.sh delete mode 100644 meta-openvuplus/recipes-wlan/wpa-supplicant/wpa-supplicant-0.7.3/wpa_action delete mode 100644 meta-openvuplus/recipes-wlan/wpa-supplicant/wpa-supplicant-0.7.3/wpa_action.8 delete mode 100644 meta-openvuplus/recipes-wlan/wpa-supplicant/wpa-supplicant_0.7.3.bbappend delete mode 100644 meta-openvuplus/recipes-wlan/zd1211/zd1211-firmware_1.4.bb delete mode 100644 meta-openvuplus/recipes-wlan/zd1211/zd1211b/cross_compile.patch delete mode 100644 meta-openvuplus/recipes-wlan/zd1211/zd1211b/zdiface.patch delete mode 100644 meta-openvuplus/recipes-wlan/zd1211/zd1211b_2.22.0.0.bb diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps.bb b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps.bb deleted file mode 100644 index 4ab2603..0000000 --- a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps.bb +++ /dev/null @@ -1,18 +0,0 @@ -DESCRIPTION = "Dreambox Keyboard Keymap files" -LICENSE = "GPL" -LIC_FILES_CHKSUM = "file://${THISDIR}/${PN}/GPL-1.0;md5=e9e36a9de734199567a4d769498f743d" -MAINTAINER = "Felix Domke " - -SRC_URI = "file://dream-de.info file://dream-de.kmap file://eng.info file://eng.kmap" - -PR = "r1" - -FILES_${PN} = "/" -PACKAGE_ARCH = "all" - -do_install() { - install -d ${D}/usr/share/keymaps - for x in dream-de.info dream-de.kmap eng.info eng.kmap; do - install -m 0644 ${WORKDIR}/$x ${D}/usr/share/keymaps/$x - done -} diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/GPL-1.0 b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/GPL-1.0 deleted file mode 100644 index 9d4ef93..0000000 --- a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/GPL-1.0 +++ /dev/null @@ -1,252 +0,0 @@ - -GNU General Public License, version 1 - - GNU GENERAL PUBLIC LICENSE - Version 1, February 1989 - - Copyright (C) 1989 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The license agreements of most software companies try to keep users -at the mercy of those companies. By contrast, our General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. The -General Public License applies to the Free Software Foundation`s -software and to any other program whose authors commit to using it. -You can use it for your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Specifically, the General Public License is designed to make -sure that you have the freedom to give away or sell copies of free -software, that you receive source code or can get it if you want it, -that you can change the software or use pieces of it in new free -programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of a such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must tell them their rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author`s protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors` reputations. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any program or other work which -contains a notice placed by the copyright holder saying it may be -distributed under the terms of this General Public License. The -"Program", below, refers to any such program or work, and a "work based -on the Program" means either the Program or any work containing the -Program or a portion of it, either verbatim or with modifications. Each -licensee is addressed as "you". - - 1. You may copy and distribute verbatim copies of the Program`s source -code as you receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice and -disclaimer of warranty; keep intact all the notices that refer to this -General Public License and to the absence of any warranty; and give any -other recipients of the Program a copy of this General Public License -along with the Program. You may charge a fee for the physical act of -transferring a copy. - - 2. You may modify your copy or copies of the Program or any portion of -it, and copy and distribute such modifications under the terms of Paragraph -1 above, provided that you also do the following: - - a) cause the modified files to carry prominent notices stating that - you changed the files and the date of any change; and - - b) cause the whole of any work that you distribute or publish, that - in whole or in part contains the Program or any part thereof, either - with or without modifications, to be licensed at no charge to all - third parties under the terms of this General Public License (except - that you may choose to grant warranty protection to some or all - third parties, at your option). - - c) If the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the simplest and most usual way, to print or display an - announcement including an appropriate copyright notice and a notice - that there is no warranty (or else, saying that you provide a - warranty) and that users may redistribute the program under these - conditions, and telling the user how to view a copy of this General - Public License. - - d) You may charge a fee for the physical act of transferring a - copy, and you may at your option offer warranty protection in - exchange for a fee. - -Mere aggregation of another independent work with the Program (or its -derivative) on a volume of a storage or distribution medium does not bring -the other work under the scope of these terms. - - 3. You may copy and distribute the Program (or a portion or derivative of -it, under Paragraph 2) in object code or executable form under the terms of -Paragraphs 1 and 2 above provided that you also do one of the following: - - a) accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of - Paragraphs 1 and 2 above; or, - - b) accompany it with a written offer, valid for at least three - years, to give any third party free (except for a nominal charge - for the cost of distribution) a complete machine-readable copy of the - corresponding source code, to be distributed under the terms of - Paragraphs 1 and 2 above; or, - - c) accompany it with the information you received as to where the - corresponding source code may be obtained. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form alone.) - -Source code for a work means the preferred form of the work for making -modifications to it. For an executable file, complete source code means -all the source code for all modules it contains; but, as a special -exception, it need not include source code for modules which are standard -libraries that accompany the operating system on which the executable -file runs, or for standard header files or definitions files that -accompany that operating system. - - 4. You may not copy, modify, sublicense, distribute or transfer the -Program except as expressly provided under this General Public License. -Any attempt otherwise to copy, modify, sublicense, distribute or transfer -the Program is void, and will automatically terminate your rights to use -the Program under this License. However, parties who have received -copies, or rights to use copies, from you under this General Public -License will not have their licenses terminated so long as such parties -remain in full compliance. - - 5. By copying, distributing or modifying the Program (or any work based -on the Program) you indicate your acceptance of this license to do so, -and all its terms and conditions. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the original -licensor to copy, distribute or modify the Program subject to these -terms and conditions. You may not impose any further restrictions on the -recipients` exercise of the rights granted herein. - - 7. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of the license which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -the license, you may choose any version ever published by the Free Software -Foundation. - - 8. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to humanity, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is safest to -attach them to the start of each source file to most effectively convey -the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19xx name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w`. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c` for details. - -The hypothetical commands `show w` and `show c` should show the -appropriate parts of the General Public License. Of course, the -commands you use may be called something other than `show w` and `show -c`; they could even be mouse-clicks or menu items--whatever suits your -program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - program `Gnomovision` (a program to direct compilers to make passes - at assemblers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -That`s all there is to it! - diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.info b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.info deleted file mode 100644 index d7f5b07..0000000 --- a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.info +++ /dev/null @@ -1,2 +0,0 @@ -kmap=dream-de.kmap -name=Dreambox Keyboard Deutsch diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.kmap b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.kmap deleted file mode 100644 index 693317a781145b060e19509cb4b353d69b7a58d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2823 zcmd^>*-{%v6o&uPt=9alBLQOHf(@9>;C;6--uHdqV#i?P4P)aKV`Ka-sZ`}QmE{fc z47o~GZt@Jd%0*fui9#Su2)>J^q?w+XbEd!k&-q6qW1~~!!xJKc*)RTo9|N>t6E)tCBO-|HKFtj~2q|3<%&$mp=X();>AAL=80qGS40 z|I$A(7y+F+rSJ5fzSR+ZrsEjEdaR3J(~-q$6X8z0>Q)lsBq@ zHf6;cYb|W0NrssYN=npV?q(|@V>4)t#5k!CrRN1V2 zH8(bY9QfPOf$y;fUFgOJ^r8=Yu@84+{tJ3dkLX3ctT*+Fp3rl8UVq2hnE!xY(!+XG zkLhtesi*X`{-(cTDDd~_4ZW_1^r{}zvw8-5up8gZ;r}6?Ri#u(R;r~&+GJJWw@dI3 z$!cjYC791|w8(E#|BgSG4?p6k!fJfLE!@UOd|ept*GYU=s(-kDro8@fuIVUb%;}GB z^ZMhL+<6B5eSHu(=+8SY?J};?Rk^IIb~Ucn)%jXueAZX{8sFe6e5J4Qjb44)XMC!l z|Fo-j4f%N$e|=MAeBDa)kLMh^Al|nX^A`8Wq5%%os6{jC;8BUH_*$rc2x^c(5)p_L z6zP0ajvq~EghhQgtU#uCKCXX+`frmC>69+%mLBPqK3OaMLI1?(^$!mmkafkG<@fXT zUw-|U=9@qIa{O48umA9buykcM8Z5=XFlxp8GYfMfxCC1B=f51k31yPgKjd9Dze(r( zuiW-|{t#CZRnGs|!cE-FE!@g&+|C``$z9wS`t@giqUQ@va+ELmn(z6BkNKPv;aWd4 zk>N03@jf5$As_Jx$M`h=w9pQnoZ>s)<6DmK8OJ%m^|}7f@#p&A!HI#hF5#R@y2#PR z{_i7CAN=1Zyz{~TeRwT+>kIzRL6>r6{htN@H`UT;s!Vnn{y!7=+u0GA*077++`wM; zaWD7rZp?py*LZ{%d6_qPg(rB9=fl0R|MLJZ@i33_7?1NLPx16De-Cf)IuG$G5ArO} za1VF0;Qu-PQdJ70CF`F<3*++o7x@>y|4Jju=s&Oi`GL21n;%*5f9@}*f5;mAZ*l#@ z3YF-epT&Q#|GfWmx|Ak2S}}jz9|U9nUznd+Hqfz}wQOcx=!Z(q`agv=OfboaWQxi; l{?8^h(z2e06)f?8hW=lq{ulMXV*f8y|MT@X>81Yv`~zCTk&^%b diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.info b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.info deleted file mode 100644 index d73372c..0000000 --- a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.info +++ /dev/null @@ -1,2 +0,0 @@ -kmap=eng.kmap -name=Keyboard English diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.kmap b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.kmap deleted file mode 100644 index 15a722f164e16e74b016786d85e82a94ecdda36f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2823 zcmd^>`F9jW6ov1rn(DqaZ}v5-D4>7>vM&-41qIwt7C{M00$~e*Kp>C=n17wBo{R)= z5;-1zN>^8%Is_7JdpLqExRwIrx~R|ey3XsQ z-q#sy$4-2i!WL4Ck4>7bxe+Tlagsz{gAPw4OZt^T4vV+_ae^$PyLkv&&Q%2JW4)TD0e0d;l$WBvFIdi+Lv{3ie3_~R?*G6YOd}Yt{L<6ypDn QLBIXq@B3#8YyJPc0_5grSpWb4 diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/020_auto_net_path_sortlocale_mountoptions.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/020_auto_net_path_sortlocale_mountoptions.patch deleted file mode 100644 index ed747b3..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/020_auto_net_path_sortlocale_mountoptions.patch +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 020_auto_net_path_sortlocale_mountoptions.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/auto.net .A/samples/auto.net ---- .B/samples/auto.net 2005-04-05 13:02:09.000000000 +0000 -+++ .A/samples/auto.net 2007-01-07 21:36:35.000000000 +0000 -@@ -11,7 +11,7 @@ - - # add "nosymlink" here if you want to suppress symlinking local filesystems - # add "nonstrict" to make it OK for some filesystems to not mount --opts="-fstype=nfs,hard,intr,nodev,nosuid" -+opts="-fstype=nfs,hard,intr,nodev,nosuid,nonstrict,async" - - # Showmount comes in a number of names and varieties. "showmount" is - # typically an older version which accepts the '--no-headers' flag diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/037_let_debian_rules_decide_on_CFLAGS.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/037_let_debian_rules_decide_on_CFLAGS.patch deleted file mode 100644 index d0a129f..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/037_let_debian_rules_decide_on_CFLAGS.patch +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 037_let_debian_rules_decide_on_CFLAGS.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/Makefile.rules .A/Makefile.rules ---- .B/Makefile.rules 2004-01-29 16:01:22.000000000 +0000 -+++ .A/Makefile.rules 2007-01-07 21:36:35.000000000 +0000 -@@ -17,15 +17,15 @@ - # Compilers, linkers and flags - # The STRIP defined here *must not* remove any dynamic-loading symbols - --ifdef DEBUG --CFLAGS = -O2 -g -DDEBUG --LDFLAGS = -g -+#ifdef DEBUG -+#CFLAGS = -O2 -g -DDEBUG -+#LDFLAGS = -g - STRIP = : --else --CFLAGS = -O3 -fomit-frame-pointer -Wall --LDFLAGS = -s --STRIP = strip --strip-debug --endif -+#else -+#CFLAGS = -O3 -fomit-frame-pointer -Wall -+#LDFLAGS = -s -+#STRIP = strip --strip-debug -+#endif - - CC = gcc - CXX = g++ diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/042_default_auto_master_all_commented_out.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/042_default_auto_master_all_commented_out.patch deleted file mode 100644 index e3986cd..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/042_default_auto_master_all_commented_out.patch +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 042_default_auto_master_all_commented_out.dpatch by -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/auto.master .A/samples/auto.master ---- .B/samples/auto.master 2005-01-04 14:36:54.000000000 +0000 -+++ .A/samples/auto.master 2007-01-07 21:36:35.000000000 +0000 -@@ -7,5 +7,5 @@ - # For details of the format look at autofs(5). - #/misc /etc/auto.misc --timeout=60 - #/smb /etc/auto.smb --/misc /etc/auto.misc --/net /etc/auto.net -+#/misc /etc/auto.misc -+#/net /etc/auto.net diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/060_non_replicated_ping.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/060_non_replicated_ping.patch deleted file mode 100644 index c8493da..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/060_non_replicated_ping.patch +++ /dev/null @@ -1,228 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 060_non_replicated_ping.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/modules/mount_nfs.c .A/modules/mount_nfs.c ---- .B/modules/mount_nfs.c 2005-04-05 12:42:42.000000000 +0000 -+++ .A/modules/mount_nfs.c 2007-01-07 21:36:35.000000000 +0000 -@@ -31,6 +31,7 @@ - #include - #include - #include -+#include - - #define MODULE_MOUNT - #include "automount.h" -@@ -105,28 +106,117 @@ - - return 1; - } -+ -+/* -+ * If the entry doesn't contain a ',' or doesn't contain more than -+ * one ':' then @what is not a replicated server entry. -+ */ -+static int inline is_replicated_entry(char *what) -+{ -+ return strchr(what, ',') || -+ (strchr(what, ':') != strrchr(what, ':')); -+} -+ -+/* -+ * Check to see if the 'host:path' or 'host' is on the local machine -+ * Returns < 0 if there is a host lookup problem, otherwise returns 0 -+ * if it's not a local mount, and returns > 0 if it is a local mount. -+ */ -+int is_local_mount(const char *hostpath) -+{ -+ struct hostent *he; -+ char **haddr; -+ char *delim; -+ char *hostname; -+ int hostnamelen; -+ int local = 0; -+ -+ debug(MODPREFIX "is_local_mount: %s", hostpath); -+ delim = strpbrk(hostpath,":"); -+ -+ if (delim) -+ hostnamelen = delim - hostpath; -+ else -+ hostnamelen = strlen(hostpath); -+ -+ hostname = malloc(hostnamelen+1); -+ strncpy(hostname, hostpath, hostnamelen); -+ hostname[hostnamelen] = '\0'; -+ he = gethostbyname(hostname); -+ if (!he) { -+ error(MODPREFIX "host %s: lookup failure", hostname); -+ return -1; -+ } -+ -+ for (haddr = he->h_addr_list; *haddr; haddr++) { -+ local = is_local_addr(hostname, *haddr, he->h_length); -+ if (local < 0) -+ return local; -+ if (local) { -+ debug(MODPREFIX "host %s: is localhost", -+ hostname); -+ return local; -+ } -+ } -+ return 0; -+} -+ - /* - * Given a mount string, return (in the same string) the -- * best mount to use based on weight/locality/rpctime -+ * best mount to use based on locality/weight/rpctime. -+ * -+ * If longtimeout is set to 0 then we only do 100 ms pings to hosts. In -+ * the event that this fails, we call ourself recursively with the -+ * longtimeout option set to 1. In this case we ping for up to 10s and -+ * skip logic for detecting if a localhost has been passed. (if a local -+ * host had been passed, we would have returned that mount as the best -+ * mount. The skipping of local maps in this case is an optimization). -+ * - * - return -1 and what = '\0' on error, - * 1 and what = local mount path if local bind, - * else 0 and what = remote mount path - */ --int get_best_mount(char *what, const char *original, int longtimeout, int skiplocal) -+int get_best_mount(char *what, const char *original, int longtimeout) - { - char *p = what; - char *winner = NULL; - int winner_weight = INT_MAX, local = 0; - double winner_time = 0; -- char *delim; -+ char *delim, *pstrip; - int sec = (longtimeout) ? 10 : 0; - int micros = (longtimeout) ? 0 : 100000; -+ int skiplocal = longtimeout; /* clearly local is not available */ - - if (!p) { - *what = '\0'; - return -1; - } - -+ /* -+ * If only one mountpoint has been passed in, we don't need to -+ * do anything except strip whitespace from the end of the string. -+ */ -+ if (!is_replicated_entry(p)) { -+ for (pstrip = p+strlen(p) - 1; pstrip >= p; pstrip--) -+ if (isspace(*pstrip)) -+ *pstrip = '\0'; -+ -+ /* Check if the host is the localhost */ -+ if (is_local_mount(p) > 0) { -+ debug(MODPREFIX "host %s: is localhost", p); -+ -+ /* Strip off hostname and ':' */ -+ delim = strchr(p,':'); -+ while (delim && *delim != '\0') { -+ delim++; -+ *what = *delim; -+ what++; -+ } -+ return 1; -+ } -+ return 0; -+ } -+ - while (p && *p) { - char *next; - unsigned int ping_stat = 0; -@@ -171,37 +261,17 @@ - /* p points to a server, "next is our next parse point */ - if (!skiplocal) { - /* Check if it's localhost */ -- struct hostent *he; -- char **haddr; -- -- he = gethostbyname(p); -- if (!he) { -- error(MODPREFIX "host %s: lookup failure", p); -- p = next; -- continue; -- } -- -- /* Check each host in round robin list */ -- for (haddr = he->h_addr_list; *haddr; haddr++) { -- local = is_local_addr(p, *haddr, he->h_length); -- -- if (local < 0) -- continue; -- -- if (local) { -- winner = p; -- break; -- } -- } -- -+ local = is_local_mount(p); - if (local < 0) { - local = 0; - p = next; - continue; - } - -- if (local) -+ if (local) { -+ winner = p; - break; -+ } - } - - /* ping each (or the) entry to see if it's alive. */ -@@ -214,6 +284,7 @@ - /* First unweighted or only host is alive so set winner */ - if (!winner) { - winner = p; -+ winner_time = 1; - /* No more to check, return it */ - if (!next || !*next) - break; -@@ -256,7 +327,7 @@ - */ - if (!local && winner_weight == INT_MAX) { - /* We had more than one contender and none responded in time */ -- if (winner_time != 0 && winner_time > 500) { -+ if (winner_time == 0 || winner_time > 500) { - /* We've already tried a longer timeout */ - if (!longtimeout) { - /* Reset string and try again */ -@@ -267,16 +338,14 @@ - "retrying with longer timeout", - original); - -- return get_best_mount(what, original, 1, 1); -+ return get_best_mount(what, original, 1); - } - } - } - -- /* No winner found so bail */ -- if (!winner) { -- *what = '\0'; -- return 0; -- } -+ /* No winner found so return first */ -+ if (!winner) -+ winner = what; - - /* - * We now have our winner, copy it to the front of the string, -@@ -395,7 +464,7 @@ - /* No colon, take this as a bind (local) entry */ - local = 1; - } else if (!nosymlink) { -- local = get_best_mount(whatstr, what, 0, 0); -+ local = get_best_mount(whatstr, what, 0); - if (!*whatstr) { - warn(MODPREFIX "no host elected"); - return 1; diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/061_multi_parse_fix.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/061_multi_parse_fix.patch deleted file mode 100644 index 8b11264..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/061_multi_parse_fix.patch +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 061_multi_parse_fix.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/modules/parse_sun.c .A/modules/parse_sun.c ---- .B/modules/parse_sun.c 2005-04-05 12:42:42.000000000 +0000 -+++ .A/modules/parse_sun.c 2007-01-07 21:36:35.000000000 +0000 -@@ -766,7 +766,16 @@ - { - const char *p = (char *) mapent; - int multi = 0; -- int first_chunk = 0; -+ int not_first_chunk = 0; -+ -+ if (!p) { -+ crit("check_is_multi: unexpected NULL map entry pointer"); -+ return 0; -+ } -+ -+ /* If first character is "/" it's a multi-mount */ -+ if (*p == '/') -+ return 1; - - while (*p) { - p = skipspace(p); -@@ -779,7 +788,7 @@ - * path that begins with '/' indicates a mutil-mount - * entry. - */ -- if (first_chunk) { -+ if (not_first_chunk) { - if (*p == '/' || *p == '-') { - multi = 1; - break; -@@ -796,7 +805,7 @@ - * after which it's a multi mount. - */ - p += chunklen(p, check_colon(p)); -- first_chunk++; -+ not_first_chunk++; - } - - return multi; -@@ -883,7 +892,12 @@ - return 1; - } - -- path = dequote(p, l = chunklen(p, 0)); -+ if (*p != '/') { -+ l = 0; -+ path = dequote("/", 1); -+ } else -+ path = dequote(p, l = chunklen(p, 0)); -+ - if (!path) { - error(MODPREFIX "out of memory"); - free(myoptions); diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/062_fix_memory_leak.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/062_fix_memory_leak.patch deleted file mode 100644 index 1ba0cea..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/062_fix_memory_leak.patch +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 062_fix_memory_leak.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/modules/mount_nfs.c .A/modules/mount_nfs.c ---- .B/modules/mount_nfs.c 2007-01-07 21:36:35.000000000 +0000 -+++ .A/modules/mount_nfs.c 2007-01-07 21:36:35.000000000 +0000 -@@ -145,16 +145,20 @@ - he = gethostbyname(hostname); - if (!he) { - error(MODPREFIX "host %s: lookup failure", hostname); -+ free(hostname); - return -1; - } - - for (haddr = he->h_addr_list; *haddr; haddr++) { - local = is_local_addr(hostname, *haddr, he->h_length); -- if (local < 0) -+ if (local < 0) { -+ free(hostname); - return local; -+ } - if (local) { - debug(MODPREFIX "host %s: is localhost", - hostname); -+ free(hostname); - return local; - } - } diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/063_misc_fixes.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/063_misc_fixes.patch deleted file mode 100644 index fcfc8a2..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/063_misc_fixes.patch +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 063_misc_fixes.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/lib/cache.c .A/lib/cache.c ---- .B/lib/cache.c 2005-02-06 06:00:53.000000000 +0000 -+++ .A/lib/cache.c 2007-01-07 21:36:35.000000000 +0000 -@@ -337,8 +337,10 @@ - if (!path) - return; - -- if (is_mounted(_PATH_MOUNTED, path)) -+ if (is_mounted(_PATH_MOUNTED, path)) { -+ free(path); - continue; -+ } - - if (me->age < age) { - mapent_hash[i] = me->next; -diff -Naur .B/modules/lookup_file.c .A/modules/lookup_file.c ---- .B/modules/lookup_file.c 2005-04-06 15:14:23.000000000 +0000 -+++ .A/modules/lookup_file.c 2007-01-07 21:36:35.000000000 +0000 -@@ -157,6 +157,10 @@ - break; - - case st_compare: -+ if (kptr - key > KEY_MAX_LEN) { -+ state = st_badent; -+ break; -+ } - if (ch == '\n') - state = st_begin; - else if (isspace(ch) && !escape) { -diff -Naur .B/modules/parse_sun.c .A/modules/parse_sun.c ---- .B/modules/parse_sun.c 2007-01-07 21:36:35.000000000 +0000 -+++ .A/modules/parse_sun.c 2007-01-07 21:36:35.000000000 +0000 -@@ -680,6 +680,10 @@ - "mounting root %s, mountpoint %s, what %s, fstype %s, options %s\n", - root, mountpoint, what, fstype, options); - -+ /* A malformed entry of the form key /xyz will trigger this case */ -+ if (!what || *what == '\0') -+ return 1; -+ - if (!strcmp(fstype, "nfs")) { - rv = mount_nfs->mount_mount(root, mountpoint, strlen(mountpoint), - what, fstype, options, mount_nfs->context); -@@ -695,6 +699,18 @@ - return rv; - } - -+static int key_exists(struct multi_mnt *list, char *path, int pathlen) -+{ -+ struct multi_mnt *mmptr = list; -+ -+ while (mmptr && pathlen == strlen(mmptr->path)) { -+ if (!strncmp(mmptr->path, path, pathlen)) -+ return 1; -+ mmptr = mmptr->next; -+ } -+ return 0; -+} -+ - /* - * Build list of mounts in shortest -> longest order. - * Pass in list head and return list head. -@@ -725,6 +741,12 @@ - mmptr = mmptr->next; - } - -+ /* if a multimount entry has duplicate keys, it is invalid */ -+ if (key_exists(mmptr, path, plen)) { -+ free(new); -+ return NULL; -+ } -+ - if (old) - old->next = new; - new->next = mmptr; diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/064_support_options_on_nis_maps.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/064_support_options_on_nis_maps.patch deleted file mode 100644 index b71d9f5..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/064_support_options_on_nis_maps.patch +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 064_support_options_on_nis_maps.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/rc.autofs.in .A/samples/rc.autofs.in ---- .B/samples/rc.autofs.in 2005-04-11 11:30:54.000000000 +0000 -+++ .A/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 -@@ -129,7 +129,17 @@ - else - map="$1" - fi -- /usr/bin/ypcat -k "$map" 2> /dev/null | sed -e '/^#/d' -e '/^$/d' -+ -+ # Append the map's options at the _start_ if there are any options already -+ # (ie. myopt -> $2,myopt), otherwise just append them at the end. -+ if [ -z "$2" ]; then -+ /usr/bin/ypcat -k "$map" 2> /dev/null | sed -e '/^#/d' -e '/^$/d' -+ else -+ /usr/bin/ypcat -k "$map" 2> /dev/null | -+ sed -e '/^#/d' -e '/^$/d' \ -+ -e "s/^[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\)[ \t]\+-\([^ \t]\+\)/\1 \2 $2,\3/" \ -+ -e "s/^[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\)[ \t]*$/\1 \2 $2/" -+ fi - } - - function getfilemounts() -@@ -141,10 +151,11 @@ - if [ "`echo $auto_master_in | grep '^+'`" = "" ]; then - echo $auto_master_in - else -- for nismap in `cat /etc/auto.master | grep '^\+' | -- sed -e '/^#/d' -e '/^$/d'`; do -- catnismap `echo "$nismap" | sed -e 's/^\+//'` -- done -+ cat /etc/auto.master | grep '^\+' | sed -e '/^#/d' -e '/^$/d' | ( -+ while read map options; do -+ catnismap `echo "$map" | sed -e 's/^\+//'` $options -+ done -+ ) - fi - done - ) diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/065_fix_master_map_in_ldap.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/065_fix_master_map_in_ldap.patch deleted file mode 100644 index 1898571..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/065_fix_master_map_in_ldap.patch +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 065_fix_master_map_in_ldap.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/rc.autofs.in .A/samples/rc.autofs.in ---- .B/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 -+++ .A/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 -@@ -175,7 +175,11 @@ - function getldapmounts() - { - if [ -x @@autofslibdir@@/autofs-ldap-auto-master ]; then -+ [ ! -z $LDAPURI ] && export LDAPURI="$LDAPURI" -+ [ ! -z $LDAPBASE ] && export LDAPBASE="$LDAPBASE" - @@autofslibdir@@/autofs-ldap-auto-master 2> /dev/null -+ @@autofslibdir@@/autofs-ldap-auto-master -m automountMap \ -+ -e automount -n ou -k cn -v automountInformation 2> /dev/null - fi - } - diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/066_canonicalise_mount_points.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/066_canonicalise_mount_points.patch deleted file mode 100644 index 0d1588c..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/066_canonicalise_mount_points.patch +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 066_canonicalise_mount_points.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/rc.autofs.in .A/samples/rc.autofs.in ---- .B/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 -+++ .A/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 -@@ -244,6 +244,13 @@ - continue - fi - -+ # If possible, canonicalise the path so it will always unmount -+ # cleanly. -+ link=`readlink -f "$dir"` -+ if [ ! -z "$link" ]; then -+ dir="$link" -+ fi -+ - # Do not include a map if it is a duplicate, maps on top of - # another map or another map, maps on top of it. - for knownmap in $knownmaps diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/067_allow_disabling_bind_mounts.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/067_allow_disabling_bind_mounts.patch deleted file mode 100644 index 71ed3f1..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/067_allow_disabling_bind_mounts.patch +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 067_allow_disabling_bind_mounts.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/modules/mount_bind.c .A/modules/mount_bind.c ---- .B/modules/mount_bind.c 2005-01-10 13:28:29.000000000 +0000 -+++ .A/modules/mount_bind.c 2007-01-07 21:36:35.000000000 +0000 -@@ -107,7 +107,7 @@ - if (options == NULL || *options == '\0') - options = "defaults"; - -- if (bind_works) { -+ if (bind_works && strcmp(options, "symlink") != 0) { - int status, existed = 1; - - debug(MODPREFIX "calling mkdir_path %s", fullpath); -diff -Naur .B/modules/mount_nfs.c .A/modules/mount_nfs.c ---- .B/modules/mount_nfs.c 2007-01-07 21:36:35.000000000 +0000 -+++ .A/modules/mount_nfs.c 2007-01-07 21:36:35.000000000 +0000 -@@ -391,7 +391,8 @@ - char *whatstr; - char *nfsoptions = NULL; - int local, err; -- int nosymlink = 0; -+ int nosymlink = 0; /* Actually misnamed, should be "nobind" now */ -+ int symlink = 0; /* Prefer symlinks to bind mounts? */ - int ro = 0; /* Set if mount bind should be read-only */ - - debug(MODPREFIX "root=%s name=%s what=%s, fstype=%s, options=%s", -@@ -405,7 +406,10 @@ - strcpy(whatstr, what); - - /* Extract "nosymlink" pseudo-option which stops local filesystems -- from being symlinked */ -+ from being bind mounted, and "symlink" pseudo-option which does not -+ do the exact opposite, but rather makes any bind mount into a -+ symlink instead. (Both nosymlink and symlink at the same time -+ make no sense, of course.) */ - if (options) { - const char *comma; - char *nfsp; -@@ -446,6 +450,8 @@ - #endif - if (strncmp("nosymlink", cp, end - cp + 1) == 0) - nosymlink = 1; -+ else if (strncmp("symlink", cp, end - cp + 1) == 0) -+ symlink = 1; - else { - /* Check for options that also make sense - with bind mounts */ -@@ -457,8 +463,8 @@ - } - } - -- debug(MODPREFIX "nfs options=\"%s\", nosymlink=%d, ro=%d", -- nfsoptions, nosymlink, ro); -+ debug(MODPREFIX "nfs options=\"%s\", nosymlink=%d, symlink=%d, ro=%d", -+ nfsoptions, nosymlink, symlink, ro); - } - - local = 0; -@@ -490,7 +496,11 @@ - if (local) { - /* Local host -- do a "bind" */ - -- const char *bind_options = ro ? "ro" : ""; -+ const char *bind_options; -+ if (symlink) -+ bind_options = "symlink"; -+ else -+ bind_options = ro ? "ro" : ""; - - debug(MODPREFIX "%s is local, doing bind", name); - diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/067_ldap_no_first_message.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/067_ldap_no_first_message.patch deleted file mode 100644 index e85d37b..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/067_ldap_no_first_message.patch +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 067_ldap_no_first_message.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/modules/lookup_ldap.c .A/modules/lookup_ldap.c ---- .B/modules/lookup_ldap.c 2005-02-27 05:37:14.000000000 +0000 -+++ .A/modules/lookup_ldap.c 2007-01-07 21:36:35.000000000 +0000 -@@ -437,7 +437,7 @@ - - e = ldap_first_entry(ldap, result); - if (!e) { -- crit(MODPREFIX "got answer, but no first entry for %s", query); -+ debug(MODPREFIX "got answer, but no first entry for %s", query); - ldap_msgfree(result); - ldap_unbind(ldap); - return CHE_MISSING; -@@ -545,7 +545,7 @@ - - e = ldap_first_entry(ldap, result); - if (!e) { -- crit(MODPREFIX "got answer, but no first entry for %s", query); -+ debug(MODPREFIX "got answer, but no first entry for %s", query); - ldap_msgfree(result); - ldap_unbind(ldap); - return CHE_MISSING; diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/068_fix_invalid_rpcgen_code.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/068_fix_invalid_rpcgen_code.patch deleted file mode 100644 index abb61ea..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/068_fix_invalid_rpcgen_code.patch +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 068_fix_invalid_rpcgen_code.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/lib/Makefile .A/lib/Makefile ---- .B/lib/Makefile 2005-01-09 09:16:43.000000000 +0000 -+++ .A/lib/Makefile 2007-01-07 21:36:36.000000000 +0000 -@@ -39,6 +39,10 @@ - - mount_xdr.c: mount.h - $(RPCGEN) -c -o mount_xdr.c mount.x -+ sed -i -e 's/IXDR_GET_LONG(\([^)]*\))/((long)IXDR_GET_U_INT32(\1))/' mount_xdr.c -+ sed -i -e 's/IXDR_PUT_LONG(\([^)]*\),\([^)]*\))/((long)IXDR_PUT_INT32(\1,(long)(\2)))/' mount_xdr.c -+ sed -i -e 's/IXDR_GET_SHORT(\([^)]*\))/((short)IXDR_GET_U_INT32(\1))/' mount_xdr.c -+ sed -i -e 's/IXDR_PUT_SHORT(\([^)]*\),\([^)]*\))/((long)IXDR_PUT_INT32(\1,(long)(\2)))/' mount_xdr.c - - mount_xdr.o: mount_xdr.c - $(CC) $(CFLAGS) -Wno-unused-variable -o mount_xdr.o -c mount_xdr.c diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/069_support_spaces_in_smb_share_names.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/069_support_spaces_in_smb_share_names.patch deleted file mode 100644 index a07e966..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/069_support_spaces_in_smb_share_names.patch +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 069_support_spaces_in_smb_share_names.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/auto.smb .A/samples/auto.smb ---- .B/samples/auto.smb 2005-04-05 13:02:09.000000000 +0000 -+++ .A/samples/auto.smb 2007-01-07 21:36:36.000000000 +0000 -@@ -20,7 +20,7 @@ - - $SMBCLIENT -gNL $key 2>/dev/null| awk -v key="$key" -v opts="$opts" -F'|' -- ' - BEGIN { ORS=""; first=1 } -- /Disk/ { if (first) { print opts; first=0 }; print " \\\n\t /" $2, "://" key "/" $2 } -+ /Disk/ { if (first) { print opts; first=0 }; sub(/ /, "\\ ", $2); print " \\\n\t /" $2, "://" key "/" $2 } - END { if (!first) print "\n"; else exit 1 } - ' - diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/070_fix_regex_typo.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/070_fix_regex_typo.patch deleted file mode 100644 index 46f2159..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/070_fix_regex_typo.patch +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 070_fix_regex_typo.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/rc.autofs.in .A/samples/rc.autofs.in ---- .B/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 -+++ .A/samples/rc.autofs.in 2007-01-07 21:36:36.000000000 +0000 -@@ -148,7 +148,7 @@ - cat /etc/auto.master | awk '{print $0}' | sed -e '/^#/d' -e '/^$/d' | ( - while read auto_master_in - do -- if [ "`echo $auto_master_in | grep '^+'`" = "" ]; then -+ if [ "`echo $auto_master_in | grep '^\+'`" = "" ]; then - echo $auto_master_in - else - cat /etc/auto.master | grep '^\+' | sed -e '/^#/d' -e '/^$/d' | ( diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/071_fix_ldap_mounts.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/071_fix_ldap_mounts.patch deleted file mode 100644 index ee0c4ef..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/071_fix_ldap_mounts.patch +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 071_fix_ldap_mounts.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/rc.autofs.in .A/samples/rc.autofs.in ---- .B/samples/rc.autofs.in 2007-01-07 21:36:36.000000000 +0000 -+++ .A/samples/rc.autofs.in 2007-01-07 21:36:36.000000000 +0000 -@@ -319,7 +319,7 @@ - maptype=`echo $map | cut -f1 -d:` - # Handle degenerate map specifiers - if [ "$maptype" = "$map" ] ; then -- if [ "$map" = "hesiod" -o "$map" = "userhome" ] ; then -+ if [ "$map" = "hesiod" -o "$map" = "userhome" -o "$map" = "ldap" ] ; then - maptype=$map - map= - elif [ "$map" = "multi" ] ; then diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/072_fix_auto_net_sort.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/072_fix_auto_net_sort.patch deleted file mode 100644 index 5edec83..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/072_fix_auto_net_sort.patch +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 072_fix_auto_net_sort.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/auto.net .A/samples/auto.net ---- .B/samples/auto.net 2007-01-07 21:36:35.000000000 +0000 -+++ .A/samples/auto.net 2007-01-07 21:36:36.000000000 +0000 -@@ -37,7 +37,7 @@ - # Newer distributions get this right - SHOWMOUNT="$SMNT --no-headers -e $key" - --$SHOWMOUNT | LC_ALL=C sort +0 | \ -+$SHOWMOUNT | LC_ALL=C sort -k 1 | \ - awk -v key="$key" -v opts="$opts" -- ' - BEGIN { ORS=""; first=1 } - { if (first) { print opts; first=0 }; print " \\\n\t" $1, key ":" $1 } diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/073_configurable_locking.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/073_configurable_locking.patch deleted file mode 100644 index 94058ca..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/073_configurable_locking.patch +++ /dev/null @@ -1,173 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 073_configurable_locking.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/configure .A/configure ---- .B/configure 2005-04-06 15:24:37.000000000 +0000 -+++ .A/configure 2007-01-07 21:36:36.000000000 +0000 -@@ -842,6 +842,7 @@ - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-ext-env disable search in environment for substitution variable -+--disable-mount-locking disable use of locking when spawning mount command - - Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] -@@ -4308,6 +4309,23 @@ - fi - - # -+# Disable use of locking when spawning mount command -+# -+# Check whether --enable-mount-locking or --disable-mount-locking was given. -+if test "${enable_mount_locking+set}" = set; then -+ enableval="$enable_mount_locking" -+ -+else -+ enableval=yes -+fi; -+if test x$enable_mount_locking = xyes -o x$enableval = xyes; then -+ cat >>confdefs.h <<\_ACEOF -+#define ENABLE_MOUNT_LOCKING 1 -+_ACEOF -+ -+fi -+ -+# - # Write Makefile.conf and include/config.h - # - ac_config_headers="$ac_config_headers include/config.h" -diff -Naur .B/configure.in .A/configure.in ---- .B/configure.in 2005-04-06 15:24:37.000000000 +0000 -+++ .A/configure.in 2007-01-07 21:36:36.000000000 +0000 -@@ -167,6 +167,16 @@ - fi - - # -+# Disable use of locking when spawning mount command -+# -+AC_ARG_ENABLE(mount-locking, -+--disable-mount-locking disable use of locking when spawning mount command,, -+ enableval=yes) -+if test x$enable_mount_locking = xyes -o x$enableval = xyes; then -+ AC_DEFINE(ENABLE_MOUNT_LOCKING, 1) -+fi -+ -+# - # Write Makefile.conf and include/config.h - # - AC_CONFIG_HEADER(include/config.h) -diff -Naur .B/daemon/spawn.c .A/daemon/spawn.c ---- .B/daemon/spawn.c 2005-02-10 12:56:53.000000000 +0000 -+++ .A/daemon/spawn.c 2007-01-07 21:36:36.000000000 +0000 -@@ -322,6 +322,7 @@ - return do_spawn(logpri, 0, prog, (const char **) argv); - } - -+#ifdef ENABLE_MOUNT_LOCKING - int spawnll(int logpri, const char *prog, ...) - { - va_list arg; -@@ -342,3 +343,4 @@ - - return do_spawn(logpri, 1, prog, (const char **) argv); - } -+#endif -diff -Naur .B/include/automount.h .A/include/automount.h ---- .B/include/automount.h 2005-01-26 13:03:02.000000000 +0000 -+++ .A/include/automount.h 2007-01-07 21:36:36.000000000 +0000 -@@ -121,9 +121,13 @@ - - int aquire_lock(void); - void release_lock(void); --int spawnll(int logpri, const char *prog, ...); - int spawnl(int logpri, const char *prog, ...); --int spawnv(int logpri, const char *prog, const char *const *argv); -+#ifdef ENABLE_MOUNT_LOCKING -+int spawnll(int logpri, const char *prog, ...); -+#else -+#define spawnll spawnl -+#endif -+int spawnv(int ogpri, const char *prog, const char *const *argv); - void reset_signals(void); - void ignore_signals(void); - void discard_pending(int sig); -diff -Naur .B/include/config.h.in .A/include/config.h.in ---- .B/include/config.h.in 2004-02-03 15:23:21.000000000 +0000 -+++ .A/include/config.h.in 2007-01-07 21:36:36.000000000 +0000 -@@ -25,3 +25,5 @@ - #undef HAVE_SLOPPY_MOUNT - - #undef ENABLE_EXT_ENV -+ -+#undef ENABLE_MOUNT_LOCKING -diff -Naur .B/patches/util-linux-2.12a-flock.patch .A/patches/util-linux-2.12a-flock.patch ---- .B/patches/util-linux-2.12a-flock.patch 1970-01-01 00:00:00.000000000 +0000 -+++ .A/patches/util-linux-2.12a-flock.patch 2007-01-07 21:36:36.000000000 +0000 -@@ -0,0 +1,30 @@ -+--- util-linux-2.12a/mount/fstab.c.flock 2005-09-17 01:36:03.000000000 +0800 -++++ util-linux-2.12a/mount/fstab.c 2005-09-17 01:41:12.000000000 +0800 -+@@ -488,7 +488,7 @@ lock_mtab (void) { -+ } -+ /* proceed anyway */ -+ } -+- we_created_lockfile = 1; -++ we_created_lockfile = fd; -+ } else { -+ static int tries = 0; -+ -+@@ -510,9 +510,8 @@ lock_mtab (void) { -+ MOUNTED_LOCK); -+ sleep(1); -+ } -++ close(fd); -+ } -+- -+- close(fd); -+ } -+ } -+ -+@@ -520,6 +519,7 @@ lock_mtab (void) { -+ void -+ unlock_mtab (void) { -+ if (we_created_lockfile) { -++ close(we_created_lockfile); -+ unlink (MOUNTED_LOCK); -+ we_created_lockfile = 0; -+ } -diff -Naur .B/patches/util-linux-2.12q-flock.patch .A/patches/util-linux-2.12q-flock.patch ---- .B/patches/util-linux-2.12q-flock.patch 1970-01-01 00:00:00.000000000 +0000 -+++ .A/patches/util-linux-2.12q-flock.patch 2007-01-07 21:36:36.000000000 +0000 -@@ -0,0 +1,29 @@ -+--- util-linux-2.12q/mount/fstab.c.flock 2005-09-17 01:10:37.000000000 +0800 -++++ util-linux-2.12q/mount/fstab.c 2005-09-17 01:16:51.000000000 +0800 -+@@ -417,6 +417,7 @@ -+ unlock_mtab (void) { -+ if (we_created_lockfile) { -+ unlink (MOUNTED_LOCK); -++ close(we_created_lock_file); -+ we_created_lockfile = 0; -+ } -+ } -+@@ -528,6 +529,7 @@ -+ } -+ /* proceed anyway */ -+ } -++ we_created_lock_file = fd; -+ } else { -+ static int tries = 0; -+ -+@@ -549,9 +551,8 @@ -+ MOUNTED_LOCK); -+ sleep(1); -+ } -++ close(fd); -+ } -+- -+- close(fd); -+ } -+ } -+ diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/074_auto_smb_cifs.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/074_auto_smb_cifs.patch deleted file mode 100644 index 28590ee..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/074_auto_smb_cifs.patch +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 074_auto_smb_cifs.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/auto.smb .A/samples/auto.smb ---- .B/samples/auto.smb 2007-01-07 21:36:36.000000000 +0000 -+++ .A/samples/auto.smb 2007-01-07 21:36:36.000000000 +0000 -@@ -5,7 +5,7 @@ - # This file must be executable to work! chmod 755! - - key="$1" --opts="-fstype=smbfs" -+opts="-fstype=cifs" - - for P in /bin /sbin /usr/bin /usr/sbin - do diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/075_auto_net_escape_hash.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/075_auto_net_escape_hash.patch deleted file mode 100644 index 09c0ccb..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/075_auto_net_escape_hash.patch +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 075_auto_net_escape_hash.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/auto.net .A/samples/auto.net ---- .B/samples/auto.net 2007-01-07 21:36:36.000000000 +0000 -+++ .A/samples/auto.net 2007-01-07 21:36:36.000000000 +0000 -@@ -42,4 +42,4 @@ - BEGIN { ORS=""; first=1 } - { if (first) { print opts; first=0 }; print " \\\n\t" $1, key ":" $1 } - END { if (!first) print "\n"; else exit 1 } -- ' -+ ' | sed 's/#/\\#/g' diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/076_ldap_deprecated.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/076_ldap_deprecated.patch deleted file mode 100644 index 93cfc05..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/076_ldap_deprecated.patch +++ /dev/null @@ -1,265 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 076_ldap_deprecated.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/aclocal.m4 .A/aclocal.m4 ---- .B/aclocal.m4 2003-09-29 08:22:35.000000000 +0000 -+++ .A/aclocal.m4 2007-01-07 21:36:36.000000000 +0000 -@@ -9,8 +9,8 @@ - AC_DEFUN(AF_PATH_INCLUDE, - [AC_PATH_PROGS($1,$2,$3,$4) - if test -n "$$1"; then -- AC_DEFINE(HAVE_$1) -- AC_DEFINE_UNQUOTED(PATH_$1, "$$1") -+ AC_DEFINE(HAVE_$1,1,[define if you have $1]) -+ AC_DEFINE_UNQUOTED(PATH_$1, "$$1", [define if you have $1]) - HAVE_$1=1 - else - HAVE_$1=0 -@@ -28,7 +28,7 @@ - [if test -n "$MOUNT" ; then - AC_MSG_CHECKING([if mount accepts the -s option]) - if "$MOUNT" -s > /dev/null 2>&1 ; then -- AC_DEFINE(HAVE_SLOPPY_MOUNT) -+ AC_DEFINE(HAVE_SLOPPY_MOUNT, 1, [define if the mount command supports the -s option]) - AC_MSG_RESULT(yes) - else - AC_MSG_RESULT(no) -diff -Naur .B/configure .A/configure ---- .B/configure 2007-01-07 21:36:36.000000000 +0000 -+++ .A/configure 2007-01-07 21:36:36.000000000 +0000 -@@ -1359,11 +1359,13 @@ - test -n "$MOUNT" || MOUNT="/bin/mount" - - if test -n "$MOUNT"; then -- cat >>confdefs.h <<\_ACEOF -+ -+cat >>confdefs.h <<\_ACEOF - #define HAVE_MOUNT 1 - _ACEOF - -- cat >>confdefs.h <<_ACEOF -+ -+cat >>confdefs.h <<_ACEOF - #define PATH_MOUNT "$MOUNT" - _ACEOF - -@@ -1418,11 +1420,13 @@ - test -n "$UMOUNT" || UMOUNT="/bin/umount" - - if test -n "$UMOUNT"; then -- cat >>confdefs.h <<\_ACEOF -+ -+cat >>confdefs.h <<\_ACEOF - #define HAVE_UMOUNT 1 - _ACEOF - -- cat >>confdefs.h <<_ACEOF -+ -+cat >>confdefs.h <<_ACEOF - #define PATH_UMOUNT "$UMOUNT" - _ACEOF - -@@ -1476,11 +1480,13 @@ - done - - if test -n "$E2FSCK"; then -- cat >>confdefs.h <<\_ACEOF -+ -+cat >>confdefs.h <<\_ACEOF - #define HAVE_E2FSCK 1 - _ACEOF - -- cat >>confdefs.h <<_ACEOF -+ -+cat >>confdefs.h <<_ACEOF - #define PATH_E2FSCK "$E2FSCK" - _ACEOF - -@@ -1534,11 +1540,13 @@ - done - - if test -n "$E3FSCK"; then -- cat >>confdefs.h <<\_ACEOF -+ -+cat >>confdefs.h <<\_ACEOF - #define HAVE_E3FSCK 1 - _ACEOF - -- cat >>confdefs.h <<_ACEOF -+ -+cat >>confdefs.h <<_ACEOF - #define PATH_E3FSCK "$E3FSCK" - _ACEOF - -@@ -1556,7 +1564,8 @@ - echo "$as_me:$LINENO: checking if mount accepts the -s option" >&5 - echo $ECHO_N "checking if mount accepts the -s option... $ECHO_C" >&6 - if "$MOUNT" -s > /dev/null 2>&1 ; then -- cat >>confdefs.h <<\_ACEOF -+ -+cat >>confdefs.h <<\_ACEOF - #define HAVE_SLOPPY_MOUNT 1 - _ACEOF - -@@ -3403,6 +3412,7 @@ - fi; - if test -z "$HAVE_LDAP"; then - HAVE_LDAP=0 -+ LDAP_FLAGS="$LDAP_FLAGS -DLDAP_DEPRECATED=1" - echo "$as_me:$LINENO: checking for ldap_init in -lldap" >&5 - echo $ECHO_N "checking for ldap_init in -lldap... $ECHO_C" >&6 - if test "${ac_cv_lib_ldap_ldap_init+set}" = set; then -@@ -4302,7 +4312,8 @@ - enableval=yes - fi; - if test x$enable_ext_env = xyes; then -- cat >>confdefs.h <<\_ACEOF -+ -+cat >>confdefs.h <<\_ACEOF - #define ENABLE_EXT_ENV 1 - _ACEOF - -@@ -4319,7 +4330,8 @@ - enableval=yes - fi; - if test x$enable_mount_locking = xyes -o x$enableval = xyes; then -- cat >>confdefs.h <<\_ACEOF -+ -+cat >>confdefs.h <<\_ACEOF - #define ENABLE_MOUNT_LOCKING 1 - _ACEOF - -diff -Naur .B/configure.in .A/configure.in ---- .B/configure.in 2007-01-07 21:36:36.000000000 +0000 -+++ .A/configure.in 2007-01-07 21:36:36.000000000 +0000 -@@ -118,6 +118,7 @@ - ) - if test -z "$HAVE_LDAP"; then - HAVE_LDAP=0 -+ LDAP_FLAGS="$LDAP_FLAGS -DLDAP_DEPRECATED=1" - AC_CHECK_LIB(ldap, ldap_init, HAVE_LDAP=1 LIBLDAP="$LIBLDAP -lldap -llber -lresolv", , - -llber -lresolv $LIBS) - fi -@@ -163,7 +164,7 @@ - --disable-ext-env disable search in environment for substitution variable,, - enableval=yes) - if test x$enable_ext_env = xyes; then -- AC_DEFINE(ENABLE_EXT_ENV, 1) -+ AC_DEFINE(ENABLE_EXT_ENV, 1, [leave this alone]) - fi - - # -@@ -173,7 +174,7 @@ - --disable-mount-locking disable use of locking when spawning mount command,, - enableval=yes) - if test x$enable_mount_locking = xyes -o x$enableval = xyes; then -- AC_DEFINE(ENABLE_MOUNT_LOCKING, 1) -+ AC_DEFINE(ENABLE_MOUNT_LOCKING, 1, [disable mount table locking -- use this if your maps contain recursive mounts -- EXPERIMENTAL]) - fi - - # -diff -Naur .B/include/config.h.in .A/include/config.h.in ---- .B/include/config.h.in 2007-01-07 21:36:36.000000000 +0000 -+++ .A/include/config.h.in 2007-01-07 21:36:36.000000000 +0000 -@@ -1,29 +1,80 @@ --#ident "$Id: config.h.in,v 1.4 2004/02/03 15:23:21 raven Exp $" --/* -*- c -*- -- * -- * config.h.in: Pattern file for autofs to be filled in by configure -- * -- */ -+/* include/config.h.in. Generated from configure.in by autoheader. */ - --/* Program paths */ -+/* leave this alone */ -+#undef ENABLE_EXT_ENV -+ -+/* disable mount table locking -- use this if your maps contain recursive -+ mounts -- EXPERIMENTAL */ -+#undef ENABLE_MOUNT_LOCKING -+ -+/* define if you have E2FSCK */ -+#undef HAVE_E2FSCK -+ -+/* define if you have E3FSCK */ -+#undef HAVE_E3FSCK -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_INTTYPES_H -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_MEMORY_H -+ -+/* define if you have MOUNT */ - #undef HAVE_MOUNT --#undef PATH_MOUNT - -+/* define if the mount command supports the -s option */ -+#undef HAVE_SLOPPY_MOUNT -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_STDINT_H -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_STDLIB_H -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_STRINGS_H -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_STRING_H -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_SYS_STAT_H -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_SYS_TYPES_H -+ -+/* define if you have UMOUNT */ - #undef HAVE_UMOUNT --#undef PATH_UMOUNT - --#undef HAVE_SMBMOUNT --#undef PATH_SMBMOUNT -+/* Define to 1 if you have the header file. */ -+#undef HAVE_UNISTD_H - --#undef HAVE_E2FSCK -+/* Define to the address where bug reports for this package should be sent. */ -+#undef PACKAGE_BUGREPORT -+ -+/* Define to the full name of this package. */ -+#undef PACKAGE_NAME -+ -+/* Define to the full name and version of this package. */ -+#undef PACKAGE_STRING -+ -+/* Define to the one symbol short name of this package. */ -+#undef PACKAGE_TARNAME -+ -+/* Define to the version of this package. */ -+#undef PACKAGE_VERSION -+ -+/* define if you have E2FSCK */ - #undef PATH_E2FSCK - --#undef HAVE_E3FSCK -+/* define if you have E3FSCK */ - #undef PATH_E3FSCK - --/* Define this option if mount(8) supports the -s (sloppy) option */ --#undef HAVE_SLOPPY_MOUNT -+/* define if you have MOUNT */ -+#undef PATH_MOUNT - --#undef ENABLE_EXT_ENV -+/* define if you have UMOUNT */ -+#undef PATH_UMOUNT - --#undef ENABLE_MOUNT_LOCKING -+/* Define to 1 if you have the ANSI C header files. */ -+#undef STDC_HEADERS diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/078_locking_fix_1.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/078_locking_fix_1.patch deleted file mode 100644 index eb22a2b..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/078_locking_fix_1.patch +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 078_locking_fix_1.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/daemon/spawn.c .A/daemon/spawn.c ---- .B/daemon/spawn.c 2007-01-07 21:36:36.000000000 +0000 -+++ .A/daemon/spawn.c 2007-01-07 21:36:36.000000000 +0000 -@@ -214,14 +214,15 @@ - sigfillset(&allsignals); - sigprocmask(SIG_BLOCK, &allsignals, &oldsig); - -- if (pipe(pipefd)) -+ if (pipe(pipefd)) { -+ if (use_lock) -+ release_lock(); -+ sigprocmask(SIG_SETMASK, &oldsig, NULL); - return -1; -+ } - - f = fork(); -- if (f < 0) { -- sigprocmask(SIG_SETMASK, &oldsig, NULL); -- return -1; -- } else if (f == 0) { -+ if (f == 0) { - reset_signals(); - close(pipefd[0]); - dup2(pipefd[1], STDOUT_FILENO); -@@ -243,6 +244,8 @@ - - if (f < 0) { - close(pipefd[0]); -+ if (use_lock) -+ release_lock(); - sigprocmask(SIG_SETMASK, &oldsig, NULL); - return -1; - } -@@ -287,11 +290,11 @@ - if (waitpid(f, &status, 0) != f) - status = -1; /* waitpid() failed */ - -- sigprocmask(SIG_SETMASK, &oldsig, NULL); -- - if (use_lock) - release_lock(); - -+ sigprocmask(SIG_SETMASK, &oldsig, NULL); -+ - return status; - } - } -diff -Naur .B/lib/lock.c .A/lib/lock.c ---- .B/lib/lock.c 2005-01-17 15:09:28.000000000 +0000 -+++ .A/lib/lock.c 2007-01-07 21:36:36.000000000 +0000 -@@ -208,9 +208,6 @@ - */ - static int wait_for_lockf(const char *lockf) - { -- struct timespec t = { 0, WAIT_INTERVAL }; -- struct timespec r; -- int ts_size = sizeof(struct timespec); - int tries = WAIT_TRIES; - int status = 0; - struct stat st; -@@ -218,10 +215,13 @@ - while (tries-- && !status) { - status = stat(lockf, &st); - if (!status) { -+ struct timespec t = { 0, WAIT_INTERVAL }; -+ struct timespec r; -+ - while (nanosleep(&t, &r) == -1 && errno == EINTR) { - if (got_term) - return 0; -- memcpy(&t, &r, ts_size); -+ memcpy(&t, &r, sizeof(struct timespec)); - } - } - } diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/079_no_unlink_upstream.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/079_no_unlink_upstream.patch deleted file mode 100644 index eb062e4..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/079_no_unlink_upstream.patch +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 079_no_unlink_upstream.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/daemon/automount.c .A/daemon/automount.c ---- .B/daemon/automount.c 2007-01-07 21:36:36.000000000 +0000 -+++ .A/daemon/automount.c 2007-01-07 21:36:37.000000000 +0000 -@@ -232,16 +232,38 @@ - static int rm_unwanted_fn(const char *file, const struct stat *st, int when, void *arg) - { - int rmsymlink = *(int *) arg; -+ struct stat newst; - - if (when == 0) { - if (st->st_dev != ap.dev) - return 0; -- } else { -- info("rm_unwanted: %s\n", file); -- if (S_ISDIR(st->st_mode)) -- rmdir(file); -- else if (!S_ISLNK(st->st_mode) || rmsymlink) -- unlink(file); -+ return 1; -+ } -+ -+ if (lstat(file, &newst)) { -+ crit ("rm_unwanted: unable to stat file, possible race " -+ "condition."); -+ return 0; -+ } -+ -+ if (newst.st_dev != ap.dev) { -+ crit ("rm_unwanted: file %s has the wrong device, possible " -+ "race condition.",file); -+ return 0; -+ } -+ -+ if (S_ISDIR(newst.st_mode)) { -+ if (rmdir(file)) { -+ info ("rm_unwanted: unable to remove directory" -+ " %s", file); -+ return 0; -+ } -+ } else if (S_ISREG(newst.st_mode)) { -+ crit ("rm_unwanted: attempting to remove files from a mounted " -+ "directory."); -+ return 0; -+ } else if (S_ISLNK(newst.st_mode) && rmsymlink) { -+ unlink(file); - } - - return 1; diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/080_auto_smb_probe_credentials.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/080_auto_smb_probe_credentials.patch deleted file mode 100644 index 0b6ca44..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/080_auto_smb_probe_credentials.patch +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 080_auto_smb_probe_credentials.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/auto.smb .A/samples/auto.smb ---- .B/samples/auto.smb 2007-01-07 21:36:36.000000000 +0000 -+++ .A/samples/auto.smb 2007-01-07 21:36:37.000000000 +0000 -@@ -5,7 +5,9 @@ - # This file must be executable to work! chmod 755! - - key="$1" --opts="-fstype=cifs" -+mountopts="-fstype=cifs" -+smbopts="" -+credfile="/etc/auto.smb.$key" - - for P in /bin /sbin /usr/bin /usr/sbin - do -@@ -18,7 +20,14 @@ - - [ -x $SMBCLIENT ] || exit 1 - --$SMBCLIENT -gNL $key 2>/dev/null| awk -v key="$key" -v opts="$opts" -F'|' -- ' -+if [ -e $credfile ]; then -+ mountopts="$mountopts,credentials=$credfile" -+ smbopts="-A $credfile" -+else -+ smbopts="-N" -+fi -+ -+$SMBCLIENT $smbopts -gL $key 2>/dev/null| awk -v key="$key" -v opts="$mountopts" -F'|' -- ' - BEGIN { ORS=""; first=1 } - /Disk/ { if (first) { print opts; first=0 }; sub(/ /, "\\ ", $2); print " \\\n\t /" $2, "://" key "/" $2 } - END { if (!first) print "\n"; else exit 1 } diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/081_auto_net_showmount_quotes.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/081_auto_net_showmount_quotes.patch deleted file mode 100644 index 25d5ec8..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/081_auto_net_showmount_quotes.patch +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 081_auto_net_showmount_quotes.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/auto.net .A/samples/auto.net ---- .B/samples/auto.net 2007-01-07 21:36:36.000000000 +0000 -+++ .A/samples/auto.net 2007-01-07 21:36:37.000000000 +0000 -@@ -32,7 +32,7 @@ - done - done - --[ -x $SMNT ] || exit 1 -+[ -x "$SMNT" ] || exit 1 - - # Newer distributions get this right - SHOWMOUNT="$SMNT --no-headers -e $key" diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/082_samples_makefile_typo.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/082_samples_makefile_typo.patch deleted file mode 100644 index 5667232..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/082_samples_makefile_typo.patch +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh /usr/share/dpatch/dpatch-run -## 082_samples_makefile_typo.dpatch -## -## DP: No description. - -@DPATCH@ - -diff -Naur .B/samples/Makefile .A/samples/Makefile ---- .B/samples/Makefile 2005-01-04 14:36:54.000000000 +0000 -+++ .A/samples/Makefile 2007-01-07 21:36:37.000000000 +0000 -@@ -42,6 +42,6 @@ - install -c autofs-ldap-auto-master -m 755 $(INSTALLROOT)$(autofslibdir) - endif - --clean): -+clean: - rm -f *.o *.s autofs-ldap-auto-master rc.autofs - diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/083_clarify_program_map_outputsyntax.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/083_clarify_program_map_outputsyntax.patch deleted file mode 100644 index e772b90..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/083_clarify_program_map_outputsyntax.patch +++ /dev/null @@ -1,19 +0,0 @@ -#! /bin/sh /usr/share/dpatch/dpatch-run -## 083_clarify_program_map_outputsyntax.dpatch -## -## DP: Explicitly mention that the queried key has to be omitted in the output of -## DP: program maps. - -@DPATCH@ ---- autofs-4.1.4+debian.orig/man/autofs.5 2007-06-30 00:29:12.000000000 +0200 -+++ autofs-4.1.4+debian/man/autofs.5 2007-06-30 00:30:27.000000000 +0200 -@@ -153,7 +153,8 @@ - .B program - map will be called as a script with the key as an argument. It may - return no lines of output if there's an error, or one or more lines --containing a map (with \\ quoting line breaks). -+containing a map (starting with the second column, i.e. omitting the -+key, and quoting line breaks with \\). - .P - To use a - .B program diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/084_init_lsb_header.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/084_init_lsb_header.patch deleted file mode 100644 index 8a07693..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/084_init_lsb_header.patch +++ /dev/null @@ -1,26 +0,0 @@ -#! /bin/sh /usr/share/dpatch/dpatch-run -## 84_init_lsb_header.dpatch by -## -## DP: Add an LSB-conformant header to the initscript. - -@DPATCH@ - ---- autofs-4.1.4+debian/samples/rc.autofs.in.orig 2007-07-05 16:43:32.000000000 +0200 -+++ autofs-4.1.4+debian/samples/rc.autofs.in 2007-07-05 16:43:42.000000000 +0200 -@@ -9,6 +9,16 @@ - # On most distributions, this file should be called: - # /etc/rc.d/init.d/autofs or /etc/init.d/autofs - # -+### BEGIN INIT INFO -+# Provides: autofs -+# Required-Start: $local_fs -+# Required-Stop: $local_fs -+# Default-Start: 2 3 4 5 -+# Default-Stop: 0 1 6 -+# Short-Description: automount daemon -+# Description: daemon to mount (possibly remote) filesystems -+# automatically upon entering the mountpoint -+### END INIT INFO - - # For Redhat-ish systems - # diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/085_auto_net_lp111612.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/085_auto_net_lp111612.patch deleted file mode 100644 index 23e455b..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/085_auto_net_lp111612.patch +++ /dev/null @@ -1,20 +0,0 @@ -#! /bin/sh /usr/share/dpatch/dpatch-run -## 085-auto.net-lp111612 by Morten Kjeldgaard -## -## All lines beginning with `## DP:' are a description of the patch. -## DP: Fix problem with directories exported multiple times to different -## DP: hosts (LP: #111612). - -@DPATCH@ - ---- samples/auto.net 2008-04-09 16:32:59.000000000 +0200 -+++ foo/samples/auto.net 2008-04-09 16:34:29.000000000 +0200 -@@ -37,7 +37,7 @@ - # Newer distributions get this right - SHOWMOUNT="$SMNT --no-headers -e $key" - --$SHOWMOUNT | LC_ALL=C sort -k 1 | \ -+$SHOWMOUNT | LC_ALL=C cut -d' ' -f1 | LC_ALL=C sort -k 1 | \ - awk -v key="$key" -v opts="$opts" -- ' - BEGIN { ORS=""; first=1 } - { if (first) { print opts; first=0 }; print " \\\n\t" $1, key ":" $1 } diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/Makefile.rules-cross.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/Makefile.rules-cross.patch deleted file mode 100644 index 1f9ea41..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/Makefile.rules-cross.patch +++ /dev/null @@ -1,19 +0,0 @@ -Index: autofs-4.1.4/Makefile.rules -=================================================================== ---- autofs-4.1.4.orig/Makefile.rules -+++ autofs-4.1.4/Makefile.rules -@@ -27,10 +27,10 @@ STRIP = : - #STRIP = strip --strip-debug - #endif - --CC = gcc --CXX = g++ --CXXFLAGS = $(CFLAGS) --LD = ld -+CC ?= gcc -+CXX ?= g++ -+CXXFLAGS ?= $(CFLAGS) -+LD ?= ld - SOLDFLAGS = -shared -Xlinker -rpath -Xlinker $(autofslibdir) - - # Standard rules diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.hotplug b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.hotplug deleted file mode 100644 index 67cf4c5..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.hotplug +++ /dev/null @@ -1 +0,0 @@ -* -fstype=auto,rw,sync :/dev/& diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.master b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.master deleted file mode 100644 index 41c2389..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.master +++ /dev/null @@ -1,11 +0,0 @@ -# -# $Id: auto.master,v 1.4 2005/01/04 14:36:54 raven Exp $ -# -# Sample auto.master file -# This is an automounter map and it has the following format -# key [ -mount-options-separated-by-comma ] location -# For details of the format look at autofs(5). -#/smb /etc/auto.smb -#/net /etc/auto.net -/autofs /etc/auto.hotplug -/media/net /etc/auto.network diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.network b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.network deleted file mode 100644 index c1835d9..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/auto.network +++ /dev/null @@ -1,2 +0,0 @@ -# automatically generated by enigma 2 -# do NOT change manually! diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/autofs.default b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/autofs.default deleted file mode 100644 index e8619eb..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/autofs.default +++ /dev/null @@ -1,2 +0,0 @@ -daemonoptions='--ghost' -TIMEOUT=5 diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/autofs.init b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/autofs.init deleted file mode 100755 index c32d08e..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/autofs.init +++ /dev/null @@ -1,803 +0,0 @@ -#!/bin/sh -# -# $Id: rc.autofs.in,v 1.58 2005/04/11 11:30:54 raven Exp $ -# -# rc file for automount using a Sun-style "master map". -# We first look for a local /etc/auto.master, then a YP -# map with that name -# -# On most distributions, this file should be called: -# /etc/rc.d/init.d/autofs or /etc/init.d/autofs -# -### BEGIN INIT INFO -# Provides: autofs -# Required-Start: $local_fs -# Required-Stop: $local_fs -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: automount daemon -# Description: daemon to mount (possibly remote) filesystems -# automatically upon entering the mountpoint -### END INIT INFO - -# For Redhat-ish systems -# -# chkconfig: 345 28 72 -# processname: /usr/sbin/automount -# config: /etc/auto.master -# description: Automounts filesystems on demand - -# This is used in the Debian distribution to determine the proper -# location for the S- and K-links to this init file. -# The following value is extracted by debstd to figure out how to -# generate the postinst script. Edit the field to change the way the -# script is registered through update-rc.d (see the manpage for -# update-rc.d!) -# -FLAGS="defaults 21" - -# -# Location of the automount daemon and the init directory -# -DAEMON=/usr/sbin/automount -prog=`basename $DAEMON` -initdir=/etc/init.d - -test -e $DAEMON || exit 0 - -# -# Determine which kind of configuration we're using -# -system=debian -if [ -f /etc/redhat-release ]; then - system=redhat -fi - -if [ $system = redhat ]; then - . $initdir/functions -fi - -if [ $system = debian ]; then - thisscript="$0" - if [ ! -f "$thisscript" ]; then - echo "$0: Cannot find myself" 1>&2 - exit 1 - fi -fi - -PATH=/sbin:/usr/sbin:/bin:/usr/bin -export PATH - -# -# We can add local options here -# e.g. localoptions='rsize=8192,wsize=8192' -# -localoptions='' - -# -# Daemon options -# e.g. --timeout=60 -# -daemonoptions='' - -# -# load custom settings -# -if [ "$system" = "redhat" ]; then - LOCALOPTIONS="" - DAEMONOPTIONS="" - UNDERSCORETODOT=1 - DISABLE_DIRECT=1 - DAEMON_EXIT_WAIT=20 - - [ -f /etc/sysconfig/autofs ] && . /etc/sysconfig/autofs - - # Over-ride localoptions if set - if [ -n "$LOCALOPTIONS" ]; then - localoptions=$LOCALOPTIONS - fi - - # Over-ride daemonoptions if set - if [ -n "$DAEMONOPTIONS" ]; then - daemonoptions=$DAEMONOPTIONS - fi -elif [ "$system" = "debian" ]; then - TIMEOUT=300 - DISABLE_DIRECT=1 - DAEMON_EXIT_WAIT=20 - - [ -f /etc/default/autofs ] && . /etc/default/autofs - - daemonoptions="$daemonoptions --timeout=$TIMEOUT" -fi - -# -# Check for all maps that are to be loaded -# -getschemes() -{ - SOURCES=`grep ^automount: /etc/nsswitch.conf | \ - sed -e 's/^.*://' -e 's/\[.*\]/ /g'` - - if [ `echo $SOURCES | awk '{print NF}'` -gt 0 ] - then - echo ${SOURCES} - else - echo files - fi -} - -catnismap() -{ - if [ -z "$1" ] ; then - map="auto_master" - else - map="$1" - fi - - # Append the map's options at the _start_ if there are any options already - # (ie. myopt -> $2,myopt), otherwise just append them at the end. - if [ -z "$2" ]; then - /usr/bin/ypcat -k "$map" 2> /dev/null | sed -e '/^#/d' -e '/^$/d' - else - /usr/bin/ypcat -k "$map" 2> /dev/null | - sed -e '/^#/d' -e '/^$/d' \ - -e "s/^[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\)[ \t]\+-\([^ \t]\+\)/\1 \2 $2,\3/" \ - -e "s/^[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\)[ \t]*$/\1 \2 $2/" - fi -} - -getfilemounts() -{ - if [ -f /etc/auto.master ] ; then - cat /etc/auto.master | awk '{print $0}' | sed -e '/^#/d' -e '/^$/d' | ( - while read auto_master_in - do - if [ "`echo $auto_master_in | grep '^\+'`" = "" ]; then - echo $auto_master_in - else - cat /etc/auto.master | grep '^\+' | sed -e '/^#/d' -e '/^$/d' | ( - while read map options; do - catnismap `echo "$map" | sed -e 's/^\+//'` $options - done - ) - fi - done - ) - fi -} - -getnismounts() -{ - YPMAP=`catnismap auto.master` - if [ -z "$YPMAP" ]; then - catnismap - else - catnismap auto.master - fi -} - -getldapmounts() -{ - if [ -x /usr/lib/autofs/autofs-ldap-auto-master ]; then - [ ! -z $LDAPURI ] && export LDAPURI="$LDAPURI" - [ ! -z $LDAPBASE ] && export LDAPBASE="$LDAPBASE" - /usr/lib/autofs/autofs-ldap-auto-master 2> /dev/null - /usr/lib/autofs/autofs-ldap-auto-master -m automountMap \ - -e automount -n ou -k cn -v automountInformation 2> /dev/null - fi -} - -getrawmounts() -{ - for scheme in `getschemes` ; do - case "$scheme" in - files) - if [ -z "$filescheme" ] ; then - getfilemounts - filescheme=1 - export filescheme - fi - ;; - nis) - if [ -z "$nisscheme" ] ; then - getnismounts - nisscheme=1 - export nisscheme - fi - ;; - ldap*) - if [ -z "$ldapscheme" ] ; then - getldapmounts - ldapscheme=1 - export ldapscheme - fi - ;; - esac - done -} - - -# -# This function will build a list of automount commands to execute in -# order to activate all the mount points. It is used to figure out -# the difference of automount points in case of a reload -# -getmounts() -{ - local LC_ALL=C - export LC_ALL - knownmaps=" " - getrawmounts | ( - while read dir map options - do - # These checks screen out duplicates and skip over directories - # where the map is '-'. - # We can't do empty or direct host maps, so don't bother trying. - - # Strip trailing slashes from the dir line if it exists to aid - # in checking for duplicate maps - dir=`echo "$dir" | sed -e "s/\/*$//"` - - if [ ! -z "$map" -a "$map" = "-hosts" ] ; then - continue - fi - - if [ $DISABLE_DIRECT -eq 1 \ - -a x`echo $dir | grep -E "^/-"` != 'x' ] - then - continue - fi - - # If possible, canonicalise the path so it will always unmount - # cleanly. - link=`readlink -f "$dir"` - if [ ! -z "$link" ]; then - dir="$link" - fi - - # Do not include a map if it is a duplicate, maps on top of - # another map or another map, maps on top of it. - for knownmap in $knownmaps - do - if [ "`echo $dir/ | grep ^$knownmap`" != "" \ - -o "`echo $knownmap | grep ^$dir/`" != "" \] - then - continue 2 - fi - done - - if [ ! -z "$dir" -a ! -z "$map" \ - -a x`echo "$map" | cut -c1` != 'x-' ] - then - # If the options include a -t or --timeout, a -g or --ghost, - # a -v or --verbose or a -d or --debug paramter, then pull - # those particular options out. - : echo DAEMONOPTIONS OPTIONS $daemonoptions $options - startupoptions= - if echo "$options" | grep -qE -- '\B-(t\b|-timeout\b=)' ; - then - startupoptions="--timeout=$(echo $options |\ - sed 's/.*-\(t[^0-9]*\|-timeout\)[ \t=]*\([0-9][0-9]*\).*$/\2/g')" - elif echo "$daemonoptions" | grep -q -- '-t' ; - then - # It's okay to be sloppy with DAEMONOPTIONS as there is no - # possibility of conflicting with mount or map options. - startupoptions="--timeout=$(echo $daemonoptions | \ - sed 's/.*--*t\(imeout\)*[ \t=]*\([0-9][0-9]*\).*$/\2/g')" - fi - - # Check for the ghost option - if echo "$daemonoptions $options" | grep -qE -- '\B-(g\b|-ghost\b)' ; - then - startupoptions="$startupoptions --ghost" - fi - # Dont even deal with conflicts between --ghost and [no]browse - # Its just insane to configure things like that. - if echo "$options" | grep -qE -- '\B-browse\b' ; - then - startupoptions="$startupoptions --ghost" - fi - # Check for verbose - if echo "$daemonoptions $options" | \ - grep -qE -- '\B-(v\b|-verbose\b)' ; - then - startupoptions="$startupoptions --verbose" - fi - - # Check for debug - if echo "$daemonoptions $options" | \ - grep -qE -- '\B-(d\b|-debug\b)' ; - then - startupoptions="$startupoptions --debug" - fi - - # Other option flags are intended for maps. - mapoptions="$(echo "$daemonoptions $options" |\ - sed 's/-\(t[^0-9]*\|-timeout\)[ \t=]*\([0-9][0-9]*\)//g' | - sed 's/-\(g\b\|-ghost\b\)//g' | - sed 's/-\(v\b\|-verbose\b\)//g' | - sed 's/-\(d\b\|-debug\b\)//g' | - sed 's/-\b\(no\)\?browse\b//g')" - - # Break up the maptype and map, if the map type is specified - maptype=`echo $map | cut -f1 -d:` - # Handle degenerate map specifiers - if [ "$maptype" = "$map" ] ; then - if [ "$map" = "hesiod" -o "$map" = "userhome" -o "$map" = "ldap" ] ; then - maptype=$map - map= - elif [ "$map" = "multi" ] ; then - maptype=$map - map= -# elif echo "$map" | grep -q '^!'; then -# map=`echo "$map"| sed -e 's/^!//g'` - elif `echo $map | grep -q "^/"` && [ -x "$map" ]; then - maptype=program - elif [ -x "/etc/$map" ]; then - maptype=program - map=`echo /etc/$map | sed 's^//^/^g'` - elif `echo $map | grep -q "^/"` && [ -f "$map" ]; then - maptype=file - elif [ -f "/etc/$map" ]; then - maptype=file - map=`echo /etc/$map | sed 's^//^/^g'` - else - maptype=yp - if [ "$UNDERSCORETODOT" = "1" ] ; then - map=`basename $map | sed -e s/^auto_home/auto.home/ -e s/^auto_mnt/auto.mnt/` - else - map=`basename $map | sed 's^//^/^g'` - fi - fi - fi - map=`echo $map | cut -f2- -d:` - - : echo STARTUPOPTIONS $startupoptions - : echo DIR $dir - : echo MAPTYPE $maptype - : echo MAP $map - : echo MAPOPTIONS $mapoptions - : echo LOCALOPTIONS $localoptions - - NEWOPTIONS="" - for m in $mapoptions - do - if [ x"$m" = x"--" ]; then - NEWOPTIONS="$NEWOPTIONS $localoptions --" - else - NEWOPTIONS="$NEWOPTIONS $m" - fi - done - mapoptions=$NEWOPTIONS - - echo "$DAEMON $startupoptions $dir $maptype $map $mapoptions $localoptions" | sed -e 's/ / /g' -e 's/ */ /g' - - : echo ------------------------ - knownmaps=" $dir/ $knownmaps" - fi - done - ) -} - -# -# Status lister. -# -status() -{ - echo -e $"Configured Mount Points:\n------------------------" - getmounts - echo "" - echo -e $"Active Mount Points:\n--------------------" - ps axwww|grep "[0-9]:[0-9][0-9] $DAEMON " | ( - while read pid tt stat time command; do echo $command; done - ) -} - -get_command_from_pid() -{ - ps ax | grep "[0-9]:[0-9][0-9] $DAEMON " | ( - while read pid tt stat time command; do - if [ "$pid" = "$1" ] ; then - echo `echo "$command" | \ - sed 's/--pid-file.*\.pid/ /'` - return 0 - fi - done - ) - return 0 -} - -# return true if at least one pid is alive -alive() -{ - if [ -z "$*" ]; then - return 1 - fi - for i in $*; do - if kill -0 $i 2> /dev/null; then - return 0 - fi - done - - return 1 -} - -# -# Find pids of process group leaders -# -get_pgrp_pids() -{ - ps -eo pid,pgrp,cmd|grep $DAEMON|\ - awk '{print $1,$2}'|\ - while read pid pgrp - do - if [ $pid -eq $pgrp ] - then - echo $pid - fi - done -} - -# -# Signal each automount process group leader -# -signal_automounts() -{ - RETVAL=0 - pgrp_pids=`get_pgrp_pids` - for pid in $pgrp_pids - do - kill -USR2 $pid 2 > /dev/null - count=0 - while ps ax|grep -v grep|grep $pid >/dev/null - do - sleep 1 - count=$(expr $count + 1) - if [ $count -gt $DAEMON_EXIT_WAIT ]; then - break; - fi - done - done - - if [ -n "`pidof $DAEMON`" ] ; then - RETVAL=1 - fi - - return $RETVAL -} - -umount_loopback() -{ - loops=`LC_ALL=C awk '!/^#/ && $1 ~ /^\/dev\/loop/ && $2 != "/" {print $2}' /proc/mounts` - automounts=`LC_ALL=C awk '!/^#/ && $1 ~ /^automount/ {print $2}' /proc/mounts` - - for l in $loops - do - # If a loop device is mounted into a subdir of the automount point, - # umount it here. - for a in $automounts - do - match=`echo $l | grep -E "^$a[\$|/]" || true` - if [ -n "$match" ]; then - echo "" - echo -n $"Unmounting loopback filesystem $match: " - loopdev=`LC_ALL=C grep $l /proc/mounts | awk '{print $1}'` - umount -d $match - if [ $? -eq 0 ]; then - echo "done" - else - echo "failed ($?)" - fi - fi - done - done - - # If the loop device file exists under the automount point, umount - # it here. - loopmnts=`LC_ALL=C awk '!/^#/ && $1 ~ /^\/dev\/loop/ && $2 != "/" {print $1}' /proc/mounts` - for l in $loopmnts - do - loopmnt=`losetup $l | awk -F\( '{print $2}' | awk -F\) '{print $1}'` - for a in $automounts - do - match=`echo $loopmnt | grep -E "^$a[\$|/]" || true` - if [ -n "$match" ]; then - echo "" - echo -n $"Unmounting loopback filesystem $match: " - umount -d $match - if [ $? -eq 0 ]; then - echo "done" - else - echo "failed ($?)" - fi - fi - done - done -} - -# -# Redhat start/stop function. -# -redhat() -{ - -# -# See how we were called. -# -case "$1" in - start) - # Make sure the autofs filesystem type is available. - (grep -q autofs /proc/filesystems || /sbin/modprobe -k autofs4 || /sbin/modprobe -k autofs) 2> /dev/null - echo -n $"Starting $prog: " - TMP=`mktemp /tmp/autofs.XXXXXX` || { echo $"could not make temp file" >& 2; exit 1; } - getmounts | tee $TMP | sh - RETVAL=$? - if [ -s $TMP ] ; then - if [ $RETVAL -eq 0 ] ; then - success "$prog startup" - else - failure "$prog startup" - fi - [ $RETVAL = 0 ] && touch /var/lock/subsys/autofs - else - echo -n $"No Mountpoints Defined" - success "$prog startup" - fi - rm -f $TMP - echo - ;; - stop) - echo -n $"Stopping $prog:" - if [ -z "`pidofproc $prog`" -a -z "`getmounts`" ]; then - RETVAL=0 - else - umount_loopback - signal_automounts - RETVAL=$? - fi - count=0 - while [ -n "`/sbin/pidof $DAEMON`" -a $count -lt 10 ] ; do - killproc $DAEMON -USR2 >& /dev/null - RETVAL=$? - [ $RETVAL = 0 -a -z "`/sbin/pidof $DAEMON`" ] || sleep 3 - count=`expr $count + 1` - done - umount -a -f -t autofs - rm -f /var/lock/subsys/autofs - if [ -n "`/sbin/pidof $DAEMON`" ] ; then - failure "$prog shutdown" - else - success "$prog shutdown" - fi - echo - ;; - restart) - redhat stop - redhat start - ;; - reload) - if [ ! -f /var/lock/subsys/autofs ]; then - echo $"$prog not running" - RETVAL=1 - return - fi - echo $"Checking for changes to /etc/auto.master ...." - TMP1=`mktemp /tmp/autofs.XXXXXX` || { echo $"could not make temp file" >& 2; exit 1; } - TMP2=`mktemp /tmp/autofs.XXXXXX` || { echo $"could not make temp file" >& 2; exit 1; } - getmounts >$TMP1 - ps axwww|grep "[0-9]:[0-9][0-9] $DAEMON " | ( - while read pid tt stat time command; do - echo "$command" >>$TMP2 - if ! grep -q "^$command" $TMP1; then - if ! echo "$command" | grep -q -e --submount; then - kill -USR2 $pid 2> /dev/null - echo $"Stop $command" - fi - else - kill -HUP $pid 2> /dev/null - echo $"Reload map $command" - fi - done - ) - cat $TMP1 | ( while read x; do - if ! grep -q "^$x" $TMP2; then - $x - echo $"Start $x" - fi - done ) - rm -f $TMP1 $TMP2 - ;; - status) - status - ;; - condrestart) - [ -f /var/lock/subsys/autofs ] && redhat restart - RETVAL=0 - ;; - *) - echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}" - RETVAL=0 -esac -} - -# -# Debian start/stop functions. -# -debian() -{ - -case "$1" in -start) - echo -n 'Starting automounter:' - - # make sure autofs4 is loaded - if ! grep -q autofs /proc/filesystems - then - # autofs filesystem support not loaded - echo -n ' loading autofs4 kernel module,' - modprobe autofs4 || true - elif ([ -f /proc/modules ] && lsmod) | grep -q autofs[^4]; then - # wrong autofs filesystem module loaded - echo - echo "WARNING: autofs kernel module is loaded, autofs4 needed" - echo " for correct behaviour. You might experience mount failures." - fi - - # Check that maps exist - if [ -z "$(getrawmounts)" ] - then - echo " no automount maps defined." - exit 0 - fi - - # ensure pid file directory exists - if [ ! -e /var/run/autofs ] - then - mkdir /var/run/autofs - fi - - getmounts | while read cmd rest - do - mnt=`echo $rest | sed 's/^.* \(\/[^ ]*\) [A-Za-z].*$/\1/'` - pidfile=/var/run/autofs/`echo $mnt | sed 's,/,_,g'`.pid - - start-stop-daemon --start --pidfile $pidfile --quiet \ - --exec $DAEMON -- --pid-file=$pidfile $rest - - ret=$? - - if [ $ret -ne 0 ] - then - echo - echo " failed to start automount point $mnt" - fi - done - - echo " done." - ;; -stop) - echo -n 'Stopping automounter:' - - umount_loopback - - any=0 - for file in `ls /var/run/autofs/*.pid 2>/dev/null` - do - if [ -e "$file" ] - then - any=1 - pid=`head -n 1 $file` - mnt=`ps -wwo 'cmd=' $pid | sed -e \ - 's,.* --pid-file=/var/run/autofs/\([^ ]*\)\.pid.*,\1,; s,_,/,g'` - dname=`basename $DAEMON` - - start-stop-daemon --stop --quiet \ - --retry USR2/$DAEMON_EXIT_WAIT \ - --pidfile $file --name $dname - - ret=$? - - case $ret in - 0) -# echo -n " $mnt" - rm -f $file - ;; - 1) - echo -n -e "\n No process for automount $mnt" - rm -f $file - ;; - 2) - echo -n -e "\n Couldn't stop automount for $mnt" - ;; - *) - echo -n -e \ - "\n Strange start-stop-daemon exit status: $ret" - ;; - esac - fi - done - - echo " done." - ;; -reload) - echo "Reloading automounter: checking for changes ... " - - TMP1=`mktemp -t autofs.XXXXXX` - TMP2=`mktemp -t autofs.XXXXXX` - - getmounts >$TMP1 - - for i in `ls /var/run/autofs/*.pid 2>/dev/null` - do - pid=`head -n 1 $i 2>/dev/null` - [ "$pid" = "" ] && continue - - cmd=`get_command_from_pid $pid` - echo $cmd >>$TMP2 - - mnt=`ps -wwo 'cmd=' $pid | sed -e \ - 's,.* --pid-file=/var/run/autofs/\([^ ]*\)\.pid.*,\1,; s,_,/,g'` - - if ! grep -q "$cmd" $TMP1; then - echo "Stopping automounter for: $mnt" - kill -USR2 $pid 2> /dev/null - else - echo "Reloading automounter map for: $mnt" - kill -HUP $pid 2> /dev/null - fi - done - - cat $TMP1 | (while read x; do - if ! grep -q "^$x" $TMP2; then - echo $x | while read cmd rest; do - - mnt=`echo $rest | sed 's/^.* \(\/[^ ]*\) [A-Za-z].*$/\1/'` - pidfile=/var/run/autofs/`echo $mnt | sed 's,/,_,g'`.pid - - start-stop-daemon --start --pidfile $pidfile --quiet \ - --exec $DAEMON -- --pid-file=$pidfile $rest - - ret=$? - - if [ $ret -ne 0 ] - then - echo - echo " failed to start automount point $mnt" - else - echo "Started automounter: $mnt" - fi - done - fi - done) - - rm -f $TMP1 $TMP2 - ;; -force-reload|restart) - debian stop - debian start - ;; -status) - status - ;; -getmounts) - getmounts - ;; -active) - alive - ;; -*) - echo "Usage: $initdir/autofs {start|stop|restart|reload|status|getmounts|active}" >&2 - exit 1 - ;; -esac -} - -RETVAL=0 -if [ $system = debian ]; then - debian "$@" -elif [ $system = redhat ]; then - redhat "$@" -fi - -exit $RETVAL diff --git a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/cross.patch b/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/cross.patch deleted file mode 100644 index f27cc0a..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs-4.1.4/cross.patch +++ /dev/null @@ -1,42 +0,0 @@ -Index: autofs-4.1.4/aclocal.m4 -=================================================================== ---- autofs-4.1.4.orig/aclocal.m4 -+++ autofs-4.1.4/aclocal.m4 -@@ -9,6 +9,8 @@ dnl ------------------------------------ - AC_DEFUN(AF_PATH_INCLUDE, - [AC_PATH_PROGS($1,$2,$3,$4) - if test -n "$$1"; then -+ AH_TEMPLATE([HAVE_$1], [Have $2]) -+ AH_TEMPLATE([PATH_$1], [Have $2]) - AC_DEFINE(HAVE_$1,1,[define if you have $1]) - AC_DEFINE_UNQUOTED(PATH_$1, "$$1", [define if you have $1]) - HAVE_$1=1 -Index: autofs-4.1.4/configure.in -=================================================================== ---- autofs-4.1.4.orig/configure.in -+++ autofs-4.1.4/configure.in -@@ -135,12 +135,14 @@ AC_PROG_CC - cat > pietest.c < -d root root 0700 /var/run/autofs none diff --git a/meta-openvuplus/recipes-base/autofs/autofs_4.1.4.bb b/meta-openvuplus/recipes-base/autofs/autofs_4.1.4.bb deleted file mode 100644 index f8d9bff..0000000 --- a/meta-openvuplus/recipes-base/autofs/autofs_4.1.4.bb +++ /dev/null @@ -1,80 +0,0 @@ -SUMMARY = "kernel-based automounter for Linux" -SECTION = "base" -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://COPYING;md5=0636e73ff0215e8d672dc4c32c317bb3" -PR = "r10" - -SRC_URI = "${KERNELORG_MIRROR}/linux/daemons/autofs/v4/${BP}.tar.bz2 \ - file://020_auto_net_path_sortlocale_mountoptions.patch \ - file://037_let_debian_rules_decide_on_CFLAGS.patch \ - file://042_default_auto_master_all_commented_out.patch \ - file://060_non_replicated_ping.patch \ - file://061_multi_parse_fix.patch \ - file://062_fix_memory_leak.patch \ - file://063_misc_fixes.patch \ - file://064_support_options_on_nis_maps.patch \ - file://065_fix_master_map_in_ldap.patch \ - file://066_canonicalise_mount_points.patch \ - file://067_allow_disabling_bind_mounts.patch \ - file://067_ldap_no_first_message.patch \ - file://068_fix_invalid_rpcgen_code.patch \ - file://069_support_spaces_in_smb_share_names.patch \ - file://070_fix_regex_typo.patch \ - file://071_fix_ldap_mounts.patch \ - file://072_fix_auto_net_sort.patch \ - file://073_configurable_locking.patch \ - file://074_auto_smb_cifs.patch \ - file://075_auto_net_escape_hash.patch \ - file://076_ldap_deprecated.patch \ - file://078_locking_fix_1.patch \ - file://079_no_unlink_upstream.patch \ - file://080_auto_smb_probe_credentials.patch \ - file://081_auto_net_showmount_quotes.patch \ - file://082_samples_makefile_typo.patch \ - file://083_clarify_program_map_outputsyntax.patch \ - file://084_init_lsb_header.patch \ - file://085_auto_net_lp111612.patch \ - file://cross.patch \ - file://Makefile.rules-cross.patch \ - file://install.patch \ - file://no-bash.patch \ - file://auto.hotplug \ - file://auto.master \ - file://auto.network \ - file://autofs.default \ - file://autofs.init \ - file://volatiles.99_autofs \ -" -SRC_URI[md5sum] = "7e3949114c00665b4636f0c318179657" -SRC_URI[sha256sum] = "e25caa0e9639ea54dd7c4f21e8146ac9859a61fa126f397edf874b5fdc147430" - -S = "${WORKDIR}/${BP}" - -inherit autotools update-rc.d - -do_configure_prepend () { - if [ ! -e acinclude.m4 ]; then - cp aclocal.m4 acinclude.m4 - fi -} -do_install () { - oe_runmake 'INSTALLROOT=${D}' install - install -d ${D}${sysconfdir}/default - install -m 644 ${WORKDIR}/autofs.default ${D}${sysconfdir}/default/autofs - install -d ${D}${sysconfdir}/init.d - install -m 755 ${WORKDIR}/autofs.init ${D}${sysconfdir}/init.d/autofs - install -m 644 ${WORKDIR}/auto.hotplug ${D}${sysconfdir}/auto.hotplug - install -m 644 ${WORKDIR}/auto.master ${D}${sysconfdir}/auto.master - install -m 644 ${WORKDIR}/auto.network ${D}${sysconfdir}/auto.network - install -d ${D}${sysconfdir}/default/volatiles - install -m 644 ${WORKDIR}/volatiles.99_autofs ${D}${sysconfdir}/default/volatiles/99_autofs -} - -RDEPENDS_${PN} = "procps" - -INITSCRIPT_NAME = "autofs" -INITSCRIPT_PARAMS = "defaults" - -PARALLEL_MAKE = "" - -INSANE_SKIP_${PN} = "dev-so" diff --git a/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps.bb b/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps.bb deleted file mode 100644 index 4ab2603..0000000 --- a/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps.bb +++ /dev/null @@ -1,18 +0,0 @@ -DESCRIPTION = "Dreambox Keyboard Keymap files" -LICENSE = "GPL" -LIC_FILES_CHKSUM = "file://${THISDIR}/${PN}/GPL-1.0;md5=e9e36a9de734199567a4d769498f743d" -MAINTAINER = "Felix Domke " - -SRC_URI = "file://dream-de.info file://dream-de.kmap file://eng.info file://eng.kmap" - -PR = "r1" - -FILES_${PN} = "/" -PACKAGE_ARCH = "all" - -do_install() { - install -d ${D}/usr/share/keymaps - for x in dream-de.info dream-de.kmap eng.info eng.kmap; do - install -m 0644 ${WORKDIR}/$x ${D}/usr/share/keymaps/$x - done -} diff --git a/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/GPL-1.0 b/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/GPL-1.0 deleted file mode 100644 index 9d4ef93..0000000 --- a/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/GPL-1.0 +++ /dev/null @@ -1,252 +0,0 @@ - -GNU General Public License, version 1 - - GNU GENERAL PUBLIC LICENSE - Version 1, February 1989 - - Copyright (C) 1989 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The license agreements of most software companies try to keep users -at the mercy of those companies. By contrast, our General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. The -General Public License applies to the Free Software Foundation`s -software and to any other program whose authors commit to using it. -You can use it for your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Specifically, the General Public License is designed to make -sure that you have the freedom to give away or sell copies of free -software, that you receive source code or can get it if you want it, -that you can change the software or use pieces of it in new free -programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of a such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must tell them their rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author`s protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors` reputations. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any program or other work which -contains a notice placed by the copyright holder saying it may be -distributed under the terms of this General Public License. The -"Program", below, refers to any such program or work, and a "work based -on the Program" means either the Program or any work containing the -Program or a portion of it, either verbatim or with modifications. Each -licensee is addressed as "you". - - 1. You may copy and distribute verbatim copies of the Program`s source -code as you receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice and -disclaimer of warranty; keep intact all the notices that refer to this -General Public License and to the absence of any warranty; and give any -other recipients of the Program a copy of this General Public License -along with the Program. You may charge a fee for the physical act of -transferring a copy. - - 2. You may modify your copy or copies of the Program or any portion of -it, and copy and distribute such modifications under the terms of Paragraph -1 above, provided that you also do the following: - - a) cause the modified files to carry prominent notices stating that - you changed the files and the date of any change; and - - b) cause the whole of any work that you distribute or publish, that - in whole or in part contains the Program or any part thereof, either - with or without modifications, to be licensed at no charge to all - third parties under the terms of this General Public License (except - that you may choose to grant warranty protection to some or all - third parties, at your option). - - c) If the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the simplest and most usual way, to print or display an - announcement including an appropriate copyright notice and a notice - that there is no warranty (or else, saying that you provide a - warranty) and that users may redistribute the program under these - conditions, and telling the user how to view a copy of this General - Public License. - - d) You may charge a fee for the physical act of transferring a - copy, and you may at your option offer warranty protection in - exchange for a fee. - -Mere aggregation of another independent work with the Program (or its -derivative) on a volume of a storage or distribution medium does not bring -the other work under the scope of these terms. - - 3. You may copy and distribute the Program (or a portion or derivative of -it, under Paragraph 2) in object code or executable form under the terms of -Paragraphs 1 and 2 above provided that you also do one of the following: - - a) accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of - Paragraphs 1 and 2 above; or, - - b) accompany it with a written offer, valid for at least three - years, to give any third party free (except for a nominal charge - for the cost of distribution) a complete machine-readable copy of the - corresponding source code, to be distributed under the terms of - Paragraphs 1 and 2 above; or, - - c) accompany it with the information you received as to where the - corresponding source code may be obtained. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form alone.) - -Source code for a work means the preferred form of the work for making -modifications to it. For an executable file, complete source code means -all the source code for all modules it contains; but, as a special -exception, it need not include source code for modules which are standard -libraries that accompany the operating system on which the executable -file runs, or for standard header files or definitions files that -accompany that operating system. - - 4. You may not copy, modify, sublicense, distribute or transfer the -Program except as expressly provided under this General Public License. -Any attempt otherwise to copy, modify, sublicense, distribute or transfer -the Program is void, and will automatically terminate your rights to use -the Program under this License. However, parties who have received -copies, or rights to use copies, from you under this General Public -License will not have their licenses terminated so long as such parties -remain in full compliance. - - 5. By copying, distributing or modifying the Program (or any work based -on the Program) you indicate your acceptance of this license to do so, -and all its terms and conditions. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the original -licensor to copy, distribute or modify the Program subject to these -terms and conditions. You may not impose any further restrictions on the -recipients` exercise of the rights granted herein. - - 7. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of the license which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -the license, you may choose any version ever published by the Free Software -Foundation. - - 8. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to humanity, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is safest to -attach them to the start of each source file to most effectively convey -the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19xx name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w`. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c` for details. - -The hypothetical commands `show w` and `show c` should show the -appropriate parts of the General Public License. Of course, the -commands you use may be called something other than `show w` and `show -c`; they could even be mouse-clicks or menu items--whatever suits your -program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - program `Gnomovision` (a program to direct compilers to make passes - at assemblers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -That`s all there is to it! - diff --git a/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/dream-de.info b/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/dream-de.info deleted file mode 100644 index d7f5b07..0000000 --- a/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/dream-de.info +++ /dev/null @@ -1,2 +0,0 @@ -kmap=dream-de.kmap -name=Dreambox Keyboard Deutsch diff --git a/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/dream-de.kmap b/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/dream-de.kmap deleted file mode 100644 index 693317a781145b060e19509cb4b353d69b7a58d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2823 zcmd^>*-{%v6o&uPt=9alBLQOHf(@9>;C;6--uHdqV#i?P4P)aKV`Ka-sZ`}QmE{fc z47o~GZt@Jd%0*fui9#Su2)>J^q?w+XbEd!k&-q6qW1~~!!xJKc*)RTo9|N>t6E)tCBO-|HKFtj~2q|3<%&$mp=X();>AAL=80qGS40 z|I$A(7y+F+rSJ5fzSR+ZrsEjEdaR3J(~-q$6X8z0>Q)lsBq@ zHf6;cYb|W0NrssYN=npV?q(|@V>4)t#5k!CrRN1V2 zH8(bY9QfPOf$y;fUFgOJ^r8=Yu@84+{tJ3dkLX3ctT*+Fp3rl8UVq2hnE!xY(!+XG zkLhtesi*X`{-(cTDDd~_4ZW_1^r{}zvw8-5up8gZ;r}6?Ri#u(R;r~&+GJJWw@dI3 z$!cjYC791|w8(E#|BgSG4?p6k!fJfLE!@UOd|ept*GYU=s(-kDro8@fuIVUb%;}GB z^ZMhL+<6B5eSHu(=+8SY?J};?Rk^IIb~Ucn)%jXueAZX{8sFe6e5J4Qjb44)XMC!l z|Fo-j4f%N$e|=MAeBDa)kLMh^Al|nX^A`8Wq5%%os6{jC;8BUH_*$rc2x^c(5)p_L z6zP0ajvq~EghhQgtU#uCKCXX+`frmC>69+%mLBPqK3OaMLI1?(^$!mmkafkG<@fXT zUw-|U=9@qIa{O48umA9buykcM8Z5=XFlxp8GYfMfxCC1B=f51k31yPgKjd9Dze(r( zuiW-|{t#CZRnGs|!cE-FE!@g&+|C``$z9wS`t@giqUQ@va+ELmn(z6BkNKPv;aWd4 zk>N03@jf5$As_Jx$M`h=w9pQnoZ>s)<6DmK8OJ%m^|}7f@#p&A!HI#hF5#R@y2#PR z{_i7CAN=1Zyz{~TeRwT+>kIzRL6>r6{htN@H`UT;s!Vnn{y!7=+u0GA*077++`wM; zaWD7rZp?py*LZ{%d6_qPg(rB9=fl0R|MLJZ@i33_7?1NLPx16De-Cf)IuG$G5ArO} za1VF0;Qu-PQdJ70CF`F<3*++o7x@>y|4Jju=s&Oi`GL21n;%*5f9@}*f5;mAZ*l#@ z3YF-epT&Q#|GfWmx|Ak2S}}jz9|U9nUznd+Hqfz}wQOcx=!Z(q`agv=OfboaWQxi; l{?8^h(z2e06)f?8hW=lq{ulMXV*f8y|MT@X>81Yv`~zCTk&^%b diff --git a/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/eng.info b/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/eng.info deleted file mode 100644 index d73372c..0000000 --- a/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/eng.info +++ /dev/null @@ -1,2 +0,0 @@ -kmap=eng.kmap -name=Keyboard English diff --git a/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/eng.kmap b/meta-openvuplus/recipes-base/dreambox-keymaps/dreambox-keymaps/eng.kmap deleted file mode 100644 index 15a722f164e16e74b016786d85e82a94ecdda36f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2823 zcmd^>`F9jW6ov1rn(DqaZ}v5-D4>7>vM&-41qIwt7C{M00$~e*Kp>C=n17wBo{R)= z5;-1zN>^8%Is_7JdpLqExRwIrx~R|ey3XsQ z-q#sy$4-2i!WL4Ck4>7bxe+Tlagsz{gAPw4OZt^T4vV+_ae^$PyLkv&&Q%2JW4)TD0e0d;l$WBvFIdi+Lv{3ie3_~R?*G6YOd}Yt{L<6ypDn QLBIXq@B3#8YyJPc0_5grSpWb4 diff --git a/meta-openvuplus/recipes-base/fakelocale/fakelocale.bb b/meta-openvuplus/recipes-base/fakelocale/fakelocale.bb deleted file mode 100644 index aa50ca6..0000000 --- a/meta-openvuplus/recipes-base/fakelocale/fakelocale.bb +++ /dev/null @@ -1,48 +0,0 @@ -SUMMARY = "Fake locale support" -LICENSE = "CLOSED" -SECTION = "base" -PRIORITY = "required" -PR = "r3" - -SRC_URI = "http://sources.dreamboxupdate.com/download/opendreambox/fakelocale.tar.gz file://locale.alias" -SRC_URI[md5sum] = "d11a901c9e4dc2947cbc560044de2b67" -SRC_URI[sha256sum] = "b424804aff7a23efaa1fa25d27a55ac25173d0e7e95d07fe31096250bb498cc6" - -S = "${WORKDIR}/fakelocale" - -inherit allarch - -LOCALEDIR = "${libdir}/locale" -LOCALEDIR2 = "/usr/share/locale" - -LANGUAGES = "ar_AE cs_CZ da_DK de_DE el_GR es_ES et_EE fi_FI fr_FR fy_FY hr_HR \ - hu_HU is_IS it_IT lt_LT nl_NL no_NO pl_PL pt_PT ro_RO ru_RU sk_SK sl_SI \ - sr_YU sv_SE tr_TR ur_IN" - -RPROVIDES = "virtual-locale-ar virtual-locale-cs virtual-locale-da \ - virtual-locale-de virtual-locale-el virtual-locale-es virtual-locale-et \ - virtual-locale-fi virtual-locale-fr virtual-locale-fy virtual-locale-hr \ - virtual-locale-hu virtual-locale-is virtual-locale-it virtual-locale-lt \ - virtual-locale-nl virtual-locale-no virtual-locale-pl virtual-locale-pt \ - virtual-locale-ro virtual-locale-ru virtual-locale-sk virtual-locale-sl \ - virtual-locale-sr virtual-locale-sv virtual-locale-tr virtual-locale-ur" - -LOCALE_FILES = " LC_TIME LC_TELEPHONE LC_PAPER LC_NUMERIC LC_NAME LC_MONETARY LC_MESSAGES/SYS_LC_MESSAGES LC_MEASUREMENT \ - LC_IDENTIFICATION LC_CTYPE LC_COLLATE LC_ADDRESS" - -do_install() { - install -d ${D}${LOCALEDIR}/fake/LC_MESSAGES - install -d ${D}${LOCALEDIR2} - - for x in ${LOCALE_FILES}; do - install ${S}/$x ${D}${LOCALEDIR}/fake/$x - done - - for lang in ${LANGUAGES}; do - ln -s fake ${D}${LOCALEDIR}/${lang} - done - - install ${WORKDIR}/locale.alias ${D}${LOCALEDIR2} -} - -FILES_${PN} = "${LOCALEDIR} ${LOCALEDIR2}" diff --git a/meta-openvuplus/recipes-base/fakelocale/files/locale.alias b/meta-openvuplus/recipes-base/fakelocale/files/locale.alias deleted file mode 100644 index b66b1eb..0000000 --- a/meta-openvuplus/recipes-base/fakelocale/files/locale.alias +++ /dev/null @@ -1,28 +0,0 @@ -English C -Arabic ar_AE -Czech cs_CZ -Danish da_DK -Deutsch de_DE -Ellinika el_GR -Spanish es_ES -Estonian et_EE -Suomi fi_FI -French fr_FR -Frisian fy_FY -Croatia hr_HR -Hungarian hu_HU -Icelandic is_IS -Italian it_IT -Lithuanian lt_LT -Dutch nl_NL -Norwegian no_NO -Polish pl_PL -Portugues pt_PT -Romania ro_RO -Russian ru_RU -Slovakian sk_SK -Slovenian sl_SI -Serbian sr_YU -Svenska sv_SE -Turkish tr_TR -Urdu ur_IN \ No newline at end of file diff --git a/meta-openvuplus/recipes-base/firmwares/files/Marvell-Licence.txt b/meta-openvuplus/recipes-base/firmwares/files/Marvell-Licence.txt deleted file mode 100644 index 87035b0..0000000 --- a/meta-openvuplus/recipes-base/firmwares/files/Marvell-Licence.txt +++ /dev/null @@ -1,40 +0,0 @@ -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 deleted file mode 100644 index 1d02c51..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-drxd-a2.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 004fd4a..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-af9005.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 03916f5..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-fe-af9013.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 0079bd2..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9015.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 7097f6d..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9035.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 193c763..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-avertv-a800.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 431bc48..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dib0700.bb +++ /dev/null @@ -1,12 +0,0 @@ -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 deleted file mode 100644 index 5298eb3..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dibusb.bb +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 570241e..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-digitv.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 7a6c1d4..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ec168.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index bd5a261..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-nova-t-usb2.bb +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 221497a..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-hcw-dvbt.bb +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index aeaf2a0..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-nova-dvbt.bb +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 62292cc..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ttusb-budget.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index d53b9db..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-umt-010.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 1eebc64..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-wt220u-zl0353.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 67a4b19..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-xc5000.bb +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 25e68b6..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb.bb +++ /dev/null @@ -1,13 +0,0 @@ - -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 deleted file mode 100644 index 359057b..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-htc9271.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 6418604..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-rt2561.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index a9357c0..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-rt3070.bb +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 1cae3f9..0000000 --- a/meta-openvuplus/recipes-base/firmwares/firmware-rtl8721u.bb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 4c23ccf..0000000 --- a/meta-openvuplus/recipes-base/firmwares/linux-firmware.inc +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index c7bf76837ab758b8ff44ca64c93da5078999a725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92016 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 `P! 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 LN{HY#00;sAY$h2e 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 deleted file mode 100644 index 9fdfd6f..0000000 --- a/meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw_9.70.3-p37.bb +++ /dev/null @@ -1,20 +0,0 @@ -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 deleted file mode 100644 index 3efd73fdb57d6434c63cf435ea02347a4b2d489f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88003 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 does not define.])], [#include ]) - -@@ -29,6 +30,8 @@ - AM_GNU_GETTEXT - #AM_GNU_GETTEXT([external]) - -+AC_CHECK_FUNCS([bindtextdomain textdomain iconv]) -+ - dnl reasonable guesses for where stuff is installed - dnl if we don't do that now, the config.h will use ${prefix} - dnl for DEFAULT_DATABASE_PATH. -diff -ru hddtemp-0.3-beta15.orig/src/hddtemp.c hddtemp-0.3-beta15/src/hddtemp.c ---- hddtemp-0.3-beta15.orig/src/hddtemp.c 2006-04-19 03:37:35.000000000 +0100 -+++ hddtemp-0.3-beta15/src/hddtemp.c 2008-06-26 23:59:40.000000000 +0100 -@@ -276,8 +276,12 @@ - backtrace_sigbus(); - - setlocale (LC_ALL, ""); -+#ifdef HAVE_BINDTEXTDOMAIN - bindtextdomain (PACKAGE, LOCALEDIR); -+#endif -+#ifdef HAVE_TEXTDOMAIN - textdomain (PACKAGE); -+#endif - - show_db = debug = numeric = quiet = wakeup = af_hint = syslog_interval = 0; - unit = DEFAULT; -diff -ru hddtemp-0.3-beta15.orig/src/utf8.c hddtemp-0.3-beta15/src/utf8.c ---- hddtemp-0.3-beta15.orig/src/utf8.c 2006-04-19 03:37:02.000000000 +0100 -+++ hddtemp-0.3-beta15/src/utf8.c 2008-06-27 00:02:15.000000000 +0100 -@@ -23,7 +23,9 @@ - - // Standard includes - #include -+#ifdef HAVE_ICONV_H - #include -+#endif - #include - #include - #include -@@ -34,6 +36,7 @@ - - static char *iconv_from_utf8_to_locale(const char *string, const char* fallback_string) - { -+#ifdef HAVE_ICONV - const size_t buffer_inc = 80; // Increment buffer size in 80 bytes step - const char *charset; - iconv_t cd; -@@ -93,6 +96,8 @@ - if (dest_buffer != NULL) - free(dest_buffer); // free buffer - free(src_buffer); // free string -+#endif -+ - return strdup(fallback_string); // and return fallback string - } - diff --git a/meta-openvuplus/recipes-base/hddtemp/hddtemp_0.3-beta15.bb b/meta-openvuplus/recipes-base/hddtemp/hddtemp_0.3-beta15.bb deleted file mode 100644 index 8ef9a2c..0000000 --- a/meta-openvuplus/recipes-base/hddtemp/hddtemp_0.3-beta15.bb +++ /dev/null @@ -1,22 +0,0 @@ -SUMMARY = "Hard disk temperature monitor daemon" -SECTION = "console/network" -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://GPL-2;md5=eb723b61539feef013de476e68b5c50a" -PR = "r1" - -SRC_URI = "http://download.savannah.nongnu.org/releases/${PN}/${PN}-${PV}.tar.bz2;name=tar \ - http://download.savannah.nongnu.org/releases/${PN}/hddtemp.db;name=db \ - file://hddtemp-no-nls-support.patch" -SRC_URI[tar.md5sum] = "8b829339e1ae9df701684ec239021bb8" -SRC_URI[tar.sha256sum] = "618541584054093d53be8a2d9e81c97174f30f00af91cb8700a97e442d79ef5b" -SRC_URI[db.md5sum] = "5321858f8c028d4b1a91a8a5f951f2f8" -SRC_URI[db.sha256sum] = "8b19e70228214562eb10a46bd73b6ea8601e996f2d6527907b560d35b33f5240" - -inherit autotools gettext - -FILES_${PN} += "/usr/share/misc/hddtemp.db" - -do_install_append() { - install -d ${D}/usr/share/misc/ - install -m 0644 ${WORKDIR}/hddtemp.db ${D}/usr/share/misc/hddtemp.db -} diff --git a/meta-openvuplus/recipes-base/joe/joe_3.7.bb b/meta-openvuplus/recipes-base/joe/joe_3.7.bb deleted file mode 100644 index 436fd07..0000000 --- a/meta-openvuplus/recipes-base/joe/joe_3.7.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "Console text editor with good functionality, good choice for vi-haters." -HOMEPAGE = "http://joe-editor.sourceforge.net/" -SECTION = "console/utils" -LICENSE = "GPL-1.0" -LIC_FILES_CHKSUM = "file://COPYING;md5=da10ed7cf8038981c580e11c1d3e8fb6" -PR = "r2" - -SRC_URI = "${SOURCEFORGE_MIRROR}/joe-editor/joe-${PV}.tar.gz" -SRC_URI[md5sum] = "66de1b073e869ba12abbfcde3885c577" -SRC_URI[sha256sum] = "cae456e1ad5a8c1d3c94920a3416c2347277739b260e3494d3bc0f2b9b73106f" - -inherit autotools - -RDEPENDS_${PN} = "ncurses-terminfo" diff --git a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-extfs-dir.patch b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-extfs-dir.patch deleted file mode 100644 index aebb31e..0000000 --- a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-extfs-dir.patch +++ /dev/null @@ -1,18 +0,0 @@ -Upstream-Status: Inappropriate [Configuration] - -Don't show "Warning: cannot open /usr/libexec/mc/extfs.d directory", -because it's packaged separately. - -Signed-off-by: Andreas Oberritter - ---- mc-4.8.1/src/vfs/extfs/extfs.c.orig 2012-05-10 15:50:04.633833530 +0200 -+++ mc-4.8.1/src/vfs/extfs/extfs.c 2012-05-10 15:50:20.349833289 +0200 -@@ -1558,8 +1558,6 @@ - * appear on screen. */ - if (dir == NULL) - { -- if (!silent) -- fprintf (stderr, _("Warning: cannot open %s directory\n"), dirname); - g_free (dirname); - return FALSE; - } diff --git a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-hints.patch b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-hints.patch deleted file mode 100644 index a0ccdcd..0000000 --- a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-hints.patch +++ /dev/null @@ -1,17 +0,0 @@ -Upstream-Status: Pending - -Fixes a text drawing issue if hints are unavailable. - -Signed-off-by: Andreas Oberritter - ---- mc-4.8.1/src/filemanager/midnight.c.orig 2012-05-10 15:30:56.645804130 +0200 -+++ mc-4.8.1/src/filemanager/midnight.c 2012-05-10 15:31:27.601804920 +0200 -@@ -1587,7 +1587,7 @@ - { - char text[BUF_SMALL]; - -- g_snprintf (text, sizeof (text), _("GNU Midnight Commander %s\n"), VERSION); -+ g_snprintf (text, sizeof (text), _("GNU Midnight Commander %s"), VERSION); - set_hintbar (text); - } - } diff --git a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-sfs-ini.patch b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-sfs-ini.patch deleted file mode 100644 index fd5afd3..0000000 --- a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-sfs-ini.patch +++ /dev/null @@ -1,17 +0,0 @@ -Upstream-Status: Inappropriate [Configuration] - -Don't show "sfs_init(): Warning: file /etc/mc/sfs.ini not found", -because it's packaged separately. - -Signed-off-by: Andreas Oberritter - ---- mc-4.8.1/src/vfs/sfs/sfs.c.orig 2012-05-10 15:48:05.405830465 +0200 -+++ mc-4.8.1/src/vfs/sfs/sfs.c 2012-05-10 15:48:24.389830919 +0200 -@@ -419,7 +419,6 @@ - - if (cfg == NULL) - { -- fprintf (stderr, _("%s: Warning: file %s not found\n"), "sfs_init()", mc_sfsini); - g_free (mc_sfsini); - return 0; - } diff --git a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-syntax-file.patch b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-syntax-file.patch deleted file mode 100644 index ee0ee46..0000000 --- a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-syntax-file.patch +++ /dev/null @@ -1,18 +0,0 @@ -Upstream-Status: Inappropriate [Configuration] - -Don't show an error message if the syntax file can't -be opened, because it's packaged separately. - -Signed-off-by: Andreas Oberritter - ---- mc-4.8.1/src/editor/syntax.c.orig 2011-12-12 10:15:38.000000000 +0100 -+++ mc-4.8.1/src/editor/syntax.c 2012-05-10 15:07:56.517768788 +0200 -@@ -1522,8 +1522,6 @@ - if (r == -1) - { - edit_free_syntax_rules (edit); -- message (D_ERROR, _("Load syntax file"), -- _("Cannot open file %s\n%s"), f, unix_error_string (errno)); - } - else if (r != 0) - { diff --git a/meta-openvuplus/recipes-base/mc/mc_4.8.1.bbappend b/meta-openvuplus/recipes-base/mc/mc_4.8.1.bbappend deleted file mode 100644 index 73b41c6..0000000 --- a/meta-openvuplus/recipes-base/mc/mc_4.8.1.bbappend +++ /dev/null @@ -1,26 +0,0 @@ -PR .= "-vuplus0" - -SRC_URI += "file://optional-extfs-dir.patch \ - file://optional-hints.patch \ - file://optional-sfs-ini.patch \ - file://optional-syntax-file.patch" - -PACKAGES += "${PN}-full" - -RDEPENDS_${PN} = "" -RDEPENDS_${PN}-full = "ncurses-terminfo" - -RSUGGESTS_${PN} = "${PN}-full" - -FILES_${PN} = " \ - ${bindir}/* \ - ${sysconfdir}/mc/filehighlight.ini \ - ${sysconfdir}/mc/*.ext \ - ${sysconfdir}/mc/*.keymap \ - ${sysconfdir}/mc/*.menu \ - ${datadir}/${BPN}/mc.* \ - ${datadir}/${BPN}/skins/default.ini \ -" -FILES_${PN}-full = "${libexecdir}/* ${sysconfdir} ${datadir}/${BPN}" - -FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" diff --git a/meta-openvuplus/recipes-base/mtd/mtd-utils-1.4.9/disable-ubi.patch b/meta-openvuplus/recipes-base/mtd/mtd-utils-1.4.9/disable-ubi.patch deleted file mode 100644 index d9384d9..0000000 --- a/meta-openvuplus/recipes-base/mtd/mtd-utils-1.4.9/disable-ubi.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- mtd-utils-1.4.9.org/Makefile 2012-04-02 11:41:10.339446661 +0200 -+++ mtd-utils-1.4.9/Makefile 2012-04-02 11:40:33.659447111 +0200 -@@ -30,13 +30,13 @@ - ubidetach ubinize ubiformat ubirename mtdinfo ubirsvol - - BINS = $(MTD_BINS) --BINS += mkfs.ubifs/mkfs.ubifs --BINS += $(addprefix ubi-utils/,$(UBI_BINS)) -+#BINS += mkfs.ubifs/mkfs.ubifs -+#BINS += $(addprefix ubi-utils/,$(UBI_BINS)) - SCRIPTS = flash_eraseall - - TARGETS = $(BINS) - TARGETS += lib/libmtd.a --TARGETS += ubi-utils/libubi.a -+#TARGETS += ubi-utils/libubi.a - - OBJDEPS = $(BUILDDIR)/include/version.h - diff --git a/meta-openvuplus/recipes-base/mtd/mtd-utils_1.4.9.bbappend b/meta-openvuplus/recipes-base/mtd/mtd-utils_1.4.9.bbappend deleted file mode 100644 index 6eb3342..0000000 --- a/meta-openvuplus/recipes-base/mtd/mtd-utils_1.4.9.bbappend +++ /dev/null @@ -1,7 +0,0 @@ -PR .= "-vuplus0" - -FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" - -DREAMBOX_KERNEL_VERSION = "3.2" - -SRC_URI += "${@base_version_less_or_equal('DREAMBOX_KERNEL_VERSION', '2.6.18', 'file://disable-ubi.patch', '', d)}" diff --git a/meta-openvuplus/recipes-base/ncdu/ncdu_1.8.bb b/meta-openvuplus/recipes-base/ncdu/ncdu_1.8.bb deleted file mode 100644 index 75e0641..0000000 --- a/meta-openvuplus/recipes-base/ncdu/ncdu_1.8.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "NCurses Disk Usage" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://COPYING;md5=321d4ec4e1e7746028446d003a975868" -DEPENDS = "ncurses" -PR = "r1" - -SRC_URI = "http://dev.yorhel.nl/download/ncdu-${PV}.tar.gz" -SRC_URI[md5sum] = "94d7a821f8a0d7ba8ef3dd926226f7d5" -SRC_URI[sha256sum] = "42aaf0418c05e725b39b220166a9c604a9c54c0fbf7692c9c119b36d0ed5d099" - -inherit autotools diff --git a/meta-openvuplus/recipes-base/opkg/opkg-collateral.bbappend b/meta-openvuplus/recipes-base/opkg/opkg-collateral.bbappend deleted file mode 100644 index 429c37f..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg-collateral.bbappend +++ /dev/null @@ -1,3 +0,0 @@ -FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" - -PR .= "-vuplus0" diff --git a/meta-openvuplus/recipes-base/opkg/opkg-collateral/dest b/meta-openvuplus/recipes-base/opkg/opkg-collateral/dest deleted file mode 100644 index e041eb7..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg-collateral/dest +++ /dev/null @@ -1,5 +0,0 @@ -dest root / -dest cf /media/cf/ -dest ram /media/ram/ -dest hdd /media/hdd/ -dest usb /media/usb/ diff --git a/meta-openvuplus/recipes-base/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch b/meta-openvuplus/recipes-base/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch deleted file mode 100644 index 4553124..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch +++ /dev/null @@ -1,32 +0,0 @@ -Upstream-Status: Backport - -From 319d02609992273e887242ed9788db68d3310b6c Mon Sep 17 00:00:00 2001 -From: "pixdamix@gmail.com" - -Date: Thu, 19 Jan 2012 13:52:06 +0000 -Subject: [PATCH 01/10] Fixed opkg losing auto_installed flag on upgrading - -Thanks-to: Christian Hitz - -git-svn-id: http://opkg.googlecode.com/svn/trunk@635 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 ---- - libopkg/opkg_install.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/libopkg/opkg_install.c b/libopkg/opkg_install.c -index 74a2ce1..3925f58 100644 ---- a/libopkg/opkg_install.c -+++ b/libopkg/opkg_install.c -@@ -1449,6 +1449,9 @@ opkg_install_pkg(pkg_t *pkg, int from_upgrade) - /* removing files from old package, to avoid ghost files */ - remove_data_files_and_list(old_pkg); - remove_maintainer_scripts(old_pkg); -+ -+ /* maintain the "Auto-Installed: yes" flag */ -+ pkg->auto_installed = old_pkg->auto_installed; - } - - --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-base/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch b/meta-openvuplus/recipes-base/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch deleted file mode 100644 index 9e122de..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 8c00c6be3723a0dcf05a10b5aba8c1c3b1fe4cf7 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter -Date: Wed, 16 May 2012 23:29:04 +0200 -Subject: [PATCH 02/10] Don't mark Conflicts as Depends - -- Fixes 'whatconflicts' sub-command. - -Signed-off-by: Andreas Oberritter ---- - libopkg/pkg_depends.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c -index 1e14d1f..a61e80e 100644 ---- a/libopkg/pkg_depends.c -+++ b/libopkg/pkg_depends.c -@@ -609,8 +609,8 @@ void buildConflicts(pkg_t * pkg) - - conflicts = pkg->conflicts = xcalloc(pkg->conflicts_count, sizeof(compound_depend_t)); - for (i = 0; i < pkg->conflicts_count; i++) { -- conflicts->type = CONFLICTS; - parseDepends(conflicts, pkg->conflicts_str[i]); -+ conflicts->type = CONFLICTS; - free(pkg->conflicts_str[i]); - conflicts++; - } --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-base/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch b/meta-openvuplus/recipes-base/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch deleted file mode 100644 index cfb7268..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch +++ /dev/null @@ -1,107 +0,0 @@ -From 698fdfccb2b2855fbe73ecad159b7987b49ddded Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter -Date: Thu, 17 May 2012 01:23:43 +0200 -Subject: [PATCH 03/10] Statically link libopkg and libbb - -* Based on https://dev.openwrt.org/browser/trunk/package/opkg/patches/007-force_static.patch - -Signed-off-by: Andreas Oberritter ---- - libbb/Makefile.am | 8 ++++---- - libopkg/Makefile.am | 14 +++----------- - src/Makefile.am | 4 ++-- - tests/Makefile.am | 6 +++--- - 4 files changed, 12 insertions(+), 20 deletions(-) - -diff --git a/libbb/Makefile.am b/libbb/Makefile.am -index 1cc82df..337d94f 100644 ---- a/libbb/Makefile.am -+++ b/libbb/Makefile.am -@@ -2,9 +2,9 @@ HOST_CPU=@host_cpu@ - BUILD_CPU=@build_cpu@ - ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ - --noinst_LTLIBRARIES = libbb.la -+noinst_LIBRARIES = libbb.a - --libbb_la_SOURCES = gz_open.c \ -+libbb_a_SOURCES = gz_open.c \ - libbb.h \ - unzip.c \ - wfopen.c \ -@@ -22,5 +22,5 @@ libbb_la_SOURCES = gz_open.c \ - all_read.c \ - mode_string.c - --libbb_la_CFLAGS = $(ALL_CFLAGS) --#libbb_la_LDFLAGS = -static -+libbb_a_CFLAGS = $(ALL_CFLAGS) -+#libbb_a_LDFLAGS = -static -diff --git a/libopkg/Makefile.am b/libopkg/Makefile.am -index 043c5c4..5882595 100644 ---- a/libopkg/Makefile.am -+++ b/libopkg/Makefile.am -@@ -38,18 +38,10 @@ if HAVE_SHA256 - opkg_util_sources += sha256.c sha256.h - endif - --lib_LTLIBRARIES = libopkg.la --libopkg_la_SOURCES = \ -+noinst_LIBRARIES = libopkg.a -+libopkg_a_SOURCES = \ - $(opkg_libcore_sources) \ - $(opkg_cmd_sources) $(opkg_db_sources) \ - $(opkg_util_sources) $(opkg_list_sources) - --libopkg_la_LIBADD = $(top_builddir)/libbb/libbb.la $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS) -- --libopkg_la_LDFLAGS = -version-info 1:0:0 -- --# make sure we only export symbols that are for public use --#libopkg_la_LDFLAGS = -export-symbols-regex "^opkg_.*" -- -- -- -+libopkg_a_LIBADD = $(top_builddir)/libbb/libbb.a $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS) -diff --git a/src/Makefile.am b/src/Makefile.am -index efdc19d..bb7a792 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -2,5 +2,5 @@ AM_CFLAGS = -I${top_srcdir}/libopkg ${ALL_CFLAGS} - bin_PROGRAMS = opkg-cl - - opkg_cl_SOURCES = opkg-cl.c --opkg_cl_LDADD = $(top_builddir)/libopkg/libopkg.la \ -- $(top_builddir)/libbb/libbb.la -+opkg_cl_LDADD = $(top_builddir)/libopkg/libopkg.a \ -+ $(top_builddir)/libbb/libbb.a -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 1a6f565..132c792 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -4,11 +4,11 @@ AM_CFLAGS = $(ALL_CFLAGS) -Wall -g -O3 -I${top_srcdir}/libopkg - #noinst_PROGRAMS = libopkg_test opkg_active_list_test - noinst_PROGRAMS = libopkg_test - --#opkg_hash_test_LDADD = $(top_builddir)/libbb/libbb.la $(top_builddir)/libopkg/libopkg.la -+#opkg_hash_test_LDADD = $(top_builddir)/libbb/libbb.a $(top_builddir)/libopkg/libopkg.a - #opkg_hash_test_SOURCES = opkg_hash_test.c - #opkg_hash_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir) - --#opkg_extract_test_LDADD = $(top_builddir)/libbb/libbb.la $(top_builddir)/libopkg/libopkg.la -+#opkg_extract_test_LDADD = $(top_builddir)/libbb/libbb.a $(top_builddir)/libopkg/libopkg.a - #opkg_extract_test_SOURCES = opkg_extract_test.c - #opkg_extract_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir) - -@@ -16,7 +16,7 @@ noinst_PROGRAMS = libopkg_test - #opkg_active_list_test_SOURCES = opkg_active_list_test.c - #opkg_active_list_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir) - --libopkg_test_LDADD = $(top_builddir)/libopkg/libopkg.la -+libopkg_test_LDADD = $(top_builddir)/libopkg/libopkg.a $(top_builddir)/libbb/libbb.a - libopkg_test_SOURCE = libopkg_test.c - libopkg_test_LDFLAGS = -static - --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-base/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch b/meta-openvuplus/recipes-base/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch deleted file mode 100644 index c9b9d6b..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch +++ /dev/null @@ -1,50 +0,0 @@ -From ca86fc9ad82713e17cd69e92ce2033631fa73675 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter -Date: Thu, 17 May 2012 01:32:43 +0200 -Subject: [PATCH 04/10] Makefile.am: remove -g and -O compiler flags - -Signed-off-by: Andreas Oberritter ---- - Makefile.am | 2 +- - libbb/Makefile.am | 2 +- - tests/Makefile.am | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/Makefile.am b/Makefile.am -index 26f2d99..1c6226f 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -6,7 +6,7 @@ SUBDIRS = libbb libopkg src tests utils man - HOST_CPU=@host_cpu@ - BUILD_CPU=@build_cpu@ - OPKGLIBDIR=@opkglibdir@ --ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ -DLIBDIR=\"@libdir@\" -DOPKGLIBDIR=\"@opkglibdir@\" -DDATADIR=\"@datadir@\" -+ALL_CFLAGS=-Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ -DLIBDIR=\"@libdir@\" -DOPKGLIBDIR=\"@opkglibdir@\" -DDATADIR=\"@datadir@\" - - PATHFINDER_CFLAGS = @PATHFINDER_CFLAGS@ - PATHFINDER_LIBS = @PATHFINDER_LIBS@ -diff --git a/libbb/Makefile.am b/libbb/Makefile.am -index 337d94f..6af5f04 100644 ---- a/libbb/Makefile.am -+++ b/libbb/Makefile.am -@@ -1,6 +1,6 @@ - HOST_CPU=@host_cpu@ - BUILD_CPU=@build_cpu@ --ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ -+ALL_CFLAGS=-Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ - - noinst_LIBRARIES = libbb.a - -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 132c792..4dccb74 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -1,4 +1,4 @@ --AM_CFLAGS = $(ALL_CFLAGS) -Wall -g -O3 -I${top_srcdir}/libopkg -+AM_CFLAGS = $(ALL_CFLAGS) -Wall -I${top_srcdir}/libopkg - - #noinst_PROGRAMS = opkg_hash_test opkg_extract_test - #noinst_PROGRAMS = libopkg_test opkg_active_list_test --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-base/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch b/meta-openvuplus/recipes-base/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch deleted file mode 100644 index 1820e52..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 4a5bc6cbce81497442f79ded5c78389024df0e60 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter -Date: Thu, 17 May 2012 01:14:23 +0200 -Subject: [PATCH 05/10] pkg_depends: remove unused variables to fix compiler - warnings - -Signed-off-by: Andreas Oberritter ---- - libopkg/pkg_depends.c | 5 ----- - 1 file changed, 5 deletions(-) - -diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c -index a61e80e..68a81f9 100644 ---- a/libopkg/pkg_depends.c -+++ b/libopkg/pkg_depends.c -@@ -269,13 +269,10 @@ is_pkg_a_replaces(pkg_t *pkg_scout,pkg_t *pkg) - { - int i ; - int replaces_count = pkg->replaces_count; -- abstract_pkg_t **replaces; - - if (pkg->replaces_count==0) // No replaces, it's surely a conflict - return 0; - -- replaces = pkg->replaces; -- - for (i = 0; i < replaces_count; i++) { - if (strcmp(pkg_scout->name,pkg->replaces[i]->name)==0) { // Found - opkg_msg(DEBUG2, "Seems I've found a replace %s %s\n", -@@ -295,7 +292,6 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) - depend_t ** possible_satisfiers; - depend_t * possible_satisfier; - int i, j, k; -- int count; - abstract_pkg_t * ab_pkg; - pkg_t **pkg_scouts; - pkg_t *pkg_scout; -@@ -315,7 +311,6 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) - } - installed_conflicts = pkg_vec_alloc(); - -- count = pkg->conflicts_count; - - - --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-base/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch b/meta-openvuplus/recipes-base/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch deleted file mode 100644 index 89934f2..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch +++ /dev/null @@ -1,34 +0,0 @@ -From e2b289330280e9f9fb5dd2cc10c736ca06d273f4 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter -Date: Thu, 17 May 2012 01:15:15 +0200 -Subject: [PATCH 06/10] pkg_hash_fetch_conflicts: fix possible segfaults - -Signed-off-by: Andreas Oberritter ---- - libopkg/pkg_depends.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c -index 68a81f9..6ff75f1 100644 ---- a/libopkg/pkg_depends.c -+++ b/libopkg/pkg_depends.c -@@ -322,10 +322,14 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) - /* foreach possible satisfier */ - for(j = 0; j < conflicts->possibility_count; j++){ - possible_satisfier = possible_satisfiers[j]; -- if (!possible_satisfier) -+ if (!possible_satisfier) { - opkg_msg(ERROR, "Internal error: possible_satisfier=NULL\n"); -- if (!possible_satisfier->pkg) -+ continue; -+ } -+ if (!possible_satisfier->pkg) { - opkg_msg(ERROR, "Internal error: possible_satisfier->pkg=NULL\n"); -+ continue; -+ } - test_vec = possible_satisfier->pkg->pkgs; - if (test_vec) { - /* pkg_vec found, it is an actual package conflict --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-base/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch b/meta-openvuplus/recipes-base/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch deleted file mode 100644 index 575c1e1..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch +++ /dev/null @@ -1,94 +0,0 @@ -From b925a520a63fb291675f707e602d04295236c85b Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter -Date: Thu, 17 May 2012 01:17:52 +0200 -Subject: [PATCH 07/10] pkg_hash_fetch_conflicts: move iteration over - conflicts to subroutine - -Signed-off-by: Andreas Oberritter ---- - libopkg/pkg_depends.c | 46 ++++++++++++++++++++++++---------------------- - 1 file changed, 24 insertions(+), 22 deletions(-) - -diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c -index 6ff75f1..1999b64 100644 ---- a/libopkg/pkg_depends.c -+++ b/libopkg/pkg_depends.c -@@ -284,39 +284,22 @@ is_pkg_a_replaces(pkg_t *pkg_scout,pkg_t *pkg) - - } - -- --pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) -+static void __pkg_hash_fetch_conflicts(pkg_t * pkg, pkg_vec_t * installed_conflicts) - { -- pkg_vec_t * installed_conflicts, * test_vec; -+ pkg_vec_t * test_vec; - compound_depend_t * conflicts; - depend_t ** possible_satisfiers; - depend_t * possible_satisfier; - int i, j, k; -- abstract_pkg_t * ab_pkg; - pkg_t **pkg_scouts; - pkg_t *pkg_scout; - -- /* -- * this is a setup to check for redundant/cyclic dependency checks, -- * which are marked at the abstract_pkg level -- */ -- if(!(ab_pkg = pkg->parent)){ -- opkg_msg(ERROR, "Internal error: %s not in hash table\n", pkg->name); -- return (pkg_vec_t *)NULL; -- } -- - conflicts = pkg->conflicts; -- if(!conflicts){ -- return (pkg_vec_t *)NULL; -- } -- installed_conflicts = pkg_vec_alloc(); -- -- -- -+ if(!conflicts) -+ return; - - /* foreach conflict */ - for(i = 0; i < pkg->conflicts_count; i++){ -- - possible_satisfiers = conflicts->possibilities; - - /* foreach possible satisfier */ -@@ -352,11 +335,30 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) - } - conflicts++; - } -+} -+ -+pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) -+{ -+ pkg_vec_t * installed_conflicts; -+ abstract_pkg_t * ab_pkg; -+ -+ /* -+ * this is a setup to check for redundant/cyclic dependency checks, -+ * which are marked at the abstract_pkg level -+ */ -+ if(!(ab_pkg = pkg->parent)){ -+ opkg_msg(ERROR, "Internal error: %s not in hash table\n", pkg->name); -+ return (pkg_vec_t *)NULL; -+ } -+ -+ installed_conflicts = pkg_vec_alloc(); -+ -+ __pkg_hash_fetch_conflicts(pkg, installed_conflicts); - - if (installed_conflicts->len) - return installed_conflicts; - pkg_vec_free(installed_conflicts); -- return (pkg_vec_t *)NULL; -+ return (pkg_vec_t *)NULL; - } - - int version_constraints_satisfied(depend_t * depends, pkg_t * pkg) --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-base/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch b/meta-openvuplus/recipes-base/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch deleted file mode 100644 index e958289..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 53de52b533ee30676d051ee941cfc0a517e9190e Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter -Date: Thu, 17 May 2012 01:18:42 +0200 -Subject: [PATCH 08/10] pkg_hash_fetch_conflicts: take into account conflicts - of installed packages - -Signed-off-by: Andreas Oberritter ---- - libopkg/pkg_depends.c | 17 +++++++++++++++++ - 1 file changed, 17 insertions(+) - -diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c -index 1999b64..f237733 100644 ---- a/libopkg/pkg_depends.c -+++ b/libopkg/pkg_depends.c -@@ -337,6 +337,22 @@ static void __pkg_hash_fetch_conflicts(pkg_t * pkg, pkg_vec_t * installed_confli - } - } - -+static void __pkg_hash_fetch_conflictees(pkg_t *pkg, pkg_vec_t *installed_conflicts) -+{ -+ int i; -+ -+ pkg_vec_t *available_pkgs = pkg_vec_alloc(); -+ pkg_hash_fetch_all_installed(available_pkgs); -+ -+ for (i = 0; i < available_pkgs->len; i++) { -+ pkg_t *cpkg = available_pkgs->pkgs[i]; -+ if (pkg_conflicts(cpkg, pkg) && !is_pkg_in_pkg_vec(installed_conflicts, cpkg)) -+ pkg_vec_insert(installed_conflicts, cpkg); -+ } -+ -+ pkg_vec_free(available_pkgs); -+} -+ - pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) - { - pkg_vec_t * installed_conflicts; -@@ -354,6 +370,7 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) - installed_conflicts = pkg_vec_alloc(); - - __pkg_hash_fetch_conflicts(pkg, installed_conflicts); -+ __pkg_hash_fetch_conflictees(pkg, installed_conflicts); - - if (installed_conflicts->len) - return installed_conflicts; --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-base/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch b/meta-openvuplus/recipes-base/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch deleted file mode 100644 index bf61aef..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 70d10c10288da23755055c881bea01b61a2d4df7 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter -Date: Thu, 17 May 2012 22:57:35 +0200 -Subject: [PATCH 09/10] Revert "Add Recommended packages to the - depended_upon_by field." - -This reverts commit ac2222f7d6514fb403ce0848f6812a22a48f75c7. ---- - libopkg/pkg_depends.c | 70 ++++++++++++++++++++++--------------------------- - 1 file changed, 32 insertions(+), 38 deletions(-) - -diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c -index f237733..ec60b99 100644 ---- a/libopkg/pkg_depends.c -+++ b/libopkg/pkg_depends.c -@@ -787,49 +787,43 @@ pkg_depend_str(pkg_t *pkg, int idx) - return str; - } - -+/* -+ * WARNING: This function assumes pre_depends and depends are at the -+ * start of the pkg->depends array. -+ */ - void buildDependedUponBy(pkg_t * pkg, abstract_pkg_t * ab_pkg) - { -- compound_depend_t * depends; -- int count, othercount; -- int i, j; -- abstract_pkg_t * ab_depend; -- abstract_pkg_t ** temp; -- -- count = pkg->pre_depends_count + -- pkg->depends_count + -- pkg->recommends_count + -- pkg->suggests_count; -- -- for (i = 0; i < count; i++) { -- depends = &pkg->depends[i]; -- if (depends->type != PREDEPEND -- && depends->type != DEPEND -- && depends->type != RECOMMEND) -- continue; -- for (j = 0; j < depends->possibility_count; j++) { -- ab_depend = depends->possibilities[j]->pkg; -- if (!ab_depend->depended_upon_by) { -- ab_depend->depended_upon_by = -- xcalloc(1, sizeof(abstract_pkg_t *)); -- } -+ compound_depend_t * depends; -+ int count, othercount; -+ int i, j; -+ abstract_pkg_t * ab_depend; -+ abstract_pkg_t ** temp; - -- temp = ab_depend->depended_upon_by; -- othercount = 1; -- while (*temp) { -- temp++; -- othercount++; -- } -- *temp = ab_pkg; -+ count = pkg->pre_depends_count + pkg->depends_count; -+ depends = pkg->depends; - -- ab_depend->depended_upon_by = -- xrealloc(ab_depend->depended_upon_by, -- (othercount + 1) * sizeof(abstract_pkg_t *)); -+ for (i = 0; i < count; i++) { -+ for (j = 0; j < depends->possibility_count; j++){ -+ ab_depend = depends->possibilities[j]->pkg; -+ if(!ab_depend->depended_upon_by) -+ ab_depend->depended_upon_by = xcalloc(1, sizeof(abstract_pkg_t *)); -+ -+ temp = ab_depend->depended_upon_by; -+ othercount = 1; -+ while(*temp){ -+ temp++; -+ othercount++; -+ } -+ *temp = ab_pkg; - -- /* the array may have been moved by realloc */ -- temp = ab_depend->depended_upon_by + othercount; -- *temp = NULL; -- } -- } -+ ab_depend->depended_upon_by = xrealloc(ab_depend->depended_upon_by, -+ (othercount + 1) * sizeof(abstract_pkg_t *)); -+ /* the array may have moved */ -+ temp = ab_depend->depended_upon_by + othercount; -+ *temp = NULL; -+ } -+ depends++; -+ } - } - - static depend_t * depend_init(void) --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-base/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch b/meta-openvuplus/recipes-base/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch deleted file mode 100644 index 3bc2e5d..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 719cc4ab765c008bd7e4f2d085692657c33d171e Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter -Date: Mon, 21 May 2012 14:05:37 +0200 -Subject: [PATCH 10/10] opkg_remove: auto-delete .pyo files - -Signed-off-by: Andreas Oberritter ---- - libopkg/opkg_remove.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/libopkg/opkg_remove.c b/libopkg/opkg_remove.c -index 5f4219b..4320dc3 100644 ---- a/libopkg/opkg_remove.c -+++ b/libopkg/opkg_remove.c -@@ -375,8 +375,15 @@ remove_data_files_and_list(pkg_t *pkg) - } - - if (!conf->noaction) { -+ size_t l = strlen(file_name); - opkg_msg(INFO, "Deleting %s.\n", file_name); - unlink(file_name); -+ if (l >= 3 && !strcmp(&file_name[l - 3], ".py")) { -+ char pyo_file_name[l + 2]; -+ strcpy(pyo_file_name, file_name); -+ strcat(pyo_file_name, "o"); -+ unlink(pyo_file_name); -+ } - } else - opkg_msg(INFO, "Not deleting %s. (noaction)\n", - file_name); --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-base/opkg/opkg_svn.bbappend b/meta-openvuplus/recipes-base/opkg/opkg_svn.bbappend deleted file mode 100644 index e5a54e4..0000000 --- a/meta-openvuplus/recipes-base/opkg/opkg_svn.bbappend +++ /dev/null @@ -1,14 +0,0 @@ -PR .= "-vuplus0" - -SRC_URI += "file://0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch \ - file://0002-Don-t-mark-Conflicts-as-Depends.patch \ - file://0003-Statically-link-libopkg-and-libbb.patch \ - file://0004-Makefile.am-remove-g-and-O-compiler-flags.patch \ - file://0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch \ - file://0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch \ - file://0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch \ - file://0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch \ - file://0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch \ - file://0010-opkg_remove-auto-delete-.pyo-files.patch" - -FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" diff --git a/meta-openvuplus/recipes-base/ppp/ppp_2.4.5.bbappend b/meta-openvuplus/recipes-base/ppp/ppp_2.4.5.bbappend deleted file mode 100644 index e6587d2..0000000 --- a/meta-openvuplus/recipes-base/ppp/ppp_2.4.5.bbappend +++ /dev/null @@ -1,8 +0,0 @@ -PR .= "-vuplus0" - -do_install_append() { - rm ${D}/${sysconfdir}/ppp/options - rm ${D}/${sysconfdir}/ppp/pap-secrets -} - -CONFFILES_${PN} = "${sysconfdir}/ppp/chap-secrets" diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch deleted file mode 100644 index 832ce9d..0000000 --- a/meta-openvuplus/recipes-base/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 51aaf9c6812430975dcd2cf9a632eb8d241ec41e Mon Sep 17 00:00:00 2001 -From: Andrew Bartlett -Date: Thu, 3 Jun 2010 09:35:31 +1000 -Subject: [PATCH] s3:schannel client Push the domain and netbios name into the DOS charset - -If the netbios name is not just ASCII, then we have to get it into the -right character set. - -Andrew Bartlett ---- - source/rpc_parse/parse_rpc.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -diff --git source/rpc_parse/parse_rpc.c source/rpc_parse/parse_rpc.c -index 2d166c7..7b4b8e8 100644 ---- source/rpc_parse/parse_rpc.c -+++ source/rpc_parse/parse_rpc.c -@@ -786,8 +786,8 @@ void init_rpc_auth_schannel_neg(RPC_AUTH_SCHANNEL_NEG *neg, - { - neg->type1 = 0; - neg->type2 = 0x3; -- fstrcpy(neg->domain, domain); -- fstrcpy(neg->myname, myname); -+ push_ascii_fstring(neg->domain, domain); -+ push_ascii_fstring(neg->myname, myname); - } - - /******************************************************************* --- -1.7.0.1 - diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/configure.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/configure.patch deleted file mode 100644 index ddcb9e9..0000000 --- a/meta-openvuplus/recipes-base/samba/samba-3.0.37/configure.patch +++ /dev/null @@ -1,213 +0,0 @@ -diff -urN source.old//aclocal.m4 source//aclocal.m4 ---- source.old//aclocal.m4 2008-08-25 22:09:21.000000000 +0100 -+++ source//aclocal.m4 2008-11-23 17:44:58.050646210 +0000 -@@ -1,5 +1,5 @@ - dnl test whether dirent has a d_off member --AC_DEFUN(AC_DIRENT_D_OFF, -+AC_DEFUN([AC_DIRENT_D_OFF], - [AC_CACHE_CHECK([for d_off in dirent], ac_cv_dirent_d_off, - [AC_TRY_COMPILE([ - #include -@@ -13,7 +13,7 @@ - - dnl Mark specified module as shared - dnl SMB_MODULE(name,static_files,shared_files,subsystem,whatif-static,whatif-shared) --AC_DEFUN(SMB_MODULE, -+AC_DEFUN([SMB_MODULE], - [ - AC_MSG_CHECKING([how to build $1]) - if test "$[MODULE_][$1]"; then -@@ -44,7 +44,7 @@ - fi - ]) - --AC_DEFUN(SMB_SUBSYSTEM, -+AC_DEFUN([SMB_SUBSYSTEM], - [ - AC_SUBST($1_STATIC) - AC_SUBST($1_MODULES) -@@ -229,7 +229,7 @@ - - dnl Define an AC_DEFINE with ifndef guard. - dnl AC_N_DEFINE(VARIABLE [, VALUE]) --define(AC_N_DEFINE, -+define([AC_N_DEFINE], - [cat >> confdefs.h <<\EOF - [#ifndef] $1 - [#define] $1 ifelse($#, 2, [$2], $#, 3, [$2], 1) -@@ -239,14 +239,14 @@ - - dnl Add an #include - dnl AC_ADD_INCLUDE(VARIABLE) --define(AC_ADD_INCLUDE, -+define([AC_ADD_INCLUDE], - [cat >> confdefs.h <<\EOF - [#include] $1 - EOF - ]) - - dnl Copied from libtool.m4 --AC_DEFUN(AC_PROG_LD_GNU, -+AC_DEFUN([AC_PROG_LD_GNU], - [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, - [# I'd rather use --version here, but apparently some GNU ld's only accept -v. - if $LD -v 2>&1 &5; then -@@ -257,7 +257,7 @@ - ]) - - dnl Removes -I/usr/include/? from given variable --AC_DEFUN(CFLAGS_REMOVE_USR_INCLUDE,[ -+AC_DEFUN([CFLAGS_REMOVE_USR_INCLUDE],[ - ac_new_flags="" - for i in [$]$1; do - case [$]i in -@@ -270,7 +270,7 @@ - - dnl Removes '-L/usr/lib[/]', '-Wl,-rpath,/usr/lib[/]' - dnl and '-Wl,-rpath -Wl,/usr/lib[/]' from given variable --AC_DEFUN(LIB_REMOVE_USR_LIB,[ -+AC_DEFUN([LIB_REMOVE_USR_LIB],[ - ac_new_flags="" - l="" - for i in [$]$1; do -@@ -301,7 +301,7 @@ - - dnl From Bruno Haible. - --AC_DEFUN(jm_ICONV, -+AC_DEFUN([jm_ICONV], - [ - dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and - dnl those with the standalone portable libiconv installed). -@@ -387,7 +387,7 @@ - fi - ]) - --AC_DEFUN(rjs_CHARSET,[ -+AC_DEFUN([rjs_CHARSET],[ - dnl Find out if we can convert from $1 to UCS2-LE - AC_MSG_CHECKING([can we convert from $1 to UCS2-LE?]) - AC_TRY_RUN([ -@@ -405,7 +405,7 @@ - - dnl CFLAGS_ADD_DIR(CFLAGS, $INCDIR) - dnl This function doesn't add -I/usr/include into CFLAGS --AC_DEFUN(CFLAGS_ADD_DIR,[ -+AC_DEFUN([CFLAGS_ADD_DIR],[ - if test "$2" != "/usr/include" ; then - $1="$$1 -I$2" - fi -@@ -413,7 +413,7 @@ - - dnl LIB_ADD_DIR(LDFLAGS, $LIBDIR) - dnl This function doesn't add -L/usr/lib into LDFLAGS --AC_DEFUN(LIB_ADD_DIR,[ -+AC_DEFUN([LIB_ADD_DIR],[ - if test "$2" != "/usr/lib" ; then - $1="$$1 -L$2" - fi -@@ -486,7 +486,7 @@ - dnl AC_TRY_RUN_STRICT(PROGRAM,CFLAGS,CPPFLAGS,LDFLAGS, - dnl [ACTION-IF-TRUE],[ACTION-IF-FALSE], - dnl [ACTION-IF-CROSS-COMPILING = RUNTIME-ERROR]) --AC_DEFUN( [AC_TRY_RUN_STRICT], -+AC_DEFUN([AC_TRY_RUN_STRICT], - [ - old_CFLAGS="$CFLAGS"; - CFLAGS="$2"; -diff -urN source.old//configure.in source//configure.in ---- source.old//configure.in 2008-08-25 22:09:21.000000000 +0100 -+++ source//configure.in 2008-11-23 17:22:17.108791515 +0000 -@@ -1402,7 +1402,7 @@ - #endif - exit(0); - } --], [linux_getgrouplist_ok=yes], [linux_getgrouplist_ok=no]) -+], [linux_getgrouplist_ok=yes], [linux_getgrouplist_ok=no], [linux_getgrouplist_ok=cross]) - if test x"$linux_getgrouplist_ok" = x"yes"; then - AC_DEFINE(HAVE_GETGROUPLIST, 1, [Have good getgrouplist]) - fi -diff -urN source.old//lib/replace/libreplace.m4 source//lib/replace/libreplace.m4 ---- source.old//lib/replace/libreplace.m4 2008-08-25 22:09:21.000000000 +0100 -+++ source//lib/replace/libreplace.m4 2008-11-23 17:54:27.942153096 +0000 -@@ -1,4 +1,4 @@ --AC_DEFUN_ONCE(AC_LIBREPLACE_LOCATION_CHECKS, -+AC_DEFUN_ONCE([AC_LIBREPLACE_LOCATION_CHECKS], - [ - echo "LIBREPLACE_LOCATION_CHECKS: START" - -@@ -27,7 +27,7 @@ - ]) dnl end AC_LIBREPLACE_LOCATION_CHECKS - - --AC_DEFUN_ONCE(AC_LIBREPLACE_BROKEN_CHECKS, -+AC_DEFUN_ONCE([AC_LIBREPLACE_BROKEN_CHECKS], - [ - echo "LIBREPLACE_BROKEN_CHECKS: START" - -@@ -325,25 +325,25 @@ - AC_DEFINE(HAVE_VOLATILE, 1, [Whether the C compiler understands volatile]) - fi - --m4_include(system/config.m4) -+m4_include(lib/replace/system/config.m4) - --m4_include(dlfcn.m4) --m4_include(getpass.m4) --m4_include(strptime.m4) --m4_include(win32.m4) --m4_include(timegm.m4) --m4_include(repdir.m4) -+m4_include(lib/replace/dlfcn.m4) -+m4_include(lib/replace/getpass.m4) -+m4_include(lib/replace/strptime.m4) -+m4_include(lib/replace/win32.m4) -+m4_include(lib/replace/timegm.m4) -+m4_include(lib/replace/repdir.m4) - - AC_CHECK_FUNCS([syslog memset memcpy],,[AC_MSG_ERROR([Required function not found])]) - - echo "LIBREPLACE_BROKEN_CHECKS: END" - ]) dnl end AC_LIBREPLACE_BROKEN_CHECKS - --AC_DEFUN_ONCE(AC__LIBREPLACE_ALL_CHECKS_START, -+AC_DEFUN_ONCE([AC__LIBREPLACE_ALL_CHECKS_START], - [ - #LIBREPLACE_ALL_CHECKS: START" - ]) --AC_DEFUN_ONCE(AC__LIBREPLACE_ALL_CHECKS_END, -+AC_DEFUN_ONCE([AC__LIBREPLACE_ALL_CHECKS_END], - [ - #LIBREPLACE_ALL_CHECKS: END" - ]) -@@ -356,6 +356,6 @@ - AC__LIBREPLACE_ALL_CHECKS_END - ]) - --m4_include(libreplace_cc.m4) --m4_include(libreplace_macros.m4) --m4_include(autoconf-2.60.m4) -+m4_include(lib/replace/libreplace_cc.m4) -+m4_include(lib/replace/libreplace_macros.m4) -+m4_include(lib/replace/autoconf-2.60.m4) -diff -urN source.old//lib/replace/libreplace_macros.m4 source//lib/replace/libreplace_macros.m4 ---- source.old//lib/replace/libreplace_macros.m4 2008-08-25 22:09:21.000000000 +0100 -+++ source//lib/replace/libreplace_macros.m4 2008-11-23 17:31:08.269791372 +0000 -@@ -76,7 +76,7 @@ - ]) - - dnl AC_PROG_CC_FLAG(flag) --AC_DEFUN(AC_PROG_CC_FLAG, -+AC_DEFUN([AC_PROG_CC_FLAG], - [AC_CACHE_CHECK(whether ${CC-cc} accepts -$1, ac_cv_prog_cc_$1, - [echo 'void f(){}' > conftest.c - if test -z "`${CC-cc} -$1 -c conftest.c 2>&1`"; then -@@ -103,7 +103,7 @@ - dnl see if a declaration exists for a function or variable - dnl defines HAVE_function_DECL if it exists - dnl AC_HAVE_DECL(var, includes) --AC_DEFUN(AC_HAVE_DECL, -+AC_DEFUN([AC_HAVE_DECL], - [ - AC_CACHE_CHECK([for $1 declaration],ac_cv_have_$1_decl,[ - AC_TRY_COMPILE([$2],[int i = (int)$1], diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/kernel-oplocks.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/kernel-oplocks.patch deleted file mode 100644 index bee0f1d..0000000 --- a/meta-openvuplus/recipes-base/samba/samba-3.0.37/kernel-oplocks.patch +++ /dev/null @@ -1,20 +0,0 @@ -Linux oplock support is conditional on HAVE_KERNEL_OPLOCKS_LINUX, -not plain old LINUX. - -http://websvn.samba.org/cgi-bin/viewcvs.cgi?rev=23962&view=rev ---- source/modules/vfs_default.c.orig 2010-09-06 17:37:48.256826182 +0200 -+++ source/modules/vfs_default.c 2010-09-06 17:38:25.300843377 +0200 -@@ -813,10 +813,11 @@ - - START_PROFILE(syscall_linux_setlease); - --#ifdef LINUX -+#ifdef HAVE_KERNEL_OPLOCKS_LINUX - /* first set the signal handler */ -- if(linux_set_lease_sighandler(fd) == -1) -+ if(linux_set_lease_sighandler(fd) == -1) { - return -1; -+ } - - result = linux_setlease(fd, leasetype); - #else diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch deleted file mode 100644 index 4144a9e..0000000 --- a/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch +++ /dev/null @@ -1,91 +0,0 @@ -From f781c9c693462b89b60a3662d2a1224c9387a725 Mon Sep 17 00:00:00 2001 -From: Volker Lendecke -Date: Fri, 10 Feb 2012 08:10:39 +0100 -Subject: [PATCH 1/2] v3-3: AndX offsets are increasing strictly monotonically - ---- - source/smbd/process.c | 10 +++++++++- - 1 files changed, 9 insertions(+), 1 deletions(-) - -diff --git source/smbd/process.c source/smbd/process.c -index e861e16..f64e1ce 100644 ---- source/smbd/process.c -+++ source/smbd/process.c -@@ -1160,7 +1160,7 @@ int chain_reply(char *inbuf,char *outbuf,int size,int bufsize) - static char *orig_inbuf; - static char *orig_outbuf; - int smb_com1, smb_com2 = CVAL(inbuf,smb_vwv0); -- unsigned smb_off2 = SVAL(inbuf,smb_vwv1); -+ static unsigned smb_off2; - char *inbuf2, *outbuf2; - int outsize2; - int new_size; -@@ -1178,8 +1178,16 @@ int chain_reply(char *inbuf,char *outbuf,int size,int bufsize) - /* this is the first part of the chain */ - orig_inbuf = inbuf; - orig_outbuf = outbuf; -+ smb_off2 = 0; - } - -+ if (SVAL(inbuf,smb_vwv1) <= smb_off2) { -+ DEBUG(1, ("AndX offset not increasing\n")); -+ SCVAL(outbuf, smb_vwv0, 0xFF); -+ return outsize; -+ } -+ smb_off2 = SVAL(inbuf, smb_vwv1); -+ - /* - * The original Win95 redirector dies on a reply to - * a lockingX and read chain unless the chain reply is --- -1.7.3.4 - - -From 009bb0be7383777a650a3bc6af1c0d3ab7476ebc Mon Sep 17 00:00:00 2001 -From: Volker Lendecke -Date: Fri, 10 Feb 2012 08:39:33 +0100 -Subject: [PATCH 2/2] v3-0-test: Port back some packet consistency checks - ---- - source/smbd/process.c | 18 ++++++++++++++++++ - 1 files changed, 18 insertions(+), 0 deletions(-) - -diff --git source/smbd/process.c source/smbd/process.c -index f64e1ce..8aabef8 100644 ---- source/smbd/process.c -+++ source/smbd/process.c -@@ -1025,6 +1025,7 @@ static int construct_reply(char *inbuf,char *outbuf,int size,int bufsize) - int outsize = 0; - int msg_type = CVAL(inbuf,0); - uint16_t mid = SVAL(inbuf, smb_mid); -+ uint8_t wct = CVAL(inbuf, smb_wct); - - chain_size = 0; - file_chain_reset(); -@@ -1033,6 +1034,23 @@ static int construct_reply(char *inbuf,char *outbuf,int size,int bufsize) - if (msg_type != 0) - return(reply_special(inbuf,outbuf)); - -+ /* Ensure we have at least wct words and 2 bytes of bcc. */ -+ if (smb_size + wct*2 > size) { -+ DEBUG(0,("init_smb_request: invalid wct number %u (size %u)\n", -+ (unsigned int)wct, -+ (unsigned int)size)); -+ exit_server_cleanly("Invalid SMB request"); -+ } -+ /* Ensure bcc is correct. */ -+ if (((uint8 *)smb_buf(inbuf)) + smb_buflen(inbuf) > inbuf + size) { -+ DEBUG(0,("init_smb_request: invalid bcc number %u " -+ "(wct = %u, size %u)\n", -+ (unsigned int)smb_buflen(inbuf), -+ (unsigned int)wct, -+ (unsigned int)size)); -+ exit_server_cleanly("Invalid SMB request"); -+ } -+ - construct_reply_common(inbuf, outbuf); - - outsize = switch_message(type,inbuf,outbuf,size,bufsize); --- -1.7.3.4 - diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch deleted file mode 100644 index bbe38e4..0000000 --- a/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch +++ /dev/null @@ -1,59 +0,0 @@ -From e11637c2c89c2d38963311416c34a4767b19e175 Mon Sep 17 00:00:00 2001 -From: Stefan Metzmacher -Date: Sat, 17 Mar 2012 01:22:27 +0100 -Subject: [PATCH] s3:librpc/gen_ndr: fix array checks (bug #8815 / CVE-2012-1182) - -An Anonymous researcher working with HP's Zero Day Initiative program -has found this and notified us. - -metze ---- - source/librpc/gen_ndr/ndr_wkssvc.c | 12 ++++++------ - 1 files changed, 6 insertions(+), 6 deletions(-) - -diff --git source/librpc/gen_ndr/ndr_wkssvc.c source/librpc/gen_ndr/ndr_wkssvc.c -index 2af3587..07cf1a1 100644 ---- source/librpc/gen_ndr/ndr_wkssvc.c -+++ source/librpc/gen_ndr/ndr_wkssvc.c -@@ -1385,10 +1385,10 @@ NTSTATUS ndr_pull_USER_INFO_0_CONTAINER(struct ndr_pull *ndr, int ndr_flags, str - NDR_PULL_ALLOC_N(ndr, r->user0, ndr_get_array_size(ndr, &r->user0)); - _mem_save_user0_1 = NDR_PULL_GET_MEM_CTX(ndr); - NDR_PULL_SET_MEM_CTX(ndr, r->user0, 0); -- for (cntr_user0_1 = 0; cntr_user0_1 < r->entries_read; cntr_user0_1++) { -+ for (cntr_user0_1 = 0; cntr_user0_1 < ndr_get_array_size(ndr, &r->user0); cntr_user0_1++) { - NDR_CHECK(ndr_pull_USER_INFO_0(ndr, NDR_SCALARS, &r->user0[cntr_user0_1])); - } -- for (cntr_user0_1 = 0; cntr_user0_1 < r->entries_read; cntr_user0_1++) { -+ for (cntr_user0_1 = 0; cntr_user0_1 < ndr_get_array_size(ndr, &r->user0); cntr_user0_1++) { - NDR_CHECK(ndr_pull_USER_INFO_0(ndr, NDR_BUFFERS, &r->user0[cntr_user0_1])); - } - NDR_PULL_SET_MEM_CTX(ndr, _mem_save_user0_1, 0); -@@ -1631,10 +1631,10 @@ NTSTATUS ndr_pull_USER_INFO_1_CONTAINER(struct ndr_pull *ndr, int ndr_flags, str - NDR_PULL_ALLOC_N(ndr, r->user1, ndr_get_array_size(ndr, &r->user1)); - _mem_save_user1_1 = NDR_PULL_GET_MEM_CTX(ndr); - NDR_PULL_SET_MEM_CTX(ndr, r->user1, 0); -- for (cntr_user1_1 = 0; cntr_user1_1 < r->entries_read; cntr_user1_1++) { -+ for (cntr_user1_1 = 0; cntr_user1_1 < ndr_get_array_size(ndr, &r->user1); cntr_user1_1++) { - NDR_CHECK(ndr_pull_USER_INFO_1(ndr, NDR_SCALARS, &r->user1[cntr_user1_1])); - } -- for (cntr_user1_1 = 0; cntr_user1_1 < r->entries_read; cntr_user1_1++) { -+ for (cntr_user1_1 = 0; cntr_user1_1 < ndr_get_array_size(ndr, &r->user1); cntr_user1_1++) { - NDR_CHECK(ndr_pull_USER_INFO_1(ndr, NDR_BUFFERS, &r->user1[cntr_user1_1])); - } - NDR_PULL_SET_MEM_CTX(ndr, _mem_save_user1_1, 0); -@@ -1953,10 +1953,10 @@ NTSTATUS ndr_pull_wkssvc_NetWkstaTransportCtr0(struct ndr_pull *ndr, int ndr_fla - NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array)); - _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr); - NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); -- for (cntr_array_1 = 0; cntr_array_1 < r->count; cntr_array_1++) { -+ for (cntr_array_1 = 0; cntr_array_1 < ndr_get_array_size(ndr, &r->array); cntr_array_1++) { - NDR_CHECK(ndr_pull_wkssvc_NetWkstaTransportInfo0(ndr, NDR_SCALARS, &r->array[cntr_array_1])); - } -- for (cntr_array_1 = 0; cntr_array_1 < r->count; cntr_array_1++) { -+ for (cntr_array_1 = 0; cntr_array_1 < ndr_get_array_size(ndr, &r->array); cntr_array_1++) { - NDR_CHECK(ndr_pull_wkssvc_NetWkstaTransportInfo0(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); - } - NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0); --- -1.7.4.1 - diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch deleted file mode 100644 index b10a1b1..0000000 --- a/meta-openvuplus/recipes-base/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch +++ /dev/null @@ -1,46 +0,0 @@ -diff --git source.old/client/mount.cifs.c source/client/mount.cifs.c -index 3b56e5f..b7a76c6 100644 ---- source.old/client/mount.cifs.c -+++ source/client/mount.cifs.c -@@ -56,6 +56,10 @@ - #endif /* _SAMBA_BUILD_ */ - #endif /* MOUNT_CIFS_VENDOR_SUFFIX */ - -+#ifdef _SAMBA_BUILD_ -+#include "include/config.h" -+#endif -+ - #ifndef MS_MOVE - #define MS_MOVE 8192 - #endif -@@ -94,6 +98,8 @@ char * prefixpath = NULL; - - /* like strncpy but does not 0 fill the buffer and always null - * terminates. bufsize is the size of the destination buffer */ -+ -+#ifndef HAVE_STRLCPY - static size_t strlcpy(char *d, const char *s, size_t bufsize) - { - size_t len = strlen(s); -@@ -104,10 +110,13 @@ static size_t strlcpy(char *d, const char *s, size_t bufsize) - d[len] = 0; - return ret; - } -+#endif - - /* like strncat but does not 0 fill the buffer and always null - * terminates. bufsize is the length of the buffer, which should - * be one more than the maximum resulting string length */ -+ -+#ifndef HAVE_STRLCAT - static size_t strlcat(char *d, const char *s, size_t bufsize) - { - size_t len1 = strlen(d); -@@ -126,6 +135,7 @@ static size_t strlcat(char *d, const char *s, size_t bufsize) - } - return ret; - } -+#endif - - /* BB finish BB - diff --git a/meta-openvuplus/recipes-base/samba/samba/01samba-kill b/meta-openvuplus/recipes-base/samba/samba/01samba-kill deleted file mode 100644 index 41f7781..0000000 --- a/meta-openvuplus/recipes-base/samba/samba/01samba-kill +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -killall -9 smbd -rm -rf /var/log/log.smbd -killall -9 nmbd -rm -rf /var/log/log.nmbd diff --git a/meta-openvuplus/recipes-base/samba/samba/01samba-start b/meta-openvuplus/recipes-base/samba/samba/01samba-start deleted file mode 100644 index ce397ad..0000000 --- a/meta-openvuplus/recipes-base/samba/samba/01samba-start +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -nmbd -D -smbd -D diff --git a/meta-openvuplus/recipes-base/samba/samba/config-lfs.patch b/meta-openvuplus/recipes-base/samba/samba/config-lfs.patch deleted file mode 100644 index b37ed69..0000000 --- a/meta-openvuplus/recipes-base/samba/samba/config-lfs.patch +++ /dev/null @@ -1,47 +0,0 @@ -Cache the check for Linux LFS support, so it can be prepopulated from -the site cache for configure variables for cross-compiling. Without this, -samba gets the idea that it can use dirent64 and friends without defining -the flags it needs to get it, such as _GNU_SOURCE and _LARGEFILE64_SOURCE. - -Symptoms of getting the configuration wrong on cross-compile inculde -warnings such as - - smbd/trans2.c: In function `get_lanman2_dir_entry': - smbd/trans2.c:1065: warning: right shift count >= width of type - -and errors like - - smbd/vfs.c:630: error: dereferencing pointer to incomplete type - -(when trying to dereference dirent64.) - ---- source/configure.in.orig 2005-05-29 14:46:18.000000000 -0700 -+++ source/configure.in 2005-05-29 14:51:57.000000000 -0700 -@@ -588,7 +588,7 @@ - # Tests for linux LFS support. Need kernel 2.4 and glibc2.2 or greater support. - # - *linux*) -- AC_MSG_CHECKING([for LFS support]) -+ AC_CACHE_CHECK([for LFS support], samba_cv_LINUX_LFS_SUPPORT,[ - old_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE $CPPFLAGS" - AC_TRY_RUN([ -@@ -627,15 +627,14 @@ - exit(1); - #endif - } --], [LINUX_LFS_SUPPORT=yes], [LINUX_LFS_SUPPORT=no], [LINUX_LFS_SUPPORT=cross]) -- CPPFLAGS="$old_CPPFLAGS" -- if test x$LINUX_LFS_SUPPORT = xyes ; then -+], [samba_cv_LINUX_LFS_SUPPORT=yes], [samba_cv_LINUX_LFS_SUPPORT=no], [samba_cv_LINUX_LFS_SUPPORT=cross]) -+ CPPFLAGS="$old_CPPFLAGS"]) -+ if test x"$samba_cv_LINUX_LFS_SUPPORT" = x"yes" ; then - CPPFLAGS="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE $CPPFLAGS" - AC_DEFINE(_LARGEFILE64_SOURCE, 1, [Whether to enable large file support]) - AC_DEFINE(_FILE_OFFSET_BITS, 64, [File offset bits]) - AC_DEFINE(_GNU_SOURCE, 1, [Whether to use GNU libc extensions]) - fi -- AC_MSG_RESULT([$LINUX_LFS_SUPPORT]) - ;; - - # diff --git a/meta-openvuplus/recipes-base/samba/samba/init b/meta-openvuplus/recipes-base/samba/samba/init deleted file mode 100644 index cb57b17..0000000 --- a/meta-openvuplus/recipes-base/samba/samba/init +++ /dev/null @@ -1,58 +0,0 @@ -#! /bin/sh -# -# This is an init script for openembedded -# Copy it to /etc/init.d/samba and type -# > update-rc.d samba defaults 60 -# - - -smbd=/usr/sbin/smbd -test -x "$smbd" || exit 0 -nmbd=/usr/sbin/nmbd -test -x "$nmbd" || exit 0 - - -case "$1" in - start) - echo -n "Starting Samba: smbd" - start-stop-daemon --start --quiet --exec $smbd - echo -n " nmbd" - start-stop-daemon --start --quiet --exec $nmbd - echo "." - ;; - stop) - echo -n "Stopping Samba: smbd" - start-stop-daemon --stop --quiet --pidfile /var/run/smbd.pid - echo -n " nmbd" - start-stop-daemon --stop --quiet --pidfile /var/run/nmbd.pid - echo "." - ;; - reload|force-reload) - start-stop-daemon --stop --quiet --signal 1 --exec $smbd - start-stop-daemon --stop --quiet --signal 1 --exec $nmbd - ;; - restart) - echo -n "Stopping Samba: smbd" - start-stop-daemon --stop --quiet --pidfile /var/run/smbd.pid - echo -n " nmbd" - start-stop-daemon --stop --quiet --pidfile /var/run/nmbd.pid - echo "" - echo -n "Waiting for samba processes to die off" - for i in 1 2 3 ; - do - sleep 1 - echo -n "." - done - echo "" - echo -n "Starting Samba: smbd" - start-stop-daemon --start --quiet --exec $smbd - echo -n " nmbd" - start-stop-daemon --start --quiet --exec $nmbd - echo "." - ;; - *) - echo "Usage: /etc/init.d/samba {start|stop|reload|restart|force-reload}" - exit 1 -esac - -exit 0 \ No newline at end of file diff --git a/meta-openvuplus/recipes-base/samba/samba/quota.patch b/meta-openvuplus/recipes-base/samba/samba/quota.patch deleted file mode 100644 index 6f42ff8..0000000 --- a/meta-openvuplus/recipes-base/samba/samba/quota.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- lib/sysquotas_4A.c.old 2005-07-03 17:16:00.000000000 +0200 -+++ lib/sysquotas_4A.c 2005-07-03 17:10:09.000000000 +0200 -@@ -28,6 +28,8 @@ - /* long quotactl(int cmd, char *special, qid_t id, caddr_t addr) */ - /* this is used by: HPUX,IRIX */ - -+ #define _LINUX_QUOTA_VERSION 1 -+ - #ifdef HAVE_SYS_TYPES_H - #include - #endif diff --git a/meta-openvuplus/recipes-base/samba/samba/smb.conf b/meta-openvuplus/recipes-base/samba/samba/smb.conf deleted file mode 100644 index 83ac00d..0000000 --- a/meta-openvuplus/recipes-base/samba/samba/smb.conf +++ /dev/null @@ -1,29 +0,0 @@ -[global] - load printers = no - guest account = root - log file = /tmp/smb.log - log level = 1 - security = share - server string = Dreambox %h network services - workgroup = Dream - netbios name = %h - case sensitive=yes - preserve case=yes - short preserve case=yes - socket options = TCP_NODELAY - preferred master = no ;(These stop the machine being master browser, which means that it doesn't waste time there.) - oplocks = no - -[Configuration] - comment = Configuration files - take care! - path = /var - read only = no - public = yes - guest ok = yes - -[Harddisk] - comment = The harddisk - path = /media/hdd - read only = no - public = yes - guest ok = yes diff --git a/meta-openvuplus/recipes-base/samba/samba/tdb.pc b/meta-openvuplus/recipes-base/samba/samba/tdb.pc deleted file mode 100644 index 6307a20..0000000 --- a/meta-openvuplus/recipes-base/samba/samba/tdb.pc +++ /dev/null @@ -1,11 +0,0 @@ -prefix=/usr -exec_prefix=/usr -libdir=/usr/lib -includedir=/usr/include - -Name: tdb -Description: A trivial database -Version: 1.1.2 -Libs: -L${libdir} -ltdb -Cflags: -I${includedir} -URL: http://tdb.samba.org/ diff --git a/meta-openvuplus/recipes-base/samba/samba/volatiles.03_samba b/meta-openvuplus/recipes-base/samba/samba/volatiles.03_samba deleted file mode 100644 index 469bc9e..0000000 --- a/meta-openvuplus/recipes-base/samba/samba/volatiles.03_samba +++ /dev/null @@ -1,2 +0,0 @@ -# -d root root 0755 /var/log/samba none diff --git a/meta-openvuplus/recipes-base/samba/samba_3.0.37.bb b/meta-openvuplus/recipes-base/samba/samba_3.0.37.bb deleted file mode 100644 index eb05c71..0000000 --- a/meta-openvuplus/recipes-base/samba/samba_3.0.37.bb +++ /dev/null @@ -1,20 +0,0 @@ -require recipes-connectivity/samba/samba.inc -require recipes-connectivity/samba/samba-basic.inc -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://../COPYING;md5=8ca43cbc842c2336e835926c2166c28b" -PR = "r2" - -SRC_URI += "file://configure.patch \ - file://kernel-oplocks.patch \ - file://0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch \ - file://samba-3.0-CVE-2012-0870.patch \ - file://samba-3.0.37-CVE-2012-1182.patch" -SRC_URI_append_linux-uclibc = "file://uclibc-strlcpy-strlcat.patch" -SRC_URI_append_linux-uclibceabi = "file://uclibc-strlcpy-strlcat.patch" - -EXTRA_OECONF += "\ - SMB_BUILD_CC_NEGATIVE_ENUM_VALUES=yes \ - " - -SRC_URI[md5sum] = "11ed2bfef4090bd5736b194b43f67289" -SRC_URI[sha256sum] = "bb67c0e13d4ccbd84b9200c8739393fdd9b3145b5aad216934dc670f0fcea266" diff --git a/meta-openvuplus/recipes-base/samba/samba_3.0.37.bbappend b/meta-openvuplus/recipes-base/samba/samba_3.0.37.bbappend deleted file mode 100644 index c6512c2..0000000 --- a/meta-openvuplus/recipes-base/samba/samba_3.0.37.bbappend +++ /dev/null @@ -1,31 +0,0 @@ -PR .= "-vuplus0" - -SRC_URI += " \ - file://01samba-kill \ - file://01samba-start \ -" - -PACKAGES =+ "smbfs smbfs-doc sambaserver libpopt libtalloc" - -FILES_smbfs = "${bindir}/smbmount ${bindir}/smbumount ${bindir}/smbmnt ${base_sbindir}/mount.smbfs ${base_sbindir}/mount.smb" -FILES_smbfs-doc = "${mandir}/man8/smbmount.8 ${mandir}/man8/smbumount.8 ${mandir}/man8/smbmnt.8" -FILES_sambaserver = "${sbindir}/smbd ${sbindir}/nmbd ${libdir}/charset/*.so ${libdir}/*.dat \ - ${sysconfdir}/samba/smb.conf ${sysconfdir}/samba/private \ - ${sysconfdir}/network/if-up.d/01samba-start ${sysconfdir}/network/if-down.d/01samba-kill" -FILES_libpopt = "${libdir}/libpopt.so.*" -FILES_libtalloc = "${libdir}/libtalloc.so.*" - -CONFFILES_${PN} = "" -CONFFILES_sambaserver = "${sysconfdir}/samba/smb.conf" - -do_install_prepend() { - install -c -m 644 ${WORKDIR}/smb.conf ../examples/smb.conf.default -} - -do_install_append() { - install -d ${D}${sysconfdir}/samba/private - install -d ${D}${sysconfdir}/network/if-down.d - install -m 0755 ${WORKDIR}/01samba-kill ${D}${sysconfdir}/network/if-down.d - install -d ${D}${sysconfdir}/network/if-up.d - install -m 0755 ${WORKDIR}/01samba-start ${D}${sysconfdir}/network/if-up.d -} diff --git a/meta-openvuplus/recipes-base/shadow/shadow-securetty/securetty b/meta-openvuplus/recipes-base/shadow/shadow-securetty/securetty deleted file mode 100644 index e1dfa24..0000000 --- a/meta-openvuplus/recipes-base/shadow/shadow-securetty/securetty +++ /dev/null @@ -1,275 +0,0 @@ -# /etc/securetty: list of terminals on which root is allowed to login. -# See securetty(5) and login(1). -console - -# Standard serial ports -ttyS0 -ttyS1 -ttyS2 -ttyS3 - -# Samsung ARM SoCs -ttySAC0 -ttySAC1 -ttySAC2 -ttySAC3 - -# TI OMAP SoCs -ttyO0 -ttyO1 -ttyO2 -ttyO3 - -# USB dongles -ttyUSB0 -ttyUSB1 -ttyUSB2 - -# USB serial gadget -ttyGS0 - -# PowerMac -ttyPZ0 -ttyPZ1 -ttyPZ2 -ttyPZ3 - -# Embedded MPC platforms -ttyPSC0 -ttyPSC1 -ttyPSC2 -ttyPSC3 -ttyPSC4 -ttyPSC5 - -# PA-RISC mux ports -ttyB0 -ttyB1 - -# Standard hypervisor virtual console -hvc0 - -# Oldstyle Xen console -xvc0 - -# Standard consoles -tty1 -tty2 -tty3 -tty4 -tty5 -tty6 -tty7 -tty8 -tty9 -tty10 -tty11 -tty12 -tty13 -tty14 -tty15 -tty16 -tty17 -tty18 -tty19 -tty20 -tty21 -tty22 -tty23 -tty24 -tty25 -tty26 -tty27 -tty28 -tty29 -tty30 -tty31 -tty32 -tty33 -tty34 -tty35 -tty36 -tty37 -tty38 -tty39 -tty40 -tty41 -tty42 -tty43 -tty44 -tty45 -tty46 -tty47 -tty48 -tty49 -tty50 -tty51 -tty52 -tty53 -tty54 -tty55 -tty56 -tty57 -tty58 -tty59 -tty60 -tty61 -tty62 -tty63 - -# Local X displays (allows empty passwords with pam_unix's nullok_secure) -:0 -:0.0 -:0.1 -:1 -:1.0 -:1.1 -:2 -:2.0 -:2.1 -:3 -:3.0 -:3.1 - -# Embedded Freescale i.MX ports -ttymxc0 -ttymxc1 -ttymxc2 -ttymxc3 -ttymxc4 -ttymxc5 - -# Standard serial ports, with devfs -tts/0 -tts/1 - -# Standard consoles, with devfs -vc/1 -vc/2 -vc/3 -vc/4 -vc/5 -vc/6 -vc/7 -vc/8 -vc/9 -vc/10 -vc/11 -vc/12 -vc/13 -vc/14 -vc/15 -vc/16 -vc/17 -vc/18 -vc/19 -vc/20 -vc/21 -vc/22 -vc/23 -vc/24 -vc/25 -vc/26 -vc/27 -vc/28 -vc/29 -vc/30 -vc/31 -vc/32 -vc/33 -vc/34 -vc/35 -vc/36 -vc/37 -vc/38 -vc/39 -vc/40 -vc/41 -vc/42 -vc/43 -vc/44 -vc/45 -vc/46 -vc/47 -vc/48 -vc/49 -vc/50 -vc/51 -vc/52 -vc/53 -vc/54 -vc/55 -vc/56 -vc/57 -vc/58 -vc/59 -vc/60 -vc/61 -vc/62 -vc/63 - -# Pseudo terminals -pts/0 -pts/1 -pts/2 -pts/3 -pts/4 -pts/5 -pts/6 -pts/7 -pts/8 -pts/9 -pts/10 -pts/11 -pts/12 -pts/13 -pts/14 -pts/15 -pts/16 -pts/17 -pts/18 -pts/19 -pts/20 -pts/21 -pts/22 -pts/23 -pts/24 -pts/25 -pts/26 -pts/27 -pts/28 -pts/29 -pts/30 -pts/31 -pts/32 -pts/33 -pts/34 -pts/35 -pts/36 -pts/37 -pts/38 -pts/39 -pts/40 -pts/41 -pts/42 -pts/43 -pts/44 -pts/45 -pts/46 -pts/47 -pts/48 -pts/49 -pts/50 -pts/51 -pts/52 -pts/53 -pts/54 -pts/55 -pts/56 -pts/57 -pts/58 -pts/59 -pts/60 -pts/61 -pts/62 -pts/63 diff --git a/meta-openvuplus/recipes-base/shadow/shadow-securetty_4.1.4.3.bbappend b/meta-openvuplus/recipes-base/shadow/shadow-securetty_4.1.4.3.bbappend deleted file mode 100644 index f6a5fef..0000000 --- a/meta-openvuplus/recipes-base/shadow/shadow-securetty_4.1.4.3.bbappend +++ /dev/null @@ -1,3 +0,0 @@ -PR .= "-vuplus0" - -FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" diff --git a/meta-openvuplus/recipes-base/smartmontools/smartmontools.inc b/meta-openvuplus/recipes-base/smartmontools/smartmontools.inc deleted file mode 100644 index c1ded3a..0000000 --- a/meta-openvuplus/recipes-base/smartmontools/smartmontools.inc +++ /dev/null @@ -1,10 +0,0 @@ -SECTION = "console/utils" -SUMMARY = "Control and monitor storage systems using S.M.A.R.T." -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" -INC_PR = "r1" - -SRC_URI = "${SOURCEFORGE_MIRROR}/smartmontools/smartmontools-${PV}.tar.gz" -S = "${WORKDIR}/smartmontools-${PV}" - -inherit autotools diff --git a/meta-openvuplus/recipes-base/smartmontools/smartmontools_5.42.bb b/meta-openvuplus/recipes-base/smartmontools/smartmontools_5.42.bb deleted file mode 100644 index 98ebb37..0000000 --- a/meta-openvuplus/recipes-base/smartmontools/smartmontools_5.42.bb +++ /dev/null @@ -1,6 +0,0 @@ -PR = "${INC_PR}.0" - -SRC_URI[md5sum] = "4460bf9a79a1252ff5c00ba52cf76b2a" -SRC_URI[sha256sum] = "b664d11e814e114ce3a32a4fa918c9e649c684e2897c007b2a8b92574decc374" - -require smartmontools.inc diff --git a/meta-openvuplus/recipes-base/tasks/task-vuplus-base.bb b/meta-openvuplus/recipes-base/tasks/task-vuplus-base.bb deleted file mode 100644 index 248b97d..0000000 --- a/meta-openvuplus/recipes-base/tasks/task-vuplus-base.bb +++ /dev/null @@ -1,8 +0,0 @@ -PR = "${INC_PR}.0" - -RDEPENDS_${PN} = " \ - dropbear-xinetd \ - vsftpd-xinetd \ -" - -require task-vuplus-base.inc diff --git a/meta-openvuplus/recipes-base/tasks/task-vuplus-base.inc b/meta-openvuplus/recipes-base/tasks/task-vuplus-base.inc deleted file mode 100644 index c3968d6..0000000 --- a/meta-openvuplus/recipes-base/tasks/task-vuplus-base.inc +++ /dev/null @@ -1,77 +0,0 @@ -SUMMARY = "Vuplus: Base Task for Vuplus." -SECTION = "vuplus/base" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" -INC_PR = "r0" - -inherit task - -VUPLUS_BASE_ESSENTIAL = "\ - autofs \ - vuplus-compat \ - dreambox-keymaps \ - e2fsprogs-e2fsck \ - e2fsprogs-mke2fs \ - fakelocale \ - opkg \ - timezones-alternative \ - tuxbox-common \ - util-linux-sfdisk \ - vsftpd \ - mtd-utils \ - hdparm \ - usbtunerhelper \ - ${VUPLUS_FIRMWARE_DVB} \ -" - -VUPLUS_FIRMWARE_DVB = " \ - firmware-dvb-af9005 \ - firmware-dvb-fe-af9013 \ - firmware-dvb-usb-af9015 \ - firmware-dvb-usb-af9035 \ - firmware-dvb-usb-avertv-a800 \ - firmware-dvb-usb-dib0700 \ - firmware-dvb-usb-dibusb \ - firmware-dvb-usb-digitv \ - firmware-dvb-usb-nova-t-usb2 \ - firmware-dvb-usb-sms1xxx-nova-dvbt \ - firmware-dvb-usb-sms1xxx-hcw-dvbt \ - firmware-dvb-usb-ttusb-budget \ - firmware-dvb-usb-umt-010 \ - firmware-dvb-usb-xc5000 \ - firmware-dvb-usb-wt220u-zl0353 \ - firmware-drxd-a2 \ -" - -# chang : use xinetd instead of netkit-base. -# chang : mkfs-ubifs and mkfs-jffs2 are included in mtd-utils. - -VUPLUS_BASE_RECOMMENDS = "\ - dropbear \ - vuplus-vucamd \ - sambaserver \ - openvpn \ - zeroconf \ -" - -#VUPLUS_BASE_RECOMMENDS_append_vuuno = " vuplus-fpga-update" -#VUPLUS_BASE_RECOMMENDS_append_vuultimo = " vuplus-fpga-update" - -VUPLUS_BASE_OPTIONAL_RECOMMENDS = "\ - hddtemp \ - joe \ - mc \ - ncdu \ - ppp \ - smartmontools \ - avahi-daemon \ -" - -RDEPENDS_${PN} += "\ - ${VUPLUS_BASE_ESSENTIAL} \ -" - -RRECOMMENDS_${PN} += "\ - ${VUPLUS_BASE_RECOMMENDS} \ - ${VUPLUS_BASE_OPTIONAL_RECOMMENDS} \ -" diff --git a/meta-openvuplus/recipes-base/timezones/files/GPL-1.0 b/meta-openvuplus/recipes-base/timezones/files/GPL-1.0 deleted file mode 100644 index 9d4ef93..0000000 --- a/meta-openvuplus/recipes-base/timezones/files/GPL-1.0 +++ /dev/null @@ -1,252 +0,0 @@ - -GNU General Public License, version 1 - - GNU GENERAL PUBLIC LICENSE - Version 1, February 1989 - - Copyright (C) 1989 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The license agreements of most software companies try to keep users -at the mercy of those companies. By contrast, our General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. The -General Public License applies to the Free Software Foundation`s -software and to any other program whose authors commit to using it. -You can use it for your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Specifically, the General Public License is designed to make -sure that you have the freedom to give away or sell copies of free -software, that you receive source code or can get it if you want it, -that you can change the software or use pieces of it in new free -programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of a such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must tell them their rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author`s protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors` reputations. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any program or other work which -contains a notice placed by the copyright holder saying it may be -distributed under the terms of this General Public License. The -"Program", below, refers to any such program or work, and a "work based -on the Program" means either the Program or any work containing the -Program or a portion of it, either verbatim or with modifications. Each -licensee is addressed as "you". - - 1. You may copy and distribute verbatim copies of the Program`s source -code as you receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice and -disclaimer of warranty; keep intact all the notices that refer to this -General Public License and to the absence of any warranty; and give any -other recipients of the Program a copy of this General Public License -along with the Program. You may charge a fee for the physical act of -transferring a copy. - - 2. You may modify your copy or copies of the Program or any portion of -it, and copy and distribute such modifications under the terms of Paragraph -1 above, provided that you also do the following: - - a) cause the modified files to carry prominent notices stating that - you changed the files and the date of any change; and - - b) cause the whole of any work that you distribute or publish, that - in whole or in part contains the Program or any part thereof, either - with or without modifications, to be licensed at no charge to all - third parties under the terms of this General Public License (except - that you may choose to grant warranty protection to some or all - third parties, at your option). - - c) If the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the simplest and most usual way, to print or display an - announcement including an appropriate copyright notice and a notice - that there is no warranty (or else, saying that you provide a - warranty) and that users may redistribute the program under these - conditions, and telling the user how to view a copy of this General - Public License. - - d) You may charge a fee for the physical act of transferring a - copy, and you may at your option offer warranty protection in - exchange for a fee. - -Mere aggregation of another independent work with the Program (or its -derivative) on a volume of a storage or distribution medium does not bring -the other work under the scope of these terms. - - 3. You may copy and distribute the Program (or a portion or derivative of -it, under Paragraph 2) in object code or executable form under the terms of -Paragraphs 1 and 2 above provided that you also do one of the following: - - a) accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of - Paragraphs 1 and 2 above; or, - - b) accompany it with a written offer, valid for at least three - years, to give any third party free (except for a nominal charge - for the cost of distribution) a complete machine-readable copy of the - corresponding source code, to be distributed under the terms of - Paragraphs 1 and 2 above; or, - - c) accompany it with the information you received as to where the - corresponding source code may be obtained. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form alone.) - -Source code for a work means the preferred form of the work for making -modifications to it. For an executable file, complete source code means -all the source code for all modules it contains; but, as a special -exception, it need not include source code for modules which are standard -libraries that accompany the operating system on which the executable -file runs, or for standard header files or definitions files that -accompany that operating system. - - 4. You may not copy, modify, sublicense, distribute or transfer the -Program except as expressly provided under this General Public License. -Any attempt otherwise to copy, modify, sublicense, distribute or transfer -the Program is void, and will automatically terminate your rights to use -the Program under this License. However, parties who have received -copies, or rights to use copies, from you under this General Public -License will not have their licenses terminated so long as such parties -remain in full compliance. - - 5. By copying, distributing or modifying the Program (or any work based -on the Program) you indicate your acceptance of this license to do so, -and all its terms and conditions. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the original -licensor to copy, distribute or modify the Program subject to these -terms and conditions. You may not impose any further restrictions on the -recipients` exercise of the rights granted herein. - - 7. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of the license which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -the license, you may choose any version ever published by the Free Software -Foundation. - - 8. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to humanity, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is safest to -attach them to the start of each source file to most effectively convey -the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19xx name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w`. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c` for details. - -The hypothetical commands `show w` and `show c` should show the -appropriate parts of the General Public License. Of course, the -commands you use may be called something other than `show w` and `show -c`; they could even be mouse-clicks or menu items--whatever suits your -program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - program `Gnomovision` (a program to direct compilers to make passes - at assemblers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -That`s all there is to it! - diff --git a/meta-openvuplus/recipes-base/timezones/files/zoneinfo.tar.bz2 b/meta-openvuplus/recipes-base/timezones/files/zoneinfo.tar.bz2 deleted file mode 100644 index 19fa9288a79ad1615c587d728e988f970e57c0b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38585 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 FYi1d7toi@| diff --git a/meta-openvuplus/recipes-base/timezones/timezones-alternative.bb b/meta-openvuplus/recipes-base/timezones/timezones-alternative.bb deleted file mode 100644 index 0fb50f3..0000000 --- a/meta-openvuplus/recipes-base/timezones/timezones-alternative.bb +++ /dev/null @@ -1,25 +0,0 @@ -DESCRIPTION = "Timezone data, alternative" -SECTION = "base" -PRIORITY = "optional" -MAINTAINER = "Felix Domke " -LICENSE = "GPL" -LIC_FILES_CHKSUM = "file://${THISDIR}/files/GPL-1.0;md5=e9e36a9de734199567a4d769498f743d" - -PV = "2008i" -PR = "r0" - -SRC_URI = "file://zoneinfo.tar.bz2" -S = "${WORKDIR}/zoneinfo" - -FILES_${PN} = "usr/share/zoneinfo/[A-Z]*" -PACKAGE_ARCH = "all" - -do_install() { - install -d ${D}/usr/share/zoneinfo/ - - for file in ${S}/* - do - [ -f $file ] && install -m 644 "$file" ${D}/usr/share/zoneinfo/ - done; - true; -} diff --git a/meta-openvuplus/recipes-base/tuxbox/tuxbox-common_0.1.bb b/meta-openvuplus/recipes-base/tuxbox/tuxbox-common_0.1.bb deleted file mode 100644 index 6b24cc0..0000000 --- a/meta-openvuplus/recipes-base/tuxbox/tuxbox-common_0.1.bb +++ /dev/null @@ -1,19 +0,0 @@ -SUMMARY = "Tuxbox common files" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" -SRCREV = "77ff3efbac5eb01c2fc914ba8fb99374d0970ff5" -PR = "r1" - -inherit opendreambox-git - -do_install() { - install -d ${D}${sysconfdir} - install -d ${D}${sysconfdir}/tuxbox - install -m 0644 timezone.xml ${D}${sysconfdir} - install -m 0644 satellites.xml ${D}${sysconfdir}/tuxbox - install -m 0644 terrestrial.xml ${D}${sysconfdir}/tuxbox -} - -FILES_${PN} = "${sysconfdir}" - -OPENDREAMBOX_PROJECT = "obi/enigma2-xml-data" diff --git a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp.bb b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp.bb deleted file mode 100644 index cd08ee9..0000000 --- a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp.bb +++ /dev/null @@ -1,32 +0,0 @@ -SUMMARY = "TuxCom for 800/7025/8000/32bit framebuffer HD Autosize" -LICENSE = "Proprietary" -LIC_FILES_CHKSUM = "file://tuxcom.c;endline=23;md5=33c69eb2b4a436ea9e00355b66c21dd9" -DEPENDS = "freetype" -RDEPENDS_${PN} = "enigma2" -SRCDATE = "20070410" -PV = "1.16+cvs${SRCDATE}" -PR = "r0" - -SRC_URI = "cvs://anoncvs@cvs.tuxbox.org/cvs/tuxbox;module=apps/tuxbox/plugins/tuxcom;method=ext \ - file://makefiles.diff \ - file://add_font.diff \ - file://32bpp.diff \ - file://add_e2_plugin.diff \ - file://largefile.diff \ - file://support_newer_freetype.diff \ - file://fix_smstext.diff \ -" - -S = "${WORKDIR}/tuxcom" - -inherit autotools - -EXTRA_OECONF = "--with-target=native" - -do_configure_prepend() { - touch ${S}/python/__init__.py -} - -FILES_${PN} = "${bindir}/tuxcom ${libdir}/enigma2 /etc/tuxcom ${datadir}/fonts/pakenham.ttf" - -CPPFLAGS += "-DHAVE_DREAMBOX_HARDWARE -DDREAMBOX" diff --git a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff deleted file mode 100644 index 474df99..0000000 --- a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff +++ /dev/null @@ -1,1136 +0,0 @@ -diff -Naur tuxcom.ori/tuxcom.c tuxcom/tuxcom.c ---- tuxcom.ori/tuxcom.c 2009-01-06 00:12:19.000000000 +0100 -+++ tuxcom/tuxcom.c 2009-01-05 21:10:35.000000000 +0100 -@@ -27,7 +27,7 @@ - * GetRCCode (Code from Tuxmail) - ******************************************************************************/ - --#ifndef HAVE_DREAMBOX_HARDWARE -+ - - int GetRCCode(int mode) - { -@@ -36,7 +36,8 @@ - struct input_event ev; - static __u16 rc_last_key = KEY_RESERVED; - static __u16 rc_last_code = KEY_RESERVED; -- if(read(rc, &ev, sizeof(ev)) == sizeof(ev)) -+ if ((read(rc[0], &ev, sizeof(ev)) == sizeof(ev)) || -+ (rc[1] != -1 && read(rc[1], &ev, sizeof(ev)) == sizeof(ev))) - { - if(ev.value) - { -@@ -63,9 +64,9 @@ - case KEY_GREEN: rccode = RC_GREEN; break; - case KEY_YELLOW: rccode = RC_YELLOW; break; - case KEY_BLUE: rccode = RC_BLUE; break; -- case KEY_HELP: rccode = RC_HELP; break; -- case KEY_SETUP: rccode = RC_DBOX; break; -- case KEY_HOME: rccode = RC_HOME; break; -+ case KEY_INFO: rccode = RC_HELP; break; -+ case KEY_MENU: rccode = RC_DBOX; break; -+ case KEY_EXIT: rccode = RC_HOME; break; - case KEY_POWER: rccode = RC_STANDBY; break; - default: - if( ev.code > 0x7F ) -@@ -118,176 +119,94 @@ - } - } - -- rccode = -1; -- usleep(1000000/100); -- return 0; --} -- --#else -- --int GetRCCode(int mode) --{ -- static int count = 0; -- //get code -- static unsigned short LastKey = -1; -- static char LastKBCode = 0x00; -- rccode = -1; -- int bytesavail = 0; -- int bytesread = read(rc, &rccode, 2); -- unsigned short tmprc; -- kbcode = 0; -- -- if (bytesread == 2) -- { -- if (read(rc, &tmprc, 2) == 2) -- { -- if (rccode == tmprc && count >= 0) -- count++; -- } -- } -- -- -- // Tastaturabfrage -- ioctl(kb, FIONREAD, &bytesavail); -- if (bytesavail>0) -- { -- char tch[100]; -- if (bytesavail > 99) bytesavail = 99; -- read(kb,tch,bytesavail); -- tch[bytesavail] = 0x00; -- kbcode = tch[0]; -- LastKBCode = kbcode; -- if (bytesavail == 1 && kbcode == 0x1b) { LastKey = RC_HOME ; rccode = -1 ; count = -1; return 1;} // ESC-Taste -- if (bytesavail == 1 && kbcode == '\n') { LastKey = RC_OK ; rccode = -1 ; count = -1; return 1;} // Enter-Taste -- if (bytesavail == 1 && kbcode == '+' ) { LastKey = RC_PLUS ; rccode = -1 ; count = -1; return 1;} -- if (bytesavail == 1 && kbcode == '-' ) { LastKey = RC_MINUS; rccode = -1 ; count = -1; return 1;} -- if (bytesavail >= 3 && tch[0] == 0x1b && tch[1] == 0x5b) -- { -- if (tch[2] == 0x41 ) { kbcode = LastKBCode = 0x00; rccode = RC_UP ; LastKey = rccode; count = -1; return 1; }// Cursortasten -- if (tch[2] == 0x42 ) { kbcode = LastKBCode = 0x00; rccode = RC_DOWN ; LastKey = rccode; count = -1; return 1; }// Cursortasten -- if (tch[2] == 0x43 ) { kbcode = LastKBCode = 0x00; rccode = RC_RIGHT ; LastKey = rccode; count = -1; return 1; }// Cursortasten -- if (tch[2] == 0x44 ) { kbcode = LastKBCode = 0x00; rccode = RC_LEFT ; LastKey = rccode; count = -1; return 1; }// Cursortasten -- if (tch[2] == 0x33 && tch[3] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_MINUS ; LastKey = rccode; count = -1; return 1; }// entf-Taste -- if (tch[2] == 0x32 && tch[3] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_PLUS ; LastKey = rccode; count = -1; return 1; }// einf-Taste -- if (tch[2] == 0x35 && tch[3] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_PLUS ; LastKey = rccode; count = -1; return 1; }// PgUp-Taste -- if (tch[2] == 0x36 && tch[3] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_MINUS ; LastKey = rccode; count = -1; return 1; }// PgDn-Taste -- if (tch[2] == 0x5b && tch[3] == 0x45) { kbcode = LastKBCode = 0x00; rccode = RC_RED ; LastKey = rccode; count = -1; return 1; }// F5-Taste -- if (tch[2] == 0x31 && tch[3] == 0x37 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_GREEN ; LastKey = rccode; count = -1; return 1; }// F6-Taste -- if (tch[2] == 0x31 && tch[3] == 0x38 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_YELLOW ; LastKey = rccode; count = -1; return 1; }// F7-Taste -- if (tch[2] == 0x31 && tch[3] == 0x39 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_BLUE ; LastKey = rccode; count = -1; return 1; }// F8-Taste -- if (tch[2] == 0x32 && tch[3] == 0x30 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_DBOX ; LastKey = rccode; count = -1; return 1; }// F9-Taste -- if (tch[2] == 0x32 && tch[3] == 0x31 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_HELP ; LastKey = rccode; count = -1; return 1; }// F10-Taste -- if (tch[2] == 0x32 && tch[3] == 0x33 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_MUTE ; LastKey = rccode; count = -1; return 1; }// F11-Taste -- } -- if (mode == RC_EDIT) -- { --/* -- char tmsg[100]; -- int i; -- sprintf(tmsg,"KeyboardCode:avail:%d, char:%c, rccode:%x ",bytesavail,(kbcode == 0x00 ? '*' : kbcode ),rccode); -- for (i = 0; i < bytesavail; i++) sprintf(tmsg,"%s%x",tmsg,tch[i]); -- MessageBox(tmsg,"",NOBUTTON); --*/ -- LastKey = rccode; -- count = -1; -- switch (rccode) -- { -- case KEY_0: -- case KEY_1: -- case KEY_2: -- case KEY_3: -- case KEY_4: -- case KEY_5: -- case KEY_6: -- case KEY_7: -- case KEY_8: -- case KEY_9: -- // SMS-Style verhindern -- rccode = -1; -- break; -- } -- return 1; -- } -- else if (bytesread <= 0) -- { -- if (kbcode == '0') { kbcode = 0x00;rccode = RC_0 ; LastKey = rccode; return 1;} -- if (kbcode == '1') { kbcode = 0x00;rccode = RC_1 ; LastKey = rccode; return 1;} -- if (kbcode == '2') { kbcode = 0x00;rccode = RC_2 ; LastKey = rccode; return 1;} -- if (kbcode == '3') { kbcode = 0x00;rccode = RC_3 ; LastKey = rccode; return 1;} -- if (kbcode == '4') { kbcode = 0x00;rccode = RC_4 ; LastKey = rccode; return 1;} -- if (kbcode == '5') { kbcode = 0x00;rccode = RC_5 ; LastKey = rccode; return 1;} -- if (kbcode == '6') { kbcode = 0x00;rccode = RC_6 ; LastKey = rccode; return 1;} -- if (kbcode == '7') { kbcode = 0x00;rccode = RC_7 ; LastKey = rccode; return 1;} -- if (kbcode == '8') { kbcode = 0x00;rccode = RC_8 ; LastKey = rccode; return 1;} -- if (kbcode == '9') { kbcode = 0x00;rccode = RC_9 ; LastKey = rccode; return 1;} -- } -- } -- if (bytesread == 2) -+ count=0; -+ if(read(kb, &ev, sizeof(ev)) == sizeof(ev)) - { -- if (rccode == LastKey && LastKBCode != 0x00 && LastKBCode == kbcode) -- { -- return 1; -- } -- LastKBCode = 0x00; -- if (rccode == LastKey) -+ if(ev.value) - { -- if (count < REPEAT_TIMER) -+ if(ev.code == rc_last_key) - { -- if (count >= 0) -+ if (count < REPEAT_TIMER) -+ { - count++; -- rccode = -1; -- return 1; -+ rccode = -1; -+ return 1; -+ } - } -- } -- else -- count = 0; -- LastKey = rccode; -- if ((rccode & 0xFF00) == 0x5C00) -- { -- kbcode = 0; -- switch(rccode) -+ else -+ count = 0; -+ rc_last_key = ev.code; -+ switch(ev.code) - { - case KEY_UP: rccode = RC_UP; break; - case KEY_DOWN: rccode = RC_DOWN; break; - case KEY_LEFT: rccode = RC_LEFT; break; - case KEY_RIGHT: rccode = RC_RIGHT; break; - case KEY_OK: rccode = RC_OK; break; -- case KEY_0: rccode = RC_0; break; -- case KEY_1: rccode = RC_1; break; -- case KEY_2: rccode = RC_2; break; -- case KEY_3: rccode = RC_3; break; -- case KEY_4: rccode = RC_4; break; -- case KEY_5: rccode = RC_5; break; -- case KEY_6: rccode = RC_6; break; -- case KEY_7: rccode = RC_7; break; -- case KEY_8: rccode = RC_8; break; -- case KEY_9: rccode = RC_9; break; - case KEY_RED: rccode = RC_RED; break; - case KEY_GREEN: rccode = RC_GREEN; break; - case KEY_YELLOW: rccode = RC_YELLOW; break; - case KEY_BLUE: rccode = RC_BLUE; break; -- case KEY_VOLUMEUP: rccode = RC_PLUS; break; -- case KEY_VOLUMEDOWN:rccode = RC_MINUS; break; -- case KEY_MUTE: rccode = RC_MUTE; break; -- case KEY_HELP: rccode = RC_HELP; break; -- case KEY_SETUP: rccode = RC_DBOX; break; -- case KEY_HOME: rccode = RC_HOME; break; -+ case KEY_INFO: rccode = RC_HELP; break; -+ case KEY_MENU: rccode = RC_DBOX; break; -+ case KEY_EXIT: rccode = RC_HOME; break; - case KEY_POWER: rccode = RC_STANDBY; break; -+ default: -+ if( ev.code > 0x7F ) -+ { -+ rccode = 0; -+ if( ev.code == 0x110 ) -+ { -+ rccode = RC_ON; -+ } -+ } -+ else -+ { -+ rccode = rctable[ev.code & 0x7F]; -+ } -+ if( rc_last_code == RC_LSHIFT ) -+ { -+ if( ev.code <= 0x56 ) //(sizeof(rcshifttable)/sizeof(int)-1) -+ { -+ rccode = rcshifttable[ev.code]; -+ } -+ } -+ else if( rc_last_code == RC_ALTGR ) -+ { -+ if( ev.code <= 0x56 ) //(sizeof(rcaltgrtable)/sizeof(int)-1) -+ { -+ rccode = rcaltgrtable[ev.code]; -+ } -+ } -+ else if( rc_last_code == RC_ALT ) -+ { -+ if((ev.code >=2) && ( ev.code <= 11 )) -+ { -+ rccode = (ev.code-1) | 0x0200; -+ } -+ } -+// if( !rccode ) -+ { -+// rccode = -1; -+ } -+ - } -+ rc_last_code = rccode; - return 1; - } - else - { -- rccode &= 0x003F; -+ rccode = -1; -+ rc_last_key = KEY_RESERVED; -+ rc_last_code = KEY_RESERVED; - } -- return 0; - } - - rccode = -1; - usleep(1000000/100); - return 0; - } --#endif -+ - - /****************************************************************************** - * MyFaceRequester -@@ -316,6 +235,8 @@ - FT_Vector kerning; - FT_Error error; - -+ currentchar=currentchar & 0xFF; -+ - if (currentchar == '\r') // display \r in windows edited files - { - if(color != -1) -@@ -331,19 +252,15 @@ - } - //load char - -- if(!(glyphindex = FT_Get_Char_Index(face, currentchar))) -+ if(!(glyphindex = FT_Get_Char_Index(face, (int)currentchar))) - { - printf("TuxCom \n", (int)currentchar, error); - return 0; -@@ -376,7 +293,7 @@ - { - if(pitch*8 + 7-bit >= sbit->width) break; /* render needed bits only */ - -- if((sbit->buffer[row * sbit->pitch + pitch]) & 1<left + kerning.x + x + var_screeninfo.xres*(StartY + sy - sbit->top + y)) = color; -+ if((sbit->buffer[row * sbit->pitch + pitch]) & 1<left + kerning.x + x)*4 + fix_screeninfo.line_length*(StartY + sy - sbit->top + y),bgra[color],4); - - x++; - } -@@ -481,38 +398,36 @@ - void RenderBox(int sx, int sy, int ex, int ey, int mode, int color) - { - int loop; -+ int tx; - if(mode == FILL) - { - for(; sy <= ey; sy++) - { -- memset(lbb + StartX + sx + var_screeninfo.xres*(StartY + sy), color, ex-sx + 1); -+ for(tx=0; tx <= (ex-sx); tx++) -+ { -+ memcpy(lbb + StartX*4 + sx*4 + (tx*4) + fix_screeninfo.line_length*(StartY + sy),bgra[color],4); -+ } - } - } - else - { -- //hor lines -- -- for(loop = sx; loop <= ex; loop++) -- { -- *(lbb + StartX+loop + var_screeninfo.xres*(sy+StartY)) = color; -- *(lbb + StartX+loop + var_screeninfo.xres*(sy+1+StartY)) = color; -- -- *(lbb + StartX+loop + var_screeninfo.xres*(ey-1+StartY)) = color; -- *(lbb + StartX+loop + var_screeninfo.xres*(ey+StartY)) = color; -- } -- -- //ver lines -- -- for(loop = sy; loop <= ey; loop++) -- { -- *(lbb + StartX+sx + var_screeninfo.xres*(loop+StartY)) = color; -- *(lbb + StartX+sx+1 + var_screeninfo.xres*(loop+StartY)) = color; -- -- *(lbb + StartX+ex-1 + var_screeninfo.xres*(loop+StartY)) = color; -- *(lbb + StartX+ex + var_screeninfo.xres*(loop+StartY)) = color; -- } -+ for(loop = sx; loop <= ex; loop++) -+ { -+ memcpy(lbb + StartX*4+loop*4 + fix_screeninfo.line_length*(sy+StartY), bgra[color], 4); -+ memcpy(lbb + StartX*4+loop*4 + fix_screeninfo.line_length*(sy+1+StartY), bgra[color], 4); -+ memcpy(lbb + StartX*4+loop*4 + fix_screeninfo.line_length*(ey-1+StartY), bgra[color], 4); -+ memcpy(lbb + StartX*4+loop*4 + fix_screeninfo.line_length*(ey+StartY), bgra[color], 4); -+ } -+ for(loop = sy; loop <= ey; loop++) -+ { -+ memcpy(lbb + StartX*4+sx*4 + fix_screeninfo.line_length*(loop+StartY), bgra[color], 4); -+ memcpy(lbb + StartX*4+(sx+1)*4 + fix_screeninfo.line_length*(loop+StartY), bgra[color], 4); -+ memcpy(lbb + StartX*4+(ex-1)*4 + fix_screeninfo.line_length*(loop+StartY), bgra[color], 4); -+ memcpy(lbb + StartX*4+ex*4 + fix_screeninfo.line_length*(loop+StartY), bgra[color], 4); -+ } - } - } -+ - void SetLanguage() - { - if (langselect == BTN_AUTO) -@@ -540,7 +455,7 @@ - * plugin_exec * - ******************************************************************************/ - --void plugin_exec(PluginParam *par) -+int main() - { - FT_Error error; - -@@ -552,9 +467,69 @@ - //get params - - -- fb = rc = sx = ex = sy = ey = -1; -+ kb = fb = sx = ex = sy = ey = -1; - -- for(; par; par = par->next) -+ /* open Framebuffer */ -+ fb=open("/dev/fb0", O_RDWR); -+ -+ /* open Remote Control */ -+ int cnt=0, rc_num=0; -+ rc[0]=rc[1]=-1; -+ -+ while(rc_num < 2) -+ { -+ struct stat s; -+ char tmp[128]; -+ sprintf(tmp, "/dev/input/event%d", cnt); -+ if (stat(tmp, &s)) -+ break; -+ /* open Remote Control */ -+ if ((rc[rc_num]=open(tmp, O_RDONLY | O_EXCL | O_NONBLOCK)) == -1) -+ { -+ perror("TuxCom "); -+ return 0; -+ } -+ if (ioctl(rc[rc_num], EVIOCGNAME(128), tmp) < 0) -+ perror("EVIOCGNAME failed"); -+ if (!strstr(tmp, "remote control")) -+ close(rc[rc_num]); -+ else -+ ++rc_num; -+ ++cnt; -+ } -+// fcntl(rc, F_SETFL, fcntl(rc, F_GETFL) | O_EXCL | O_NONBLOCK); -+ -+ /* open dream ir keyboard */ -+ cnt=0; -+ while(1) -+ { -+ struct stat s; -+ char tmp[128]; -+ sprintf(tmp, "/dev/input/event%d", cnt); -+ if (stat(tmp, &s)) -+ break; -+ /* open keyboard */ -+ if ((kb=open(tmp, O_RDONLY)) == -1) -+ { -+ perror("TuxCom "); -+ return 0; -+ } -+ if (ioctl(kb, EVIOCGNAME(128), tmp) < 0) -+ perror("EVIOCGNAME failed"); -+ if (strstr(tmp, "dreambox ir keyboard")) -+ break; -+ close(kb); -+ kb=-1; -+ ++cnt; -+ } -+ fcntl(kb, F_SETFL, fcntl(kb, F_GETFL) | O_EXCL | O_NONBLOCK); -+ -+ sx = 50; -+ ex = 670; -+ sy = 50; -+ ey = 526; -+ -+/* for(; par; par = par->next) - { - if (!strcmp(par->id, P_ID_FBUFFER)) fb = atoi(par->val); - else if (!strcmp(par->id, P_ID_RCINPUT)) rc = atoi(par->val); -@@ -563,9 +538,7 @@ - else if (!strcmp(par->id, P_ID_OFF_Y)) sy = atoi(par->val); - else if (!strcmp(par->id, P_ID_END_Y)) ey = atoi(par->val); - } --#ifdef HAVE_DREAMBOX_HARDWARE -- kb=open("/dev/vc/0", O_RDONLY); --#endif -+*/ - - if(fb == -1 || rc == -1 || sx == -1 || ex == -1 || sy == -1 || ey == -1) - { -@@ -574,18 +547,27 @@ - } - //init framebuffer - -- if(ioctl(fb, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1) -+ -+ if(ioctl(fb, FBIOGET_VSCREENINFO, &var_screeninfo) == -1) - { -- printf("TuxCom \n"); -+ printf("TuxCom \n"); - return; - } - -- if(ioctl(fb, FBIOGET_VSCREENINFO, &var_screeninfo) == -1) -+ if (var_screeninfo.xres != 720) - { -- printf("TuxCom \n"); -+ printf("TuxCom \n"); - return; - } - -+ - if(ioctl(fb, FBIOPUTCMAP, &colormap) == -1) - { - printf("TuxCom \n"); -@@ -643,17 +625,14 @@ - - use_kerning = FT_HAS_KERNING(face); - --#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 -+ - desc.image_type = ftc_image_mono; --#else -- desc.flags = FT_LOAD_MONOCHROME; --#endif - - - - //init backbuffer - -- if(!(lbb = malloc(var_screeninfo.xres*var_screeninfo.yres))) -+ if(!(lbb = malloc(3*fix_screeninfo.line_length*var_screeninfo.yres))) - { - printf("TuxCom \n"); - FTC_Manager_Done(manager); -@@ -661,11 +640,11 @@ - munmap(lfb, fix_screeninfo.smem_len); - return; - } -- memset(lbb, 0, var_screeninfo.xres*var_screeninfo.yres); -+ memset(lbb, 0, 3*fix_screeninfo.line_length*var_screeninfo.yres); - RenderBox(0,0,var_screeninfo.xres,var_screeninfo.yres,FILL,BLACK); - - //open avs -- if((avs = open(AVS, O_RDWR)) == -1) -+/* if((avs = open(AVS, O_RDWR)) == -1) - { - printf("TuxCom "); - return; -@@ -678,7 +657,7 @@ - printf("TuxCom "); - return; - } -- -+*/ - - - //init data -@@ -687,8 +666,8 @@ - curvisibility = 0; - singleview = 0; - textuppercase = 0; -- screenmode=0; - filesize_in_byte = BTN_NO; // show human readable filesize -+ screenmode=0; - langselect = BTN_AUTO; // automatic - autosave = BTN_ASK; // ask on exit - -@@ -725,22 +704,18 @@ - - SetLanguage(); - -- ioctl(saa, SAAIOGWSS, &saa_old); -- ioctl(saa, SAAIOSWSS, &saamodes[screenmode]); -+// ioctl(saa, SAAIOGWSS, &saa_old); -+// ioctl(saa, SAAIOSWSS, &saamodes[screenmode]); - // setup screen - RenderFrame(LEFTFRAME); - RenderFrame(RIGHTFRAME); -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - printf("TuxCom init successful\n"); - - // lock keyboard-conversions, this is done by the plugin itself - fclose(fopen(KBLCKFILE,"w")); - --#ifdef HAVE_DREAMBOX_HARDWARE -- fcntl(rc, F_SETFL, O_NONBLOCK); --#else -- fcntl(rc, F_SETFL, fcntl(rc, F_GETFL) &~ O_NONBLOCK); --#endif -+// fcntl(rc, F_SETFL, fcntl(rc, F_GETFL) &~ O_NONBLOCK); - - int dosave = autosave; - int firstentry = 1; -@@ -767,20 +742,11 @@ - if (strcmp(szP,szPass) != 0) break; - RenderFrame(LEFTFRAME); - RenderFrame(RIGHTFRAME); -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - } - } - firstentry = 0; - --#ifdef HAVE_DREAMBOX_HARDWARE -- if (kbcode != 0) -- { -- if (kbcode == 0x09) // tab -- { -- rccode = (curframe == 1 ? RC_LEFT : RC_RIGHT); -- } -- } --#endif - switch(rccode) - { - case RC_HELP: -@@ -868,13 +834,13 @@ - break; - } - else -- { -+ { - char scriptfile[FILENAME_MAX]; - char* expos = strrchr(pfe->name,'.'); - if (expos && strlen(expos) > 0) - { - struct stat st; -- sprintf(scriptfile,"%s%s%s",CONFIGDIR, "/tuxcom/",expos+1); -+ sprintf(scriptfile,"%s%s%s","/etc/tuxbox/",expos+1); - if (lstat(scriptfile,&st) != -1) - { - char szCmd[4000]; -@@ -1361,7 +1327,7 @@ - finfo[curframe].first = finfo[curframe].selected - framerows+1; - RenderFrame(LEFTFRAME); - RenderFrame(RIGHTFRAME); -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - - }while(rccode != RC_HOME); - -@@ -1380,12 +1346,17 @@ - unlink(KBLCKFILE); - - //restore videoformat -- ioctl(avs, AVSIOSSCARTPIN8, &fnc_old); -- ioctl(saa, SAAIOSWSS, &saa_old); -- close(avs); -- close(saa); -- -- fcntl(rc, F_SETFL, O_NONBLOCK); -+// ioctl(avs, AVSIOSSCARTPIN8, &fnc_old); -+// ioctl(saa, SAAIOSWSS, &saa_old); -+// close(avs); -+// close(saa); -+ -+// fcntl(rc, F_SETFL, O_NONBLOCK); -+ if (rc[0] != -1) -+ close(rc[0]); -+ if (rc[1] != -1) -+ close(rc[1]); -+ close(kb); - - ClearEntries (LEFTFRAME ); - ClearEntries (RIGHTFRAME); -@@ -1393,9 +1364,6 @@ - ClearMarker (RIGHTFRAME); - ClearZipEntries(LEFTFRAME ); - ClearZipEntries(RIGHTFRAME); --#ifdef HAVE_DREAMBOX_HARDWARE -- if (kb != -1) close(kb); --#endif - return; - } - -@@ -1447,7 +1415,7 @@ - RenderString(colorline[colortool[i]*NUM_LANG+language], (viewx/COLORBUTTONS) *i , viewy- FONT_OFFSET_BIG , viewx/COLORBUTTONS, CENTER, SMALL , (i == 2 ? BLACK : WHITE)); - } - if (refresh == YES) -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - - } - -@@ -1458,7 +1426,7 @@ - - void RenderFrame(int frame) - { -- if (singleview && curframe != frame) -+ if (singleview && curframe != frame) - return; - - int row = 0; -@@ -1742,7 +1710,7 @@ - - RenderBox(viewx/2 + 2* BORDERSIZE , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 + 2* BORDERSIZE +BUTTONWIDTH ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == 1 ? WHITE : GREEN)); - RenderBox(viewx/2 + 2* BORDERSIZE +1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 + 2* BORDERSIZE +BUTTONWIDTH -1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == 1 ? WHITE : GREEN)); -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - break; - case 2: - RenderBox(viewx/2 - 4* BORDERSIZE - BUTTONWIDTH - BUTTONWIDTH/2 , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 - 4* BORDERSIZE - BUTTONWIDTH/2 ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == 0 ? WHITE : RED )); -@@ -1753,7 +1721,7 @@ - - RenderBox(viewx/2 + 4* BORDERSIZE + BUTTONWIDTH/2 , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 + 4* BORDERSIZE +BUTTONWIDTH + BUTTONWIDTH/2 ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == 2 ? BLACK : YELLOW )); - RenderBox(viewx/2 + 4* BORDERSIZE + BUTTONWIDTH/2 +1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 + 4* BORDERSIZE +BUTTONWIDTH + BUTTONWIDTH/2-1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == 2 ? BLACK : YELLOW )); -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - break; - case 4: - RenderBox(viewx/2 - 4* BORDERSIZE - BUTTONWIDTH - BUTTONWIDTH/2 , viewy-(viewy-he)/2 - 4*BORDERSIZE - 2*BUTTONHEIGHT , viewx/2 - 4* BORDERSIZE - BUTTONWIDTH/2 ,viewy-(viewy-he)/2- 4* BORDERSIZE - BUTTONHEIGHT , GRID, (sel == 0 ? WHITE : RED )); -@@ -1770,7 +1738,7 @@ - - RenderBox(viewx/2 + 2* BORDERSIZE , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 + 4* BORDERSIZE +BUTTONWIDTH + BUTTONWIDTH/2 ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == 4 ? WHITE : BLUE2 )); - RenderBox(viewx/2 + 2* BORDERSIZE +1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 + 4* BORDERSIZE +BUTTONWIDTH + BUTTONWIDTH/2-1,viewy-(viewy-he)/2- 2* BORDERSIZE -1, GRID, (sel == 4 ? WHITE : BLUE2 )); -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - break; - } - drawsel = 0; -@@ -1853,7 +1821,7 @@ - RenderBox((viewx-BUTTONWIDTH)/2 , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT, viewx - (viewx-BUTTONWIDTH)/2,viewy-(viewy-he)/2 - 2*BORDERSIZE , GRID, WHITE); - break; - } -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - } - - /****************************************************************************** -@@ -1882,15 +1850,9 @@ - RenderBox((viewx-wi)/2 , (viewy-he) /2, viewx-(viewx-wi)/2, viewy-(viewy-he)/2, GRID, WHITE); - RenderString(pfe->name,(viewx-wi)/2+ 2* BORDERSIZE , (viewy-he)/2 + 2*BORDERSIZE + FONTHEIGHT_BIG-FONT_OFFSET , wi, CENTER, BIG, WHITE); - -- char sizeString[200]; -- GetSizeString(sizeString,pfe->fentry.st_size,1); -- sprintf(sizeString,"%s byte(s)",sizeString); -- -- RenderString(sizeString,(viewx-wi)/2+ 2* BORDERSIZE , (viewy-he)/2 + 2*BORDERSIZE + 2*FONTHEIGHT_BIG-FONT_OFFSET , wi, CENTER, BIG, WHITE); -- -- RenderString(info[INFO_ACCESSED*NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (3)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); -- RenderString(info[INFO_MODIFIED*NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (4)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); -- RenderString(info[INFO_CREATED *NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (5)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); -+ RenderString(info[INFO_ACCESSED*NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (2)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); -+ RenderString(info[INFO_MODIFIED*NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (3)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); -+ RenderString(info[INFO_CREATED *NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (4)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); - char tm[100]; - strftime(tm,100,info[INFO_DATETIME *NUM_LANG+language],localtime(&pfe->fentry.st_atime)); - RenderString(tm,viewx/2- 2* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (3)*FONTHEIGHT_BIG-FONT_OFFSET , wi/2, RIGHT, BIG, WHITE); -@@ -2000,7 +1962,7 @@ - RenderBox(viewx/2 - 2* BORDERSIZE -BUTTONWIDTH+1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 - 2* BORDERSIZE -1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == YES ? WHITE : RED )); - RenderBox(viewx/2 + 2* BORDERSIZE , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 + 2* BORDERSIZE +BUTTONWIDTH ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == NO ? WHITE : GREEN)); - RenderBox(viewx/2 + 2* BORDERSIZE +1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 + 2* BORDERSIZE +BUTTONWIDTH-1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == NO ? WHITE : GREEN)); -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - drawsel = 0; - } - -@@ -2041,7 +2003,7 @@ - continue; - *p=0; - p++; -- p1=strchr(p,'\r'); // für Windows-Nutzer: '\r' überlesen -+ p1=strchr(p,'\r'); // für Windows-Nutzer: '\r' überlesen - if (p1 != NULL) *p1 = 0x00; - if ( !strcmp(line,"host") ) strcpy(entries[0], p); - else if ( !strcmp(line,"port") ) strcpy(entries[1], p); -@@ -2144,7 +2106,7 @@ - RenderBox(viewx/2 - 2* BORDERSIZE -BUTTONWIDTH+1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 - 2* BORDERSIZE -1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == YES ? WHITE : RED )); - RenderBox(viewx/2 + 2* BORDERSIZE , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 + 2* BORDERSIZE +BUTTONWIDTH ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == NO ? WHITE : GREEN)); - RenderBox(viewx/2 + 2* BORDERSIZE +1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 + 2* BORDERSIZE +BUTTONWIDTH-1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == NO ? WHITE : GREEN)); -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - drawsel = 0; - } - if (end == YES) -@@ -2195,10 +2157,10 @@ - sprintf(szEntry,mainmenu[i*NUM_LANG+language],mbox[filesize_in_byte*NUM_LANG+language]); - break; - case 5: // set language -- sprintf(szEntry,mainmenu[i*NUM_LANG+language],mbox[langselect *NUM_LANG+language]); -+ sprintf(szEntry,mainmenu[i*NUM_LANG+language],mbox[langselect*NUM_LANG+language]); - break; - case 6: // save settings -- sprintf(szEntry,mainmenu[i*NUM_LANG+language],mbox[autosave *NUM_LANG+language]); -+ sprintf(szEntry,mainmenu[i*NUM_LANG+language],mbox[autosave *NUM_LANG+language]); - break; - default: - strcpy(szEntry,mainmenu[i*NUM_LANG+language]); -@@ -2206,7 +2168,7 @@ - } - RenderString(szEntry,(viewx-wi)/2+ BORDERSIZE , (viewy-he)/2 + BORDERSIZE + (i+1)*FONTHEIGHT_BIG-FONT_OFFSET , wi, CENTER, BIG, WHITE); - } -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - int drawsel = 0; - do{ - GetRCCode(RC_NORMAL); -@@ -2225,8 +2187,8 @@ - return; - case 2: - screenmode = 1-screenmode; -- ioctl(avs, AVSIOSSCARTPIN8, &fncmodes[screenmode]); -- ioctl(saa, SAAIOSWSS, &saamodes[screenmode]); -+ //ioctl(avs, AVSIOSSCARTPIN8, &fncmodes[screenmode]); -+ //ioctl(saa, SAAIOSWSS, &saamodes[screenmode]); - return; - case 3: - SetPassword(); -@@ -2342,7 +2304,7 @@ - } - RenderString(szEntry,(viewx-wi)/2+ BORDERSIZE , (viewy-he)/2 + BORDERSIZE + (i+1)*FONTHEIGHT_BIG-FONT_OFFSET , wi, CENTER, BIG, WHITE); - } -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - drawsel = 0; - } - }while(1); -@@ -2439,7 +2401,7 @@ - colortool[3] = (pass == NO ? ACTION_INSTEXT : ACTION_NOACTION); - RenderMenuLine(-1, EDIT); - -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - - do{ - while (GetRCCode(RC_EDIT) == 0); -@@ -2755,7 +2717,7 @@ - colortool[3] = ACTION_NOACTION; - } - RenderMenuLine(-1, EDIT); -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - }while(1); - - rccode = -1; -@@ -3808,7 +3770,7 @@ - p = p1+1; - } - pStop = p; -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - while (GetRCCode(RC_NORMAL) == 0); - switch (rccode) - { -@@ -4227,7 +4189,7 @@ - } - RenderBox( viewx/6 +3*BORDERSIZE, BORDERSIZE+FONTHEIGHT_BIG , viewx/6 + 4*BORDERSIZE, viewy-MENUSIZE , FILL, WHITE); - RenderBox( viewx/3 -2*BORDERSIZE, BORDERSIZE+FONTHEIGHT_BIG , viewx/3 - BORDERSIZE, viewy-MENUSIZE , FILL, WHITE); -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - while (GetRCCode(RC_NORMAL) == 0); - switch (rccode) - { -@@ -4470,7 +4432,7 @@ - continue; - *p=0; - p++; -- p1=strchr(p,'\r'); // für Windows-Nutzer: '\r' überlesen -+ p1=strchr(p,'\r'); // für Windows-Nutzer: '\r' überlesen - if (p1 != NULL) *p1 = 0x00; - if ( !strcmp(line,"host") ) strcpy(finfo[curframe].ftphost, p); - else if ( !strcmp(line,"port") ) finfo[curframe].ftpport = atoi(p); -@@ -4733,7 +4695,7 @@ - - if (row > framerows - 2) - { -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - while (1) - { - GetRCCode(RC_NORMAL); -@@ -4754,7 +4716,7 @@ - } - if (row>0) - { -- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); -+ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - while (1) - { - GetRCCode(RC_NORMAL); -@@ -4812,7 +4774,7 @@ - - if (filesize_in_byte == BTN_NO && !forcebytes) - { -- if (size >= (unsigned long long)1024*1024*1024) // we use "real" GigaBytes ;) -+ if (size >= (unsigned long long )1024*1024*1024) // we use "real" GigaBytes ;) - { - sprintf(sizeString,"%.2f GB",((double)size)/(double)(1024*1024*1024)); - return; -@@ -4827,7 +4789,7 @@ - { - sprintf(sizeString,".%03lu%s",(unsigned long)(tmp % (unsigned long long)1000), sztmp); - strcpy(sztmp,sizeString); -- tmp /= (unsigned long long)1000; -+ tmp /= (unsigned long long )1000; - } - sprintf(sizeString,"%lu%s",(unsigned long)tmp,sztmp); - -@@ -4852,10 +4814,10 @@ - finfo[LEFTFRAME].sort = SORT_UP; - finfo[RIGHTFRAME].sort = SORT_UP; - -- fp = fopen( CONFIGDIR "/tuxcom.conf", "r" ); -+ fp = fopen( "/etc/tuxbox/tuxcom.conf", "r" ); - if ( !fp ) - { -- printf("tuxcom: could not open " CONFIGDIR "/tuxcom.conf !!!\n"); -+ printf("tuxcom: could not open /etc/tuxbox/tuxcom.conf !!!\n"); - } - else - { -@@ -4979,10 +4941,10 @@ - FILE *fp; - - -- fp = fopen( CONFIGDIR "/tuxcom.conf", "w" ); -+ fp = fopen( "/etc/tuxbox/tuxcom.conf", "w" ); - if ( !fp ) - { -- printf("tuxcom: could not open " CONFIGDIR "/tuxcom.conf !!!\n"); -+ printf("tuxcom: could not open /etc/tuxbox/tuxcom.conf !!!\n"); - } - else - { -diff -Naur tuxcom.ori/tuxcom.h tuxcom/tuxcom.h ---- tuxcom.ori/tuxcom.h 2009-01-06 00:12:19.000000000 +0100 -+++ tuxcom/tuxcom.h 2009-01-05 18:31:06.000000000 +0100 -@@ -22,7 +22,7 @@ - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA - */ - --#include -+//#include - #include - #include - #include -@@ -37,10 +37,10 @@ - #include - #include - #include --#include -+//#include - --#include --#include -+//#include -+//#include - - #include - #include -@@ -53,16 +53,14 @@ - #include FT_CACHE_SMALL_BITMAPS_H - - --#ifndef HAVE_DREAMBOX_HARDWARE - #include --#endif - --#define AVS "/dev/dbox/avs0" --#define SAA "/dev/dbox/saa0" -+//#define AVS "/dev/dbox/avs0" -+//#define SAA "/dev/dbox/saa0" - - #define MENUROWS 10 - #define MENUITEMS 10 --#define MENUSIZE 59 -+#define MENUSIZE 63 - #define MINBOX 380 - #define BUTTONWIDTH 114 - #define BUTTONHEIGHT 30 -@@ -72,72 +70,15 @@ - #define RIGHTFRAME 1 - - #define DEFAULT_PATH "/" --#define charset " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#!$%&?*()@\\/=<>+-_,.;:" -+#define charset " aäbcdefghijklmnoöpqrstuüvwxyzAÄBCDEFGHIJKLMNOÖPQRSTUÜVWXYZ0123456789#!$%&?*()@\\/=<>+-_,.;:¤^°][}{'`µ|" - -+#define _FILE_OFFSET_BITS 64 - #define FILEBUFFER_SIZE (100 * 1024) // Edit files up to 100k - #define FTPBUFFER_SIZE (200 * 1024) // FTP Download Buffer size - --#define MSG_VERSION "Tuxbox Commander Version 1.16" -+#define MSG_VERSION "Tuxbox Commander E2 Ver. 1.16\n" - #define MSG_COPYRIGHT "© dbluelle 2004-2007" - --#ifdef HAVE_DREAMBOX_HARDWARE -- --//rc codes --#define KEY_0 0x5C00 --#define KEY_1 0x5C01 --#define KEY_2 0x5C02 --#define KEY_3 0x5C03 --#define KEY_4 0x5C04 --#define KEY_5 0x5C05 --#define KEY_6 0x5C06 --#define KEY_7 0x5C07 --#define KEY_8 0x5C08 --#define KEY_9 0x5C09 --#define KEY_POWER 0x5C0C --#define KEY_UP 0x5C0E --#define KEY_DOWN 0x5C0F --#define KEY_VOLUMEUP 0x5C16 --#define KEY_VOLUMEDOWN 0x5C17 --#define KEY_HOME 0x5C20 --#define KEY_SETUP 0x5C27 --#define KEY_MUTE 0x5C28 --#define KEY_RED 0x5C2D --#define KEY_RIGHT 0x5C2E --#define KEY_LEFT 0x5C2F --#define KEY_OK 0x5C30 --#define KEY_BLUE 0x5C3B --#define KEY_YELLOW 0x5C52 --#define KEY_GREEN 0x5C55 --#define KEY_HELP 0x5C82 -- --#define RC_0 0x00 --#define RC_1 0x01 --#define RC_2 0x02 --#define RC_3 0x03 --#define RC_4 0x04 --#define RC_5 0x05 --#define RC_6 0x06 --#define RC_7 0x07 --#define RC_8 0x08 --#define RC_9 0x09 --#define RC_RIGHT 0x0A --#define RC_LEFT 0x0B --#define RC_UP 0x0C --#define RC_DOWN 0x0D --#define RC_OK 0x0E --#define RC_MUTE 0x0F --#define RC_STANDBY 0x10 --#define RC_GREEN 0x11 --#define RC_YELLOW 0x12 --#define RC_RED 0x13 --#define RC_BLUE 0x14 --#define RC_PLUS 0x15 --#define RC_MINUS 0x16 --#define RC_HELP 0x17 --#define RC_DBOX 0x18 --#define RC_HOME 0x1F -- --#else - // rc codes - #define RC_0 '0' - #define RC_1 '1' -@@ -225,7 +166,7 @@ - int rcaltgrtable[] = - { - 0x00, RC_ESC, 0x00, '²', '³', 0x00, 0x00, 0x00, '{', '[', ']', '}', '\\', 0x00, 0x00, 0x00, -- '@', 0x00, '€', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '~', RC_RET1, RC_STRG, 0x00, 0x00, -+ '@', 0x00, '¤', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '~', RC_RET1, RC_STRG, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, RC_LSHIFT, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 'µ', 0x00, 0x00, 0x00, RC_RSHIFT, 0x00, RC_ALT, 0x20, RC_CAPSLOCK,RC_F1,RC_F2,RC_F3,RC_F4,RC_F5, - RC_F6,RC_F7,RC_F8,RC_F9,RC_F10,RC_NUM,RC_ROLLEN,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -@@ -247,13 +188,13 @@ - #define KBC_PAGEDOWN 0x0C - #define KBC_RETURN 0x0D - --#endif - #define KBLCKFILE "/tmp/keyboard.lck" //! file to lock keyboard-conversion - - - //freetype stuff - --#define FONT FONTDIR "/pakenham.ttf" -+//#define FONT "/usr/share/fonts/md_khmurabi_10.ttf" -+#define FONT "/usr/share/fonts/pakenham.ttf" - // if font is not in usual place, we look here: - #define FONT2 "/var/tuxbox/config/enigma/fonts/pakenham.ttf" - -@@ -266,11 +207,7 @@ - FTC_Manager manager; - FTC_SBitCache cache; - FTC_SBit sbit; --#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 - FTC_Image_Desc desc; --#else --FTC_ImageTypeRec desc; --#endif - FT_Face face; - FT_UInt prev_glyphindex; - FT_Bool use_kerning; -@@ -297,6 +234,14 @@ - struct fb_fix_screeninfo fix_screeninfo; - struct fb_var_screeninfo var_screeninfo; - -+unsigned char bgra[][4] = { -+"\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF", "\x00\x00\x00\xFF", "\x80\x00\x00\xFF", -+"\xFF\x80\x00\xFF", "\x00\xC0\xFF\xFF", "\x00\xD0\x00\xFF", "\x00\xE8\xE8\xFF", -+"\x00\x00\xFF\xFF", "\xB0\xB0\xB0\xFF", "\x00\xFF\x00\xFF", "\x50\x50\x50\xFF", -+"\x80\x00\x00\xC0", "\x50\x50\x50\xC0", "\xFF\x40\x00\xFf" }; -+ -+ -+ - unsigned short rd[] = {0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xE8<<8, 0xFF<<8, 0xb0<<8, 0x00<<8, 0x50<<8, 0x00<<8, 0x50<<8, 0x00<<8}; - unsigned short gn[] = {0xFF<<8, 0x00<<8, 0x00<<8, 0x80<<8, 0xC0<<8, 0xd0<<8, 0xE8<<8, 0x00<<8, 0xb0<<8, 0xff<<8, 0x50<<8, 0x00<<8, 0x50<<8, 0x40<<8}; - unsigned short bl[] = {0xFF<<8, 0x00<<8, 0x80<<8, 0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0xb0<<8, 0x00<<8, 0x50<<8, 0x80<<8, 0x50<<8, 0xff<<8}; -@@ -307,9 +252,7 @@ - int trans_map [] = {BLUE1,BLUE_TRANSP,TRANSP}; - int trans_map_mark[] = {GRAY2,GRAY_TRANSP,GRAY_TRANSP}; - --#ifndef HAVE_DREAMBOX_HARDWARE - struct input_event ev; --#endif - - unsigned short rccode; - char kbcode; -@@ -317,7 +260,7 @@ - //some data - - int avs, saa, fnc_old, saa_old, screenmode; --int rc, fb, kb; -+int rc[2], fb, kb; - int sx, ex, sy, ey; - int PosX, PosY, StartX, StartY, FrameWidth, NameWidth, SizeWidth; - int curframe, cursort, curvisibility, singleview; -@@ -339,8 +282,8 @@ - char szPass[20]; - long commandsize; - --int fncmodes[] = {AVS_FNCOUT_EXT43, AVS_FNCOUT_EXT169}; --int saamodes[] = {SAA_WSS_43F, SAA_WSS_169F}; -+//int fncmodes[] = {AVS_FNCOUT_EXT43, AVS_FNCOUT_EXT169}; -+//int saamodes[] = {SAA_WSS_43F, SAA_WSS_169F}; - - FILE *conf; - int language, langselect, autosave, filesize_in_byte; -@@ -466,13 +409,13 @@ - - char *numberchars[] = { "0#!$%&?*()@\\", - "1/=<>+-_,.;:" , -- "abc2", -- "def3", -+ "aäbc2", -+ "de¤f3", - "ghi4", - "jkl5", -- "mno6", -+ "mnoö6", - "pqrs7", -- "tuv8", -+ "tuüv8", - "wxyz9" }; - - char *info[] = { "(select 'hidden' to copy in background)" ,"('versteckt' wählen zum Kopieren im Hintergrund)" ,"(Seleziona 'nascosto' per copiare in background)" ,"(välj 'gömd' för att kopiera i bakgrunden)" ,"(Seleccionar 'Escondido' para copiar em background)" , -@@ -599,7 +542,7 @@ - "toggle 16:9 mode" , "16:9-Modus setzen" ,"Passa a modalità 16:9" ,"växla 16:9 läge" ,"Mudar para 16:9" , - "set password" , "Passwort setzen" ,"Imposta password" ,"sätt lösenord" ,"Por password" , - "show filesizes in byte <%s>" , "Dateigrössen in Byte anzeigen <%s>" ,"show filesizes in byte <%s>" ,"show filesizes in byte <%s>" ,"show filesizes in byte <%s>" , -- "language/Sprache/Lingua/Språk: <%s>", "Sprache/language/Lingua/Språk: <%s>" ,"Lingua/language/Sprache/Språk: <%s>" ,"Lingua/language/Sprache/Språk: <%s>" ,"Lingua/language/Sprache/Språk: <%s>", -+ "Language/Sprache/Lingua/Språk: <%s>", "Sprache/Language/Lingua/Språk: <%s>" ,"Lingua/Language/Sprache/Språk: <%s>" ,"Lingua/Language/Sprache/Språk: <%s>" ,"Lingua/Language/Sprache/Språk: <%s>", - "save settings on exit: <%s>" , "Einstellungen beim Beenden speichern: <%s>","Salvare le impostazioni in uscita: <%s>" ,"spara inställningar vid avslut: <%s>","Gravar e sair: <%s>" , - "save settings now" , "Einstellungen jetzt speichern" ,"Salvare le impostazioni adesso" ,"spara inställningar nu" ,"Gravar configuracoes agora" }; - diff --git a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff deleted file mode 100644 index d01e7a8..0000000 --- a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff +++ /dev/null @@ -1,48 +0,0 @@ -diff -Naur tuxcom_cvs/python/Makefile.am tuxcom/python/Makefile.am ---- tuxcom_cvs/python/Makefile.am 1970-01-01 01:00:00.000000000 +0100 -+++ tuxcom/python/Makefile.am 2008-11-03 13:56:54.425916639 +0100 -@@ -0,0 +1,5 @@ -+installdir = $(LIBDIR)/enigma2/python/Plugins/Extensions/Tuxcom -+ -+install_DATA = \ -+ plugin.py \ -+ __init__.py -diff -Naur tuxcom_cvs/python/plugin.py tuxcom/python/plugin.py ---- tuxcom_cvs/python/plugin.py 1970-01-01 01:00:00.000000000 +0100 -+++ tuxcom/python/plugin.py 2008-11-03 14:22:15.705918505 +0100 -@@ -0,0 +1,35 @@ -+from enigma import * -+from Screens.Screen import Screen -+from Plugins.Plugin import PluginDescriptor -+ -+class TuxComStarter(Screen): -+ skin = """ -+ -+ """ -+ -+ def __init__(self, session, args = None): -+ self.skin = TuxComStarter.skin -+ Screen.__init__(self, session) -+ self.container=eConsoleAppContainer() -+ self.container.appClosed.append(self.finished) -+ self.runapp() -+ -+ def runapp(self): -+ eDBoxLCD.getInstance().lock() -+ eRCInput.getInstance().lock() -+ fbClass.getInstance().lock() -+ if self.container.execute("/usr/bin/tuxcom"): -+ self.finished(-1) -+ -+ def finished(self,retval): -+ fbClass.getInstance().unlock() -+ eRCInput.getInstance().unlock() -+ eDBoxLCD.getInstance().unlock() -+ self.close() -+ -+def main(session, **kwargs): -+ session.open(TuxComStarter) -+ -+def Plugins(**kwargs): -+ return PluginDescriptor(name="TuxCom", description="TuxBox Commander", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main) -+ diff --git a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_font.diff b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_font.diff deleted file mode 100644 index b04e441dd0ced5ef64d5bae47a864d8455ba1fbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67589 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 -+version DVB_API_VERSION -+ ]])]) -+ DVB_API_VERSION=`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | $EGREP "^version" | sed "s,version\ ,,"` -+ rm -f conftest* -+ -+ AC_MSG_NOTICE([found dvb version $DVB_API_VERSION]) -+]) -+fi -+ -+if test "$DVB_API_VERSION"; then -+ AC_DEFINE(HAVE_DVB,1,[Define to 1 if you have the dvb includes]) -+ AC_DEFINE_UNQUOTED(HAVE_DVB_API_VERSION,$DVB_API_VERSION,[Define to the version of the dvb api]) -+else -+ AC_MSG_ERROR([can't find dvb headers]) -+fi -+]) -+ -+AC_DEFUN(_TUXBOX_APPS_LIB_CONFIG,[ -+AC_PATH_PROG($1_CONFIG,$2,no) -+if test "$$1_CONFIG" != "no"; then -+ if test "$TARGET" = "cdk" && check_path "$$1_CONFIG"; then -+ AC_MSG_$3([could not find a suitable version of $2]); -+ else -+ $1_CFLAGS=$($$1_CONFIG --cflags) -+ $1_LIBS=$($$1_CONFIG --libs) -+ fi -+fi -+ -+AC_SUBST($1_CFLAGS) -+AC_SUBST($1_LIBS) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_CONFIG,[ -+_TUXBOX_APPS_LIB_CONFIG($1,$2,ERROR) -+if test "$$1_CONFIG" = "no"; then -+ AC_MSG_ERROR([could not find $2]); -+fi -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_CHECK,[ -+_TUXBOX_APPS_LIB_CONFIG($1,$2,WARN) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_PKGCONFIG,[ -+AC_PATH_PROG(PKG_CONFIG, pkg-config,no) -+if test "$PKG_CONFIG" = "no" ; then -+ AC_MSG_ERROR([could not find pkg-config]); -+fi -+]) -+ -+AC_DEFUN(_TUXBOX_APPS_LIB_PKGCONFIG,[ -+PKG_CHECK_MODULES($1,$2) -+AC_SUBST($1_CFLAGS) -+AC_SUBST($1_LIBS) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG,[ -+_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) -+if test -z "$$1_CFLAGS" ; then -+ AC_MSG_ERROR([could not find package $2]); -+fi -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG_CHECK,[ -+_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) -+]) -+ -+AC_DEFUN(_TUXBOX_APPS_LIB_SYMBOL,[ -+AC_CHECK_LIB($2,$3,HAVE_$1="yes",HAVE_$1="no") -+if test "$HAVE_$1" = "yes"; then -+ $1_LIBS=-l$2 -+fi -+ -+AC_SUBST($1_LIBS) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_SYMBOL,[ -+_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,ERROR) -+if test "$HAVE_$1" = "no"; then -+ AC_MSG_ERROR([could not find $2]); -+fi -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_SYMBOL,[ -+_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,WARN) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_GETTEXT,[ -+AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, -+ [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && -+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], -+ :) -+AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) -+ -+AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, -+ [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && -+ (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], -+ :) -+ -+AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,[$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1],:) -+ -+AC_MSG_CHECKING([whether NLS is requested]) -+AC_ARG_ENABLE(nls, -+ [ --disable-nls do not use Native Language Support], -+ USE_NLS=$enableval, USE_NLS=yes) -+AC_MSG_RESULT($USE_NLS) -+AC_SUBST(USE_NLS) -+ -+if test "$USE_NLS" = "yes"; then -+ AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,[ -+ AC_TRY_LINK([ -+ #include -+ #ifndef __GNU_GETTEXT_SUPPORTED_REVISION -+ #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) -+ #endif -+ extern int _nl_msg_cat_cntr; -+ extern int *_nl_domain_bindings; -+ ],[ -+ bindtextdomain ("", ""); -+ return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings; -+ ], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no -+ )] -+ ) -+ -+ if test "$gt_cv_func_gnugettext_libc" = "yes"; then -+ AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) -+ gt_use_preinstalled_gnugettext=yes -+ else -+ USE_NLS=no -+ fi -+fi -+ -+if test -f "$srcdir/po/LINGUAS"; then -+ ALL_LINGUAS=$(sed -e "/^#/d" "$srcdir/po/LINGUAS") -+fi -+ -+POFILES= -+GMOFILES= -+UPDATEPOFILES= -+DUMMYPOFILES= -+for lang in $ALL_LINGUAS; do -+ POFILES="$POFILES $srcdirpre$lang.po" -+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo" -+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" -+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop" -+done -+INST_LINGUAS= -+if test -n "$ALL_LINGUAS"; then -+ for presentlang in $ALL_LINGUAS; do -+ useit=no -+ if test -n "$LINGUAS"; then -+ desiredlanguages="$LINGUAS" -+ else -+ desiredlanguages="$ALL_LINGUAS" -+ fi -+ for desiredlang in $desiredlanguages; do -+ case "$desiredlang" in -+ "$presentlang"*) useit=yes;; -+ esac -+ done -+ if test $useit = yes; then -+ INST_LINGUAS="$INST_LINGUAS $presentlang" -+ fi -+ done -+fi -+CATALOGS= -+if test -n "$INST_LINGUAS"; then -+ for lang in $INST_LINGUAS; do -+ CATALOGS="$CATALOGS $lang.gmo" -+ done -+fi -+AC_SUBST(POFILES) -+AC_SUBST(GMOFILES) -+AC_SUBST(UPDATEPOFILES) -+AC_SUBST(DUMMYPOFILES) -+AC_SUBST(CATALOGS) -+]) -+ -+dnl backward compatiblity -+AC_DEFUN([AC_GNU_SOURCE], -+[AH_VERBATIM([_GNU_SOURCE], -+[/* Enable GNU extensions on systems that have them. */ -+#ifndef _GNU_SOURCE -+# undef _GNU_SOURCE -+#endif])dnl -+AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl -+AC_BEFORE([$0], [AC_RUN_IFELSE])dnl -+AC_DEFINE([_GNU_SOURCE]) -+]) -+ -+AC_DEFUN([AC_PROG_EGREP], -+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], -+ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 -+ then ac_cv_prog_egrep='grep -E' -+ else ac_cv_prog_egrep='egrep' -+ fi]) -+ EGREP=$ac_cv_prog_egrep -+ AC_SUBST([EGREP]) -+]) -+ -+AC_DEFUN([AC_PYTHON_DEVEL],[ -+ # -+ # should allow for checking of python version here... -+ # -+ AC_REQUIRE([AM_PATH_PYTHON]) -+ -+ # Check for Python include path -+ AC_MSG_CHECKING([for Python include path]) -+ python_path=`echo $PYTHON | sed "s,/bin.*$,,"` -+ for i in "$python_path/include/python$PYTHON_VERSION/" "$python_path/include/python/" "$python_path/" ; do -+ python_path=`find $i -type f -name Python.h -print | sed "1q"` -+ if test -n "$python_path" ; then -+ break -+ fi -+ done -+ python_path=`echo $python_path | sed "s,/Python.h$,,"` -+ AC_MSG_RESULT([$python_path]) -+ if test -z "$python_path" ; then -+ AC_MSG_ERROR([cannot find Python include path]) -+ fi -+ AC_SUBST([PYTHON_CPPFLAGS],[-I$python_path]) -+ -+ # Check for Python library path -+ AC_MSG_CHECKING([for Python library path]) -+ python_path=`echo $PYTHON | sed "s,/bin.*$,,"` -+ for i in "$python_path/lib/python$PYTHON_VERSION/config/" "$python_path/lib/python$PYTHON_VERSION/" "$python_path/lib/python/config/" "$python_path/lib/python/" "$python_path/" ; do -+ python_path=`find $i -type f -name libpython$PYTHON_VERSION.* -print | sed "1q"` -+ if test -n "$python_path" ; then -+ break -+ fi -+ done -+ python_path=`echo $python_path | sed "s,/libpython.*$,,"` -+ AC_MSG_RESULT([$python_path]) -+ if test -z "$python_path" ; then -+ AC_MSG_ERROR([cannot find Python library path]) -+ fi -+ AC_SUBST([PYTHON_LDFLAGS],["-L$python_path -lpython$PYTHON_VERSION"]) -+ # -+ python_site=`echo $python_path | sed "s/config/site-packages/"` -+ AC_SUBST([PYTHON_SITE_PKG],[$python_site]) -+]) -diff -Naur tuxcom.ori/configure.ac tuxcom/configure.ac ---- tuxcom.ori/configure.ac 1970-01-01 01:00:00.000000000 +0100 -+++ tuxcom/configure.ac 2008-12-28 18:33:12.000000000 +0100 -@@ -0,0 +1,19 @@ -+# -*- Autoconf -*- -+# Process this file with autoconf to produce a configure script. -+ -+AC_INIT(tuxbox-tuxcom-32bpp,1.13) -+AM_INIT_AUTOMAKE(tuxbox-tuxcom-32bpp,1.13) -+ -+TUXBOX_APPS -+TUXBOX_APPS_DIRECTORY -+TUXBOX_APPS_DVB -+ -+# Checks for programs. -+AC_PROG_CXX -+AC_PROG_CC -+ -+TUXBOX_APPS_LIB_CONFIG(FREETYPE,freetype-config) -+ -+AC_OUTPUT(Makefile) -+AC_OUTPUT(font/Makefile) -+AC_OUTPUT(python/Makefile) -diff -Naur tuxcom_cvs/font/Makefile.am tuxcom/font/Makefile.am ---- tuxcom_cvs/font/Makefile.am 1970-01-01 01:00:00.000000000 +0100 -+++ tuxcom/font/Makefile.am 2008-11-03 13:56:11.917916738 +0100 -@@ -0,0 +1,4 @@ -+installdir = $(FONTDIR) -+ -+install_DATA = \ -+ pakenham.ttf diff --git a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/support_newer_freetype.diff b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/support_newer_freetype.diff deleted file mode 100644 index 5ed9eca..0000000 --- a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/support_newer_freetype.diff +++ /dev/null @@ -1,78 +0,0 @@ -diff -Naur tuxcom/tuxcom.c tuxcom.freetype/tuxcom.c ---- tuxcom/tuxcom.c 2009-01-06 01:21:26.000000000 +0100 -+++ tuxcom.freetype/tuxcom.c 2009-01-07 13:21:16.000000000 +0100 -@@ -322,9 +322,15 @@ - - switch (size) - { -+#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) -+ case VERY_SMALL: desc.width = desc.height = FONTHEIGHT_VERY_SMALL; break; -+ case SMALL : desc.width = desc.height = FONTHEIGHT_SMALL ; break; -+ case BIG : desc.width = desc.height = FONTHEIGHT_BIG ; break; -+#else - case VERY_SMALL: desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_VERY_SMALL; break; - case SMALL : desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_SMALL ; break; - case BIG : desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_BIG ; break; -+#endif - } - - //reset kerning -@@ -354,9 +360,15 @@ - - switch (size) - { -+#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) -+ case VERY_SMALL: desc.width = desc.height = FONTHEIGHT_VERY_SMALL; break; -+ case SMALL : desc.width = desc.height = FONTHEIGHT_SMALL ; break; -+ case BIG : desc.width = desc.height = FONTHEIGHT_BIG ; break; -+#else - case VERY_SMALL: desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_VERY_SMALL; break; - case SMALL : desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_SMALL ; break; - case BIG : desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_BIG ; break; -+#endif - } - - //set alignment -@@ -617,17 +629,26 @@ - return; - } - else -+#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) -+ desc.face_id = FONT2; -+#else - desc.font.face_id = FONT2; -+#endif - } - else -+#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) -+ desc.face_id = FONT; -+#else - desc.font.face_id = FONT; -- -+#endif - - use_kerning = FT_HAS_KERNING(face); - -- -+#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) -+ desc.flags = FT_LOAD_MONOCHROME; -+#else - desc.image_type = ftc_image_mono; -- -+#endif - - - //init backbuffer -diff -Naur tuxcom/tuxcom.h tuxcom.freetype/tuxcom.h ---- tuxcom/tuxcom.h 2009-01-06 01:21:26.000000000 +0100 -+++ tuxcom.freetype/tuxcom.h 2009-01-07 13:21:16.000000000 +0100 -@@ -192,6 +192,9 @@ - - - //freetype stuff -+#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) -+typedef FTC_ImageTypeRec FTC_Image_Desc; -+#endif - - //#define FONT "/usr/share/fonts/md_khmurabi_10.ttf" - #define FONT "/usr/share/fonts/pakenham.ttf" diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt.bb b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt.bb deleted file mode 100644 index 8aa881e..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt.bb +++ /dev/null @@ -1,28 +0,0 @@ -SUMMARY = "tuxbox libtuxtxt" -LICENSE = "Proprietary" -LIC_FILES_CHKSUM = "file://libtuxtxt/libtuxtxt.c;endline=19;md5=75fd12b0664044ec3b3182337e21e98f" -DEPENDS = "dreambox-dvbincludes libpng freetype" -SRCDATE = "20090130" -PV = "0.0+cvs${SRCDATE}" -PR = "r1" - -SRC_URI = "cvs://anoncvs@cvs.tuxbox.org/cvs/tuxbox;module=apps/tuxbox/libs;method=ext \ - file://acinclude.m4 \ - file://ignorelibs.patch \ - file://32bpp.diff \ - file://resize_framebuffer.diff \ - file://allow_different_demux.diff \ - file://videodev2.patch \ - file://libz.patch \ -" - -S = "${WORKDIR}/libs" - -inherit autotools pkgconfig - -do_configure_prepend() { - install ${WORKDIR}/acinclude.m4 ${S}/acinclude.m4 - sed -i -e s:@LIBTUXBOX_LIBS@::g ${S}/libtuxtxt/tuxbox-tuxtxt.pc.in -} - -CPPFLAGS += "-DHAVE_DREAMBOX_HARDWARE -DDREAMBOX" diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/32bpp.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/32bpp.diff deleted file mode 100644 index 3c6c11c..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/32bpp.diff +++ /dev/null @@ -1,738 +0,0 @@ -diff -Naur libs-org/libtuxtxt/libtuxtxt.c libs/libtuxtxt/libtuxtxt.c ---- libs-org/libtuxtxt/libtuxtxt.c 2010-03-06 10:51:52.000000000 +0100 -+++ libs/libtuxtxt/libtuxtxt.c 2010-03-06 10:55:25.000000000 +0100 -@@ -7,6 +7,15 @@ - * Info entnommen aus videotext-0.6.19991029, * - * Copyright (c) 1994-96 Martin Buck * - * * -+ * ported 2006 to Dreambox 7025 / 32Bit framebuffer * -+ * by Seddi * -+ * * -+ * ported 32Bit framebuffer to Tuxtxt v1.99 (2008) * -+ * by the PLi team (Sat-Turner) * -+ * * -+ * ported to 20090130 * -+ * by the PLi team (pieterg) * -+ * * - ******************************************************************************/ - - #ifdef DEBUG -diff -Naur libs-org/libtuxtxt/tuxtxt_common.h libs/libtuxtxt/tuxtxt_common.h ---- libs-org/libtuxtxt/tuxtxt_common.h 2010-03-06 10:51:52.000000000 +0100 -+++ libs/libtuxtxt/tuxtxt_common.h 2010-03-06 10:56:26.000000000 +0100 -@@ -627,6 +627,19 @@ - aG3_70, aG3_71, aG3_72, aG3_73, aG3_74, aG3_75, aG3_76, aG3_77, aG3_78, aG3_79, aG3_7a, aG3_7b, aG3_7c, aG3_7d, aG3_7e - }; - -+/* 32bit colortable */ -+unsigned char bgra[][4] = { -+"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", -+"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", -+"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", -+"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", -+"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", -+"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", -+"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", -+"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", -+"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xC0", "\0\0\0\x00", -+"\0\0\0\x33" }; -+ - tuxtxt_cache_struct tuxtxt_cache; - static pthread_mutex_t tuxtxt_cache_lock = PTHREAD_MUTEX_INITIALIZER; - int tuxtxt_get_zipsize(int p,int sp) -@@ -3294,14 +3307,21 @@ - void tuxtxt_FillRect(unsigned char *lfb, int xres, int x, int y, int w, int h, int color) - { - if (!lfb) return; -- unsigned char *p = lfb + x + y * xres; -+ unsigned char *p = lfb + x*4 + y * xres; -+ unsigned char linebuf[w*4]; -+ int xtmp; - - if (w > 0) -+ { -+ for (xtmp=0; xtmp 0 ; h--) - { -- memset(p, color, w); -+ memcpy(p,linebuf,w*4); - p += xres; - } -+ } - } - - void tuxtxt_RenderDRCS(int xres, -@@ -3311,7 +3331,7 @@ - unsigned char fgcolor, unsigned char bgcolor) - { - if (d == NULL) return; -- int bit, x, y; -+ int bit, x, y, ltmp; - unsigned char *ay = ax + 13; /* array[0..10] of y-offsets for each pixel */ - - for (y = 0; y < 10; y++) /* 10*2 bytes a 6 pixels per char definition */ -@@ -3335,9 +3355,21 @@ - for (i = 0; i < h; i++) - { - if (ax[x+1] > ax[x]) -- memset(d + ax[x], f1, ax[x+1] - ax[x]); -+ { -+// memset(d + ax[x], f1, ax[x+1] - ax[x]); -+ for (ltmp=0 ; ltmp < (ax[x+1]-ax[x]); ltmp++) -+ { -+ memcpy(d + ax[x]*4 +ltmp*4,bgra[f1],4); -+ } -+ } - if (ax[x+7] > ax[x+6]) -- memset(d + ax[x+6], f2, ax[x+7] - ax[x+6]); /* 2nd byte 6 pixels to the right */ -+ { -+// memset(d + ax[x+6], f2, ax[x+7] - ax[x+6]); /* 2nd byte 6 pixels to the right */ -+ for (ltmp=0 ; ltmp < (ax[x+7]-ax[x+6]); ltmp++) -+ { -+ memcpy(d + ax[x+6]*4 +ltmp*4,bgra[f2],4); -+ } -+ } - d += xres; - } - d -= h * xres; -@@ -3350,20 +3382,26 @@ - void tuxtxt_DrawVLine(unsigned char *lfb, int xres, int x, int y, int l, int color) - { - if (!lfb) return; -- unsigned char *p = lfb + x + y * xres; -+ unsigned char *p = lfb + 4*x + y * xres; - - for ( ; l > 0 ; l--) - { -- *p = color; -+ memcpy(p,bgra[color],4); - p += xres; - } - } - - void tuxtxt_DrawHLine(unsigned char* lfb,int xres,int x, int y, int l, int color) - { -+ int ltmp; - if (!lfb) return; - if (l > 0) -- memset(lfb + x + y * xres, color, l); -+ { -+ for (ltmp=0; ltmp < l; ltmp++) -+ { -+ memcpy(lfb + x*4 + ltmp*4 + y * xres, bgra[color], 4); -+ } -+ } - } - - void tuxtxt_FillRectMosaicSeparated(unsigned char *lfb, int xres,int x, int y, int w, int h, int fgcolor, int bgcolor, int set) -@@ -3378,48 +3416,54 @@ - - void tuxtxt_FillTrapez(unsigned char *lfb, int xres,int x0, int y0, int l0, int xoffset1, int h, int l1, int color) - { -- unsigned char *p = lfb + x0 + y0 * xres; -+ unsigned char *p = lfb + x0*4 + y0 * xres; - int xoffset, l; - int yoffset; -+ int ltmp; - - for (yoffset = 0; yoffset < h; yoffset++) - { - l = l0 + ((l1-l0) * yoffset + h/2) / h; - xoffset = (xoffset1 * yoffset + h/2) / h; - if (l > 0) -- memset(p + xoffset, color, l); -+ { -+ for (ltmp=0; ltmp < l; ltmp++) -+ { -+ memcpy(p + xoffset*4 +ltmp*4, bgra[color], 4); -+ } -+ } - p += xres; - } - } - void tuxtxt_FlipHorz(unsigned char *lfb, int xres,int x, int y, int w, int h) - { -- unsigned char buf[w]; -- unsigned char *p = lfb + x + y * xres; -+ unsigned char buf[w*4]; -+ unsigned char *p = lfb + x*4 + y * xres; - int w1,h1; - - for (h1 = 0 ; h1 < h ; h1++) - { -- memcpy(buf,p,w); -+ memcpy(buf,p,w*4); - for (w1 = 0 ; w1 < w ; w1++) - { -- *(p+w1) = buf[w-(w1+1)]; -+ memcpy(p+w1*4,buf+((w-w1)*4)-4,4); - } - p += xres; - } - } - void tuxtxt_FlipVert(unsigned char *lfb, int xres,int x, int y, int w, int h) - { -- unsigned char buf[w]; -- unsigned char *p = lfb + x + y * xres, *p1, *p2; -+ unsigned char buf[w*4]; -+ unsigned char *p = lfb + x*4 + y * xres, *p1, *p2; - int h1; - - for (h1 = 0 ; h1 < h/2 ; h1++) - { - p1 = (p+(h1*xres)); - p2 = (p+(h-(h1+1))*xres); -- memcpy(buf,p1,w); -- memcpy(p1,p2,w); -- memcpy(p2,buf,w); -+ memcpy(buf,p1,w*4); -+ memcpy(p1,p2,w*4); -+ memcpy(p2,buf,w*4); - } - } - -@@ -3683,7 +3727,7 @@ - if (lfb) - { - int x,y,f,c; -- unsigned char* p = lfb + *pPosX + PosY* xres; -+ unsigned char* p = lfb + (*pPosX)*4 + PosY* xres; - for (y=0; yvar_screeninfo.yres-renderinfo->var_screeninfo.yoffset; -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,0 , ys ,renderinfo->StartX ,renderinfo->var_screeninfo.yres ,color); -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->StartX, ys ,renderinfo->displaywidth,renderinfo->StartY ,color); -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->StartX, ys+renderinfo->StartY+25*renderinfo->fontheight,renderinfo->displaywidth,renderinfo->var_screeninfo.yres-(renderinfo->StartY+25*renderinfo->fontheight),color); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,0 , ys ,renderinfo->StartX ,renderinfo->var_screeninfo.yres ,color); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->StartX, ys ,renderinfo->displaywidth,renderinfo->StartY ,color); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->StartX, ys+renderinfo->StartY+25*renderinfo->fontheight,renderinfo->displaywidth,renderinfo->var_screeninfo.yres-(renderinfo->StartY+25*renderinfo->fontheight),color); - - if (renderinfo->screenmode == 0 ) -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->StartX+renderinfo->displaywidth, ys,renderinfo->var_screeninfo.xres-(renderinfo->StartX+renderinfo->displaywidth),renderinfo->var_screeninfo.yres ,color); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->StartX+renderinfo->displaywidth, ys,renderinfo->var_screeninfo.xres-(renderinfo->StartX+renderinfo->displaywidth),renderinfo->var_screeninfo.yres ,color); - } - - -@@ -4037,12 +4081,12 @@ - } - void tuxtxt_ClearBB(tstRenderInfo* renderinfo,int color) - { -- memset(renderinfo->lfb + (renderinfo->var_screeninfo.yres-renderinfo->var_screeninfo.yoffset )*renderinfo->var_screeninfo.xres, color, renderinfo->var_screeninfo.xres*renderinfo->var_screeninfo.yres); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,0, renderinfo->var_screeninfo.yres - renderinfo->var_screeninfo.yoffset, renderinfo->var_screeninfo.xres, renderinfo->var_screeninfo.yres, color); - } - - void tuxtxt_ClearFB(tstRenderInfo* renderinfo,int color) - { -- memset(renderinfo->lfb + renderinfo->var_screeninfo.xres*renderinfo->var_screeninfo.yoffset, color, renderinfo->var_screeninfo.xres*renderinfo->var_screeninfo.yres); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,0, renderinfo->var_screeninfo.yoffset, renderinfo->var_screeninfo.xres, renderinfo->var_screeninfo.yres, color); - } - - int tuxtxt_GetCurFontWidth(tstRenderInfo* renderinfo) -@@ -4079,7 +4123,7 @@ - renderinfo->PosX += t; - int curfontwidth2 = tuxtxt_GetCurFontWidth(renderinfo); - renderinfo->PosX -= t; -- int alphachar = tuxtxt_RenderChar(renderinfo->lfb+(yoffset+renderinfo->StartY)*renderinfo->var_screeninfo.xres, renderinfo->var_screeninfo.xres,Char, &renderinfo->PosX, renderinfo->PosY-renderinfo->StartY, Attribute, zoom, curfontwidth, curfontwidth2, renderinfo->fontheight, renderinfo->transpmode,renderinfo->axdrcs, renderinfo->ascender); -+ int alphachar = tuxtxt_RenderChar(renderinfo->lfb+(yoffset+renderinfo->StartY)*renderinfo->fix_screeninfo.line_length, renderinfo->fix_screeninfo.line_length, Char, &renderinfo->PosX, renderinfo->PosY-renderinfo->StartY, Attribute, zoom, curfontwidth, curfontwidth2, renderinfo->fontheight, renderinfo->transpmode,renderinfo->axdrcs, renderinfo->ascender); - if (alphachar <= 0) return; - - if (zoom && Attribute->doubleh) -@@ -4112,7 +4156,7 @@ - #if TUXTXT_DEBUG - printf("TuxTxt lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, factor*renderinfo->fontheight, bgcolor); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, factor*renderinfo->fontheight, bgcolor); - renderinfo->PosX += curfontwidth; - return; - } -@@ -4127,7 +4171,7 @@ - printf("TuxTxt c%x a%x g%x w%d h%d x%d y%d\n", - error, alphachar, Attribute, glyph, curfontwidth, renderinfo->fontheight, renderinfo->PosX, renderinfo->PosY); - #endif -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, renderinfo->fontheight, bgcolor); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, renderinfo->fontheight, bgcolor); - renderinfo->PosX += curfontwidth; - return; - } -@@ -4188,13 +4232,13 @@ - Row = 0; - } - else -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, Row, bgcolor); /* fill upper margin */ -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, Row, bgcolor); /* fill upper margin */ - - if (renderinfo->ascender - renderinfo->sbit->top + renderinfo->TTFShiftY + he > renderinfo->fontheight) - he = renderinfo->fontheight - renderinfo->ascender + renderinfo->sbit->top - renderinfo->TTFShiftY; /* limit char height to defined/calculated fontheight */ - if (he < 0) he = renderinfo->fontheight; - -- p = renderinfo->lfb + renderinfo->PosX + (yoffset + renderinfo->PosY + Row) * renderinfo->var_screeninfo.xres; /* running pointer into framebuffer */ -+ p = renderinfo->lfb + renderinfo->PosX*4 + (yoffset + renderinfo->PosY + Row) * renderinfo->fix_screeninfo.line_length; /* running pointer into framebuffer */ - for (Row = he; Row; Row--) /* row counts up, but down may be a little faster :) */ - { - int pixtodo = (renderinfo->usettf ? renderinfo->sbit->width : curfontwidth); -@@ -4203,8 +4247,8 @@ - for (Bit = xfactor * (renderinfo->sbit->left + renderinfo->TTFShiftX); Bit > 0; Bit--) /* fill left margin */ - { - for (f = factor-1; f >= 0; f--) -- *(p + f*renderinfo->var_screeninfo.xres) = bgcolor; -- p++; -+ memcpy((p + f*renderinfo->fix_screeninfo.line_length),bgra[bgcolor],4);/*bgcolor*/ -+ p+=4; - if (!renderinfo->usettf) - pixtodo--; - } -@@ -4224,14 +4268,14 @@ - color = bgcolor; - - for (f = factor-1; f >= 0; f--) -- *(p + f*renderinfo->var_screeninfo.xres) = color; -- p++; -+ memcpy((p + f*renderinfo->fix_screeninfo.line_length),bgra[color],4); -+ p+=4; - - if (xfactor > 1) /* double width */ - { - for (f = factor-1; f >= 0; f--) -- *(p + f*renderinfo->var_screeninfo.xres) = color; -- p++; -+ memcpy((p + f*renderinfo->fix_screeninfo.line_length),bgra[color],4); -+ p+=4; - if (!renderinfo->usettf) - pixtodo--; - } -@@ -4242,17 +4286,17 @@ - Bit > 0; Bit--) /* fill rest of char width */ - { - for (f = factor-1; f >= 0; f--) -- *(p + f*renderinfo->var_screeninfo.xres) = bgcolor; -- p++; -+ memcpy((p + f*renderinfo->fix_screeninfo.line_length),bgra[bgcolor],4); -+ p+=4; - } - -- p = pstart + factor*renderinfo->var_screeninfo.xres; -+ p = pstart + factor*renderinfo->fix_screeninfo.line_length; - } - - Row = renderinfo->ascender - renderinfo->sbit->top + he + renderinfo->TTFShiftY; -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY + yoffset + Row*factor, curfontwidth, (renderinfo->fontheight - Row) * factor, bgcolor); /* fill lower margin */ -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY + yoffset + Row*factor, curfontwidth, (renderinfo->fontheight - Row) * factor, bgcolor); /* fill lower margin */ - if (Attribute->underline) -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY + yoffset + (renderinfo->fontheight-2)* factor, curfontwidth,2*factor, fgcolor); /* underline char */ -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY + yoffset + (renderinfo->fontheight-2)* factor, curfontwidth,2*factor, fgcolor); /* underline char */ - - renderinfo->PosX += curfontwidth; - renderinfo->TTFShiftY = backupTTFshiftY; // restore TTFShiftY -@@ -4300,9 +4344,8 @@ - - void tuxtxt_SwitchScreenMode(tstRenderInfo* renderinfo,int newscreenmode) - { --#if HAVE_DVB_API_VERSION >= 3 - struct v4l2_format format; --#endif -+ - /* reset transparency mode */ - if (renderinfo->transpmode) - renderinfo->transpmode = 0; -@@ -4370,42 +4413,53 @@ - - tuxtxt_setfontwidth(renderinfo,fw); - --#if HAVE_DVB_API_VERSION < 3 -- avia_pig_hide(renderinfo->pig); -- avia_pig_set_pos(renderinfo->pig, tx, ty); -- avia_pig_set_size(renderinfo->pig, tw, th); -- avia_pig_set_stack(renderinfo->pig, 2); -- avia_pig_show(renderinfo->pig); --#else -- int sm = 0; -- ioctl(renderinfo->pig, VIDIOC_OVERLAY, &sm); -- sm = 1; -- ioctl(renderinfo->pig, VIDIOC_G_FMT, &format); -- format.type = V4L2_BUF_TYPE_VIDEO_OVERLAY; -- format.fmt.win.w.left = tx; -- format.fmt.win.w.top = ty; -- format.fmt.win.w.width = tw; -- format.fmt.win.w.height = th; -- ioctl(renderinfo->pig, VIDIOC_S_FMT, &format); -- ioctl(renderinfo->pig, VIDIOC_OVERLAY, &sm); --#endif -- ioctl(renderinfo->avs, AVSIOSSCARTPIN8, &fncmodes[renderinfo->screen_mode2]); -- ioctl(renderinfo->saa, SAAIOSWSS, &saamodes[renderinfo->screen_mode2]); -+ // Video picture scale/pos for e2 -+ int i; -+ for (i=0; i<4; ++i) -+ { -+ char *targets[]={"left", "top", "width", "height"}; -+ char filename[128]; -+ snprintf(filename, 128, "/proc/stb/vmpeg/%d/dst_%s", 0, targets[i]); -+ FILE *f = fopen(filename, "w"); -+ if (!f) -+ break; -+ int val = 0; -+ switch (i) -+ { -+ case 0: val = tx; break; -+ case 1: val = ty; break; -+ case 2: val = tw; break; -+ case 3: val = th; break; -+ } -+ fprintf(f, "%08x\n", val); -+ fclose(f); -+ } -+ -+ writeproc("/proc/stb/avs/0/sb", fncmodes[renderinfo->screen_mode2]); -+ writeproc("/proc/stb/denc/0/wss", saamodes[renderinfo->screen_mode2]); - } - else /* not split */ - { --#if HAVE_DVB_API_VERSION < 3 -- avia_pig_hide(renderinfo->pig); --#else -- ioctl(renderinfo->pig, VIDIOC_OVERLAY, &renderinfo->screenmode); --#endif -+ // Video picture scale/pos for e2 -+ int i; -+ for (i=0; i<4; ++i) -+ { -+ char *targets[]={"left", "top", "width", "height"}; -+ char filename[128]; -+ snprintf(filename, 128, "/proc/stb/vmpeg/%d/dst_%s", 0, targets[i]); -+ FILE *f = fopen(filename, "w"); -+ if (!f) -+ break; -+ fprintf(f, "%08x\n", 0); -+ fclose(f); -+ } - - tuxtxt_setfontwidth(renderinfo,renderinfo->fontwidth_normal); - renderinfo->displaywidth= (renderinfo->ex-renderinfo->sx); - renderinfo->StartX = renderinfo->sx; //+ (ex-sx - 40*fontwidth) / 2; /* center screen */ - -- ioctl(renderinfo->avs, AVSIOSSCARTPIN8, &fncmodes[renderinfo->screen_mode1]); -- ioctl(renderinfo->saa, SAAIOSWSS, &saamodes[renderinfo->screen_mode1]); -+ writeproc("/proc/stb/avs/0/sb", fncmodes[renderinfo->screen_mode1]); -+ writeproc("/proc/stb/denc/0/wss", saamodes[renderinfo->screen_mode1]); - } - } - -@@ -4431,7 +4485,7 @@ - if (renderinfo->boxed) - { - renderinfo->PosX = renderinfo->StartX + column*width; -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY+yoffset, renderinfo->displaywidth, renderinfo->fontheight, tuxtxt_color_transp); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY+yoffset, renderinfo->displaywidth, renderinfo->fontheight, tuxtxt_color_transp); - return; - } - -@@ -4442,7 +4496,7 @@ - - if (l > 9) /* smaller font, if no space for one half space at front and end */ - tuxtxt_setfontwidth(renderinfo,oldfontwidth * 10 / (l+1)); -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY+yoffset, width+(renderinfo->displaywidth%4), renderinfo->fontheight, tuxtxt_atrtable[ATR_L250 + column].bg); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY+yoffset, width+(renderinfo->displaywidth%4), renderinfo->fontheight, tuxtxt_atrtable[ATR_L250 + column].bg); - renderinfo->PosX += ((width) - (l*renderinfo->fontwidth+l*renderinfo->fontwidth/abx))/2; /* center */ - for (p = tuxtxt_cache.adip[linkpage]; *p; p++) - tuxtxt_RenderCharBB(renderinfo,*p, &tuxtxt_atrtable[ATR_L250 + column]); -@@ -4451,7 +4505,7 @@ - else /* display number */ - { - renderinfo->PosX = renderinfo->StartX + column*width; -- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY+yoffset, renderinfo->displaywidth+renderinfo->sx-renderinfo->PosX, renderinfo->fontheight, tuxtxt_atrtable[ATR_L250 + column].bg); -+ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY+yoffset, renderinfo->displaywidth+renderinfo->sx-renderinfo->PosX, renderinfo->fontheight, tuxtxt_atrtable[ATR_L250 + column].bg); - if (linkpage < tuxtxt_cache.page) - { - line[6] = '<'; -@@ -4620,7 +4674,7 @@ - void tuxtxt_CopyBB2FB(tstRenderInfo* renderinfo) - { - unsigned char *src, *dst, *topsrc; -- int fillcolor, i, screenwidth; -+ int fillcolor, i, screenwidth, swtmp; - - /* line 25 */ - if (!renderinfo->pagecatching) -@@ -4636,8 +4690,8 @@ - if (ioctl(renderinfo->fb, FBIOPAN_DISPLAY, &renderinfo->var_screeninfo) == -1) - perror("TuxTxt "); - -- if (renderinfo->StartX > 0 && *renderinfo->lfb != *(renderinfo->lfb + renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yres)) /* adapt background of backbuffer if changed */ -- tuxtxt_FillBorder(renderinfo,*(renderinfo->lfb + renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yoffset)); -+ if (renderinfo->StartX > 0 && *renderinfo->lfb != *(renderinfo->lfb + renderinfo->fix_screeninfo.line_length * renderinfo->var_screeninfo.yres)) /* adapt background of backbuffer if changed */ -+ tuxtxt_FillBorder(renderinfo,*(renderinfo->lfb + renderinfo->fix_screeninfo.line_length * renderinfo->var_screeninfo.yoffset)); - // ClearBB(*(lfb + renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yoffset)); - - if (renderinfo->clearbbcolor >= 0) -@@ -4648,18 +4702,18 @@ - return; - } - -- src = dst = topsrc = renderinfo->lfb + renderinfo->StartY*renderinfo->var_screeninfo.xres; -+ src = dst = topsrc = renderinfo->lfb + renderinfo->StartY*renderinfo->fix_screeninfo.line_length; - - - if (renderinfo->var_screeninfo.yoffset) -- dst += renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yres; -+ dst += renderinfo->fix_screeninfo.line_length * renderinfo->var_screeninfo.yres; - else - { -- src += renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yres; -- topsrc += renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yres; -+ src += renderinfo->fix_screeninfo.line_length * renderinfo->var_screeninfo.yres; -+ topsrc += renderinfo->fix_screeninfo.line_length * renderinfo->var_screeninfo.yres; - } - if (!renderinfo->pagecatching ) -- memcpy(dst+(24*renderinfo->fontheight)*renderinfo->var_screeninfo.xres, src + (24*renderinfo->fontheight)*renderinfo->var_screeninfo.xres, renderinfo->var_screeninfo.xres*renderinfo->fontheight); /* copy line25 in normal height */ -+ memcpy(dst+(24*renderinfo->fontheight)*renderinfo->fix_screeninfo.line_length, src + (24*renderinfo->fontheight)*renderinfo->fix_screeninfo.line_length, renderinfo->fix_screeninfo.line_length*renderinfo->fontheight); /* copy line25 in normal height */ - - if (renderinfo->transpmode) - fillcolor = tuxtxt_color_transp; -@@ -4667,94 +4721,81 @@ - fillcolor = tuxtxt_cache.FullScrColor; - - if (renderinfo->zoommode == 2) -- src += 12*renderinfo->fontheight*renderinfo->var_screeninfo.xres; -+ src += 12*renderinfo->fontheight*renderinfo->fix_screeninfo.line_length; - - if (renderinfo->screenmode == 1) /* copy topmenu in normal height (since PIG also keeps dimensions) */ - { - unsigned char *topdst = dst; - -- screenwidth = TV43STARTX; -+ screenwidth = (TV43STARTX) * 4; - - topsrc += screenwidth; - topdst += screenwidth; - for (i=0; i < 24*renderinfo->fontheight; i++) - { - memcpy(topdst, topsrc,renderinfo->ex-screenwidth); -- topdst += renderinfo->var_screeninfo.xres; -- topsrc += renderinfo->var_screeninfo.xres; -+ topdst += renderinfo->fix_screeninfo.line_length; -+ topsrc += renderinfo->fix_screeninfo.line_length; - } - } - else if (renderinfo->screenmode == 2) -- screenwidth = TV169FULLSTARTX; -+ screenwidth = (TV169FULLSTARTX) * 4; - else -- screenwidth = renderinfo->var_screeninfo.xres; -+ screenwidth = renderinfo->fix_screeninfo.line_length; - - for (i = renderinfo->StartY; i>0;i--) - { -- memset(dst - i*renderinfo->var_screeninfo.xres, fillcolor, screenwidth); -+ for (swtmp=0; swtmpfix_screeninfo.line_length+swtmp*4, bgra[fillcolor], 4); -+ } - } - - for (i = 12*renderinfo->fontheight; i; i--) - { - memcpy(dst, src, screenwidth); -- dst += renderinfo->var_screeninfo.xres; -+ dst += renderinfo->fix_screeninfo.line_length; - memcpy(dst, src, screenwidth); -- dst += renderinfo->var_screeninfo.xres; -- src += renderinfo->var_screeninfo.xres; -+ dst += renderinfo->fix_screeninfo.line_length; -+ src += renderinfo->fix_screeninfo.line_length; - } - - // if (!pagecatching ) - // memcpy(dst, lfb + (StartY+24*fontheight)*renderinfo->var_screeninfo.xres, renderinfo->var_screeninfo.xres*fontheight); /* copy line25 in normal height */ -- for (i = renderinfo->var_screeninfo.yres - renderinfo->StartY - 25*renderinfo->fontheight; i >= 0;i--) -- { -- memset(dst + renderinfo->var_screeninfo.xres*(renderinfo->fontheight+i), fillcolor, screenwidth); -- } -+ dst -= renderinfo->fix_screeninfo.line_length; -+ -+ unsigned char linebuf[screenwidth]; -+ for (swtmp=0; swtmp < screenwidth/4;swtmp++) -+ memcpy(linebuf+swtmp*4, bgra[fillcolor], 4); -+ for (i = renderinfo->var_screeninfo.yres - renderinfo->StartY - 25 * renderinfo->fontheight; i >= 0;i--) -+ memcpy(dst + renderinfo->fix_screeninfo.line_length*(renderinfo->fontheight+i), linebuf, screenwidth); - } - - void tuxtxt_setcolors(tstRenderInfo* renderinfo,unsigned short *pcolormap, int offset, int number) - { -- struct fb_cmap colormap_0 = {0, tuxtxt_color_SIZECOLTABLE, renderinfo->rd0, renderinfo->gn0, renderinfo->bl0, renderinfo->tr0}; -- int i, changed=0; -+ int i,trans_tmp; - int j = offset; /* index in global color table */ - -- unsigned short t = renderinfo->tr0[tuxtxt_color_transp2]; -- renderinfo->tr0[tuxtxt_color_transp2] = (renderinfo->trans_mode+7)<<11 | 0x7FF; --#ifndef HAVE_DREAMBOX_HARDWARE -- /* "correct" semi-transparent for Nokia (GTX only allows 2(?) levels of transparency) */ -- if (tuxbox_get_vendor() == TUXBOX_VENDOR_NOKIA) -- renderinfo->tr0[tuxtxt_color_transp2] = 0xFFFF; --#endif -- if (t != renderinfo->tr0[tuxtxt_color_transp2]) changed = 1; -+ trans_tmp=25-renderinfo->trans_mode; -+ -+ bgra[tuxtxt_color_transp2][3]=((trans_tmp+7)<<11 | 0x7FF)>>8; -+ - for (i = 0; i < number; i++) - { -- int r = (pcolormap[i] << 12) & 0xf000; -- int g = (pcolormap[i] << 8) & 0xf000; -- int b = (pcolormap[i] << 4) & 0xf000; -- -+ int r = (pcolormap[i] << 12 & 0xF000) >> 8; -+ int g = (pcolormap[i] << 8 & 0xF000) >> 8; -+ int b = (pcolormap[i] << 4 & 0xF000) >> 8; - - r = (r * (0x3f+(renderinfo->color_mode<<3))) >> 8; - g = (g * (0x3f+(renderinfo->color_mode<<3))) >> 8; - b = (b * (0x3f+(renderinfo->color_mode<<3))) >> 8; -- if (renderinfo->rd0[j] != r) -- { -- renderinfo->rd0[j] = r; -- changed = 1; -- } -- if (renderinfo->gn0[j] != g) -- { -- renderinfo->gn0[j] = g; -- changed = 1; -- } -- if (renderinfo->bl0[j] != b) -- { -- renderinfo->bl0[j] = b; -- changed = 1; -- } -+ -+ bgra[j][2]=r; -+ bgra[j][1]=g; -+ bgra[j][0]=b; -+ - j++; - } -- if (changed) -- if (ioctl(renderinfo->fb, FBIOPUTCMAP, &colormap_0) == -1) -- perror("TuxTxt "); - } - - /****************************************************************************** -@@ -4968,11 +5009,11 @@ - - for (row = 0; row < DRCSROWS; row++) - for (col = 0; col < DRCSCOLS; col++) -- tuxtxt_RenderDRCS(renderinfo->var_screeninfo.xres, -+ tuxtxt_RenderDRCS(renderinfo->fix_screeninfo.line_length, - renderinfo->page_char + 20 * (DRCSCOLS * row + col + 2), - renderinfo->lfb -- + (renderinfo->StartY + renderinfo->fontheight + DRCSYSPC * row + renderinfo->var_screeninfo.yres - renderinfo->var_screeninfo.yoffset) * renderinfo->var_screeninfo.xres -- + renderinfo->StartX + DRCSXSPC * col, -+ + (renderinfo->StartY + renderinfo->fontheight + DRCSYSPC * row + renderinfo->var_screeninfo.yres - renderinfo->var_screeninfo.yoffset) * renderinfo->fix_screeninfo.line_length -+ + (renderinfo->StartX + DRCSXSPC * col)*4, - ax, tuxtxt_color_white, tuxtxt_color_black); - - memset(renderinfo->page_char + 40, 0xff, 24*40); /* don't render any char below row 0 */ -@@ -5062,13 +5103,13 @@ - renderinfo->pageinfo = p; - renderinfo->boxed = p->boxed; - } -+ if (tuxtxt_cache.colortable) /* as late as possible to shorten the time the old page is displayed with the new colors */ -+ tuxtxt_setcolors(renderinfo,tuxtxt_cache.colortable, 16, 16); /* set colors for CLUTs 2+3 */ - if (renderinfo->boxed || renderinfo->transpmode) - // tuxtxt_cache.FullScrColor = tuxtxt_color_transp; - tuxtxt_FillBorder(renderinfo,tuxtxt_color_transp); - else - tuxtxt_FillBorder(renderinfo,tuxtxt_cache.FullScrColor); -- if (tuxtxt_cache.colortable) /* as late as possible to shorten the time the old page is displayed with the new colors */ -- tuxtxt_setcolors(renderinfo,tuxtxt_cache.colortable, 16, 16); /* set colors for CLUTs 2+3 */ - } - else - startrow = 1; -@@ -5408,39 +5449,6 @@ - renderinfo->page_atrb[i].doublew = 0; - renderinfo->page_atrb[i].IgnoreAtBlackBgSubst = 0; - } -- if (setTVFormat) -- { -- /* open avs */ -- if ((renderinfo->avs = open(AVS, O_RDWR)) == -1) -- { -- perror("TuxTxt "); -- FTC_Manager_Done(renderinfo->manager); -- FT_Done_FreeType(renderinfo->library); -- return 0; -- } -- -- ioctl(renderinfo->avs, AVSIOGSCARTPIN8, &renderinfo->fnc_old); -- ioctl(renderinfo->avs, AVSIOSSCARTPIN8, &fncmodes[renderinfo->screen_mode1]); -- /* open saa */ -- if ((renderinfo->saa = open(SAA, O_RDWR)) == -1) -- { -- perror("TuxTxt "); -- FTC_Manager_Done(renderinfo->manager); -- FT_Done_FreeType(renderinfo->library); -- return 0; -- } -- -- ioctl(renderinfo->saa, SAAIOGWSS, &renderinfo->saa_old); -- ioctl(renderinfo->saa, SAAIOSWSS, &saamodes[renderinfo->screen_mode1]); -- } -- /* open pig */ -- if ((renderinfo->pig = open(PIG, O_RDWR)) == -1) -- { -- perror("TuxTxt "); -- FTC_Manager_Done(renderinfo->manager); -- FT_Done_FreeType(renderinfo->library); -- return 0; -- } - return 1; - } - /****************************************************************************** -@@ -5489,7 +5497,7 @@ - FT_Done_FreeType(renderinfo->library); - renderinfo->manager = 0; - renderinfo->library = 0; -- tuxtxt_ClearFB(renderinfo,renderinfo->previousbackcolor); -+ memset(renderinfo->lfb, 0, renderinfo->fix_screeninfo.smem_len); - /* unmap framebuffer */ - munmap(renderinfo->lfb, renderinfo->fix_screeninfo.smem_len); - printf("[TTX] Rendering ended\n"); -diff -Naur libs-org/libtuxtxt/tuxtxt_def.h libs/libtuxtxt/tuxtxt_def.h ---- libs-org/libtuxtxt/tuxtxt_def.h 2010-03-06 10:51:52.000000000 +0100 -+++ libs/libtuxtxt/tuxtxt_def.h 2010-03-06 10:55:25.000000000 +0100 -@@ -72,8 +72,10 @@ - #define hold_mosaic 0x1E - #define release_mosaic 0x1F - --const int fncmodes[] = {AVS_FNCOUT_EXT43, AVS_FNCOUT_EXT169}; --const int saamodes[] = {SAA_WSS_43F, SAA_WSS_169F}; -+extern unsigned char bgra[][4]; -+ -+const char * fncmodes[] = {"12", "6"}; -+const char * saamodes[] = {"4:3_full_format", "16:9_full_format"}; - - typedef enum /* object type */ - { diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/acinclude.m4 b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/acinclude.m4 deleted file mode 100644 index 3c26669..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/acinclude.m4 +++ /dev/null @@ -1,385 +0,0 @@ -AC_DEFUN(TUXBOX_APPS,[ -AM_CONFIG_HEADER(config.h) -AM_MAINTAINER_MODE - -INSTALL="$INSTALL -p" - -AC_GNU_SOURCE -AC_SYS_LARGEFILE - -AC_ARG_WITH(target, - [ --with-target=TARGET target for compilation [[native,cdk]]], - [TARGET="$withval"],[TARGET="native"]) - -AC_ARG_WITH(targetprefix, - [ --with-targetprefix=PATH prefix relative to target root (only applicable in cdk mode)], - [targetprefix="$withval"],[targetprefix="NONE"]) - -AC_ARG_WITH(debug, - [ --without-debug disable debugging code], - [DEBUG="$withval"],[DEBUG="yes"]) - -if test "$DEBUG" = "yes"; then - DEBUG_CFLAGS="-g3 -ggdb" - AC_DEFINE(DEBUG,1,[Enable debug messages]) -fi - -AC_MSG_CHECKING(target) - -if test "$TARGET" = "native"; then - AC_MSG_RESULT(native) - - if test "$CFLAGS" = "" -a "$CXXFLAGS" = ""; then - CFLAGS="-Wall -O2 -pipe $DEBUG_CFLAGS" - CXXFLAGS="-Wall -O2 -pipe $DEBUG_CFLAGS" - fi - if test "$prefix" = "NONE"; then - prefix=/usr/local - fi - targetprefix=$prefix -elif test "$TARGET" = "cdk"; then - AC_MSG_RESULT(cdk) - - if test "$CC" = "" -a "$CXX" = ""; then - CC=powerpc-tuxbox-linux-gnu-gcc CXX=powerpc-tuxbox-linux-gnu-g++ - fi - if test "$CFLAGS" = "" -a "$CXXFLAGS" = ""; then - CFLAGS="-Wall -Os -mcpu=823 -pipe $DEBUG_CFLAGS" - CXXFLAGS="-Wall -Os -mcpu=823 -pipe $DEBUG_CFLAGS" - fi - if test "$prefix" = "NONE"; then - AC_MSG_ERROR(invalid prefix, you need to specify one in cdk mode) - fi - if test "$targetprefix" = "NONE"; then - targetprefix="" - fi - if test "$host_alias" = ""; then - cross_compiling=yes - host_alias=powerpc-tuxbox-linux-gnu - fi -else - AC_MSG_RESULT(none) - AC_MSG_ERROR([invalid target $TARGET, choose on from native,cdk]); -fi - -AC_CANONICAL_BUILD -AC_CANONICAL_HOST - -check_path () { - return $(perl -e "if(\"$1\"=~m#^/usr/(local/)?bin#){print \"0\"}else{print \"1\";}") -} - -]) - -AC_DEFUN(TUXBOX_APPS_DIRECTORY_ONE,[ -AC_ARG_WITH($1,[ $6$7 [[PREFIX$4$5]]],[ - _$2=$withval - if test "$TARGET" = "cdk"; then - $2=`eval echo "${targetprefix}$withval"` - else - $2=$withval - fi -],[ - $2="\${$3}$5" - if test "$TARGET" = "cdk"; then - _$2=`eval echo "${target$3}$5"` - else - _$2=`eval echo "${$3}$5"` - fi -]) - -dnl automake <= 1.6 don't support this -dnl AC_SUBST($2) -AC_DEFINE_UNQUOTED($2,"$_$2",$7) -]) - -AC_DEFUN(TUXBOX_APPS_DIRECTORY,[ -AC_REQUIRE([TUXBOX_APPS]) - -if test "$TARGET" = "cdk"; then - datadir="\${prefix}/share" - sysconfdir="\${prefix}/etc" - localstatedir="\${prefix}/var" - libdir="\${prefix}/lib" - targetdatadir="\${targetprefix}/share" - targetsysconfdir="\${targetprefix}/etc" - targetlocalstatedir="\${targetprefix}/var" - targetlibdir="\${targetprefix}/lib" -fi - -TUXBOX_APPS_DIRECTORY_ONE(configdir,CONFIGDIR,sysconfdir,/etc,/tuxbox, - [--with-configdir=PATH ],[where to find the config files]) - -TUXBOX_APPS_DIRECTORY_ONE(datadir,DATADIR,datadir,/share,/tuxbox, - [--with-datadir=PATH ],[where to find data]) - -TUXBOX_APPS_DIRECTORY_ONE(fontdir,FONTDIR,datadir,/share,/fonts, - [--with-fontdir=PATH ],[where to find the fonts]) - -TUXBOX_APPS_DIRECTORY_ONE(gamesdir,GAMESDIR,localstatedir,/etc,/tuxbox/games, - [--with-gamesdir=PATH ],[where games data is stored]) - -TUXBOX_APPS_DIRECTORY_ONE(libdir,LIBDIR,libdir,/lib,/tuxbox, - [--with-libdir=PATH ],[where to find the internal libs]) - -TUXBOX_APPS_DIRECTORY_ONE(plugindir,PLUGINDIR,libdir,/lib,/tuxbox/plugins, - [--with-plugindir=PATH ],[where to find the plugins]) - -TUXBOX_APPS_DIRECTORY_ONE(ucodedir,UCODEDIR,localstatedir,/var,/tuxbox/ucodes, - [--with-ucodedir=PATH ],[where to find the ucodes]) -]) - -dnl automake <= 1.6 needs this specifications -AC_SUBST(CONFIGDIR) -AC_SUBST(DATADIR) -AC_SUBST(FONTDIR) -AC_SUBST(GAMESDIR) -AC_SUBST(LIBDIR) -AC_SUBST(PLUGINDIR) -AC_SUBST(UCODEDIR) -dnl end workaround - -AC_DEFUN(TUXBOX_APPS_ENDIAN,[ -AC_CHECK_HEADERS(endian.h) -AC_C_BIGENDIAN -]) - -AC_DEFUN(TUXBOX_APPS_DRIVER,[ -AC_ARG_WITH(driver, - [ --with-driver=PATH path for driver sources [[NONE]]], - [DRIVER="$withval"],[DRIVER=""]) - -if test "$DRIVER"; then - if test -d "$DRIVER/include"; then - AC_DEFINE(HAVE_DBOX2_DRIVER,1,[Define to 1 if you have the dbox2 driver sources]) - #else - # AC_MSG_ERROR([can't find driver sources]) - fi - - AC_SUBST(DRIVER) - - CPPFLAGS="$CPPFLAGS -I$DRIVER/include" -fi -]) - -AC_DEFUN([TUXBOX_APPS_DVB],[ -AC_ARG_WITH(dvbincludes, - [ --with-dvbincludes=PATH path for dvb includes [[NONE]]], - [DVBINCLUDES="$withval"],[DVBINCLUDES=""]) - -if test "$DVBINCLUDES"; then - CPPFLAGS="$CPPFLAGS -I$DVBINCLUDES" -fi - -AC_CHECK_HEADERS(ost/dmx.h,[ - DVB_API_VERSION=1 - AC_MSG_NOTICE([found dvb version 1]) -]) - -if test -z "$DVB_API_VERSION"; then -AC_CHECK_HEADERS(linux/dvb/version.h,[ - AC_LANG_PREPROC_REQUIRE() - AC_REQUIRE([AC_PROG_EGREP]) - AC_LANG_CONFTEST([AC_LANG_SOURCE([[ -#include -version DVB_API_VERSION - ]])]) - DVB_API_VERSION=`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | $EGREP "^version" | sed "s,version\ ,,"` - rm -f conftest* - - AC_MSG_NOTICE([found dvb version $DVB_API_VERSION]) -]) -fi - -if test "$DVB_API_VERSION"; then - AC_DEFINE(HAVE_DVB,1,[Define to 1 if you have the dvb includes]) - AC_DEFINE_UNQUOTED(HAVE_DVB_API_VERSION,$DVB_API_VERSION,[Define to the version of the dvb api]) -else - AC_MSG_ERROR([can't find dvb headers]) -fi -]) - -AC_DEFUN(_TUXBOX_APPS_LIB_CONFIG,[ -AC_PATH_PROG($1_CONFIG,$2,no) -if test "$$1_CONFIG" != "no"; then - if test "$TARGET" = "cdk" && check_path "$$1_CONFIG"; then - AC_MSG_$3([could not find a suitable version of $2]); - else - $1_CFLAGS=$($$1_CONFIG --cflags) - $1_LIBS=$($$1_CONFIG --libs) - fi -fi - -AC_SUBST($1_CFLAGS) -AC_SUBST($1_LIBS) -]) - -AC_DEFUN(TUXBOX_APPS_LIB_CONFIG,[ -_TUXBOX_APPS_LIB_CONFIG($1,$2,ERROR) -if test "$$1_CONFIG" = "no"; then - AC_MSG_ERROR([could not find $2]); -fi -]) - -AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_CHECK,[ -_TUXBOX_APPS_LIB_CONFIG($1,$2,WARN) -]) - -AC_DEFUN(TUXBOX_APPS_PKGCONFIG,[ -AC_PATH_PROG(PKG_CONFIG, pkg-config,no) -if test "$PKG_CONFIG" = "no" ; then - AC_MSG_ERROR([could not find pkg-config]); -fi -]) - -AC_DEFUN(_TUXBOX_APPS_LIB_PKGCONFIG,[ -AC_REQUIRE([TUXBOX_APPS_PKGCONFIG]) -PKG_CHECK_MODULES($1,$2) -AC_SUBST($1_CFLAGS) -AC_SUBST($1_LIBS) -]) - -AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG,[ -_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) -if test -z "$$1_CFLAGS" ; then - AC_MSG_ERROR([could not find package $2]); -fi -]) - -AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG_CHECK,[ -_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) -]) - -AC_DEFUN(_TUXBOX_APPS_LIB_SYMBOL,[ -AC_CHECK_LIB($2,$3,HAVE_$1="yes",HAVE_$1="no") -if test "$HAVE_$1" = "yes"; then - $1_LIBS=-l$2 -fi - -AC_SUBST($1_LIBS) -]) - -AC_DEFUN(TUXBOX_APPS_LIB_SYMBOL,[ -_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,ERROR) -if test "$HAVE_$1" = "no"; then - AC_MSG_ERROR([could not find $2]); -fi -]) - -AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_SYMBOL,[ -_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,WARN) -]) - -AC_DEFUN(TUXBOX_APPS_GETTEXT,[ -AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && - (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], - :) -AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - -AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && - (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], - :) - -AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,[$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1],:) - -AC_MSG_CHECKING([whether NLS is requested]) -AC_ARG_ENABLE(nls, - [ --disable-nls do not use Native Language Support], - USE_NLS=$enableval, USE_NLS=yes) -AC_MSG_RESULT($USE_NLS) -AC_SUBST(USE_NLS) - -if test "$USE_NLS" = "yes"; then - AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,[ - AC_TRY_LINK([ - #include - #ifndef __GNU_GETTEXT_SUPPORTED_REVISION - #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) - #endif - extern int _nl_msg_cat_cntr; - extern int *_nl_domain_bindings; - ],[ - bindtextdomain ("", ""); - return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings; - ], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no - )] - ) - - if test "$gt_cv_func_gnugettext_libc" = "yes"; then - AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) - gt_use_preinstalled_gnugettext=yes - else - USE_NLS=no - fi -fi - -if test -f "$srcdir/po/LINGUAS"; then - ALL_LINGUAS=$(sed -e "/^#/d" "$srcdir/po/LINGUAS") -fi - -POFILES= -GMOFILES= -UPDATEPOFILES= -DUMMYPOFILES= -for lang in $ALL_LINGUAS; do - POFILES="$POFILES $srcdirpre$lang.po" - GMOFILES="$GMOFILES $srcdirpre$lang.gmo" - UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" - DUMMYPOFILES="$DUMMYPOFILES $lang.nop" -done -INST_LINGUAS= -if test -n "$ALL_LINGUAS"; then - for presentlang in $ALL_LINGUAS; do - useit=no - if test -n "$LINGUAS"; then - desiredlanguages="$LINGUAS" - else - desiredlanguages="$ALL_LINGUAS" - fi - for desiredlang in $desiredlanguages; do - case "$desiredlang" in - "$presentlang"*) useit=yes;; - esac - done - if test $useit = yes; then - INST_LINGUAS="$INST_LINGUAS $presentlang" - fi - done -fi -CATALOGS= -if test -n "$INST_LINGUAS"; then - for lang in $INST_LINGUAS; do - CATALOGS="$CATALOGS $lang.gmo" - done -fi -AC_SUBST(POFILES) -AC_SUBST(GMOFILES) -AC_SUBST(UPDATEPOFILES) -AC_SUBST(DUMMYPOFILES) -AC_SUBST(CATALOGS) -]) - -dnl backward compatiblity -AC_DEFUN([AC_GNU_SOURCE], -[AH_VERBATIM([_GNU_SOURCE], -[/* Enable GNU extensions on systems that have them. */ -#ifndef _GNU_SOURCE -# undef _GNU_SOURCE -#endif])dnl -AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl -AC_BEFORE([$0], [AC_RUN_IFELSE])dnl -AC_DEFINE([_GNU_SOURCE]) -]) - -AC_DEFUN([AC_PROG_EGREP], -[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], - [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi]) - EGREP=$ac_cv_prog_egrep - AC_SUBST([EGREP]) -]) - diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/allow_different_demux.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/allow_different_demux.diff deleted file mode 100644 index d5aac5b..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/allow_different_demux.diff +++ /dev/null @@ -1,95 +0,0 @@ -diff -u libs/libtuxtxt_orig/libtuxtxt.c libs/libtuxtxt/libtuxtxt.c ---- libs/libtuxtxt_orig/libtuxtxt.c 2009-01-29 21:21:08.000000000 +0100 -+++ libs/libtuxtxt/libtuxtxt.c 2009-01-29 21:26:49.000000000 +0100 -@@ -65,6 +65,13 @@ - tuxtxt_cache.thread_id = 0; - tuxtxt_cache.dmx = -1; - pthread_mutex_unlock(&tuxtxt_control_lock); -+ -+#if HAVE_DVB_API_VERSION < 3 -+ strcpy(tuxtxt_cache.demux, "/dev/dvb/card0/demux0"); -+#else -+ strcpy(tuxtxt_cache.demux, "/dev/dvb/adapter0/demux0"); -+#endif -+ - return 1;//tuxtxt_init_demuxer(); - } - -@@ -82,7 +89,7 @@ - pthread_mutex_unlock(&tuxtxt_control_lock); - return res; - } --int tuxtxt_start(int tpid) -+int tuxtxt_start(int tpid, int demux) - { - int ret = 1; - pthread_mutex_lock(&tuxtxt_control_lock); -@@ -92,10 +99,26 @@ - tuxtxt_clear_cache(); - tuxtxt_cache.page = 0x100; - tuxtxt_cache.vtxtpid = tpid; -+ if (demux >= 0) -+ { -+#if HAVE_DVB_API_VERSION < 3 -+ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/card0/demux%d", demux); -+#else -+ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/adapter0/demux%d", demux); -+#endif -+ } - ret = tuxtxt_start_thread(); - } - else if (!tuxtxt_cache.thread_starting && !tuxtxt_cache.receiving) - { -+ if (demux >= 0) -+ { -+#if HAVE_DVB_API_VERSION < 3 -+ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/card0/demux%d", demux); -+#else -+ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/adapter0/demux%d", demux); -+#endif -+ } - ret = tuxtxt_start_thread(); - } - pthread_mutex_unlock(&tuxtxt_control_lock); -diff -u libs/libtuxtxt_orig/tuxtxt_common.h libs/libtuxtxt/tuxtxt_common.h ---- libs/libtuxtxt_orig/tuxtxt_common.h 2009-01-29 21:24:32.000000000 +0100 -+++ libs/libtuxtxt/tuxtxt_common.h 2009-01-29 21:26:49.000000000 +0100 -@@ -1751,9 +1751,9 @@ - if (tuxtxt_cache.dmx != -1) - { - ioctl(tuxtxt_cache.dmx, DMX_STOP); --// close(tuxtxt_cache.dmx); -- } --// tuxtxt_cache.dmx = -1; -+ close(tuxtxt_cache.dmx); -+ } -+ tuxtxt_cache.dmx = -1; - #if 1//DEBUG - printf("TuxTxt stopped service %x\n", tuxtxt_cache.vtxtpid); - #endif -diff -u libs/libtuxtxt_orig/tuxtxt_def.h libs/libtuxtxt/tuxtxt_def.h ---- libs/libtuxtxt_orig/tuxtxt_def.h 2009-01-29 21:19:23.000000000 +0100 -+++ libs/libtuxtxt/tuxtxt_def.h 2009-01-29 21:26:49.000000000 +0100 -@@ -19,12 +19,12 @@ - #define pes_type pesType - #define dmx_sct_filter_params dmxSctFilterParams - #include -- #define DMX "/dev/dvb/card0/demux0" - #else - #include -- #define DMX "/dev/dvb/adapter0/demux0" - #endif - -+#define DMX tuxtxt_cache.demux -+ - #include - #include FT_FREETYPE_H - #include FT_CACHE_H -@@ -325,6 +325,7 @@ - short flofpages[0x900][FLOFSIZE]; - unsigned char adip[0x900][13]; - unsigned char subpagetable[0x900]; -+ char demux[64]; - int dmx; - int vtxtpid; - int cached_pages, page, subpage, pageupdate,page_receiving, current_page[9], current_subpage[9]; diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch deleted file mode 100644 index 11253b0..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ~/Makefile.am~ 2005-06-26 17:19:00.000000000 +0200 -+++ ~/Makefile.am 2008-09-03 19:59:00.000000000 +0200 -@@ -1,8 +1,5 @@ - AUTOMAKE_OPTIONS = gnu - - SUBDIRS = \ -- libavs \ -- liblcddisplay \ -- liblircdclient \ - libtuxtxt - diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/libz.patch b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/libz.patch deleted file mode 100644 index 6b74a28..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/libz.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- libs/libtuxtxt/Makefile.am 2012-02-17 00:44:38.933059300 +0100 -+++ libs/libtuxtxt/Makefile.am 2012-02-17 01:31:00.077032773 +0100 -@@ -4,6 +4,7 @@ - pkginclude_HEADERS = tuxtxt_def.h tuxtxt_common.h - - libtuxtxt_la_SOURCES = libtuxtxt.c -+libtuxtxt_la_LIBADD = -lz - - AM_CPPFLAGS = \ - @FREETYPE_CFLAGS@ diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/resize_framebuffer.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/resize_framebuffer.diff deleted file mode 100644 index a5f6007..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/resize_framebuffer.diff +++ /dev/null @@ -1,48 +0,0 @@ -diff -u libs/libtuxtxt_orig/tuxtxt_common.h libs/libtuxtxt/tuxtxt_common.h ---- libs/libtuxtxt_orig/tuxtxt_common.h 2009-01-29 21:19:23.000000000 +0100 -+++ libs/libtuxtxt/tuxtxt_common.h 2009-01-29 21:24:32.000000000 +0100 -@@ -5375,15 +5375,6 @@ - ymosaic[0], ymosaic[1], ymosaic[2], renderinfo->StartX, renderinfo->StartY, renderinfo->ascender); - #endif - -- /* get fixed screeninfo */ -- if (ioctl(renderinfo->fb, FBIOGET_FSCREENINFO, &renderinfo->fix_screeninfo) == -1) -- { -- perror("TuxTxt "); -- FTC_Manager_Done(renderinfo->manager); -- FT_Done_FreeType(renderinfo->library); -- return 0; -- } -- - /* get variable screeninfo */ - if (ioctl(renderinfo->fb, FBIOGET_VSCREENINFO, &renderinfo->var_screeninfo) == -1) - { -@@ -5393,6 +5384,12 @@ - return 0; - } - -+ /* change to PAL resolution */ -+ if (renderinfo->var_screeninfo.xres != 720) -+ { -+ renderinfo->var_screeninfo.xres_virtual = renderinfo->var_screeninfo.xres = 720; -+ renderinfo->var_screeninfo.yres_virtual = renderinfo->var_screeninfo.yres = 576; -+ } - - /* set variable screeninfo for double buffering */ - renderinfo->var_screeninfo.yres_virtual = 2*renderinfo->var_screeninfo.yres; -@@ -5407,6 +5404,15 @@ - return 0; - } - -+ /* get fixed screeninfo */ -+ if (ioctl(renderinfo->fb, FBIOGET_FSCREENINFO, &renderinfo->fix_screeninfo) == -1) -+ { -+ perror("TuxTxt "); -+ FTC_Manager_Done(renderinfo->manager); -+ FT_Done_FreeType(renderinfo->library); -+ return 0; -+ } -+ - #if TUXTXT_DEBUG - if (ioctl(fb, FBIOGET_VSCREENINFO, &renderinfo->var_screeninfo) == -1) - { diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/videodev2.patch b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/videodev2.patch deleted file mode 100644 index 5b94e96..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/videodev2.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- libs/libtuxtxt/tuxtxt_common.h.orig 2012-02-10 22:37:29.736849856 +0100 -+++ libs/libtuxtxt/tuxtxt_common.h 2012-02-10 22:38:01.344849000 +0100 -@@ -25,7 +25,7 @@ - #include - #else - #include --#include -+#include - #endif - - const char *ObjectSource[] = diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp.bb b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp.bb deleted file mode 100644 index 891abc7..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp.bb +++ /dev/null @@ -1,32 +0,0 @@ -SUMMARY = "tuxbox tuxtxt for 32bit framebuffer" -LICENSE = "Proprietary" -LIC_FILES_CHKSUM = "file://tuxtxt.c;endline=19;md5=4f3fd30feb71f556493f38c7a8b3ca4d" -DEPENDS = "freetype tuxbox-libtuxtxt" -RDEPENDS_${PN} = "enigma2" -SRCDATE = "20090130" -PV = "0.0+cvs${SRCDATE}" -PR = "r5" - -SRC_URI = "cvs://anoncvs@cvs.tuxbox.org/cvs/tuxbox;module=apps/tuxbox/plugins/tuxtxt;method=ext \ - file://makefiles.diff \ - file://nonblocking.diff \ - file://32bpp.diff \ - file://add_new_default_conf.diff \ - file://add_advanced_rc.diff \ - file://allow_different_demux.diff \ - file://plugin.py \ - file://tuxtxt_vuplus.patch;patch=1;pnum=1 \ -" - -S = "${WORKDIR}/tuxtxt" - -inherit autotools - -do_configure_prepend() { - touch ${S}/python/__init__.py - install -m 0644 ${WORKDIR}/plugin.py ${S}/python -} - -FILES_${PN} += "${datadir}/fonts/tuxtxt.otb ${libdir}/enigma2 /etc/tuxtxt" - -CPPFLAGS += "-DHAVE_DREAMBOX_HARDWARE -DDREAMBOX -I${STAGING_INCDIR}/tuxbox/tuxtxt" diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff deleted file mode 100644 index 76bbebd..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff +++ /dev/null @@ -1,388 +0,0 @@ -diff -u tuxtxt_orig/tuxtxt.c tuxtxt/tuxtxt.c ---- tuxtxt_orig/tuxtxt.c 2009-01-29 21:36:31.000000000 +0100 -+++ tuxtxt/tuxtxt.c 2009-01-29 21:38:42.000000000 +0100 -@@ -7,12 +7,43 @@ - * and DBLuelle * - * russian and arabic support by Leonid Protasov * - * * -+ * ported 2006 to Dreambox 7025 / 32Bit framebuffer * -+ * by Seddi * -+ * * -+ * ported 32Bit framebuffer to Tuxtxt v1.99 (2008) * -+ * by the PLi team (Sat-Turner) * -+ * * -+ * ported to 20090130 * -+ * by the PLi team (pieterg) * -+ * * - ******************************************************************************/ - - - - #include "tuxtxt.h" - -+static char saved_wss[32]; -+static char saved_pin8[32]; -+ -+void readproc(const char* source, char *dest) -+{ -+ FILE *f=fopen(source, "rt"); -+ if(f) -+ { -+ fgets(dest, 255, f); -+ fclose(f); -+ } -+} -+ -+void writeproc(const char* dest, const char *value) -+{ -+ FILE *f=fopen(dest, "w"); -+ if (f) -+ { -+ fwrite(value, strlen(value), 1, f); -+ fclose(f); -+ } -+} - - int getIndexOfPageInHotlist() - { -@@ -137,10 +168,11 @@ - * plugin_exec * - ******************************************************************************/ - --void plugin_exec(PluginParam *par) -+int main(int argc, char **argv) - { - char cvs_revision[] = "$Revision: 1.108 $"; - -+ int cnt=0; - #if !TUXTXT_CFG_STANDALONE - int initialized = tuxtxt_init(); - if ( initialized ) -@@ -150,31 +182,71 @@ - /* show versioninfo */ - sscanf(cvs_revision, "%*s %s", versioninfo); - printf("TuxTxt %s\n", versioninfo); -+ printf("for 32bpp framebuffer\n"); - - tuxtxt_SetRenderingDefaults(&renderinfo); - /* get params */ - tuxtxt_cache.vtxtpid = renderinfo.fb = lcd = rc = renderinfo.sx = renderinfo.ex = renderinfo.sy = renderinfo.ey = -1; -+ if (argc==1) -+ { -+ printf("\nUSAGE: tuxtxt vtpid\n"); -+ printf("No PID given, so scanning for PIDs ...\n\n"); -+ tuxtxt_cache.vtxtpid=0; -+ } -+ else -+ { -+ tuxtxt_cache.vtxtpid = atoi(argv[1]); -+ } -+ -+ /* open Framebuffer */ -+ if ((renderinfo.fb=open("/dev/fb0", O_RDWR)) == -1) -+ { -+ perror("TuxTxt "); -+ return 0; -+ } -+ rc=-1; -+ while(1) -+ { -+ struct stat s; -+ char tmp[128]; -+ sprintf(tmp, "/dev/input/event%d", cnt); -+ if (stat(tmp, &s)) -+ break; -+ /* open Remote Control */ -+ if ((rc=open(tmp, O_RDONLY)) == -1) -+ { -+ perror("TuxTxt "); -+ return 0; -+ } -+ if (ioctl(rc, EVIOCGNAME(128), tmp) < 0) -+ perror("EVIOCGNAME failed"); -+ if (strstr(tmp, "remote control")) -+ break; -+ close(rc); -+ rc=-1; -+ ++cnt; -+ } -+ -+ if (rc == -1) -+ { -+ printf("couldnt find correct input device!!!\n"); -+ return -1; -+ } - -- for (; par; par = par->next) -+ /* open LCD */ -+ if ((lcd=open("/dev/dbox/lcd0", O_RDWR)) == -1) - { -- if (!strcmp(par->id, P_ID_VTXTPID)) -- tuxtxt_cache.vtxtpid = atoi(par->val); -- else if (!strcmp(par->id, P_ID_FBUFFER)) -- renderinfo.fb = atoi(par->val); -- else if (!strcmp(par->id, P_ID_LCD)) -- lcd = atoi(par->val); -- else if (!strcmp(par->id, P_ID_RCINPUT)) -- rc = atoi(par->val); -- else if (!strcmp(par->id, P_ID_OFF_X)) -- renderinfo.sx = atoi(par->val); -- else if (!strcmp(par->id, P_ID_END_X)) -- renderinfo.ex = atoi(par->val); -- else if (!strcmp(par->id, P_ID_OFF_Y)) -- renderinfo.sy = atoi(par->val); -- else if (!strcmp(par->id, P_ID_END_Y)) -- renderinfo.ey = atoi(par->val); -+ perror("TuxTxt "); -+ return 0; - } - -+ renderinfo.previousbackcolor = tuxtxt_color_transp; -+ renderinfo.zoommode = 0; -+ renderinfo.sx = 80; -+ renderinfo.ex = 620; -+ renderinfo.sy = 30; -+ renderinfo.ey = 555; -+ - if (tuxtxt_cache.vtxtpid == -1 || renderinfo.fb == -1 || rc == -1 || renderinfo.sx == -1 || renderinfo.ex == -1 || renderinfo.sy == -1 || renderinfo.ey == -1) - { - printf("TuxTxt \n"); -@@ -242,6 +314,7 @@ - int vendor = 3; /* values unknown, rely on requested values */ - #endif - -+#if 0 - if (vendor < 3) /* scart-parameters only known for 3 dboxes, FIXME: order must be like in info.h */ - { - for (i = 0; i < 6; i++) /* FIXME: FBLK seems to cause troubles */ -@@ -274,6 +347,7 @@ - perror("TuxTxt "); - } - } -+#endif - continue; /* otherwise ignore exit key */ - } - default: -@@ -487,6 +561,14 @@ - dumpl25 = ival & 1; - else if (1 == sscanf(line, "UseTTF %i", &ival)) - renderinfo.usettf = ival & 1; -+ else if (1 == sscanf(line, "StartX %i", &ival)) -+ renderinfo.sx = ival; -+ else if (1 == sscanf(line, "EndX %i", &ival)) -+ renderinfo.ex = ival; -+ else if (1 == sscanf(line, "StartY %i", &ival)) -+ renderinfo.sy = ival; -+ else if (1 == sscanf(line, "EndY %i", &ival)) -+ renderinfo.ey = ival; - } - fclose(conf); - } -@@ -534,6 +616,12 @@ - #endif - - -+ readproc("/proc/stb/denc/0/wss", saved_wss); -+ writeproc("/proc/stb/denc/0/wss", saamodes[renderinfo.screen_mode1]); -+ -+ readproc("/proc/stb/avs/0/sb", saved_pin8); -+ writeproc("/proc/stb/avs/0/sb", fncmodes[renderinfo.screen_mode1]); -+ - /* setup rc */ - ioctl(rc, RC_IOCTL_BCODES, 1); - -@@ -568,8 +656,6 @@ - if (tuxtxt_cache.dmx != -1) - close(tuxtxt_cache.dmx); - tuxtxt_cache.dmx = -1; --#else -- tuxtxt_stop(); - #endif - - if (restoreaudio) -@@ -579,6 +665,7 @@ - #else - int vendor = 3; /* values unknown, rely on requested values */ - #endif -+#if 0 - if (vendor < 3) /* scart-parameters only known for 3 dboxes, FIXME: order must be like in info.h */ - { - for (i = 1; i < 6; i += 2) /* restore dvb audio */ -@@ -588,9 +675,17 @@ - perror("TuxTxt "); - } - } -+#endif - } - -+ /* close lcd */ -+ close(lcd); -+ -+ /* close rc */ -+ close(rc); - -+ lcd = rc = -1; -+ - if (hotlistchanged) - savehotlist(); - -@@ -623,10 +718,20 @@ - fprintf(conf, "ShowLevel2p5 %d\n", renderinfo.showl25); - fprintf(conf, "DumpLevel2p5 %d\n", dumpl25); - fprintf(conf, "UseTTF %d\n", renderinfo.usettf); -+ fprintf(conf, "StartX %d\n", renderinfo.sx); -+ fprintf(conf, "EndX %d\n", renderinfo.ex); -+ fprintf(conf, "StartY %d\n", renderinfo.sy); -+ fprintf(conf, "EndY %d\n", renderinfo.ey); - fclose(conf); - } - } - tuxtxt_EndRendering(&renderinfo); -+ -+ /* close framebuffer */ -+ close(renderinfo.fb); -+ -+ writeproc("/proc/stb/avs/0/sb", saved_pin8); -+ writeproc("/proc/stb/denc/0/wss", saved_wss); - } - /****************************************************************************** - * GetTeletextPIDs * -@@ -1308,6 +1413,7 @@ - memset(&menu[Menu_Width*MenuLine[M_COL] + 3+renderinfo.color_mode ], 0x20,24-renderinfo.color_mode); - Menu_HighlightLine(menu, MenuLine[menuitem], 1); - tuxtxt_setcolors(&renderinfo,(unsigned short *)tuxtxt_defaultcolors, 0, tuxtxt_color_SIZECOLTABLE); -+ Menu_Init(menu, current_pid, menuitem, hotindex); - break; - case M_TRA: - saveconfig = 1; -@@ -1319,6 +1425,7 @@ - memset(&menu[Menu_Width*MenuLine[M_TRA] + 3+renderinfo.trans_mode ], 0x20,24-renderinfo.trans_mode); - Menu_HighlightLine(menu, MenuLine[menuitem], 1); - tuxtxt_setcolors(&renderinfo,(unsigned short *)tuxtxt_defaultcolors, 0, tuxtxt_color_SIZECOLTABLE); -+ Menu_Init(menu, current_pid, menuitem, hotindex); - break; - case M_PID: - { -@@ -1421,6 +1528,7 @@ - memset(&menu[Menu_Width*MenuLine[M_COL] + 3+renderinfo.color_mode ], 0x20,24-renderinfo.color_mode); - Menu_HighlightLine(menu, MenuLine[menuitem], 1); - tuxtxt_setcolors(&renderinfo,(unsigned short *)tuxtxt_defaultcolors, 0, tuxtxt_color_SIZECOLTABLE); -+ Menu_Init(menu, current_pid, menuitem, hotindex); - break; - case M_TRA: - saveconfig = 1; -@@ -1432,6 +1540,7 @@ - memset(&menu[Menu_Width*MenuLine[M_TRA] + 3+renderinfo.trans_mode ], 0x20,24-renderinfo.trans_mode); - Menu_HighlightLine(menu, MenuLine[menuitem], 1); - tuxtxt_setcolors(&renderinfo,(unsigned short *)tuxtxt_defaultcolors, 0, tuxtxt_color_SIZECOLTABLE); -+ Menu_Init(menu, current_pid, menuitem, hotindex); - break; - case M_PID: - if (!getpidsdone) -@@ -1731,8 +1840,8 @@ - memcpy(&menu[Menu_Width*MenuLine[M_SC1] + Menu_Width - 5], &configonoff[menulanguage][renderinfo.screen_mode1 ? 3 : 0], 3); - Menu_HighlightLine(menu, MenuLine[menuitem], 1); - -- ioctl(renderinfo.avs, AVSIOSSCARTPIN8, &fncmodes[renderinfo.screen_mode1]); -- ioctl(renderinfo.saa, SAAIOSWSS, &saamodes[renderinfo.screen_mode1]); -+ writeproc("/proc/stb/avs/0/sb", fncmodes[renderinfo.screen_mode1]); -+ writeproc("/proc/stb/denc/0/wss", saamodes[renderinfo.screen_mode1]); - - break; - -@@ -1857,7 +1966,8 @@ - } - - /* generate pagenumber */ -- temp_page |= Number << renderinfo.inputcounter*4; -+ if (renderinfo.inputcounter >= 0) -+ temp_page |= Number << renderinfo.inputcounter*4; - - renderinfo.inputcounter--; - -@@ -2318,8 +2428,8 @@ - else if (renderinfo.transpmode == 1) /* semi-transparent BG with FG text */ - { - /* restore videoformat */ -- ioctl(renderinfo.avs, AVSIOSSCARTPIN8, &renderinfo.fnc_old); -- ioctl(renderinfo.saa, SAAIOSWSS, &renderinfo.saa_old); -+ writeproc("/proc/stb/avs/0/sb", saved_pin8); -+ writeproc("/proc/stb/denc/0/wss", saved_wss); - - tuxtxt_ClearBB(&renderinfo,tuxtxt_color_transp); - tuxtxt_cache.pageupdate = 1; -@@ -2327,8 +2437,8 @@ - else /* TV mode */ - { - /* restore videoformat */ -- ioctl(renderinfo.avs, AVSIOSSCARTPIN8, &renderinfo.fnc_old); -- ioctl(renderinfo.saa, SAAIOSWSS, &renderinfo.saa_old); -+ writeproc("/proc/stb/avs/0/sb", saved_pin8); -+ writeproc("/proc/stb/denc/0/wss", saved_wss); - - tuxtxt_ClearFB(&renderinfo,tuxtxt_color_transp); - renderinfo.clearbbcolor = tuxtxt_cache.FullScrColor; -@@ -2765,8 +2875,8 @@ - case KEY_VOLUMEDOWN: RCCode = RC_MINUS; break; - case KEY_MUTE: RCCode = RC_MUTE; break; - case KEY_HELP: RCCode = RC_HELP; break; -- case KEY_SETUP: RCCode = RC_DBOX; break; -- case KEY_HOME: RCCode = RC_HOME; break; -+ case KEY_MENU: RCCode = RC_DBOX; break; -+ case KEY_EXIT: RCCode = RC_HOME; break; - case KEY_POWER: RCCode = RC_STANDBY; break; - } - return 1; -@@ -2794,10 +2904,3 @@ - - return 0; - } --/* Local Variables: */ --/* indent-tabs-mode:t */ --/* tab-width:3 */ --/* c-basic-offset:3 */ --/* comment-column:0 */ --/* fill-column:120 */ --/* End: */ -diff -u tuxtxt_orig/tuxtxt.h tuxtxt/tuxtxt.h ---- tuxtxt_orig/tuxtxt.h 2008-12-26 19:41:28.000000000 +0100 -+++ tuxtxt/tuxtxt.h 2009-01-29 21:38:18.000000000 +0100 -@@ -1,3 +1,6 @@ -+#ifndef __tuxtxt_h__ -+#define __tuxtxt_h__ -+ - /****************************************************************************** - * <<< TuxTxt - Teletext Plugin >>> * - * * -@@ -7,7 +10,16 @@ - * and DBLuelle * - * russian and arabic support by Leonid Protasov * - * * -- ******************************************************************************/ -+ * ported 2006 to Dreambox 7025 / 32Bit framebuffer * -+ * by Seddi * -+ * * -+ * ported 32Bit framebuffer to Tuxtxt v1.99 (2008) * -+ * by the PLi team (Sat-Turner) * -+ * * -+ * ported to 1.106 (2008) * -+ * by the PLi team (pieterg) * -+ * * -+******************************************************************************/ - - #define TUXTXT_CFG_STANDALONE 0 // 1:plugin only 0:use library - #define TUXTXT_DEBUG 0 -@@ -37,7 +49,6 @@ - #include - - #include --#include - #include - - -@@ -1091,3 +1102,5 @@ - /* comment-column:0 */ - /* fill-column:120 */ - /* End: */ -+ -+#endif diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_advanced_rc.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_advanced_rc.diff deleted file mode 100644 index 1ebef99..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_advanced_rc.diff +++ /dev/null @@ -1,161 +0,0 @@ -diff -u tuxtxt_orig/tuxtxt.c tuxtxt/tuxtxt.c ---- tuxtxt_orig/tuxtxt.c 2009-01-29 21:38:42.000000000 +0100 -+++ tuxtxt/tuxtxt.c 2009-01-29 21:44:29.000000000 +0100 -@@ -173,6 +173,7 @@ - char cvs_revision[] = "$Revision: 1.108 $"; - - int cnt=0; -+ int rc_num = 0; - #if !TUXTXT_CFG_STANDALONE - int initialized = tuxtxt_init(); - if ( initialized ) -@@ -186,7 +187,7 @@ - - tuxtxt_SetRenderingDefaults(&renderinfo); - /* get params */ -- tuxtxt_cache.vtxtpid = renderinfo.fb = lcd = rc = renderinfo.sx = renderinfo.ex = renderinfo.sy = renderinfo.ey = -1; -+ tuxtxt_cache.vtxtpid = renderinfo.fb = lcd = renderinfo.sx = renderinfo.ex = renderinfo.sy = renderinfo.ey = -1; - if (argc==1) - { - printf("\nUSAGE: tuxtxt vtpid\n"); -@@ -204,8 +205,8 @@ - perror("TuxTxt "); - return 0; - } -- rc=-1; -- while(1) -+ rc[0] = rc[1] =-1; -+ while(rc_num < 2) - { - struct stat s; - char tmp[128]; -@@ -213,23 +214,26 @@ - if (stat(tmp, &s)) - break; - /* open Remote Control */ -- if ((rc=open(tmp, O_RDONLY)) == -1) -+ if ((rc[rc_num]=open(tmp, O_RDONLY)) == -1) - { - perror("TuxTxt "); - return 0; - } -- if (ioctl(rc, EVIOCGNAME(128), tmp) < 0) -+ if (ioctl(rc[rc_num], EVIOCGNAME(128), tmp) < 0) - perror("EVIOCGNAME failed"); -- if (strstr(tmp, "remote control")) -- break; -- close(rc); -- rc=-1; -+ if (!strstr(tmp, "remote control")) -+ { -+ close(rc[rc_num]); -+ rc[rc_num] = -1; -+ } -+ else -+ ++rc_num; - ++cnt; - } - -- if (rc == -1) -+ if (rc[0] == -1) - { -- printf("couldnt find correct input device!!!\n"); -+ printf("couldnt find usable input device!!!\n"); - return -1; - } - -@@ -247,7 +251,7 @@ - renderinfo.sy = 30; - renderinfo.ey = 555; - -- if (tuxtxt_cache.vtxtpid == -1 || renderinfo.fb == -1 || rc == -1 || renderinfo.sx == -1 || renderinfo.ex == -1 || renderinfo.sy == -1 || renderinfo.ey == -1) -+ if (tuxtxt_cache.vtxtpid == -1 || renderinfo.fb == -1 || renderinfo.sx == -1 || renderinfo.ex == -1 || renderinfo.sy == -1 || renderinfo.ey == -1) - { - printf("TuxTxt \n"); - return; -@@ -623,7 +627,8 @@ - writeproc("/proc/stb/avs/0/sb", fncmodes[renderinfo.screen_mode1]); - - /* setup rc */ -- ioctl(rc, RC_IOCTL_BCODES, 1); -+ if (rc[0] >= 0) ioctl(rc[0], RC_IOCTL_BCODES, 1); -+ if (rc[1] >= 0) ioctl(rc[1], RC_IOCTL_BCODES, 1); - - - -@@ -682,9 +687,12 @@ - close(lcd); - - /* close rc */ -- close(rc); -+ if (rc[0] >= 0) -+ close(rc[0]); -+ if (rc[1] >= 0) -+ close(rc[1]); - -- lcd = rc = -1; -+ lcd = rc[0] = rc[1] = -1; - - if (hotlistchanged) - savehotlist(); -@@ -2819,20 +2827,28 @@ - timeout.tv_sec = 0; - timeout.tv_usec = 100000; - /* get code */ -- if (rc >= 0) -+ if (rc[0] >= 0) -+ { -+ FD_SET(rc[0], &rset); -+ if (rc[0] > maxfd) -+ { -+ maxfd = rc[0]; -+ } -+ } -+ if (rc[1] >= 0) - { -- FD_SET(rc, &rset); -- if (rc > maxfd) -+ FD_SET(rc[1], &rset); -+ if (rc[1] > maxfd) - { -- maxfd = rc; -+ maxfd = rc[1]; - } - } - if (select(maxfd + 1, &rset, NULL, NULL, &timeout) > 0) - { -- if (rc >= 0 && FD_ISSET(rc, &rset)) -+ if (rc[0] >= 0 && FD_ISSET(rc[0], &rset)) - { - #if HAVE_DVB_API_VERSION < 3 -- read(rc, &RCCode, 2); -+ read(rc[0], &RCCode, 2); - } - if (RCCode != LastKey) - { -@@ -2842,7 +2858,11 @@ - { - switch (RCCode) - #else -- read(rc, &ev, sizeof(ev)); -+ read(rc[0], &ev, sizeof(ev)); -+ } -+ else if (rc[1] >= 0 && FD_ISSET(rc[1], &rset)) -+ { -+ read(rc[1], &ev, sizeof(ev)); - } - if (ev.value) - { -Only in tuxtxt_orig/: tuxtxt.c.orig -diff -u tuxtxt_orig/tuxtxt.h tuxtxt/tuxtxt.h ---- tuxtxt_orig/tuxtxt.h 2009-01-29 21:38:18.000000000 +0100 -+++ tuxtxt/tuxtxt.h 2009-01-29 21:44:29.000000000 +0100 -@@ -209,7 +209,7 @@ - int hotlist[10]; - int maxhotlist; - --int rc, lcd; -+int rc[2], lcd; - int lastpage; - int savedscreenmode; - char dumpl25; diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_new_default_conf.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_new_default_conf.diff deleted file mode 100644 index 3cb476d..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_new_default_conf.diff +++ /dev/null @@ -1,36 +0,0 @@ -diff -Naur tuxtxt_org/tuxtxt2.conf tuxtxt_32bpp/tuxtxt2.conf ---- tuxtxt/tuxtxt2.conf 1970-01-01 01:00:00.000000000 +0100 -+++ tuxtxt/tuxtxt2.conf 2006-03-10 22:07:15.000000000 +0100 -@@ -0,0 +1,23 @@ -+ScreenMode16x9Normal 1 -+ScreenMode16x9Divided 1 -+Brightness 16 -+MenuLanguage 1 -+AutoNational 1 -+NationalSubset 5 -+SwapUpDown 0 -+ShowHexPages 0 -+Transparency 0xA -+TTFWidthFactor16 28 -+TTFHeightFactor16 16 -+TTFShiftX 0 -+TTFShiftY 0 -+Screenmode 0 -+ShowFLOF 1 -+Show39 1 -+ShowLevel2p5 1 -+DumpLevel2p5 0 -+UseTTF 0 -+StartX 50 -+EndX 670 -+StartY 30 -+EndY 555 -diff -Naur tuxtxt_org/tuxtxt.conf tuxtxt_32bpp/tuxtxt.conf ---- tuxtxt/tuxtxt.conf 2006-03-10 22:13:26.000000000 +0100 -+++ tuxtxt/tuxtxt.conf 1970-01-01 01:00:00.000000000 +0100 -@@ -1,5 +0,0 @@ --ScreenMode16x9Normal 0 --ScreenMode16x9Divided 0 --ColorDimmed 1 --AutoNational 1 --NationalSubset 4 diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/allow_different_demux.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/allow_different_demux.diff deleted file mode 100644 index b2881f7..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/allow_different_demux.diff +++ /dev/null @@ -1,77 +0,0 @@ ---- tuxtxt-org/tuxtxt.c 2010-02-10 20:48:39.000000000 +0100 -+++ tuxtxt/tuxtxt.c 2010-02-10 20:52:39.000000000 +0100 -@@ -172,6 +172,7 @@ - { - char cvs_revision[] = "$Revision: 1.108 $"; - -+ int demux = 0; - int cnt=0; - int rc_num = 0; - #if !TUXTXT_CFG_STANDALONE -@@ -187,18 +188,31 @@ - - tuxtxt_SetRenderingDefaults(&renderinfo); - /* get params */ -- tuxtxt_cache.vtxtpid = renderinfo.fb = lcd = renderinfo.sx = renderinfo.ex = renderinfo.sy = renderinfo.ey = -1; -+ tuxtxt_cache.vtxtpid = 0; -+ renderinfo.fb = lcd = renderinfo.sx = renderinfo.ex = renderinfo.sy = renderinfo.ey = -1; - if (argc==1) - { -- printf("\nUSAGE: tuxtxt vtpid\n"); -- printf("No PID given, so scanning for PIDs ...\n\n"); -- tuxtxt_cache.vtxtpid=0; -+ printf("\nUSAGE: tuxtxt [demux] [vtpid]\n"); -+ printf("No Demux and PID given, so using demux0 and scanning for PIDs ...\n\n"); - } -- else -+ else - { -- tuxtxt_cache.vtxtpid = atoi(argv[1]); -+ demux = atoi(argv[1]); -+ if (argc > 2) -+ tuxtxt_cache.vtxtpid = atoi(argv[2]); -+ else -+ { -+ printf("\nUSAGE: tuxtxt [demux] [vtpid]\n"); -+ printf("No PID given, so scanning for PIDs ...\n\n"); -+ } - } - -+#if HAVE_DVB_API_VERSION < 3 -+ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/card0/demux%d", demux); -+#else -+ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/adapter0/demux%d", demux); -+#endif -+ - /* open Framebuffer */ - if ((renderinfo.fb=open("/dev/fb/0", O_RDWR)) == -1) - { -@@ -616,7 +630,7 @@ - tuxtxt_init_demuxer(); - tuxtxt_start_thread(); - #else -- tuxtxt_start(tuxtxt_cache.vtxtpid); -+ tuxtxt_start(tuxtxt_cache.vtxtpid, -1); - #endif - - -@@ -1821,7 +1835,7 @@ - tuxtxt_cache.vtxtpid = pid_table[current_pid].vtxt_pid; - tuxtxt_start_thread(); - #else -- tuxtxt_start(pid_table[current_pid].vtxt_pid); -+ tuxtxt_start(pid_table[current_pid].vtxt_pid, -1); - #endif - } - // tuxtxt_cache.pageupdate = 1; ---- tuxtxt-org/tuxtxt.h 2010-02-10 20:48:39.000000000 +0100 -+++ tuxtxt/tuxtxt.h 2010-02-10 20:49:07.000000000 +0100 -@@ -63,7 +63,7 @@ - extern tstPageAttr tuxtxt_atrtable[]; - extern int tuxtxt_init(); - extern void tuxtxt_close(); --extern int tuxtxt_start(int tpid); // Start caching -+extern int tuxtxt_start(int tpid, int demux); // Start caching - extern int tuxtxt_stop(); // Stop caching - extern void tuxtxt_next_dec(int *i); /* skip to next decimal */ - extern void tuxtxt_prev_dec(int *i); /* counting down */ diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff deleted file mode 100644 index da3b517..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff +++ /dev/null @@ -1,548 +0,0 @@ -diff -Naur tuxtxt_org/AUTHORS tuxtxt/AUTHORS ---- tuxtxt_org/AUTHORS 1970-01-01 01:00:00.000000000 +0100 -+++ tuxtxt/AUTHORS 2006-12-28 12:08:57.000000000 +0100 -@@ -0,0 +1,25 @@ -+In order of appearance in cvs: -+------------------------------------------------ -+Felix Domke -+Andreas Oberritter -+Steffen Hehn -+Andreas Monzner -+Florian Roks -+Ronny Strutz -+Bastian Blank -+Henning Heinold -+Rainer Scherg -+Steffen Buehl -+Wolfram Joost -+Thomas Herold -+Stefan Pluecken -+Florian Schirmer -+Christoph Ketzler -+Bernhard Roth -+Roland Meier -+DBLuelle -+ -+ -+Also many thanks to everyone who supported development -+without having cvs write access -+ -diff -Naur tuxtxt_org/Makefile.am tuxtxt/Makefile.am ---- tuxtxt_org/Makefile.am 2006-12-28 12:10:01.000000000 +0100 -+++ tuxtxt/Makefile.am 2006-12-28 12:10:27.000000000 +0100 -@@ -1,37 +1,18 @@ --SUBDIRS = font -+installdir = $(CONFIGDIR)/tuxtxt - --if BOXTYPE_DREAMBOX --AM_CPPFLAGS = \ -- @FREETYPE_CFLAGS@ \ -- -I$(top_srcdir)/include \ -- -I$(includedir)/tuxbox/tuxtxt -+SUBDIRS = font python - --tuxtxt_la_LIBADD = \ -- @FREETYPE_LIBS@ \ -- @TUXTXT_LIBS@ --else - AM_CPPFLAGS = \ -- @TUXBOX_CFLAGS@ \ - @FREETYPE_CFLAGS@ \ -+ -funsigned-char \ - -I$(top_srcdir)/include \ -- -I$(includedir)/tuxbox/tuxtxt -+ -I$(prefix)/$(includedir)/tuxbox/tuxtxt - --tuxtxt_la_LIBADD = \ -- @TUXBOX_LIBS@ \ -+bin_PROGRAMS = tuxtxt -+tuxtxt_LDADD = -lpthread -lz \ - @FREETYPE_LIBS@ \ -- @TUXTXT_LIBS@ --endif -- --noinst_LTLIBRARIES = tuxtxt.la -- --tuxtxt_la_SOURCES = tuxtxt.c -+ @TUXTXT_LIBS@ - --tuxtxt_la_LDFLAGS = -rpath $(PLUGINDIR) -module -avoid-version -+tuxtxt_SOURCES = tuxtxt.c - --install-exec-local: -- install -d $(DESTDIR)$(PLUGINDIR) -- install -d $(DESTDIR)$(CONFIGDIR) -- install -d $(DESTDIR)$(CONFIGDIR)/tuxtxt -- $(LIBTOOL) --mode=install install tuxtxt.la $(DESTDIR)$(PLUGINDIR) -- install -m 0644 $(srcdir)/tuxtxt.cfg $(DESTDIR)$(PLUGINDIR) -- install -m 0644 $(srcdir)/tuxtxt.conf $(DESTDIR)$(CONFIGDIR)/tuxtxt -+install_DATA = tuxtxt2.conf -diff -Naur tuxtxt_org/acinclude.m4 tuxtxt/acinclude.m4 ---- tuxtxt_org/acinclude.m4 1970-01-01 01:00:00.000000000 +0100 -+++ tuxtxt/acinclude.m4 2006-12-28 12:08:57.000000000 +0100 -@@ -0,0 +1,434 @@ -+AC_DEFUN(TUXBOX_APPS,[ -+AM_CONFIG_HEADER(config.h) -+AM_MAINTAINER_MODE -+ -+INSTALL="$INSTALL -p" -+ -+AC_GNU_SOURCE -+AC_SYS_LARGEFILE -+ -+AC_ARG_WITH(target, -+ [ --with-target=TARGET target for compilation [[native,cdk]]], -+ [TARGET="$withval"],[TARGET="native"]) -+ -+AC_ARG_WITH(targetprefix, -+ [ --with-targetprefix=PATH prefix relative to target root (only applicable in cdk mode)], -+ [targetprefix="$withval"],[targetprefix="NONE"]) -+ -+AC_ARG_WITH(debug, -+ [ --without-debug disable debugging code], -+ [DEBUG="$withval"],[DEBUG="yes"]) -+ -+if test "$DEBUG" = "yes"; then -+ DEBUG_CFLAGS="-g3 -ggdb" -+ AC_DEFINE(DEBUG,1,[Enable debug messages]) -+fi -+ -+AC_MSG_CHECKING(target) -+ -+if test "$TARGET" = "native"; then -+ AC_MSG_RESULT(native) -+ -+ if test "$CFLAGS" = "" -a "$CXXFLAGS" = ""; then -+ CFLAGS="-Wall -O2 -pipe $DEBUG_CFLAGS" -+ CXXFLAGS="-Wall -O2 -pipe $DEBUG_CFLAGS" -+ fi -+ if test "$prefix" = "NONE"; then -+ prefix=/usr/local -+ fi -+ targetprefix=$prefix -+elif test "$TARGET" = "cdk"; then -+ AC_MSG_RESULT(cdk) -+ -+ if test "$CC" = "" -a "$CXX" = ""; then -+ CC=powerpc-tuxbox-linux-gnu-gcc CXX=powerpc-tuxbox-linux-gnu-g++ -+ fi -+ if test "$CFLAGS" = "" -a "$CXXFLAGS" = ""; then -+ CFLAGS="-Wall -Os -mcpu=823 -pipe $DEBUG_CFLAGS" -+ CXXFLAGS="-Wall -Os -mcpu=823 -pipe $DEBUG_CFLAGS" -+ fi -+ if test "$prefix" = "NONE"; then -+ AC_MSG_ERROR(invalid prefix, you need to specify one in cdk mode) -+ fi -+ if test "$targetprefix" = "NONE"; then -+ targetprefix="" -+ fi -+ if test "$host_alias" = ""; then -+ cross_compiling=yes -+ host_alias=powerpc-tuxbox-linux-gnu -+ fi -+else -+ AC_MSG_RESULT(none) -+ AC_MSG_ERROR([invalid target $TARGET, choose on from native,cdk]); -+fi -+ -+AC_CANONICAL_BUILD -+AC_CANONICAL_HOST -+ -+check_path () { -+ return $(perl -e "if(\"$1\"=~m#^/usr/(local/)?bin#){print \"0\"}else{print \"1\";}") -+} -+ -+]) -+ -+AC_DEFUN(TUXBOX_APPS_DIRECTORY_ONE,[ -+AC_ARG_WITH($1,[ $6$7 [[PREFIX$4$5]]],[ -+ _$2=$withval -+ if test "$TARGET" = "cdk"; then -+ $2=`eval echo "${targetprefix}$withval"` -+ else -+ $2=$withval -+ fi -+],[ -+ $2="\${$3}$5" -+ if test "$TARGET" = "cdk"; then -+ _$2=`eval echo "${target$3}$5"` -+ else -+ _$2=`eval echo "${$3}$5"` -+ fi -+]) -+ -+dnl automake <= 1.6 don't support this -+dnl AC_SUBST($2) -+AC_DEFINE_UNQUOTED($2,"$_$2",$7) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_DIRECTORY,[ -+AC_REQUIRE([TUXBOX_APPS]) -+ -+if test "$TARGET" = "cdk"; then -+ datadir="\${prefix}/share" -+ tuxboxdatadir="\${prefix}/share/tuxbox" -+ zoneinfodir="\${datadir}/zoneinfo" -+ sysconfdir="\${prefix}/etc" -+ localstatedir="\${prefix}/var" -+ localedir="\${prefix}/var" -+ libdir="\${prefix}/lib" -+ targetdatadir="\${targetprefix}/share" -+ targetsysconfdir="\${targetprefix}/etc" -+ targetlocalstatedir="\${targetprefix}/var" -+ targetlibdir="\${targetprefix}/lib" -+fi -+ -+TUXBOX_APPS_DIRECTORY_ONE(configdir,CONFIGDIR,sysconfdir,/etc,, -+ [--with-configdir=PATH ],[where to find the config files]) -+ -+TUXBOX_APPS_DIRECTORY_ONE(datadir,DATADIR,datadir,/share,, -+ [--with-datadir=PATH ],[where to find data]) -+ -+TUXBOX_APPS_DIRECTORY_ONE(localedir,LOCALEDIR,datadir,/share,/locale, -+ [--with-localedir=PATH ],[where to find locales]) -+ -+TUXBOX_APPS_DIRECTORY_ONE(fontdir,FONTDIR,datadir,/share,/fonts, -+ [--with-fontdir=PATH ],[where to find the fonts]) -+ -+TUXBOX_APPS_DIRECTORY_ONE(gamesdir,GAMESDIR,localstatedir,/var,/tuxbox/games, -+ [--with-gamesdir=PATH ],[where games data is stored]) -+ -+TUXBOX_APPS_DIRECTORY_ONE(libdir,LIBDIR,libdir,/lib,, -+ [--with-libdir=PATH ],[where to find the internal libs]) -+ -+TUXBOX_APPS_DIRECTORY_ONE(plugindir,PLUGINDIR,libdir,/lib,/tuxbox/plugins, -+ [--with-plugindir=PATH ],[where to find the plugins]) -+ -+TUXBOX_APPS_DIRECTORY_ONE(tuxboxdatadir,TUXBOXDATADIR,datadir,/share,, -+ [--with-tuxboxdatadir=PATH],[where to find tuxbox data]) -+ -+TUXBOX_APPS_DIRECTORY_ONE(zoneinfodir,ZONEINFODIR,datadir,/share,/zoneinfo, -+ [--with-zoneinfodir=PATH ],[where to find zoneinfo db]) -+]) -+ -+dnl automake <= 1.6 needs this specifications -+AC_SUBST(CONFIGDIR) -+AC_SUBST(DATADIR) -+AC_SUBST(ZONEINFODIR) -+AC_SUBST(FONTDIR) -+AC_SUBST(GAMESDIR) -+AC_SUBST(LIBDIR) -+AC_SUBST(LOCALEDIR) -+AC_SUBST(PLUGINDIR) -+AC_SUBST(TUXBOXDATADIR) -+dnl end workaround -+ -+AC_DEFUN(TUXBOX_APPS_ENDIAN,[ -+AC_CHECK_HEADERS(endian.h) -+AC_C_BIGENDIAN -+]) -+ -+AC_DEFUN(TUXBOX_APPS_DRIVER,[ -+#AC_ARG_WITH(driver, -+# [ --with-driver=PATH path for driver sources [[NONE]]], -+# [DRIVER="$withval"],[DRIVER=""]) -+# -+#if test -d "$DRIVER/include"; then -+# AC_DEFINE(HAVE_DBOX2_DRIVER,1,[Define to 1 if you have the dbox2 driver sources]) -+#else -+# AC_MSG_ERROR([can't find driver sources]) -+#fi -+ -+#AC_SUBST(DRIVER) -+ -+#CPPFLAGS="$CPPFLAGS -I$DRIVER/include" -+]) -+ -+AC_DEFUN([TUXBOX_APPS_DVB],[ -+AC_ARG_WITH(dvbincludes, -+ [ --with-dvbincludes=PATH path for dvb includes [[NONE]]], -+ [DVBINCLUDES="$withval"],[DVBINCLUDES=""]) -+ -+if test "$DVBINCLUDES"; then -+ CPPFLAGS="$CPPFLAGS -I$DVBINCLUDES" -+fi -+ -+AC_CHECK_HEADERS(ost/dmx.h,[ -+ DVB_API_VERSION=1 -+ AC_MSG_NOTICE([found dvb version 1]) -+]) -+ -+if test -z "$DVB_API_VERSION"; then -+AC_CHECK_HEADERS(linux/dvb/version.h,[ -+ AC_LANG_PREPROC_REQUIRE() -+ AC_REQUIRE([AC_PROG_EGREP]) -+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[ -+#include -+version DVB_API_VERSION -+ ]])]) -+ DVB_API_VERSION=`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | $EGREP "^version" | sed "s,version\ ,,"` -+ rm -f conftest* -+ -+ AC_MSG_NOTICE([found dvb version $DVB_API_VERSION]) -+]) -+fi -+ -+if test "$DVB_API_VERSION"; then -+ AC_DEFINE(HAVE_DVB,1,[Define to 1 if you have the dvb includes]) -+ AC_DEFINE_UNQUOTED(HAVE_DVB_API_VERSION,$DVB_API_VERSION,[Define to the version of the dvb api]) -+else -+ AC_MSG_ERROR([can't find dvb headers]) -+fi -+]) -+ -+AC_DEFUN(_TUXBOX_APPS_LIB_CONFIG,[ -+AC_PATH_PROG($1_CONFIG,$2,no) -+if test "$$1_CONFIG" != "no"; then -+ if test "$TARGET" = "cdk" && check_path "$$1_CONFIG"; then -+ AC_MSG_$3([could not find a suitable version of $2]); -+ else -+ $1_CFLAGS=$($$1_CONFIG --cflags) -+ $1_LIBS=$($$1_CONFIG --libs) -+ fi -+fi -+ -+AC_SUBST($1_CFLAGS) -+AC_SUBST($1_LIBS) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_CONFIG,[ -+_TUXBOX_APPS_LIB_CONFIG($1,$2,ERROR) -+if test "$$1_CONFIG" = "no"; then -+ AC_MSG_ERROR([could not find $2]); -+fi -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_CHECK,[ -+_TUXBOX_APPS_LIB_CONFIG($1,$2,WARN) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_PKGCONFIG,[ -+AC_PATH_PROG(PKG_CONFIG, pkg-config,no) -+if test "$PKG_CONFIG" = "no" ; then -+ AC_MSG_ERROR([could not find pkg-config]); -+fi -+]) -+ -+AC_DEFUN(_TUXBOX_APPS_LIB_PKGCONFIG,[ -+PKG_CHECK_MODULES($1,$2) -+AC_SUBST($1_CFLAGS) -+AC_SUBST($1_LIBS) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG,[ -+_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) -+if test -z "$$1_CFLAGS" ; then -+ AC_MSG_ERROR([could not find package $2]); -+fi -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG_CHECK,[ -+_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) -+]) -+ -+AC_DEFUN(_TUXBOX_APPS_LIB_SYMBOL,[ -+AC_CHECK_LIB($2,$3,HAVE_$1="yes",HAVE_$1="no") -+if test "$HAVE_$1" = "yes"; then -+ $1_LIBS=-l$2 -+fi -+ -+AC_SUBST($1_LIBS) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_SYMBOL,[ -+_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,ERROR) -+if test "$HAVE_$1" = "no"; then -+ AC_MSG_ERROR([could not find $2]); -+fi -+]) -+ -+AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_SYMBOL,[ -+_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,WARN) -+]) -+ -+AC_DEFUN(TUXBOX_APPS_GETTEXT,[ -+AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, -+ [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && -+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], -+ :) -+AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) -+ -+AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, -+ [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && -+ (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], -+ :) -+ -+AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,[$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1],:) -+ -+AC_MSG_CHECKING([whether NLS is requested]) -+AC_ARG_ENABLE(nls, -+ [ --disable-nls do not use Native Language Support], -+ USE_NLS=$enableval, USE_NLS=yes) -+AC_MSG_RESULT($USE_NLS) -+AC_SUBST(USE_NLS) -+ -+if test "$USE_NLS" = "yes"; then -+ AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,[ -+ AC_TRY_LINK([ -+ #include -+ #ifndef __GNU_GETTEXT_SUPPORTED_REVISION -+ #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) -+ #endif -+ extern int _nl_msg_cat_cntr; -+ extern int *_nl_domain_bindings; -+ ],[ -+ bindtextdomain ("", ""); -+ return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings; -+ ], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no -+ )] -+ ) -+ -+ if test "$gt_cv_func_gnugettext_libc" = "yes"; then -+ AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) -+ gt_use_preinstalled_gnugettext=yes -+ else -+ USE_NLS=no -+ fi -+fi -+ -+if test -f "$srcdir/po/LINGUAS"; then -+ ALL_LINGUAS=$(sed -e "/^#/d" "$srcdir/po/LINGUAS") -+fi -+ -+POFILES= -+GMOFILES= -+UPDATEPOFILES= -+DUMMYPOFILES= -+for lang in $ALL_LINGUAS; do -+ POFILES="$POFILES $srcdirpre$lang.po" -+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo" -+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" -+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop" -+done -+INST_LINGUAS= -+if test -n "$ALL_LINGUAS"; then -+ for presentlang in $ALL_LINGUAS; do -+ useit=no -+ if test -n "$LINGUAS"; then -+ desiredlanguages="$LINGUAS" -+ else -+ desiredlanguages="$ALL_LINGUAS" -+ fi -+ for desiredlang in $desiredlanguages; do -+ case "$desiredlang" in -+ "$presentlang"*) useit=yes;; -+ esac -+ done -+ if test $useit = yes; then -+ INST_LINGUAS="$INST_LINGUAS $presentlang" -+ fi -+ done -+fi -+CATALOGS= -+if test -n "$INST_LINGUAS"; then -+ for lang in $INST_LINGUAS; do -+ CATALOGS="$CATALOGS $lang.gmo" -+ done -+fi -+AC_SUBST(POFILES) -+AC_SUBST(GMOFILES) -+AC_SUBST(UPDATEPOFILES) -+AC_SUBST(DUMMYPOFILES) -+AC_SUBST(CATALOGS) -+]) -+ -+dnl backward compatiblity -+AC_DEFUN([AC_GNU_SOURCE], -+[AH_VERBATIM([_GNU_SOURCE], -+[/* Enable GNU extensions on systems that have them. */ -+#ifndef _GNU_SOURCE -+# undef _GNU_SOURCE -+#endif])dnl -+AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl -+AC_BEFORE([$0], [AC_RUN_IFELSE])dnl -+AC_DEFINE([_GNU_SOURCE]) -+]) -+ -+AC_DEFUN([AC_PROG_EGREP], -+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], -+ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 -+ then ac_cv_prog_egrep='grep -E' -+ else ac_cv_prog_egrep='egrep' -+ fi]) -+ EGREP=$ac_cv_prog_egrep -+ AC_SUBST([EGREP]) -+]) -+ -+AC_DEFUN([AC_PYTHON_DEVEL],[ -+ # -+ # should allow for checking of python version here... -+ # -+ AC_REQUIRE([AM_PATH_PYTHON]) -+ -+ # Check for Python include path -+ AC_MSG_CHECKING([for Python include path]) -+ python_path=`echo $PYTHON | sed "s,/bin.*$,,"` -+ for i in "$python_path/include/python$PYTHON_VERSION/" "$python_path/include/python/" "$python_path/" ; do -+ python_path=`find $i -type f -name Python.h -print | sed "1q"` -+ if test -n "$python_path" ; then -+ break -+ fi -+ done -+ python_path=`echo $python_path | sed "s,/Python.h$,,"` -+ AC_MSG_RESULT([$python_path]) -+ if test -z "$python_path" ; then -+ AC_MSG_ERROR([cannot find Python include path]) -+ fi -+ AC_SUBST([PYTHON_CPPFLAGS],[-I$python_path]) -+ -+ # Check for Python library path -+ AC_MSG_CHECKING([for Python library path]) -+ python_path=`echo $PYTHON | sed "s,/bin.*$,,"` -+ for i in "$python_path/lib/python$PYTHON_VERSION/config/" "$python_path/lib/python$PYTHON_VERSION/" "$python_path/lib/python/config/" "$python_path/lib/python/" "$python_path/" ; do -+ python_path=`find $i -type f -name libpython$PYTHON_VERSION.* -print | sed "1q"` -+ if test -n "$python_path" ; then -+ break -+ fi -+ done -+ python_path=`echo $python_path | sed "s,/libpython.*$,,"` -+ AC_MSG_RESULT([$python_path]) -+ if test -z "$python_path" ; then -+ AC_MSG_ERROR([cannot find Python library path]) -+ fi -+ AC_SUBST([PYTHON_LDFLAGS],["-L$python_path -lpython$PYTHON_VERSION"]) -+ # -+ python_site=`echo $python_path | sed "s/config/site-packages/"` -+ AC_SUBST([PYTHON_SITE_PKG],[$python_site]) -+]) -diff -Naur tuxtxt_org/configure.ac tuxtxt/configure.ac ---- tuxtxt_org/configure.ac 1970-01-01 01:00:00.000000000 +0100 -+++ tuxtxt/configure.ac 2006-12-28 12:08:58.000000000 +0100 -@@ -0,0 +1,18 @@ -+AC_INIT(tuxbox-tuxtxt-32bpp,1.96) -+AM_INIT_AUTOMAKE(tuxbox-tuxtxt-32bpp,1.96) -+ -+TUXBOX_APPS -+TUXBOX_APPS_DIRECTORY -+TUXBOX_APPS_DVB -+TUXBOX_APPS_DRIVER -+ -+# Checks for programs. -+AC_PROG_CC -+AM_PATH_PYTHON -+ -+TUXBOX_APPS_LIB_CONFIG(FREETYPE,freetype-config) -+TUXBOX_APPS_LIB_PKGCONFIG(TUXTXT,tuxbox-tuxtxt) -+ -+AC_OUTPUT(Makefile) -+AC_OUTPUT(font/Makefile) -+AC_OUTPUT(python/Makefile) -diff -Naur tuxtxt_32bpp/python/Makefile.am tuxtxt/python/Makefile.am ---- tuxtxt/python/Makefile.am 1970-01-01 01:00:00.000000000 +0100 -+++ tuxtxt/python/Makefile.am 2006-03-10 21:43:45.000000000 +0100 -@@ -0,0 +1,5 @@ -+installdir = $(LIBDIR)/enigma2/python/Plugins/Extensions/Tuxtxt -+ -+install_PYTHON = \ -+ plugin.py \ -+ __init__.py diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff deleted file mode 100644 index 6867e6c..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff +++ /dev/null @@ -1,142 +0,0 @@ -diff -u tuxtxt_orig/tuxtxt.c tuxtxt/tuxtxt.c ---- tuxtxt_orig/tuxtxt.c 2008-12-26 19:41:28.000000000 +0100 -+++ tuxtxt/tuxtxt.c 2009-01-29 21:36:31.000000000 +0100 -@@ -535,7 +535,6 @@ - - - /* setup rc */ -- fcntl(rc, F_SETFL, O_NONBLOCK); - ioctl(rc, RC_IOCTL_BCODES, 1); - - -@@ -1214,7 +1213,7 @@ - - void ConfigMenu(int Init) - { -- int val, menuitem = M_Start; -+ int menuitem = M_Start; - int current_pid = 0; - int hotindex; - int oldscreenmode; -@@ -1257,10 +1256,6 @@ - renderinfo.clearbbcolor = tuxtxt_color_black; - Menu_Init(menu, current_pid, menuitem, hotindex); - -- /* set blocking mode */ -- val = fcntl(rc, F_GETFL); -- fcntl(rc, F_SETFL, val &~ O_NONBLOCK); -- - /* loop */ - do { - if (GetRCCode() == 1) -@@ -1721,7 +1716,6 @@ - current_service = current_pid; - // RenderMessage(ShowServiceName); - -- fcntl(rc, F_SETFL, O_NONBLOCK); - RCCode = -1; - if (oldscreenmode) - tuxtxt_SwitchScreenMode(&renderinfo,oldscreenmode); /* restore divided screen */ -@@ -1792,8 +1786,6 @@ - UpdateLCD(); /* update number of cached pages */ - } while ((RCCode != RC_HOME) && (RCCode != RC_DBOX) && (RCCode != RC_MUTE)); - -- /* reset to nonblocking mode */ -- fcntl(rc, F_SETFL, O_NONBLOCK); - tuxtxt_cache.pageupdate = 1; - RCCode = -1; - if (oldscreenmode) -@@ -2013,7 +2005,7 @@ - void PageCatching() - { - int active_national_subset=tuxtxt_cache.national_subset; -- int val, byte; -+ int byte; - int oldzoommode = renderinfo.zoommode; - - renderinfo.pagecatching = 1; -@@ -2046,10 +2038,6 @@ - return; - } - -- /* set blocking mode */ -- val = fcntl(rc, F_GETFL); -- fcntl(rc, F_SETFL, val &~ O_NONBLOCK); -- - /* loop */ - do { - GetRCCode(); -@@ -2088,7 +2076,6 @@ - case RC_HOME: - case RC_HELP: - case RC_MUTE: -- fcntl(rc, F_SETFL, O_NONBLOCK); - tuxtxt_cache.pageupdate = 1; - renderinfo.pagecatching = 0; - RCCode = -1; -@@ -2112,9 +2099,6 @@ - tuxtxt_cache.subpage = subp; - else - tuxtxt_cache.subpage = 0; -- -- /* reset to nonblocking mode */ -- fcntl(rc, F_SETFL, O_NONBLOCK); - } - - /****************************************************************************** -@@ -2712,16 +2696,34 @@ - - int GetRCCode() - { -+ int maxfd = 0; -+ fd_set rset; -+ struct timeval timeout; - #if HAVE_DVB_API_VERSION < 3 - static unsigned short LastKey = -1; - #else - struct input_event ev; - static __u16 rc_last_key = KEY_RESERVED; - #endif -+ FD_ZERO(&rset); -+ timeout.tv_sec = 0; -+ timeout.tv_usec = 100000; - /* get code */ --#if HAVE_DVB_API_VERSION < 3 -- if (read(rc, &RCCode, 2) == 2) -+ if (rc >= 0) -+ { -+ FD_SET(rc, &rset); -+ if (rc > maxfd) -+ { -+ maxfd = rc; -+ } -+ } -+ if (select(maxfd + 1, &rset, NULL, NULL, &timeout) > 0) - { -+ if (rc >= 0 && FD_ISSET(rc, &rset)) -+ { -+#if HAVE_DVB_API_VERSION < 3 -+ read(rc, &RCCode, 2); -+ } - if (RCCode != LastKey) - { - LastKey = RCCode; -@@ -2730,8 +2732,8 @@ - { - switch (RCCode) - #else -- if (read(rc, &ev, sizeof(ev)) == sizeof(ev)) -- { -+ read(rc, &ev, sizeof(ev)); -+ } - if (ev.value) - { - if (ev.code != rc_last_key) -@@ -2789,7 +2791,6 @@ - } - - RCCode = -1; -- usleep(1000000/100); - - return 0; - } diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py deleted file mode 100644 index dad428b..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py +++ /dev/null @@ -1,60 +0,0 @@ -from enigma import eConsoleAppContainer, iServiceInformation, fbClass, eRCInput, eDBoxLCD, getDesktop -from Screens.Screen import Screen -from Plugins.Plugin import PluginDescriptor -from os import symlink, mkdir, remove, rmdir, path - -class ShellStarter(Screen): - skin = """ - - """ - faked_lcd = False - - def __init__(self, session, args = None): - self.skin = ShellStarter.skin - Screen.__init__(self, session) - self.container=eConsoleAppContainer() - self.container.appClosed.append(self.finished) - self.runapp() - - def runapp(self): - service = self.session.nav.getCurrentService() - info = service and service.info() - txtpid = info and "%d" %(info.getInfo(iServiceInformation.sTXTPID)) or "" - - stream = service and service.stream() - demux = stream and stream.getStreamingData() - demux = demux and demux.get("demux", -1) - demux = demux > -1 and "%d" %(demux) or "" - - eDBoxLCD.getInstance().lock() - eRCInput.getInstance().lock() - fbClass.getInstance().lock() - - self.faked_lcd = not path.exists("/dev/dbox") - if self.faked_lcd: - mkdir("/dev/dbox") - symlink("/dev/null", "/dev/dbox/lcd0") - - if self.container.execute("/usr/bin/tuxtxt " + demux + " " + txtpid): - self.finished(-1) - - def finished(self,retval): - fbClass.getInstance().unlock() - eRCInput.getInstance().unlock() - eDBoxLCD.getInstance().unlock() - - if self.faked_lcd: - remove("/dev/dbox/lcd0") - rmdir("/dev/dbox") - - #force redraw - dsk = getDesktop(0) - dsk.resize(dsk.size()) - - self.close() - -def main(session, **kwargs): - session.open(ShellStarter) - -def Plugins(**kwargs): - return PluginDescriptor(name="TuxTXT", description="Videotext", where = PluginDescriptor.WHERE_TELETEXT, fnc=main) diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch deleted file mode 100644 index 4c2a950..0000000 --- a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- tuxtxt_org/tuxtxt.c 2010-04-01 13:18:13.000000000 +0900 -+++ tuxtxt/tuxtxt.c 2010-04-01 13:21:57.000000000 +0900 -@@ -2664,7 +2664,8 @@ - static int init_lcd = 1, old_cached_pages = -1, old_page = -1, old_subpage = -1, old_subpage_max = -1, old_hintmode = -1; - int x, y, subpage_max = 0, update_lcd = 0; - -- if (lcd == -1) return; // for Dreamboxes without LCD-Display (5xxx) -+// if (lcd == -1) -+ return; // for Dreamboxes without LCD-Display (5xxx) - /* init or update lcd */ - if (init_lcd) - { diff --git a/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper.bb b/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper.bb deleted file mode 100644 index dbbf4d5..0000000 --- a/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper.bb +++ /dev/null @@ -1,23 +0,0 @@ -DESCIPTION = "helper tool to use usb dvb frontends" -MAINTAINER = "PLi team" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://${THISDIR}/${PN}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" - -PV = "1.0+git${SRCPV}" -PR = "r1" -SRC_REV = "" - -SRC_URI = "git://openpli.git.sourceforge.net/gitroot/openpli/vtuner;protocol=git;tag=${SRC_REV} \ - file://${PN}.sh " - -S = "${WORKDIR}/git" - -inherit autotools update-rc.d - -INITSCRIPT_NAME = "${PN}" -INITSCRIPT_PARAMS = "defaults" - -do_install_append() { - install -d ${D}/etc/init.d - install -m 0755 ${WORKDIR}/${PN}.sh ${D}/etc/init.d/${PN} -} diff --git a/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/GPL-2.0 b/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/GPL-2.0 deleted file mode 100644 index 7f5abbc..0000000 --- a/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/GPL-2.0 +++ /dev/null @@ -1,132 +0,0 @@ - -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. - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. - -1. You may copy and distribute verbatim copies of the Program`s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. - -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - -a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. -b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. -c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) -These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - -3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: - -a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, -b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, -c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) -The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - -If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - -4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - -5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. - -6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients` exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - -7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - -8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - -9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - -10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - -NO WARRANTY - -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - -one line to give the program`s name and an idea of what it does. -Copyright (C) yyyy name of author - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this when it starts in an interactive mode: - -Gnomovision version 69, Copyright (C) year name of author -Gnomovision comes with ABSOLUTELY NO WARRANTY; for details -type `show w`. This is free software, and you are welcome -to redistribute it under certain conditions; type `show c` -for details. -The hypothetical commands `show w` and `show c` should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w` and `show c`; they could even be mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: - -Yoyodyne, Inc., hereby disclaims all copyright -interest in the program `Gnomovision` -(which makes passes at compilers) written -by James Hacker. - -signature of Ty Coon, 1 April 1989 -Ty Coon, President of Vice -This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. - diff --git a/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/usbtunerhelper.sh b/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/usbtunerhelper.sh deleted file mode 100644 index 424cf3d..0000000 --- a/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/usbtunerhelper.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -if ! [ -x /usr/bin/usbtunerhelper ]; then - exit 0 -fi - -case "$1" in - start) - start-stop-daemon -S -x /usr/bin/usbtunerhelper - ;; - stop) - start-stop-daemon -K -x /usr/bin/usbtunerhelper - ;; - restart|reload) - $0 stop - $0 start - ;; - *) - echo "Usage: $0 {start|stop|restart}" - exit 1 - ;; -esac - -exit 0 diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/01-builddefs.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/01-builddefs.patch deleted file mode 100644 index a757d99..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/01-builddefs.patch +++ /dev/null @@ -1,18 +0,0 @@ -Author: Daniel Jacobowitz -Description: Build with tcpwrapper and SSL support. - -diff -Naurp vsftpd.orig/builddefs.h vsftpd/builddefs.h ---- vsftpd.orig/builddefs.h 2009-01-31 00:02:36.000000000 +0000 -+++ vsftpd/builddefs.h 2009-01-31 00:26:34.000000000 +0000 -@@ -1,9 +1,9 @@ - #ifndef VSF_BUILDDEFS_H - #define VSF_BUILDDEFS_H - --#undef VSF_BUILD_TCPWRAPPERS -+#define VSF_BUILD_TCPWRAPPERS 1 - #define VSF_BUILD_PAM --#undef VSF_BUILD_SSL -+#define VSF_BUILD_SSL - - #endif /* VSF_BUILDDEFS_H */ - diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/02-config.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/02-config.patch deleted file mode 100644 index 6d7965d..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/02-config.patch +++ /dev/null @@ -1,120 +0,0 @@ -Author: Daniel Jacobowitz -Description: Set default configuration. - -diff -Naurp vsftpd.orig/tunables.c vsftpd/tunables.c ---- vsftpd.orig/tunables.c 2009-07-15 22:08:27.000000000 +0200 -+++ vsftpd/tunables.c 2009-11-06 13:33:34.000000000 +0100 -@@ -246,7 +246,7 @@ tunables_load_defaults() - /* -rw------- */ - tunable_chown_upload_mode = 0600; - -- install_str_setting("/usr/share/empty", &tunable_secure_chroot_dir); -+ install_str_setting("/var/run/vsftpd/empty", &tunable_secure_chroot_dir); - install_str_setting("ftp", &tunable_ftp_username); - install_str_setting("root", &tunable_chown_username); - install_str_setting("/var/log/xferlog", &tunable_xferlog_file); -@@ -256,7 +256,7 @@ tunables_load_defaults() - install_str_setting(0, &tunable_ftpd_banner); - install_str_setting("/etc/vsftpd.banned_emails", &tunable_banned_email_file); - install_str_setting("/etc/vsftpd.chroot_list", &tunable_chroot_list_file); -- install_str_setting("ftp", &tunable_pam_service_name); -+ install_str_setting("vsftpd", &tunable_pam_service_name); - install_str_setting("ftp", &tunable_guest_username); - install_str_setting("/etc/vsftpd.user_list", &tunable_userlist_file); - install_str_setting(0, &tunable_anon_root); -diff -Naurp vsftpd.orig/vsftpd.conf vsftpd/vsftpd.conf ---- vsftpd.orig/vsftpd.conf 2009-11-06 08:41:11.000000000 +0100 -+++ vsftpd/vsftpd.conf 2009-11-06 13:35:37.000000000 +0100 -@@ -8,6 +8,17 @@ - # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's - # capabilities. - # -+# -+# Run standalone? vsftpd can run either from an inetd or as a standalone -+# daemon started from an initscript. -+listen=YES -+# -+# Run standalone with IPv6? -+# Like the listen parameter, except vsftpd will listen on an IPv6 socket -+# instead of an IPv4 one. This parameter and the listen parameter are mutually -+# exclusive. -+#listen_ipv6=YES -+# - # Allow anonymous FTP? (Beware - allowed by default if you comment this out). - anonymous_enable=YES - # -@@ -34,6 +45,12 @@ anonymous_enable=YES - # go into a certain directory. - dirmessage_enable=YES - # -+# If enabled, vsftpd will display directory listings with the time -+# in your local time zone. The default is to display GMT. The -+# times returned by the MDTM FTP command are also affected by this -+# option. -+use_localtime=YES -+# - # Activate logging of uploads/downloads. - xferlog_enable=YES - # -@@ -89,6 +106,11 @@ connect_from_port_20=YES - # (default follows) - #banned_email_file=/etc/vsftpd.banned_emails - # -+# You may restrict local users to their home directories. See the FAQ for -+# the possible risks in this before using chroot_local_user or -+# chroot_list_enable below. -+#chroot_local_user=YES -+# - # You may specify an explicit list of local users to chroot() to their home - # directory. If chroot_local_user is YES, then this list becomes a list of - # users to NOT chroot(). -@@ -103,12 +125,20 @@ connect_from_port_20=YES - # the presence of the "-R" option, so there is a strong case for enabling it. - #ls_recurse_enable=YES - # --# When "listen" directive is enabled, vsftpd runs in standalone mode and --# listens on IPv4 sockets. This directive cannot be used in conjunction --# with the listen_ipv6 directive. --listen=YES -+# Customization - # --# This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 --# sockets, you must run two copies of vsftpd with two configuration files. --# Make sure, that one of the listen options is commented !! --#listen_ipv6=YES -+# Some of vsftpd's settings don't fit the filesystem layout by -+# default. -+# -+# This option should be the name of a directory which is empty. Also, the -+# directory should not be writable by the ftp user. This directory is used -+# as a secure chroot() jail at times vsftpd does not require filesystem -+# access. -+secure_chroot_dir=/var/run/vsftpd/empty -+# -+# This string is the name of the PAM service vsftpd will use. -+pam_service_name=vsftpd -+# -+# This option specifies the location of the RSA certificate to use for SSL -+# encrypted connections. -+rsa_cert_file=/etc/ssl/private/vsftpd.pem -diff -Naurp vsftpd.orig/vsftpd.conf.5 vsftpd/vsftpd.conf.5 ---- vsftpd.orig/vsftpd.conf.5 2009-11-06 08:41:11.000000000 +0100 -+++ vsftpd/vsftpd.conf.5 2009-11-06 13:37:10.000000000 +0100 -@@ -940,7 +940,7 @@ Default: nobody - .B pam_service_name - This string is the name of the PAM service vsftpd will use. - --Default: ftp -+Default: vsftpd - .TP - .B pasv_address - Use this option to override the IP address that vsftpd will advertise in -@@ -969,7 +969,7 @@ This option should be the name of a dire - directory should not be writable by the ftp user. This directory is used - as a secure chroot() jail at times vsftpd does not require filesystem access. - --Default: /usr/share/empty -+Default: /var/run/vsftpd/empty - .TP - .B ssl_ciphers - This option can be used to select which SSL ciphers vsftpd will allow for diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/03-db-doc.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/03-db-doc.patch deleted file mode 100644 index d544ef0..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/03-db-doc.patch +++ /dev/null @@ -1,19 +0,0 @@ -Author: shaul Karl -Description: - A short explanation how to find out the right db version (Closes: #478282). - -diff -Naurp vsftpd.orig/EXAMPLE/VIRTUAL_USERS/README vsftpd/EXAMPLE/VIRTUAL_USERS/README ---- vsftpd.orig/EXAMPLE/VIRTUAL_USERS/README 2009-01-31 00:02:36.000000000 +0000 -+++ vsftpd/EXAMPLE/VIRTUAL_USERS/README 2009-01-31 01:38:11.000000000 +0000 -@@ -21,7 +21,10 @@ NOTE: Many systems have multiple version - need to use e.g. db3_load for correct operation. This is known to affect - some Debian systems. The core issue is that pam_userdb expects its login - database to be a specific db version (often db3, whereas db4 may be installed --on your system). -+on your system). You might check ahead what specific db version you'll need -+by looking at the dependcies of the pam module. Some methods to do that is to -+run ldd on the pam_userdb.so or look at the dependencies of the package with -+the pam modules. - - This will create /etc/vsftpd_login.db. Obviously, you may want to make sure - the permissions are restricted: diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/04-link-local.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/04-link-local.patch deleted file mode 100644 index 53b3735..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/04-link-local.patch +++ /dev/null @@ -1,91 +0,0 @@ -Author: Michael Stapelberg -Description: - vsftpd does not accept IPv6 scope identifier in listen_address6 - (Closes: #544993). - . - When specifying a link-local address, you need a scope identifier (tha name of - the index usually), thus you cannot use the following: - listen_address6=fe80::21f:16ff:fe06:3aab - but you have to use: - listen_address6=fe80::21f:16ff:fe06:3aab%eth0 - so that it is clear on which interface this link-local address should be used. - . - Unfortunately, vsftpd does not correctly parse the address mentioned above and - thus fails to be useful in link-local-only environments. - . - This patch fixes it. - -diff -Naurp vsftpd.orig/standalone.c vsftpd/standalone.c ---- vsftpd.orig/standalone.c 2009-10-02 14:15:18.000000000 +0200 -+++ vsftpd/standalone.c 2009-10-17 17:10:02.000000000 +0200 -@@ -7,6 +7,8 @@ - * Code to listen on the network and launch children servants. - */ - -+#include -+ - #include "standalone.h" - - #include "parseconf.h" -@@ -111,8 +113,17 @@ vsf_standalone_main(void) - else - { - struct mystr addr_str = INIT_MYSTR; -+ struct mystr scope_id = INIT_MYSTR; - const unsigned char* p_raw_addr; -+ unsigned int if_index = 0; -+ -+ /* See if we got a scope id */ - str_alloc_text(&addr_str, tunable_listen_address6); -+ str_split_char(&addr_str, &scope_id, '%'); -+ if (str_getlen(&scope_id) > 0) { -+ if_index = if_nametoindex(str_getbuf(&scope_id)); -+ str_free(&scope_id); -+ } - p_raw_addr = vsf_sysutil_parse_ipv6(&addr_str); - str_free(&addr_str); - if (!p_raw_addr) -@@ -120,6 +131,7 @@ vsf_standalone_main(void) - die2("bad listen_address6: ", tunable_listen_address6); - } - vsf_sysutil_sockaddr_set_ipv6addr(p_sockaddr, p_raw_addr); -+ vsf_sysutil_sockaddr_set_ipv6scope(p_sockaddr, if_index); - } - retval = vsf_sysutil_bind(listen_sock, p_sockaddr); - vsf_sysutil_free(p_sockaddr); -diff -Naurp vsftpd.orig/sysutil.c vsftpd/sysutil.c ---- vsftpd.orig/sysutil.c 2009-10-02 14:15:18.000000000 +0200 -+++ vsftpd/sysutil.c 2009-10-17 17:10:02.000000000 +0200 -@@ -2039,6 +2039,19 @@ vsf_sysutil_sockaddr_set_ipv6addr(struct - } - } - -+int -+vsf_sysutil_sockaddr_get_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr) -+{ -+ return p_sockptr->u.u_sockaddr_in6.sin6_scope_id; -+} -+ -+void -+vsf_sysutil_sockaddr_set_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr, -+ const int scope_id) -+{ -+ p_sockptr->u.u_sockaddr_in6.sin6_scope_id = scope_id; -+} -+ - const void* - vsf_sysutil_sockaddr_ipv6_v4(const struct vsf_sysutil_sockaddr* p_addr) - { -diff -Naurp vsftpd.orig/sysutil.h vsftpd/sysutil.h ---- vsftpd.orig/sysutil.h 2009-10-02 14:15:18.000000000 +0200 -+++ vsftpd/sysutil.h 2009-10-17 17:10:02.000000000 +0200 -@@ -228,6 +228,9 @@ void vsf_sysutil_sockaddr_set_ipv4addr(s - const unsigned char* p_raw); - void vsf_sysutil_sockaddr_set_ipv6addr(struct vsf_sysutil_sockaddr* p_sockptr, - const unsigned char* p_raw); -+void vsf_sysutil_sockaddr_set_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr, -+ const int scope_id); -+int vsf_sysutil_sockaddr_get_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr); - void vsf_sysutil_sockaddr_set_any(struct vsf_sysutil_sockaddr* p_sockaddr); - unsigned short vsf_sysutil_sockaddr_get_port( - const struct vsf_sysutil_sockaddr* p_sockptr); diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/05-whitespaces.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/05-whitespaces.patch deleted file mode 100644 index 569ce38..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/05-whitespaces.patch +++ /dev/null @@ -1,81 +0,0 @@ -Author: Jiri Skala -Description: trim white spaces from option values (Closes: #419857, #536803). - -diff -Naurp vsftpd.orig/parseconf.c vsftpd/parseconf.c ---- vsftpd.orig/parseconf.c 2009-10-02 14:15:18.000000000 +0200 -+++ vsftpd/parseconf.c 2009-10-18 11:28:31.000000000 +0200 -@@ -275,7 +275,7 @@ vsf_parseconf_load_setting(const char* p - } - else - { -- *p_curr_setting = str_strdup(&s_value_str); -+ *p_curr_setting = str_strdup_trimmed(&s_value_str); - } - return; - } -diff -Naurp vsftpd.orig/str.c vsftpd/str.c ---- vsftpd.orig/str.c 2009-10-02 14:15:18.000000000 +0200 -+++ vsftpd/str.c 2009-10-18 11:28:31.000000000 +0200 -@@ -89,6 +89,18 @@ str_strdup(const struct mystr* p_str) - return vsf_sysutil_strdup(str_getbuf(p_str)); - } - -+const char* -+str_strdup_trimmed(const struct mystr* p_str) -+{ -+ const char* p_trimmed = str_getbuf(p_str); -+ int h, t, newlen; -+ -+ for (h = 0; h < (int)str_getlen(p_str) && vsf_sysutil_isspace(p_trimmed[h]); h++) ; -+ for (t = str_getlen(p_str) - 1; t >= 0 && vsf_sysutil_isspace(p_trimmed[t]); t--) ; -+ newlen = t - h + 1; -+ return newlen ? vsf_sysutil_strndup(p_trimmed+h, (unsigned int)newlen) : 0L; -+} -+ - void - str_alloc_alt_term(struct mystr* p_str, const char* p_src, char term) - { -diff -Naurp vsftpd.orig/str.h vsftpd/str.h ---- vsftpd.orig/str.h 2009-10-02 14:15:18.000000000 +0200 -+++ vsftpd/str.h 2009-10-18 11:28:31.000000000 +0200 -@@ -31,6 +31,7 @@ void str_alloc_ulong(struct mystr* p_str - void str_alloc_filesize_t(struct mystr* p_str, filesize_t the_filesize); - void str_copy(struct mystr* p_dest, const struct mystr* p_src); - const char* str_strdup(const struct mystr* p_str); -+const char* str_strdup_trimmed(const struct mystr* p_str); - void str_empty(struct mystr* p_str); - void str_free(struct mystr* p_str); - void str_trunc(struct mystr* p_str, unsigned int trunc_len); -diff -Naurp vsftpd.orig/sysutil.c vsftpd/sysutil.c ---- vsftpd.orig/sysutil.c 2009-10-02 14:15:18.000000000 +0200 -+++ vsftpd/sysutil.c 2009-10-18 11:28:31.000000000 +0200 -@@ -1033,6 +1033,18 @@ vsf_sysutil_strdup(const char* p_str) - return strdup(p_str); - } - -+char* -+vsf_sysutil_strndup(const char* p_str, unsigned int p_len) -+{ -+ char *new = (char *)malloc(p_len+1); -+ -+ if (new == NULL) -+ return NULL; -+ -+ new[p_len]='\0'; -+ return (char *)memcpy(new, p_str, p_len); -+} -+ - void - vsf_sysutil_memclr(void* p_dest, unsigned int size) - { -diff -Naurp vsftpd.orig/sysutil.h vsftpd/sysutil.h ---- vsftpd.orig/sysutil.h 2009-10-02 14:15:18.000000000 +0200 -+++ vsftpd/sysutil.h 2009-10-18 11:28:31.000000000 +0200 -@@ -186,6 +186,7 @@ int vsf_sysutil_wait_get_exitcode( - /* Various string functions */ - unsigned int vsf_sysutil_strlen(const char* p_text); - char* vsf_sysutil_strdup(const char* p_str); -+char* vsf_sysutil_strndup(const char* p_str, unsigned int p_len); - void vsf_sysutil_memclr(void* p_dest, unsigned int size); - void vsf_sysutil_memcpy(void* p_dest, const void* p_src, - const unsigned int size); diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/06-greedy.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/06-greedy.patch deleted file mode 100644 index ff73c9c..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/06-greedy.patch +++ /dev/null @@ -1,32 +0,0 @@ -Author: Martin Nagy -Description: Fix file listing issue with wildcard (Bugzilla: #392181). - -diff -Naurp vsftpd.orig/ls.c vsftpd/ls.c ---- vsftpd.orig/ls.c 2009-10-02 14:15:18.000000000 +0200 -+++ vsftpd/ls.c 2009-10-18 11:48:29.000000000 +0200 -@@ -281,6 +281,25 @@ vsf_filename_passes_filter(const struct - { - goto out; - } -+ if (!must_match_at_current_pos) -+ { -+ struct mystr scan_fwd = INIT_MYSTR; -+ -+ str_mid_to_end(&name_remain_str, &scan_fwd, -+ indexx + str_getlen(&s_match_needed_str)); -+ /* We're allowed to be greedy, test if it match further along -+ * keep advancing indexx while we can still match. -+ */ -+ while( (locate_result = str_locate_str(&scan_fwd, &s_match_needed_str)), -+ locate_result.found ) -+ { -+ indexx += locate_result.index + str_getlen(&s_match_needed_str); -+ str_mid_to_end(&scan_fwd, &temp_str, -+ locate_result.index + str_getlen(&s_match_needed_str)); -+ str_copy(&scan_fwd, &temp_str); -+ } -+ str_free(&scan_fwd); -+ } - /* Chop matched string out of remainder */ - str_mid_to_end(&name_remain_str, &temp_str, - indexx + str_getlen(&s_match_needed_str)); diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/07-utf8.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/07-utf8.patch deleted file mode 100644 index cf03e08..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/07-utf8.patch +++ /dev/null @@ -1,58 +0,0 @@ -Author: Chuck Short -Description: Adding support for UTF8. - -diff -Naurp vsftpd.orig/features.c vsftpd/features.c ---- vsftpd.orig/features.c 2008-12-04 06:00:47.000000000 +0000 -+++ vsftpd/features.c 2010-02-25 13:28:06.000000000 +0000 -@@ -21,6 +21,10 @@ handle_feat(struct vsf_session* p_sess) - vsf_cmdio_write_raw(p_sess, " AUTH SSL\r\n"); - vsf_cmdio_write_raw(p_sess, " AUTH TLS\r\n"); - } -+ if (tunable_utf8_filesystem) -+ { -+ vsf_cmdio_write_raw(p_sess, " UTF8\r\n"); -+ } - if (tunable_port_enable) - { - vsf_cmdio_write_raw(p_sess, " EPRT\r\n"); -diff -Naurp vsftpd.orig/parseconf.c vsftpd/parseconf.c ---- vsftpd.orig/parseconf.c 2009-08-07 18:46:40.000000000 +0000 -+++ vsftpd/parseconf.c 2010-02-25 13:28:06.000000000 +0000 -@@ -28,6 +28,7 @@ static struct parseconf_bool_setting - parseconf_bool_array[] = - { - { "anonymous_enable", &tunable_anonymous_enable }, -+ { "utf8_filesystem", &tunable_utf8_filesystem }, - { "local_enable", &tunable_local_enable }, - { "pasv_enable", &tunable_pasv_enable }, - { "port_enable", &tunable_port_enable }, -diff -Naurp vsftpd.orig/tunables.c vsftpd/tunables.c ---- vsftpd.orig/tunables.c 2009-07-15 20:08:27.000000000 +0000 -+++ vsftpd/tunables.c 2010-02-25 13:28:06.000000000 +0000 -@@ -10,6 +10,7 @@ - - int tunable_anonymous_enable; - int tunable_local_enable; -+int tunable_utf8_filesystem; - int tunable_pasv_enable; - int tunable_port_enable; - int tunable_chroot_local_user; -@@ -146,6 +147,7 @@ tunables_load_defaults() - { - tunable_anonymous_enable = 1; - tunable_local_enable = 0; -+ tunable_utf8_filesystem = 0; - tunable_pasv_enable = 1; - tunable_port_enable = 1; - tunable_chroot_local_user = 0; -diff -Naurp vsftpd.orig/tunables.h vsftpd/tunables.h ---- vsftpd.orig/tunables.h 2009-07-07 01:37:28.000000000 +0000 -+++ vsftpd/tunables.h 2010-02-25 13:28:06.000000000 +0000 -@@ -11,6 +11,7 @@ void tunables_load_defaults(); - /* Booleans */ - extern int tunable_anonymous_enable; /* Allow anon logins */ - extern int tunable_local_enable; /* Allow local logins */ -+extern int tunable_utf8_filesystem; /* Server uses UTF8 Filesystem */ - extern int tunable_pasv_enable; /* Allow PASV */ - extern int tunable_port_enable; /* Allow PORT */ - extern int tunable_chroot_local_user; /* Restrict local to home dir */ diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/08-manpage.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/08-manpage.patch deleted file mode 100644 index 3a4f962..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/08-manpage.patch +++ /dev/null @@ -1,23 +0,0 @@ -Author: Daniel Baumann -Description: Fixing manpage formating. - -diff -Naurp vsftpd.orig/vsftpd.8 vsftpd/vsftpd.8 ---- vsftpd.orig/vsftpd.8 2009-07-17 20:56:23.000000000 +0000 -+++ vsftpd/vsftpd.8 2010-04-08 05:18:00.000000000 +0000 -@@ -57,4 +57,3 @@ setting and any identical setting that w - .Pa /etc/vsftpd.conf - .Sh SEE ALSO - .Xr vsftpd.conf 5 --.end -diff -Naurp vsftpd.orig/vsftpd.conf.5 vsftpd/vsftpd.conf.5 ---- vsftpd.orig/vsftpd.conf.5 2009-10-19 02:46:30.000000000 +0000 -+++ vsftpd/vsftpd.conf.5 2010-04-08 05:18:08.000000000 +0000 -@@ -404,7 +404,7 @@ reuse (which proves that they know the s - channel). Although this is a secure default, it may break many FTP clients, - so you may want to disable it. For a discussion of the consequences, see - http://scarybeastsecurity.blogspot.com/2009/02/vsftpd-210-released.html --(Added in v2.1.0). -+ (Added in v2.1.0). - - Default: YES - .TP diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/09-s390.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/09-s390.patch deleted file mode 100644 index 4711f9b..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/09-s390.patch +++ /dev/null @@ -1,15 +0,0 @@ -Author: Philipp Kern -Description: Fix vsftpd on s390 (Closes: #602726). - -diff -Naurp vsftpd.orig/sysdeputil.c vsftpd/sysdeputil.c ---- vsftpd.orig/sysdeputil.c 2011-09-05 16:03:18.728857644 +0200 -+++ vsftpd/sysdeputil.c 2011-09-05 16:05:12.909423834 +0200 -@@ -64,7 +64,7 @@ - #include - - /* BEGIN config */ --#if defined(__linux__) -+#if defined(__linux__) && !defined(__s390__) - #include - #include - #define VSF_SYSDEP_HAVE_LINUX_CLONE diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/10-remote-dos.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/10-remote-dos.patch deleted file mode 100644 index fee3ebe..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/10-remote-dos.patch +++ /dev/null @@ -1,69 +0,0 @@ -Author: Ben Hutchings -Description: Remote DoS on Linux 2.6.32 (Closes: #629373). - -diff -Naurp vsftpd.orig/sysdeputil.c vsftpd/sysdeputil.c ---- vsftpd.orig/sysdeputil.c 2010-03-26 04:25:33.000000000 +0100 -+++ vsftpd/sysdeputil.c 2011-09-05 15:16:05.347070790 +0200 -@@ -25,6 +25,11 @@ - #define _LARGEFILE64_SOURCE 1 - #endif - -+#ifdef __linux__ -+ #include -+ #include -+#endif -+ - /* For INT_MAX */ - #include - -@@ -1259,11 +1264,36 @@ vsf_set_term_if_parent_dies() - #endif - } - -+#ifdef VSF_SYSDEP_HAVE_LINUX_CLONE -+/* On Linux versions <2.6.35, netns cleanup may be so slow that -+ * creating a netns per connection allows a remote denial-of-service. -+ * We therefore do not use CLONE_NEWNET on these versions. -+ */ -+static int -+vsf_sysutil_netns_cleanup_is_fast(void) -+{ -+#ifdef __linux__ -+ struct utsname utsname; -+ int r1, r2, r3 = 0; -+ return (uname(&utsname) == 0 && -+ sscanf(utsname.release, "%d.%d.%d", &r1, &r2, &r3) >= 2 && -+ ((r1 << 16) | (r2 << 8) | r3) >= ((2 << 16) | (6 << 8) | 35)); -+#else -+ /* Assume any other kernel that has the feature don't have this problem */ -+ return 1; -+#endif -+} -+#endif -+ - int - vsf_sysutil_fork_isolate_all_failok() - { - #ifdef VSF_SYSDEP_HAVE_LINUX_CLONE -- static int cloneflags_work = 1; -+ static int cloneflags_work = -1; -+ if (cloneflags_work < 0) -+ { -+ cloneflags_work = vsf_sysutil_netns_cleanup_is_fast(); -+ } - if (cloneflags_work) - { - int ret = syscall(__NR_clone, -@@ -1309,7 +1339,11 @@ int - vsf_sysutil_fork_newnet() - { - #ifdef VSF_SYSDEP_HAVE_LINUX_CLONE -- static int cloneflags_work = 1; -+ static int cloneflags_work = -1; -+ if (cloneflags_work < 0) -+ { -+ cloneflags_work = vsf_sysutil_netns_cleanup_is_fast(); -+ } - if (cloneflags_work) - { - int ret = syscall(__NR_clone, CLONE_NEWNET | SIGCHLD, NULL); diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.conf b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.conf deleted file mode 100644 index 28ad4e0..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.conf +++ /dev/null @@ -1,105 +0,0 @@ -# Opendreambox /etc/vsftpd.conf -# -# Please see vsftpd.conf.5 for all compiled in defaults. -# -# READ THIS: This example file is NOT an exhaustive list of vsftpd options. -# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's -# capabilities. -# -# Allow anonymous FTP? (Beware - allowed by default if you comment this out). -anonymous_enable=NO -# -# Uncomment this to allow local users to log in. -local_enable=YES -# -# Uncomment this to enable any form of FTP write command. -write_enable=YES -# -# Default umask for local users is 077. You may wish to change this to 022, -# if your users expect that (022 is used by most other ftpd's) -#local_umask=022 -# -# Uncomment this to allow the anonymous FTP user to upload files. This only -# has an effect if the above global write enable is activated. Also, you will -# obviously need to create a directory writable by the FTP user. -#anon_upload_enable=YES -# -# Uncomment this if you want the anonymous FTP user to be able to create -# new directories. -#anon_mkdir_write_enable=YES -# -# Activate directory messages - messages given to remote users when they -# go into a certain directory. -dirmessage_enable=YES -# -# Activate logging of uploads/downloads. -#xferlog_enable=YES -# -# Make sure PORT transfer connections originate from port 20 (ftp-data). -connect_from_port_20=YES -# -# If you want, you can arrange for uploaded anonymous files to be owned by -# a different user. Note! Using "root" for uploaded files is not -# recommended! -#chown_uploads=YES -#chown_username=whoever -# -# You may override where the log file goes if you like. The default is shown -# below. -#xferlog_file=/var/log/vsftpd.log -# -# If you want, you can have your log file in standard ftpd xferlog format -#xferlog_std_format=YES -# -# You may change the default value for timing out an idle session. -#idle_session_timeout=600 -# -# You may change the default value for timing out a data connection. -#data_connection_timeout=120 -# -# It is recommended that you define on your system a unique user which the -# ftp server can use as a totally isolated and unprivileged user. -#nopriv_user=ftpsecure -# -# Enable this and the server will recognise asynchronous ABOR requests. Not -# recommended for security (the code is non-trivial). Not enabling it, -# however, may confuse older FTP clients. -async_abor_enable=YES -# -# By default the server will pretend to allow ASCII mode but in fact ignore -# the request. Turn on the below options to have the server actually do ASCII -# mangling on files when in ASCII mode. -# Beware that turning on ascii_download_enable enables malicious remote parties -# to consume your I/O resources, by issuing the command "SIZE /big/file" in -# ASCII mode. -# These ASCII options are split into upload and download because you may wish -# to enable ASCII uploads (to prevent uploaded scripts etc. from breaking), -# without the DoS risk of SIZE and ASCII downloads. ASCII mangling should be -# on the client anyway.. -#ascii_upload_enable=YES -#ascii_download_enable=YES -# -# You may fully customise the login banner string: -ftpd_banner=Welcome to the OpenDreambox FTP service. -# -# You may specify a file of disallowed anonymous e-mail addresses. Apparently -# useful for combatting certain DoS attacks. -#deny_email_enable=YES -# (default follows) -#banned_email_file=/etc/vsftpd.banned_emails -# -# You may specify an explicit list of local users to chroot() to their home -# directory. If chroot_local_user is YES, then this list becomes a list of -# users to NOT chroot(). -#chroot_list_enable=YES -# (default follows) -#chroot_list_file=/etc/vsftpd.chroot_list -# -# You may activate the "-R" option to the builtin ls. This is disabled by -# default to avoid remote users being able to cause excessive I/O on large -# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume -# the presence of the "-R" option, so there is a strong case for enabling it. -ls_recurse_enable=YES -# -secure_chroot_dir=/dev/shm -local_root=/ diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.socket b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.socket deleted file mode 100644 index 4505235..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.socket +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] - -[Socket] -ListenStream=21 -Accept=yes - -[Install] -WantedBy=sockets.target diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.xinetd.in b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.xinetd.in deleted file mode 100644 index 000f62a..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.xinetd.in +++ /dev/null @@ -1,7 +0,0 @@ -service ftp -{ - socket_type = stream - user = root - server = @SBINDIR@/vsftpd - wait = no -} diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd@.service b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd@.service deleted file mode 100644 index 68e89d1..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd@.service +++ /dev/null @@ -1,5 +0,0 @@ -[Unit] - -[Service] -ExecStart=-/usr/sbin/vsftpd -StandardInput=socket diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd_2.3.5.bb b/meta-openvuplus/recipes-base/vsftpd/vsftpd_2.3.5.bb deleted file mode 100644 index 5125843..0000000 --- a/meta-openvuplus/recipes-base/vsftpd/vsftpd_2.3.5.bb +++ /dev/null @@ -1,100 +0,0 @@ -SUMMARY = "lightweight, efficient FTP server written for security" -HOMEPAGE = "https://security.appspot.com/vsftpd.html" -SECTION = "console/network" -LICENSE = "GPL-2.0-with-OpenSSL-exception" -LIC_FILES_CHKSUM = "file://COPYING;md5=a6067ad950b28336613aed9dd47b1271" -DEPENDS = "libcap openssl" -DEPENDS += "${@base_contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}" -PR = "r3" - -SRC_URI = " \ - https://security.appspot.com/downloads/${BP}.tar.gz \ - file://vsftpd@.service \ - file://vsftpd.socket \ - file://vsftpd.xinetd.in \ - file://01-builddefs.patch \ - file://02-config.patch \ - file://03-db-doc.patch \ - file://04-link-local.patch \ - file://05-whitespaces.patch \ - file://06-greedy.patch \ - file://07-utf8.patch \ - file://08-manpage.patch \ - file://09-s390.patch \ - file://10-remote-dos.patch \ -" -SRC_URI[md5sum] = "01398a5bef8e85b6cf2c213a4b011eca" -SRC_URI[sha256sum] = "d87ee2987df8f03e1dbe294905f7907b2798deb89c67ca965f6e2f60879e54f1" - -S = "${WORKDIR}/${BP}" - -inherit systemd useradd xinetd - -CFLAGS = "${TARGET_CFLAGS}" -CFLAGS += "-DVSF_BUILD_SSL=1" -CFLAGS += "${@base_contains('DISTRO_FEATURES', 'pam', '-DVSF_BUILD_PAM=1', '', d)}" - -LIBS = "-lcap -lcrypt -lssl -lcrypto" -LIBS += "${@base_contains('DISTRO_FEATURES', 'pam', '-lpam', '', d)}" - -LINK = "${TARGET_LDFLAGS}" - -SECURE_CHROOT_DIR = "${datadir}/${BPN}/chroot" -RSA_CERT_FILE = "${sysconfdir}/ssl/private/${BPN}.pem" - -do_configure() { - rm -f builddefs.h - touch builddefs.h - set_default() { - NAME=$1 - VALUE=$2 - sed -e "s,^#\?${NAME}=.*,${NAME}=${VALUE}," -i vsftpd.conf - } - set_default listen NO - set_default listen_ipv6 NO - set_default anonymous_enable NO - set_default local_enable YES - set_default write_enable YES - set_default anon_upload_enable NO - set_default anon_mkdir_write_enable NO - set_default dirmessage_enable NO - set_default use_localtime YES - set_default xferlog_enable NO - set_default connect_from_port_20 YES - set_default chown_uploads NO - set_default nopriv_user vsftpd - set_default async_abor_enable YES - set_default ascii_upload_enable NO - set_default ascii_download_enable NO - set_default ftpd_banner "Welcome to the ${DISTRO_NAME} FTP service!" - set_default chroot_local_user NO - set_default chroot_list_enable NO - set_default ls_recurse_enable YES - set_default secure_chroot_dir "${SECURE_CHROOT_DIR}" - set_default rsa_cert_file "${RSA_CERT_FILE}" -} -do_compile() { - oe_runmake 'CFLAGS=${CFLAGS}' 'LIBS=${LIBS}' 'LINK=${LINK}' -} -do_install() { - install -d ${D}${sysconfdir} - install -m 644 vsftpd.conf ${D}${sysconfdir} - install -d ${D}${sbindir} - install -m 755 vsftpd ${D}${sbindir}/vsftpd - install -d ${D}${mandir}/man8 - install -m 644 vsftpd.8 ${D}${mandir}/man8/vsftpd.8 - install -d ${D}${mandir}/man5 - install -m 644 vsftpd.conf.5 ${D}${mandir}/man5/vsftpd.conf.5 - install -d ${D}${SECURE_CHROOT_DIR} - install -d ${D}${systemd_unitdir}/system - ln -sf /dev/null ${D}${systemd_unitdir}/system/vsftpd.service -} - -SYSTEMD_PACKAGES = "${PN}-systemd" -SYSTEMD_SERVICE_${PN}-systemd = "vsftpd.socket" - -USERADD_PACKAGES = "${PN}" -USERADD_PARAM_${PN} = "--home-dir ${SECURE_CHROOT_DIR} --no-create-home --system --shell /bin/false --user-group vsftpd" - -XINETD_PACKAGES = "${PN}-xinetd" -XINETD_SERVICE_${PN}-xinetd = "vsftpd" diff --git a/meta-openvuplus/recipes-base/vuplus-compat/vuplus-compat_1.0.bb b/meta-openvuplus/recipes-base/vuplus-compat/vuplus-compat_1.0.bb deleted file mode 100644 index 25c096a..0000000 --- a/meta-openvuplus/recipes-base/vuplus-compat/vuplus-compat_1.0.bb +++ /dev/null @@ -1,22 +0,0 @@ -SUMMARY = "Vuplus compatibility links" -SECTION = "base" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" -PRIORITY = "required" -PR = "r0" - -inherit allarch - -do_install() { - install -d ${D}${base_libdir} - ln -sf libcrypto.so.0.9.8 ${D}${base_libdir}/libcrypto.so.0.9.7 - ln -sf libgcc_s.so.1 ${D}${base_libdir}/libgcc_s_nof.so.1 - install -d ${D}${libdir} - ln -sf libdvbsi++.so.1 ${D}${libdir}/libdvbsi++.so.0 - ln -sf libgif.so.4 ${D}${libdir}/libungif.so.4 - ln -sf libjpeg.so.8 ${D}${libdir}/libjpeg.so.62 - ln -sf libssl.so.0.9.8 ${D}${libdir}/libssl.so.0.9.7 - ln -sf libpython2.7.so.1.0 ${D}${libdir}/libpython2.6.so.1.0 -} - -PACKAGES = "${PN}" diff --git a/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd.bb b/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd.bb deleted file mode 100644 index 8fdaa42..0000000 --- a/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd.bb +++ /dev/null @@ -1,25 +0,0 @@ -DESCRIPTION = "Xcrypt/Cnx daemon" -SECTION = "base" -PRIORITY = "required" -LICENSE = "proprietary" -LIC_FILES_CHKSUM = "file://${THISDIR}/${PN}/Proprietary;md5=0557f9d92cf58f2ccdd50f62f8ac0b28" - -PV = "1.1" -PR = "r1" - -SRC_URI = "file://vucamd \ - file://vucamd.sh \ -" - -S = "${WORKDIR}" - -INHIBIT_PACKAGE_STRIP = "1" - -do_install() { - install -d ${D}/usr/bin - install -d ${D}/etc/init.d - install -m 0755 ${WORKDIR}/vucamd ${D}/usr/bin/vucamd -} - -PACKAGE_ARCH := "${MACHINE_ARCH}" -FILES_${PN} = "/" diff --git a/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/Proprietary b/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/Proprietary deleted file mode 100644 index 6618758..0000000 --- a/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/Proprietary +++ /dev/null @@ -1 +0,0 @@ -Proprietary license. diff --git a/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/vucamd b/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/vucamd deleted file mode 100755 index 8a434b2284ce2ce0996b2766c46b8de5c307f66b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70300 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 z 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 fY4>fUojL@CE_SCTVa(OCWieImta`Kmb87v+M$ + #include + #include ++#include + + #define MODULE_MOUNT + #include "automount.h" +@@ -105,28 +106,117 @@ + + return 1; + } ++ ++/* ++ * If the entry doesn't contain a ',' or doesn't contain more than ++ * one ':' then @what is not a replicated server entry. ++ */ ++static int inline is_replicated_entry(char *what) ++{ ++ return strchr(what, ',') || ++ (strchr(what, ':') != strrchr(what, ':')); ++} ++ ++/* ++ * Check to see if the 'host:path' or 'host' is on the local machine ++ * Returns < 0 if there is a host lookup problem, otherwise returns 0 ++ * if it's not a local mount, and returns > 0 if it is a local mount. ++ */ ++int is_local_mount(const char *hostpath) ++{ ++ struct hostent *he; ++ char **haddr; ++ char *delim; ++ char *hostname; ++ int hostnamelen; ++ int local = 0; ++ ++ debug(MODPREFIX "is_local_mount: %s", hostpath); ++ delim = strpbrk(hostpath,":"); ++ ++ if (delim) ++ hostnamelen = delim - hostpath; ++ else ++ hostnamelen = strlen(hostpath); ++ ++ hostname = malloc(hostnamelen+1); ++ strncpy(hostname, hostpath, hostnamelen); ++ hostname[hostnamelen] = '\0'; ++ he = gethostbyname(hostname); ++ if (!he) { ++ error(MODPREFIX "host %s: lookup failure", hostname); ++ return -1; ++ } ++ ++ for (haddr = he->h_addr_list; *haddr; haddr++) { ++ local = is_local_addr(hostname, *haddr, he->h_length); ++ if (local < 0) ++ return local; ++ if (local) { ++ debug(MODPREFIX "host %s: is localhost", ++ hostname); ++ return local; ++ } ++ } ++ return 0; ++} ++ + /* + * Given a mount string, return (in the same string) the +- * best mount to use based on weight/locality/rpctime ++ * best mount to use based on locality/weight/rpctime. ++ * ++ * If longtimeout is set to 0 then we only do 100 ms pings to hosts. In ++ * the event that this fails, we call ourself recursively with the ++ * longtimeout option set to 1. In this case we ping for up to 10s and ++ * skip logic for detecting if a localhost has been passed. (if a local ++ * host had been passed, we would have returned that mount as the best ++ * mount. The skipping of local maps in this case is an optimization). ++ * + * - return -1 and what = '\0' on error, + * 1 and what = local mount path if local bind, + * else 0 and what = remote mount path + */ +-int get_best_mount(char *what, const char *original, int longtimeout, int skiplocal) ++int get_best_mount(char *what, const char *original, int longtimeout) + { + char *p = what; + char *winner = NULL; + int winner_weight = INT_MAX, local = 0; + double winner_time = 0; +- char *delim; ++ char *delim, *pstrip; + int sec = (longtimeout) ? 10 : 0; + int micros = (longtimeout) ? 0 : 100000; ++ int skiplocal = longtimeout; /* clearly local is not available */ + + if (!p) { + *what = '\0'; + return -1; + } + ++ /* ++ * If only one mountpoint has been passed in, we don't need to ++ * do anything except strip whitespace from the end of the string. ++ */ ++ if (!is_replicated_entry(p)) { ++ for (pstrip = p+strlen(p) - 1; pstrip >= p; pstrip--) ++ if (isspace(*pstrip)) ++ *pstrip = '\0'; ++ ++ /* Check if the host is the localhost */ ++ if (is_local_mount(p) > 0) { ++ debug(MODPREFIX "host %s: is localhost", p); ++ ++ /* Strip off hostname and ':' */ ++ delim = strchr(p,':'); ++ while (delim && *delim != '\0') { ++ delim++; ++ *what = *delim; ++ what++; ++ } ++ return 1; ++ } ++ return 0; ++ } ++ + while (p && *p) { + char *next; + unsigned int ping_stat = 0; +@@ -171,37 +261,17 @@ + /* p points to a server, "next is our next parse point */ + if (!skiplocal) { + /* Check if it's localhost */ +- struct hostent *he; +- char **haddr; +- +- he = gethostbyname(p); +- if (!he) { +- error(MODPREFIX "host %s: lookup failure", p); +- p = next; +- continue; +- } +- +- /* Check each host in round robin list */ +- for (haddr = he->h_addr_list; *haddr; haddr++) { +- local = is_local_addr(p, *haddr, he->h_length); +- +- if (local < 0) +- continue; +- +- if (local) { +- winner = p; +- break; +- } +- } +- ++ local = is_local_mount(p); + if (local < 0) { + local = 0; + p = next; + continue; + } + +- if (local) ++ if (local) { ++ winner = p; + break; ++ } + } + + /* ping each (or the) entry to see if it's alive. */ +@@ -214,6 +284,7 @@ + /* First unweighted or only host is alive so set winner */ + if (!winner) { + winner = p; ++ winner_time = 1; + /* No more to check, return it */ + if (!next || !*next) + break; +@@ -256,7 +327,7 @@ + */ + if (!local && winner_weight == INT_MAX) { + /* We had more than one contender and none responded in time */ +- if (winner_time != 0 && winner_time > 500) { ++ if (winner_time == 0 || winner_time > 500) { + /* We've already tried a longer timeout */ + if (!longtimeout) { + /* Reset string and try again */ +@@ -267,16 +338,14 @@ + "retrying with longer timeout", + original); + +- return get_best_mount(what, original, 1, 1); ++ return get_best_mount(what, original, 1); + } + } + } + +- /* No winner found so bail */ +- if (!winner) { +- *what = '\0'; +- return 0; +- } ++ /* No winner found so return first */ ++ if (!winner) ++ winner = what; + + /* + * We now have our winner, copy it to the front of the string, +@@ -395,7 +464,7 @@ + /* No colon, take this as a bind (local) entry */ + local = 1; + } else if (!nosymlink) { +- local = get_best_mount(whatstr, what, 0, 0); ++ local = get_best_mount(whatstr, what, 0); + if (!*whatstr) { + warn(MODPREFIX "no host elected"); + return 1; diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/061_multi_parse_fix.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/061_multi_parse_fix.patch new file mode 100644 index 0000000..8b11264 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/061_multi_parse_fix.patch @@ -0,0 +1,60 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 061_multi_parse_fix.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/modules/parse_sun.c .A/modules/parse_sun.c +--- .B/modules/parse_sun.c 2005-04-05 12:42:42.000000000 +0000 ++++ .A/modules/parse_sun.c 2007-01-07 21:36:35.000000000 +0000 +@@ -766,7 +766,16 @@ + { + const char *p = (char *) mapent; + int multi = 0; +- int first_chunk = 0; ++ int not_first_chunk = 0; ++ ++ if (!p) { ++ crit("check_is_multi: unexpected NULL map entry pointer"); ++ return 0; ++ } ++ ++ /* If first character is "/" it's a multi-mount */ ++ if (*p == '/') ++ return 1; + + while (*p) { + p = skipspace(p); +@@ -779,7 +788,7 @@ + * path that begins with '/' indicates a mutil-mount + * entry. + */ +- if (first_chunk) { ++ if (not_first_chunk) { + if (*p == '/' || *p == '-') { + multi = 1; + break; +@@ -796,7 +805,7 @@ + * after which it's a multi mount. + */ + p += chunklen(p, check_colon(p)); +- first_chunk++; ++ not_first_chunk++; + } + + return multi; +@@ -883,7 +892,12 @@ + return 1; + } + +- path = dequote(p, l = chunklen(p, 0)); ++ if (*p != '/') { ++ l = 0; ++ path = dequote("/", 1); ++ } else ++ path = dequote(p, l = chunklen(p, 0)); ++ + if (!path) { + error(MODPREFIX "out of memory"); + free(myoptions); diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/062_fix_memory_leak.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/062_fix_memory_leak.patch new file mode 100644 index 0000000..1ba0cea --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/062_fix_memory_leak.patch @@ -0,0 +1,32 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 062_fix_memory_leak.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/modules/mount_nfs.c .A/modules/mount_nfs.c +--- .B/modules/mount_nfs.c 2007-01-07 21:36:35.000000000 +0000 ++++ .A/modules/mount_nfs.c 2007-01-07 21:36:35.000000000 +0000 +@@ -145,16 +145,20 @@ + he = gethostbyname(hostname); + if (!he) { + error(MODPREFIX "host %s: lookup failure", hostname); ++ free(hostname); + return -1; + } + + for (haddr = he->h_addr_list; *haddr; haddr++) { + local = is_local_addr(hostname, *haddr, he->h_length); +- if (local < 0) ++ if (local < 0) { ++ free(hostname); + return local; ++ } + if (local) { + debug(MODPREFIX "host %s: is localhost", + hostname); ++ free(hostname); + return local; + } + } diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/063_misc_fixes.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/063_misc_fixes.patch new file mode 100644 index 0000000..fcfc8a2 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/063_misc_fixes.patch @@ -0,0 +1,82 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 063_misc_fixes.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/lib/cache.c .A/lib/cache.c +--- .B/lib/cache.c 2005-02-06 06:00:53.000000000 +0000 ++++ .A/lib/cache.c 2007-01-07 21:36:35.000000000 +0000 +@@ -337,8 +337,10 @@ + if (!path) + return; + +- if (is_mounted(_PATH_MOUNTED, path)) ++ if (is_mounted(_PATH_MOUNTED, path)) { ++ free(path); + continue; ++ } + + if (me->age < age) { + mapent_hash[i] = me->next; +diff -Naur .B/modules/lookup_file.c .A/modules/lookup_file.c +--- .B/modules/lookup_file.c 2005-04-06 15:14:23.000000000 +0000 ++++ .A/modules/lookup_file.c 2007-01-07 21:36:35.000000000 +0000 +@@ -157,6 +157,10 @@ + break; + + case st_compare: ++ if (kptr - key > KEY_MAX_LEN) { ++ state = st_badent; ++ break; ++ } + if (ch == '\n') + state = st_begin; + else if (isspace(ch) && !escape) { +diff -Naur .B/modules/parse_sun.c .A/modules/parse_sun.c +--- .B/modules/parse_sun.c 2007-01-07 21:36:35.000000000 +0000 ++++ .A/modules/parse_sun.c 2007-01-07 21:36:35.000000000 +0000 +@@ -680,6 +680,10 @@ + "mounting root %s, mountpoint %s, what %s, fstype %s, options %s\n", + root, mountpoint, what, fstype, options); + ++ /* A malformed entry of the form key /xyz will trigger this case */ ++ if (!what || *what == '\0') ++ return 1; ++ + if (!strcmp(fstype, "nfs")) { + rv = mount_nfs->mount_mount(root, mountpoint, strlen(mountpoint), + what, fstype, options, mount_nfs->context); +@@ -695,6 +699,18 @@ + return rv; + } + ++static int key_exists(struct multi_mnt *list, char *path, int pathlen) ++{ ++ struct multi_mnt *mmptr = list; ++ ++ while (mmptr && pathlen == strlen(mmptr->path)) { ++ if (!strncmp(mmptr->path, path, pathlen)) ++ return 1; ++ mmptr = mmptr->next; ++ } ++ return 0; ++} ++ + /* + * Build list of mounts in shortest -> longest order. + * Pass in list head and return list head. +@@ -725,6 +741,12 @@ + mmptr = mmptr->next; + } + ++ /* if a multimount entry has duplicate keys, it is invalid */ ++ if (key_exists(mmptr, path, plen)) { ++ free(new); ++ return NULL; ++ } ++ + if (old) + old->next = new; + new->next = mmptr; diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/064_support_options_on_nis_maps.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/064_support_options_on_nis_maps.patch new file mode 100644 index 0000000..b71d9f5 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/064_support_options_on_nis_maps.patch @@ -0,0 +1,45 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 064_support_options_on_nis_maps.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/rc.autofs.in .A/samples/rc.autofs.in +--- .B/samples/rc.autofs.in 2005-04-11 11:30:54.000000000 +0000 ++++ .A/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 +@@ -129,7 +129,17 @@ + else + map="$1" + fi +- /usr/bin/ypcat -k "$map" 2> /dev/null | sed -e '/^#/d' -e '/^$/d' ++ ++ # Append the map's options at the _start_ if there are any options already ++ # (ie. myopt -> $2,myopt), otherwise just append them at the end. ++ if [ -z "$2" ]; then ++ /usr/bin/ypcat -k "$map" 2> /dev/null | sed -e '/^#/d' -e '/^$/d' ++ else ++ /usr/bin/ypcat -k "$map" 2> /dev/null | ++ sed -e '/^#/d' -e '/^$/d' \ ++ -e "s/^[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\)[ \t]\+-\([^ \t]\+\)/\1 \2 $2,\3/" \ ++ -e "s/^[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\)[ \t]*$/\1 \2 $2/" ++ fi + } + + function getfilemounts() +@@ -141,10 +151,11 @@ + if [ "`echo $auto_master_in | grep '^+'`" = "" ]; then + echo $auto_master_in + else +- for nismap in `cat /etc/auto.master | grep '^\+' | +- sed -e '/^#/d' -e '/^$/d'`; do +- catnismap `echo "$nismap" | sed -e 's/^\+//'` +- done ++ cat /etc/auto.master | grep '^\+' | sed -e '/^#/d' -e '/^$/d' | ( ++ while read map options; do ++ catnismap `echo "$map" | sed -e 's/^\+//'` $options ++ done ++ ) + fi + done + ) diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/065_fix_master_map_in_ldap.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/065_fix_master_map_in_ldap.patch new file mode 100644 index 0000000..1898571 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/065_fix_master_map_in_ldap.patch @@ -0,0 +1,22 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 065_fix_master_map_in_ldap.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/rc.autofs.in .A/samples/rc.autofs.in +--- .B/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 ++++ .A/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 +@@ -175,7 +175,11 @@ + function getldapmounts() + { + if [ -x @@autofslibdir@@/autofs-ldap-auto-master ]; then ++ [ ! -z $LDAPURI ] && export LDAPURI="$LDAPURI" ++ [ ! -z $LDAPBASE ] && export LDAPBASE="$LDAPBASE" + @@autofslibdir@@/autofs-ldap-auto-master 2> /dev/null ++ @@autofslibdir@@/autofs-ldap-auto-master -m automountMap \ ++ -e automount -n ou -k cn -v automountInformation 2> /dev/null + fi + } + diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/066_canonicalise_mount_points.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/066_canonicalise_mount_points.patch new file mode 100644 index 0000000..0d1588c --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/066_canonicalise_mount_points.patch @@ -0,0 +1,24 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 066_canonicalise_mount_points.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/rc.autofs.in .A/samples/rc.autofs.in +--- .B/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 ++++ .A/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 +@@ -244,6 +244,13 @@ + continue + fi + ++ # If possible, canonicalise the path so it will always unmount ++ # cleanly. ++ link=`readlink -f "$dir"` ++ if [ ! -z "$link" ]; then ++ dir="$link" ++ fi ++ + # Do not include a map if it is a duplicate, maps on top of + # another map or another map, maps on top of it. + for knownmap in $knownmaps diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/067_allow_disabling_bind_mounts.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/067_allow_disabling_bind_mounts.patch new file mode 100644 index 0000000..71ed3f1 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/067_allow_disabling_bind_mounts.patch @@ -0,0 +1,77 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 067_allow_disabling_bind_mounts.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/modules/mount_bind.c .A/modules/mount_bind.c +--- .B/modules/mount_bind.c 2005-01-10 13:28:29.000000000 +0000 ++++ .A/modules/mount_bind.c 2007-01-07 21:36:35.000000000 +0000 +@@ -107,7 +107,7 @@ + if (options == NULL || *options == '\0') + options = "defaults"; + +- if (bind_works) { ++ if (bind_works && strcmp(options, "symlink") != 0) { + int status, existed = 1; + + debug(MODPREFIX "calling mkdir_path %s", fullpath); +diff -Naur .B/modules/mount_nfs.c .A/modules/mount_nfs.c +--- .B/modules/mount_nfs.c 2007-01-07 21:36:35.000000000 +0000 ++++ .A/modules/mount_nfs.c 2007-01-07 21:36:35.000000000 +0000 +@@ -391,7 +391,8 @@ + char *whatstr; + char *nfsoptions = NULL; + int local, err; +- int nosymlink = 0; ++ int nosymlink = 0; /* Actually misnamed, should be "nobind" now */ ++ int symlink = 0; /* Prefer symlinks to bind mounts? */ + int ro = 0; /* Set if mount bind should be read-only */ + + debug(MODPREFIX "root=%s name=%s what=%s, fstype=%s, options=%s", +@@ -405,7 +406,10 @@ + strcpy(whatstr, what); + + /* Extract "nosymlink" pseudo-option which stops local filesystems +- from being symlinked */ ++ from being bind mounted, and "symlink" pseudo-option which does not ++ do the exact opposite, but rather makes any bind mount into a ++ symlink instead. (Both nosymlink and symlink at the same time ++ make no sense, of course.) */ + if (options) { + const char *comma; + char *nfsp; +@@ -446,6 +450,8 @@ + #endif + if (strncmp("nosymlink", cp, end - cp + 1) == 0) + nosymlink = 1; ++ else if (strncmp("symlink", cp, end - cp + 1) == 0) ++ symlink = 1; + else { + /* Check for options that also make sense + with bind mounts */ +@@ -457,8 +463,8 @@ + } + } + +- debug(MODPREFIX "nfs options=\"%s\", nosymlink=%d, ro=%d", +- nfsoptions, nosymlink, ro); ++ debug(MODPREFIX "nfs options=\"%s\", nosymlink=%d, symlink=%d, ro=%d", ++ nfsoptions, nosymlink, symlink, ro); + } + + local = 0; +@@ -490,7 +496,11 @@ + if (local) { + /* Local host -- do a "bind" */ + +- const char *bind_options = ro ? "ro" : ""; ++ const char *bind_options; ++ if (symlink) ++ bind_options = "symlink"; ++ else ++ bind_options = ro ? "ro" : ""; + + debug(MODPREFIX "%s is local, doing bind", name); + diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/067_ldap_no_first_message.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/067_ldap_no_first_message.patch new file mode 100644 index 0000000..e85d37b --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/067_ldap_no_first_message.patch @@ -0,0 +1,28 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 067_ldap_no_first_message.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/modules/lookup_ldap.c .A/modules/lookup_ldap.c +--- .B/modules/lookup_ldap.c 2005-02-27 05:37:14.000000000 +0000 ++++ .A/modules/lookup_ldap.c 2007-01-07 21:36:35.000000000 +0000 +@@ -437,7 +437,7 @@ + + e = ldap_first_entry(ldap, result); + if (!e) { +- crit(MODPREFIX "got answer, but no first entry for %s", query); ++ debug(MODPREFIX "got answer, but no first entry for %s", query); + ldap_msgfree(result); + ldap_unbind(ldap); + return CHE_MISSING; +@@ -545,7 +545,7 @@ + + e = ldap_first_entry(ldap, result); + if (!e) { +- crit(MODPREFIX "got answer, but no first entry for %s", query); ++ debug(MODPREFIX "got answer, but no first entry for %s", query); + ldap_msgfree(result); + ldap_unbind(ldap); + return CHE_MISSING; diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/068_fix_invalid_rpcgen_code.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/068_fix_invalid_rpcgen_code.patch new file mode 100644 index 0000000..abb61ea --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/068_fix_invalid_rpcgen_code.patch @@ -0,0 +1,21 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 068_fix_invalid_rpcgen_code.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/lib/Makefile .A/lib/Makefile +--- .B/lib/Makefile 2005-01-09 09:16:43.000000000 +0000 ++++ .A/lib/Makefile 2007-01-07 21:36:36.000000000 +0000 +@@ -39,6 +39,10 @@ + + mount_xdr.c: mount.h + $(RPCGEN) -c -o mount_xdr.c mount.x ++ sed -i -e 's/IXDR_GET_LONG(\([^)]*\))/((long)IXDR_GET_U_INT32(\1))/' mount_xdr.c ++ sed -i -e 's/IXDR_PUT_LONG(\([^)]*\),\([^)]*\))/((long)IXDR_PUT_INT32(\1,(long)(\2)))/' mount_xdr.c ++ sed -i -e 's/IXDR_GET_SHORT(\([^)]*\))/((short)IXDR_GET_U_INT32(\1))/' mount_xdr.c ++ sed -i -e 's/IXDR_PUT_SHORT(\([^)]*\),\([^)]*\))/((long)IXDR_PUT_INT32(\1,(long)(\2)))/' mount_xdr.c + + mount_xdr.o: mount_xdr.c + $(CC) $(CFLAGS) -Wno-unused-variable -o mount_xdr.o -c mount_xdr.c diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/069_support_spaces_in_smb_share_names.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/069_support_spaces_in_smb_share_names.patch new file mode 100644 index 0000000..a07e966 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/069_support_spaces_in_smb_share_names.patch @@ -0,0 +1,19 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 069_support_spaces_in_smb_share_names.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/auto.smb .A/samples/auto.smb +--- .B/samples/auto.smb 2005-04-05 13:02:09.000000000 +0000 ++++ .A/samples/auto.smb 2007-01-07 21:36:36.000000000 +0000 +@@ -20,7 +20,7 @@ + + $SMBCLIENT -gNL $key 2>/dev/null| awk -v key="$key" -v opts="$opts" -F'|' -- ' + BEGIN { ORS=""; first=1 } +- /Disk/ { if (first) { print opts; first=0 }; print " \\\n\t /" $2, "://" key "/" $2 } ++ /Disk/ { if (first) { print opts; first=0 }; sub(/ /, "\\ ", $2); print " \\\n\t /" $2, "://" key "/" $2 } + END { if (!first) print "\n"; else exit 1 } + ' + diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/070_fix_regex_typo.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/070_fix_regex_typo.patch new file mode 100644 index 0000000..46f2159 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/070_fix_regex_typo.patch @@ -0,0 +1,19 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 070_fix_regex_typo.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/rc.autofs.in .A/samples/rc.autofs.in +--- .B/samples/rc.autofs.in 2007-01-07 21:36:35.000000000 +0000 ++++ .A/samples/rc.autofs.in 2007-01-07 21:36:36.000000000 +0000 +@@ -148,7 +148,7 @@ + cat /etc/auto.master | awk '{print $0}' | sed -e '/^#/d' -e '/^$/d' | ( + while read auto_master_in + do +- if [ "`echo $auto_master_in | grep '^+'`" = "" ]; then ++ if [ "`echo $auto_master_in | grep '^\+'`" = "" ]; then + echo $auto_master_in + else + cat /etc/auto.master | grep '^\+' | sed -e '/^#/d' -e '/^$/d' | ( diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/071_fix_ldap_mounts.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/071_fix_ldap_mounts.patch new file mode 100644 index 0000000..ee0c4ef --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/071_fix_ldap_mounts.patch @@ -0,0 +1,19 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 071_fix_ldap_mounts.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/rc.autofs.in .A/samples/rc.autofs.in +--- .B/samples/rc.autofs.in 2007-01-07 21:36:36.000000000 +0000 ++++ .A/samples/rc.autofs.in 2007-01-07 21:36:36.000000000 +0000 +@@ -319,7 +319,7 @@ + maptype=`echo $map | cut -f1 -d:` + # Handle degenerate map specifiers + if [ "$maptype" = "$map" ] ; then +- if [ "$map" = "hesiod" -o "$map" = "userhome" ] ; then ++ if [ "$map" = "hesiod" -o "$map" = "userhome" -o "$map" = "ldap" ] ; then + maptype=$map + map= + elif [ "$map" = "multi" ] ; then diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/072_fix_auto_net_sort.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/072_fix_auto_net_sort.patch new file mode 100644 index 0000000..5edec83 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/072_fix_auto_net_sort.patch @@ -0,0 +1,19 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 072_fix_auto_net_sort.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/auto.net .A/samples/auto.net +--- .B/samples/auto.net 2007-01-07 21:36:35.000000000 +0000 ++++ .A/samples/auto.net 2007-01-07 21:36:36.000000000 +0000 +@@ -37,7 +37,7 @@ + # Newer distributions get this right + SHOWMOUNT="$SMNT --no-headers -e $key" + +-$SHOWMOUNT | LC_ALL=C sort +0 | \ ++$SHOWMOUNT | LC_ALL=C sort -k 1 | \ + awk -v key="$key" -v opts="$opts" -- ' + BEGIN { ORS=""; first=1 } + { if (first) { print opts; first=0 }; print " \\\n\t" $1, key ":" $1 } diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/073_configurable_locking.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/073_configurable_locking.patch new file mode 100644 index 0000000..94058ca --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/073_configurable_locking.patch @@ -0,0 +1,173 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 073_configurable_locking.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/configure .A/configure +--- .B/configure 2005-04-06 15:24:37.000000000 +0000 ++++ .A/configure 2007-01-07 21:36:36.000000000 +0000 +@@ -842,6 +842,7 @@ + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-ext-env disable search in environment for substitution variable ++--disable-mount-locking disable use of locking when spawning mount command + + Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +@@ -4308,6 +4309,23 @@ + fi + + # ++# Disable use of locking when spawning mount command ++# ++# Check whether --enable-mount-locking or --disable-mount-locking was given. ++if test "${enable_mount_locking+set}" = set; then ++ enableval="$enable_mount_locking" ++ ++else ++ enableval=yes ++fi; ++if test x$enable_mount_locking = xyes -o x$enableval = xyes; then ++ cat >>confdefs.h <<\_ACEOF ++#define ENABLE_MOUNT_LOCKING 1 ++_ACEOF ++ ++fi ++ ++# + # Write Makefile.conf and include/config.h + # + ac_config_headers="$ac_config_headers include/config.h" +diff -Naur .B/configure.in .A/configure.in +--- .B/configure.in 2005-04-06 15:24:37.000000000 +0000 ++++ .A/configure.in 2007-01-07 21:36:36.000000000 +0000 +@@ -167,6 +167,16 @@ + fi + + # ++# Disable use of locking when spawning mount command ++# ++AC_ARG_ENABLE(mount-locking, ++--disable-mount-locking disable use of locking when spawning mount command,, ++ enableval=yes) ++if test x$enable_mount_locking = xyes -o x$enableval = xyes; then ++ AC_DEFINE(ENABLE_MOUNT_LOCKING, 1) ++fi ++ ++# + # Write Makefile.conf and include/config.h + # + AC_CONFIG_HEADER(include/config.h) +diff -Naur .B/daemon/spawn.c .A/daemon/spawn.c +--- .B/daemon/spawn.c 2005-02-10 12:56:53.000000000 +0000 ++++ .A/daemon/spawn.c 2007-01-07 21:36:36.000000000 +0000 +@@ -322,6 +322,7 @@ + return do_spawn(logpri, 0, prog, (const char **) argv); + } + ++#ifdef ENABLE_MOUNT_LOCKING + int spawnll(int logpri, const char *prog, ...) + { + va_list arg; +@@ -342,3 +343,4 @@ + + return do_spawn(logpri, 1, prog, (const char **) argv); + } ++#endif +diff -Naur .B/include/automount.h .A/include/automount.h +--- .B/include/automount.h 2005-01-26 13:03:02.000000000 +0000 ++++ .A/include/automount.h 2007-01-07 21:36:36.000000000 +0000 +@@ -121,9 +121,13 @@ + + int aquire_lock(void); + void release_lock(void); +-int spawnll(int logpri, const char *prog, ...); + int spawnl(int logpri, const char *prog, ...); +-int spawnv(int logpri, const char *prog, const char *const *argv); ++#ifdef ENABLE_MOUNT_LOCKING ++int spawnll(int logpri, const char *prog, ...); ++#else ++#define spawnll spawnl ++#endif ++int spawnv(int ogpri, const char *prog, const char *const *argv); + void reset_signals(void); + void ignore_signals(void); + void discard_pending(int sig); +diff -Naur .B/include/config.h.in .A/include/config.h.in +--- .B/include/config.h.in 2004-02-03 15:23:21.000000000 +0000 ++++ .A/include/config.h.in 2007-01-07 21:36:36.000000000 +0000 +@@ -25,3 +25,5 @@ + #undef HAVE_SLOPPY_MOUNT + + #undef ENABLE_EXT_ENV ++ ++#undef ENABLE_MOUNT_LOCKING +diff -Naur .B/patches/util-linux-2.12a-flock.patch .A/patches/util-linux-2.12a-flock.patch +--- .B/patches/util-linux-2.12a-flock.patch 1970-01-01 00:00:00.000000000 +0000 ++++ .A/patches/util-linux-2.12a-flock.patch 2007-01-07 21:36:36.000000000 +0000 +@@ -0,0 +1,30 @@ ++--- util-linux-2.12a/mount/fstab.c.flock 2005-09-17 01:36:03.000000000 +0800 +++++ util-linux-2.12a/mount/fstab.c 2005-09-17 01:41:12.000000000 +0800 ++@@ -488,7 +488,7 @@ lock_mtab (void) { ++ } ++ /* proceed anyway */ ++ } ++- we_created_lockfile = 1; +++ we_created_lockfile = fd; ++ } else { ++ static int tries = 0; ++ ++@@ -510,9 +510,8 @@ lock_mtab (void) { ++ MOUNTED_LOCK); ++ sleep(1); ++ } +++ close(fd); ++ } ++- ++- close(fd); ++ } ++ } ++ ++@@ -520,6 +519,7 @@ lock_mtab (void) { ++ void ++ unlock_mtab (void) { ++ if (we_created_lockfile) { +++ close(we_created_lockfile); ++ unlink (MOUNTED_LOCK); ++ we_created_lockfile = 0; ++ } +diff -Naur .B/patches/util-linux-2.12q-flock.patch .A/patches/util-linux-2.12q-flock.patch +--- .B/patches/util-linux-2.12q-flock.patch 1970-01-01 00:00:00.000000000 +0000 ++++ .A/patches/util-linux-2.12q-flock.patch 2007-01-07 21:36:36.000000000 +0000 +@@ -0,0 +1,29 @@ ++--- util-linux-2.12q/mount/fstab.c.flock 2005-09-17 01:10:37.000000000 +0800 +++++ util-linux-2.12q/mount/fstab.c 2005-09-17 01:16:51.000000000 +0800 ++@@ -417,6 +417,7 @@ ++ unlock_mtab (void) { ++ if (we_created_lockfile) { ++ unlink (MOUNTED_LOCK); +++ close(we_created_lock_file); ++ we_created_lockfile = 0; ++ } ++ } ++@@ -528,6 +529,7 @@ ++ } ++ /* proceed anyway */ ++ } +++ we_created_lock_file = fd; ++ } else { ++ static int tries = 0; ++ ++@@ -549,9 +551,8 @@ ++ MOUNTED_LOCK); ++ sleep(1); ++ } +++ close(fd); ++ } ++- ++- close(fd); ++ } ++ } ++ diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/074_auto_smb_cifs.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/074_auto_smb_cifs.patch new file mode 100644 index 0000000..28590ee --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/074_auto_smb_cifs.patch @@ -0,0 +1,19 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 074_auto_smb_cifs.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/auto.smb .A/samples/auto.smb +--- .B/samples/auto.smb 2007-01-07 21:36:36.000000000 +0000 ++++ .A/samples/auto.smb 2007-01-07 21:36:36.000000000 +0000 +@@ -5,7 +5,7 @@ + # This file must be executable to work! chmod 755! + + key="$1" +-opts="-fstype=smbfs" ++opts="-fstype=cifs" + + for P in /bin /sbin /usr/bin /usr/sbin + do diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/075_auto_net_escape_hash.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/075_auto_net_escape_hash.patch new file mode 100644 index 0000000..09c0ccb --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/075_auto_net_escape_hash.patch @@ -0,0 +1,16 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 075_auto_net_escape_hash.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/auto.net .A/samples/auto.net +--- .B/samples/auto.net 2007-01-07 21:36:36.000000000 +0000 ++++ .A/samples/auto.net 2007-01-07 21:36:36.000000000 +0000 +@@ -42,4 +42,4 @@ + BEGIN { ORS=""; first=1 } + { if (first) { print opts; first=0 }; print " \\\n\t" $1, key ":" $1 } + END { if (!first) print "\n"; else exit 1 } +- ' ++ ' | sed 's/#/\\#/g' diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/076_ldap_deprecated.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/076_ldap_deprecated.patch new file mode 100644 index 0000000..93cfc05 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/076_ldap_deprecated.patch @@ -0,0 +1,265 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 076_ldap_deprecated.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/aclocal.m4 .A/aclocal.m4 +--- .B/aclocal.m4 2003-09-29 08:22:35.000000000 +0000 ++++ .A/aclocal.m4 2007-01-07 21:36:36.000000000 +0000 +@@ -9,8 +9,8 @@ + AC_DEFUN(AF_PATH_INCLUDE, + [AC_PATH_PROGS($1,$2,$3,$4) + if test -n "$$1"; then +- AC_DEFINE(HAVE_$1) +- AC_DEFINE_UNQUOTED(PATH_$1, "$$1") ++ AC_DEFINE(HAVE_$1,1,[define if you have $1]) ++ AC_DEFINE_UNQUOTED(PATH_$1, "$$1", [define if you have $1]) + HAVE_$1=1 + else + HAVE_$1=0 +@@ -28,7 +28,7 @@ + [if test -n "$MOUNT" ; then + AC_MSG_CHECKING([if mount accepts the -s option]) + if "$MOUNT" -s > /dev/null 2>&1 ; then +- AC_DEFINE(HAVE_SLOPPY_MOUNT) ++ AC_DEFINE(HAVE_SLOPPY_MOUNT, 1, [define if the mount command supports the -s option]) + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) +diff -Naur .B/configure .A/configure +--- .B/configure 2007-01-07 21:36:36.000000000 +0000 ++++ .A/configure 2007-01-07 21:36:36.000000000 +0000 +@@ -1359,11 +1359,13 @@ + test -n "$MOUNT" || MOUNT="/bin/mount" + + if test -n "$MOUNT"; then +- cat >>confdefs.h <<\_ACEOF ++ ++cat >>confdefs.h <<\_ACEOF + #define HAVE_MOUNT 1 + _ACEOF + +- cat >>confdefs.h <<_ACEOF ++ ++cat >>confdefs.h <<_ACEOF + #define PATH_MOUNT "$MOUNT" + _ACEOF + +@@ -1418,11 +1420,13 @@ + test -n "$UMOUNT" || UMOUNT="/bin/umount" + + if test -n "$UMOUNT"; then +- cat >>confdefs.h <<\_ACEOF ++ ++cat >>confdefs.h <<\_ACEOF + #define HAVE_UMOUNT 1 + _ACEOF + +- cat >>confdefs.h <<_ACEOF ++ ++cat >>confdefs.h <<_ACEOF + #define PATH_UMOUNT "$UMOUNT" + _ACEOF + +@@ -1476,11 +1480,13 @@ + done + + if test -n "$E2FSCK"; then +- cat >>confdefs.h <<\_ACEOF ++ ++cat >>confdefs.h <<\_ACEOF + #define HAVE_E2FSCK 1 + _ACEOF + +- cat >>confdefs.h <<_ACEOF ++ ++cat >>confdefs.h <<_ACEOF + #define PATH_E2FSCK "$E2FSCK" + _ACEOF + +@@ -1534,11 +1540,13 @@ + done + + if test -n "$E3FSCK"; then +- cat >>confdefs.h <<\_ACEOF ++ ++cat >>confdefs.h <<\_ACEOF + #define HAVE_E3FSCK 1 + _ACEOF + +- cat >>confdefs.h <<_ACEOF ++ ++cat >>confdefs.h <<_ACEOF + #define PATH_E3FSCK "$E3FSCK" + _ACEOF + +@@ -1556,7 +1564,8 @@ + echo "$as_me:$LINENO: checking if mount accepts the -s option" >&5 + echo $ECHO_N "checking if mount accepts the -s option... $ECHO_C" >&6 + if "$MOUNT" -s > /dev/null 2>&1 ; then +- cat >>confdefs.h <<\_ACEOF ++ ++cat >>confdefs.h <<\_ACEOF + #define HAVE_SLOPPY_MOUNT 1 + _ACEOF + +@@ -3403,6 +3412,7 @@ + fi; + if test -z "$HAVE_LDAP"; then + HAVE_LDAP=0 ++ LDAP_FLAGS="$LDAP_FLAGS -DLDAP_DEPRECATED=1" + echo "$as_me:$LINENO: checking for ldap_init in -lldap" >&5 + echo $ECHO_N "checking for ldap_init in -lldap... $ECHO_C" >&6 + if test "${ac_cv_lib_ldap_ldap_init+set}" = set; then +@@ -4302,7 +4312,8 @@ + enableval=yes + fi; + if test x$enable_ext_env = xyes; then +- cat >>confdefs.h <<\_ACEOF ++ ++cat >>confdefs.h <<\_ACEOF + #define ENABLE_EXT_ENV 1 + _ACEOF + +@@ -4319,7 +4330,8 @@ + enableval=yes + fi; + if test x$enable_mount_locking = xyes -o x$enableval = xyes; then +- cat >>confdefs.h <<\_ACEOF ++ ++cat >>confdefs.h <<\_ACEOF + #define ENABLE_MOUNT_LOCKING 1 + _ACEOF + +diff -Naur .B/configure.in .A/configure.in +--- .B/configure.in 2007-01-07 21:36:36.000000000 +0000 ++++ .A/configure.in 2007-01-07 21:36:36.000000000 +0000 +@@ -118,6 +118,7 @@ + ) + if test -z "$HAVE_LDAP"; then + HAVE_LDAP=0 ++ LDAP_FLAGS="$LDAP_FLAGS -DLDAP_DEPRECATED=1" + AC_CHECK_LIB(ldap, ldap_init, HAVE_LDAP=1 LIBLDAP="$LIBLDAP -lldap -llber -lresolv", , + -llber -lresolv $LIBS) + fi +@@ -163,7 +164,7 @@ + --disable-ext-env disable search in environment for substitution variable,, + enableval=yes) + if test x$enable_ext_env = xyes; then +- AC_DEFINE(ENABLE_EXT_ENV, 1) ++ AC_DEFINE(ENABLE_EXT_ENV, 1, [leave this alone]) + fi + + # +@@ -173,7 +174,7 @@ + --disable-mount-locking disable use of locking when spawning mount command,, + enableval=yes) + if test x$enable_mount_locking = xyes -o x$enableval = xyes; then +- AC_DEFINE(ENABLE_MOUNT_LOCKING, 1) ++ AC_DEFINE(ENABLE_MOUNT_LOCKING, 1, [disable mount table locking -- use this if your maps contain recursive mounts -- EXPERIMENTAL]) + fi + + # +diff -Naur .B/include/config.h.in .A/include/config.h.in +--- .B/include/config.h.in 2007-01-07 21:36:36.000000000 +0000 ++++ .A/include/config.h.in 2007-01-07 21:36:36.000000000 +0000 +@@ -1,29 +1,80 @@ +-#ident "$Id: config.h.in,v 1.4 2004/02/03 15:23:21 raven Exp $" +-/* -*- c -*- +- * +- * config.h.in: Pattern file for autofs to be filled in by configure +- * +- */ ++/* include/config.h.in. Generated from configure.in by autoheader. */ + +-/* Program paths */ ++/* leave this alone */ ++#undef ENABLE_EXT_ENV ++ ++/* disable mount table locking -- use this if your maps contain recursive ++ mounts -- EXPERIMENTAL */ ++#undef ENABLE_MOUNT_LOCKING ++ ++/* define if you have E2FSCK */ ++#undef HAVE_E2FSCK ++ ++/* define if you have E3FSCK */ ++#undef HAVE_E3FSCK ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_INTTYPES_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_MEMORY_H ++ ++/* define if you have MOUNT */ + #undef HAVE_MOUNT +-#undef PATH_MOUNT + ++/* define if the mount command supports the -s option */ ++#undef HAVE_SLOPPY_MOUNT ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_STDINT_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_STDLIB_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_STRINGS_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_STRING_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_SYS_STAT_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_SYS_TYPES_H ++ ++/* define if you have UMOUNT */ + #undef HAVE_UMOUNT +-#undef PATH_UMOUNT + +-#undef HAVE_SMBMOUNT +-#undef PATH_SMBMOUNT ++/* Define to 1 if you have the header file. */ ++#undef HAVE_UNISTD_H + +-#undef HAVE_E2FSCK ++/* Define to the address where bug reports for this package should be sent. */ ++#undef PACKAGE_BUGREPORT ++ ++/* Define to the full name of this package. */ ++#undef PACKAGE_NAME ++ ++/* Define to the full name and version of this package. */ ++#undef PACKAGE_STRING ++ ++/* Define to the one symbol short name of this package. */ ++#undef PACKAGE_TARNAME ++ ++/* Define to the version of this package. */ ++#undef PACKAGE_VERSION ++ ++/* define if you have E2FSCK */ + #undef PATH_E2FSCK + +-#undef HAVE_E3FSCK ++/* define if you have E3FSCK */ + #undef PATH_E3FSCK + +-/* Define this option if mount(8) supports the -s (sloppy) option */ +-#undef HAVE_SLOPPY_MOUNT ++/* define if you have MOUNT */ ++#undef PATH_MOUNT + +-#undef ENABLE_EXT_ENV ++/* define if you have UMOUNT */ ++#undef PATH_UMOUNT + +-#undef ENABLE_MOUNT_LOCKING ++/* Define to 1 if you have the ANSI C header files. */ ++#undef STDC_HEADERS diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/078_locking_fix_1.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/078_locking_fix_1.patch new file mode 100644 index 0000000..eb22a2b --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/078_locking_fix_1.patch @@ -0,0 +1,82 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 078_locking_fix_1.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/daemon/spawn.c .A/daemon/spawn.c +--- .B/daemon/spawn.c 2007-01-07 21:36:36.000000000 +0000 ++++ .A/daemon/spawn.c 2007-01-07 21:36:36.000000000 +0000 +@@ -214,14 +214,15 @@ + sigfillset(&allsignals); + sigprocmask(SIG_BLOCK, &allsignals, &oldsig); + +- if (pipe(pipefd)) ++ if (pipe(pipefd)) { ++ if (use_lock) ++ release_lock(); ++ sigprocmask(SIG_SETMASK, &oldsig, NULL); + return -1; ++ } + + f = fork(); +- if (f < 0) { +- sigprocmask(SIG_SETMASK, &oldsig, NULL); +- return -1; +- } else if (f == 0) { ++ if (f == 0) { + reset_signals(); + close(pipefd[0]); + dup2(pipefd[1], STDOUT_FILENO); +@@ -243,6 +244,8 @@ + + if (f < 0) { + close(pipefd[0]); ++ if (use_lock) ++ release_lock(); + sigprocmask(SIG_SETMASK, &oldsig, NULL); + return -1; + } +@@ -287,11 +290,11 @@ + if (waitpid(f, &status, 0) != f) + status = -1; /* waitpid() failed */ + +- sigprocmask(SIG_SETMASK, &oldsig, NULL); +- + if (use_lock) + release_lock(); + ++ sigprocmask(SIG_SETMASK, &oldsig, NULL); ++ + return status; + } + } +diff -Naur .B/lib/lock.c .A/lib/lock.c +--- .B/lib/lock.c 2005-01-17 15:09:28.000000000 +0000 ++++ .A/lib/lock.c 2007-01-07 21:36:36.000000000 +0000 +@@ -208,9 +208,6 @@ + */ + static int wait_for_lockf(const char *lockf) + { +- struct timespec t = { 0, WAIT_INTERVAL }; +- struct timespec r; +- int ts_size = sizeof(struct timespec); + int tries = WAIT_TRIES; + int status = 0; + struct stat st; +@@ -218,10 +215,13 @@ + while (tries-- && !status) { + status = stat(lockf, &st); + if (!status) { ++ struct timespec t = { 0, WAIT_INTERVAL }; ++ struct timespec r; ++ + while (nanosleep(&t, &r) == -1 && errno == EINTR) { + if (got_term) + return 0; +- memcpy(&t, &r, ts_size); ++ memcpy(&t, &r, sizeof(struct timespec)); + } + } + } diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/079_no_unlink_upstream.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/079_no_unlink_upstream.patch new file mode 100644 index 0000000..eb062e4 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/079_no_unlink_upstream.patch @@ -0,0 +1,55 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 079_no_unlink_upstream.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/daemon/automount.c .A/daemon/automount.c +--- .B/daemon/automount.c 2007-01-07 21:36:36.000000000 +0000 ++++ .A/daemon/automount.c 2007-01-07 21:36:37.000000000 +0000 +@@ -232,16 +232,38 @@ + static int rm_unwanted_fn(const char *file, const struct stat *st, int when, void *arg) + { + int rmsymlink = *(int *) arg; ++ struct stat newst; + + if (when == 0) { + if (st->st_dev != ap.dev) + return 0; +- } else { +- info("rm_unwanted: %s\n", file); +- if (S_ISDIR(st->st_mode)) +- rmdir(file); +- else if (!S_ISLNK(st->st_mode) || rmsymlink) +- unlink(file); ++ return 1; ++ } ++ ++ if (lstat(file, &newst)) { ++ crit ("rm_unwanted: unable to stat file, possible race " ++ "condition."); ++ return 0; ++ } ++ ++ if (newst.st_dev != ap.dev) { ++ crit ("rm_unwanted: file %s has the wrong device, possible " ++ "race condition.",file); ++ return 0; ++ } ++ ++ if (S_ISDIR(newst.st_mode)) { ++ if (rmdir(file)) { ++ info ("rm_unwanted: unable to remove directory" ++ " %s", file); ++ return 0; ++ } ++ } else if (S_ISREG(newst.st_mode)) { ++ crit ("rm_unwanted: attempting to remove files from a mounted " ++ "directory."); ++ return 0; ++ } else if (S_ISLNK(newst.st_mode) && rmsymlink) { ++ unlink(file); + } + + return 1; diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/080_auto_smb_probe_credentials.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/080_auto_smb_probe_credentials.patch new file mode 100644 index 0000000..0b6ca44 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/080_auto_smb_probe_credentials.patch @@ -0,0 +1,37 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 080_auto_smb_probe_credentials.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/auto.smb .A/samples/auto.smb +--- .B/samples/auto.smb 2007-01-07 21:36:36.000000000 +0000 ++++ .A/samples/auto.smb 2007-01-07 21:36:37.000000000 +0000 +@@ -5,7 +5,9 @@ + # This file must be executable to work! chmod 755! + + key="$1" +-opts="-fstype=cifs" ++mountopts="-fstype=cifs" ++smbopts="" ++credfile="/etc/auto.smb.$key" + + for P in /bin /sbin /usr/bin /usr/sbin + do +@@ -18,7 +20,14 @@ + + [ -x $SMBCLIENT ] || exit 1 + +-$SMBCLIENT -gNL $key 2>/dev/null| awk -v key="$key" -v opts="$opts" -F'|' -- ' ++if [ -e $credfile ]; then ++ mountopts="$mountopts,credentials=$credfile" ++ smbopts="-A $credfile" ++else ++ smbopts="-N" ++fi ++ ++$SMBCLIENT $smbopts -gL $key 2>/dev/null| awk -v key="$key" -v opts="$mountopts" -F'|' -- ' + BEGIN { ORS=""; first=1 } + /Disk/ { if (first) { print opts; first=0 }; sub(/ /, "\\ ", $2); print " \\\n\t /" $2, "://" key "/" $2 } + END { if (!first) print "\n"; else exit 1 } diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/081_auto_net_showmount_quotes.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/081_auto_net_showmount_quotes.patch new file mode 100644 index 0000000..25d5ec8 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/081_auto_net_showmount_quotes.patch @@ -0,0 +1,19 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 081_auto_net_showmount_quotes.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/auto.net .A/samples/auto.net +--- .B/samples/auto.net 2007-01-07 21:36:36.000000000 +0000 ++++ .A/samples/auto.net 2007-01-07 21:36:37.000000000 +0000 +@@ -32,7 +32,7 @@ + done + done + +-[ -x $SMNT ] || exit 1 ++[ -x "$SMNT" ] || exit 1 + + # Newer distributions get this right + SHOWMOUNT="$SMNT --no-headers -e $key" diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/082_samples_makefile_typo.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/082_samples_makefile_typo.patch new file mode 100644 index 0000000..5667232 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/082_samples_makefile_typo.patch @@ -0,0 +1,18 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 082_samples_makefile_typo.dpatch +## +## DP: No description. + +@DPATCH@ + +diff -Naur .B/samples/Makefile .A/samples/Makefile +--- .B/samples/Makefile 2005-01-04 14:36:54.000000000 +0000 ++++ .A/samples/Makefile 2007-01-07 21:36:37.000000000 +0000 +@@ -42,6 +42,6 @@ + install -c autofs-ldap-auto-master -m 755 $(INSTALLROOT)$(autofslibdir) + endif + +-clean): ++clean: + rm -f *.o *.s autofs-ldap-auto-master rc.autofs + diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/083_clarify_program_map_outputsyntax.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/083_clarify_program_map_outputsyntax.patch new file mode 100644 index 0000000..e772b90 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/083_clarify_program_map_outputsyntax.patch @@ -0,0 +1,19 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 083_clarify_program_map_outputsyntax.dpatch +## +## DP: Explicitly mention that the queried key has to be omitted in the output of +## DP: program maps. + +@DPATCH@ +--- autofs-4.1.4+debian.orig/man/autofs.5 2007-06-30 00:29:12.000000000 +0200 ++++ autofs-4.1.4+debian/man/autofs.5 2007-06-30 00:30:27.000000000 +0200 +@@ -153,7 +153,8 @@ + .B program + map will be called as a script with the key as an argument. It may + return no lines of output if there's an error, or one or more lines +-containing a map (with \\ quoting line breaks). ++containing a map (starting with the second column, i.e. omitting the ++key, and quoting line breaks with \\). + .P + To use a + .B program diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/084_init_lsb_header.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/084_init_lsb_header.patch new file mode 100644 index 0000000..8a07693 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/084_init_lsb_header.patch @@ -0,0 +1,26 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 84_init_lsb_header.dpatch by +## +## DP: Add an LSB-conformant header to the initscript. + +@DPATCH@ + +--- autofs-4.1.4+debian/samples/rc.autofs.in.orig 2007-07-05 16:43:32.000000000 +0200 ++++ autofs-4.1.4+debian/samples/rc.autofs.in 2007-07-05 16:43:42.000000000 +0200 +@@ -9,6 +9,16 @@ + # On most distributions, this file should be called: + # /etc/rc.d/init.d/autofs or /etc/init.d/autofs + # ++### BEGIN INIT INFO ++# Provides: autofs ++# Required-Start: $local_fs ++# Required-Stop: $local_fs ++# Default-Start: 2 3 4 5 ++# Default-Stop: 0 1 6 ++# Short-Description: automount daemon ++# Description: daemon to mount (possibly remote) filesystems ++# automatically upon entering the mountpoint ++### END INIT INFO + + # For Redhat-ish systems + # diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/085_auto_net_lp111612.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/085_auto_net_lp111612.patch new file mode 100644 index 0000000..23e455b --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/085_auto_net_lp111612.patch @@ -0,0 +1,20 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 085-auto.net-lp111612 by Morten Kjeldgaard +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Fix problem with directories exported multiple times to different +## DP: hosts (LP: #111612). + +@DPATCH@ + +--- samples/auto.net 2008-04-09 16:32:59.000000000 +0200 ++++ foo/samples/auto.net 2008-04-09 16:34:29.000000000 +0200 +@@ -37,7 +37,7 @@ + # Newer distributions get this right + SHOWMOUNT="$SMNT --no-headers -e $key" + +-$SHOWMOUNT | LC_ALL=C sort -k 1 | \ ++$SHOWMOUNT | LC_ALL=C cut -d' ' -f1 | LC_ALL=C sort -k 1 | \ + awk -v key="$key" -v opts="$opts" -- ' + BEGIN { ORS=""; first=1 } + { if (first) { print opts; first=0 }; print " \\\n\t" $1, key ":" $1 } diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/Makefile.rules-cross.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/Makefile.rules-cross.patch new file mode 100644 index 0000000..1f9ea41 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/Makefile.rules-cross.patch @@ -0,0 +1,19 @@ +Index: autofs-4.1.4/Makefile.rules +=================================================================== +--- autofs-4.1.4.orig/Makefile.rules ++++ autofs-4.1.4/Makefile.rules +@@ -27,10 +27,10 @@ STRIP = : + #STRIP = strip --strip-debug + #endif + +-CC = gcc +-CXX = g++ +-CXXFLAGS = $(CFLAGS) +-LD = ld ++CC ?= gcc ++CXX ?= g++ ++CXXFLAGS ?= $(CFLAGS) ++LD ?= ld + SOLDFLAGS = -shared -Xlinker -rpath -Xlinker $(autofslibdir) + + # Standard rules diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.hotplug b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.hotplug new file mode 100644 index 0000000..67cf4c5 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.hotplug @@ -0,0 +1 @@ +* -fstype=auto,rw,sync :/dev/& diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.master b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.master new file mode 100644 index 0000000..41c2389 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.master @@ -0,0 +1,11 @@ +# +# $Id: auto.master,v 1.4 2005/01/04 14:36:54 raven Exp $ +# +# Sample auto.master file +# This is an automounter map and it has the following format +# key [ -mount-options-separated-by-comma ] location +# For details of the format look at autofs(5). +#/smb /etc/auto.smb +#/net /etc/auto.net +/autofs /etc/auto.hotplug +/media/net /etc/auto.network diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.network b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.network new file mode 100644 index 0000000..c1835d9 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/auto.network @@ -0,0 +1,2 @@ +# automatically generated by enigma 2 +# do NOT change manually! diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/autofs.default b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/autofs.default new file mode 100644 index 0000000..e8619eb --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/autofs.default @@ -0,0 +1,2 @@ +daemonoptions='--ghost' +TIMEOUT=5 diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/autofs.init b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/autofs.init new file mode 100755 index 0000000..c32d08e --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/autofs.init @@ -0,0 +1,803 @@ +#!/bin/sh +# +# $Id: rc.autofs.in,v 1.58 2005/04/11 11:30:54 raven Exp $ +# +# rc file for automount using a Sun-style "master map". +# We first look for a local /etc/auto.master, then a YP +# map with that name +# +# On most distributions, this file should be called: +# /etc/rc.d/init.d/autofs or /etc/init.d/autofs +# +### BEGIN INIT INFO +# Provides: autofs +# Required-Start: $local_fs +# Required-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: automount daemon +# Description: daemon to mount (possibly remote) filesystems +# automatically upon entering the mountpoint +### END INIT INFO + +# For Redhat-ish systems +# +# chkconfig: 345 28 72 +# processname: /usr/sbin/automount +# config: /etc/auto.master +# description: Automounts filesystems on demand + +# This is used in the Debian distribution to determine the proper +# location for the S- and K-links to this init file. +# The following value is extracted by debstd to figure out how to +# generate the postinst script. Edit the field to change the way the +# script is registered through update-rc.d (see the manpage for +# update-rc.d!) +# +FLAGS="defaults 21" + +# +# Location of the automount daemon and the init directory +# +DAEMON=/usr/sbin/automount +prog=`basename $DAEMON` +initdir=/etc/init.d + +test -e $DAEMON || exit 0 + +# +# Determine which kind of configuration we're using +# +system=debian +if [ -f /etc/redhat-release ]; then + system=redhat +fi + +if [ $system = redhat ]; then + . $initdir/functions +fi + +if [ $system = debian ]; then + thisscript="$0" + if [ ! -f "$thisscript" ]; then + echo "$0: Cannot find myself" 1>&2 + exit 1 + fi +fi + +PATH=/sbin:/usr/sbin:/bin:/usr/bin +export PATH + +# +# We can add local options here +# e.g. localoptions='rsize=8192,wsize=8192' +# +localoptions='' + +# +# Daemon options +# e.g. --timeout=60 +# +daemonoptions='' + +# +# load custom settings +# +if [ "$system" = "redhat" ]; then + LOCALOPTIONS="" + DAEMONOPTIONS="" + UNDERSCORETODOT=1 + DISABLE_DIRECT=1 + DAEMON_EXIT_WAIT=20 + + [ -f /etc/sysconfig/autofs ] && . /etc/sysconfig/autofs + + # Over-ride localoptions if set + if [ -n "$LOCALOPTIONS" ]; then + localoptions=$LOCALOPTIONS + fi + + # Over-ride daemonoptions if set + if [ -n "$DAEMONOPTIONS" ]; then + daemonoptions=$DAEMONOPTIONS + fi +elif [ "$system" = "debian" ]; then + TIMEOUT=300 + DISABLE_DIRECT=1 + DAEMON_EXIT_WAIT=20 + + [ -f /etc/default/autofs ] && . /etc/default/autofs + + daemonoptions="$daemonoptions --timeout=$TIMEOUT" +fi + +# +# Check for all maps that are to be loaded +# +getschemes() +{ + SOURCES=`grep ^automount: /etc/nsswitch.conf | \ + sed -e 's/^.*://' -e 's/\[.*\]/ /g'` + + if [ `echo $SOURCES | awk '{print NF}'` -gt 0 ] + then + echo ${SOURCES} + else + echo files + fi +} + +catnismap() +{ + if [ -z "$1" ] ; then + map="auto_master" + else + map="$1" + fi + + # Append the map's options at the _start_ if there are any options already + # (ie. myopt -> $2,myopt), otherwise just append them at the end. + if [ -z "$2" ]; then + /usr/bin/ypcat -k "$map" 2> /dev/null | sed -e '/^#/d' -e '/^$/d' + else + /usr/bin/ypcat -k "$map" 2> /dev/null | + sed -e '/^#/d' -e '/^$/d' \ + -e "s/^[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\)[ \t]\+-\([^ \t]\+\)/\1 \2 $2,\3/" \ + -e "s/^[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\)[ \t]*$/\1 \2 $2/" + fi +} + +getfilemounts() +{ + if [ -f /etc/auto.master ] ; then + cat /etc/auto.master | awk '{print $0}' | sed -e '/^#/d' -e '/^$/d' | ( + while read auto_master_in + do + if [ "`echo $auto_master_in | grep '^\+'`" = "" ]; then + echo $auto_master_in + else + cat /etc/auto.master | grep '^\+' | sed -e '/^#/d' -e '/^$/d' | ( + while read map options; do + catnismap `echo "$map" | sed -e 's/^\+//'` $options + done + ) + fi + done + ) + fi +} + +getnismounts() +{ + YPMAP=`catnismap auto.master` + if [ -z "$YPMAP" ]; then + catnismap + else + catnismap auto.master + fi +} + +getldapmounts() +{ + if [ -x /usr/lib/autofs/autofs-ldap-auto-master ]; then + [ ! -z $LDAPURI ] && export LDAPURI="$LDAPURI" + [ ! -z $LDAPBASE ] && export LDAPBASE="$LDAPBASE" + /usr/lib/autofs/autofs-ldap-auto-master 2> /dev/null + /usr/lib/autofs/autofs-ldap-auto-master -m automountMap \ + -e automount -n ou -k cn -v automountInformation 2> /dev/null + fi +} + +getrawmounts() +{ + for scheme in `getschemes` ; do + case "$scheme" in + files) + if [ -z "$filescheme" ] ; then + getfilemounts + filescheme=1 + export filescheme + fi + ;; + nis) + if [ -z "$nisscheme" ] ; then + getnismounts + nisscheme=1 + export nisscheme + fi + ;; + ldap*) + if [ -z "$ldapscheme" ] ; then + getldapmounts + ldapscheme=1 + export ldapscheme + fi + ;; + esac + done +} + + +# +# This function will build a list of automount commands to execute in +# order to activate all the mount points. It is used to figure out +# the difference of automount points in case of a reload +# +getmounts() +{ + local LC_ALL=C + export LC_ALL + knownmaps=" " + getrawmounts | ( + while read dir map options + do + # These checks screen out duplicates and skip over directories + # where the map is '-'. + # We can't do empty or direct host maps, so don't bother trying. + + # Strip trailing slashes from the dir line if it exists to aid + # in checking for duplicate maps + dir=`echo "$dir" | sed -e "s/\/*$//"` + + if [ ! -z "$map" -a "$map" = "-hosts" ] ; then + continue + fi + + if [ $DISABLE_DIRECT -eq 1 \ + -a x`echo $dir | grep -E "^/-"` != 'x' ] + then + continue + fi + + # If possible, canonicalise the path so it will always unmount + # cleanly. + link=`readlink -f "$dir"` + if [ ! -z "$link" ]; then + dir="$link" + fi + + # Do not include a map if it is a duplicate, maps on top of + # another map or another map, maps on top of it. + for knownmap in $knownmaps + do + if [ "`echo $dir/ | grep ^$knownmap`" != "" \ + -o "`echo $knownmap | grep ^$dir/`" != "" \] + then + continue 2 + fi + done + + if [ ! -z "$dir" -a ! -z "$map" \ + -a x`echo "$map" | cut -c1` != 'x-' ] + then + # If the options include a -t or --timeout, a -g or --ghost, + # a -v or --verbose or a -d or --debug paramter, then pull + # those particular options out. + : echo DAEMONOPTIONS OPTIONS $daemonoptions $options + startupoptions= + if echo "$options" | grep -qE -- '\B-(t\b|-timeout\b=)' ; + then + startupoptions="--timeout=$(echo $options |\ + sed 's/.*-\(t[^0-9]*\|-timeout\)[ \t=]*\([0-9][0-9]*\).*$/\2/g')" + elif echo "$daemonoptions" | grep -q -- '-t' ; + then + # It's okay to be sloppy with DAEMONOPTIONS as there is no + # possibility of conflicting with mount or map options. + startupoptions="--timeout=$(echo $daemonoptions | \ + sed 's/.*--*t\(imeout\)*[ \t=]*\([0-9][0-9]*\).*$/\2/g')" + fi + + # Check for the ghost option + if echo "$daemonoptions $options" | grep -qE -- '\B-(g\b|-ghost\b)' ; + then + startupoptions="$startupoptions --ghost" + fi + # Dont even deal with conflicts between --ghost and [no]browse + # Its just insane to configure things like that. + if echo "$options" | grep -qE -- '\B-browse\b' ; + then + startupoptions="$startupoptions --ghost" + fi + # Check for verbose + if echo "$daemonoptions $options" | \ + grep -qE -- '\B-(v\b|-verbose\b)' ; + then + startupoptions="$startupoptions --verbose" + fi + + # Check for debug + if echo "$daemonoptions $options" | \ + grep -qE -- '\B-(d\b|-debug\b)' ; + then + startupoptions="$startupoptions --debug" + fi + + # Other option flags are intended for maps. + mapoptions="$(echo "$daemonoptions $options" |\ + sed 's/-\(t[^0-9]*\|-timeout\)[ \t=]*\([0-9][0-9]*\)//g' | + sed 's/-\(g\b\|-ghost\b\)//g' | + sed 's/-\(v\b\|-verbose\b\)//g' | + sed 's/-\(d\b\|-debug\b\)//g' | + sed 's/-\b\(no\)\?browse\b//g')" + + # Break up the maptype and map, if the map type is specified + maptype=`echo $map | cut -f1 -d:` + # Handle degenerate map specifiers + if [ "$maptype" = "$map" ] ; then + if [ "$map" = "hesiod" -o "$map" = "userhome" -o "$map" = "ldap" ] ; then + maptype=$map + map= + elif [ "$map" = "multi" ] ; then + maptype=$map + map= +# elif echo "$map" | grep -q '^!'; then +# map=`echo "$map"| sed -e 's/^!//g'` + elif `echo $map | grep -q "^/"` && [ -x "$map" ]; then + maptype=program + elif [ -x "/etc/$map" ]; then + maptype=program + map=`echo /etc/$map | sed 's^//^/^g'` + elif `echo $map | grep -q "^/"` && [ -f "$map" ]; then + maptype=file + elif [ -f "/etc/$map" ]; then + maptype=file + map=`echo /etc/$map | sed 's^//^/^g'` + else + maptype=yp + if [ "$UNDERSCORETODOT" = "1" ] ; then + map=`basename $map | sed -e s/^auto_home/auto.home/ -e s/^auto_mnt/auto.mnt/` + else + map=`basename $map | sed 's^//^/^g'` + fi + fi + fi + map=`echo $map | cut -f2- -d:` + + : echo STARTUPOPTIONS $startupoptions + : echo DIR $dir + : echo MAPTYPE $maptype + : echo MAP $map + : echo MAPOPTIONS $mapoptions + : echo LOCALOPTIONS $localoptions + + NEWOPTIONS="" + for m in $mapoptions + do + if [ x"$m" = x"--" ]; then + NEWOPTIONS="$NEWOPTIONS $localoptions --" + else + NEWOPTIONS="$NEWOPTIONS $m" + fi + done + mapoptions=$NEWOPTIONS + + echo "$DAEMON $startupoptions $dir $maptype $map $mapoptions $localoptions" | sed -e 's/ / /g' -e 's/ */ /g' + + : echo ------------------------ + knownmaps=" $dir/ $knownmaps" + fi + done + ) +} + +# +# Status lister. +# +status() +{ + echo -e $"Configured Mount Points:\n------------------------" + getmounts + echo "" + echo -e $"Active Mount Points:\n--------------------" + ps axwww|grep "[0-9]:[0-9][0-9] $DAEMON " | ( + while read pid tt stat time command; do echo $command; done + ) +} + +get_command_from_pid() +{ + ps ax | grep "[0-9]:[0-9][0-9] $DAEMON " | ( + while read pid tt stat time command; do + if [ "$pid" = "$1" ] ; then + echo `echo "$command" | \ + sed 's/--pid-file.*\.pid/ /'` + return 0 + fi + done + ) + return 0 +} + +# return true if at least one pid is alive +alive() +{ + if [ -z "$*" ]; then + return 1 + fi + for i in $*; do + if kill -0 $i 2> /dev/null; then + return 0 + fi + done + + return 1 +} + +# +# Find pids of process group leaders +# +get_pgrp_pids() +{ + ps -eo pid,pgrp,cmd|grep $DAEMON|\ + awk '{print $1,$2}'|\ + while read pid pgrp + do + if [ $pid -eq $pgrp ] + then + echo $pid + fi + done +} + +# +# Signal each automount process group leader +# +signal_automounts() +{ + RETVAL=0 + pgrp_pids=`get_pgrp_pids` + for pid in $pgrp_pids + do + kill -USR2 $pid 2 > /dev/null + count=0 + while ps ax|grep -v grep|grep $pid >/dev/null + do + sleep 1 + count=$(expr $count + 1) + if [ $count -gt $DAEMON_EXIT_WAIT ]; then + break; + fi + done + done + + if [ -n "`pidof $DAEMON`" ] ; then + RETVAL=1 + fi + + return $RETVAL +} + +umount_loopback() +{ + loops=`LC_ALL=C awk '!/^#/ && $1 ~ /^\/dev\/loop/ && $2 != "/" {print $2}' /proc/mounts` + automounts=`LC_ALL=C awk '!/^#/ && $1 ~ /^automount/ {print $2}' /proc/mounts` + + for l in $loops + do + # If a loop device is mounted into a subdir of the automount point, + # umount it here. + for a in $automounts + do + match=`echo $l | grep -E "^$a[\$|/]" || true` + if [ -n "$match" ]; then + echo "" + echo -n $"Unmounting loopback filesystem $match: " + loopdev=`LC_ALL=C grep $l /proc/mounts | awk '{print $1}'` + umount -d $match + if [ $? -eq 0 ]; then + echo "done" + else + echo "failed ($?)" + fi + fi + done + done + + # If the loop device file exists under the automount point, umount + # it here. + loopmnts=`LC_ALL=C awk '!/^#/ && $1 ~ /^\/dev\/loop/ && $2 != "/" {print $1}' /proc/mounts` + for l in $loopmnts + do + loopmnt=`losetup $l | awk -F\( '{print $2}' | awk -F\) '{print $1}'` + for a in $automounts + do + match=`echo $loopmnt | grep -E "^$a[\$|/]" || true` + if [ -n "$match" ]; then + echo "" + echo -n $"Unmounting loopback filesystem $match: " + umount -d $match + if [ $? -eq 0 ]; then + echo "done" + else + echo "failed ($?)" + fi + fi + done + done +} + +# +# Redhat start/stop function. +# +redhat() +{ + +# +# See how we were called. +# +case "$1" in + start) + # Make sure the autofs filesystem type is available. + (grep -q autofs /proc/filesystems || /sbin/modprobe -k autofs4 || /sbin/modprobe -k autofs) 2> /dev/null + echo -n $"Starting $prog: " + TMP=`mktemp /tmp/autofs.XXXXXX` || { echo $"could not make temp file" >& 2; exit 1; } + getmounts | tee $TMP | sh + RETVAL=$? + if [ -s $TMP ] ; then + if [ $RETVAL -eq 0 ] ; then + success "$prog startup" + else + failure "$prog startup" + fi + [ $RETVAL = 0 ] && touch /var/lock/subsys/autofs + else + echo -n $"No Mountpoints Defined" + success "$prog startup" + fi + rm -f $TMP + echo + ;; + stop) + echo -n $"Stopping $prog:" + if [ -z "`pidofproc $prog`" -a -z "`getmounts`" ]; then + RETVAL=0 + else + umount_loopback + signal_automounts + RETVAL=$? + fi + count=0 + while [ -n "`/sbin/pidof $DAEMON`" -a $count -lt 10 ] ; do + killproc $DAEMON -USR2 >& /dev/null + RETVAL=$? + [ $RETVAL = 0 -a -z "`/sbin/pidof $DAEMON`" ] || sleep 3 + count=`expr $count + 1` + done + umount -a -f -t autofs + rm -f /var/lock/subsys/autofs + if [ -n "`/sbin/pidof $DAEMON`" ] ; then + failure "$prog shutdown" + else + success "$prog shutdown" + fi + echo + ;; + restart) + redhat stop + redhat start + ;; + reload) + if [ ! -f /var/lock/subsys/autofs ]; then + echo $"$prog not running" + RETVAL=1 + return + fi + echo $"Checking for changes to /etc/auto.master ...." + TMP1=`mktemp /tmp/autofs.XXXXXX` || { echo $"could not make temp file" >& 2; exit 1; } + TMP2=`mktemp /tmp/autofs.XXXXXX` || { echo $"could not make temp file" >& 2; exit 1; } + getmounts >$TMP1 + ps axwww|grep "[0-9]:[0-9][0-9] $DAEMON " | ( + while read pid tt stat time command; do + echo "$command" >>$TMP2 + if ! grep -q "^$command" $TMP1; then + if ! echo "$command" | grep -q -e --submount; then + kill -USR2 $pid 2> /dev/null + echo $"Stop $command" + fi + else + kill -HUP $pid 2> /dev/null + echo $"Reload map $command" + fi + done + ) + cat $TMP1 | ( while read x; do + if ! grep -q "^$x" $TMP2; then + $x + echo $"Start $x" + fi + done ) + rm -f $TMP1 $TMP2 + ;; + status) + status + ;; + condrestart) + [ -f /var/lock/subsys/autofs ] && redhat restart + RETVAL=0 + ;; + *) + echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}" + RETVAL=0 +esac +} + +# +# Debian start/stop functions. +# +debian() +{ + +case "$1" in +start) + echo -n 'Starting automounter:' + + # make sure autofs4 is loaded + if ! grep -q autofs /proc/filesystems + then + # autofs filesystem support not loaded + echo -n ' loading autofs4 kernel module,' + modprobe autofs4 || true + elif ([ -f /proc/modules ] && lsmod) | grep -q autofs[^4]; then + # wrong autofs filesystem module loaded + echo + echo "WARNING: autofs kernel module is loaded, autofs4 needed" + echo " for correct behaviour. You might experience mount failures." + fi + + # Check that maps exist + if [ -z "$(getrawmounts)" ] + then + echo " no automount maps defined." + exit 0 + fi + + # ensure pid file directory exists + if [ ! -e /var/run/autofs ] + then + mkdir /var/run/autofs + fi + + getmounts | while read cmd rest + do + mnt=`echo $rest | sed 's/^.* \(\/[^ ]*\) [A-Za-z].*$/\1/'` + pidfile=/var/run/autofs/`echo $mnt | sed 's,/,_,g'`.pid + + start-stop-daemon --start --pidfile $pidfile --quiet \ + --exec $DAEMON -- --pid-file=$pidfile $rest + + ret=$? + + if [ $ret -ne 0 ] + then + echo + echo " failed to start automount point $mnt" + fi + done + + echo " done." + ;; +stop) + echo -n 'Stopping automounter:' + + umount_loopback + + any=0 + for file in `ls /var/run/autofs/*.pid 2>/dev/null` + do + if [ -e "$file" ] + then + any=1 + pid=`head -n 1 $file` + mnt=`ps -wwo 'cmd=' $pid | sed -e \ + 's,.* --pid-file=/var/run/autofs/\([^ ]*\)\.pid.*,\1,; s,_,/,g'` + dname=`basename $DAEMON` + + start-stop-daemon --stop --quiet \ + --retry USR2/$DAEMON_EXIT_WAIT \ + --pidfile $file --name $dname + + ret=$? + + case $ret in + 0) +# echo -n " $mnt" + rm -f $file + ;; + 1) + echo -n -e "\n No process for automount $mnt" + rm -f $file + ;; + 2) + echo -n -e "\n Couldn't stop automount for $mnt" + ;; + *) + echo -n -e \ + "\n Strange start-stop-daemon exit status: $ret" + ;; + esac + fi + done + + echo " done." + ;; +reload) + echo "Reloading automounter: checking for changes ... " + + TMP1=`mktemp -t autofs.XXXXXX` + TMP2=`mktemp -t autofs.XXXXXX` + + getmounts >$TMP1 + + for i in `ls /var/run/autofs/*.pid 2>/dev/null` + do + pid=`head -n 1 $i 2>/dev/null` + [ "$pid" = "" ] && continue + + cmd=`get_command_from_pid $pid` + echo $cmd >>$TMP2 + + mnt=`ps -wwo 'cmd=' $pid | sed -e \ + 's,.* --pid-file=/var/run/autofs/\([^ ]*\)\.pid.*,\1,; s,_,/,g'` + + if ! grep -q "$cmd" $TMP1; then + echo "Stopping automounter for: $mnt" + kill -USR2 $pid 2> /dev/null + else + echo "Reloading automounter map for: $mnt" + kill -HUP $pid 2> /dev/null + fi + done + + cat $TMP1 | (while read x; do + if ! grep -q "^$x" $TMP2; then + echo $x | while read cmd rest; do + + mnt=`echo $rest | sed 's/^.* \(\/[^ ]*\) [A-Za-z].*$/\1/'` + pidfile=/var/run/autofs/`echo $mnt | sed 's,/,_,g'`.pid + + start-stop-daemon --start --pidfile $pidfile --quiet \ + --exec $DAEMON -- --pid-file=$pidfile $rest + + ret=$? + + if [ $ret -ne 0 ] + then + echo + echo " failed to start automount point $mnt" + else + echo "Started automounter: $mnt" + fi + done + fi + done) + + rm -f $TMP1 $TMP2 + ;; +force-reload|restart) + debian stop + debian start + ;; +status) + status + ;; +getmounts) + getmounts + ;; +active) + alive + ;; +*) + echo "Usage: $initdir/autofs {start|stop|restart|reload|status|getmounts|active}" >&2 + exit 1 + ;; +esac +} + +RETVAL=0 +if [ $system = debian ]; then + debian "$@" +elif [ $system = redhat ]; then + redhat "$@" +fi + +exit $RETVAL diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/cross.patch b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/cross.patch new file mode 100644 index 0000000..f27cc0a --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs-4.1.4/cross.patch @@ -0,0 +1,42 @@ +Index: autofs-4.1.4/aclocal.m4 +=================================================================== +--- autofs-4.1.4.orig/aclocal.m4 ++++ autofs-4.1.4/aclocal.m4 +@@ -9,6 +9,8 @@ dnl ------------------------------------ + AC_DEFUN(AF_PATH_INCLUDE, + [AC_PATH_PROGS($1,$2,$3,$4) + if test -n "$$1"; then ++ AH_TEMPLATE([HAVE_$1], [Have $2]) ++ AH_TEMPLATE([PATH_$1], [Have $2]) + AC_DEFINE(HAVE_$1,1,[define if you have $1]) + AC_DEFINE_UNQUOTED(PATH_$1, "$$1", [define if you have $1]) + HAVE_$1=1 +Index: autofs-4.1.4/configure.in +=================================================================== +--- autofs-4.1.4.orig/configure.in ++++ autofs-4.1.4/configure.in +@@ -135,12 +135,14 @@ AC_PROG_CC + cat > pietest.c < +d root root 0700 /var/run/autofs none diff --git a/meta-openvuplus/recipes-connectivity/autofs/autofs_4.1.4.bb b/meta-openvuplus/recipes-connectivity/autofs/autofs_4.1.4.bb new file mode 100644 index 0000000..f8d9bff --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/autofs/autofs_4.1.4.bb @@ -0,0 +1,80 @@ +SUMMARY = "kernel-based automounter for Linux" +SECTION = "base" +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=0636e73ff0215e8d672dc4c32c317bb3" +PR = "r10" + +SRC_URI = "${KERNELORG_MIRROR}/linux/daemons/autofs/v4/${BP}.tar.bz2 \ + file://020_auto_net_path_sortlocale_mountoptions.patch \ + file://037_let_debian_rules_decide_on_CFLAGS.patch \ + file://042_default_auto_master_all_commented_out.patch \ + file://060_non_replicated_ping.patch \ + file://061_multi_parse_fix.patch \ + file://062_fix_memory_leak.patch \ + file://063_misc_fixes.patch \ + file://064_support_options_on_nis_maps.patch \ + file://065_fix_master_map_in_ldap.patch \ + file://066_canonicalise_mount_points.patch \ + file://067_allow_disabling_bind_mounts.patch \ + file://067_ldap_no_first_message.patch \ + file://068_fix_invalid_rpcgen_code.patch \ + file://069_support_spaces_in_smb_share_names.patch \ + file://070_fix_regex_typo.patch \ + file://071_fix_ldap_mounts.patch \ + file://072_fix_auto_net_sort.patch \ + file://073_configurable_locking.patch \ + file://074_auto_smb_cifs.patch \ + file://075_auto_net_escape_hash.patch \ + file://076_ldap_deprecated.patch \ + file://078_locking_fix_1.patch \ + file://079_no_unlink_upstream.patch \ + file://080_auto_smb_probe_credentials.patch \ + file://081_auto_net_showmount_quotes.patch \ + file://082_samples_makefile_typo.patch \ + file://083_clarify_program_map_outputsyntax.patch \ + file://084_init_lsb_header.patch \ + file://085_auto_net_lp111612.patch \ + file://cross.patch \ + file://Makefile.rules-cross.patch \ + file://install.patch \ + file://no-bash.patch \ + file://auto.hotplug \ + file://auto.master \ + file://auto.network \ + file://autofs.default \ + file://autofs.init \ + file://volatiles.99_autofs \ +" +SRC_URI[md5sum] = "7e3949114c00665b4636f0c318179657" +SRC_URI[sha256sum] = "e25caa0e9639ea54dd7c4f21e8146ac9859a61fa126f397edf874b5fdc147430" + +S = "${WORKDIR}/${BP}" + +inherit autotools update-rc.d + +do_configure_prepend () { + if [ ! -e acinclude.m4 ]; then + cp aclocal.m4 acinclude.m4 + fi +} +do_install () { + oe_runmake 'INSTALLROOT=${D}' install + install -d ${D}${sysconfdir}/default + install -m 644 ${WORKDIR}/autofs.default ${D}${sysconfdir}/default/autofs + install -d ${D}${sysconfdir}/init.d + install -m 755 ${WORKDIR}/autofs.init ${D}${sysconfdir}/init.d/autofs + install -m 644 ${WORKDIR}/auto.hotplug ${D}${sysconfdir}/auto.hotplug + install -m 644 ${WORKDIR}/auto.master ${D}${sysconfdir}/auto.master + install -m 644 ${WORKDIR}/auto.network ${D}${sysconfdir}/auto.network + install -d ${D}${sysconfdir}/default/volatiles + install -m 644 ${WORKDIR}/volatiles.99_autofs ${D}${sysconfdir}/default/volatiles/99_autofs +} + +RDEPENDS_${PN} = "procps" + +INITSCRIPT_NAME = "autofs" +INITSCRIPT_PARAMS = "defaults" + +PARALLEL_MAKE = "" + +INSANE_SKIP_${PN} = "dev-so" diff --git a/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.3/defconfig b/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.3/defconfig new file mode 100644 index 0000000..1f3c6f4 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.3/defconfig @@ -0,0 +1,145 @@ +# Example hostapd build time configuration +# +# This file lists the configuration options that are used when building the +# hostapd binary. All lines starting with # are ignored. Configuration option +# lines must be commented out complete, if they are not to be included, i.e., +# just setting VARIABLE=n is not disabling that variable. +# +# This file is included in Makefile, so variables like CFLAGS and LIBS can also +# be modified from here. In most cass, these lines should use += in order not +# to override previous values of the variables. + +# Driver interface for Host AP driver +CONFIG_DRIVER_HOSTAP=y + +# Driver interface for wired authenticator +CONFIG_DRIVER_WIRED=y + +# Driver interface for madwifi driver +#CONFIG_DRIVER_MADWIFI=y +#CFLAGS += -I../../madwifi # change to the madwifi source directory + +# Driver interface for Prism54 driver +CONFIG_DRIVER_PRISM54=y + +# Driver interface for drivers using the nl80211 kernel interface +CONFIG_DRIVER_NL80211=y +CONFIG_LIBNL20=y +# driver_nl80211.c requires a rather new libnl (version 1.1) which may not be +# shipped with your distribution yet. If that is the case, you need to build +# newer libnl version and point the hostapd build to use it. +#LIBNL=/usr/src/libnl +#CFLAGS += -I$(LIBNL)/include +#LIBS += -L$(LIBNL)/lib + +# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver) +#CONFIG_DRIVER_BSD=y +#CFLAGS += -I/usr/local/include +#LIBS += -L/usr/local/lib + +# Driver interface for no driver (e.g., RADIUS server only) +#CONFIG_DRIVER_NONE=y + +# IEEE 802.11F/IAPP +CONFIG_IAPP=y + +# WPA2/IEEE 802.11i RSN pre-authentication +CONFIG_RSN_PREAUTH=y + +# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS) +CONFIG_PEERKEY=y + +# IEEE 802.11w (management frame protection) +# This version is an experimental implementation based on IEEE 802.11w/D1.0 +# draft and is subject to change since the standard has not yet been finalized. +# Driver support is also needed for IEEE 802.11w. +#CONFIG_IEEE80211W=y + +# Integrated EAP server +CONFIG_EAP=y + +# EAP-MD5 for the integrated EAP server +CONFIG_EAP_MD5=y + +# EAP-TLS for the integrated EAP server +CONFIG_EAP_TLS=y + +# EAP-MSCHAPv2 for the integrated EAP server +CONFIG_EAP_MSCHAPV2=y + +# EAP-PEAP for the integrated EAP server +CONFIG_EAP_PEAP=y + +# EAP-GTC for the integrated EAP server +CONFIG_EAP_GTC=y + +# EAP-TTLS for the integrated EAP server +CONFIG_EAP_TTLS=y + +# EAP-SIM for the integrated EAP server +#CONFIG_EAP_SIM=y + +# EAP-AKA for the integrated EAP server +#CONFIG_EAP_AKA=y + +# EAP-AKA' for the integrated EAP server +# This requires CONFIG_EAP_AKA to be enabled, too. +#CONFIG_EAP_AKA_PRIME=y + +# EAP-PAX for the integrated EAP server +#CONFIG_EAP_PAX=y + +# EAP-PSK for the integrated EAP server (this is _not_ needed for WPA-PSK) +#CONFIG_EAP_PSK=y + +# EAP-SAKE for the integrated EAP server +#CONFIG_EAP_SAKE=y + +# EAP-GPSK for the integrated EAP server +#CONFIG_EAP_GPSK=y +# Include support for optional SHA256 cipher suite in EAP-GPSK +#CONFIG_EAP_GPSK_SHA256=y + +# EAP-FAST for the integrated EAP server +# Note: Default OpenSSL package does not include support for all the +# functionality needed for EAP-FAST. If EAP-FAST is enabled with OpenSSL, +# the OpenSSL library must be patched (openssl-0.9.9-session-ticket.patch) +# to add the needed functions. +#CONFIG_EAP_FAST=y + +# Wi-Fi Protected Setup (WPS) +CONFIG_WPS=y +# Enable UPnP support for external WPS Registrars +#CONFIG_WPS_UPNP=y + +# EAP-IKEv2 +#CONFIG_EAP_IKEV2=y + +# Trusted Network Connect (EAP-TNC) +#CONFIG_EAP_TNC=y + +# PKCS#12 (PFX) support (used to read private key and certificate file from +# a file that usually has extension .p12 or .pfx) +CONFIG_PKCS12=y + +# RADIUS authentication server. This provides access to the integrated EAP +# server from external hosts using RADIUS. +CONFIG_RADIUS_SERVER=y + +# Build IPv6 support for RADIUS operations +CONFIG_IPV6=y + +# IEEE Std 802.11r-2008 (Fast BSS Transition) +#CONFIG_IEEE80211R=y + +# Use the hostapd's IEEE 802.11 authentication (ACL), but without +# the IEEE 802.11 Management capability (e.g., madwifi or FreeBSD/net80211) +CONFIG_DRIVER_RADIUS_ACL=y + +# IEEE 802.11n (High Throughput) support +CONFIG_IEEE80211N=y + +# Remove debugging code that is printing out debug messages to stdout. +# This can be used to reduce the size of the hostapd considerably if debugging +# code is not needed. +#CONFIG_NO_STDOUT_DEBUG=y diff --git a/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.3/init b/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.3/init new file mode 100644 index 0000000..79f74b6 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.3/init @@ -0,0 +1,37 @@ +#!/bin/sh +DAEMON=/usr/sbin/hostapd +NAME=hostapd +DESC="HOSTAP Daemon" +ARGS="/etc/hostapd.conf -B" + +test -f $DAEMON || exit 0 + +set -e + +case "$1" in + start) + echo -n "Starting $DESC: " + start-stop-daemon -S -x $DAEMON -- $ARGS + echo "$NAME." + ;; + stop) + echo -n "Stopping $DESC: " + start-stop-daemon -K -x $DAEMON + echo "$NAME." + ;; + restart) + $0 stop + $0 start + ;; + reload) + echo -n "Reloading $DESC: " + killall -HUP $(basename ${DAEMON}) + echo "$NAME." + ;; + *) + echo "Usage: $0 {start|stop|restart|reload}" + exit 1 + ;; +esac + +exit 0 diff --git a/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.inc b/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.inc new file mode 100644 index 0000000..0eb678a --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon-0.7.inc @@ -0,0 +1,25 @@ +HOMEPAGE = "http://hostap.epitest.fi" +SECTION = "kernel/userland" +PRIORITY = "optional" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${WORKDIR}/hostapd-0.7.3/COPYING;md5=c54ce9345727175ff66d17b67ff51f58" +DEPENDS = "libnl openssl" + +inherit update-rc.d +INITSCRIPT_NAME="hostapd" + +do_configure() { + install -m 0644 ${WORKDIR}/defconfig ${S}/.config +} + +do_compile() { + make +} + +do_install() { + install -d ${D}${sbindir} ${D}${sysconfdir}/init.d + install -m 0755 ${S}/hostapd ${D}${sbindir} + install -m 0755 ${S}/hostapd_cli ${D}${sbindir} + install -m 755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/hostapd +} + diff --git a/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon_0.7.3.bb b/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon_0.7.3.bb new file mode 100644 index 0000000..99297a9 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/hostap/hostap-daemon_0.7.3.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "User space daemon for extended IEEE 802.11 management" + +require hostap-daemon-0.7.inc + +PR = "r4" + +DEFAULT_PREFERENCE = "-1" + +SRC_URI = "http://hostap.epitest.fi/releases/hostapd-${PV}.tar.gz \ + file://defconfig \ + file://init" +SRC_URI[md5sum] = "91a7c8d0f090b7104152d3455a84c112" +SRC_URI[sha256sum] = "31eb2781f37e1a4c27969d1594f8019c0ca87779349c099ab812833289961567" + +S = "${WORKDIR}/hostapd-${PV}/hostapd" + + diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/configure-targets.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/configure-targets.patch new file mode 100644 index 0000000..2317949 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/configure-targets.patch @@ -0,0 +1,25 @@ +Upstream-Status: Inappropriate [embedded specific] + +The number of colons are important :) + +Index: openssl-0.9.8g/Configure +=================================================================== +--- openssl-0.9.8g.orig/Configure 2008-04-12 04:27:22.000000000 +0200 ++++ openssl-0.9.8g/Configure 2008-04-12 04:38:56.000000000 +0200 +@@ -395,6 +395,16 @@ + "linux-alpha-ccc","ccc:-fast -readonly_strings -DL_ENDIAN -DTERMIO::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${no_asm}", + "linux-alpha+bwx-ccc","ccc:-fast -readonly_strings -DL_ENDIAN -DTERMIO::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${no_asm}", + ++ # Linux on ARM ++"linux-elf-arm","$ENV{'CC'}:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-elf-armeb","$ENV{'CC'}:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-gnueabi-arm","$ENV{'CC'}:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-gnueabi-armeb","$ENV{'CC'}:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-uclibceabi-arm","$ENV{'CC'}:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-uclibceabi-armeb","$ENV{'CC'}:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++ ++"linux-avr32","$ENV{'CC'}:-DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).", ++ + #### *BSD [do see comment about ${BSDthreads} above!] + "BSD-generic32","gcc:-DTERMIOS -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", + "BSD-x86", "gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_out_asm}:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/ca.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/ca.patch new file mode 100644 index 0000000..aba4d42 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/ca.patch @@ -0,0 +1,22 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8m/apps/CA.pl.in +=================================================================== +--- openssl-0.9.8m.orig/apps/CA.pl.in 2006-04-28 00:28:51.000000000 +0000 ++++ openssl-0.9.8m/apps/CA.pl.in 2010-02-27 00:36:51.000000000 +0000 +@@ -65,6 +65,7 @@ + foreach (@ARGV) { + if ( /^(-\?|-h|-help)$/ ) { + print STDERR "usage: CA -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify\n"; ++ print STDERR "usage: CA -signcert certfile keyfile|-newcert|-newreq|-newca|-sign|-verify\n"; + exit 0; + } elsif (/^-newcert$/) { + # create a certificate +@@ -165,6 +166,7 @@ + } else { + print STDERR "Unknown arg $_\n"; + print STDERR "usage: CA -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify\n"; ++ print STDERR "usage: CA -signcert certfile keyfile|-newcert|-newreq|-newca|-sign|-verify\n"; + exit 1; + } + } diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/config-hurd.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/config-hurd.patch new file mode 100644 index 0000000..2359d15 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/config-hurd.patch @@ -0,0 +1,17 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/config +=================================================================== +--- openssl-0.9.8k.orig/config 2009-02-16 09:43:41.000000000 +0100 ++++ openssl-0.9.8k/config 2009-07-19 11:32:41.000000000 +0200 +@@ -162,8 +162,8 @@ + echo "${MACHINE}-whatever-linux1"; exit 0 + ;; + +- GNU*) +- echo "hurd-x86"; exit 0; ++ GNU:*|GNU/*:*) ++ echo "${MACHINE}-gnuish"; exit 0; + ;; + + LynxOS:*) diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/debian-targets.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/debian-targets.patch new file mode 100644 index 0000000..5720988 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/debian-targets.patch @@ -0,0 +1,56 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/Configure +=================================================================== +--- openssl-0.9.8k.orig/Configure 2009-12-09 16:09:41.000000000 +0000 ++++ openssl-0.9.8k/Configure 2009-12-09 16:09:55.000000000 +0000 +@@ -320,6 +320,49 @@ + "osf1-alpha-cc", "cc:-std1 -tune host -O4 -readonly_strings::(unknown):::SIXTY_FOUR_BIT_LONG RC4_CHUNK:${no_asm}:dlfcn:alpha-osf1-shared:::.so", + "tru64-alpha-cc", "cc:-std1 -tune host -fast -readonly_strings::-pthread:::SIXTY_FOUR_BIT_LONG RC4_CHUNK:${no_asm}:dlfcn:alpha-osf1-shared::-msym:.so", + ++# Debian GNU/* (various architectures) ++"debian-alpha","gcc:-DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-alpha-ev4","gcc:-DTERMIO -O3 -Wa,--noexecstack -mcpu=ev4 -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-alpha-ev5","gcc:-DTERMIO -O3 -Wa,--noexecstack -mcpu=ev5 -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-arm","gcc:-DL_ENDIAN -DTERMIO -O2 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-armeb","gcc:-DB_ENDIAN -DTERMIO -O2 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-armel","gcc:-DL_ENDIAN -DTERMIO -O2 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++#"debian-amd64","gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-amd64", "gcc:-m64 -DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK RC4_CHAR BF_PTR2 DES_INT DES_UNROLL:${x86_64_asm_linux}:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-avr32", "gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG_BF_PTR::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-kfreebsd-amd64","gcc:-m64 -DL_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -Wall -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK BF_PTR2 DES_INT DES_UNROLL:${x86_64_asm}:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++#"debian-freebsd-alpha","gcc:-DTERMIOS -O -Wa,--noexecstack -fomit-frame-pointer::(unknown):::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC2::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-kfreebsd-i386","gcc:-DL_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -march=i486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-hppa","gcc:-DB_ENDIAN -DTERMIO -O2 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG MD2_CHAR RC4_INDEX::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-hurd-i386","gcc:-DL_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -mtune=i486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-ia64","gcc:-DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK RC4_CHAR:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++#"debian-i386","gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:linux-shared:-fPIC", ++"debian-i386","gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-i386-i486","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i486 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-i386-i586","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i586 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-i386-i686/cmov","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i686 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-m68k","gcc:-DB_ENDIAN -DTERMIO -O2 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG MD2_CHAR RC4_INDEX::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-mips", "gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL DES_RISC2::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-mipsel", "gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL DES_RISC2::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-netbsd-i386", "gcc:-DL_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -m486 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-netbsd-m68k", "gcc:-DB_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -Wall::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL::::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-netbsd-sparc", "gcc:-DB_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -mv8 -Wall::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL::::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-openbsd-alpha","gcc:-DTERMIOS -O3 -Wa,--noexecstack -g::(unknown):::SIXTY_FOUR_BIT_LONG DES_INT DES_PTR DES_RISC2::::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-openbsd-i386", "gcc:-DL_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -m486::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_out_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-openbsd-mips","gcc:-O2 -Wa,--noexecstack -g -DL_ENDIAN::(unknown)::BN_LLONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC2 DES_PTR BF_PTR:::::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-powerpc","gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_UNROLL DES_RISC2 DES_PTR MD2_CHAR RC4_INDEX::linux_ppc32.o::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-ppc64","gcc:-m64 -DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL::linux_ppc64.o::::::::::dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-s390","gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-sh3", "gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-sh4", "gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-sh3eb", "gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-sh4eb", "gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-m32r","gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-sparc","gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-sparc-v8","gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -mcpu=v8 -g -Wall -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::sparcv8.o:des_enc-sparc.o fcrypt_b.o:::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-sparc-v9","gcc:-DB_ENDIAN -DTERMIO -O3 -mcpu=v9 -Wa,--noexecstack -Wa,-Av8plus -g -Wall -DULTRASPARC -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::sparcv8plus.o:des_enc-sparc.o fcrypt_b.o:::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"debian-sparc64","gcc:-m64 -DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall -DULTRASPARC -DBN_DIV2W::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR:::des_enc-sparc.o fcrypt_b.o:::::::::dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++ + #### + #### Variety of LINUX:-) + #### diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/engines-path.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/engines-path.patch new file mode 100644 index 0000000..5b4c7d5 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/engines-path.patch @@ -0,0 +1,49 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8m/Makefile.org +=================================================================== +--- openssl-0.9.8m.orig/Makefile.org 2010-01-27 16:06:36.000000000 +0000 ++++ openssl-0.9.8m/Makefile.org 2010-02-27 00:43:04.000000000 +0000 +@@ -620,7 +620,7 @@ + install_sw: + @$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ + $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR) \ +- $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines \ ++ $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/ssl/engines \ + $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig \ + $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl \ + $(INSTALL_PREFIX)$(OPENSSLDIR)/misc \ +Index: openssl-0.9.8m/engines/Makefile +=================================================================== +--- openssl-0.9.8m.orig/engines/Makefile 2009-11-10 01:53:02.000000000 +0000 ++++ openssl-0.9.8m/engines/Makefile 2010-02-27 00:45:03.000000000 +0000 +@@ -101,13 +101,13 @@ + *DSO_DL*) sfx="sl";; \ + *) sfx="bad";; \ + esac; \ +- cp lib$$l.$$sfx $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx.new; \ ++ cp lib$$l.$$sfx $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/ssl/engines/lib$$l.$$sfx.new; \ + else \ + sfx="so"; \ + cp cyg$$l.dll $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx.new; \ + fi; \ +- chmod 555 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx.new; \ +- mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx ); \ ++ chmod 555 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/ssl/engines/lib$$l.$$sfx.new; \ ++ mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/ssl/engines/lib$$l.$$sfx.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx ); \ + done; \ + fi + +Index: openssl-0.9.8m/Configure +=================================================================== +--- openssl-0.9.8m.orig/Configure 2010-02-27 00:40:42.000000000 +0000 ++++ openssl-0.9.8m/Configure 2010-02-27 00:46:47.000000000 +0000 +@@ -1738,7 +1738,7 @@ + # $foo is to become "$prefix/lib$multilib/engines"; + # as Makefile.org and engines/Makefile are adapted for + # $multilib suffix. +- my $foo = "$prefix/lib/engines"; ++ my $foo = "$prefix/lib/ssl/engines"; + $foo =~ s/\\/\\\\/g; + print OUT "#define ENGINESDIR \"$foo\"\n"; + } diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/kfreebsd-pipe.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/kfreebsd-pipe.patch new file mode 100644 index 0000000..b0312f3 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/kfreebsd-pipe.patch @@ -0,0 +1,15 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/crypto/perlasm/x86_64-xlate.pl +=================================================================== +--- openssl-0.9.8k.orig/crypto/perlasm/x86_64-xlate.pl 2008-02-13 21:01:48.000000000 +0100 ++++ openssl-0.9.8k/crypto/perlasm/x86_64-xlate.pl 2009-07-19 11:37:23.000000000 +0200 +@@ -62,7 +62,7 @@ + my ($outdev,$outino,@junk)=stat($output); + + open STDOUT,">$output" || die "can't open $output: $!" +- if ($stddev!=$outdev || $stdino!=$outino); ++# if ($stddev!=$outdev || $stdino!=$outino); + } + + my $masmref=8 + 50727*2**-32; # 8.00.50727 shipped with VS2005 diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/make-targets.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/make-targets.patch new file mode 100644 index 0000000..91207d8 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/make-targets.patch @@ -0,0 +1,15 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/Makefile.org +=================================================================== +--- openssl-0.9.8k.orig/Makefile.org 2009-07-19 11:32:41.000000000 +0200 ++++ openssl-0.9.8k/Makefile.org 2009-07-19 11:37:31.000000000 +0200 +@@ -131,7 +131,7 @@ + + BASEADDR= + +-DIRS= crypto fips ssl engines apps test tools ++DIRS= crypto fips ssl engines apps tools + SHLIBDIRS= crypto ssl fips + + # dirs in crypto to build diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/man-dir.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/man-dir.patch new file mode 100644 index 0000000..358f8cd --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/man-dir.patch @@ -0,0 +1,15 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/Makefile.org +=================================================================== +--- openssl-0.9.8k.orig/Makefile.org 2009-07-19 11:32:41.000000000 +0200 ++++ openssl-0.9.8k/Makefile.org 2009-07-19 11:37:29.000000000 +0200 +@@ -152,7 +152,7 @@ + + MAKEFILE= Makefile + +-MANDIR=$(OPENSSLDIR)/man ++MANDIR=/usr/share/man + MAN1=1 + MAN3=3 + MANSUFFIX= diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/man-section.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/man-section.patch new file mode 100644 index 0000000..b74b12e --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/man-section.patch @@ -0,0 +1,34 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/Makefile.org +=================================================================== +--- openssl-0.9.8k.orig/Makefile.org 2009-07-19 11:34:06.000000000 +0200 ++++ openssl-0.9.8k/Makefile.org 2009-07-19 11:37:21.000000000 +0200 +@@ -155,7 +155,8 @@ + MANDIR=/usr/share/man + MAN1=1 + MAN3=3 +-MANSUFFIX= ++MANSUFFIX=ssl ++MANSECTION=SSL + SHELL=/bin/sh + + TOP= . +@@ -694,7 +695,7 @@ + echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ + (cd `$(PERL) util/dirname.pl $$i`; \ + sh -c "$$pod2man \ +- --section=$$sec --center=OpenSSL \ ++ --section=$${sec}$(MANSECTION) --center=OpenSSL \ + --release=$(VERSION) `basename $$i`") \ + > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ + $(PERL) util/extract-names.pl < $$i | \ +@@ -711,7 +712,7 @@ + echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ + (cd `$(PERL) util/dirname.pl $$i`; \ + sh -c "$$pod2man \ +- --section=$$sec --center=OpenSSL \ ++ --section=$${sec}$(MANSECTION) --center=OpenSSL \ + --release=$(VERSION) `basename $$i`") \ + > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ + $(PERL) util/extract-names.pl < $$i | \ diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/no-rpath.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/no-rpath.patch new file mode 100644 index 0000000..53b7614 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/no-rpath.patch @@ -0,0 +1,15 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/Makefile.shared +=================================================================== +--- openssl-0.9.8k.orig/Makefile.shared 2008-09-17 17:56:40.000000000 +0200 ++++ openssl-0.9.8k/Makefile.shared 2009-07-19 11:37:25.000000000 +0200 +@@ -151,7 +151,7 @@ + NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ + SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX" + +-DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)" ++DO_GNU_APP=LDFLAGS="$(CFLAGS)" + + #This is rather special. It's a special target with which one can link + #applications without bothering with any features that have anything to diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/no-symbolic.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/no-symbolic.patch new file mode 100644 index 0000000..87eadac --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/no-symbolic.patch @@ -0,0 +1,15 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/Makefile.shared +=================================================================== +--- openssl-0.9.8k.orig/Makefile.shared 2009-07-19 11:35:02.000000000 +0200 ++++ openssl-0.9.8k/Makefile.shared 2009-07-19 11:35:48.000000000 +0200 +@@ -149,7 +149,7 @@ + SHLIB_SUFFIX=; \ + ALLSYMSFLAGS='-Wl,--whole-archive'; \ + NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ +- SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX" ++ SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX" + + DO_GNU_APP=LDFLAGS="$(CFLAGS)" + diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/perl-path.diff b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/perl-path.diff new file mode 100644 index 0000000..ced45a3 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/perl-path.diff @@ -0,0 +1,762 @@ +Upstream-Status: Backport [debian] + +From: Kurt Roeckx +Subject: Change the perl path's to /usr/bin/perl + +This is the result of running: +perl util/perlpath.pl /usr/bin + +The upstream sources have this set to various different paths. + +--- openssl-0.9.8m.orig/Configure ++++ openssl-0.9.8m/Configure +@@ -1,4 +1,4 @@ +-: ++#!/usr/bin/perl + eval 'exec perl -S $0 ${1+"$@"}' + if $running_under_some_shell; + ## +--- openssl-0.9.8m.orig/VMS/VMSify-conf.pl ++++ openssl-0.9.8m/VMS/VMSify-conf.pl +@@ -1,4 +1,4 @@ +-#! /usr/bin/perl ++#!/usr/bin/perl + + use strict; + use warnings; +--- openssl-0.9.8m.orig/Netware/do_tests.pl ++++ openssl-0.9.8m/Netware/do_tests.pl +@@ -1,4 +1,4 @@ +-# perl script to run OpenSSL tests ++#!/usr/bin/perl + + + my $base_path = "\\openssl"; +--- openssl-0.9.8m.orig/apps/progs.pl ++++ openssl-0.9.8m/apps/progs.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + print "/* apps/progs.h */\n"; + print "/* automatically generated by progs.pl for openssl.c */\n\n"; +--- openssl-0.9.8m.orig/os2/backwardify.pl ++++ openssl-0.9.8m/os2/backwardify.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/perl -w ++#!/usr/bin/perl + use strict; + + # Use as $0 +--- openssl-0.9.8m.orig/times/091/mips-rel.pl ++++ openssl-0.9.8m/times/091/mips-rel.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + &doit(100,"Pentium 100 32",0.0195,0.1000,0.6406,4.6100); # pentium-100 + &doit(200,"PPro 200 32",0.0070,0.0340,0.2087,1.4700); # pentium-100 +--- openssl-0.9.8m.orig/fips/mkfipsscr.pl ++++ openssl-0.9.8m/fips/mkfipsscr.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + # Quick & dirty utility to generate a script for executing the + # FIPS 140-2 CMVP algorithm tests based on the pathnames of + # input algorithm test files actually present (the unqualified +--- openssl-0.9.8m.orig/fips/fipsalgtest.pl ++++ openssl-0.9.8m/fips/fipsalgtest.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/perl -w ++#!/usr/bin/perl + # Perl utility to run or verify FIPS 140-2 CMVP algorithm tests based on the + # pathnames of input algorithm test files actually present (the unqualified + # file names are consistent but the pathnames are not). +--- openssl-0.9.8m.orig/ms/uplink.pl ++++ openssl-0.9.8m/ms/uplink.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # + # For Microsoft CL this is implemented as inline assembler. So that + # even though this script can generate even Win32 code, we'll be +--- openssl-0.9.8m.orig/ms/segrenam.pl ++++ openssl-0.9.8m/ms/segrenam.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + + my $quiet = 1; + +--- openssl-0.9.8m.orig/ms/cmp.pl ++++ openssl-0.9.8m/ms/cmp.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + ($#ARGV == 1) || die "usage: cmp.pl \n"; + +--- openssl-0.9.8m.orig/test/cms-test.pl ++++ openssl-0.9.8m/test/cms-test.pl +@@ -1,4 +1,4 @@ +-# test/cms-test.pl ++#!/usr/bin/perl + # Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + # project. + # +--- openssl-0.9.8m.orig/test/cms-examples.pl ++++ openssl-0.9.8m/test/cms-examples.pl +@@ -1,4 +1,4 @@ +-# test/cms-examples.pl ++#!/usr/bin/perl + # Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + # project. + # +--- openssl-0.9.8m.orig/demos/b64.pl ++++ openssl-0.9.8m/demos/b64.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # + # Make PEM encoded data have lines of 64 bytes of data +--- openssl-0.9.8m.orig/demos/tunala/configure.in ++++ openssl-0.9.8m/demos/tunala/configure.in +@@ -1,4 +1,4 @@ +-dnl Process this file with autoconf to produce a configure script. ++#!/usr/bin/perl + AC_INIT(tunala.c) + AM_CONFIG_HEADER(config.h) + AM_INIT_AUTOMAKE(tunala, 0.0.1-dev) +--- openssl-0.9.8m.orig/crypto/x86cpuid.pl ++++ openssl-0.9.8m/crypto/x86cpuid.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + + push(@INC,"perlasm"); + require "x86asm.pl"; +--- openssl-0.9.8m.orig/crypto/x86_64cpuid.pl ++++ openssl-0.9.8m/crypto/x86_64cpuid.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + + $output=shift; + $masm=1 if ($output =~ /\.asm/); +--- openssl-0.9.8m.orig/crypto/md5/asm/md5-586.pl ++++ openssl-0.9.8m/crypto/md5/asm/md5-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # Normal is the + # md5_block_x86(MD5_CTX *c, ULONG *X); +--- openssl-0.9.8m.orig/crypto/md5/asm/md5-x86_64.pl ++++ openssl-0.9.8m/crypto/md5/asm/md5-x86_64.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/perl -w ++#!/usr/bin/perl + # + # MD5 optimized for AMD64. + # +--- openssl-0.9.8m.orig/crypto/sha/asm/sha1-ia64.pl ++++ openssl-0.9.8m/crypto/sha/asm/sha1-ia64.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # + # ==================================================================== + # Written by Andy Polyakov for the OpenSSL +--- openssl-0.9.8m.orig/crypto/sha/asm/sha1-x86_64.pl ++++ openssl-0.9.8m/crypto/sha/asm/sha1-x86_64.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # + # ==================================================================== + # Written by Andy Polyakov for the OpenSSL +--- openssl-0.9.8m.orig/crypto/sha/asm/sha512-sse2.pl ++++ openssl-0.9.8m/crypto/sha/asm/sha512-sse2.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # + # ==================================================================== + # Written by Andy Polyakov for the OpenSSL +--- openssl-0.9.8m.orig/crypto/sha/asm/sha512-ia64.pl ++++ openssl-0.9.8m/crypto/sha/asm/sha512-ia64.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # + # ==================================================================== + # Written by Andy Polyakov for the OpenSSL +--- openssl-0.9.8m.orig/crypto/sha/asm/sha512-x86_64.pl ++++ openssl-0.9.8m/crypto/sha/asm/sha512-x86_64.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # + # ==================================================================== + # Written by Andy Polyakov for the OpenSSL +--- openssl-0.9.8m.orig/crypto/sha/asm/sha1-586.pl ++++ openssl-0.9.8m/crypto/sha/asm/sha1-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + + # ==================================================================== + # [Re]written by Andy Polyakov for the OpenSSL +--- openssl-0.9.8m.orig/crypto/des/asm/des-586.pl ++++ openssl-0.9.8m/crypto/des/asm/des-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # The inner loop instruction sequence and the IP/FP modifications are from + # Svend Olaf Mikkelsen +--- openssl-0.9.8m.orig/crypto/des/asm/desboth.pl ++++ openssl-0.9.8m/crypto/des/asm/desboth.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + $L="edi"; + $R="esi"; +--- openssl-0.9.8m.orig/crypto/des/asm/des686.pl ++++ openssl-0.9.8m/crypto/des/asm/des686.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + $prog="des686.pl"; + +--- openssl-0.9.8m.orig/crypto/des/asm/crypt586.pl ++++ openssl-0.9.8m/crypto/des/asm/crypt586.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # The inner loop instruction sequence and the IP/FP modifications are from + # Svend Olaf Mikkelsen +--- openssl-0.9.8m.orig/crypto/lhash/num.pl ++++ openssl-0.9.8m/crypto/lhash/num.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + #node 10 -> 4 + +--- openssl-0.9.8m.orig/crypto/ripemd/asm/rmd-586.pl ++++ openssl-0.9.8m/crypto/ripemd/asm/rmd-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # Normal is the + # ripemd160_block_asm_data_order(RIPEMD160_CTX *c, ULONG *X,int blocks); +--- openssl-0.9.8m.orig/crypto/rc4/asm/rc4-586.pl ++++ openssl-0.9.8m/crypto/rc4/asm/rc4-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # At some point it became apparent that the original SSLeay RC4 + # assembler implementation performs suboptimaly on latest IA-32 +--- openssl-0.9.8m.orig/crypto/rc4/asm/rc4-x86_64.pl ++++ openssl-0.9.8m/crypto/rc4/asm/rc4-x86_64.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # + # ==================================================================== + # Written by Andy Polyakov for the OpenSSL +--- openssl-0.9.8m.orig/crypto/cast/asm/cast-586.pl ++++ openssl-0.9.8m/crypto/cast/asm/cast-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # define for pentium pro friendly version + $ppro=1; +--- openssl-0.9.8m.orig/crypto/rc5/asm/rc5-586.pl ++++ openssl-0.9.8m/crypto/rc5/asm/rc5-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + push(@INC,"perlasm","../../perlasm"); + require "x86asm.pl"; +--- openssl-0.9.8m.orig/crypto/perlasm/x86ms.pl ++++ openssl-0.9.8m/crypto/perlasm/x86ms.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + package x86ms; + +--- openssl-0.9.8m.orig/crypto/perlasm/x86asm.pl ++++ openssl-0.9.8m/crypto/perlasm/x86asm.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # require 'x86asm.pl'; + # &asm_init("cpp","des-586.pl"); +--- openssl-0.9.8m.orig/crypto/perlasm/x86nasm.pl ++++ openssl-0.9.8m/crypto/perlasm/x86nasm.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + package x86nasm; + +--- openssl-0.9.8m.orig/crypto/perlasm/x86unix.pl ++++ openssl-0.9.8m/crypto/perlasm/x86unix.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + package x86unix; # GAS actually... + +--- openssl-0.9.8m.orig/crypto/perlasm/cbc.pl ++++ openssl-0.9.8m/crypto/perlasm/cbc.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # void des_ncbc_encrypt(input, output, length, schedule, ivec, enc) + # des_cblock (*input); +--- openssl-0.9.8m.orig/crypto/perlasm/x86_64-xlate.pl ++++ openssl-0.9.8m/crypto/perlasm/x86_64-xlate.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + + # Ascetic x86_64 AT&T to MASM assembler translator by . + # +--- openssl-0.9.8m.orig/crypto/bf/asm/bf-686.pl ++++ openssl-0.9.8m/crypto/bf/asm/bf-686.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + push(@INC,"perlasm","../../perlasm"); + require "x86asm.pl"; +--- openssl-0.9.8m.orig/crypto/bf/asm/bf-586.pl ++++ openssl-0.9.8m/crypto/bf/asm/bf-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + push(@INC,"perlasm","../../perlasm"); + require "x86asm.pl"; +--- openssl-0.9.8m.orig/crypto/objects/objects.pl ++++ openssl-0.9.8m/crypto/objects/objects.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + open (NUMIN,"$ARGV[1]") || die "Can't open number file $ARGV[1]"; + $max_nid=0; +--- openssl-0.9.8m.orig/crypto/objects/obj_dat.pl ++++ openssl-0.9.8m/crypto/objects/obj_dat.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # fixes bug in floating point emulation on sparc64 when + # this script produces off-by-one output on sparc64 +--- openssl-0.9.8m.orig/crypto/conf/keysets.pl ++++ openssl-0.9.8m/crypto/conf/keysets.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + $NUMBER=0x01; + $UPPER=0x02; +--- openssl-0.9.8m.orig/crypto/bn/bn_prime.pl ++++ openssl-0.9.8m/crypto/bn/bn_prime.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # bn_prime.pl + + $num=2048; +--- openssl-0.9.8m.orig/crypto/bn/asm/x86.pl ++++ openssl-0.9.8m/crypto/bn/asm/x86.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + push(@INC,"perlasm","../../perlasm"); + require "x86asm.pl"; +--- openssl-0.9.8m.orig/crypto/bn/asm/ppc.pl ++++ openssl-0.9.8m/crypto/bn/asm/ppc.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # + # Implemented as a Perl wrapper as we want to support several different + # architectures with single file. We pick up the target based on the +--- openssl-0.9.8m.orig/crypto/bn/asm/co-586.pl ++++ openssl-0.9.8m/crypto/bn/asm/co-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + push(@INC,"perlasm","../../perlasm"); + require "x86asm.pl"; +--- openssl-0.9.8m.orig/crypto/bn/asm/bn-586.pl ++++ openssl-0.9.8m/crypto/bn/asm/bn-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + push(@INC,"perlasm","../../perlasm"); + require "x86asm.pl"; +--- openssl-0.9.8m.orig/crypto/bn/asm/mo-586.pl ++++ openssl-0.9.8m/crypto/bn/asm/mo-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + + # This is crypto/bn/asm/x86-mont.pl (with asciz from crypto/perlasm/x86asm.pl) + # from OpenSSL 0.9.9-dev +--- openssl-0.9.8m.orig/crypto/bn/asm/x86_64-mont.pl ++++ openssl-0.9.8m/crypto/bn/asm/x86_64-mont.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + + # ==================================================================== + # Written by Andy Polyakov for the OpenSSL +--- openssl-0.9.8m.orig/crypto/bn/asm/x86/comba.pl ++++ openssl-0.9.8m/crypto/bn/asm/x86/comba.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # x86 assember + + sub mul_add_c +--- openssl-0.9.8m.orig/crypto/bn/asm/x86/add.pl ++++ openssl-0.9.8m/crypto/bn/asm/x86/add.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # x86 assember + + sub bn_add_words +--- openssl-0.9.8m.orig/crypto/bn/asm/x86/mul.pl ++++ openssl-0.9.8m/crypto/bn/asm/x86/mul.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # x86 assember + + sub bn_mul_words +--- openssl-0.9.8m.orig/crypto/bn/asm/x86/mul_add.pl ++++ openssl-0.9.8m/crypto/bn/asm/x86/mul_add.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # x86 assember + + sub bn_mul_add_words +--- openssl-0.9.8m.orig/crypto/bn/asm/x86/sqr.pl ++++ openssl-0.9.8m/crypto/bn/asm/x86/sqr.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # x86 assember + + sub bn_sqr_words +--- openssl-0.9.8m.orig/crypto/bn/asm/x86/sub.pl ++++ openssl-0.9.8m/crypto/bn/asm/x86/sub.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # x86 assember + + sub bn_sub_words +--- openssl-0.9.8m.orig/crypto/bn/asm/x86/div.pl ++++ openssl-0.9.8m/crypto/bn/asm/x86/div.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # x86 assember + + sub bn_div_words +--- openssl-0.9.8m.orig/crypto/aes/asm/aes-586.pl ++++ openssl-0.9.8m/crypto/aes/asm/aes-586.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # + # ==================================================================== + # Written by Andy Polyakov for the OpenSSL +--- openssl-0.9.8m.orig/crypto/aes/asm/aes-x86_64.pl ++++ openssl-0.9.8m/crypto/aes/asm/aes-x86_64.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # + # ==================================================================== + # Written by Andy Polyakov for the OpenSSL +--- openssl-0.9.8m.orig/crypto/asn1/charmap.pl ++++ openssl-0.9.8m/crypto/asn1/charmap.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + + use strict; + +--- openssl-0.9.8m.orig/util/mksdef.pl ++++ openssl-0.9.8m/util/mksdef.pl +@@ -1,4 +1,4 @@ +- ++#!/usr/bin/perl + # Perl script to split libeay32.def into two distinct DEF files for use in + # fipdso mode. It works out symbols in each case by running "link" command and + # parsing the output to find the list of missing symbols then splitting +--- openssl-0.9.8m.orig/util/dirname.pl ++++ openssl-0.9.8m/util/dirname.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + if ($#ARGV < 0) { + die "dirname.pl: too few arguments\n"; +--- openssl-0.9.8m.orig/util/tab_num.pl ++++ openssl-0.9.8m/util/tab_num.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + $num=1; + $width=40; +--- openssl-0.9.8m.orig/util/sp-diff.pl ++++ openssl-0.9.8m/util/sp-diff.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # This file takes as input, the files that have been output from + # ssleay speed. +--- openssl-0.9.8m.orig/util/mkerr.pl ++++ openssl-0.9.8m/util/mkerr.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + + my $config = "crypto/err/openssl.ec"; + my $debug = 0; +--- openssl-0.9.8m.orig/util/clean-depend.pl ++++ openssl-0.9.8m/util/clean-depend.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + # Clean the dependency list in a makefile of standard includes... + # Written by Ben Laurie 19 Jan 1999 + +--- openssl-0.9.8m.orig/util/add_cr.pl ++++ openssl-0.9.8m/util/add_cr.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # This adds a copyright message to a souce code file. + # It also gets the file name correct. +--- openssl-0.9.8m.orig/util/pod2man.pl ++++ openssl-0.9.8m/util/pod2man.pl +@@ -1,4 +1,4 @@ +-: #!/usr/bin/perl-5.005 ++#!/usr/bin/perl + eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' + if $running_under_some_shell; + +--- openssl-0.9.8m.orig/util/mkstack.pl ++++ openssl-0.9.8m/util/mkstack.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + + # This is a utility that searches out "DECLARE_STACK_OF()" + # declarations in .h and .c files, and updates/creates/replaces +--- openssl-0.9.8m.orig/util/selftest.pl ++++ openssl-0.9.8m/util/selftest.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + # + # Run the test suite and generate a report + # +--- openssl-0.9.8m.orig/util/ck_errf.pl ++++ openssl-0.9.8m/util/ck_errf.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # This is just a quick script to scan for cases where the 'error' + # function name in a XXXerr() macro is wrong. +--- openssl-0.9.8m.orig/util/mklink.pl ++++ openssl-0.9.8m/util/mklink.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # mklink.pl + +--- openssl-0.9.8m.orig/util/src-dep.pl ++++ openssl-0.9.8m/util/src-dep.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # we make up an array of + # $file{function_name}=filename; +--- openssl-0.9.8m.orig/util/deleof.pl ++++ openssl-0.9.8m/util/deleof.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + while (<>) + { +--- openssl-0.9.8m.orig/util/arx.pl ++++ openssl-0.9.8m/util/arx.pl +@@ -1,4 +1,4 @@ +-#!/bin/perl ++#!/usr/bin/perl + + # Simple perl script to wrap round "ar" program and exclude any + # object files in the environment variable EXCL_OBJ +--- openssl-0.9.8m.orig/util/copy.pl ++++ openssl-0.9.8m/util/copy.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + use Fcntl; + +--- openssl-0.9.8m.orig/util/mkdir-p.pl ++++ openssl-0.9.8m/util/mkdir-p.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + # mkdir-p.pl + +--- openssl-0.9.8m.orig/util/mkdef.pl ++++ openssl-0.9.8m/util/mkdef.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + # + # generate a .def file + # +--- openssl-0.9.8m.orig/util/files.pl ++++ openssl-0.9.8m/util/files.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # used to generate the file MINFO for use by util/mk1mf.pl + # It is basically a list of all variables from the passed makefile +--- openssl-0.9.8m.orig/util/mkfiles.pl ++++ openssl-0.9.8m/util/mkfiles.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # This is a hacked version of files.pl for systems that can't do a 'make files'. + # Do a perl util/mkminfo.pl >MINFO to build MINFO +--- openssl-0.9.8m.orig/util/perlpath.pl ++++ openssl-0.9.8m/util/perlpath.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # modify the '#!/usr/local/bin/perl' + # line in all scripts that rely on perl. +--- openssl-0.9.8m.orig/util/mk1mf.pl ++++ openssl-0.9.8m/util/mk1mf.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # A bit of an evil hack but it post processes the file ../MINFO which + # is generated by `make files` in the top directory. + # This script outputs one mega makefile that has no shell stuff or any +--- openssl-0.9.8m.orig/util/err-ins.pl ++++ openssl-0.9.8m/util/err-ins.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # tack error codes onto the end of a file + # +--- openssl-0.9.8m.orig/util/pl/Mingw32.pl ++++ openssl-0.9.8m/util/pl/Mingw32.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # Mingw32.pl -- Mingw + # +--- openssl-0.9.8m.orig/util/pl/unix.pl ++++ openssl-0.9.8m/util/pl/unix.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # unix.pl - the standard unix makefile stuff. + # +--- openssl-0.9.8m.orig/util/pl/netware.pl ++++ openssl-0.9.8m/util/pl/netware.pl +@@ -1,4 +1,4 @@ +-# Metrowerks Codewarrior or gcc / nlmconv for NetWare ++#!/usr/bin/perl + # + + $version_header = "crypto/opensslv.h"; +--- openssl-0.9.8m.orig/util/pl/VC-32.pl ++++ openssl-0.9.8m/util/pl/VC-32.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # VC-32.pl - unified script for Microsoft Visual C++, covering Win32, + # Win64 and WinCE [follow $FLAVOR variable to trace the differences]. + # +--- openssl-0.9.8m.orig/util/pl/OS2-EMX.pl ++++ openssl-0.9.8m/util/pl/OS2-EMX.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # OS2-EMX.pl - for EMX GCC on OS/2 + # +--- openssl-0.9.8m.orig/util/pl/ultrix.pl ++++ openssl-0.9.8m/util/pl/ultrix.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # linux.pl - the standard unix makefile stuff. + # +--- openssl-0.9.8m.orig/util/pl/linux.pl ++++ openssl-0.9.8m/util/pl/linux.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # + # linux.pl - the standard unix makefile stuff. + # +--- openssl-0.9.8m.orig/util/pl/BC-32.pl ++++ openssl-0.9.8m/util/pl/BC-32.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + # Borland C++ builder 3 and 4 -- Janez Jere + # + diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/pic.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/pic.patch new file mode 100644 index 0000000..5fc8f65 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/pic.patch @@ -0,0 +1,303 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8o/crypto/Makefile +=================================================================== +--- openssl-0.9.8o.orig/crypto/Makefile 2008-09-17 17:10:55.000000000 +0000 ++++ openssl-0.9.8o/crypto/Makefile 2010-06-06 13:09:28.000000000 +0000 +@@ -57,7 +57,7 @@ + echo " #define DATE \"`LC_ALL=C LC_TIME=C date`\""; \ + echo '#endif' ) >buildinf.h + +-x86cpuid-elf.s: x86cpuid.pl perlasm/x86asm.pl ++x86cpuid-elf.S: x86cpuid.pl perlasm/x86asm.pl + $(PERL) x86cpuid.pl elf $(CFLAGS) $(PROCESSOR) > $@ + x86cpuid-cof.s: x86cpuid.pl perlasm/x86asm.pl + $(PERL) x86cpuid.pl coff $(CFLAGS) $(PROCESSOR) > $@ +@@ -70,7 +70,7 @@ + uplink-cof.s: ../ms/uplink.pl + $(PERL) ../ms/uplink.pl coff > $@ + +-x86_64cpuid.s: x86_64cpuid.pl ++x86_64cpuid.S: x86_64cpuid.pl + $(PERL) x86_64cpuid.pl $@ + ia64cpuid.s: ia64cpuid.S + $(CC) $(CFLAGS) -E ia64cpuid.S > $@ +Index: openssl-0.9.8o/crypto/x86_64cpuid.pl +=================================================================== +--- openssl-0.9.8o.orig/crypto/x86_64cpuid.pl 2007-11-11 16:25:00.000000000 +0000 ++++ openssl-0.9.8o/crypto/x86_64cpuid.pl 2010-06-06 13:09:28.000000000 +0000 +@@ -95,7 +95,11 @@ + .size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu + + .section .init ++#ifdef OPENSSL_PIC ++ call OPENSSL_cpuid_setup\@PLT ++#else + call OPENSSL_cpuid_setup ++#endif + + ___ + +Index: openssl-0.9.8o/crypto/md5/Makefile +=================================================================== +--- openssl-0.9.8o.orig/crypto/md5/Makefile 2008-09-17 17:11:02.000000000 +0000 ++++ openssl-0.9.8o/crypto/md5/Makefile 2010-06-06 13:09:28.000000000 +0000 +@@ -52,7 +52,8 @@ + mx86-out.s: asm/md5-586.pl ../perlasm/x86asm.pl + (cd asm; $(PERL) md5-586.pl a.out $(CFLAGS) > ../$@) + +-md5-x86_64.s: asm/md5-x86_64.pl; $(PERL) asm/md5-x86_64.pl $@ ++md5-x86_64.s: asm/md5-x86_64.pl ++ $(PERL) asm/md5-x86_64.pl $@ + + files: + $(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO +Index: openssl-0.9.8o/crypto/des/asm/desboth.pl +=================================================================== +--- openssl-0.9.8o.orig/crypto/des/asm/desboth.pl 2001-10-24 21:20:56.000000000 +0000 ++++ openssl-0.9.8o/crypto/des/asm/desboth.pl 2010-06-06 13:09:28.000000000 +0000 +@@ -16,6 +16,11 @@ + + &push("edi"); + ++ &call (&label("pic_point0")); ++ &set_label("pic_point0"); ++ &blindpop("ebp"); ++ &add ("ebp", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point0") . "]"); ++ + &comment(""); + &comment("Load the data words"); + &mov($L,&DWP(0,"ebx","",0)); +@@ -47,15 +52,21 @@ + &mov(&swtmp(2), (DWC(($enc)?"1":"0"))); + &mov(&swtmp(1), "eax"); + &mov(&swtmp(0), "ebx"); +- &call("DES_encrypt2"); ++ &exch("ebx", "ebp"); ++ &call("DES_encrypt2\@PLT"); ++ &exch("ebx", "ebp"); + &mov(&swtmp(2), (DWC(($enc)?"0":"1"))); + &mov(&swtmp(1), "edi"); + &mov(&swtmp(0), "ebx"); +- &call("DES_encrypt2"); ++ &exch("ebx", "ebp"); ++ &call("DES_encrypt2\@PLT"); ++ &exch("ebx", "ebp"); + &mov(&swtmp(2), (DWC(($enc)?"1":"0"))); + &mov(&swtmp(1), "esi"); + &mov(&swtmp(0), "ebx"); +- &call("DES_encrypt2"); ++ &exch("ebx", "ebp"); ++ &call("DES_encrypt2\@PLT"); ++ &exch("ebx", "ebp"); + + &stack_pop(3); + &mov($L,&DWP(0,"ebx","",0)); +Index: openssl-0.9.8o/crypto/rc4/Makefile +=================================================================== +--- openssl-0.9.8o.orig/crypto/rc4/Makefile 2008-11-19 16:03:50.000000000 +0000 ++++ openssl-0.9.8o/crypto/rc4/Makefile 2010-06-06 13:09:28.000000000 +0000 +@@ -51,7 +51,7 @@ + rx86-out.s: asm/rc4-586.pl ../perlasm/x86asm.pl + (cd asm; $(PERL) rc4-586.pl a.out $(CFLAGS) > ../$@) + +-rc4-x86_64.s: asm/rc4-x86_64.pl; $(PERL) asm/rc4-x86_64.pl $@ ++rc4-x86_64.S: asm/rc4-x86_64.pl; $(PERL) asm/rc4-x86_64.pl $@ + + rc4-ia64.s: asm/rc4-ia64.S + @case `awk '/^#define RC4_INT/{print$$NF}' $(TOP)/include/openssl/opensslconf.h` in \ +Index: openssl-0.9.8o/crypto/rc4/asm/rc4-x86_64.pl +=================================================================== +--- openssl-0.9.8o.orig/crypto/rc4/asm/rc4-x86_64.pl 2008-09-16 10:47:27.000000000 +0000 ++++ openssl-0.9.8o/crypto/rc4/asm/rc4-x86_64.pl 2010-06-06 13:09:28.000000000 +0000 +@@ -270,7 +270,11 @@ + xor %r10,%r10 + xor %r11,%r11 + ++#ifdef OPENSSL_PIC ++ mov OPENSSL_ia32cap_P\@GOTPCREL(%rip),$idx#d ++#else + mov OPENSSL_ia32cap_P(%rip),$idx#d ++#endif + bt \$20,$idx#d + jnc .Lw1stloop + bt \$30,$idx#d +@@ -338,7 +342,11 @@ + RC4_options: + .picmeup %rax + lea .Lopts-.(%rax),%rax ++#ifdef OPENSSL_PIC ++ mov OPENSSL_ia32cap_P\@GOTPCREL(%rip),%edx ++#else + mov OPENSSL_ia32cap_P(%rip),%edx ++#endif + bt \$20,%edx + jnc .Ldone + add \$12,%rax +Index: openssl-0.9.8o/crypto/perlasm/x86unix.pl +=================================================================== +--- openssl-0.9.8o.orig/crypto/perlasm/x86unix.pl 2008-05-01 23:11:32.000000000 +0000 ++++ openssl-0.9.8o/crypto/perlasm/x86unix.pl 2010-06-06 13:09:28.000000000 +0000 +@@ -400,6 +400,29 @@ + $stack=4; + } + ++sub main'function_begin_B_static ++ { ++ local($func,$extra)=@_; ++ ++ &main'external_label($func); ++ $func=$under.$func; ++ ++ local($tmp)=<<"EOF"; ++.text ++EOF ++ push(@out,$tmp); ++ if ($main'cpp) ++ { push(@out,"TYPE($func,\@function)\n"); } ++ elsif ($main'coff) ++ { $tmp=push(@out,".def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); } ++ elsif ($main'aout and !$main'pic) ++ { } ++ else { push(@out,".type $func,\@function\n"); } ++ push(@out,".align\t$align\n"); ++ push(@out,"$func:\n"); ++ $stack=4; ++ } ++ + sub main'function_end + { + local($func)=@_; +@@ -694,7 +717,17 @@ + { + $tmp=<<___; + .section .init ++#ifdef OPENSSL_PIC ++ pushl %ebx ++ call .pic_point0 ++.pic_point0: ++ popl %ebx ++ addl \$_GLOBAL_OFFSET_TABLE_+[.-.pic_point0],%ebx ++ call $under$f\@PLT ++ popl %ebx ++#else + call $under$f ++#endif + jmp .Linitalign + .align $align + .Linitalign: +Index: openssl-0.9.8o/crypto/perlasm/cbc.pl +=================================================================== +--- openssl-0.9.8o.orig/crypto/perlasm/cbc.pl 2005-05-09 21:48:00.000000000 +0000 ++++ openssl-0.9.8o/crypto/perlasm/cbc.pl 2010-06-06 13:09:28.000000000 +0000 +@@ -122,7 +122,11 @@ + &mov(&DWP($data_off,"esp","",0), "eax"); # put in array for call + &mov(&DWP($data_off+4,"esp","",0), "ebx"); # + +- &call($enc_func); ++ &call (&label("pic_point0")); ++ &set_label("pic_point0"); ++ &blindpop("ebx"); ++ &add ("ebx", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point0") . "]"); ++ &call("$enc_func\@PLT"); + + &mov("eax", &DWP($data_off,"esp","",0)); + &mov("ebx", &DWP($data_off+4,"esp","",0)); +@@ -187,7 +191,11 @@ + &mov(&DWP($data_off,"esp","",0), "eax"); # put in array for call + &mov(&DWP($data_off+4,"esp","",0), "ebx"); # + +- &call($enc_func); ++ &call (&label("pic_point1")); ++ &set_label("pic_point1"); ++ &blindpop("ebx"); ++ &add ("ebx", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point1") . "]"); ++ &call("$enc_func\@PLT"); + + &mov("eax", &DWP($data_off,"esp","",0)); + &mov("ebx", &DWP($data_off+4,"esp","",0)); +@@ -220,7 +228,11 @@ + &mov(&DWP($data_off,"esp","",0), "eax"); # put back + &mov(&DWP($data_off+4,"esp","",0), "ebx"); # + +- &call($dec_func); ++ &call (&label("pic_point2")); ++ &set_label("pic_point2"); ++ &blindpop("ebx"); ++ &add ("ebx", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point2") . "]"); ++ &call("$dec_func\@PLT"); + + &mov("eax", &DWP($data_off,"esp","",0)); # get return + &mov("ebx", &DWP($data_off+4,"esp","",0)); # +@@ -263,7 +275,11 @@ + &mov(&DWP($data_off,"esp","",0), "eax"); # put back + &mov(&DWP($data_off+4,"esp","",0), "ebx"); # + +- &call($dec_func); ++ &call (&label("pic_point3")); ++ &set_label("pic_point3"); ++ &blindpop("ebx"); ++ &add ("ebx", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point3") . "]"); ++ &call("$dec_func\@PLT"); + + &mov("eax", &DWP($data_off,"esp","",0)); # get return + &mov("ebx", &DWP($data_off+4,"esp","",0)); # +Index: openssl-0.9.8o/crypto/perlasm/x86_64-xlate.pl +=================================================================== +--- openssl-0.9.8o.orig/crypto/perlasm/x86_64-xlate.pl 2010-06-06 13:09:00.000000000 +0000 ++++ openssl-0.9.8o/crypto/perlasm/x86_64-xlate.pl 2010-06-06 13:09:28.000000000 +0000 +@@ -435,7 +435,7 @@ + + chomp($line); + +- $line =~ s|[#!].*$||; # get rid of asm-style comments... ++# $line =~ s|[#!].*$||; # get rid of asm-style comments... + $line =~ s|/\*.*\*/||; # ... and C-style comments... + $line =~ s|^\s+||; # ... and skip white spaces in beginning + +Index: openssl-0.9.8o/crypto/aes/asm/aes-586.pl +=================================================================== +--- openssl-0.9.8o.orig/crypto/aes/asm/aes-586.pl 2008-12-17 14:14:51.000000000 +0000 ++++ openssl-0.9.8o/crypto/aes/asm/aes-586.pl 2010-06-06 13:09:28.000000000 +0000 +@@ -250,7 +250,7 @@ + sub _data_word() { my $i; while(defined($i=shift)) { &data_word($i,$i); } } + + &public_label("AES_Te"); +-&function_begin_B("_x86_AES_encrypt"); ++&function_begin_B_static("_x86_AES_encrypt"); + if ($vertical_spin) { + # I need high parts of volatile registers to be accessible... + &exch ($s1="edi",$key="ebx"); +@@ -539,7 +539,7 @@ + } + + &public_label("AES_Td"); +-&function_begin_B("_x86_AES_decrypt"); ++&function_begin_B_static("_x86_AES_decrypt"); + # note that caller is expected to allocate stack frame for me! + &mov (&DWP(12,"esp"),$key); # save key + +@@ -1461,15 +1461,22 @@ + &public_label("AES_Td"); + &public_label("AES_Te"); + &function_begin_B("AES_set_decrypt_key"); ++ &push ("ebx"); + &mov ("eax",&wparam(0)); + &mov ("ecx",&wparam(1)); + &mov ("edx",&wparam(2)); + &sub ("esp",12); ++ ++ &call (&label("pic_point0")); ++ &set_label("pic_point0"); ++ &blindpop("ebx"); ++ &add ("ebx", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point0") . "]"); + &mov (&DWP(0,"esp"),"eax"); + &mov (&DWP(4,"esp"),"ecx"); + &mov (&DWP(8,"esp"),"edx"); +- &call ("AES_set_encrypt_key"); ++ &call ("AES_set_encrypt_key\@PLT"); + &add ("esp",12); ++ &pop ("ebx"); + &cmp ("eax",0); + &je (&label("proceed")); + &ret (); diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/pkg-config.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/pkg-config.patch new file mode 100644 index 0000000..46c6f03 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/pkg-config.patch @@ -0,0 +1,36 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/Makefile.org +=================================================================== +--- openssl-0.9.8k.orig/Makefile.org 2009-07-19 11:34:56.000000000 +0200 ++++ openssl-0.9.8k/Makefile.org 2009-07-19 11:36:02.000000000 +0200 +@@ -444,7 +444,8 @@ + echo 'Description: OpenSSL cryptography library'; \ + echo 'Version: '$(VERSION); \ + echo 'Requires: '; \ +- echo 'Libs: -L$${libdir} -lcrypto $(EX_LIBS)'; \ ++ echo 'Libs: -L$${libdir} -lcrypto'; \ ++ echo 'Libs.private: $(EX_LIBS)'; \ + echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libcrypto.pc + + libssl.pc: Makefile +@@ -457,7 +458,8 @@ + echo 'Description: Secure Sockets Layer and cryptography libraries'; \ + echo 'Version: '$(VERSION); \ + echo 'Requires: '; \ +- echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \ ++ echo 'Libs: -L$${libdir} -lssl'; \ ++ echo 'Libs.private: -lcrypto $(EX_LIBS)'; \ + echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libssl.pc + + openssl.pc: Makefile +@@ -470,7 +472,8 @@ + echo 'Description: Secure Sockets Layer and cryptography libraries and tools'; \ + echo 'Version: '$(VERSION); \ + echo 'Requires: '; \ +- echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \ ++ echo 'Libs: -L$${libdir} -lssl -lcrypto'; \ ++ echo 'Libs.private: $(EX_LIBS)'; \ + echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > openssl.pc + + Makefile: Makefile.org Configure config diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rc4-amd64.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rc4-amd64.patch new file mode 100644 index 0000000..f57fbc9 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rc4-amd64.patch @@ -0,0 +1,16 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/Configure +=================================================================== +--- openssl-0.9.8k.orig/Configure 2009-07-19 11:32:41.000000000 +0200 ++++ openssl-0.9.8k/Configure 2009-07-19 11:37:10.000000000 +0200 +@@ -128,6 +128,9 @@ + my $x86_out_asm="x86cpuid-out.o:bn86-out.o co86-out.o MAYBE-MO86-out.o:dx86-out.o yx86-out.o:ax86-out.o:bx86-out.o:mx86-out.o:sx86-out.o s512sse2-out.o:cx86-out.o:rx86-out.o rc4_skey.o:rm86-out.o:r586-out.o"; + + my $x86_64_asm="x86_64cpuid.o:x86_64-gcc.o x86_64-mont.o::aes-x86_64.o::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o::rc4-x86_64.o::"; ++# rc4 asm is disabled on amd64 because we configured it with RC4_CHAR while ++# the assembler only works with int ++my $x86_64_asm_linux="x86_64cpuid.o:x86_64-gcc.o x86_64-mont.o::aes-x86_64.o::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o::::"; + my $ia64_asm=":bn-ia64.o::aes_core.o aes_cbc.o aes-ia64.o:::sha1-ia64.o sha256-ia64.o sha512-ia64.o::rc4-ia64.o rc4_skey.o::"; + + my $no_asm="::::::::::"; diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rehash-crt.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rehash-crt.patch new file mode 100644 index 0000000..d9d6b70 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rehash-crt.patch @@ -0,0 +1,35 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/tools/c_rehash.in +=================================================================== +--- openssl-0.9.8k.orig/tools/c_rehash.in 2002-10-11 22:31:27.000000000 +0200 ++++ openssl-0.9.8k/tools/c_rehash.in 2009-07-19 11:36:26.000000000 +0200 +@@ -59,12 +59,15 @@ + } + } + closedir DIR; +- FILE: foreach $fname (grep {/\.pem$/} @flist) { ++ FILE: foreach $fname (grep {/\.pem$|\.crt$/} @flist) { + # Check to see if certificates and/or CRLs present. + my ($cert, $crl) = check_file($fname); + if(!$cert && !$crl) { +- print STDERR "WARNING: $fname does not contain a certificate or CRL: skipping\n"; +- next; ++ ($cert, $crl) = check_file("$openssl x509 -in \"$fname\" -inform der -outform pem | "); ++ if(!$cert && !$crl) { ++ print STDERR "WARNING: $fname does not contain a certificate or CRL: skipping\n"; ++ next; ++ } + } + link_hash_cert($fname) if($cert); + link_hash_crl($fname) if($crl); +@@ -102,6 +105,9 @@ + my $fname = $_[0]; + $fname =~ s/'/'\\''/g; + my ($hash, $fprint) = `"$openssl" x509 -hash -fingerprint -noout -in '$fname'`; ++ if(!$hash || !fprint) { ++ ($hash, $fprint) = `"$openssl" x509 -hash -fingerprint -noout -in '$fname' -inform der`; ++ } + chomp $hash; + chomp $fprint; + $fprint =~ s/^.*=//; diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rehash_pod.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rehash_pod.patch new file mode 100644 index 0000000..3426ba8 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/rehash_pod.patch @@ -0,0 +1,62 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/doc/apps/c_rehash.pod +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ openssl-0.9.8k/doc/apps/c_rehash.pod 2009-07-19 11:36:27.000000000 +0200 +@@ -0,0 +1,55 @@ ++ ++=pod ++ ++=head1 NAME ++ ++c_rehash - Create symbolic links to files named by the hash values ++ ++=head1 SYNOPSIS ++ ++B ++[directory] ... ++ ++=head1 DESCRIPTION ++ ++c_rehash scans directories and takes a hash value of each .pem and .crt file in the directory. It then creates symbolic links for each of the files named by the hash value. This is useful as many programs require directories to be set up like this in order to find the certificates they require. ++ ++If any directories are named on the command line then these directories are processed in turn. If not then and the environment variable SSL_CERT_DIR is defined then that is consulted. This variable should be a colon (:) separated list of directories, all of which will be processed. If neither of these conditions are true then /usr/lib/ssl/certs is processed. ++ ++For each directory that is to be processed he user must have write permissions on the directory, if they do not then nothing will be printed for that directory. ++ ++Note that this program deletes all the symbolic links that look like ones that it creates before processing a directory. Beware that if you run the program on a directory that contains symbolic links for other purposes that are named in the same format as those created by this program they will be lost. ++ ++The hashes for certificate files are of the form . where n is an integer. If the hash value already exists then n will be incremented, unless the file is a duplicate. Duplicates are detected using the fingerprint of the certificate. A warning will be printed if a duplicate is detected. The hashes for CRL files are of the form .r and have the same behavior. ++ ++The program will also warn if there are files with extension .pem which are not certificate or CRL files. ++ ++The program uses the openssl program to compute the hashes and fingerprints. It expects the executable to be named openssl and be on the PATH, or in the /usr/lib/ssl/bin directory. If the OPENSSL environment variable is defined then this is used instead as the executable that provides the hashes and fingerprints. When called as $OPENSSL x509 -hash -fingerprint -noout -in $file it must output the hash of $file on the first line followed by the fingerprint on the second line, optionally prefixed with some text and an equals sign (=). ++ ++=head1 OPTIONS ++ ++None ++ ++=head1 ENVIRONMENT ++ ++=over 4 ++ ++=item B ++ ++The name (and path) of an executable to use to generate hashes and fingerprints (see above). ++ ++=item B ++ ++Colon separated list of directories to operate on. Ignored if directories are listed on the command line. ++ ++=head1 SEE ALSO ++ ++L, L ++ ++=back ++ ++=head1 BUGS ++ ++No known bugs ++ ++=cut diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/series b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/series new file mode 100644 index 0000000..b764c04 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/series @@ -0,0 +1,20 @@ +ca.patch +config-hurd.patch +debian-targets.patch +engines-path.patch +kfreebsd-pipe.patch +make-targets.patch +man-dir.patch +man-section.patch +no-rpath.patch +no-symbolic.patch +pic.patch +pkg-config.patch +valgrind.patch +rc4-amd64.patch +rehash-crt.patch +rehash_pod.patch +shared-lib-ext.patch +stddef.patch +version-script.patch +perl-path.diff diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/shared-lib-ext.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/shared-lib-ext.patch new file mode 100644 index 0000000..79eb39f --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/shared-lib-ext.patch @@ -0,0 +1,16 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/Configure +=================================================================== +--- openssl-0.9.8k.orig/Configure 2009-07-19 11:36:24.000000000 +0200 ++++ openssl-0.9.8k/Configure 2009-07-19 11:37:03.000000000 +0200 +@@ -1568,7 +1568,8 @@ + elsif ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/) + { + my $sotmp = $1; +- s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/; ++# s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/; ++ s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp/; + } + elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.[^\.]*\.dylib$/) + { diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/stddef.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/stddef.patch new file mode 100644 index 0000000..3436b29 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/stddef.patch @@ -0,0 +1,14 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8k/crypto/sha/sha.h +=================================================================== +--- openssl-0.9.8k.orig/crypto/sha/sha.h 2008-09-16 12:47:28.000000000 +0200 ++++ openssl-0.9.8k/crypto/sha/sha.h 2009-07-19 11:36:28.000000000 +0200 +@@ -59,6 +59,7 @@ + #ifndef HEADER_SHA_H + #define HEADER_SHA_H + ++#include + #include + #include + diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/version-script.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/version-script.patch new file mode 100644 index 0000000..6fa3d75 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/debian/version-script.patch @@ -0,0 +1,35 @@ +Upstream-Status: Backport [debian] + +Index: openssl-0.9.8m/Configure +=================================================================== +--- openssl-0.9.8m.orig/Configure 2010-02-27 12:28:32.000000000 +0100 ++++ openssl-0.9.8m/Configure 2010-02-27 12:28:35.000000000 +0100 +@@ -1512,6 +1512,8 @@ + } + } + ++$shared_ldflag .= " -Wl,--version-script=openssl.ld"; ++ + open(IN,'$Makefile.new") || die "unable to create $Makefile.new:$!\n"; +Index: openssl-0.9.8m/openssl.ld +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ openssl-0.9.8m/openssl.ld 2010-02-27 12:28:35.000000000 +0100 +@@ -0,0 +1,5 @@ ++OPENSSL_0.9.8 { ++ global: ++ *; ++}; ++ +Index: openssl-0.9.8m/engines/openssl.ld +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ openssl-0.9.8m/engines/openssl.ld 2010-02-27 12:28:35.000000000 +0100 +@@ -0,0 +1,5 @@ ++OPENSSL_0.9.8 { ++ global: ++ *; ++}; ++ diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/parallel-make-fix.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/parallel-make-fix.patch new file mode 100644 index 0000000..82857f5 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/parallel-make-fix.patch @@ -0,0 +1,20 @@ +Upstream-Status: Submitted + +fix the parallel build regarding shared libraries. + +Signed-off-by: Qing He + +diff --git a/Makefile.org b/Makefile.org +index 2fb0309..8bec3d0 100644 +--- a/Makefile.org ++++ b/Makefile.org +@@ -352,6 +352,9 @@ all_testapps: build_libs build_testapps + build_testapps: + @dir=crypto; target=testapps; $(BUILD_ONE_CMD) + ++libcrypto.a: build_crypto ++libssl.a: build_ssl ++ + build_shared: $(SHARED_LIBS) + libcrypto$(SHLIB_EXT): libcrypto.a $(SHARED_FIPS) + @if [ "$(SHLIB_TARGET)" != "" ]; then \ diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/shared-libs.patch b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/shared-libs.patch new file mode 100644 index 0000000..19de112 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl-0.9.8x/shared-libs.patch @@ -0,0 +1,50 @@ +Upstream-Status: Inappropriate [configuration] + +diff --git a/Makefile.org b/Makefile.org +index e87d623..25ff367 100644 +--- a/Makefile.org ++++ b/Makefile.org +@@ -355,7 +355,7 @@ libcrypto$(SHLIB_EXT): libcrypto.a $(SHARED_FIPS) + @if [ "$(SHLIB_TARGET)" != "" ]; then \ + if [ "$(FIPSCANLIB)" = "libfips" ]; then \ + $(ARD) libcrypto.a fipscanister.o ; \ +- $(MAKE) SHLIBDIRS='crypto' SHLIBDEPS='-lfips' build-shared; \ ++ $(MAKE) -e SHLIBDIRS='crypto' SHLIBDEPS='-lfips' build-shared; \ + $(AR) libcrypto.a fips/fipscanister.o ; \ + else \ + if [ "$(FIPSCANLIB)" = "libcrypto" ]; then \ +@@ -373,7 +373,7 @@ libssl$(SHLIB_EXT): libcrypto$(SHLIB_EXT) libssl.a + @if [ "$(SHLIB_TARGET)" != "" ]; then \ + shlibdeps=-lcrypto; \ + [ "$(FIPSCANLIB)" = "libfips" ] && shlibdeps="$$shlibdeps -lfips"; \ +- $(MAKE) SHLIBDIRS=ssl SHLIBDEPS="$$shlibdeps" build-shared; \ ++ $(MAKE) -e SHLIBDIRS=ssl SHLIBDEPS="$$shlibdeps" build-shared; \ + else \ + echo "There's no support for shared libraries on this platform" >&2 ; \ + exit 1; \ +diff --git a/crypto/Makefile b/crypto/Makefile +index 6557f2b..a69bf7c 100644 +--- a/crypto/Makefile ++++ b/crypto/Makefile +@@ -103,7 +103,7 @@ $(LIB): $(LIBOBJ) + + shared: buildinf.h lib subdirs + if [ -n "$(SHARED_LIBS)" ]; then \ +- (cd ..; $(MAKE) $(SHARED_LIB)); \ ++ (cd ..; $(MAKE) -e $(SHARED_LIB)); \ + fi + + libs: +diff --git a/ssl/Makefile b/ssl/Makefile +index 5ac3507..77ea2bd 100644 +--- a/ssl/Makefile ++++ b/ssl/Makefile +@@ -62,7 +62,7 @@ lib: $(LIBOBJ) + + shared: lib + if [ -n "$(SHARED_LIBS)" ]; then \ +- (cd ..; $(MAKE) $(SHARED_LIB)); \ ++ (cd ..; $(MAKE) -e $(SHARED_LIB)); \ + fi + + files: diff --git a/meta-openvuplus/recipes-connectivity/openssl/openssl_0.9.8x.bb b/meta-openvuplus/recipes-connectivity/openssl/openssl_0.9.8x.bb new file mode 100644 index 0000000..c1e9cca --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/openssl/openssl_0.9.8x.bb @@ -0,0 +1,38 @@ +require recipes-connectivity/openssl/openssl.inc + +PR = "${INC_PR}.0" + +LIC_FILES_CHKSUM = "file://LICENSE;md5=f9a8f968107345e0b75aa8c2ecaa7ec8" + +SRC_URI += "file://debian/ca.patch \ + file://debian/config-hurd.patch;apply=no \ + file://debian/debian-targets.patch \ + file://debian/engines-path.patch \ + file://debian/kfreebsd-pipe.patch;apply=no \ + file://debian/make-targets.patch \ + file://debian/man-dir.patch \ + file://debian/man-section.patch \ + file://debian/no-rpath.patch \ + file://debian/no-symbolic.patch \ + file://debian/pic.patch \ + file://debian/pkg-config.patch \ + file://debian/rc4-amd64.patch \ + file://debian/rehash-crt.patch \ + file://debian/rehash_pod.patch \ + file://debian/shared-lib-ext.patch \ + file://debian/stddef.patch \ + file://debian/version-script.patch \ + file://debian/perl-path.diff" + +SRC_URI += "file://configure-targets.patch \ + file://shared-libs.patch \ + file://parallel-make-fix.patch" + +SRC_URI[md5sum] = "ee17e9bc805c8cc7d0afac3b0ef78eda" +SRC_URI[sha256sum] = "7ce0c7f2c451070b4497ea7ca6f23eba6cef1a56db2e86e433f65926a7bc7497" + +EXTRA_OECONF += "no-idea no-mdc2 no-rc5" + +BBCLASSEXTEND = "native nativesdk" + +PARALLEL_MAKEINST = "" diff --git a/meta-openvuplus/recipes-connectivity/ppp/ppp_2.4.5.bbappend b/meta-openvuplus/recipes-connectivity/ppp/ppp_2.4.5.bbappend new file mode 100644 index 0000000..e6587d2 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/ppp/ppp_2.4.5.bbappend @@ -0,0 +1,8 @@ +PR .= "-vuplus0" + +do_install_append() { + rm ${D}/${sysconfdir}/ppp/options + rm ${D}/${sysconfdir}/ppp/pap-secrets +} + +CONFFILES_${PN} = "${sysconfdir}/ppp/chap-secrets" diff --git a/meta-openvuplus/recipes-connectivity/ralink/rt3070-2.5.0.3/config.patch b/meta-openvuplus/recipes-connectivity/ralink/rt3070-2.5.0.3/config.patch new file mode 100644 index 0000000..aa510d8 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/ralink/rt3070-2.5.0.3/config.patch @@ -0,0 +1,16 @@ +--- 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.orig/os/linux/config.mk ++++ 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/config.mk +@@ -53,11 +53,11 @@ HAS_LLTD=n + HAS_APCLI=n + + # Support Wpa_Supplicant +-HAS_WPA_SUPPLICANT=n ++HAS_WPA_SUPPLICANT=y + + + # Support Native WpaSupplicant for Network Maganger +-HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n ++HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y + + #Support Net interface block while Tx-Sw queue full + HAS_BLOCK_NET_IF=n diff --git a/meta-openvuplus/recipes-connectivity/ralink/rt3070-2.5.0.3/makefile.patch b/meta-openvuplus/recipes-connectivity/ralink/rt3070-2.5.0.3/makefile.patch new file mode 100644 index 0000000..c7960e1 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/ralink/rt3070-2.5.0.3/makefile.patch @@ -0,0 +1,22 @@ +--- DPO_RT3070_LinuxSTA_V2.3.0.4_20100604.orig/Makefile ++++ DPO_RT3070_LinuxSTA_V2.3.0.4_20100604/Makefile +@@ -258,6 +258,6 @@ + cp -f $(RT28xx_DIR)/os/linux/rtnet$(CHIPSET)apsta.o /tftpboot + endif + else +- cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.o /tftpboot ++ cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.o $(RT28xx_DIR) + ifeq ($(OSABL),YES) + cp -f $(RT28xx_DIR)/os/linux/rtutil$(CHIPSET)sta.o /tftpboot + cp -f $(RT28xx_DIR)/os/linux/rtnet$(CHIPSET)sta.o /tftpboot +--- DPO_RT3070_LinuxSTA_V2.3.0.4_20100604.orig/Makefile ++++ DPO_RT3070_LinuxSTA_V2.3.0.4_20100604/Makefile +@@ -305,6 +305,6 @@ + cp -f $(RT28xx_DIR)/os/linux/rtnet$(CHIPSET)apsta.ko /tftpboot + endif + else +- cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.ko /tftpboot ++ cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.ko $(RT28xx_DIR) + ifeq ($(OSABL),YES) + cp -f $(RT28xx_DIR)/os/linux/rtutil$(CHIPSET)sta.ko /tftpboot + cp -f $(RT28xx_DIR)/os/linux/rtnet$(CHIPSET)sta.ko /tftpboot diff --git a/meta-openvuplus/recipes-connectivity/ralink/rt3070_2.5.0.3.bb b/meta-openvuplus/recipes-connectivity/ralink/rt3070_2.5.0.3.bb new file mode 100644 index 0000000..cabe6b7 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/ralink/rt3070_2.5.0.3.bb @@ -0,0 +1,26 @@ +SUMMARY = "Driver for Ralink RT8070/3070/3370/5370/5372 USB 802.11abgn WiFi sticks" +SECTION = "kernel/modules" +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://os/linux/rt_linux.c;endline=25;md5=21ed2a5918a3062a6c0323ef549f0803" +PR = "r1" + +SRC_URI = " \ + http://sources.dreamboxupdate.com/download/sources/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V${PV}_DPO.tar.bz2 \ + file://makefile.patch \ + file://config.patch \ +" +SRC_URI[md5sum] = "8ea0d247ac5881de1cb4c113ebf65724" +SRC_URI[sha256sum] = "e732d6b114137aa0badf46281d25d442278639d798735317b0061d3ae573593e" + +S = "${WORKDIR}/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V${PV}_DPO" + +inherit module + +EXTRA_OEMAKE = "LINUX_SRC=${STAGING_KERNEL_DIR}" + +do_install() { + install -d ${D}${base_libdir}/modules/${KERNEL_VERSION}/drivers/net/wireless + install -m 0644 ${S}/*sta${KERNEL_OBJECT_SUFFIX} ${D}${base_libdir}/modules/${KERNEL_VERSION}/drivers/net/wireless + install -d ${D}${sysconfdir}/Wireless/RT2870STA + install -m 0644 ${S}/RT2870STA.dat ${D}${sysconfdir}/Wireless/RT2870STA +} diff --git a/meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/linux_3.1.patch b/meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/linux_3.1.patch new file mode 100644 index 0000000..3d6e3d2 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/linux_3.1.patch @@ -0,0 +1,24 @@ +diff --git a/include/osdep_service.h b/include/osdep_service.h +index 4aa6478..c15539b 100755 +--- a/include/osdep_service.h ++++ b/include/osdep_service.h +@@ -46,7 +46,6 @@ + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,5)) + #include + #endif +- #include + #include + #include + #include +diff --git a/include/rtw_io.h b/include/rtw_io.h +index 15065c6..dab90b7 100755 +--- a/include/rtw_io.h ++++ b/include/rtw_io.h +@@ -33,7 +33,6 @@ + #include + #endif + #include +-#include + #include + #include + diff --git a/meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/makefile.patch b/meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/makefile.patch new file mode 100755 index 0000000..a8539ca --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/makefile.patch @@ -0,0 +1,26 @@ +diff --git a/Makefile b/Makefile +index b3ccaf2..9e44425 100755 +--- a/Makefile ++++ b/Makefile +@@ -39,7 +39,7 @@ CONFIG_PLATFORM_ANDROID_X86 = n + CONFIG_PLATFORM_ARM_S3C2K4 = n + CONFIG_PLATFORM_ARM_PXA2XX = n + CONFIG_PLATFORM_ARM_S3C6K4 = n +-CONFIG_PLATFORM_MIPS_RMI = n ++CONFIG_PLATFORM_MIPS_RMI = y + CONFIG_PLATFORM_RTD2880B = n + CONFIG_PLATFORM_MIPS_AR9132 = n + CONFIG_PLATFORM_RTK_DMP = n +@@ -288,9 +288,9 @@ endif + ifeq ($(CONFIG_PLATFORM_MIPS_RMI), y) + EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN + ARCH:=mips +-CROSS_COMPILE:=mipsisa32r2-uclibc- +-KVER:= +-KSRC:= /root/work/kernel_realtek ++#CROSS_COMPILE:=mipsisa32r2-uclibc- ++#KVER:= ++#KSRC:= /root/work/kernel_realtek + endif + + ifeq ($(CONFIG_PLATFORM_MIPS_PLM), y) diff --git a/meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/rtl8192_8188CU_linux_v3.1.2590.20110922.tar.gz b/meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.1.2590.20110922/rtl8192_8188CU_linux_v3.1.2590.20110922.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..5b3a020d7a401c18da9fb4187479167407e2b350 GIT binary patch literal 908652 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

CiSusLJl?Xz1mx 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

gKNwv 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

G8zoj8sj^OAbbQRylLlsl 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
>%#>O70Ac(lev! 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%0AGJVSHTb2mH08!7`$akk}#-st&crW8#%%5$JE? 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

lMj669*bAekSXPKj!*jZ}NoPZ$s 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

o0!UN~(1vLz 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

cO=xLxOvk?P$L(Q2K=&r{kA-YGI@1paZ5*WE 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

(+}rwoWJcm8 z_Vz{@Wad-a%muw4?69PqXf^JR-UC@Qr#*lALM(*)3OBQI-;k0{*Ii%cG8YCsRS#P; zPT$<>62DkpkaM{4oPFs?vAz%4&7H-{vxI~d7$(?L+ka2GEtoL~p@KZwxS;x-B1^}2 z4**O7#yj=X7hfK@moLM<0qNiHm)-7S$L*A{+WoEbLLuCu8j2Ge$$x(B7aFPD9OYm0 zKKXUg(8rK@4MMy8*gd(jX?ByQF;*Nvj$Qdv`WJ6!Sc{wnKb@E?r_Wjud^|IdcaR~` zD!dh(p`PyP->=ni#_cL{>u3`Nwt!|j`K^J$b$|1PxU-n%b6Mr}ZPDL^cP!irN^dd& zxiwV)(U$G~SI@+XsTHVJwIrhE#i5;#mF-xu`IImF9QRJi&Xm%97Tq(; zg!OGdn@Oj`Vv>iQXzf!>VD9+x4B-FrI))%R17&iSP*K!_cP?8p|7eoSv>Tb$?hgY! zkqOcSn!2rJkoEJu5TZTWI`al)cH!g?H>kM(|h|zoPpdNf()>(JVpfiKPl5&%aUN_gKp50 z+*ZmES57Y~*RLPUsR!Vz%^^MC)?2)@oM)T-VqEK2M> z49{wrwWC>dR%HxB(!qGu{C8>sEu~8ac#x^{hH#MeRe{nBn9t(8%N})La4|Bp#nNi; zM@=pi)$3J%*YDcMdDKWqQOG%GA1j0t?at(XU-O|fTd+N8o|Ue^7$mnwq>8S^m!Z3m zu@b|-waXjmM>qRwS2XivloacL!m8o3D4X0tvofX8MTFGT-`u`CNsq*gpkFa-bB&uu zTIC0vR(g*+x}%U1r7atdx~Z@4K7IyunL%Eu-M;+!SUQI|Ys_N|3?N@t_z+;Z?6_I9 z4b6@c6e)LKt5oE;3o3oc$ODNw5Ec#ln{6=BL2;&XNI6O)%VfH0_;;qHr+InRQAm-- zrT3bj^tT_{Q{*e|9WsMoGAF@Qu3F(W-1FIAuRciQDz>G7MIJR+cp6-$X#egv=8_AS zoy1?G7LusHOFixPVuj2h@CAZo&8gYz$@3KtOK+hmlo!V`H;57YvRxSzpcV`T{;I@Y zWS`U2m8>c23K8P}UcCA!02Z@^f2(V)jeP@W+JG!v4n8>&>HWHw{3pgZO(^8ggpIS| z*k6+)PRA%X3RutG`R!&{iX3A_KHQ0L7eQ5k z>A7VIexiJD8*x7)HKRU4D{i7=ka`f+4C7O{Hi<0O0I%I|!b<5o>m`V~=ER-(z#?J6 zoykW~KyID6ah|c9Q4838gy}2WRjo`p01okuMBKtkv}QkzRg9B?kdP#6=3rYNW z?Q+a`@_dN`u4BEw=LOMHRt)IuocHBSVKCGZhYG>nFgE#Oz8ayU@Y%v)Ecier&iEgF z1BTe+QRGNoGx42}wc|h@YbxFXLp%TXnSowwvXR~;HjR)iUN6X1!aGfm{XCJze7PY` z?>jQY6Mg?B-udrR*csgnARqg}@tOeUQEXj`%%WNdDfBUju1I)%*@lF2~>z zu%1V4jWjN4l0T7FXQ5aD&3bI?{ceMb=vKKp?l+l<={b4GoHWrS(%X7RTu}I;)B8|JS{kUT`Y(9j7a$)Fcw9mH z$%)vW?zE^IeG{^T$muP2^@AbbbiZ2!j<7`AP(i6=@WLfk+cx<_=Q0|F{bBaFct{wx z2^-vKO+Hp�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 z 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

=&~A1f*v-yi-He^m zU6TXdXgBXx8>d-sQy1s(nC)0A>FjNE>H8F-vd604^q>t}AwYM{BA{>O2TuEs_8hn4 z$GAtG-G8!c4E(?R^U(R9+*Y!nC!7C^ zg?uG3|5x(Q^Z#%0^F04Q&;QT!{~u-kAGR7l@|)fxOMubxC-eZsMt0ny9-h)ilK}0> z79adY0WM0w-)vjFa@tRvp+-wWA%lG^$!iEt#?#5!AVe3>)6daYZbmtS{&zVkd%!Qa z@}UNTly8`K*B`f%qhgDtiVU8KZS(|WhwRWvGFw~$2@d0*F8L*Ac$EvWLPXbrr`UOX z#OxN#%w9XzV!i+!-76fahYQH=!m+j=y|smhkhq(TiZ7nqcC%US@GJ;TJK{@XPhbGi z0|y?^@uJsOzECorv&xs7zd?{xe(c292k2U;I%rygB^}uLzy?lsvqNN(xdI7iis#oR zni%28&JcYd!&nn-JilkNeFU4(oY--IGS!BipKf9P3z3J9Qv9Ifz^Gkm3KAibm4^FO{DC|KH;0iT(c<;QhRKnh4;<144ioPZ$Hdc#0LIVr`(r@?bqmeZnjH%GX!r|!0rZuR&V|WEtG-_K#eAeIU z#h?Uuj`1Qp#4BNGx7KJkE&fRtOUq&DU}OcASFm_s4zN&`w8|vyv>M~~k1cC-H5#;f zO>5Y{z!ttelgJw5Yf=))XtHWPNP5tq55JzH`nZQ86u7oG3;oLrI_Ma)d%+#yI@M99 zSnU6brSK1X1Q+P%@-OFtUp#piv>+4y>@Z(9RwTFT5^M!K@B-9`z*zmaO;<33epWWi|Kw2lSB18q5d$(T zt}pmWw2~p9X^gJ~7Z41iXMN%NzI{W({mk1eXq1O{_eC^2hO#Cu?gn=oG%|E%Kp9F(!)g&?8J1?09VC1J)GbvhjUyPxbHwQ<;*`_MBA0f~n)V zz{JAd+$0-Na~x}EZ{6D1bHXf_bxr0#hYPP|9&s5i?nW^7O}G5S*%Wbb2%O!m;dNq( z;%wYNe$gBrFaVXF*XG(<`?y_#-jqFR=9s8#>a!qTlq(R$Y$W=<-SOZ2=bPg{XL0Zc zp#AY*k%GNg{AU`)=lJip_<4^1p5wpg`0tM!|7lW?*X-i%A7%U}K&Pi~AMrz8RnzsS z8*hy|dV>X2NM=jNJA3RP0!*ep#og$-^Lc6Gap?;e+_k0WFX%E^LHT%*g7&f?ve9_2 znB($uj2WJS zhrvYtzA~%k^Ty1@ZM8ZW#rNgcd8f`mRRp;vfeZkZUY7*Om;z{8A&^NRK~LRFeJ^0Yb6GlB(lXb5?mwZR0|ufmQq%UIu8mB9>x1$3mAGbW1(5*nr9BGU@92D3ykL1&PzD_l<0OC_Y6kV`jZu*z$M1$1Xf zS1vOc>ZKaeRf&$vaz?O#u8cY>F`c13y*dl&N=R5@JPQWF0=go$p=2-^>cz;1gw%sY zCTO9+fB_|`rpUBbAd3l2#-J;gi_Dw~B?b&AnIp^EQ9#`o+-O8Z%Z84s4ns>ga9E97 z1OG4l9363f`MJu+kS}0!zz!`If157-roW9T{WkG;{)~PXzn*A(prOi#1Np)0`pC;)m;qdT9$jobYLe=rEn@IE~qpyk~ge!pcU|tfvoapXTAhNyOPzEq`tS4^ax>t5tD$6J(YwnO1-b*V1z@~mq2V*c}3EmD;s}=fhoo{ zE`lv-zAU{sPAZ2&IQo4F3`%Di{>S5XnWTNR<~P4W@G_odg5vmw>b+Nk5Zp zpdv9aID@hnZMg`=Q2AVZH^HG05up-}$zKAwW$7KM56cn*AwpFQ+*|}RA^ueA0u_g| zaCrYBJ#DL~hF$a7Rf^+fZ_RFtAl!GBn6kmdRXOaT4IGECG@+GL(mE^aRuVaKm zL7H;D1ob)z4wY06MQL985~H0+I+QIb%Av$K1Tst$wadMr;y`m_I6CrrCkYLtbEq&5 zr6>ov_ACx)l14Fr(O4sz|X z2BI9az%?o#=%y5Pg^!Z%qOcJ=pHKddxF}kRkHQA(bn?JQ(Nmlh?p~xa2%HpMPq-<3 zpswuakm;tB_S1)Mio#Ek#_4npnSM%PKYie*2nmv&in*Ud;Hd}>Nngd-&mr_xQk@kA zt;`|IS>dB}x+#UuN}9LAhv{?{S>8$}gV0+^b65Caoz5a~SM(Hrg%8u|972C3&0)!B zyw%wbOBRFBVM+B^>w#$;mA=_oi;*jmKWK0$ZxGY&5vR#%84hOg_Ssb!mmh>r4;j(D#GykI( zv{}BvZsX#oAbuC;Q!GozlT9vaol(oGb!x*dC9bqb<91_2X(t6!Yb>|cz~11Ih!?iU zGEI0feweq~^SOItN6H(UY1Nv=kh@bqQP!V1i$q~#`Y};v&m)f)whzDX!gslJRJTU1 zy_wz$@~`TaVJeIoqRhoVqMJbn{&DN9=aFPLO_rkE(mU^AVE5-JI3x@F1_?_Zi8a3e+?8WBlEHZDr+`q zys=s?F(X4(2&gCp0yN#-eCs8_A!+*^ozo$age6dhIXRkEx2GRhv)PZ#VB=-h#$MjI z*22Eu2W1_Db!_gf8`OD(OaTZfV%;m-(EC9%X+=_@_@*2ZTqw*gUU;Z^cI?fKiygKV zXcw!^#B&^X*?!j!x^(DLx|B6tZi)75v;8h+os`B2#uPD6W}AI+!>lz1WUGlonupKK zREgJ5gO)YE9JWT6)@A$MrS?{*yv{hR)4v9g5dqa}jraYF3k?8f1Tg$yy{ol*R=3>) zSV0Y|eb9K)X8>#UFs{^*VJQM=wnqV^EFk>>0|F;hOxNOtEwy?uZXM80EKtN2Oq%o( zyuC^d5ls_EEX?9t-Jv<@Ttg8UzIYsHB!GB8E>injZ~z+k${>yiP+V1_PPU<_vJk`cyW1zj@27>qThcoJHWEHZCeO5^y@sB9K+N2_i0 zd%ad;OpVecP*@%`2#f2ji~g`BL4ziV;W)~)kN}6U;ML+q(f33YiUtNv)ToJ89oi3b zeD8|VZt>51lg0*36VC)pi?87}=dzw9HoRu3M9v$YY^N*t-UH7SH&$xGH-jJQcLJS93dwAD zi*pqwZG6?jJbyK(nfaU$Z&oV@Q75(&K^@p@x3S&K zIls|0B8{$3FRw*9O;jY-2eDQy*3OR7<@0Zv?CciMqdr|Nx0}^muf6IHnpen|d8|p; z>j*nZ+ksB#*l=)GutnDRK3O&xwq>EV!`aZi>2JInZ)vnrAs0~yOs}ENIs5vyrbizg+_Vm_aRMpa^>hDt1SO4*fG1y=!W_c+vWb$B1|O%s0`Qx&U=nsqf8&=qEs zO{ByCnFWTa&;ekKFY{Ukf+2*8H$K2H0~X3wb3dN9-cX1dV2}oKuZqX%IL+2Y?W!{d zM$yWK_XB%-%Qgm}>pg-n`_h`P?liKIR6NI<%>WZ6tHz}t*2Y6}oZ7wi7@L>^=5}U; zIgwF#x7}=ZTAF62A#gK{)ZZA7#w(C>Hok;tl~f#Uh{IDLGt(+UXQBu9gB5UNN_#vi~{1rxG*t=iDKXtz4e;C1-1V``P+!N`VIu0#YJ z-(yfSxZ8BxPwt$D0ia?n9fy7!vYyo_rmX1%N_}iFU8f_UK^No3K;caN^Tl=25ICp_ zj)1$-SPH0O7g%lFvS`ms`^Q$ennRPAOIu)ooKK-nID(>)gySvUmZ9GZid~`L4tz$pGP6785gri7A*cgsb)1-GnG$m8b=Y zL)UY_|J;WWspBy4o|bY9(F|(pz+2uR26JrC1)8pWTelr{D_PG44{_t_lqyauNBSBl zbkFy9Zdi@rLh?P5hup2-#;Ifb+dxxQ?h8aL5dGwcCDT?!xj-GRkFL=(b(c%q8r^x@ z>1`se72vuETSY-lM5>}7y5cdqu8nx08Qs}c!;4~i7}NgP8iICy3UkQCX*|BZy<6!x z2e{}7QL4Vbb=UrDosip09oS#PAl({RgI4YRiSE!_t}k8J@iDvKr`G5;lZ_Vl=XkTz zQl$RlE<$^*uh>=y+uOWOvTnAz> z8ZEoG>HwM*hWlTkc+6L6quUC(Ry1e9g3>@2e2zL7Px#s3L}&k6+r^r_*d!Yc7T|9& z%t^D$zeeDKFCXYQ$YTKSSC?(ZMnb5V7qbO(S~o%u2R9DA7E7+=(s?ZFhs8(uO$18^ zBdJjRQAfY9=e}E;FB-IFtp!4FKtH<8r_mF9J7)G2FGi|Xr>AG;RG;0kZA|QBD%!O3 zg6)*Q@?nhY+Wtpm7#YiSd2T-EDtf8Y{6w#Mhn%Ppdo{OWt{`O~sV-=7FAaTjxmr5z z6nCV#&Si zz>@IjG<`Ljfh_C0jgUjPef)@PgN1We@Q$&OAc*2r zt=4}ZEvWb3%OXPKxQG}H<%{RxQ?(*LHS$&Isa}pgH6nC*`KcUz3V7C<&6+gY=y7;q?}9g(4|mWrt+OH@{B-u%IG2F+V&tiD9(?GI z4Gj%@K1cQ8+!FW29e1+32?*DCfF)a7vpnaXW*2H%y7+8pMV@qPazpVvjvFj_SJfOkY4@R2N0VB-Sv7 z1#Zx42d!zW7IR zuW>`d`%rKK;hvR_=esaxVbtp2RhD!wte(FwR*Sl`!^>#&JG_O{S>3$WuY7z)J~MP? zV1C3aYhKf?_t%Bjrh)VB_;$6hnRlbLd+lazT%+ZOp9^MqA`pZNFJGnnwC?H7+MD@m z0up|*Hy-wU8aDo*gY%p7>)J5W>tP_7#V@!p6go2ariuN4?rq~19g*H@>&-srTAv^s zJl4NRuIlTQv=sxv|c|6<5ZIb*_B^D>BF3%BXw}cdq z`*0dm?WH|$E)GK{)N3^L=ISPmEy9yNyBr5COnmf-4ryr zSZ$_md&yQRj}_|;_=&FH`T%iCyb`)uYGF;b7XN6dKK2zV0gJ-RLlfPF%QVmhbMTvB zf=?rNyv=cB+&W}@rkZGQZhD_^KqGb1hJHmo`U!4LAKqgiQJaGv^f(8Ik83l)#ITid zY4NAPd3H4(-+dFRu0r`EIT(2Azj`k=pb{B5Gl-%Q!DLV?UI9+w4H z+K!}GHUZ+5sF$@4zwKR|e(-xAw(>9d^Ude~;1MF*!;S#Ty8kJkPn`c#0r2zrKfl4x z^Z7r|=l?vP|MSN^|3?qc_-Xyv>W!lZz$#$kzyH&x-aY?_pKqT3Z|(Whoc~@amhy$< z{g2Q0Km8^@&-4HD{Qo@v|B>haaFU0BH}wF(0QMrh?CHC38D#BFU*CQw!!B)tH3qkz zhwe=}urZ4R1FoA{8UzoIO`&n8pVDA>w{{wgt|R#_Sh5(kJLvEXTX;@ASgbV~v>I(p zSr~L`VkobgFnsllr@FB@%II!@}Nb$Q)hFnu7LcLVE$4mce>eeI#n(pN^sd-Y|e>g$6b4z(7eN5BTgO=abA za%=D|jRAl%c&Oz^w)+V8bae(9jX~*el{w6!->!_Yk>Iet{mdbjeF%r741&WU5}2v< z<^lAB^w%W4yD}_wZ=HKzt^+8cU(yD$?IGl58o7A@dD?4z0HyV=n=&NaEV9WP>WZh? zlub3IlSbKU4Tk+Lyp4l6AxI2m(p_AQT7oQ{4!<$(`y_kt4>AHj0(VE6g%&uq zs|B6f{Dc)m+6c9%Tmh_{&E)Xc>`vteAZ22lVsx~B8+-A#5=B<0ub z-d!c-ipXvN{q6=pG@#>_BXNgG1@A3#j+uOV%ToDf&O*2eoB4|o!<(7j!O?q}ireaj z3k`C3A4%&~&VizX@CC-r{0X*{pHyGrN04Mdl1u}J1|-TB3guHFKi@BAQ#7Z@y*n|C z6SHulR*Y88@3mWGS{w7h#4CY7i#J?txu#^^gmR*AVVah#-8K&0&rYOJPNq=SDTIhX z9}<*CAVdLy;_HBe?jr`6m~8gl7$lgUoLAZ}QqPJ-HR4f?IMjf%+{X>&#Un=*9Ln2A zrn{`A$b$8(Sk$Ou^{g1w=w8;dVo_sDeMB!)HY{lt)l)L_5ISG)G3YH3O=mW}7G9Lb zX(2T`y)sJ8nHaIz(Zpt7YQ6HLHb~S7fqOw1r?odj3u-nWjMhsAlKU2f+YP(%)?S2A z`$`h^YYWuQiv()tg#xt`D^Tw%B!Eb{)9E7(##orlaJk%`Oy`rI;&5B&{UxIO`Cz(8 zL?k1*2*mMVI}nJEQvl!>j$|n(R{H0tNep+a=&zzi^Sq%_-MKYbk3)mxvn@RLF;$4C zGt}vX8JWEb)w|(26I7?(eS$87_eGM#6Q{`Fm^}5VT8smOo}|J!Fz8A8ivxomtGqbS zK?$0RgB=tv!8#FK-~Wu%;ru(L4(FLthw~Dt!+C+!;XGUFa9$vFIM0F#T6$)TzRax;XGH|aGo!2 zIETayKOc^)y~gfkK1p10ULvkIp}ZtyerO945d@TcT9;w@Qfo#sF+D%AQW5>RpZgRk z%z3^P<~&LYE5-I@baq7hiQmzxu)IJW&Yb*BWM!VK=dw)w6WB_bDRf@y=t+xr_y0Fu>cXQV; zi)pv%Ei$Q8dY3md=`?@+@ZoKS{mR7K&$+v|HTG9#oaZu`H)?sn-f&isN2r5;##z2t z_%&~4v&PxCD8POReH&IPcD2_NZi8|Wa2Oz6fy&ovHML-jicYbuMZtyKyE8m#|AVbC z%JMlYd}E@`0aBxf{8+tOs#I;4?qQ_eRqeJuUT0G2^vpBP-0jjGt#&f`_yb+sMt2I> z2~dYzhP{8!a(7V09D8{9PZ&e_?`Z_!jDHycGoQ<4_B?60wT9igD%sF69mlq+c)uUo z%wLcV1%PH%I=KvTM5l;M;|T8|Un7Hj;|HGDf3h5{* zuXfd2?$+FMoNnh(ZI!E)O0@z52bF(=7uJ4(uG;*gc3a+|Qw~D$W*hQRQq;1(XtVPx zhvX|pxHH+!YPT@KCtLK#@TXEs@>!z3DlaZj4CQ0e1(#F;7b1Z_?>V~a7t90R0pp?er2v*NL$swy3(Vs%0A}dg@*zCWu+2S!$XM@>vF-LbLYwz#7DHJLg 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 z zG6up7-GFW$mLG2zX4hid)uyR13y#&Ln{Tgj;oI~GgIVks%O(Q*ot3Nl{ATu$FCX&T zPaFKyAe69}BGZsAyjhRT;Le{>5P2gi%w&SttNbJXtzmRO|7_`S#9|p_~SKX$PBqO9QK+ah8RLG!Pnrt2hqQ<*7;YI zQkV7g5`4M%kJnx`=2M%WzBj4=SbvZWzd&gLJMi``vNg=v=ZfsZy@kY{_SMyI)mdxQZ7Io7B+z^&*} zz47`LI@vHDcfegNxAV=_?cI8_uN(nprl?W($SR!L%wgKY3s`SqiM9ey3Zu2}vc=nK zVa5zQFyG&8C0Yo9H zn9o1tvx~WS@-I_17*trc*BiMdX(kWm_6ELmnh;@NUBpQ-pm7k%`-qr3c5Am}%F>-b z+RS)5AUU06d7K`D|6S~5c{r`iO1?b+M(a%jU^M}D6VR>zgD6eVJr~;*{$lIvi`Ii> zJ9}*PG~-w4UN2{xx|HD?J!L49&cBe0eyg99y>Cnc7*ksFTbVc%WtXq@@Lk({Biz&?w6a-`G(Em!WO*W z)@D=ALy{RHf31G^zum0o%k35=gJ(c(Kg1+b{@=t4;M@0q|9I->|1W+2cMsSzvj1ya zotORJpYiju|NFB4`?CN07u^5-0Rz`8{u8ek_t(oKqonSQ9dp2=QunW}!Sz(KF=Ct zzgd3NpA6UlS#Lfc;UC~kYZ%7)<=QZk<;`sKp&+&nU)%0$IB{jf1K%)waJvTYaP$V1 z!+T$Ei05tM`c3qri0oQo;%}&d;*}&gi!NJSYCBI1@Fx+v37?bA^ zkqqL=*He=4*m#rx2T#SO<@49+ahaN271r=^ndT1?`It~XSm;@_$Avz>yeCMEXPfz& z$BM-3kN*u4AAdPqDjQDfMi(}P+^s>CJyuFSF4&kzhT5nAwZ}nNJ{W~YWdj`iy)Tyh znD34ejST6*V<=~3*kzGFjDRt{@svK(U2++t3B?^F95mpI%}kq5R|}9$#Hf7OkIaft zDwjJLO584N@`2xVL%#gvDIELSY09@D)BEl#!??wy*KnX!I(Ro^1iNM5pA#OPt>T7^ z=pc6)imY>fQwDeDFSn=2&fv?#=kH~5$;sx0aJ2x7XfV4@*yJoU{@2?7-@N{VD7eqz z|6_FyT8>-s|8eb?_219h1dkKS`u+6Vo9V+5nCWE8-lb2VpkAHAWj8w1=6h`9gaXY z1UcY{T}8SaajM86N4gcn=52u45QMjZU4!s8aB2|V2HhG2+kj_75Nrdx4#75X>JV&$ zZXE(`AhIC{w1HiRw4n{0TEs$k8i{=WAqre}@E?9sG+AD3uVBYT+}W^rmPj)^tLG{1 zbCly7Bdp2n#UQyf|HOzd{r;tqe%{_KZ%khgp(5$um{;L4b)2W~(mYDXxt}FNLn@Fe z1&>8zC>}l}%M5SA7-{T}4M}jSBK+Y=qVR4RKWsZ4pGSvB*ekw3lzl;xqv1hq@E8DFKp%)245pb*en(;hqo=%Q%E1%Hz{%@nW4;4TJqJ4OKlH(xkEH z=aXo}#PAM+oOX>EM$%i%aq6-fWwFYLRCgE#EQ6NnM2=sFTLm7};dX(Cb$GkLX(vS- zVNG0_(@&$g7^rTmf~Fcu8emXP+pVB_+W8|5oC^c3(=vr`6b7M+`jHIDg?BsrrZzD! zEY*Y=%D%cGwV@M$XfE6S8rdmcUqZy{H}PV(K)Kx~%9X*hw(I-Nd`U(7r~UIlb=fX? z4{(jxc$$aPEN@8)ZSI0%Ns8A)9P#q*$j@Jl|)FJ|WBR<5j0{$AUSVgTn;wS@9r*cy)|u?6Ra@ z1jX__r8|OF4I!B*wfScdaxEVbJ#lB_z2_{0Jtmafw6Kq{ay(hrZ6q zcm#8>ENw_$6wbh6aHDBarw7^kJk4ag_8ocomF%qR)%EB7XR>lEW#w34YDWql2b7yDtD^t z1#T<6elBe*+^4;6ID~^Kk(^8{It}!CIH|$y=EX>$I$n?%ha1hv@#XUOyH&ESRI+`* zRB{Fy?}usPv~^dtHB5iWk8NwLDBN^7VYMC@q5zb{G$`DeE$iBK>ZFvKtJ{6H z&ev9*uMG_X5gebV1q@|D;mU!#bnpzz95_1`N5bKQ!D#-dC=;d%Qe&2r_59J>JP1=y zCG6t;g;RMkZ=en{z!iuaW}lV?49dx^mPihFDw=pH=NCo9$3%uKLOff+y^v3nayBkY zv1Lil#!r8YVh!+{f;`?0o_(e7Z`1H5LF zFHxZbC(Dbg?cH)yGe!mpxAicw#S+6nG~r<#+1JQzN%kw`Qx9$-ENq^32Wte64Y44v zNsy`607(v7G6}rPFTDg5kdy^j#eDta z);Tbg;bayZaN*I=c_9cZs%6o2Zdl8rw#i8?i%hwosH!YF>kjH!v|ONgYiM11a2OUa zr`4>HOv=|kADpv}_g3$%PGy~So`!Er+r19mT*#(kIf8}k1*3O@M-3UtgVJd}gS%DO)?m6@%;0tb)0H1HkcQzXAI4chp&8%__c$7{R`mQ(vMPq9c&q2I zbv*2yrY^jn{$s-WRYIS78psEvNw>0ViEur zHS`z@7s!-G*VE(kFe%JERvgl-P_45u(?|I*>W8@H&xw9@FM#PI zrfe!ivQ3?4J=V#?EQ?0cqH}y&vSgg$-QU`_jzd?L;N=Uqk875(k)XD+x~H_+2sj`eNbwEc2_Y=2sV14;b*|N6oD` zSXpnKc!?)owM%DK&WXw#r-s8ibBRMgvLWZB%pvcYY5Yvv*>&k`I+3cLqc+tn1p{%S zQ(&Ti^UMmTUv>cpmsdsT)CtI@j|#|=X;XR}RJ|nhPKx2~T4V&K!*Nzrk&HWV^oJf= zjB=Mw=}cpLr>WWjb?H~tAYx^lCNS*}6Uk}QmMqx>Ze_0TWf|z4LB!)@0*6k2OvcDN z%STf=)?7LR0*s1lD8I(LPN&i#bQR;$c~0VLzsq&WfR1}npea1ptqf)OFq`)CB$YLB z>E{)e2_CmT^JJs*bqoXw+QOOG*;eG0rYtw$uve`PsCcI3B!f)k$rKty?m77tCw4bT{OqZGi zu#;F&kU{6RRDCx`oEia$whEZ`Re-Gmre=^I56<;2M(1fpU|plcuqq7itWa8X{$~2s z3t~Rt1%nikX;;di;~=as>eOq(roVBVABQ7BqF>JZ0UP^%tolaKdbWA1qvovxn76=Q z{9*H!H%S9sFLdan)jJ(E&Y7VAT);yI%- zz+jx?eIw~VB&Sc8daMN_*V0Xot5VlmSqqw;O(6h|F)E5V_w zA6O9R3ozt(V&?(krL+#LL-Rk^+vV-$Q4!E)BX(>wuQ`lIda>L$cLwJs#3I;UE|+)a zN7vaU?Ph0cxrf=|xA%Wq?os!@aPkELsG>ddp9e>+;u%w7qytb%A(52TNXqIYdHzYJ zHn=);7WA{!)?uPLLfxS0fVU2`9veG*W{>^f_ovkXMR&MqA10f{Ar zdhYas;X73%s;`mlX#t!{fDhZY% zP+MFOY(=PUd9msyg~v(9t9s1!+V+WN>vlX+PSC{hSoc)x&^5aVxR+-Ts9bR96py_U zHzl$uZ+u_{&-O*AAIiD0AG+=(#OwNDQzQ846dkA^S_f4e;~6rucRa!ELtd;ZO@3+1 z#$1%!t8yeR7=8m|pcsJ|J>ZN3ApuQ@B~5g5m}VjX+uKy6quXQ10e_^kC=irR3*(6K zU;o5^tcFCBB9UDrvUwtED#%2m4ff3vXowA%CxH-V67g`07^Il6_6P zYspm0*EPJx3nx;#TS#}g^n>O?4c>`V-6B=D_D$53$>vG@M&dD3>QFGG1w{_Qp6<{m z9nuwXM;ILV z?sBiK=TT&@@b!IGg#9v&V{2>i$X+}vXbS(bb>&cY)z7{f1SvbPdzH+DZg4CkeA5thbP>m zloH^yLP7BpIH6E5)OiIa|FG>lo!9KYZif}{<_4lX$}g;1E@gjtl%hWZ7uMhU@KUOk zEIZO`N%^B9X~yOTEnO_Xv=}>R8zknhroD>^V%GO&CclwU^}Hfwq*6jc@D41nEES$s zhQ3h&{pt#PO8R*9366`e!)Bs_mzP!`-ZB?*4W`yIWl+4H=QKsz84o&kc)xWucHy@n-<H81AyG*RUo*h4lBZMo!BqyCSF79mJM>#$LKsq26o!pULioZ$ z7XmlLye=fo(a_VzU$NSdGT7hR5DtB(_e26_%ss0D&!hy22=<)nUK^$>!#m z)zj{R2~;DOsaj7`BdLke>wyQt7o=Q%#``sDNm@r*eVkoiEqcAAe+Czv@&em!$Hny< zRyKy?!ndSmT*S-OyDMyV#^7lfjv%gdZf7Q!)^6rlg46Q8V|sjK)-0VT^luhi z3&ZuVTR!yFu=e&$tHYk}K7TP(m%Lf<_?vmSg3R%tFC6XQPen9%KBGdRERr;tjAP-c z1E+^gZK@Iycu3qmvvp*?U$5`@rKn8PGtJMccZ56Xf{Oi@4P$7LQa-$i*nH)7cxI4S z!GPeI!}Uzm1e#E<*8l1S-K|O07vD_uL_guxm_;<+BmH$VW)s#ohKeqG=kz5zv@M(%4={2P2^oF%oD2%_Uan-?y^vw?=b3 zlAq2z*r@YTRauwJs>;mb>Vsxxwm76`Go{-N7Jm;9OeX7xT@e=*<>%pp{e1LUJg14K z$t(i_5{3V_@NYk&H8FiRpO)LjA+J9uQ$8$dz7V4dqqJMpkm|u-Ffhu*Bs?&UKdIf+ z>RF2qQHw6C2av_&+3WQE>sRB&?$dhn0nNVLlWq#g5;tC>+vVy5`GYKNL-GqUi_EXk z&H56p820N|VW42k)%9jB^OR{ggg%MpM554XfT3W9f}Grm7ItYfn0gQp%! zOtb3_!2pc9{WKP^(1Z=fy=f$1*rHQ$L{-g>YaFpB@RlDJt{sPvG~@yr6oM-BN8CI3 zrY&D_C)m;X+xs=-DuEPU#NOO#<3cVOVJkdDxJC!Y%dHvUAeK+FSb4E&anKB!_0#E0 zgI7J&or}B{FrSHrneRa1oK3Q`PTU{U$6Ms;V>`SWCj1HVoG!tYyQhsw!<8R#QB~z-hZ; z8rt1IinBlhu?q|(&>k2Bh$XP*0;>{OcY!qtY`DO>1U6k@LjqeauqlDcC85*-V08H* zyIF5`le>3(5L8Qa=E6e>QGCh{aVQF!kR8+=s499Gx%;LQs=_I1FB-5`bmgJXOO&VI z9G0fhOwOdh&FRD7*n(pVUawmSHM;=2gcei;t~JT-#=>ows9|8i+a?^_@X)Gl%|U3H z2rU~yOuoR)3B(YpW*xDEP&13DIS6&L2%0G9_?V1b6v9rDCaQ%5RP#GqJaVE2ZYCj# z5o#FNi-9$anir$0VYIv$HHBej8j=`wg@OGT4TVwjV>A^8&p^Zkg)Kq3lr2eVWhjyu zZHeKiAR$RDbwm-0lD4C#1d0^5oy16?NO{}Yj1-C#xSiHWp-73#{6_qYf*mo#y$V@o z&WI`W+w!Bm8X)Q-%jYUAj^*IM0%8pq+CW{omaz@hv}?I~AQu1&tDzN8vstt?VBO)b zbZxoe0F`1aH=RZ)#mF8G)Pb71Ew^o;rfnfmc#I%Xo_1@x+*S*ju>@iTn?)q zFjinkg1SO3hmH(&mCRppw7_)*cI2q5<#OmqQdi97uzm34OqOIVHL4sT%V|u(&X`nl zn8Ll{RPw|=d4@`$*eB3XNfi4e8Y+=upGZR`Q`|fdF5Gn1M#CYsOu#HKW_yxHkV}X; z5pyN}$d&b@P|A-&`63T3eSs=E5#$Yy-4;}W51BcSLM=Z2kCr`GsKQ5~@*bsXD=IFe z8AhZYdz8zT{DtMODsoGM;VBX7@>ioIe>Mxt#zxsKNzqosp;n{NTY9MK7gp6zRjKf= zIEy0tFy>b1JEz4#^$@jQ_Mlc)AjiR|{~H^;*axql@Sz?0pkeqA4*oX(&%z4Z2i(z! zA8^8c9M0#p(>q)b4$0d5!pC>u@N^yxxyz)rEdn4>)Dj+;spBa8EK9nlg4noWquy4` zr;hypYz$Wi#L(svD2e}q&Oel+YEz_3wLEi5^*U=O@8f#tL5S>nYQrvfSOMMHQZvVf!X z?z6Y7)Qye1_NiTtCC^DZ91g|ag85O^Rw-ud+HH5z-FJb#U;CEccc#RsSP)8 zJVSiMazm-;d+V@rTQbhessTSQs|J6?d0Bu4qvJZU2?IjP%NCluG z5SRi!dSU|7dJ-7wUIeJKB-N=@LxYM(LJY>UhU{8;4llA5j3Q0!jRM-bpbd&?>jktm zPK(>cw6y}-s-SHZ(^d;;v7l`h)8Yc!P|!AtX+3gIPo*)4>pCS*L_p}%Q^^9gd>o_| zifd1EX!7(dOy)9>l2v?_7D|x#lh1YJYyg|RVRP# zr#W~=LVBtW7F$nqu*L&K2Bc>*Rf(o>npr^d^JUQ(Z`YqpLKZqCuH0Bw=aO*UMq5aMz9WSrvvf;bmn$NNlH^b=o;HC= zIW?=z#@m#oT;EsgY4=PO7aCMru7|VL{NsFi3yQ}ihw!gttn3^%#`p=uAwbc^a&@)- zL?5`2wYOSLhKQ`h(__pe?hj7-f}W-Mh75^X4j7ZzDtcy=-84I!SAtM4y+w~s#xt#G zHo#cwn7hSl_q7$^;bzPeLKmN1kz}(0_oxCPp6V@OLobTS=O-%ANp!lZq)VQlJ0IwD zSkRpho}x>2x=_-k=J>WosYVi*gVZU^o)`Hj$_RCt^LgZ>{!z`E1A7I~Noai^Ws4uB z%pRrGAGN{osEx@-F}V2^H43Xm23qoYw^(g;Zw%8?3vpZ_|4D9~y0XYh`@V-YPJ>y? zMU49_W&>uN1>#u?VKPCjr`dTI{f;ZmKTNzdp76j?bLR)Ji(xcQd%cpr?Ryd1l5P2@ zL(R(>jgYuxM#EUM!EbbH5aMr(*C;H~+RHNUpkvxTw7n?^X*+uUddNLRmpK9;>K8}- zs=4bF{DNwI_uY4f2PKE+oG_nd*+6V}ijmm6Pu=D9^%I!!=F4_Bzm4bj6tP~2*jdjv zSKubWcTz|-<_Cn|V)-O|oRoj*O~wuVDAQj(){4-`lWt-5A#9JJf7){9WLI_ zFTeC>dgFu7)#6&*EFf57v|v7!;GwvOd$igaQhh@Fp8!jj?mpRa#`LW%dbf}F2&5L| zIQxp8C88tyGKPn#5+@&is{C9FV5rkUIQz`4sln=M@fiW~VzXFXE}l)sw7R7CM)S{X z^({S7VH;OQwp>B-utM6245tM*(?Ya!iB>lv3GGSou-&ci78@S%5_JkOvxj#&a_~9s z78lNPdC~Gc15G?AHz8|%-iza+Id0$$I9j+LEt#=JgAA?xh}k3>uzU_~pPCh%Mq{3M z$Q8GNIXdM@JKXVaZS$D6=%{4?4nu%+rwsCyw8i#N48J?#Txl{da^qUr=ZBaJe{yN6gxl09SDR$jjsx z;l595;?5Ajxaj{fL>#4;KsocPEA}|p<<0WT`oo%P%d6cTD~)IkGs9Ym=%1W3+hgcevUKG=8TS+|2skVk( ziU0TdRSELG10cw=beKYJu|XV7L5^=wa7gzE7t7ufZP&N!%3Vy10gWhRp}M1vPWT3e zitg{78APVMb7?X3#e#O%8-y7JOW;WH{)vj~eTcrF6hnVB(jrjfB(Meu8y_^TuHr7C zkjq|*DMI1QW+oUy9~rUg&->GJ$lsg zOmLyeSeyeVIbW=q)D&0`Z;o*-7sBY6EA-a?$Sx}dxH{XN`?i6BFJK*Xo~g=aGV-U{QxRT$Jz3NsTI zTt@wvSjQwi3wuL??P^YHR5_@C>*_dqR#1 z(rUWX3^qY|BnDa2Z8k;dNCeNE>nAkKc9hJ-vpyb!aM}ayEHgbeU70Zqne4IY_AJAY z`5v3@#AFyXiQ!87Jeg(#wHP%$Cc;@ZOGn8x7nh*To=3VowpicGSuH(2{=NA_{SWn) zE^>7z7%fzH!rb9cQoe(o^oq=rD>{218uto<6Xq)#nLyuUw-r(+C3+&C{W?k5qD}aM zCSspy5`%PnGE9)JgJ4=-tyk}Xn}!Jol=&n=n$}U6^vO$f1811`bh|T&B(YLg2r2zD zTCSFtOiigWKrfO40IjNup!zVoUEaZ3{a{s#szh4-nxcrQ8Z=1$i9E6Z?dJLXqj3Xz zHkp7AIgOdDN`B`>5dh-UE&3`mJH{jo1G9ivXK}JRL zJTWG8>E_2LVmSsIai&sJJVO~CWi8Bhr5OEaGMxlRbJs?SmQ3^%p?mm2u`KySNu7qg zpdiP3Hi_pKC0~tnVS3xn@oZ_*@L%>y{8bT+E85;yQ0a1p69t1rWG@hdjIMWD-VHEw z@761BFT7yyyj#OVzR%w+gKi*Zvk{D>;GqV0&F1Os6y7OR`H|f-2ack0B)g{#97W5M zT!bPOXW$wN9HlN%TvI_yRnJgdV}WyNNEFvnPa~c^6r|Rz(yHAV73faRCn)XbyS!Q%1*BDe<5;ZsG)~wvFKA?EIJ> zHwRukYH$iHzww$x*{}IDA!}lsj1rObxE>rI!!0!mnU(UeyuGTB*}(QXq+Rs$;`45? zSrL;-Z05evj-i>X{)1adJoSrqrMrEG0z~W6EQe@q$i$Zjr7nVNyrPs+grjW(XC}Ho zVV5a_l^!uck@BoR=*@%$Q8Px=1X5&o$l9vPf%_YHs0I=R)PAU=Ai41oXiRJ7H3GMQ zX~K7TOJ6G0pJl^g^p#i=Xr_c`?lIVKZx@hgf2sV@{ypc4Z!kIJRa@C-YpZ>O>;4tzp#7bNQ(g ziTJ)=Pbc!7Faz1SE`uP_NnB$>5GcdHQ^0njvu$IYt!rHf0?D=&dau0bf(6LheiH7- zbnb{tE%I688(TE$uhAy(u-GS*eB8sw| z=rkS&1C2(8RW@{*YC((4!`Ps$(fIDz1x3eC(e`#OrE-sKLtPNf$hh$7@rzX>^4Hz)CK&=+Z}~c@Fr2ukI1M$3?-oTlOLj1YWow&*!AzMHEg7hL?iB zj>1d9xZU=mayJFTPoW6W@l)`(Tlgs$jtX8>;izDEDtIwXPX)tO!HaLYDj2>BUVPoV zK)M&$1g3KV9|B%9b*ulUul0Sd2>*gF0=>jg*BRV^`Totf|9k!F8JGZ@KH0I*dq&e2 zaj`|;yx3L0PrABly$ zg`!rMUtYh;*7V!;`u2AH3GOmQ@w{ldG_D~D)sAcx)_(d6|j7K_Fo#0Yx58-zqk zJTuc<8P^+B`#^|QU_T~LsP;W4?@*iX9usQM%g3l3;+8>VJm5=+JWu#KMCK#6gor-k zNw3(ai|t|qcXuEuPbIY%Bsr<~4M~U2d>M<-xo=}RH0G-$gvNcB1eNO{)@ZQoIMOmo z(+cV#>Rq7j`qS!mJy#7QI{;N044{|KdNz%x2h!8tpEOVlN^S(LLsZ4+rSn|HkSc7_ zi!)({ut+>A?D_pYSvC;?qWLwcu}*Dg@#7y(@!~I1%}b z7Bmv)et!93v9qf_0t ztihpSdw<|%$)3HJF-m)Q(mQw`585J!&5E6qC0ZGq7S!s8?r21&bK>%XGAIsjXu)uU|Q{=nyBn+dK+)PYzfuvzFP9^ha$j9 zG!P7<)t(YZ^mTc89n>)=@|liZs7JEj#V)1HD5RmoHFlx0+0XV|aA2$q)hm$=IAO8CVm=|~f#>P=m74VLT3!mt4 z?84RKEG6F~A=GO~`hNIcW-Pj>(Y>8i-v7Zf-d4!s@0DdlFt=mh|RGp6W9yBh!wFja2D zhKh2XZVY=s;j3;MmGh(LSqqIi%hPJGdA@@&m((H*QPkRb(%d3Ae>1t)$ z5*v|4RVKbf}TXulp;oPBpMT#z~be-bP}?bOPO{q-ka_Bv5|8;Y(mhpk$@jpn8)t0v%1Y za*gDJ02OaZxTyyL8j06mWa2>sI_hZ9mIa;0ry8_v)3&rcomIWPZwa(Bi%%6aJkXa# z@xQIIY<(p}k5Qw@4=57VfdOra>w*dF6~D;VWj7DFZ|-?Am) zunwfYX#f|GfFPE0dnRN_td;N11u*bzxZXT2Dg$n0wj7L490c7QU~ib1*OR3r>84&m z17zTpGl68PGqDL#r*J&qs|K6GMTmSph4zmDXLoyJw|B^gG@a!=3a4mJ50?yjr+W!> zq%wjwEQrbl+SKF~^^$xv$h1ubeCeDNjZ8rAB>puUI(N|3yGAcbv+T4_kWnL#dnf9n z*gh)07sE6@&5P6sg9d@ON*q}8_9O?kjLtNHHO1CQkP0&>pO9I=Tmk&KJECIYRroglmJuRSQDWHSPn-~h7#Zwk=>4S z>>l`eZnp!!n%g)UP{{ zas+Gu$|Yt)gbmiBedrj+%;Gp&oDU5}#U9oIeCQZWg|T0SaiB1o6&Q^pwl5oUP=T_a zHsr9-W0(`CLQ&-Kqk3LX)WBwsfGxTwW|>Y2iQmyUL|aqndr0&U^H_(uzD@K2B9~`* zQH>p!WC~u6R~WQ?cCVKchw3q5UT((Ga-dIYPu>wb<2NB4@1hS3W~~}cucwA{y~X@r zn7FDHi@z{Bb3Oahgg*(CFbNzzj-?&V4O43d_6HgvcY?ykaa4v(yv!S#(=10Ad9KH? z>NVYqOu}KKQc#`eHL&!>vMRtbhrRB*$Pw&z+lfF(6ya_Tj#Z?O&j$Q;hH!rn?p{h2DVJv_RLd+^~2OTMbH?TV!?{UT~2&B?+TZol?;K z3xOsDYQ~OC8z}Bv&b+0((enbTGamwzXE4ec2w}%Ew?IL|bLN4vMikY%$ZNA`L{)d~ zJa^`iM@g+5snsAr-KNv+5T#e!Y>?1z5v`rrq_nJg@(~VC+Xr}A30;_QZk|W4I!-bI z#RO2O$eb4E_2XVDeL5X&BH{0PpnU1XbQp#XmSSUZ69J&90ku67p<2nNr5!@3dGo;E zerEgQ1`5?wH}ZNR`6CK57`orMqmD2B>a~aBk5sP{AFAYO1r9rxY2&EX5Mk|`&(Zdl zt(Kb-4#z~seNWLBc)ZohLp4>*%|q$1jbOI&a81|=6tjv}sl~`=cs5= z%BHsK1gvE?&+{58U3Ff^C)W^k3u$%Gu4t9-AOdJsY#~rCK+(>Gi4;n=k#^S$@I9j_ zVMnfpZ*tf8CU=N$at+a%V}3nBYNot!?({o@^zmask_hY$H;w~BYJIV++>o8y!wWiO zTG|yprZLOQJ!D*h)9jgZ!SD(2Zrju0wEg@UlSd7*huRjQhK*qiuGD$ht@HB{?;}mi z_#cC0ZO|#yJ0uZ+Q7#dcaW#q~U53IVmKd%aH=>Q-5eq;}5t*SHALJaKoZ1G(qXQwZ z*kb>aXF2#z~MF^A2;c7TFq(ax*G0#RL&yKC}BDg)9N0<9P{ zQ-1%#QVyeMWNqY^AT;Rkb+FN_TrB5M=q@W4%WL?C4dyw$0Lm|r8qyXq=%5AMKCJ1E zwD-dznD!sTy#bW2588X~R-uDw-_a80EB@b+!tpnG4t|rW=r^gb?!J!KNzR$L_K+*_ zAHE)!NB4F<;cf!b=P}K4A%)j4?=s=H)J7^Y3AaPzS0ir|!1csEnTctc?#c)cb8xyP zQ`*8A73P835fu*NL3^M{7n*q2?mC^J@35TyO@xQ|f=a*#Ixy6Ln%35jM#Ar~xWp0Y zkb~k_GK`^e5pQ@d;?xM!cVgUrs}wI&Z&Y-u2x>K{cTvr&A7kPcnrv8u@prAbPY#N4 zMN_cKVPk19JIWxMwk5fw*nVLK)Xpj1{*0@{5u$a#9}I$)-9D8M_ws#6!CtTDbUZtD z{7Xb>m7w6ALdWs#%bYbNMUXB<+9;$z;5z|4%ob443XH!P!T1yK*7QHK1(cDWIOw>{ z0vl~c-hVhd{MqX+4vY9rj*Lzbms4mY^S(E+A)q#&jav6^Xo6-$RS%`{LT|yRfa%GesV&#D7p)sMeKaQ&W6q~l`4;NU@rp~q*j2p9GzT~ zTM>SmgPS_MXZL|Y!W5~X0|O35(a)9A&?c^Xh62s`;4E#WwoePFcUC$?0@`vis8xiX zX3$0f+B=Ce@O}Z@B^4_zoLgRG=q2H)%7cT@N5t~z0csed0Qt3M$W7>9(k)b5HG-gb z@(_VlB!JF6Kv3T$X|Ylg=K+!F1BEl$+wzJ&HPm=vJFyqN8a3#>I6DhE7f}2&#@|&5J|gVjjDpL(7I;8xSQ~HdL*a zGB)bwYWOb3gLhgc){r8p@y(Dz>23)Dm6GZ@0xv6X`^|g{uq`km#GLE8E=6DxBO3`m z5R~q<#A5xGT&?7d+#i&Nxt--KASPMX4bJp4uY`3pl!tgG7`7fj)xbjgQ<@+roYYJhN6%0U~<@!rEPu?74&PWw?(JN#OXk zSev}9MAj~US@{aw?T)%5I3Uh)JB!n2b}#4*Sr}h}5;3Y}dX1oituc(FUOPg=2jNof zdv1emxP(dY<$@7;ZbXRj8^doHlkUOYIm5)rPY-O*skJnWbd}ZS+vW+{-{Dl0Za;i8 zbG2|C3@Fn%)B$MogdF{*KCV{6YUjq13Y?JID-Fh{g{rY@7L6HMMD#Sj9;)OJ+$T z7pKT98*_HB9W4*!4_W38{dbPMspEmA@&KbYzJSHn>KBOU z#Yudqher?gFrD-K1cgtUpzt{p6h3Q$!q=OiuylgLCrwcJoCyk_H9_H1C+L-=0X*-`Sg{BrcKeD_K1g5RnKE-j42(->!(OZ zB{;S?;#ELay`5-i;b?Tj1cC~4m1-2!No0#WBV;|K+@&}`JL*9cCAC#ZDu4tPmsvb_ ziHMTv4xyhlUlW`%*+)YmIC+^zNm7(negbjt;$ZB` zL~P%uRTsD77;XApPjj(g_?@ZmtUK_9Qt_~82vT5}ckM;TYR+Tre#|-}WhXSLo`b4L zL2T}2Px=dnF#yLGNTpo7a<;J=UIqdfZ;xXcMOPWfM4)k%faF?T&wSi&c(~Gp2d=>w zkJr;=MuSpdPvXdB!%kc$;nRb>ZB0j1G3x`}%7$J_z3xcsbOGoG7%>u!n4rk81d?)*n=EdZ$3_mQZ(q3;3b7S*LH3z zJt)AKx>zk6x(0C!(%x9=!=t^hl)-FDE>={0oRa$#6?Lb?qc9iJr|4EVY*Q0biEXS` zgwu{@0fma5LL?MX(M!mgr}2%7CO{D_DT>HN`(X~8MsSkwqZ~XPWa$#2LwnRgvr*4M zRs1PxTI8&I!GhCRNN40*$3NwswCWRftZnzw=U#GK3IEbpNuu$rCmR$0#9gSkxDx~-M|`~+#kGBOHuh~?>?CYv9*=jA z=km6y3*$(x?fLwIrUVQ3OVz0TN(`+{%}TVaNe2((h!)ijOR>6f+9IkW=ongyj;pYE zW$_^9mse)_perBL+fMo?2Zi3 zeVW|s)M1|5q}1Uf)bUqmJ`s*a209BFDk@U`-2`!6ZChRE98@Xau`{`=R)fzB zzhmG701hH2dqWZ>8w|=NyclFksSW0tbVtVKX1o!BUj_7Lyf#)C$sWH!p*-Uh&$^ea z*W*t~NtNy>t5Ae~mlZvJ>IcJd(7Pz3265y*H058~y$yh#nXK^aRe0fK@LP zR_BFbNsktjj)8@VQ7BFIARu*)2`oii7zJeXhVX~=Tz(6#YvQ%8?c)m|^xo!@tm|;m zmEp@G1NM!DuF)F0t`pX*rY5@u z1K-CGA?U{wcS9#aOCw6&^&$@X(_Hew8w_J1?}6y4JQgs$C>$^232wQo1TzO;Wf`Kg z+2DrjC}JI_A9?X5vt&*Svr&y>s(kPEACNvC5K6R=bNszqZ+KA=%h=dis947P^>@ZT zu*)Xdef?HttJWK!t04Yg7fw=;({H6gQ@_^$1zw-W;=_o#Wka+7orZ>aQesJ8*Qn=< zwVHaoxSY<{u);AZ8Fwzul>pq#OV}wC@vFJ37qZxHs!D->)FYf?IaYZ&VzV{wFb4jZ z+q|c1A)+jdpUs~?7(C7J-4q`{i}nM2BH1#bwsG-HcF?Knh?3=iVmhD9wpWSq^T+Xe zI$@|-t@mzz=CCxIz?&aG|Exc&%?#Hu!^DH_A)8I-+pp|PW6#{Pn#c7$t8SY0W6OFk z`Q*LCpRn~R0p8rZc|sldyy383=l?&j)c?&l;^9NRaoDilnC3y_pn1?dY&750t%hj; zV?dn0Hs2WaKfU+xv&AcV!+7&4S*$)y$CY@upO@qH`tIs`wCOwky#M7@f8PFN@PFYn zSl+LupKdlglU)qXd}#c|KxTsDVLaO;p8;XDT!_p|!ySZ%Z3K20d+nibhej|A1CTuSK;KRt8<=ZZ*zID4NnSSN>1>^K{t~8W z4Go-KfqMQ0lg02n5?62>PJo}DGVrqn2%OkWUf_m|<_FA)1Bcrln>1BU1G429Ya5I`aB^m=n+xU$_5bZ^^@X7bv3K)3{k<B};}25ymwK zLlP+_{4NT+#&$#==pHc>)c}u(7~Zbe#-vNJJIFjJY9cBMzm{dukiP&hG*OmE+y-qf zbk112*Wu=9Luzsqhx_ygcz+=h<5=gPF~04O+oERKEVt_;BIN#Ag@^rgCm0S z1Peojvf9rT6KYU$eIUS|%lZS*#AGT|KsmtSgXO)QYz%RnvgK;}#rUtcKh@YREcvfS zZ9SbOAXjrB|MUTX+am>F0s`V7GI_FI3vdmCB802MhW6EM_n8JCK8*!XI^L}lQYrTh)uT^=G9 z|9w6+87J6en93!NnM-#eU8 zQA!2964%xLpLYJgSpLJod6M+^sQlO5Hyb(m&uShV{*eE^$IlP>?}z;NL;m}xkpC{w zeYsmI{iUD`s9tk3uYaLka;kUS0zhsz)dOw;Ag%%G<+cD22Ml!jBoN|w(L0GLga}L7 z6K(+_mhAWfg~1G_MOEyMB!ru~Ycd@PH&>o*lP%0~GD|?v;)zReDaBtq$$BD?R3T@P zAG21LVcdHEUgWmc5u6mEo&(|CgakE_c0Ugvr0_$89~6pC1IpL*T*(}qK0~hQNs&3Q zchXOjl~T_Q4up|QVGSa-Lv60762Exm01$ialatUnvC(^%-a1@J7z^z7DaidITF4VJpN#E?c3rOQactiZgG2LV1di;dcI1G9x3KjAtOnUcpp@^!0hYz1@)# zHwd@*wf4(WfCV))l@McfJkMJy2bTz6?+jUD+BksW@A#_@{J6cAF!-&sxwoI@VsIX< zh_?%XNWp(E>%a~4{#m7^Jrwk@A%UDB&nL5e{9-F{<69nFR9CXSzY_juFLj) z&|@RtabCD*HJ@E&$BWv7b0@rfS%n9=3i+Xprqb1vKNI;4{y?D^8^Hx+^aViC3<^-M zDAqzgMTu&o-uA;vBu_uwyFC%!a=Kn^(2G&*NK#b3pUFR5kQU<1f37~X&*U0d_PVppqYRDU-q81xow-t z&+JV81KJNAJ9TV|l5NGBwntHttyYp%O0?5UGaOo^Wli*Uda<28$$!7y1wevtl4ARM z_sqpJiH+UGVzGEzfQv=pIKco$BvlvWD@hb~fwuV$Caa`YD#}z3`*nA+9J+IFF(D6w zb(sYtALq+p9856G!pP^~<=-@mF8}7qoAvGclMl+be>z5Lz{Z1j87MG3dWp`_4)9BM zopWy1AXPLN5VwLUVt@`3)ip+V;HN)OARg<4_iw;Fza1?mWR-*L@xv?M#qZ*chwj6o zJ@W%RjEF>tNr33&IiSq_+iWzgE|+!y8_`vqN4y#n{^1?@tjlpOi{)~(p?FBa)*~~c zH}Z2cg03ds@*}bE7Q=J}Oy75HZxxvRk-yh9Yi74!x7plOIoym^6K}5aNSv!0-7LM# zjk!Btx-+rvZ%~V%MCAn0@fvg;wE*>m?f>Z++yCXCC!hcMlU!Jnt ze&Riv-4E}JADDWgpz+{vX0^p%zF=DMG#BYYLo%(T+>E3^b|GHVip5yzn7{WhnhyJT zvFv>YJ0VTvdI}t)9Ika&z<o~!i@~kMpzPizh}(l@3U+zx zPf|c@@G%AR#<64r-L@OcPt$=4#jq3ojn8#x98nM z2XOgD9CkZecM({YiSFlt@JiRL^+Ewfbao?27C``Z1m@>T(`?*p-FstqGMXYO)C0D} z{e#zY{IyZUCSJIPoaf$X>h|xz$he!0eMQ*XXz23m_ikhC4J#`65!xAdh#=80;00@; zK&{yW=T}jo7hueUV9^p9s8%HwuoNj*0O;PDO{c+N6;ll;D+dF4C^SnN9c68v)2WV< zC4vA9&ptJ+>J2`^?(d3s-6RY)uG3-Q!hE&~%Nq#GSUkEzRC+911|rIlXlAuH{obvm z`;!6`;1=w61JvwF5;kUwo00Da)8=_I)V&?h39vhuBHb5!h8#N+{jMZVoS^Aror(9P z%Xz>}Sho+vZY{jo&pQ@z!iY)yGCg#rqk;4kb?@D{n+(Zcii6|*8p^0xNyg_2k5u@ z20Cn5phU^aN$G8~Z_|)%QluVD&q0d;r1-|i@$F`f-d#5G2*mh`m2dTX{Tax4+rI!C zhq`>cBEirqmbvI6T#kahHk-3mlv6WASQcSUU=TpEpu-3%;hL#1!MHv21WKoF+HRv+ zZ`Hzae$_Ix)6&kw1?}WCCSd;&SJ&>tq7~c+W3d2%inV+i`o9nh+?h#Ykf!5pMay9I zQ{y__i~?1o?}WrXZPHT^WcuRKysAeAJhTFS55dn9khwNmqAl-NA}lm;WIGn#N%KSMXZe7&>LzhC}cILs$JMMA_d=lRbaC>m@PegD}!duPOuu_ zVIdvt(Ov+N@9G)Pikzs3~4c*yO4`5G(^0>&dwHjset< zx0*kp3kzD<-^F05$P{i`4;cULt|oK2aYmtG&gNt{wYJy@*%<;s6ZI~E|Ty6@2 z?uikNF^|}-H&`7oRxS^YU|nao5B&W5&YMCvrqf^JyyO{x8-8c%!$uN?^?Q>U25IuU*R`rV52)kag!X8< z6Pfq8g)GhpG0;zIZHdN?mroLE7N-`z=*W)2*P{L-0i&J)IAmGtcU$*k+1Vs5P4`HT zxT7P}r|%rU;TCY3Ue);U@fJr74>gHH2aKfhkzPE~Pk?jO?yE;Or>v_5@S+!6NXY&> z;@B5ZA&!6!X6vck?k6d+)624y#gxr%Z$Xmz!$L}d;TU}$ z>sPRXF}N5FhruE|dg$K;xOleFL*~8l0XZ`jhP~Ji9+}SjQ=@6=2h{5dA)pZBq@LHP zAh%`xo&|3HkqI`h&fmj7umb87RJP-^KjhH4Bw-fPe#B`b3u7%lEmvOHL4xthQzYT( zNZ=d$wmXXTu^T%;X9G|-wv8&lO>H&}`W&wIV6*$Xm~P=O9zYHBEmS@Svyz!d)rttM zR&Wd6k^Ix}1ZT+T1M^ChR9mV!oWew}76}y+MS{IoJ}p(El%-W*r zx+s*CgFrk-37Z0!2!;n{3!e^HU9Hn9k16|bLmc)d{ zc+#pU$Z9E;vbbXlYj@q64HLZ0euiCssAWqpx$Ul^=$ZsbzZ60wW(><4k5Ol|CM9eD zKe$;B!&BWkhQnESw-{?=OOtE43;cSGXd6V})E|>o}zqSYK z0*lUzw($#JdcijZpWm((R_9)`!$Kc3Gk&)=%HapQ=862xP_-A{xHj31oJg;+ ztJh}3yezN2ySi-F6uBm@g<*FRBRoGlpBG?6y6%OE-_P}~)s!F5|F`{hUi#Yo}B0>$Eo|DC*R^f{v$u%{J*~We|_`+`uFw!Qk}eDwaRq>3vp`9=g9AS9t zdHhN(U8(xTb#uZim4)pG%T+{yG(y{4*YD(K5&Gi$XBT4y!Cyw-u*uBdiMqh4leF~2 z6H<0f{;k0fdk3R`S-U)A^pNK5Y&@Q!FBY2yFm#}sQ`EulzmFJdVYg^pyUjL*tkk3~ zYxTeWl4`wuIJ_B6e-NcK=pz=smzag;T;I!`uNo#&XVPRd;6Lt|%?)p@eX>O99}b)IFiI!`xQ zo!v~l^HL_O^HL_O^Fk)8^D-u@^8zNT^CBjz^D-u@ z^JJ6N$uL=+7c^O&uQyqpr^+glfn{k=V&{NTrCgLvh`>5J~PG-8p$sRN|7L>k zBznu>kU|!+YGSrC4)xMuJPtfQ@_p@I)J@pC@E3db+$<%!U0lQ*m)jObVbNnxmtZWptO?BKYP<0aiV zceF zil4Oz{%bvgLWNQG=FJ<{y6l{@>r1=FbcS9=uf*Mhu%nZQD9#aQ42?S2{Ep@o1RS7| z7KZ|$aK>PQR?IgwcIi;Xp)Gw)o`E zz1zauRWRX(enz9IKMJ`NZ>bd+iZh2{UD@;iW`;8Y8zp-aY**=r%nGcrZZvE*tJADd+OE0e|Z^mGZTztOIq_^B- zRE9D`YJAeJ_FZd+mnU#`goJSogI3ct9xaf=n!TRo76~D)i~`Uc41%#1-o{2gJ)6?S zDDBoe7iLG^yapKV?M{zR25GE?wg02_jLnuTQm%;hnR!ny^As=Tes3l{O z%x2x=uRAJ==vkLqjJ;{px|*hF;G$WJ)gRJs(;o+_4tfJ`N<>ltoIqYVN2zh{Fll0u z*UbT1T`xZo*{Mp#p*&t9)lm^!R8xUu*OV;!-W{$7qNW6KIf$t>=7=WDO!p&y?TuCK zDr`i_3M6wS#x}Sl^AW5NJG!Z+RmbaKg_k?585y$`1qEuKu3WI3<3K^FT>24+SU?0p z>(~N}Q>lK26J+6Rc6*yDX0)7*J-HC*XT#YH1I3=*cz%qu>&*jewHOP2y=x@uT_0Us z%kVyNk$8(#_&H_-SM-&rhmAtG{l^rjYh%2IFL6!E{vAPtJ;2v>e(F&}hkbdTow2NQ zkNLjce21H@9)d8b3@8Pw*#m5{%PQbb4u_9+wP(hBo2d}$1m`d6kh8|5#yyld&X(JknON#nXKq64Y zK?2$~6A<__O@mOVNuq>G(i#UG5?7r@1Ezj5%L}?u(#b9;=)dzLELb-zX1`-ViXlpG z@h($5*repye}}ZQ}Enf9N!3(Lv}oAQE;`-|UDM13req1Lc?{Ia#B@UJSC9~;LD#ogoE z&Dz9Whg)+1*fuSCzs=lSl|%-t*oGWXopc8E{kLR>*4Jj>>0~B7(Tid|L}i}YRbtGN z{U)Q~WI@;MHb3gl?6=TukF#mx{daF88xn^d9W_qWDu!87-Oem-qJs9JU=eRO5w#*B zt_MEqa|RJR5I)EF{dE!ND;jS{^+eP!qoBNzS=Bew+;@eZKmsRc1X5eJ|6l) ze|JLfE|!h0lFAH496mntcW4%oWdFjOFI>Az;&d zKUxNUYRW?%TyD%-N{V$=@6;}B*J)dV;y9net%5P#C#n+?fpjmg0^mYjw=Q`b3#&7w zqgtqfa$13STGlylp>Im;LIaY&%_6r*9-;7z7J=zlrAW02Qq)xnBX+FX?74~(_e4ea zL7RJfQR+uk)BEgK=Jsu;&dx-{#C;ZH_?F`C+fB2j@Pp=wbCf+QgI$ap^$lcK@5R_< za6{5<>|`GfGi&*R{rDrx#1Mo1INzuXDV#GHM|9gHRXU}K4H)s=$~I202kn0H8U8!n zr!uK5EEEgh-&{Ir{{@QQR&t_^lwqPaI*ZyPY7T{Vd*h1%wF6V4+l66mM~1as8P<1X zSkGlhCYhlZ@EYDJ`)#%i=67dw-}oN3OE7PZrnhLHh@)Qe!BVC<5@#gtDM?Omb%WWn zVX)wgps88)jkTuxRN+KTY>;_^$Lm+$eHPOkJB8n$<)n8)e|%2f??SrcB=9qVOG#jq zqbMPmFrq&Tf)4-IiR9IHKglI9{6qOG_QQV4P00jHXZ;Ck9G$`76}}C!b&Ok8;_in!BySvH7`5- zJQoiQB!KKsJ|CAY{1*18)90`>9)%}-LB&hs7E}{wQ_we(Np6MB+~oYtX^a2O-qkj> zjV$ZW{;>Z+pKd{xfF%oXLT;*TS;j8>7D)v5Y@JdGTNq!A?Q7WqZtd=WIp>$&?w%QG zG?EM?BwIOU*VYEj)ARn;)6>(PLwhb|%+@}lt>k5YE+;F|=9S@GErJ|jb3t$w);&EH z!+c(hdJ<#!RAm#|<0mUC(LS%TQiMv;c#zg|*5rjFhaE$ajbcM1ue=3`=8mKMWH*!2 z79lZotTCPuMb6{!iQ?qsQGZSpIgfXnBiK24=ub40oykOJt@USWVc2^!NPP=K6R&^$kd1l$y-LHsb zut<%`_4NxP8s(SALhCeNlb2cU1`qw~>nL2ksDv+%<)NRk+V7Rrcb$FzDfJTGi%6d- z!Mfc%cWpRO=qt3*gd*@OdV0Nl6z{d~P(+4mTYK6x#Mj_D)3yNiQoN79 zUQef5#H@!>9`8s`2L)U32mEu$zF8ce!hS5Eyq_;ow*s;tM;5?B8A$L4PIRWthJXE` z^T1;s^oMqEkUHqIdiVQv^iS%cm0$F!=V~RriXwx-sWw6rKH&pC zx;8ZS%~QNMJUmU2Bb^(rL^AB|tyH>dN1xqvh`U~(Ssy37gF$o=+=k~1eqmT!ujZY3 zFmlOJ8+2~6yTrG7?03}-(0o$=y3ut9Ct28?!dQz@u2NyGqZM?|QnVX}HTeS?p|z49 z?1W!b#9dz{arhlzd$wAlxk6?iD;0#6XIHV^EJTEHQ=!BYiOw9dhSx6I%{FSrqYu<| z82utlP?0qSYd*W4j72WqGMGholT{LW(RN_}a9!$b(U+(RF%6>#`x}W`$at~U>Z0B7 zT7r&mjP(oNFX><&ID=4FJa7JQu$HN zn!$qR5EWit`@_|8%96zo)RT(8R>>W6Z++*@SHaY2qRC+qoy`E-hH2ZCZi*R#c{1oT zb-NVMPy^fyiQ82}B%UD+qz6M)kjq0Z39iqBrF?nLLY;8Do(3ya`%0%GTeMR%c$Z4T zvSOU9vXS{-Yj|6}f{%!`qK$S%b)=zm_W8I2b;*Rxe19l?_syQd}&aNR^|^_~m#x zUoTizkkKiAA@}f{T+~?RGh?xMyiOkHB(Q2&ZWfHneb6Linw6E4m7Py_W(U#=7Ss*N zXU^`GC~!brzJpz@hD^m?`wa zQI>8A({kMS-8HZgq3kXv4zMcbi9*wz&n7U(cyNPh97+ate>X+bFL={i+$1R^+_hZZ zpfsTS%gJ~$3#ObCBqiii#`*p8cl{{d1%Tr&j+Sf*wb?41%>s`ss-Mt}1FC6<1G6yKe81&MRH~KxAg*ai3QYJrywh*o+0+J+gIMHp|DXX0Z4Z6R%fBb*U9# z%KB7Q7DQT^VpER|>e4_+Z?D5!T8&VdGXoiWakSdX`U*j~kP@4jf%WQWY;91+B&iG9}EZW8?u94ny9pYORAkdh_SdCe-LPN6} z4Gm<1Q4u;qTV!;Q0k$fYLoWN;; zsL|@$_4xx^>-c_h@52;FZOUJSky>20VO`;~z8(fcyj>Q`_u_@VVjXoq=Ih7x;SAL? zKL=8p&HL89_wdO|WrSvjO|Bcx_grCGesqWbBomU>^yPZ7>Q2VYPG5{Q?@_rMA9%re zYq{c^5iFZ{Gqhhm+BYiunKu^v_JgUqq0vP=^5gdvq9CKpzZKaVoi;$;-WUL zhFV5i`R!Xce3qdH@n4;{!UT(Z9Sp-ZH$BXGY^=27I!SG za;qd)Xo3Wvt&cP&ar(l{fCMw9_{tu`rIq^IPzR@3vux79wfHL%NF60!05&najM-`N z!w#4oq<$RZIyyOOTQ!Ho;EbXR%;FHv4HB8*+h-)%V-FvQ%nn2CHhjFo!#Hl@uyTg5 zqCHB{Dl7`g_bCoL&|@E^WBjQV)&{3~A(&b?3aPS)h?=|Btp7uVhR+Ziexqa%xvQPT zzcSZ>WtDX=+Md-SJM=JFOJeer>g&4WYEU@26kGA&!DJC~jjJRaCfS4?5Lg)OZE?^mh%2il$k<-c%V9S@CsA0B zo(jiwL}J(j2>!i_tRv=0o;^gZ`P<^VV6os^Tvin0DNn&MWoQ`hp*9|ityT(Zgwc=< zRx!$-eqByynbtir6k~3^gz*$D!GR^+L#$Bn0NFX1U41&I&F+`fGjckP3X*golUNox zgDeT5k4AwSxrp57A7ngb5^0CJ!OZx;xVu3YH2AWP%c73V7-Fhsh~#AF!TA*$UnvRJ zSS|>Av5wExX$nwjvN4jh6!E~%FUVd$Ey&KAn>)2VUr@<{($daODzf%wSCQbNw=l?C zmdj#d+-~s>u4s@-Dt!uj`;iL*NYILNNeERM+^W$#qfz8OEbV(Nmd1qBYh3?U&vT`Q zD;qvEdBNS+oCWQV4JVw(bT#g=T<>`b4Pg8ci~e%(%vit zJ*FqBgc41%Nk|O>vqUHx=9Ypgj8Oz@*`IBsr&3cEB#2ANOP^6qba~~ANw?z%j1E0f z1w~Py3n<2X5$#B`7CxZ?pxN-=LH3J>fBoG~%eKE)`+c?lKfGIf75{(bie4#a{QsF- z|9?N^xAp(G_5Zi^|M#Ea|F2^={8qmEKLJU;^FEB0Uwk-lUy~oaBzPW;!i66(6K)EI zQIIoczVp~M{gRw0wM_8Z}oF^Y61;#WSYBtw53&VYl4MJ~F5RLR`m(;Q;>!jgwCEcup2 z{K`q~}nv(8{ZZuh0(;4t3+;KsWIAPh2SG zQt#+TyT2sv1=8O1;a>n9WJ_g{-M}DKr`FOd&SPk|y-x z=FtacaK%)h*RyCcp3$yL(CEI*uii3%UIZ9LK&1#Ui-5x-;HU^VJ}I*6GJuMr(G%Z! z@R`8`I7p&m4qej?M@j<>Z-QlMwT$llaWI+rmqL{-g)i<$SAH;^W|86b9QO2rXaFJ) zP=GEU!Y_A#8M#8FG zbW9U?6h_14WU-nr_u1(N{tGl-qw0G-(OJ?uZXLb0p{DujD&dH)cOhqIB^1?*V6 zT15g)5}}6-`L9H&Wc`@x1Ii@Y54xfmsVZH53?1F-}*yE3)vdBsNGA@z4qSa9nR$Z;HbL5wMqUDjq z2O5AlHHtP-%_}D@(u&)3zb-|hJNaitl1ja%mv|J7RLuFT_OU%F6d9GB^^B^qQ$NHf6SO(Q zJeeYI{kX5uv4;*TZ;Fi>H-w{Z{){bp!uT;uQ&<{-u7v(QDjym!@s|^PH7Qvdf%b1A zMzTP3OmyLp&!0*&pTx0GOB)IBeJU3xzJ8rHrzxcyyBXe`ruLnZ+>|JrEb2p`&56E# zde2C)8!U%&tr0tf_#0B(+&L^&m`<@Z9oRxvb6m4TOA)bN`Y(ygbR;1EzVwt4)~@)lnIuZ`9GWz!?hdTY{bYn`E6K$9 zz)xhQkYr3dl;Y%eQ3QvY?FIR=C#R_GzEhNML8jzyd_hsC_>xtq&=+KcvaD~470|}+n`4qDS_lc0tAZKXqjYK-i@Uj z>Ezh!*7^M`m15@g1g4lAOp^q^$5arwEM0R-$$YFvQ zY2+wD%rtVGAk{Qdjggd633^V85ko=rvOr7~(FIaf5rZR;je=A-Vq_4LBW4CUi_r-6| z>UE0y8s+#(zg{AHK1pu0zsM(Hvw2f;AEQ-xr?KPRnsFzB{44WH6xvRG_czyXyM5pC zoK8tBAXyT!8%zF|*py6D)CNG|cCCI%5SZB{tj?JetBc05Qc>M(;5?03n<7{l!}emZFP{qFf?GB|Kk zPgH-iG>k~kNe2FN?YOe0k<+B@9;CxYBGFWGk^v&Q-AywutDe`5Gg8{5V>cj!ay(j1 zD-YKbype|+32x`%l>}F2L(^?{lV#zsoIza)HPhO>&`j2O^P&;AVzsOips}m|rEgz) zepwJz3rTcAQY$1e1c_BhQV}G!TAF&>^?cW=#RIHS&LMCH@d$62d3e9eX^2Fr4k~%M zZ5uni$w_P_mx0yB<+PuoQRk9G(-1Uj%MJQH+!aJ=ZKX|UPhiu4@MgJq-Qd1GiSD{8 zH=H0XKXo2wjjm^7>d%UKC`~V|c|lqFbhA|$N!}WG6#c0v($LZB>OELzfXs;fIa z#fa)55A(u(r*8!CZrS9oXFBMlQ)Zom+*CmbmDQ|ZqGSyy7 zh{$l4AX8U7g{;M>s_G){St(XiSNALrre+FP``9wlcvZzKXX0y6_GhLmo2>16t(;3`b?lnM z6RI@}6Jp#S64ll6Sm&P0c5uRn>L}~lUMm?$R+b6yni8D9yO#y7?%V&*+qM3-tsMK$ zD$xIdr=RTB50WA&DJ?F*mn>Ef$|Pku=iEYYY^4!mTY=>y4q)8B{qF3Wv!v~Fj-3K+ z70+*Gm$S1wv#(iBm!)IB&FQYBH^(4dNsqDBO(t+FDHD-_gME4wk?1u}A$Pv&3D{wC z5W%o8nPTEs8?aqDV7omsU{^36zS%fkoX%&Wy<9v{53^xD4^L7_$9*tK^*Nf0XREa8 zFkLKD*pVJ{6z+)>rH|Gwo|r-{SF`!4D9G_%OV@p=YjBRm+v=KrC?vw1ldm3icm*(s zjG&OtR(xyUYm!n^SHJ&i#@Cg`*9C=;_;vj{8tBMyn8vB>%n&QEj)9AV(@f0zy0+I5 zIc4Bo8%w@uW!2fDcy_u<(lV5ceVS?eT%_Gi^vbd`>jFk~cE{%IkiFWXIa{9< zF+D*tL=~nNw~#jUWm3-ax)fK`!$~On zrSHB}POXO|SuUH!r(GNVr1QcU0T;MX*ZQN35QwT3qHaK~C|Q5_`d_PDU$gh;Va?R2n`IC>=3}xvjq$E zs^_``6;RX#^re8}p-}+8F$c#*YPsuX(gj%_MYQ#NGWhoI}PR|wJj!9#$=^4S!U1* zVlk+|8JiVpyehL{scMf`3)qKoB3jl=!eUs&ijHUI1*T)+MX44`JUs0NW?LiUeFZ{x zG;-f0yBZm<)Dv=7k?|aygsPKtwwg>U1;GW-G!xToMzk2lsX!SaK5x|}ELKjU@hTdw zMhU~BrSM@$CZO;LOU>l)^t^z?IOQCc8&>RaIYl9>BU8PiDoG1eDR%;Z!XY<7(WMFu z!z&wf^GgQa6ce^#PEs+8^`dr+D>3GZ%xaPiQ@YV2Kr!B~tD;zYErVfjVMSiChwapg znun+Da7G_8|7+6@FGf}ldPF!1i_jPp7PaCS2=DEMtEza<^bOM?YG4$I)-2MnnD9pk z;qA*JXESmSFC5HHb9gu8RGMjmN;K$be`S`Y2^|zi;VhX5Gd5QIp;huS)%F&=6mOAM z@nn@2MQw)WrD$U+Sxl$zRmU5~B74v)xK>}fRv)Ht^gW}ua;vnTp5?1~ScKdpeC$*i zCaYt-227OJG5sdYxQ;>XOa}W(+bi+0Bb|#;o>5&qs3-)bqu~U61TpM$NyoeQK(7i# zM-GYhov28|G4IzDggRO|$tzVu)V<&~4j7o~%szI;WULJrrCek7@qTuakvg6i;IJo! zz;v-9YTn#8ymVAmFtm&^_JA;8u;U^!X5ratb}qV#k9`-A>G(7e2PS+kFxpceNqp>~ z79}WhRh2`DK>cwVWr;Sf`M%K;VLQ7Vu8LB8iQhFVL9-T|g+l3U1_IA`?ci$p#g3N+ z7sV-_dP7{3I#ozQ^(oF$GU$==WQ}oP8P5_3+0-WukeLzMa+XMPXnqcil_?5>>y()hm~9t_OT;})mR0g2<*a2dD?)|vHPY}TamG?0@+by z9KgiW(NZ@t>}3gnm_`lZ7>MvpjX5#0Ffu%b$y9UXK6cV%aKs4Q4^jisG&&Zoyp5M;K@FFj#mp#f{z?U$>hDP6dqRLJdZ|ou>C-Us-oBc zkGXW7Mj{y=Y)m*x?lV~B`ts}D=KcrLqx>j}?_o8E(`AuWvRC2#QbH%ekyHxaEG6V5 zI#JT`;FiW(=ohe4Or)yxk{$ZId|7Lr0S*((+B7d1;2^(*E(rZkB8*dm*aQYx#pB_W ze9?+2j3WBYh+-)b#z--oRMT)Sc2onrFDw9#1mKXD16&C(7nR887V4-}5Sr%!qpmyF zV$vW)^@I^`n(IgG0z50`&jzomFcR~x0J~ypm9)E8=S=y4N?vXEYnTcjG)#T}6Fgn_ zW-bU0m?;AqruYOcJ%C0=$Bcxh`J67$v1*wxv8!0+Oq3s)7(wTVxCJqih=lhZcKS3~ z&3wD_H)c5w-_x9RKE31MoZvm*U*!qku8c2@>t#V7vv7ueKJ^Ws+ zYiz$q?;4xbe3RleTsjxheI?yz(tGWd8olRSeZ|#pYzd7^w#CbuLgRe8F_Piy48+Cy zYC}tBuWsJ)nTB=~hK@>?+nXdU@YJt#1hh zo}UMmJUl#Dw--0?&%3Ym#a_Zb%d7OAmE`b)Opk81-%LSA)`I*Sp2N92(jw*#x?MuI z>}r35kc(Y#$#&aob^t;>w8QrdkLm)|T@)!#{z=J`*#TH?10*A!j9KI>B*5(y1&Ir| zk)jatehQI4=*C`fO#asoNCj_h;8j*JYt%}qUs<41^gj_n>ERF>#r(+nT?UPn{YkM_ zWVF`!reedTvquA%!up5h?o);-vAqk6Wk{8lr#Lgo35;-&UaaY|}fMi>#`m&$1Hkq(sOS$~)@y+WK<0f%ntnoz@!iTg8XhNS;pe z!~jFf9307Mh%gTMDZ9=d`<8dsem%KSv5dp1`UEj$IX=#2FyPoU5tUVbS`$5NcGl&^ z_4WG7BCyMwDe5@-@#kaLp9XK3tOM1^$LqA{yfo4IY6KUz6 z5~<`mR3YZFE43i3P87jWglEKj`ayH*G=elsy8U)>y}62_Vt58Ahgpr`tx7u0q+dIQ zE8<@+F6pq&-)848T$UOX_Gfs?3LeDdJBcqtKE=`nElmSQ%A#mDpblrti?Q^ z@*_KNU)<816_>zf8V8pB&ib(3-m_H2WUMD+Kl!|ObYY%DsR5II3>vAG!&F2(mLIUf zpe%(D&mS`}phEq#9`%auH*gL47L3ls%}j49xL9UQ7w0YA(AwLIcJu55%d_A~^EYfc zs1Ercdf$z9YLk@CqDnOCPq1aGpg9?u@c^%@#`{UCArp2rmZE!uq~5fyUpBWpKHk&Z z=14-msFXLZiTH=JUl+3ddfz5R-Fj@0<2K9Dd))<1)lPZ^D3EyQzd3*Vr$sYRec$ZX z2fY5^{kU1uoG!I0O!K7eL%REaY97$q6v#C8NEo+Y57?wbQsbQ$A6R`l5bi^+nOCpV z-~alT+4}zb_U^M){rEx}$|i%-Y-?R_ZaV=tTDtg#O1k9fHMr>1G`jZim?V!iva zg^V(gXpe-5_nKYELBr`g2bSwm!+5(<1I~7>iZWIQ(6lS)j9QNJqSENy2JUFN@@%%X z5!7>1D9mDBE~0oeql-LV8)}j-HJIB3qZQ(f-fsdpEV8RzZe$c!QXC7B{FN_>E+#rk zWEax{N%AmhAW6Ov?3u(s68k2xCyDAzLMH-Zc=@^fw7t8Z-+bUk(CyHk z3y+P2@t7^VP>3}rlb#!JR&+`4{-<~oI#widq2?{hBVVd%EUaWtvdz3pjP4@3i|D?O z03I#?m(Yibz&&j9r6fIbF@&S#r>n;4*5ucK=Kym}Fy z0r2ZZ&}2@>$Ha0i2j+e>oiwBgySTyXksZ}Gvpq?KqaoZzgsUOEMnqRb^cxYLLe#TC zNrbNuZZjfK2(KB@QwW|ViYdxPiZVI-k`rZ-l8Avs7%oU?QcI@M22t8J{FH!5b>l=+ z3L^E5GfpXpR5(sOr65w{G6xl(?y+UzA>Brc7bFz=b@L661{OUE%lj$}j(he#BDxyU z!9?A;?zxz%dDp$}z8nA$D$ok>u!w<1^bPsS*X{)dQ8~uFp7Bx2F|wC5b)x2O_Xe1# z`P)6mP?qL!_Z(-xt&1Zr-4*XSh8lHeyytWq$gUzA8q^)~o@3}xcggIHR8002+0diz zmiHV(le%Nxa|Zj*_GHP{S5{>xS$1PeHf&P$VM=dQr_!g}q)$gF)NN9zqcrL^Y1C0F zb(>V`D4n{!eQ^Yv_S$eVp^*uM1-0Iuu0lxTL{B3LC;rHt^`mggkHYy{4ZQRfH+qqd zyWL0bULS=UeH8BUQMkp&|J8C_3s?9kT;8K}ZEeLlW!X_~>`{(d@|P=rbuF_nuuci^ z<*z{g>a~{a>LvFj!$8$RtB%uHw4*BLbk$E)Bj;zVM3FfdI}_Nns_NR^1FQeG%c`;h zE7zWmer1O1HqrePZq`l{)p7pK$$u`%OlyVla&$Q5%bPG4ht+g#?auY>12QhZ@!}nv zqB;vF{JbNY5&@AoX-T*1sr@K@QKrdQFzY*Fl*$k4k^f)JV4=T{0W+Qg1Z3AK%XIF^ zNXMzus&O_KB)3iqQ*~L*5a`$*r=hPbr!sU5YIg!VRZjEQ5e)f`0?v1IwGv0+WLP6Q z0lebEvlVp=Ww2KgnZ{OCu}B*cvs{2y!*Bv`thPv$X9n?nl^%}c2L{y?2WfboPbS$c z6J4U~)b`!uVzt<*6MYqZ_nYxxV%O69IoTP*9^ ze6g%+|BS^l+sdZJF+2__$24t;?BmseMF+LFTp=SBfQrDi6gc^ph)x1YAEt$sENv^= zklGw}of;Fr29eDmIWTKjx(F|_JxoJQ=|Kyt&sptuR=8A)#0o`J8Of6^KqYd9M{(wc?t)@o{yyjtKTG`Cj@xU3+Oco2!w#{^8y-L zIv@K&fcw0FhW5_Ko)F+XFQB2-^Kn-Qu%8#u(DwP*6~o`)c>xU;kdGZ9p#Qu8WCw7N zKVMX`3O#YEWexf0H*J>3*<`^%3mY!&e3+jtrJrU@cNe$28!`+)Mj|W!w!Zs#z5QP2 zW7mZE{u;}%-4Un1tsSJKzb8do^|FzsE^mnrq^Ie&_Y}L%Sk&swtgK)O@Sm!3kt}3k zPK`;+#;~}(_;#_m1{YK3hHG9ayXM7Gmv{InND_1%0MS}*Zm+iA={qj6>gbD!Wr!*~ zZ&`KTQFb!o>@3|n;ntJo)Ok_Cm0ohM-pITPgn83g@bqL>se+kVu?#ym>)ZR67SC^# zvApw|=5RIAyE{0t)S|z!_8H9J!kGN^nc|~VW9v$`^cl9ZOk;Be+gbJ;TduJ=k}a>> zG%`)aVb?9wD2hco-L^<4eYjuW?(|a)^^nJL<3sX4>8E`>4zLS~#Dg2_V7i}Eb7esd3d|EUA>c+T%&qKOm`my>Xo4~IfQfAaEnYm7wn%5uWf z<0NkvgF*g|irxt=vtMbX?fSt_m>IH@F~{`ltlcMe+|4-bd-VGCkO6waw$v?pCXAjc z=EsKM7gXz)Uw)|{ALOTbIOD1+%gmVBSq6$dbe3#BetZ@i-~HI#UtGr*UpN%H9~i+E zuj`ZC(e~o*3JxNOd84Ji@}1?Ly9XA3R3uLKPKWbZpsyCT)SJn2YFk1GIjYeyaAP%ClE)`65#xN+%O1j&!O2C4c$X;s1EHw3h0Dhd|lw z)%w8#^!g5N@c!P`>F{j>DR4stUJ>$BH6&j{jADB6z=nMNOj+~y7-)IB;|j8NwR6w; z@(w@P*$zBYK)-g$(CCU^clX7y6IEc@v{)?~tU)~AI46!~ zHH>3y3XQmo!Q{s_p8Ch^!!_h|Jmz|T7RQpv2hV(Q zS%f@aPw#1Dl}^%_0{c$`PbPU3PF6_{lV$=RJPlvw#Uz1OHq#Y-?k9X2J`+tDJ&lXr zuSSpvy&Tg+IQ0Zxk|Rr2NjeM{6PYli8C2!vD2v1quZA`vm^eO{y~nobxr}pq%k9XD zepu1n*UR+*O?-H0yN9lS)F|XsoQWq@X|R5PEJvpkOMr$cl*AG(e)s|Rwtj3sZ>b-? zy1!xN5wBBEVAkOdY{jLj-rRRwv$>YxJX@8E`COf9>Is3Hj|6M+^~iagtwwRCZ4*_i zEGkQuk(4wAU2@%16GiLMl2aM=J1zEWB1ouh3ZRiZ=b_;_|4k=SN9_0|E>fUF)bBKWow_Q?yJNsaz-1kt znvpQOhfcFfft9_wK!Qd#*qSY-104m7UL(||{@OkAPOJ}b<%`4%U$l6En}lgY@tD6g zPOSNy##Ph-G*~Fa6i$iJ1ZygUM^idB$%aEJ3~3w;iK zS%|bb92_)Pq!~P5A(4MFAp<6T<=E=Fhx*;pc0~~;DkFZerhtQt81Bnd#pU-+i)+-C zfcIadEP*yVcaydRIu+`gN_9Cl>3W{oo{b8lX^jRgX4t5(DKIqIVxz*C{P3j;qr#gE zw@F`AcG&cxP5NT!uF%&=>B}1&I)T}yjryW_&BG>(ZqpY$5fL_7WTU>Ad~?`s(HDhB zP3GIAFotgW(k6v5bd!hDgE>BoN0CL>DZju|sJpLU_~YDM$GfABAtXB;llX4Jl0Z`t zrjjP{^BDRz*;u-yC?UT8x86JdKL!$3Ggcu#KR~f*GbYk8W?L{hIw&@cuo|WGV)-j==Tm>;3l0mu(Vj3!gcnV^6Wd`vT#2mmFBv6on z0Xa*HGSi~1*c=4nMOo$3v{=bhO|d!pv7&lPPTXLTWQvmgKYP#G+_;TozRFekc0T~O zTa~qEJ+?^sA$vBdk|@g7TCb3_J>G1JMN71$wJa$jHMV#6?zdle10VsC(#R7hbyqj8 zN=8IK05lpv186j0L5KJE6YByD@O-nVh!?haW2bpkz!KIT7>v>LyE1fArP-kH;xCHR zl)$Fw5`9@`zby%J%9BAnmx!o|^lmN7o9-0%LpR<3KbXFGd$h>%?W-jAW`?ibZS;G% zs?fsA8hLF=LWW3VmA0WQ7}V~=VGbMHiH8pn*p+qIBJhN^rI{HFRt;po!iJVHE+l1v zfqz-g_sheRHKx37j~n@+;Hy3U)gJ$9kAJntzuM#fi|uiWNtNY2=$oVyApSB`^jwhKo2jJ!EBjR78`>Toa$L`6+Ba`IjVkN9&N% zg8rJf{t7j6D2~P{vc?*s|HY&?TM+f%}=|MAYofI^b=UsAV6eP-=2)7 zTrI2I^V6^xM07fA;tW|~v1q-0AoQ&~|XZlxrRexlGE=O^@pqFzjKQrNgel{Iwa28SfA=_k|5 zHis*%gUoGS700nVJ}y-rH6bUP`%((k17 zS;rH_p@ff7MNUT;JypdIKiN<~&?b z1lWvIYZx)~bmf7ytvz;)5xEdej6dTD-;<$tWuC_Ih@8^dw_8v6Ihn}#w3z&-NYWrP zOax;);xBZ(e7oh&DD7@GnarN>+NI21WQ{pZXBZhQ9xuZGq`x<-{F|`B5LXyss~%t! zKfHwz#6d)%Ij<@eFt|Xm4$#&~qQbe$$H!m+mA96Q1ui>UJ;y#{om&6fEq+5#JTg*l zHb;!fxPp54y>0XGh=zE)_{L*L2r7e9b!wK^>$9_P8ZLs#XQ=h}yn(vlMQ^rkm{pBP zdzc!C3ZACU5$TUN0}(xmN}JwJ7=?>ZA&_He{2ls^3RRsX!Ms} zfF}Re3)?<4Oohfw8V+hkG}ZE?9W?iX%BH zcg2s&)m>IG*>4?s%);nx{ifwgGlbueBw+{hISiW&fGoJfelv#^5lAsd?sxb!pWKqn zW3;R*fnlBqxfG#+mFMCUw0LcTZa=QUt-~Ua45;L;BfjxFk6FFO0H71tU3`y5R+8T` z*A&9tM_@VSiLjd&F+FhN_>2 zyHo2pdWnE)vaXaO+@!p9CM$?$&vZ?W9h@A~7>ZRLiZ?J*AYWASY2i(b6!Djt76!Pd zMNems@5Te12cj_!v|<{-lUOUaGrG$ZE@J5DA&lfzUw#LjwRneDwkpW(@a)nXBu~b)aNA2+9T5iPfdP( z%jY+E%O{I-l^jgq^Cx+DUxk}_c>1PHspxGJL`j`PiXN0vok92$GI_Y-$H8AHDXPi2 zBQAAPWvc}UmWpt!^4K6Q{9E^-OsrZlE?|(0;z5D^7KQk=-7B+_Diy7x-r!9ZlevAj zOd~|vX7067^_$8?-t9EvG!Q7yrYP+UDV>JdPv#db!X82|YbNMQ0yeVXhH1f4GJ%^J zc)w=iYD+7U2G7tRWZRCKtJhEFVlB#^fZ8eaI0Loode+rEwUbhxXm?2Z z*OqTznTJ=YVAPUxuwg3T!%SOQ@$Tc|t{Jzp;YIE0+X|Jnx%4!bWOa*t6 z1v>7E5S2BMihu52x+&Pmg0-fpEk@AuUV5agw-^U&4XOoBY}_F0o&r{N z9EzObtwo~j^|ARc!=N&}Z-i9CSJ3OJ@VSo7xJIK}mOtwa@3Xr(E3J7!?tE$iko-m~q z2chQBw%bvMnM@6k{Z&x~npy>9_anzhz5JB4s>umh7jNd|iqF~Ad#;tszCziXIb>^n zS+#u6Fd(j2TV%&i&W%?7&J|~v&HSX0A4s8az~l^3Mk^U=11O<`(j(J^;X#feU?lwV z3=a#7*hqqI>V^X62+%b}tmYce(~79s7QVz-T|_f4BYd=IMSn5n3?eD4i$?oK$~|KC`xMW)bYh znXMvJvIy6W-dS4XgDkk+Z{{XY4FL;)Q@2s!;fz&Jk_^U)ZxW8`L!zU|n8>Q{NCx9j zVjQf(IFcBLD=;cm|3DPvXa&kaQjp_ZjiF8K6>BMiSIgO@lm<3B3fNS~#Pr2fg{0lk zG(_uD=;5ZA>c)uJ>HDfoBk=h9@TI&B31h!)YICE)4&C?h5QWJE3pyso zHFOg7N11kd%KibYt5#}0y{f7~RVnd@%Pv2X?Uax>?sZwEP&)zw4Hc*@EEO9uZ$eH* zht69%_VhAX#3@W|7limHB5;1rnuevUT>0fqX}4wh?zOs1(k2Fb>b6u;Gec@t6rjF- zK5r-s3{7j1uw7SHNXq(OdlXK!Kg3gdUMDd~?1t7P@Llc;{~|6|#x$s*LbaM8sjxB> z3sFLGIYJSr+ld<;E!uc7nr^G(C?BqqmKog*n%9js|LRzm{39{rdBQ65NrGX0T{IpO z%o;to%SV4Pj|=n=pTF(4Bz;a3>-8*Dv%H&GsH%qtVk@EYyMs(}vk z%9v~Qr3&&|$f-23)a66cYKwowUVf!+9%%EK3e5`dG7Ho;hH`u>8nmS^1XQVAp-rt) z9%|zPtnQ7&tL$P#?H8>^TiKLVJ9)i1xQHtnDQ z$)evhGljpZU4B#xuf4xPwe$S!WTTX@e{trk*0i=E1MqXJrNdQ?qAL3(M;>DE(cffGqs5C! zQrpkK4%Mzpbx@u(&l<7VDCB#l>;|d2g>WYWR~1X8&Gj@V3)DKA)AM>(Pa7Y#X~a6W z8<%Z6yW^saLEcAorp*jcjs{daqTO|`xi3jUKLntyOo=CACSdYG&zK(cOjZqD+e6hA zYli%qMK6?lAqh$)evd|dnt*ljE{?Ch*r~zjjuLj{UM{F#3YM=!m>R6+rV!16UT8_a z{CwT2^>HeHs#U!EX%%Sqdi{FMx=3&8Xmv=ytxm^ov|#DhzM(sZ1t_=)*09^Pn~eFM zAc$jPO$rGR^o|3M(+rJM4!av|Rwd??P7keJ};)>9BH!P_|bIeq`uU5H@A9Pm*-Idfz`1*CDmW zL4aXaCB)Dn=HZcqm^$Q8yvU?C6LBk>@^a8Y+6>;ueHs_C!$i%g*ROeJ&uz|qbkCdK zs+FrCKRZ)~D0LM2(emDcGcN@nlNZBJ7Qx8ysjQXgrB_;-;?~)-@>ouI9bGDAa%o9N6))16; zl;>p<5_=6vmF4reT33ssB7)u;f&-?tK4}KN)JtMEvVinvq?rYwVi8eAwYWWWy7lYb z#*MNE-1cAz*7DTZp-oc~Otq~mJ2zwym|o%m49mt>z4VcT5b!k~6>jSDkI0mk{Bq+@ z&Oz!>n_{B#Pj-v2$>*zTmY~;PH8pD|a{?D1gu1j<-Y{wdq998}Rj-R0W%gGfoy&tN z%}4NUvA@Bu5#!==r+`4UlFB*)@yhO%q<(i;79J)>-au~R)$SC*7Z|A|NDwOB&KsG< z`n`ry!L5d0X${kA@yEWh_2ZxSf7Iu^0@cw_*6B?Dvc3jYGw1y7ii}J2I0Ap;b3CQu zB5rc!Cu4#4f5cqdE$zfrGrZcxD5^EwZupo_Nmr7jw>RvJo?2b~@iYBUAHnCKbp>W& zPG%*EtSMl*tmUm{-NqOfu7%eUlXcm_3V6EGQw@mJvDdfGl^0VR=rVxgh++wxyp?Jz zw_#AVi|@j`fp#~q&#z&E_%SoG*j>NY={GK6IeP<(i0e}Jv=fF#$8$TDi;HYUOSSaO z09$D)N`l^~%xyJYg&5O(OvBhuYe(l46N9|08J?3pAIH^~tTh@o&wQvB%!=Zing+9` zc8l3}@X>mXl^N0m_D&X^-nlR6)&=K45*v!*+Rl|NpZ_bsxa{{a&cS6}+^W>)z61>> z?JSyEfY!L|LkFiUw_TTJ94X>N*FP zB000UlU~!zZHxif`-oK1RUx}Kh8GV2tOn+l8)P(MdZUoval4bpGq=l_9zY5y)Bpy_ zx*LZR<)Sgw#B-beWy34W$Uk^mmET;`Fh!_AiKjT#Tb=W3t=gs9;PL#)KYy~PNv+g) zGaOtGe^KB@4t_OO;btB_Q{j~&{`|c^iE>bsg^qGql#7mXwDX4JxE^<)l#e>_CKr}! zeK)Jlm?Wcd2<{Cz^iEUv5{{&DV*)Q`%t4E>Z5Kc!4C}xg5+M=fUlG zGLB#L5s(&Us}^NI+?!5bC;|x#PR!^qkQ)y^Qd0*yzP!W54vt~HZu`bJI+B%bxtrIb|j*lXI| zMiY8-0##2D2mzKJRRIoYL z$-~u(rcomDZWc;>iM)%2JxzjEnSZ=|%XW6FV7VLnU@TL+m}<(*buYN+*$$5;F&K2aLtboLfYC#*HvTThVACbHFI1 zbua2KHDyXT;Dl}%ECwU?VBfI%4Xc?tQFrEEbd;g$kP~%hST81MJ2Dzc+CsdhAMu$6 zTM^U|CufP6>zVK;(Ms8ImQIf4vBuKbh$X58#_gGl0K^lI1Nn++|c1X zAa&vhlrH;JB(Z{YTQ&y!8iutACakA- zbS7huWIg5u9eF02=k^t>ZQG!&ialwb`15U~ZuT*fqDi))=nBzX*@D7X*vc{Z=r9C?&tkt6UQgT4*|+8m{< zAZY~LF^12I9H@Zf_)k2z;tL>Bd6Ek3B|hc!wtGKV#NC+^o2-Pv-n%_~1;+1^p@v=s z#~8*{F-@~*7)-Y2Trk8vMBIY{To(+dHZ1UJ-G+bVGTn1~1(swCxJDk=>UFJ4$FaMf zz_+Lb6)b^SP=Y+ZT5to&$~(U%;0Y~LrEe}}p2qh6a-NFCFJJ0uOC?uqtac51Oc#%J zdQEZ`1bexD*=%A+UQ>|TvCjA3yd7?3Q@n;ZsT=l^k4DL9oxknHY|Zz&Lg2C z$qm`%y-SZAEfN#y3TfYooFn z#}GIeup1kr-|8`Sqp)-i^`r1N7?YN6gIxDr+;*T5!xUQ*_-I^3 zd!s)PESW{V`G5Skh$r+8a@D9-txJD0o-UvLPnA7m&pbRS@0n%8D4&?-z7XWTz#sb0 zkK=f6v{4@D^Ltz_)4xZi{MYz~djpq`%_H+0!#JuO9UdJXR}Q}^o95y1!8fe@8`quw zmUwQ(*f;m#Y;ivhR^mNA%!4R;8vY(-`W^rF-@WPIw_A+<0}E>YvKZfw;_bl>8llJR zJws(;P8dw$@Bt7O^BFg=_E>E)VT6tIE)O!hM{G9yBV2DZjxc`X{Q`_&_<6SoLl({M z;-_E{eqb-NC78!k$Y3~*;>GxO8HbDq%-Y9Lc(Wl|1LK%@EvLhfM?;Ro#bbnzFTkuD zq2*@c2SU!em&qj2U*1l}1J)i7!YLT8K}1~Um>P|E)IB6=Vv$@?B(V1(8!mxFZrMtt zWgVh#7%~~n<{`Hup!5{Z`8LG;)Vt+mmrfI|Ti!Vg*u<~ayCirH*IoSH4KYr8Ik9Yq0Pxv{(+zDonvjxVgj)U?dqJ%$`8 z1xgopd{;|bXGrIE4p0^t(yN^Vl)V$_&dveK#uT1}DG+5xs&nS45XGoT{n|N5v5dTr zR;QuBG{Xk001hF8s3hX3=%sOWdK zzt7)6(Glzfp_~C-wGz-F(jH{ty##)Y@S_~-Byv(oe^-ORiEnmEe?WtPowIHdb6?%s zA|OaEfr;1P>fs>3W0*jQu0jCw_Y6Z!ZWqx(zw6hm3tRdr`0n2_tL5`+^7}+z zQk&b-+ulb?!mBmx&xN^(o#-ZouWzt0SWI5%snnD=W(F(E_6;3>fl=MP>}>n~93TDM zWxjvKFX|u~n3}Hd^?SdakMdW(|a+ZCvXP14UxCj8tzuMWEW1rPM4 zVxHH(S60`EB-p%%g*Y%>GZssC?c3`Cb0rc>f2M zyKl4m^NP)%H{APqldYfE?feLdz2Uykn{E5N<*rX|(?`_%Ew_B$X2<8tH+*=Nw%FF& z_Nje+ujknK=;PX<=isXM+}F2za?tb)p&O;&0b9hWR8O}4$XHV6WUktujN^EMX5w%hOi=_P%Rh#bf;_c~7V^6t-)qb! zQHYpAC>`820h#c!?*lt#6EZso)luq8|FZpe#m&c{^?y@~=S$}Q!Q*hlnVvSLT11Bd&2PUz_&T#1*rBn));erv7ad0kICi zfqfxN1I4+iV|RS_Z*1E*dWYeecDAz9FQ2uH=JnQADdjeU4CX%eWoRX2s=&r!7*CbNe!Tz;XDlLtp5_}J4 z!|(%sR!cDMiC^#L!Q%0Dc}JfW6Y-*dO4uTr%XIk3)A#p5&W`~@O#FpuFpo!Z3I7LQ z|MfvH1#Ny}F^G=H_`Vi?DjW$ioJ~^zPsU+!JPqOy4S{%sj%ggDR6-o$m2wqD=Y{)4 zRs=t>l8{#<&By6%`hFhVhr?a+emmetOwhl__h6YRgn&OAptF%L<-|qvN{&=qNt)-$ zW$%xpXbGu^Cya_~Y>`LcV9 zrq!-rBy1v!%7KnW1 zvA|lsDGPCy^u&)j1gGsRW2D>JV0>6nM^LzJW#kZLfuC9(<)Bhn#{{U>5&812%ihsH ztLi1Fx3kPdy`)x(@nI3hOJE@ump)J37C?NH81i7^UzAFw)})e&%)hJ=K2KVhYa-p% z;$A1B*OOw=29pKMON&=kG##o{(!wk=Cwpdp3p(rEoC7A0VdXzPkhaTNO*zULPh&yBU_Skiv^yw&f`t&Atza`Zq>3PLr&2+q$6mmPuyllY=YSU`}o-Fes10!2=tO z8SjT6+wgH7zig2YH7DD`!JfpFlnk%7ZT(9rs%zD{-WjT0$r%Z z_okZIXt^@IqNd9SYPqMu_XoRaK`?;4*L2ZFjBWuXyhzg?VqIjgb~< zEzd!YC$3q=8_>9)5JhP%GmJ%DkqXd~dS16{U7ugJwm-5d4@~{x)gm8`BN&3G=tPG_ z8Y~wSu_B0~*^4m9Y^{?F{D}V za*?Rn%WFH`mPJa3dlX`T%GMsEeWdqC5D^JZQ$wtEP1CrKqe+SGDYZlGD$)?zeF&x| zST%zYlnXa8uzm9!8W`r=po>Sa=$JqQgFF}0 zM!w4yv*3}OC-(Moq@9}U*-oiKdB02tqs44Gj`%&d#{eT(;wb>W!yZMf4~36&EF8OU z*SyjJvbY{E!U>`};T+p=!M0%xd7Ob;e}QfV(Sy__HV+qgUl83&@OkI=(GsS+m!eUHsr?LbIcie42xsMJ5KMh4BUBZK zy-!dW15ABh=~Gr_0uwq7UsRz?4EEpbpvoa7=uLn;oP<-VD3b|4fjDjISvUs??@MEq z0H!ZR-6>ecBZ`)<^rt=YOvQEBA{_36eXwUduO4B56EacSgu2@Y2F6GElug3>VDLg5 zcX6~A-<&x!PnqD4biVNnWSp+=UJ$<5b_qtUYp$rAXwhH~7Kit<#W)^4p0cNKeo#hd z+PP6a*k$pBWL_?f;%UMui^U?zR3CDG;lplBB;d{S3ZnJ~Hf zoeBZhlDNss7t`cfOfvB?8nau97() zH?C2>z!U~<90K_m%*{Ai#$^Oe38VU!T+{rN+takbi074yt+fxem-Z`Wjy%=RHJp#54u z?d0#BXue%*HK0Pw0$aYZBP=~nw($%lGzi(<6aI!=Nq}+S4}&-mGMwX7N;B%8@Q?{C z=O_m0!GeMgQuz4*km3D#PN7H|&lcDi@pbVL3TCuMfEghrB&nDnOJ9|VI&qY8a)BNp zB|~C>?-ha=hLa5iflQ<%#?w#1WIRMQ6r;&z@_^imMDlauexao&u4rS0@Z9Tu zj0aed!+1z{v=pB99twi_}1Ab-Zoi2oivQSpy9 zp30VUk{ew&<&mvcTZfuGK@^KjsglI#r|$C6!5^EIB)PpVt@N}&sR02!D<`4*!jfoq zdJ$%#&g_eeoC=TBbyL|P9TKPo78@9yzTa#)o$H!|(Q}&klJyqf!3UxENH88ge~^0- zXu$=8q$^6ES~bMB)t59tQmN0%KU*6`{3Xn~05cVTVX?8ig$1tlvG38*INk)Jqv7ct zjU&A9!tTI^xD5mNWaJCHMP|+^bG=%gn9oFs6$WyMa@ZTBItuw6AeMJ2$O; z47DNKy}yR8vW< zB&ii8)l50JycT5KXVC|N|+KE^ks;zr(kXzZAT=F(i6uiVQR(PeljTamQqW% z21${ALv#EYI3dvBz%r8KZ(xEa*@{?8W-3=YzSAXJQbfyzN(a&fVx{!cH;^ka0_#6Q z>wgOCh3WF~mS6u-Be)y5h`_u6^)Xmr3%qSpB*JI!d71W7hDi$O;}E1w109i|EmPufH37X45vMoZ_ZSC*x;vM9N;KrRV72;ASN(Us(e(epq}V;btk<~bb>qHtlg zI30q~k*rqLgF{(2-1-b@0l@b6Q_}H}gK(41N52FFGb^!r(c2UQcEbvpYX)v%!UC0t zNTyi`si0QVh}=ccl0iox@(KCghjNexm|##*e#o6fs(o(4B~}eI+4b=2g|2yj+6T6i8h1po-}I( zP4{RyC-RaY2aBGf8D7pmU&AbMQSAr^YE}|E7N2FW6%N$@Q#eWUAO?*#CT>!^EcvP; z3Ouct8|A_!SX9W%jSHD2Un$3eLaxt6=~Fb?|6@74*LG?s)u-h3CB-#I5sQ3TGnmSb z;pg*GqzZi$<^y_8FdhjoCd@X1xNye+5V6Uox zj*zd14$oIdfv>3*%sMe&sCplFosVe9EnYZ*HWX3%V9HOs|D_E7D=Mo{Kz&sLa&X5R z<^rCR?yK`!tj}wa%`2&L-Rkx(cJW0N$H~?Cb}*eiyrL8deo+~igyuFK2h(t|cwIJv zpeUaNDr?F_Rpl0h_fhOE)1aa71%&u{{sYZtC_*5rdXWB2i6(V3XPvX=m`r**xxTXey!`--EK{K%;Ccz zgTVt3ES|+IlYFf%%t=OOix*hXPOM;FAT|yg1oJfv56e13?p9+3i^Vuxc+aY+Ze3hD zuj6GD@$zQVu$U3mnNBJ0=0QAK$JxwOo0rdB&gb|5+jurzm4g&UauBjQk4h$w*)$$c zm$PNGy7c%yz}+Ocht<+M;}l!eJjEvrfYGb6KFFz99Wb88L*eKlvL<%75|Ujy7IX`~ zfGo@s6^Z40UmvedC7Y3$r|gvg5IG9(qBFZoH?pi=!`?=ZXS_7R{`f~msr)cz%L%~{ zjZfJYhNwPe(UKgb@XMet_~6$KxWgx)&u7yp+(QiWl&?+ir!ze8A1>*3+i*Fbj0YkN z?=MT3*~H!sl2ka!a50sN6dp$AI=Q0Z|N;hw5_^3>gHW&T}!{is?teZ%l^`y62CwUy(Q`b@51wVuKcpI6jByYqpX ztxb{9Ka1poXEW=BO2;$wYcN_N*N1g-!FHJg68#c>LOxLBcu9}im7L^}2o4eAVB#H{ zi(ff*!*N7Pv$2>{f5VO1xNCdYJ?Db^bh@5%X?d59El*77g^_|BlGEh1@}k4#FfL+{ zx&wSMhucMXpXmlnqvi)p^b-cIA|8vojd{Q{RK(=|l?4IF3O27O%Stv;dS>>yzEDUT zvlIYJn)ajnrMJD9Q4TnH-vcFSQ^E0&53At%CJ%U= zdDAiZJ2aouU=hg&_5}E30mF|6l*vzT05XI^swqW02#Y@@lOlJy274d6+?Vu)O%y_U zKz?&KR4M>dT5a-ym)___V8?^xne?^!12?(RKsViu-RPyA4Trr_w7VPJp^&zr5gb72 zaP5lVZaA@T%<&_AWu(KmSJD2Ao-QYN`Mh!6n6Cg$eCq!3G8mN&?yC?w@po#PWbh(H za=t8CDm}S=3AAYIAQ_Mq>7f(hOhOtTa}qz^@nPRi>#oEa^5)ASR+;+OV-1f)v{9EA zDwM`wNl?A}hZ5pow-Mx(e7R8G0N!P38K6q0X&X&vCd9;2=A;2_zqM%4t9R%CGZPxtC033!0QPeWcEC_rukH}HrT-uoSOV|8tgZL( zY>3zfM-a!2iyt6t*=2vSDVw8i-!CydvM)wB22w;Jz9RsDNLvqH>R>iBWsv)lvM=@Q zc;WWlBgRUjOk3$FAG$Gz-Dt&;P!6C0INpp?D~LF?KCmob^?>@o zHt(V%V{5i?08CVz(CkYD<|n)dDFDpaTVy$|wbQ1Yxmp19lTl7uK3-$*gRrXP5GM)5 zlS5~8lElI6J?)m4pWO<|$QrS12=~Z?2MSmyDdyr-MlO z_%nOUP@4HIS)56c1C%e=Q8fJwP)(=_VeJ^X*pg!3Zx*n>q!Mb8<#{FcI=E!>^>xVd zVWUqhjaKEOL~=A4X*1DW4BCdt0J5V(St#Xj7%4T`@o`9jE{;tRon)2F0uzc*NyJBz z)b~ls-Z4ym0n9`Y31FhUU01Xa9*Jj(ZPSFb?-R6dPTRSKHYvVs z7*ip`NeC&)S-^xOC+SGi2<;6GMY*VWlICYYpvr=�h1Hgc|`PiBDOHS=;zt+JJ2+ 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 z

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 z z!}R-7ZN*LS z`-73)4$C^68Hys!3xK0V8ZX&2t2d8GXC(MssYr-UwJH}HQ>lme*|`g;n9UyNTFLAf&ri53KQ+E4aHD3h4n(p~esDlfor9D?xjkK?}cQ zaarJDo0x}e)dDde_kc3&2QQXGv6keanl>P3ZFK}YV}LH%k<9l#bHOqkl*p<3c7uta ziZDbf9sKuBtRC0T)}&|*D1PczP!NBynKS3X5j4o7OT&NxUAK87LgYyQFai4BXAa}8 zExoGO#VGbwI#^kbYQ525wO|b!=WYRIL}!?CZx>#};6pieVaW%;hpB8SY9*@*&f0QV z|Kg=;E{x~H@R30*_O)bX=DwRsOUiPw^;cPX20K<2Y`S0%uh!4l>*UFAOfzK)LICA<+RSdmX_~r-YQ#iP&1i-9wRZg zjs-|3*5%6r1Mn5XIa(|VF0h+NR#EYWBWv};;)R&%)?SFu4xw4*E+87STn=Mlcdpms+)(X1*eW##GVWe1`iv<)cnl{x3qk9l$Cqo` z;3wG&AQhZWK9V(CcTS@L-zfMqpbHB=uo=9c@|`ti_||Uw`vc zzY}wtZhK4b=PpUPxSs}Q_Fr~xeC|__zP;`{9gmhO?~Yqvc79Hj>=dN!?NjNw`(4;! zaL&zcA9@3Du5_cm=paz8^gf?e^7<5VBlU*p9bHJAHUH_x{Z*OtUg7m^y+?9C4IltB zWXDHf+-4r0Mle;#sR$fTy-Kb+5hLI<*qsu~joN%P(>T)!-uiydp5$0A-A9-M%nW(f zQZ6%8e$y>~>isQw3HcS^nJ6^^bDT5=bcnTUvT|M^(2jPl1I$1zhTExr9kn53_IsKV z#_39EO18=m+0WV5ZfM6ZYyn~YMK24%FU)pK)5nLDdiG48T+~EM!ME8r#QA1?7enH& zR+oqKifFN3>Q{fSUYv9B);DX#wu{?cIDhKp_tX@f*SFfl(p1{c(|7J|{nK~pbW_*! z4hmw-iCY(wblqW4j{>)Xp#S{N>+N^N@0<(1kXnVM>2m&$&)!B2*+(_Qa3(j7vrG@Fw2aL!mY?l&WY57H+O)e^V>;I>7Jn|Nma!^ts;z%x6Q2K)Vt^ F{|j1xiwpn& literal 0 HcmV?d00001 diff --git a/meta-openvuplus/recipes-connectivity/realtek/r8192cu_3.1.2590.20110922.bb b/meta-openvuplus/recipes-connectivity/realtek/r8192cu_3.1.2590.20110922.bb new file mode 100644 index 0000000..9079bb7 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/realtek/r8192cu_3.1.2590.20110922.bb @@ -0,0 +1,34 @@ +DESCRIPTION = "driver for Realtek USB wireless devices" +SECTION = "kernel/modules" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://os_dep/linux/os_intfs.c;md5=9335a12a66bce6b5e29421aac1aa5383" + +inherit module + +SRC_URI = " \ + file://rtl8192_8188CU_linux_v3.1.2590.20110922.tar.gz \ + file://makefile.patch;patch=1 \ + file://linux_3.1.patch;patch=1 \ +" + +S = "${WORKDIR}/rtl8192_8188CU_linux_v${PV}" + +PR = "r0" + +do_compile () { + unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS CC LD CPP + oe_runmake ${MODULE_MAKE_FLAGS} +} + +do_install() { + install -d ${D}/lib/modules/${KERNEL_VERSION}/kernel/drivers/net/wireless + install -m 0644 ${S}/8192cu.ko ${D}${base_libdir}/modules/${KERNEL_VERSION}/kernel/drivers/net/wireless +} + +MODULE_MAKE_FLAGS += " \ + CROSS_COMPILE=${TARGET_PREFIX} \ + KVER=${KERNEL_VERSION} \ + KSRC=${STAGING_KERNEL_DIR} \ + KDIR=${STAGING_KERNEL_DIR} \ +" + diff --git a/meta-openvuplus/recipes-connectivity/realtek/r8712u/config b/meta-openvuplus/recipes-connectivity/realtek/r8712u/config new file mode 100644 index 0000000..6decb18 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/realtek/r8712u/config @@ -0,0 +1,27 @@ + +# +# Automatically generated make config: don't edit +# + +CONFIG_RTL8711 = n +CONFIG_RTL8712 = y + + +CONFIG_USB_HCI = y +CONFIG_SDIO_HCI = n + + +CONFIG_MP_INCLUDED = y + +CONFIG_PLATFORM_I386_PC = n +CONFIG_PLATFORM_ANDROID_X86 = n +CONFIG_PLATFORM_ARM_S3C = n +CONFIG_PLATFORM_ARM_PXA = n +CONFIG_PLATFORM_MIPS_RMI = n +CONFIG_PLATFORM_RTK_DMP = n +CONFIG_PLATFORM_MIPS_PLM = n +CONFIG_PLATFORM_RTD2880B = n +CONFIG_PLATFORM_MSTAR389 = n + +CONFIG_MLME_EXT = n +CONFIG_DRVEXT_MODULE = n diff --git a/meta-openvuplus/recipes-connectivity/realtek/r8712u/strcasecmp.patch b/meta-openvuplus/recipes-connectivity/realtek/r8712u/strcasecmp.patch new file mode 100644 index 0000000..0aea6d9 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/realtek/r8712u/strcasecmp.patch @@ -0,0 +1,14 @@ +diff --git a/ioctl/rtl871x_ioctl_linux.c b/ioctl/rtl871x_ioctl_linux.c +index 6f707de..561c50f 100755 +--- a/ioctl/rtl871x_ioctl_linux.c ++++ b/ioctl/rtl871x_ioctl_linux.c +@@ -52,6 +52,9 @@ + #define iwe_stream_add_point(a, b, c, d, e) iwe_stream_add_point(b, c, d, e) + #endif + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) ++#define strcasecmp(s1, s2) strcmp(s1, s2) ++#endif + + #define RTL_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+0x1E + diff --git a/meta-openvuplus/recipes-connectivity/realtek/r8712u_2.6.6.0.20101111.bb b/meta-openvuplus/recipes-connectivity/realtek/r8712u_2.6.6.0.20101111.bb new file mode 100644 index 0000000..bd4d843 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/realtek/r8712u_2.6.6.0.20101111.bb @@ -0,0 +1,30 @@ +SUMMARY = "driver for Realtek USB wireless devices" +HOMEPAGE = "http://www.realtek.com/" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://os_intf/linux/os_intfs.c;endline=19;md5=d1bbd9348c57df9fd08439bddfa32ec5" +PR = "r1" + +SRC_URI = " \ + http://dreamboxupdate.com/download/sources/rtl8712_8188_8191_8192SU_usb_linux_v${PV}.tar.gz \ + file://strcasecmp.patch \ + file://config \ +" +SRC_URI[md5sum] = "137423701c43ac5f09007a393406e678" +SRC_URI[sha256sum] = "34ef8534361b0ce9ec756de8babe68f40ba9ce7a2be23d84cf9c185cc4a7c9bb" + +S = "${WORKDIR}/rtl8712_8188_8191_8192SU_usb_linux_v${PV}" + +inherit module siteinfo + +do_configure() { + install -m 644 ${WORKDIR}/config ${S} + echo "EXTRA_CFLAGS += -DCONFIG_${@base_conditional('SITEINFO_ENDIANNESS', 'le', 'LITTLE', 'BIG', d)}_ENDIAN" >> ${S}/config +} +do_compile() { + unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS + oe_runmake -C "${STAGING_KERNEL_DIR}" SUBDIRS="${S}" modules +} +do_install() { + unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS + oe_runmake -C "${STAGING_KERNEL_DIR}" SUBDIRS="${S}" DEPMOD="echo" INSTALL_MOD_PATH="${D}" modules_install +} diff --git a/meta-openvuplus/recipes-connectivity/rt2870sta/files/RT2870STA.dat b/meta-openvuplus/recipes-connectivity/rt2870sta/files/RT2870STA.dat new file mode 100644 index 0000000..b08b10a --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/rt2870sta/files/RT2870STA.dat @@ -0,0 +1,79 @@ +#The word of "Default" must not be removed +Default +CountryRegion=5 +CountryRegionABand=7 +CountryCode= +ChannelGeography=1 +SSID=11n-AP +NetworkType=Infra +WirelessMode=5 +Channel=0 +BeaconPeriod=100 +TxPower=100 +BGProtection=0 +TxPreamble=0 +RTSThreshold=2347 +FragThreshold=2346 +TxBurst=1 +PktAggregate=0 +WmmCapable=1 +AckPolicy=0;0;0;0 +AuthMode=OPEN +EncrypType=NONE +WPAPSK= +DefaultKeyID=1 +Key1Type=0 +Key1Str= +Key2Type=0 +Key2Str= +Key3Type=0 +Key3Str= +Key4Type=0 +Key4Str= +PSMode=CAM +AutoRoaming=0 +RoamThreshold=70 +APSDCapable=0 +APSDAC=0;0;0;0 +HT_RDG=1 +HT_EXTCHA=0 +HT_OpMode=0 +HT_MpduDensity=4 +HT_BW=1 +HT_BADecline=0 +HT_AutoBA=1 +HT_AMSDU=0 +HT_BAWinSize=64 +HT_GI=1 +HT_MCS=33 +HT_MIMOPSMode=3 +HT_DisallowTKIP=1 +HT_STBC=0 +EthConvertMode= +EthCloneMac= +IEEE80211H=0 +TGnWifiTest=0 +WirelessEvent=0 +MeshId=MESH +MeshAutoLink=1 +MeshAuthMode=OPEN +MeshEncrypType=NONE +MeshWPAKEY= +MeshDefaultkey=1 +MeshWEPKEY= +CarrierDetect=0 +AntDiversity=0 +BeaconLostTime=4 +FtSupport=0 +Wapiifname=ra0 +WapiPsk= +WapiPskType= +WapiUserCertPath= +WapiAsCertPath= +PSP_XLINK_MODE=0 +WscManufacturer= +WscModelName= +WscDeviceName= +WscModelNumber= +WscSerialNumber= +RadioOn=1 diff --git a/meta-openvuplus/recipes-connectivity/rt2870sta/rt2870sta_1.0.0.bb b/meta-openvuplus/recipes-connectivity/rt2870sta/rt2870sta_1.0.0.bb new file mode 100644 index 0000000..33032cf --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/rt2870sta/rt2870sta_1.0.0.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "install RT2870STA.dat file for ralink drivers" + +PV = "1.0.0" +PR = "r0" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" +SRC_URI = "file://RT2870STA.dat" + +S = "${WORKDIR}/" + +do_compile() { + : +} + +do_install() { + install -d ${D}/etc/Wireless/RT2870STA/ + install -m 0755 ${WORKDIR}/RT2870STA.dat ${D}/etc/Wireless/RT2870STA/ +} diff --git a/meta-openvuplus/recipes-connectivity/rt73-firmware/rt73-firmware_1.8.bb b/meta-openvuplus/recipes-connectivity/rt73-firmware/rt73-firmware_1.8.bb new file mode 100644 index 0000000..70c5760 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/rt73-firmware/rt73-firmware_1.8.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "Firmware for rt73 based USB wifi adaptors" +LICENSE = "unknown" +LIC_FILES_CHKSUM = "file://LICENSE.ralink-firmware.txt;md5=682eac07428a4e8f138bc082f090ecac" + +PR = "r1" + +SRC_URI = "http://www.ralinktech.com.tw/data/RT71W_Firmware_V${PV}.zip" + +S = "${WORKDIR}/RT71W_Firmware_V${PV}" + +do_install() { + install -d ${D}/${base_libdir}/firmware + install -m 0644 rt73.bin ${D}/${base_libdir}/firmware/ +} + +FILES_${PN} = "${base_libdir}/firmware/" +PACKAGE_ARCH = "all" diff --git a/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch new file mode 100644 index 0000000..832ce9d --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch @@ -0,0 +1,31 @@ +From 51aaf9c6812430975dcd2cf9a632eb8d241ec41e Mon Sep 17 00:00:00 2001 +From: Andrew Bartlett +Date: Thu, 3 Jun 2010 09:35:31 +1000 +Subject: [PATCH] s3:schannel client Push the domain and netbios name into the DOS charset + +If the netbios name is not just ASCII, then we have to get it into the +right character set. + +Andrew Bartlett +--- + source/rpc_parse/parse_rpc.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git source/rpc_parse/parse_rpc.c source/rpc_parse/parse_rpc.c +index 2d166c7..7b4b8e8 100644 +--- source/rpc_parse/parse_rpc.c ++++ source/rpc_parse/parse_rpc.c +@@ -786,8 +786,8 @@ void init_rpc_auth_schannel_neg(RPC_AUTH_SCHANNEL_NEG *neg, + { + neg->type1 = 0; + neg->type2 = 0x3; +- fstrcpy(neg->domain, domain); +- fstrcpy(neg->myname, myname); ++ push_ascii_fstring(neg->domain, domain); ++ push_ascii_fstring(neg->myname, myname); + } + + /******************************************************************* +-- +1.7.0.1 + diff --git a/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/configure.patch b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/configure.patch new file mode 100644 index 0000000..ddcb9e9 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/configure.patch @@ -0,0 +1,213 @@ +diff -urN source.old//aclocal.m4 source//aclocal.m4 +--- source.old//aclocal.m4 2008-08-25 22:09:21.000000000 +0100 ++++ source//aclocal.m4 2008-11-23 17:44:58.050646210 +0000 +@@ -1,5 +1,5 @@ + dnl test whether dirent has a d_off member +-AC_DEFUN(AC_DIRENT_D_OFF, ++AC_DEFUN([AC_DIRENT_D_OFF], + [AC_CACHE_CHECK([for d_off in dirent], ac_cv_dirent_d_off, + [AC_TRY_COMPILE([ + #include +@@ -13,7 +13,7 @@ + + dnl Mark specified module as shared + dnl SMB_MODULE(name,static_files,shared_files,subsystem,whatif-static,whatif-shared) +-AC_DEFUN(SMB_MODULE, ++AC_DEFUN([SMB_MODULE], + [ + AC_MSG_CHECKING([how to build $1]) + if test "$[MODULE_][$1]"; then +@@ -44,7 +44,7 @@ + fi + ]) + +-AC_DEFUN(SMB_SUBSYSTEM, ++AC_DEFUN([SMB_SUBSYSTEM], + [ + AC_SUBST($1_STATIC) + AC_SUBST($1_MODULES) +@@ -229,7 +229,7 @@ + + dnl Define an AC_DEFINE with ifndef guard. + dnl AC_N_DEFINE(VARIABLE [, VALUE]) +-define(AC_N_DEFINE, ++define([AC_N_DEFINE], + [cat >> confdefs.h <<\EOF + [#ifndef] $1 + [#define] $1 ifelse($#, 2, [$2], $#, 3, [$2], 1) +@@ -239,14 +239,14 @@ + + dnl Add an #include + dnl AC_ADD_INCLUDE(VARIABLE) +-define(AC_ADD_INCLUDE, ++define([AC_ADD_INCLUDE], + [cat >> confdefs.h <<\EOF + [#include] $1 + EOF + ]) + + dnl Copied from libtool.m4 +-AC_DEFUN(AC_PROG_LD_GNU, ++AC_DEFUN([AC_PROG_LD_GNU], + [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, + [# I'd rather use --version here, but apparently some GNU ld's only accept -v. + if $LD -v 2>&1 &5; then +@@ -257,7 +257,7 @@ + ]) + + dnl Removes -I/usr/include/? from given variable +-AC_DEFUN(CFLAGS_REMOVE_USR_INCLUDE,[ ++AC_DEFUN([CFLAGS_REMOVE_USR_INCLUDE],[ + ac_new_flags="" + for i in [$]$1; do + case [$]i in +@@ -270,7 +270,7 @@ + + dnl Removes '-L/usr/lib[/]', '-Wl,-rpath,/usr/lib[/]' + dnl and '-Wl,-rpath -Wl,/usr/lib[/]' from given variable +-AC_DEFUN(LIB_REMOVE_USR_LIB,[ ++AC_DEFUN([LIB_REMOVE_USR_LIB],[ + ac_new_flags="" + l="" + for i in [$]$1; do +@@ -301,7 +301,7 @@ + + dnl From Bruno Haible. + +-AC_DEFUN(jm_ICONV, ++AC_DEFUN([jm_ICONV], + [ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable libiconv installed). +@@ -387,7 +387,7 @@ + fi + ]) + +-AC_DEFUN(rjs_CHARSET,[ ++AC_DEFUN([rjs_CHARSET],[ + dnl Find out if we can convert from $1 to UCS2-LE + AC_MSG_CHECKING([can we convert from $1 to UCS2-LE?]) + AC_TRY_RUN([ +@@ -405,7 +405,7 @@ + + dnl CFLAGS_ADD_DIR(CFLAGS, $INCDIR) + dnl This function doesn't add -I/usr/include into CFLAGS +-AC_DEFUN(CFLAGS_ADD_DIR,[ ++AC_DEFUN([CFLAGS_ADD_DIR],[ + if test "$2" != "/usr/include" ; then + $1="$$1 -I$2" + fi +@@ -413,7 +413,7 @@ + + dnl LIB_ADD_DIR(LDFLAGS, $LIBDIR) + dnl This function doesn't add -L/usr/lib into LDFLAGS +-AC_DEFUN(LIB_ADD_DIR,[ ++AC_DEFUN([LIB_ADD_DIR],[ + if test "$2" != "/usr/lib" ; then + $1="$$1 -L$2" + fi +@@ -486,7 +486,7 @@ + dnl AC_TRY_RUN_STRICT(PROGRAM,CFLAGS,CPPFLAGS,LDFLAGS, + dnl [ACTION-IF-TRUE],[ACTION-IF-FALSE], + dnl [ACTION-IF-CROSS-COMPILING = RUNTIME-ERROR]) +-AC_DEFUN( [AC_TRY_RUN_STRICT], ++AC_DEFUN([AC_TRY_RUN_STRICT], + [ + old_CFLAGS="$CFLAGS"; + CFLAGS="$2"; +diff -urN source.old//configure.in source//configure.in +--- source.old//configure.in 2008-08-25 22:09:21.000000000 +0100 ++++ source//configure.in 2008-11-23 17:22:17.108791515 +0000 +@@ -1402,7 +1402,7 @@ + #endif + exit(0); + } +-], [linux_getgrouplist_ok=yes], [linux_getgrouplist_ok=no]) ++], [linux_getgrouplist_ok=yes], [linux_getgrouplist_ok=no], [linux_getgrouplist_ok=cross]) + if test x"$linux_getgrouplist_ok" = x"yes"; then + AC_DEFINE(HAVE_GETGROUPLIST, 1, [Have good getgrouplist]) + fi +diff -urN source.old//lib/replace/libreplace.m4 source//lib/replace/libreplace.m4 +--- source.old//lib/replace/libreplace.m4 2008-08-25 22:09:21.000000000 +0100 ++++ source//lib/replace/libreplace.m4 2008-11-23 17:54:27.942153096 +0000 +@@ -1,4 +1,4 @@ +-AC_DEFUN_ONCE(AC_LIBREPLACE_LOCATION_CHECKS, ++AC_DEFUN_ONCE([AC_LIBREPLACE_LOCATION_CHECKS], + [ + echo "LIBREPLACE_LOCATION_CHECKS: START" + +@@ -27,7 +27,7 @@ + ]) dnl end AC_LIBREPLACE_LOCATION_CHECKS + + +-AC_DEFUN_ONCE(AC_LIBREPLACE_BROKEN_CHECKS, ++AC_DEFUN_ONCE([AC_LIBREPLACE_BROKEN_CHECKS], + [ + echo "LIBREPLACE_BROKEN_CHECKS: START" + +@@ -325,25 +325,25 @@ + AC_DEFINE(HAVE_VOLATILE, 1, [Whether the C compiler understands volatile]) + fi + +-m4_include(system/config.m4) ++m4_include(lib/replace/system/config.m4) + +-m4_include(dlfcn.m4) +-m4_include(getpass.m4) +-m4_include(strptime.m4) +-m4_include(win32.m4) +-m4_include(timegm.m4) +-m4_include(repdir.m4) ++m4_include(lib/replace/dlfcn.m4) ++m4_include(lib/replace/getpass.m4) ++m4_include(lib/replace/strptime.m4) ++m4_include(lib/replace/win32.m4) ++m4_include(lib/replace/timegm.m4) ++m4_include(lib/replace/repdir.m4) + + AC_CHECK_FUNCS([syslog memset memcpy],,[AC_MSG_ERROR([Required function not found])]) + + echo "LIBREPLACE_BROKEN_CHECKS: END" + ]) dnl end AC_LIBREPLACE_BROKEN_CHECKS + +-AC_DEFUN_ONCE(AC__LIBREPLACE_ALL_CHECKS_START, ++AC_DEFUN_ONCE([AC__LIBREPLACE_ALL_CHECKS_START], + [ + #LIBREPLACE_ALL_CHECKS: START" + ]) +-AC_DEFUN_ONCE(AC__LIBREPLACE_ALL_CHECKS_END, ++AC_DEFUN_ONCE([AC__LIBREPLACE_ALL_CHECKS_END], + [ + #LIBREPLACE_ALL_CHECKS: END" + ]) +@@ -356,6 +356,6 @@ + AC__LIBREPLACE_ALL_CHECKS_END + ]) + +-m4_include(libreplace_cc.m4) +-m4_include(libreplace_macros.m4) +-m4_include(autoconf-2.60.m4) ++m4_include(lib/replace/libreplace_cc.m4) ++m4_include(lib/replace/libreplace_macros.m4) ++m4_include(lib/replace/autoconf-2.60.m4) +diff -urN source.old//lib/replace/libreplace_macros.m4 source//lib/replace/libreplace_macros.m4 +--- source.old//lib/replace/libreplace_macros.m4 2008-08-25 22:09:21.000000000 +0100 ++++ source//lib/replace/libreplace_macros.m4 2008-11-23 17:31:08.269791372 +0000 +@@ -76,7 +76,7 @@ + ]) + + dnl AC_PROG_CC_FLAG(flag) +-AC_DEFUN(AC_PROG_CC_FLAG, ++AC_DEFUN([AC_PROG_CC_FLAG], + [AC_CACHE_CHECK(whether ${CC-cc} accepts -$1, ac_cv_prog_cc_$1, + [echo 'void f(){}' > conftest.c + if test -z "`${CC-cc} -$1 -c conftest.c 2>&1`"; then +@@ -103,7 +103,7 @@ + dnl see if a declaration exists for a function or variable + dnl defines HAVE_function_DECL if it exists + dnl AC_HAVE_DECL(var, includes) +-AC_DEFUN(AC_HAVE_DECL, ++AC_DEFUN([AC_HAVE_DECL], + [ + AC_CACHE_CHECK([for $1 declaration],ac_cv_have_$1_decl,[ + AC_TRY_COMPILE([$2],[int i = (int)$1], diff --git a/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/kernel-oplocks.patch b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/kernel-oplocks.patch new file mode 100644 index 0000000..bee0f1d --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/kernel-oplocks.patch @@ -0,0 +1,20 @@ +Linux oplock support is conditional on HAVE_KERNEL_OPLOCKS_LINUX, +not plain old LINUX. + +http://websvn.samba.org/cgi-bin/viewcvs.cgi?rev=23962&view=rev +--- source/modules/vfs_default.c.orig 2010-09-06 17:37:48.256826182 +0200 ++++ source/modules/vfs_default.c 2010-09-06 17:38:25.300843377 +0200 +@@ -813,10 +813,11 @@ + + START_PROFILE(syscall_linux_setlease); + +-#ifdef LINUX ++#ifdef HAVE_KERNEL_OPLOCKS_LINUX + /* first set the signal handler */ +- if(linux_set_lease_sighandler(fd) == -1) ++ if(linux_set_lease_sighandler(fd) == -1) { + return -1; ++ } + + result = linux_setlease(fd, leasetype); + #else diff --git a/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch new file mode 100644 index 0000000..4144a9e --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch @@ -0,0 +1,91 @@ +From f781c9c693462b89b60a3662d2a1224c9387a725 Mon Sep 17 00:00:00 2001 +From: Volker Lendecke +Date: Fri, 10 Feb 2012 08:10:39 +0100 +Subject: [PATCH 1/2] v3-3: AndX offsets are increasing strictly monotonically + +--- + source/smbd/process.c | 10 +++++++++- + 1 files changed, 9 insertions(+), 1 deletions(-) + +diff --git source/smbd/process.c source/smbd/process.c +index e861e16..f64e1ce 100644 +--- source/smbd/process.c ++++ source/smbd/process.c +@@ -1160,7 +1160,7 @@ int chain_reply(char *inbuf,char *outbuf,int size,int bufsize) + static char *orig_inbuf; + static char *orig_outbuf; + int smb_com1, smb_com2 = CVAL(inbuf,smb_vwv0); +- unsigned smb_off2 = SVAL(inbuf,smb_vwv1); ++ static unsigned smb_off2; + char *inbuf2, *outbuf2; + int outsize2; + int new_size; +@@ -1178,8 +1178,16 @@ int chain_reply(char *inbuf,char *outbuf,int size,int bufsize) + /* this is the first part of the chain */ + orig_inbuf = inbuf; + orig_outbuf = outbuf; ++ smb_off2 = 0; + } + ++ if (SVAL(inbuf,smb_vwv1) <= smb_off2) { ++ DEBUG(1, ("AndX offset not increasing\n")); ++ SCVAL(outbuf, smb_vwv0, 0xFF); ++ return outsize; ++ } ++ smb_off2 = SVAL(inbuf, smb_vwv1); ++ + /* + * The original Win95 redirector dies on a reply to + * a lockingX and read chain unless the chain reply is +-- +1.7.3.4 + + +From 009bb0be7383777a650a3bc6af1c0d3ab7476ebc Mon Sep 17 00:00:00 2001 +From: Volker Lendecke +Date: Fri, 10 Feb 2012 08:39:33 +0100 +Subject: [PATCH 2/2] v3-0-test: Port back some packet consistency checks + +--- + source/smbd/process.c | 18 ++++++++++++++++++ + 1 files changed, 18 insertions(+), 0 deletions(-) + +diff --git source/smbd/process.c source/smbd/process.c +index f64e1ce..8aabef8 100644 +--- source/smbd/process.c ++++ source/smbd/process.c +@@ -1025,6 +1025,7 @@ static int construct_reply(char *inbuf,char *outbuf,int size,int bufsize) + int outsize = 0; + int msg_type = CVAL(inbuf,0); + uint16_t mid = SVAL(inbuf, smb_mid); ++ uint8_t wct = CVAL(inbuf, smb_wct); + + chain_size = 0; + file_chain_reset(); +@@ -1033,6 +1034,23 @@ static int construct_reply(char *inbuf,char *outbuf,int size,int bufsize) + if (msg_type != 0) + return(reply_special(inbuf,outbuf)); + ++ /* Ensure we have at least wct words and 2 bytes of bcc. */ ++ if (smb_size + wct*2 > size) { ++ DEBUG(0,("init_smb_request: invalid wct number %u (size %u)\n", ++ (unsigned int)wct, ++ (unsigned int)size)); ++ exit_server_cleanly("Invalid SMB request"); ++ } ++ /* Ensure bcc is correct. */ ++ if (((uint8 *)smb_buf(inbuf)) + smb_buflen(inbuf) > inbuf + size) { ++ DEBUG(0,("init_smb_request: invalid bcc number %u " ++ "(wct = %u, size %u)\n", ++ (unsigned int)smb_buflen(inbuf), ++ (unsigned int)wct, ++ (unsigned int)size)); ++ exit_server_cleanly("Invalid SMB request"); ++ } ++ + construct_reply_common(inbuf, outbuf); + + outsize = switch_message(type,inbuf,outbuf,size,bufsize); +-- +1.7.3.4 + diff --git a/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch new file mode 100644 index 0000000..bbe38e4 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch @@ -0,0 +1,59 @@ +From e11637c2c89c2d38963311416c34a4767b19e175 Mon Sep 17 00:00:00 2001 +From: Stefan Metzmacher +Date: Sat, 17 Mar 2012 01:22:27 +0100 +Subject: [PATCH] s3:librpc/gen_ndr: fix array checks (bug #8815 / CVE-2012-1182) + +An Anonymous researcher working with HP's Zero Day Initiative program +has found this and notified us. + +metze +--- + source/librpc/gen_ndr/ndr_wkssvc.c | 12 ++++++------ + 1 files changed, 6 insertions(+), 6 deletions(-) + +diff --git source/librpc/gen_ndr/ndr_wkssvc.c source/librpc/gen_ndr/ndr_wkssvc.c +index 2af3587..07cf1a1 100644 +--- source/librpc/gen_ndr/ndr_wkssvc.c ++++ source/librpc/gen_ndr/ndr_wkssvc.c +@@ -1385,10 +1385,10 @@ NTSTATUS ndr_pull_USER_INFO_0_CONTAINER(struct ndr_pull *ndr, int ndr_flags, str + NDR_PULL_ALLOC_N(ndr, r->user0, ndr_get_array_size(ndr, &r->user0)); + _mem_save_user0_1 = NDR_PULL_GET_MEM_CTX(ndr); + NDR_PULL_SET_MEM_CTX(ndr, r->user0, 0); +- for (cntr_user0_1 = 0; cntr_user0_1 < r->entries_read; cntr_user0_1++) { ++ for (cntr_user0_1 = 0; cntr_user0_1 < ndr_get_array_size(ndr, &r->user0); cntr_user0_1++) { + NDR_CHECK(ndr_pull_USER_INFO_0(ndr, NDR_SCALARS, &r->user0[cntr_user0_1])); + } +- for (cntr_user0_1 = 0; cntr_user0_1 < r->entries_read; cntr_user0_1++) { ++ for (cntr_user0_1 = 0; cntr_user0_1 < ndr_get_array_size(ndr, &r->user0); cntr_user0_1++) { + NDR_CHECK(ndr_pull_USER_INFO_0(ndr, NDR_BUFFERS, &r->user0[cntr_user0_1])); + } + NDR_PULL_SET_MEM_CTX(ndr, _mem_save_user0_1, 0); +@@ -1631,10 +1631,10 @@ NTSTATUS ndr_pull_USER_INFO_1_CONTAINER(struct ndr_pull *ndr, int ndr_flags, str + NDR_PULL_ALLOC_N(ndr, r->user1, ndr_get_array_size(ndr, &r->user1)); + _mem_save_user1_1 = NDR_PULL_GET_MEM_CTX(ndr); + NDR_PULL_SET_MEM_CTX(ndr, r->user1, 0); +- for (cntr_user1_1 = 0; cntr_user1_1 < r->entries_read; cntr_user1_1++) { ++ for (cntr_user1_1 = 0; cntr_user1_1 < ndr_get_array_size(ndr, &r->user1); cntr_user1_1++) { + NDR_CHECK(ndr_pull_USER_INFO_1(ndr, NDR_SCALARS, &r->user1[cntr_user1_1])); + } +- for (cntr_user1_1 = 0; cntr_user1_1 < r->entries_read; cntr_user1_1++) { ++ for (cntr_user1_1 = 0; cntr_user1_1 < ndr_get_array_size(ndr, &r->user1); cntr_user1_1++) { + NDR_CHECK(ndr_pull_USER_INFO_1(ndr, NDR_BUFFERS, &r->user1[cntr_user1_1])); + } + NDR_PULL_SET_MEM_CTX(ndr, _mem_save_user1_1, 0); +@@ -1953,10 +1953,10 @@ NTSTATUS ndr_pull_wkssvc_NetWkstaTransportCtr0(struct ndr_pull *ndr, int ndr_fla + NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array)); + _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr); + NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); +- for (cntr_array_1 = 0; cntr_array_1 < r->count; cntr_array_1++) { ++ for (cntr_array_1 = 0; cntr_array_1 < ndr_get_array_size(ndr, &r->array); cntr_array_1++) { + NDR_CHECK(ndr_pull_wkssvc_NetWkstaTransportInfo0(ndr, NDR_SCALARS, &r->array[cntr_array_1])); + } +- for (cntr_array_1 = 0; cntr_array_1 < r->count; cntr_array_1++) { ++ for (cntr_array_1 = 0; cntr_array_1 < ndr_get_array_size(ndr, &r->array); cntr_array_1++) { + NDR_CHECK(ndr_pull_wkssvc_NetWkstaTransportInfo0(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); + } + NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0); +-- +1.7.4.1 + diff --git a/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch new file mode 100644 index 0000000..b10a1b1 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch @@ -0,0 +1,46 @@ +diff --git source.old/client/mount.cifs.c source/client/mount.cifs.c +index 3b56e5f..b7a76c6 100644 +--- source.old/client/mount.cifs.c ++++ source/client/mount.cifs.c +@@ -56,6 +56,10 @@ + #endif /* _SAMBA_BUILD_ */ + #endif /* MOUNT_CIFS_VENDOR_SUFFIX */ + ++#ifdef _SAMBA_BUILD_ ++#include "include/config.h" ++#endif ++ + #ifndef MS_MOVE + #define MS_MOVE 8192 + #endif +@@ -94,6 +98,8 @@ char * prefixpath = NULL; + + /* like strncpy but does not 0 fill the buffer and always null + * terminates. bufsize is the size of the destination buffer */ ++ ++#ifndef HAVE_STRLCPY + static size_t strlcpy(char *d, const char *s, size_t bufsize) + { + size_t len = strlen(s); +@@ -104,10 +110,13 @@ static size_t strlcpy(char *d, const char *s, size_t bufsize) + d[len] = 0; + return ret; + } ++#endif + + /* like strncat but does not 0 fill the buffer and always null + * terminates. bufsize is the length of the buffer, which should + * be one more than the maximum resulting string length */ ++ ++#ifndef HAVE_STRLCAT + static size_t strlcat(char *d, const char *s, size_t bufsize) + { + size_t len1 = strlen(d); +@@ -126,6 +135,7 @@ static size_t strlcat(char *d, const char *s, size_t bufsize) + } + return ret; + } ++#endif + + /* BB finish BB + diff --git a/meta-openvuplus/recipes-connectivity/samba/samba/01samba-kill b/meta-openvuplus/recipes-connectivity/samba/samba/01samba-kill new file mode 100644 index 0000000..41f7781 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba/01samba-kill @@ -0,0 +1,5 @@ +#!/bin/sh +killall -9 smbd +rm -rf /var/log/log.smbd +killall -9 nmbd +rm -rf /var/log/log.nmbd diff --git a/meta-openvuplus/recipes-connectivity/samba/samba/01samba-start b/meta-openvuplus/recipes-connectivity/samba/samba/01samba-start new file mode 100644 index 0000000..ce397ad --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba/01samba-start @@ -0,0 +1,3 @@ +#!/bin/sh +nmbd -D +smbd -D diff --git a/meta-openvuplus/recipes-connectivity/samba/samba/config-lfs.patch b/meta-openvuplus/recipes-connectivity/samba/samba/config-lfs.patch new file mode 100644 index 0000000..b37ed69 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba/config-lfs.patch @@ -0,0 +1,47 @@ +Cache the check for Linux LFS support, so it can be prepopulated from +the site cache for configure variables for cross-compiling. Without this, +samba gets the idea that it can use dirent64 and friends without defining +the flags it needs to get it, such as _GNU_SOURCE and _LARGEFILE64_SOURCE. + +Symptoms of getting the configuration wrong on cross-compile inculde +warnings such as + + smbd/trans2.c: In function `get_lanman2_dir_entry': + smbd/trans2.c:1065: warning: right shift count >= width of type + +and errors like + + smbd/vfs.c:630: error: dereferencing pointer to incomplete type + +(when trying to dereference dirent64.) + +--- source/configure.in.orig 2005-05-29 14:46:18.000000000 -0700 ++++ source/configure.in 2005-05-29 14:51:57.000000000 -0700 +@@ -588,7 +588,7 @@ + # Tests for linux LFS support. Need kernel 2.4 and glibc2.2 or greater support. + # + *linux*) +- AC_MSG_CHECKING([for LFS support]) ++ AC_CACHE_CHECK([for LFS support], samba_cv_LINUX_LFS_SUPPORT,[ + old_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE $CPPFLAGS" + AC_TRY_RUN([ +@@ -627,15 +627,14 @@ + exit(1); + #endif + } +-], [LINUX_LFS_SUPPORT=yes], [LINUX_LFS_SUPPORT=no], [LINUX_LFS_SUPPORT=cross]) +- CPPFLAGS="$old_CPPFLAGS" +- if test x$LINUX_LFS_SUPPORT = xyes ; then ++], [samba_cv_LINUX_LFS_SUPPORT=yes], [samba_cv_LINUX_LFS_SUPPORT=no], [samba_cv_LINUX_LFS_SUPPORT=cross]) ++ CPPFLAGS="$old_CPPFLAGS"]) ++ if test x"$samba_cv_LINUX_LFS_SUPPORT" = x"yes" ; then + CPPFLAGS="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE $CPPFLAGS" + AC_DEFINE(_LARGEFILE64_SOURCE, 1, [Whether to enable large file support]) + AC_DEFINE(_FILE_OFFSET_BITS, 64, [File offset bits]) + AC_DEFINE(_GNU_SOURCE, 1, [Whether to use GNU libc extensions]) + fi +- AC_MSG_RESULT([$LINUX_LFS_SUPPORT]) + ;; + + # diff --git a/meta-openvuplus/recipes-connectivity/samba/samba/init b/meta-openvuplus/recipes-connectivity/samba/samba/init new file mode 100644 index 0000000..cb57b17 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba/init @@ -0,0 +1,58 @@ +#! /bin/sh +# +# This is an init script for openembedded +# Copy it to /etc/init.d/samba and type +# > update-rc.d samba defaults 60 +# + + +smbd=/usr/sbin/smbd +test -x "$smbd" || exit 0 +nmbd=/usr/sbin/nmbd +test -x "$nmbd" || exit 0 + + +case "$1" in + start) + echo -n "Starting Samba: smbd" + start-stop-daemon --start --quiet --exec $smbd + echo -n " nmbd" + start-stop-daemon --start --quiet --exec $nmbd + echo "." + ;; + stop) + echo -n "Stopping Samba: smbd" + start-stop-daemon --stop --quiet --pidfile /var/run/smbd.pid + echo -n " nmbd" + start-stop-daemon --stop --quiet --pidfile /var/run/nmbd.pid + echo "." + ;; + reload|force-reload) + start-stop-daemon --stop --quiet --signal 1 --exec $smbd + start-stop-daemon --stop --quiet --signal 1 --exec $nmbd + ;; + restart) + echo -n "Stopping Samba: smbd" + start-stop-daemon --stop --quiet --pidfile /var/run/smbd.pid + echo -n " nmbd" + start-stop-daemon --stop --quiet --pidfile /var/run/nmbd.pid + echo "" + echo -n "Waiting for samba processes to die off" + for i in 1 2 3 ; + do + sleep 1 + echo -n "." + done + echo "" + echo -n "Starting Samba: smbd" + start-stop-daemon --start --quiet --exec $smbd + echo -n " nmbd" + start-stop-daemon --start --quiet --exec $nmbd + echo "." + ;; + *) + echo "Usage: /etc/init.d/samba {start|stop|reload|restart|force-reload}" + exit 1 +esac + +exit 0 \ No newline at end of file diff --git a/meta-openvuplus/recipes-connectivity/samba/samba/quota.patch b/meta-openvuplus/recipes-connectivity/samba/samba/quota.patch new file mode 100644 index 0000000..6f42ff8 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba/quota.patch @@ -0,0 +1,11 @@ +--- lib/sysquotas_4A.c.old 2005-07-03 17:16:00.000000000 +0200 ++++ lib/sysquotas_4A.c 2005-07-03 17:10:09.000000000 +0200 +@@ -28,6 +28,8 @@ + /* long quotactl(int cmd, char *special, qid_t id, caddr_t addr) */ + /* this is used by: HPUX,IRIX */ + ++ #define _LINUX_QUOTA_VERSION 1 ++ + #ifdef HAVE_SYS_TYPES_H + #include + #endif diff --git a/meta-openvuplus/recipes-connectivity/samba/samba/smb.conf b/meta-openvuplus/recipes-connectivity/samba/samba/smb.conf new file mode 100644 index 0000000..83ac00d --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba/smb.conf @@ -0,0 +1,29 @@ +[global] + load printers = no + guest account = root + log file = /tmp/smb.log + log level = 1 + security = share + server string = Dreambox %h network services + workgroup = Dream + netbios name = %h + case sensitive=yes + preserve case=yes + short preserve case=yes + socket options = TCP_NODELAY + preferred master = no ;(These stop the machine being master browser, which means that it doesn't waste time there.) + oplocks = no + +[Configuration] + comment = Configuration files - take care! + path = /var + read only = no + public = yes + guest ok = yes + +[Harddisk] + comment = The harddisk + path = /media/hdd + read only = no + public = yes + guest ok = yes diff --git a/meta-openvuplus/recipes-connectivity/samba/samba/tdb.pc b/meta-openvuplus/recipes-connectivity/samba/samba/tdb.pc new file mode 100644 index 0000000..6307a20 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba/tdb.pc @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=/usr +libdir=/usr/lib +includedir=/usr/include + +Name: tdb +Description: A trivial database +Version: 1.1.2 +Libs: -L${libdir} -ltdb +Cflags: -I${includedir} +URL: http://tdb.samba.org/ diff --git a/meta-openvuplus/recipes-connectivity/samba/samba/volatiles.03_samba b/meta-openvuplus/recipes-connectivity/samba/samba/volatiles.03_samba new file mode 100644 index 0000000..469bc9e --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba/volatiles.03_samba @@ -0,0 +1,2 @@ +# +d root root 0755 /var/log/samba none diff --git a/meta-openvuplus/recipes-connectivity/samba/samba_3.0.37.bb b/meta-openvuplus/recipes-connectivity/samba/samba_3.0.37.bb new file mode 100644 index 0000000..eb05c71 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba_3.0.37.bb @@ -0,0 +1,20 @@ +require recipes-connectivity/samba/samba.inc +require recipes-connectivity/samba/samba-basic.inc +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://../COPYING;md5=8ca43cbc842c2336e835926c2166c28b" +PR = "r2" + +SRC_URI += "file://configure.patch \ + file://kernel-oplocks.patch \ + file://0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch \ + file://samba-3.0-CVE-2012-0870.patch \ + file://samba-3.0.37-CVE-2012-1182.patch" +SRC_URI_append_linux-uclibc = "file://uclibc-strlcpy-strlcat.patch" +SRC_URI_append_linux-uclibceabi = "file://uclibc-strlcpy-strlcat.patch" + +EXTRA_OECONF += "\ + SMB_BUILD_CC_NEGATIVE_ENUM_VALUES=yes \ + " + +SRC_URI[md5sum] = "11ed2bfef4090bd5736b194b43f67289" +SRC_URI[sha256sum] = "bb67c0e13d4ccbd84b9200c8739393fdd9b3145b5aad216934dc670f0fcea266" diff --git a/meta-openvuplus/recipes-connectivity/samba/samba_3.0.37.bbappend b/meta-openvuplus/recipes-connectivity/samba/samba_3.0.37.bbappend new file mode 100644 index 0000000..c6512c2 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/samba/samba_3.0.37.bbappend @@ -0,0 +1,31 @@ +PR .= "-vuplus0" + +SRC_URI += " \ + file://01samba-kill \ + file://01samba-start \ +" + +PACKAGES =+ "smbfs smbfs-doc sambaserver libpopt libtalloc" + +FILES_smbfs = "${bindir}/smbmount ${bindir}/smbumount ${bindir}/smbmnt ${base_sbindir}/mount.smbfs ${base_sbindir}/mount.smb" +FILES_smbfs-doc = "${mandir}/man8/smbmount.8 ${mandir}/man8/smbumount.8 ${mandir}/man8/smbmnt.8" +FILES_sambaserver = "${sbindir}/smbd ${sbindir}/nmbd ${libdir}/charset/*.so ${libdir}/*.dat \ + ${sysconfdir}/samba/smb.conf ${sysconfdir}/samba/private \ + ${sysconfdir}/network/if-up.d/01samba-start ${sysconfdir}/network/if-down.d/01samba-kill" +FILES_libpopt = "${libdir}/libpopt.so.*" +FILES_libtalloc = "${libdir}/libtalloc.so.*" + +CONFFILES_${PN} = "" +CONFFILES_sambaserver = "${sysconfdir}/samba/smb.conf" + +do_install_prepend() { + install -c -m 644 ${WORKDIR}/smb.conf ../examples/smb.conf.default +} + +do_install_append() { + install -d ${D}${sysconfdir}/samba/private + install -d ${D}${sysconfdir}/network/if-down.d + install -m 0755 ${WORKDIR}/01samba-kill ${D}${sysconfdir}/network/if-down.d + install -d ${D}${sysconfdir}/network/if-up.d + install -m 0755 ${WORKDIR}/01samba-start ${D}${sysconfdir}/network/if-up.d +} diff --git a/meta-openvuplus/recipes-connectivity/tasks/task-vuplus-wlan.bb b/meta-openvuplus/recipes-connectivity/tasks/task-vuplus-wlan.bb new file mode 100644 index 0000000..f5f7c1a --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/tasks/task-vuplus-wlan.bb @@ -0,0 +1,55 @@ +DESCRIPTION = "Vuplus: W-LAN Task for the Vuplus Distribution" +SECTION = "vuplus/base" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" +PR = "r8" + +inherit task + +DEPENDS_${PN} = "enigma2-plugins" +RDEPENDS_${PN} = "\ + ${@base_contains("MACHINE_FEATURES", "vuwlan", "enigma2-plugin-systemplugins-wirelesslansetup", "enigma2-plugin-systemplugins-wirelesslan", d)} \ + wireless-tools \ + wpa-supplicant \ +" + +WIFI_FIRMWARES = "\ + rt73-firmware \ + zd1211-firmware \ + firmware-htc9271 \ + firmware-rt2561 \ + firmware-rtl8721u \ + firmware-rt3070 \ +" + +RALINK_MODULE = "${@base_version_less_or_equal('VUPLUS_KERNEL_VERSION', '3.1.1', 'rt3070', 'kernel-module-rt2800usb rt2870sta firmware-rt3070', d)}" + +REALTEK_MODULE = "${@base_version_less_or_equal('VUPLUS_KERNEL_VERSION', '3.1.1', 'r8192cu', 'kernel-module-rtl8192cu', d)}" + +KERNEL_WIFI_MODULES = " \ + kernel-module-ath9k-htc \ + kernel-module-carl9170 \ + kernel-module-prism2-usb \ + kernel-module-rt73usb \ + kernel-module-rt2500usb \ + kernel-module-r8192u-usb \ + kernel-module-rtl8192cu \ + kernel-module-rtl8187 \ + kernel-module-r8712u \ + kernel-module-w35und \ + kernel-module-zd1211rw \ + kernel-module-rt2800usb \ + kernel-module-llc \ + kernel-module-stp \ + kernel-module-bridge \ + kernel-module-hostap \ +" + +RDEPENDS_${PN}_append = "\ + ${WIFI_FIRMWARES} \ + ${KERNEL_WIFI_MODULES} \ + ${RALINK_MODULE} \ + ${REALTEK_MODULE} \ +" +PACKAGE_ARCH = "${MACHINE_ARCH}" + diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/01-builddefs.patch b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/01-builddefs.patch new file mode 100644 index 0000000..a757d99 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/01-builddefs.patch @@ -0,0 +1,18 @@ +Author: Daniel Jacobowitz +Description: Build with tcpwrapper and SSL support. + +diff -Naurp vsftpd.orig/builddefs.h vsftpd/builddefs.h +--- vsftpd.orig/builddefs.h 2009-01-31 00:02:36.000000000 +0000 ++++ vsftpd/builddefs.h 2009-01-31 00:26:34.000000000 +0000 +@@ -1,9 +1,9 @@ + #ifndef VSF_BUILDDEFS_H + #define VSF_BUILDDEFS_H + +-#undef VSF_BUILD_TCPWRAPPERS ++#define VSF_BUILD_TCPWRAPPERS 1 + #define VSF_BUILD_PAM +-#undef VSF_BUILD_SSL ++#define VSF_BUILD_SSL + + #endif /* VSF_BUILDDEFS_H */ + diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/02-config.patch b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/02-config.patch new file mode 100644 index 0000000..6d7965d --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/02-config.patch @@ -0,0 +1,120 @@ +Author: Daniel Jacobowitz +Description: Set default configuration. + +diff -Naurp vsftpd.orig/tunables.c vsftpd/tunables.c +--- vsftpd.orig/tunables.c 2009-07-15 22:08:27.000000000 +0200 ++++ vsftpd/tunables.c 2009-11-06 13:33:34.000000000 +0100 +@@ -246,7 +246,7 @@ tunables_load_defaults() + /* -rw------- */ + tunable_chown_upload_mode = 0600; + +- install_str_setting("/usr/share/empty", &tunable_secure_chroot_dir); ++ install_str_setting("/var/run/vsftpd/empty", &tunable_secure_chroot_dir); + install_str_setting("ftp", &tunable_ftp_username); + install_str_setting("root", &tunable_chown_username); + install_str_setting("/var/log/xferlog", &tunable_xferlog_file); +@@ -256,7 +256,7 @@ tunables_load_defaults() + install_str_setting(0, &tunable_ftpd_banner); + install_str_setting("/etc/vsftpd.banned_emails", &tunable_banned_email_file); + install_str_setting("/etc/vsftpd.chroot_list", &tunable_chroot_list_file); +- install_str_setting("ftp", &tunable_pam_service_name); ++ install_str_setting("vsftpd", &tunable_pam_service_name); + install_str_setting("ftp", &tunable_guest_username); + install_str_setting("/etc/vsftpd.user_list", &tunable_userlist_file); + install_str_setting(0, &tunable_anon_root); +diff -Naurp vsftpd.orig/vsftpd.conf vsftpd/vsftpd.conf +--- vsftpd.orig/vsftpd.conf 2009-11-06 08:41:11.000000000 +0100 ++++ vsftpd/vsftpd.conf 2009-11-06 13:35:37.000000000 +0100 +@@ -8,6 +8,17 @@ + # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's + # capabilities. + # ++# ++# Run standalone? vsftpd can run either from an inetd or as a standalone ++# daemon started from an initscript. ++listen=YES ++# ++# Run standalone with IPv6? ++# Like the listen parameter, except vsftpd will listen on an IPv6 socket ++# instead of an IPv4 one. This parameter and the listen parameter are mutually ++# exclusive. ++#listen_ipv6=YES ++# + # Allow anonymous FTP? (Beware - allowed by default if you comment this out). + anonymous_enable=YES + # +@@ -34,6 +45,12 @@ anonymous_enable=YES + # go into a certain directory. + dirmessage_enable=YES + # ++# If enabled, vsftpd will display directory listings with the time ++# in your local time zone. The default is to display GMT. The ++# times returned by the MDTM FTP command are also affected by this ++# option. ++use_localtime=YES ++# + # Activate logging of uploads/downloads. + xferlog_enable=YES + # +@@ -89,6 +106,11 @@ connect_from_port_20=YES + # (default follows) + #banned_email_file=/etc/vsftpd.banned_emails + # ++# You may restrict local users to their home directories. See the FAQ for ++# the possible risks in this before using chroot_local_user or ++# chroot_list_enable below. ++#chroot_local_user=YES ++# + # You may specify an explicit list of local users to chroot() to their home + # directory. If chroot_local_user is YES, then this list becomes a list of + # users to NOT chroot(). +@@ -103,12 +125,20 @@ connect_from_port_20=YES + # the presence of the "-R" option, so there is a strong case for enabling it. + #ls_recurse_enable=YES + # +-# When "listen" directive is enabled, vsftpd runs in standalone mode and +-# listens on IPv4 sockets. This directive cannot be used in conjunction +-# with the listen_ipv6 directive. +-listen=YES ++# Customization + # +-# This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 +-# sockets, you must run two copies of vsftpd with two configuration files. +-# Make sure, that one of the listen options is commented !! +-#listen_ipv6=YES ++# Some of vsftpd's settings don't fit the filesystem layout by ++# default. ++# ++# This option should be the name of a directory which is empty. Also, the ++# directory should not be writable by the ftp user. This directory is used ++# as a secure chroot() jail at times vsftpd does not require filesystem ++# access. ++secure_chroot_dir=/var/run/vsftpd/empty ++# ++# This string is the name of the PAM service vsftpd will use. ++pam_service_name=vsftpd ++# ++# This option specifies the location of the RSA certificate to use for SSL ++# encrypted connections. ++rsa_cert_file=/etc/ssl/private/vsftpd.pem +diff -Naurp vsftpd.orig/vsftpd.conf.5 vsftpd/vsftpd.conf.5 +--- vsftpd.orig/vsftpd.conf.5 2009-11-06 08:41:11.000000000 +0100 ++++ vsftpd/vsftpd.conf.5 2009-11-06 13:37:10.000000000 +0100 +@@ -940,7 +940,7 @@ Default: nobody + .B pam_service_name + This string is the name of the PAM service vsftpd will use. + +-Default: ftp ++Default: vsftpd + .TP + .B pasv_address + Use this option to override the IP address that vsftpd will advertise in +@@ -969,7 +969,7 @@ This option should be the name of a dire + directory should not be writable by the ftp user. This directory is used + as a secure chroot() jail at times vsftpd does not require filesystem access. + +-Default: /usr/share/empty ++Default: /var/run/vsftpd/empty + .TP + .B ssl_ciphers + This option can be used to select which SSL ciphers vsftpd will allow for diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/03-db-doc.patch b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/03-db-doc.patch new file mode 100644 index 0000000..d544ef0 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/03-db-doc.patch @@ -0,0 +1,19 @@ +Author: shaul Karl +Description: + A short explanation how to find out the right db version (Closes: #478282). + +diff -Naurp vsftpd.orig/EXAMPLE/VIRTUAL_USERS/README vsftpd/EXAMPLE/VIRTUAL_USERS/README +--- vsftpd.orig/EXAMPLE/VIRTUAL_USERS/README 2009-01-31 00:02:36.000000000 +0000 ++++ vsftpd/EXAMPLE/VIRTUAL_USERS/README 2009-01-31 01:38:11.000000000 +0000 +@@ -21,7 +21,10 @@ NOTE: Many systems have multiple version + need to use e.g. db3_load for correct operation. This is known to affect + some Debian systems. The core issue is that pam_userdb expects its login + database to be a specific db version (often db3, whereas db4 may be installed +-on your system). ++on your system). You might check ahead what specific db version you'll need ++by looking at the dependcies of the pam module. Some methods to do that is to ++run ldd on the pam_userdb.so or look at the dependencies of the package with ++the pam modules. + + This will create /etc/vsftpd_login.db. Obviously, you may want to make sure + the permissions are restricted: diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/04-link-local.patch b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/04-link-local.patch new file mode 100644 index 0000000..53b3735 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/04-link-local.patch @@ -0,0 +1,91 @@ +Author: Michael Stapelberg +Description: + vsftpd does not accept IPv6 scope identifier in listen_address6 + (Closes: #544993). + . + When specifying a link-local address, you need a scope identifier (tha name of + the index usually), thus you cannot use the following: + listen_address6=fe80::21f:16ff:fe06:3aab + but you have to use: + listen_address6=fe80::21f:16ff:fe06:3aab%eth0 + so that it is clear on which interface this link-local address should be used. + . + Unfortunately, vsftpd does not correctly parse the address mentioned above and + thus fails to be useful in link-local-only environments. + . + This patch fixes it. + +diff -Naurp vsftpd.orig/standalone.c vsftpd/standalone.c +--- vsftpd.orig/standalone.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/standalone.c 2009-10-17 17:10:02.000000000 +0200 +@@ -7,6 +7,8 @@ + * Code to listen on the network and launch children servants. + */ + ++#include ++ + #include "standalone.h" + + #include "parseconf.h" +@@ -111,8 +113,17 @@ vsf_standalone_main(void) + else + { + struct mystr addr_str = INIT_MYSTR; ++ struct mystr scope_id = INIT_MYSTR; + const unsigned char* p_raw_addr; ++ unsigned int if_index = 0; ++ ++ /* See if we got a scope id */ + str_alloc_text(&addr_str, tunable_listen_address6); ++ str_split_char(&addr_str, &scope_id, '%'); ++ if (str_getlen(&scope_id) > 0) { ++ if_index = if_nametoindex(str_getbuf(&scope_id)); ++ str_free(&scope_id); ++ } + p_raw_addr = vsf_sysutil_parse_ipv6(&addr_str); + str_free(&addr_str); + if (!p_raw_addr) +@@ -120,6 +131,7 @@ vsf_standalone_main(void) + die2("bad listen_address6: ", tunable_listen_address6); + } + vsf_sysutil_sockaddr_set_ipv6addr(p_sockaddr, p_raw_addr); ++ vsf_sysutil_sockaddr_set_ipv6scope(p_sockaddr, if_index); + } + retval = vsf_sysutil_bind(listen_sock, p_sockaddr); + vsf_sysutil_free(p_sockaddr); +diff -Naurp vsftpd.orig/sysutil.c vsftpd/sysutil.c +--- vsftpd.orig/sysutil.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/sysutil.c 2009-10-17 17:10:02.000000000 +0200 +@@ -2039,6 +2039,19 @@ vsf_sysutil_sockaddr_set_ipv6addr(struct + } + } + ++int ++vsf_sysutil_sockaddr_get_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr) ++{ ++ return p_sockptr->u.u_sockaddr_in6.sin6_scope_id; ++} ++ ++void ++vsf_sysutil_sockaddr_set_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr, ++ const int scope_id) ++{ ++ p_sockptr->u.u_sockaddr_in6.sin6_scope_id = scope_id; ++} ++ + const void* + vsf_sysutil_sockaddr_ipv6_v4(const struct vsf_sysutil_sockaddr* p_addr) + { +diff -Naurp vsftpd.orig/sysutil.h vsftpd/sysutil.h +--- vsftpd.orig/sysutil.h 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/sysutil.h 2009-10-17 17:10:02.000000000 +0200 +@@ -228,6 +228,9 @@ void vsf_sysutil_sockaddr_set_ipv4addr(s + const unsigned char* p_raw); + void vsf_sysutil_sockaddr_set_ipv6addr(struct vsf_sysutil_sockaddr* p_sockptr, + const unsigned char* p_raw); ++void vsf_sysutil_sockaddr_set_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr, ++ const int scope_id); ++int vsf_sysutil_sockaddr_get_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr); + void vsf_sysutil_sockaddr_set_any(struct vsf_sysutil_sockaddr* p_sockaddr); + unsigned short vsf_sysutil_sockaddr_get_port( + const struct vsf_sysutil_sockaddr* p_sockptr); diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/05-whitespaces.patch b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/05-whitespaces.patch new file mode 100644 index 0000000..569ce38 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/05-whitespaces.patch @@ -0,0 +1,81 @@ +Author: Jiri Skala +Description: trim white spaces from option values (Closes: #419857, #536803). + +diff -Naurp vsftpd.orig/parseconf.c vsftpd/parseconf.c +--- vsftpd.orig/parseconf.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/parseconf.c 2009-10-18 11:28:31.000000000 +0200 +@@ -275,7 +275,7 @@ vsf_parseconf_load_setting(const char* p + } + else + { +- *p_curr_setting = str_strdup(&s_value_str); ++ *p_curr_setting = str_strdup_trimmed(&s_value_str); + } + return; + } +diff -Naurp vsftpd.orig/str.c vsftpd/str.c +--- vsftpd.orig/str.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/str.c 2009-10-18 11:28:31.000000000 +0200 +@@ -89,6 +89,18 @@ str_strdup(const struct mystr* p_str) + return vsf_sysutil_strdup(str_getbuf(p_str)); + } + ++const char* ++str_strdup_trimmed(const struct mystr* p_str) ++{ ++ const char* p_trimmed = str_getbuf(p_str); ++ int h, t, newlen; ++ ++ for (h = 0; h < (int)str_getlen(p_str) && vsf_sysutil_isspace(p_trimmed[h]); h++) ; ++ for (t = str_getlen(p_str) - 1; t >= 0 && vsf_sysutil_isspace(p_trimmed[t]); t--) ; ++ newlen = t - h + 1; ++ return newlen ? vsf_sysutil_strndup(p_trimmed+h, (unsigned int)newlen) : 0L; ++} ++ + void + str_alloc_alt_term(struct mystr* p_str, const char* p_src, char term) + { +diff -Naurp vsftpd.orig/str.h vsftpd/str.h +--- vsftpd.orig/str.h 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/str.h 2009-10-18 11:28:31.000000000 +0200 +@@ -31,6 +31,7 @@ void str_alloc_ulong(struct mystr* p_str + void str_alloc_filesize_t(struct mystr* p_str, filesize_t the_filesize); + void str_copy(struct mystr* p_dest, const struct mystr* p_src); + const char* str_strdup(const struct mystr* p_str); ++const char* str_strdup_trimmed(const struct mystr* p_str); + void str_empty(struct mystr* p_str); + void str_free(struct mystr* p_str); + void str_trunc(struct mystr* p_str, unsigned int trunc_len); +diff -Naurp vsftpd.orig/sysutil.c vsftpd/sysutil.c +--- vsftpd.orig/sysutil.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/sysutil.c 2009-10-18 11:28:31.000000000 +0200 +@@ -1033,6 +1033,18 @@ vsf_sysutil_strdup(const char* p_str) + return strdup(p_str); + } + ++char* ++vsf_sysutil_strndup(const char* p_str, unsigned int p_len) ++{ ++ char *new = (char *)malloc(p_len+1); ++ ++ if (new == NULL) ++ return NULL; ++ ++ new[p_len]='\0'; ++ return (char *)memcpy(new, p_str, p_len); ++} ++ + void + vsf_sysutil_memclr(void* p_dest, unsigned int size) + { +diff -Naurp vsftpd.orig/sysutil.h vsftpd/sysutil.h +--- vsftpd.orig/sysutil.h 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/sysutil.h 2009-10-18 11:28:31.000000000 +0200 +@@ -186,6 +186,7 @@ int vsf_sysutil_wait_get_exitcode( + /* Various string functions */ + unsigned int vsf_sysutil_strlen(const char* p_text); + char* vsf_sysutil_strdup(const char* p_str); ++char* vsf_sysutil_strndup(const char* p_str, unsigned int p_len); + void vsf_sysutil_memclr(void* p_dest, unsigned int size); + void vsf_sysutil_memcpy(void* p_dest, const void* p_src, + const unsigned int size); diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/06-greedy.patch b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/06-greedy.patch new file mode 100644 index 0000000..ff73c9c --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/06-greedy.patch @@ -0,0 +1,32 @@ +Author: Martin Nagy +Description: Fix file listing issue with wildcard (Bugzilla: #392181). + +diff -Naurp vsftpd.orig/ls.c vsftpd/ls.c +--- vsftpd.orig/ls.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/ls.c 2009-10-18 11:48:29.000000000 +0200 +@@ -281,6 +281,25 @@ vsf_filename_passes_filter(const struct + { + goto out; + } ++ if (!must_match_at_current_pos) ++ { ++ struct mystr scan_fwd = INIT_MYSTR; ++ ++ str_mid_to_end(&name_remain_str, &scan_fwd, ++ indexx + str_getlen(&s_match_needed_str)); ++ /* We're allowed to be greedy, test if it match further along ++ * keep advancing indexx while we can still match. ++ */ ++ while( (locate_result = str_locate_str(&scan_fwd, &s_match_needed_str)), ++ locate_result.found ) ++ { ++ indexx += locate_result.index + str_getlen(&s_match_needed_str); ++ str_mid_to_end(&scan_fwd, &temp_str, ++ locate_result.index + str_getlen(&s_match_needed_str)); ++ str_copy(&scan_fwd, &temp_str); ++ } ++ str_free(&scan_fwd); ++ } + /* Chop matched string out of remainder */ + str_mid_to_end(&name_remain_str, &temp_str, + indexx + str_getlen(&s_match_needed_str)); diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/07-utf8.patch b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/07-utf8.patch new file mode 100644 index 0000000..cf03e08 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/07-utf8.patch @@ -0,0 +1,58 @@ +Author: Chuck Short +Description: Adding support for UTF8. + +diff -Naurp vsftpd.orig/features.c vsftpd/features.c +--- vsftpd.orig/features.c 2008-12-04 06:00:47.000000000 +0000 ++++ vsftpd/features.c 2010-02-25 13:28:06.000000000 +0000 +@@ -21,6 +21,10 @@ handle_feat(struct vsf_session* p_sess) + vsf_cmdio_write_raw(p_sess, " AUTH SSL\r\n"); + vsf_cmdio_write_raw(p_sess, " AUTH TLS\r\n"); + } ++ if (tunable_utf8_filesystem) ++ { ++ vsf_cmdio_write_raw(p_sess, " UTF8\r\n"); ++ } + if (tunable_port_enable) + { + vsf_cmdio_write_raw(p_sess, " EPRT\r\n"); +diff -Naurp vsftpd.orig/parseconf.c vsftpd/parseconf.c +--- vsftpd.orig/parseconf.c 2009-08-07 18:46:40.000000000 +0000 ++++ vsftpd/parseconf.c 2010-02-25 13:28:06.000000000 +0000 +@@ -28,6 +28,7 @@ static struct parseconf_bool_setting + parseconf_bool_array[] = + { + { "anonymous_enable", &tunable_anonymous_enable }, ++ { "utf8_filesystem", &tunable_utf8_filesystem }, + { "local_enable", &tunable_local_enable }, + { "pasv_enable", &tunable_pasv_enable }, + { "port_enable", &tunable_port_enable }, +diff -Naurp vsftpd.orig/tunables.c vsftpd/tunables.c +--- vsftpd.orig/tunables.c 2009-07-15 20:08:27.000000000 +0000 ++++ vsftpd/tunables.c 2010-02-25 13:28:06.000000000 +0000 +@@ -10,6 +10,7 @@ + + int tunable_anonymous_enable; + int tunable_local_enable; ++int tunable_utf8_filesystem; + int tunable_pasv_enable; + int tunable_port_enable; + int tunable_chroot_local_user; +@@ -146,6 +147,7 @@ tunables_load_defaults() + { + tunable_anonymous_enable = 1; + tunable_local_enable = 0; ++ tunable_utf8_filesystem = 0; + tunable_pasv_enable = 1; + tunable_port_enable = 1; + tunable_chroot_local_user = 0; +diff -Naurp vsftpd.orig/tunables.h vsftpd/tunables.h +--- vsftpd.orig/tunables.h 2009-07-07 01:37:28.000000000 +0000 ++++ vsftpd/tunables.h 2010-02-25 13:28:06.000000000 +0000 +@@ -11,6 +11,7 @@ void tunables_load_defaults(); + /* Booleans */ + extern int tunable_anonymous_enable; /* Allow anon logins */ + extern int tunable_local_enable; /* Allow local logins */ ++extern int tunable_utf8_filesystem; /* Server uses UTF8 Filesystem */ + extern int tunable_pasv_enable; /* Allow PASV */ + extern int tunable_port_enable; /* Allow PORT */ + extern int tunable_chroot_local_user; /* Restrict local to home dir */ diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/08-manpage.patch b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/08-manpage.patch new file mode 100644 index 0000000..3a4f962 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/08-manpage.patch @@ -0,0 +1,23 @@ +Author: Daniel Baumann +Description: Fixing manpage formating. + +diff -Naurp vsftpd.orig/vsftpd.8 vsftpd/vsftpd.8 +--- vsftpd.orig/vsftpd.8 2009-07-17 20:56:23.000000000 +0000 ++++ vsftpd/vsftpd.8 2010-04-08 05:18:00.000000000 +0000 +@@ -57,4 +57,3 @@ setting and any identical setting that w + .Pa /etc/vsftpd.conf + .Sh SEE ALSO + .Xr vsftpd.conf 5 +-.end +diff -Naurp vsftpd.orig/vsftpd.conf.5 vsftpd/vsftpd.conf.5 +--- vsftpd.orig/vsftpd.conf.5 2009-10-19 02:46:30.000000000 +0000 ++++ vsftpd/vsftpd.conf.5 2010-04-08 05:18:08.000000000 +0000 +@@ -404,7 +404,7 @@ reuse (which proves that they know the s + channel). Although this is a secure default, it may break many FTP clients, + so you may want to disable it. For a discussion of the consequences, see + http://scarybeastsecurity.blogspot.com/2009/02/vsftpd-210-released.html +-(Added in v2.1.0). ++ (Added in v2.1.0). + + Default: YES + .TP diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/09-s390.patch b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/09-s390.patch new file mode 100644 index 0000000..4711f9b --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/09-s390.patch @@ -0,0 +1,15 @@ +Author: Philipp Kern +Description: Fix vsftpd on s390 (Closes: #602726). + +diff -Naurp vsftpd.orig/sysdeputil.c vsftpd/sysdeputil.c +--- vsftpd.orig/sysdeputil.c 2011-09-05 16:03:18.728857644 +0200 ++++ vsftpd/sysdeputil.c 2011-09-05 16:05:12.909423834 +0200 +@@ -64,7 +64,7 @@ + #include + + /* BEGIN config */ +-#if defined(__linux__) ++#if defined(__linux__) && !defined(__s390__) + #include + #include + #define VSF_SYSDEP_HAVE_LINUX_CLONE diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/10-remote-dos.patch b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/10-remote-dos.patch new file mode 100644 index 0000000..fee3ebe --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/10-remote-dos.patch @@ -0,0 +1,69 @@ +Author: Ben Hutchings +Description: Remote DoS on Linux 2.6.32 (Closes: #629373). + +diff -Naurp vsftpd.orig/sysdeputil.c vsftpd/sysdeputil.c +--- vsftpd.orig/sysdeputil.c 2010-03-26 04:25:33.000000000 +0100 ++++ vsftpd/sysdeputil.c 2011-09-05 15:16:05.347070790 +0200 +@@ -25,6 +25,11 @@ + #define _LARGEFILE64_SOURCE 1 + #endif + ++#ifdef __linux__ ++ #include ++ #include ++#endif ++ + /* For INT_MAX */ + #include + +@@ -1259,11 +1264,36 @@ vsf_set_term_if_parent_dies() + #endif + } + ++#ifdef VSF_SYSDEP_HAVE_LINUX_CLONE ++/* On Linux versions <2.6.35, netns cleanup may be so slow that ++ * creating a netns per connection allows a remote denial-of-service. ++ * We therefore do not use CLONE_NEWNET on these versions. ++ */ ++static int ++vsf_sysutil_netns_cleanup_is_fast(void) ++{ ++#ifdef __linux__ ++ struct utsname utsname; ++ int r1, r2, r3 = 0; ++ return (uname(&utsname) == 0 && ++ sscanf(utsname.release, "%d.%d.%d", &r1, &r2, &r3) >= 2 && ++ ((r1 << 16) | (r2 << 8) | r3) >= ((2 << 16) | (6 << 8) | 35)); ++#else ++ /* Assume any other kernel that has the feature don't have this problem */ ++ return 1; ++#endif ++} ++#endif ++ + int + vsf_sysutil_fork_isolate_all_failok() + { + #ifdef VSF_SYSDEP_HAVE_LINUX_CLONE +- static int cloneflags_work = 1; ++ static int cloneflags_work = -1; ++ if (cloneflags_work < 0) ++ { ++ cloneflags_work = vsf_sysutil_netns_cleanup_is_fast(); ++ } + if (cloneflags_work) + { + int ret = syscall(__NR_clone, +@@ -1309,7 +1339,11 @@ int + vsf_sysutil_fork_newnet() + { + #ifdef VSF_SYSDEP_HAVE_LINUX_CLONE +- static int cloneflags_work = 1; ++ static int cloneflags_work = -1; ++ if (cloneflags_work < 0) ++ { ++ cloneflags_work = vsf_sysutil_netns_cleanup_is_fast(); ++ } + if (cloneflags_work) + { + int ret = syscall(__NR_clone, CLONE_NEWNET | SIGCHLD, NULL); diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.conf b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.conf new file mode 100644 index 0000000..28ad4e0 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.conf @@ -0,0 +1,105 @@ +# Opendreambox /etc/vsftpd.conf +# +# Please see vsftpd.conf.5 for all compiled in defaults. +# +# READ THIS: This example file is NOT an exhaustive list of vsftpd options. +# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's +# capabilities. +# +# Allow anonymous FTP? (Beware - allowed by default if you comment this out). +anonymous_enable=NO +# +# Uncomment this to allow local users to log in. +local_enable=YES +# +# Uncomment this to enable any form of FTP write command. +write_enable=YES +# +# Default umask for local users is 077. You may wish to change this to 022, +# if your users expect that (022 is used by most other ftpd's) +#local_umask=022 +# +# Uncomment this to allow the anonymous FTP user to upload files. This only +# has an effect if the above global write enable is activated. Also, you will +# obviously need to create a directory writable by the FTP user. +#anon_upload_enable=YES +# +# Uncomment this if you want the anonymous FTP user to be able to create +# new directories. +#anon_mkdir_write_enable=YES +# +# Activate directory messages - messages given to remote users when they +# go into a certain directory. +dirmessage_enable=YES +# +# Activate logging of uploads/downloads. +#xferlog_enable=YES +# +# Make sure PORT transfer connections originate from port 20 (ftp-data). +connect_from_port_20=YES +# +# If you want, you can arrange for uploaded anonymous files to be owned by +# a different user. Note! Using "root" for uploaded files is not +# recommended! +#chown_uploads=YES +#chown_username=whoever +# +# You may override where the log file goes if you like. The default is shown +# below. +#xferlog_file=/var/log/vsftpd.log +# +# If you want, you can have your log file in standard ftpd xferlog format +#xferlog_std_format=YES +# +# You may change the default value for timing out an idle session. +#idle_session_timeout=600 +# +# You may change the default value for timing out a data connection. +#data_connection_timeout=120 +# +# It is recommended that you define on your system a unique user which the +# ftp server can use as a totally isolated and unprivileged user. +#nopriv_user=ftpsecure +# +# Enable this and the server will recognise asynchronous ABOR requests. Not +# recommended for security (the code is non-trivial). Not enabling it, +# however, may confuse older FTP clients. +async_abor_enable=YES +# +# By default the server will pretend to allow ASCII mode but in fact ignore +# the request. Turn on the below options to have the server actually do ASCII +# mangling on files when in ASCII mode. +# Beware that turning on ascii_download_enable enables malicious remote parties +# to consume your I/O resources, by issuing the command "SIZE /big/file" in +# ASCII mode. +# These ASCII options are split into upload and download because you may wish +# to enable ASCII uploads (to prevent uploaded scripts etc. from breaking), +# without the DoS risk of SIZE and ASCII downloads. ASCII mangling should be +# on the client anyway.. +#ascii_upload_enable=YES +#ascii_download_enable=YES +# +# You may fully customise the login banner string: +ftpd_banner=Welcome to the OpenDreambox FTP service. +# +# You may specify a file of disallowed anonymous e-mail addresses. Apparently +# useful for combatting certain DoS attacks. +#deny_email_enable=YES +# (default follows) +#banned_email_file=/etc/vsftpd.banned_emails +# +# You may specify an explicit list of local users to chroot() to their home +# directory. If chroot_local_user is YES, then this list becomes a list of +# users to NOT chroot(). +#chroot_list_enable=YES +# (default follows) +#chroot_list_file=/etc/vsftpd.chroot_list +# +# You may activate the "-R" option to the builtin ls. This is disabled by +# default to avoid remote users being able to cause excessive I/O on large +# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume +# the presence of the "-R" option, so there is a strong case for enabling it. +ls_recurse_enable=YES +# +secure_chroot_dir=/dev/shm +local_root=/ diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.socket b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.socket new file mode 100644 index 0000000..4505235 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.socket @@ -0,0 +1,8 @@ +[Unit] + +[Socket] +ListenStream=21 +Accept=yes + +[Install] +WantedBy=sockets.target diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.xinetd.in b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.xinetd.in new file mode 100644 index 0000000..000f62a --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd.xinetd.in @@ -0,0 +1,7 @@ +service ftp +{ + socket_type = stream + user = root + server = @SBINDIR@/vsftpd + wait = no +} diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd@.service b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd@.service new file mode 100644 index 0000000..68e89d1 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd/vsftpd@.service @@ -0,0 +1,5 @@ +[Unit] + +[Service] +ExecStart=-/usr/sbin/vsftpd +StandardInput=socket diff --git a/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd_2.3.5.bb b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd_2.3.5.bb new file mode 100644 index 0000000..5125843 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/vsftpd/vsftpd_2.3.5.bb @@ -0,0 +1,100 @@ +SUMMARY = "lightweight, efficient FTP server written for security" +HOMEPAGE = "https://security.appspot.com/vsftpd.html" +SECTION = "console/network" +LICENSE = "GPL-2.0-with-OpenSSL-exception" +LIC_FILES_CHKSUM = "file://COPYING;md5=a6067ad950b28336613aed9dd47b1271" +DEPENDS = "libcap openssl" +DEPENDS += "${@base_contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}" +PR = "r3" + +SRC_URI = " \ + https://security.appspot.com/downloads/${BP}.tar.gz \ + file://vsftpd@.service \ + file://vsftpd.socket \ + file://vsftpd.xinetd.in \ + file://01-builddefs.patch \ + file://02-config.patch \ + file://03-db-doc.patch \ + file://04-link-local.patch \ + file://05-whitespaces.patch \ + file://06-greedy.patch \ + file://07-utf8.patch \ + file://08-manpage.patch \ + file://09-s390.patch \ + file://10-remote-dos.patch \ +" +SRC_URI[md5sum] = "01398a5bef8e85b6cf2c213a4b011eca" +SRC_URI[sha256sum] = "d87ee2987df8f03e1dbe294905f7907b2798deb89c67ca965f6e2f60879e54f1" + +S = "${WORKDIR}/${BP}" + +inherit systemd useradd xinetd + +CFLAGS = "${TARGET_CFLAGS}" +CFLAGS += "-DVSF_BUILD_SSL=1" +CFLAGS += "${@base_contains('DISTRO_FEATURES', 'pam', '-DVSF_BUILD_PAM=1', '', d)}" + +LIBS = "-lcap -lcrypt -lssl -lcrypto" +LIBS += "${@base_contains('DISTRO_FEATURES', 'pam', '-lpam', '', d)}" + +LINK = "${TARGET_LDFLAGS}" + +SECURE_CHROOT_DIR = "${datadir}/${BPN}/chroot" +RSA_CERT_FILE = "${sysconfdir}/ssl/private/${BPN}.pem" + +do_configure() { + rm -f builddefs.h + touch builddefs.h + set_default() { + NAME=$1 + VALUE=$2 + sed -e "s,^#\?${NAME}=.*,${NAME}=${VALUE}," -i vsftpd.conf + } + set_default listen NO + set_default listen_ipv6 NO + set_default anonymous_enable NO + set_default local_enable YES + set_default write_enable YES + set_default anon_upload_enable NO + set_default anon_mkdir_write_enable NO + set_default dirmessage_enable NO + set_default use_localtime YES + set_default xferlog_enable NO + set_default connect_from_port_20 YES + set_default chown_uploads NO + set_default nopriv_user vsftpd + set_default async_abor_enable YES + set_default ascii_upload_enable NO + set_default ascii_download_enable NO + set_default ftpd_banner "Welcome to the ${DISTRO_NAME} FTP service!" + set_default chroot_local_user NO + set_default chroot_list_enable NO + set_default ls_recurse_enable YES + set_default secure_chroot_dir "${SECURE_CHROOT_DIR}" + set_default rsa_cert_file "${RSA_CERT_FILE}" +} +do_compile() { + oe_runmake 'CFLAGS=${CFLAGS}' 'LIBS=${LIBS}' 'LINK=${LINK}' +} +do_install() { + install -d ${D}${sysconfdir} + install -m 644 vsftpd.conf ${D}${sysconfdir} + install -d ${D}${sbindir} + install -m 755 vsftpd ${D}${sbindir}/vsftpd + install -d ${D}${mandir}/man8 + install -m 644 vsftpd.8 ${D}${mandir}/man8/vsftpd.8 + install -d ${D}${mandir}/man5 + install -m 644 vsftpd.conf.5 ${D}${mandir}/man5/vsftpd.conf.5 + install -d ${D}${SECURE_CHROOT_DIR} + install -d ${D}${systemd_unitdir}/system + ln -sf /dev/null ${D}${systemd_unitdir}/system/vsftpd.service +} + +SYSTEMD_PACKAGES = "${PN}-systemd" +SYSTEMD_SERVICE_${PN}-systemd = "vsftpd.socket" + +USERADD_PACKAGES = "${PN}" +USERADD_PARAM_${PN} = "--home-dir ${SECURE_CHROOT_DIR} --no-create-home --system --shell /bin/false --user-group vsftpd" + +XINETD_PACKAGES = "${PN}-xinetd" +XINETD_SERVICE_${PN}-xinetd = "vsftpd" diff --git a/meta-openvuplus/recipes-connectivity/wlan-rt73/files/changeiface.patch b/meta-openvuplus/recipes-connectivity/wlan-rt73/files/changeiface.patch new file mode 100644 index 0000000..89b3cf1 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/wlan-rt73/files/changeiface.patch @@ -0,0 +1,38 @@ +--- Module/rtmp_main.c_orig 2008-05-06 07:26:44.000000000 +0200 ++++ Module/rtmp_main.c 2008-08-12 09:19:55.000000000 +0200 +@@ -987,7 +987,7 @@ + + for (i = 0; i < 8; i++) + { +- sprintf(slot_name, "rausb%d", i); ++ sprintf(slot_name, "wlan%d", i); + + read_lock_bh(&dev_base_lock); // avoid multiple init + //Benson modify --> +@@ -1010,7 +1010,7 @@ + return NULL; + } + +- sprintf(pAd->net_dev->name, "rausb%d", i); ++ sprintf(pAd->net_dev->name, "wlan%d", i); + DBGPRINT(RT_DEBUG_ERROR, "usb device name %s\n",pAd->net_dev->name); + + /* get Max Packet Size from usb_dev endpoint */ +@@ -1191,7 +1191,7 @@ + + for (i = 0; i < 8; i++) + { +- sprintf(slot_name, "rausb%d", i); ++ sprintf(slot_name, "wlan%d", i); + + #if 1 + //--> Benson add 20080505, for Linux_kernel > 2,6,24 +@@ -1231,7 +1231,7 @@ + return res; + } + +- sprintf(pAd->net_dev->name, "rausb%d", i); ++ sprintf(pAd->net_dev->name, "wlan%d", i); + DBGPRINT(RT_DEBUG_ERROR, "usb device name %s\n", pAd->net_dev->name); + + diff --git a/meta-openvuplus/recipes-connectivity/wlan-rt73/files/make.patch b/meta-openvuplus/recipes-connectivity/wlan-rt73/files/make.patch new file mode 100644 index 0000000..b49d513 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/wlan-rt73/files/make.patch @@ -0,0 +1,20 @@ +--- Module/Makefile 2008-05-06 07:58:14.000000000 +0200 ++++ Module/Makefile 2008-08-04 15:08:58.000000000 +0200 +@@ -14,6 +14,8 @@ + #Support Block Net-If during TxSw queue full. + HAS_BLOCK_NET_IF=y + ++VERSION := $(shell uname -r) ++MODPATH := /lib/modules/$(VERSION) + + WFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs + +@@ -35,7 +37,7 @@ + EXTRA_CFLAGS += $(WFLAGS) + + ifeq ($(PLATFORM),PC) +-LINUX_SRC =/lib/modules/$(shell uname -r)/build ++LINUX_SRC ?= $(MODPATH)/source + endif + ifeq ($(PLATFORM),CMPC) + LINUX_SRC = /home/fonchi/vendor/kernel-default-2.6.21/linux-2.6.21 diff --git a/meta-openvuplus/recipes-connectivity/wlan-rt73/wlan-rt73.bb b/meta-openvuplus/recipes-connectivity/wlan-rt73/wlan-rt73.bb new file mode 100644 index 0000000..5b57ac3 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/wlan-rt73/wlan-rt73.bb @@ -0,0 +1,43 @@ +SUMMARY = "Driver for Ralink rt73 USB 802.11b/g WiFi sticks" +HOMEPAGE = "http://www.ralinktech.com.tw" +SECTION = "kernel/modules" +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://rtmp_main.c;endline=25;md5=10585d272398025e832fa0793385f9a1" + +inherit module + +PR = "r6" + +SRC_URI = "http://www.ralinktech.com.tw/data/drivers/2008_0506_RT73_Linux_STA_Drv1.1.0.1.tar.bz2 \ + file://make.patch \ + file://changeiface.patch" + +SRC_URI[md5sum] = "3e08bf734b740e83391fda571c8e9ecd" +SRC_URI[sha256sum] = "932b9c127992fd7985e4054d91120164e54f7132fa457b06fdcd30307e5b70f9" + +RDEPEND = "wireless-tools" + +FILES_${PN} += " /lib/firmware/rt73.bin" + +S = "${WORKDIR}/2008_0506_RT73_Linux_STA_Drv1.1.0.1/Module/" +EXTRA_OEMAKE = "KERNDIR=${STAGING_KERNEL_DIR}" + +do_compile() { + unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS CC LD CPP + oe_runmake 'MODPATH={D}${base_libdir}/modules/${KERNEL_VERSION}/kernel/drivers/net' \ + 'KERNEL_SOURCE=${STAGING_KERNEL_DIR}' \ + 'LINUX_SRC=${STAGING_KERNEL_DIR}' \ + 'KDIR=${STAGING_KERNEL_DIR}' \ + 'KERNDIR=${STAGING_KERNEL_DIR}' \ + 'KERNEL_VERSION=${KERNEL_VERSION}' \ + 'CC=${KERNEL_CC}' \ + 'LD=${KERNEL_LD}' +} + +do_install() { + install -d ${D}${base_libdir}/modules/${KERNEL_VERSION}/kernel/drivers/net + install -m 0644 rt73${KERNEL_OBJECT_SUFFIX} ${D}${base_libdir}/modules/${KERNEL_VERSION}/kernel/drivers/net/ + install -d ${D}/lib/firmware + install -m 0644 rt73.bin ${D}/lib/firmware/ +} + diff --git a/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/action_wpa.sh b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/action_wpa.sh new file mode 100644 index 0000000..6d90fa6 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/action_wpa.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +# Action script to enable/disable wpa-roam interfaces in reaction to +# ifplugd events. +# +# Copyright: Copyright (c) 2008-2010, Kel Modderman +# License: GPL-2 +# + +PATH=/sbin:/usr/sbin:/bin:/usr/bin + +if [ ! -x /usr/sbin/wpa_action ]; then + exit 0 +fi + +# ifplugd(8) - +# +# If an ifplugd managed interface is brought up, disconnect any +# wpa-roam managed interfaces so that only one "roaming" interface +# remains active on the system. + +IFPLUGD_IFACE="${1}" + +case "${2}" in + up) + COMMAND=disconnect + ;; + down) + COMMAND=reconnect + ;; + *) + echo "$0: unknown arguments: ${@}" >&2 + exit 1 + ;; +esac + +for CTRL in /var/run/wpa_supplicant/*; do + [ -S "${CTRL}" ] || continue + + IFACE="${CTRL#/var/run/wpa_supplicant/}" + + # skip if ifplugd is managing this interface + if [ "${IFPLUGD_IFACE}" = "${IFACE}" ]; then + continue + fi + + if wpa_action "${IFACE}" check; then + wpa_cli -i "${IFACE}" "${COMMAND}" + fi +done diff --git a/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/functions.sh b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/functions.sh new file mode 100644 index 0000000..b9e0eb2 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/functions.sh @@ -0,0 +1,1015 @@ +#!/bin/sh + +##################################################################### +## Purpose +# This file contains common shell functions used by scripts of the +# wpasupplicant package to allow ifupdown to manage wpa_supplicant. +# It also contains some functions used by wpa_action(8) that allow +# ifupdown to be managed by wpa_cli(8) action events. +# +# This file is provided by the wpasupplicant package. + +##################################################################### +# Copyright (C) 2006 - 2009 Debian/Ubuntu wpasupplicant Maintainers +# +# +# 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. +# +# On Debian GNU/Linux systems, the text of the GPL license, +# version 2, can be found in /usr/share/common-licenses/GPL-2. + +##################################################################### +## global variables +# wpa_supplicant variables +WPA_SUP_BIN="/usr/sbin/wpa_supplicant" +WPA_SUP_PNAME="wpa_supplicant" +WPA_SUP_PIDFILE="/var/run/wpa_supplicant.${WPA_IFACE}.pid" + +# wpa_cli variables +WPA_CLI_BIN="/usr/sbin/wpa_cli" +WPA_CLI_PNAME="wpa_cli" +WPA_CLI_PIDFILE="/var/run/wpa_action.${WPA_IFACE}.pid" +WPA_CLI_TIMESTAMP="/var/run/wpa_action.${WPA_IFACE}.timestamp" +WPA_CLI_IFUPDOWN="/var/run/wpa_action.${WPA_IFACE}.ifupdown" + +# sendsigs omission interface, present in initscripts (>= 2.86.ds1-48) +if [ -d /lib/init/rw/sendsigs.omit.d/ ]; then + # Debian + WPA_SUP_OMIT_PIDFILE="/lib/init/rw/sendsigs.omit.d/wpasupplicant.wpa_supplicant.${WPA_IFACE}.pid" +elif [ -d /var/run/sendsigs.omit.d/ ]; then + # Ubuntu, see https://launchpad.net/bugs/181541 for status + WPA_SUP_OMIT_PIDFILE="/var/run/sendsigs.omit.d/wpasupplicant.wpa_supplicant.${WPA_IFACE}.pid" +else + WPA_SUP_OMIT_PIDFILE= +fi + +# default ctrl_interface socket directory +if [ -z "$WPA_CTRL_DIR" ]; then + WPA_CTRL_DIR="/var/run/wpa_supplicant" +fi + +# verbosity variables +if [ -n "$IF_WPA_VERBOSITY" ] || [ "$VERBOSITY" = "1" ]; then + TO_NULL="/dev/stdout" + DAEMON_VERBOSITY="--verbose" +else + TO_NULL="/dev/null" + DAEMON_VERBOSITY="--quiet" +fi + +##################################################################### +## wpa_cli wrapper +# Path to common ctrl_interface socket and iface supplied. +# NB: WPA_CTRL_DIR cannot be used for interactive commands, it is +# set only in the environment that wpa_cli provides when processing +# action events. +# +wpa_cli () { + "$WPA_CLI_BIN" -p "$WPA_CTRL_DIR" -i "$WPA_IFACE" "$@" + + return "$?" +} + +##################################################################### +## verbose and stderr message wrapper +# Ensures a standard and easily identifiable message is printed by +# scripts using this function library. +# +# log Log a message to syslog when called non-interactively +# by wpa_action +# +# verbose To stdout when IF_WPA_VERBOSITY or VERBOSITY is true +# +# action Same as verbose but without newline +# Useful for allowing wpa_cli commands to echo result +# value of 'OK' or 'FAILED' +# +# stderr Echo warning or error messages to stderr +# +# NB: when called by wpa_action, there is no redirection (verbose) +# +wpa_msg () { + if [ "$1" = "log" ]; then + shift + case "$WPA_ACTION" in + "CONNECTED"|"DISCONNECTED") + [ -x /usr/bin/logger ] || return + if [ "$#" -gt 0 ]; then + logger -t "wpa_action" "$@" + else + logger -t "wpa_action" + fi + ;; + *) + [ "$#" -gt 0 ] && echo "wpa_action: $@" + ;; + esac + return + fi + + case "$1" in + "verbose") + shift + echo "$WPA_SUP_PNAME: $@" >$TO_NULL + ;; + "action") + shift + echo -n "$WPA_SUP_PNAME: $@ -- " >$TO_NULL + ;; + "stderr") + shift + echo "$WPA_SUP_PNAME: $@" >/dev/stderr + ;; + *) + ;; + esac +} + +##################################################################### +## validate daemon pid files +# Test daemon process ID files via start-stop-daemon with a signal 0 +# given the exec binary and pidfile location. +# +# $1 daemon +# $2 pidfile +# +# Returns true when pidfile exists, the process ID exists _and_ was +# created by the exec binary. +# +# If the test fails, but the pidfile exists, it is stale +# +test_daemon_pidfile () { + local DAEMON + local PIDFILE + + if [ -n "$1" ]; then + DAEMON="$1" + fi + + if [ -f "$2" ]; then + PIDFILE="$2" + fi + + if [ -n "$DAEMON" ] && [ -f "$PIDFILE" ]; then + if start-stop-daemon --stop --quiet --signal 0 \ + --exec "$DAEMON" --pidfile "$PIDFILE"; then + return 0 + else + rm -f "$PIDFILE" + return 1 + fi + else + return 1 + fi +} + +# validate wpa_supplicant pidfile +test_wpa_supplicant () { + test_daemon_pidfile "$WPA_SUP_BIN" "$WPA_SUP_PIDFILE" +} + +# validate wpa_cli pidfile +test_wpa_cli () { + test_daemon_pidfile "$WPA_CLI_BIN" "$WPA_CLI_PIDFILE" +} + +##################################################################### +## daemonize wpa_supplicant +# Start wpa_supplicant via start-stop-dameon with all required +# options. Will start if environment variable WPA_SUP_CONF is present +# +# Default options: +# -B dameonize/background process +# -D driver backend ('wext' if none given) +# -P process ID file +# -C path to ctrl_interface socket directory +# -s log to syslog +# +# Conditional options: +# -c configuration file +# -W wait for wpa_cli to attach to ctrl_interface socket +# -b bridge interface name +# -f path to log file +# +init_wpa_supplicant () { + [ -n "$WPA_SUP_CONF" ] || return 0 + + local WPA_SUP_OPTIONS + WPA_SUP_OPTIONS="-s -B -P $WPA_SUP_PIDFILE -i $WPA_IFACE" + + if [ -n "$WPA_ACTION_SCRIPT" ]; then + if [ -x "$WPA_ACTION_SCRIPT" ]; then + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -W" + wpa_msg verbose "wait for wpa_cli to attach" + else + wpa_msg stderr "action script \"$WPA_ACTION_SCRIPT\" not executable" + return 1 + fi + fi + + if [ -n "$IF_WPA_BRIDGE" ]; then + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -b $IF_WPA_BRIDGE" + wpa_msg verbose "wpa-bridge $IF_WPA_BRIDGE" + fi + + if [ -n "$IF_WPA_DRIVER" ]; then + wpa_msg verbose "wpa-driver $IF_WPA_DRIVER" + case "$IF_WPA_DRIVER" in + hostap|ipw|madwifi|ndiswrapper) + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -D nl80211,wext" + wpa_msg stderr "\"$IF_WPA_DRIVER\" wpa-driver is unsupported" + wpa_msg stderr "using \"nl80211,wext\" wpa-driver instead ..." + ;; + *) + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -D $IF_WPA_DRIVER" + ;; + esac + else + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -D nl80211,wext" + wpa_msg verbose "wpa-driver nl80211,wext (default)" + fi + + if [ -n "$IF_WPA_DEBUG_LEVEL" ]; then + case "$IF_WPA_DEBUG_LEVEL" in + 3) + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -t -ddd" + ;; + 2) + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -t -dd" + ;; + 1) + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -t -d" + ;; + 0) + # wpa_supplicant default verbosity + ;; + -1) + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -q" + ;; + -2) + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -qq" + ;; + esac + wpa_msg verbose "using debug level: $IF_WPA_DEBUG_LEVEL" + fi + + if [ -n "$IF_WPA_LOGFILE" ]; then + # custom log file + WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -f $IF_WPA_LOGFILE" + WPA_SUP_LOGFILE="$IF_WPA_LOGFILE" + wpa_msg verbose "logging to $IF_WPA_LOGFILE" + fi + + wpa_msg verbose "$WPA_SUP_BIN $WPA_SUP_OPTIONS $WPA_SUP_CONF" + + start-stop-daemon --start --oknodo $DAEMON_VERBOSITY \ + --name $WPA_SUP_PNAME --startas $WPA_SUP_BIN --pidfile $WPA_SUP_PIDFILE \ + -- $WPA_SUP_OPTIONS $WPA_SUP_CONF + + if [ "$?" -ne 0 ]; then + wpa_msg stderr "$WPA_SUP_BIN daemon failed to start" + return 1 + fi + + if [ -n "$WPA_SUP_OMIT_PIDFILE" ]; then + local WPA_PIDFILE_WAIT + local MAX_WPA_PIDFILE_WAIT + WPA_PIDFILE_WAIT="0" + MAX_WPA_PIDFILE_WAIT="5" + until [ -s "$WPA_SUP_PIDFILE" ]; do + if [ "$WPA_PIDFILE_WAIT" -ge "$MAX_WPA_PIDFILE_WAIT" ]; then + wpa_msg stderr "timed out waiting for creation of $WPA_SUP_PIDFILE" + return 1 + else + wpa_msg verbose "waiting for \"$WPA_SUP_PIDFILE\": " \ + "$WPA_PIDFILE_WAIT (max. $MAX_WPA_PIDFILE_WAIT)" + fi + + WPA_PIDFILE_WAIT=$(($WPA_PIDFILE_WAIT + 1)) + sleep 1 + done + wpa_msg verbose "creating sendsigs omission pidfile: $WPA_SUP_OMIT_PIDFILE" + cat "$WPA_SUP_PIDFILE" > "$WPA_SUP_OMIT_PIDFILE" + else + wpa_msg verbose "sendsigs omission pidfile not created" + fi + + local WPA_SOCKET_WAIT + local MAX_WPA_SOCKET_WAIT + WPA_SOCKET_WAIT="0" + MAX_WPA_SOCKET_WAIT="5" + until [ -S "$WPA_CTRL_DIR/$WPA_IFACE" ]; do + if [ "$WPA_SOCKET_WAIT" -ge "$MAX_WPA_SOCKET_WAIT" ]; then + wpa_msg stderr "ctrl_interface socket not found at $WPA_CTRL_DIR/$WPA_IFACE" + return 1 + else + wpa_msg verbose "waiting for \"$WPA_CTRL_DIR/$WPA_IFACE\": " \ + "$WPA_SOCKET_WAIT (max. $MAX_WPA_SOCKET_WAIT)" + fi + + WPA_SOCKET_WAIT=$(($WPA_SOCKET_WAIT + 1)) + sleep 1 + done + + wpa_msg verbose "ctrl_interface socket located at $WPA_CTRL_DIR/$WPA_IFACE" +} + +##################################################################### +## stop wpa_supplicant process +# Kill wpa_supplicant via start-stop-daemon, given the location of +# the pidfile or ctrl_interface socket path and interface name +# +kill_wpa_supplicant () { + test_wpa_supplicant || return 0 + + wpa_msg verbose "terminating $WPA_SUP_PNAME daemon via pidfile $WPA_SUP_PIDFILE" + + start-stop-daemon --stop --oknodo $DAEMON_VERBOSITY \ + --exec $WPA_SUP_BIN --pidfile $WPA_SUP_PIDFILE + + if [ -f "$WPA_SUP_PIDFILE" ]; then + rm -f "$WPA_SUP_PIDFILE" + fi + + if [ -f "$WPA_SUP_OMIT_PIDFILE" ]; then + wpa_msg verbose "removing $WPA_SUP_OMIT_PIDFILE" + rm -f "$WPA_SUP_OMIT_PIDFILE" + fi +} + +##################################################################### +## reload wpa_supplicant process +# Sending a HUP signal causes wpa_supplicant to reparse its +# configuration file +# +reload_wpa_supplicant () { + if test_wpa_supplicant; then + wpa_msg verbose "reloading wpa_supplicant configuration file via HUP signal" + start-stop-daemon --stop --signal HUP \ + --name "$WPA_SUP_PNAME" --pidfile "$WPA_SUP_PIDFILE" + else + wpa_msg verbose "cannot $WPA_ACTION, $WPA_SUP_PIDFILE does not exist" + fi +} + +##################################################################### +## daemonize wpa_cli and action script +# If environment variable WPA_ACTION_SCRIPT is present, wpa_cli will +# be spawned via start-stop-daemon +# +# Required options: +# -a action script => wpa_action +# -P process ID file +# -B background process +# +init_wpa_cli () { + [ -n "$WPA_ACTION_SCRIPT" ] || return 0 + + local WPA_CLI_OPTIONS + WPA_CLI_OPTIONS="-B -P $WPA_CLI_PIDFILE -i $WPA_IFACE" + + wpa_msg verbose "$WPA_CLI_BIN $WPA_CLI_OPTIONS -p $WPA_CTRL_DIR -a $WPA_ACTION_SCRIPT" + + start-stop-daemon --start --oknodo $DAEMON_VERBOSITY \ + --name $WPA_CLI_PNAME --startas $WPA_CLI_BIN --pidfile $WPA_CLI_PIDFILE \ + -- $WPA_CLI_OPTIONS -p $WPA_CTRL_DIR -a $WPA_ACTION_SCRIPT + + if [ "$?" -ne 0 ]; then + wpa_msg stderr "$WPA_CLI_BIN daemon failed to start" + return 1 + fi +} + +##################################################################### +## stop wpa_cli process +# Kill wpa_cli via start-stop-daemon, given the location of the +# pidfile +# +kill_wpa_cli () { + test_wpa_cli || return 0 + + wpa_msg verbose "terminating $WPA_CLI_PNAME daemon via pidfile $WPA_CLI_PIDFILE" + + start-stop-daemon --stop --oknodo $DAEMON_VERBOSITY \ + --exec $WPA_CLI_BIN --pidfile $WPA_CLI_PIDFILE + + if [ -f "$WPA_CLI_PIDFILE" ]; then + rm -f "$WPA_CLI_PIDFILE" + fi + + if [ -f "$WPA_CLI_TIMESTAMP" ]; then + rm -f "$WPA_CLI_TIMESTAMP" + fi + + if [ -L "$WPA_CLI_IFUPDOWN" ]; then + rm -f "$WPA_CLI_IFUPDOWN" + fi +} + +##################################################################### +## higher level wpa_cli wrapper for variable and set_network commands +# wpa_cli_do [set_network variable] +# +# $1 envorinment variable +# $2 data type of variable {raw|ascii} +# $3 wpa_cli variable, if $3 is set_network, shift and take +# set_network subvariable +# $4 wpa-* string as it would appear in interfaces file, enhances +# verbose messages +# +wpa_cli_do () { + if [ -z "$1" ]; then + return 0 + fi + + local WPACLISET_VALUE + local WPACLISET_VARIABLE + local WPACLISET_DESC + + case "$2" in + ascii) + # Double quote + WPACLISET_VALUE="\"$1\"" + ;; + raw|*) + # Provide raw value + WPACLISET_VALUE="$1" + ;; + esac + + case "$3" in + set_network) + if [ -z "$WPA_ID" ]; then + return 1 + fi + shift + WPACLISET_VARIABLE="set_network $WPA_ID $3" + ;; + *) + WPACLISET_VARIABLE="$3" + ;; + esac + + case "$4" in + *-psk|*-passphrase|*-passwd*|*-wep-key*) + WPACLISET_DESC="$4 *****" + ;; + *) + WPACLISET_DESC="$4 $WPACLISET_VALUE" + ;; + esac + + wpa_msg action "$WPACLISET_DESC" + + wpa_cli $WPACLISET_VARIABLE "$WPACLISET_VALUE" >$TO_NULL + + if [ "$?" -ne 0 ]; then + wpa_msg stderr "$WPACLISET_DESC failed!" + fi +} + +##################################################################### +## check value data type in plaintext or hex +# returns 0 if input consists of hexadecimal digits only, 1 otherwise +# +ishex () { + if [ -z "$1" ]; then + return 0 + fi + + case "$1" in + *[!0-9a-fA-F]*) + # plaintext + return 1 + ;; + *) + # hexadecimal + return 0 + ;; + esac +} + +##################################################################### +## sanity check and set psk|passphrase +# Warn about strange psk|passphrase values +# +# $1 psk or passphrase value +# +# If psk is surrounded by quotes strip them. +# +# If psk contains all hexadecimal characters and string length is 64: +# is 256bit hexadecimal +# else: +# is plaintext +# +# plaintext passphrases must be 8 - 63 characters in length +# 256-bit hexadecimal key must be 64 characters in length +# +wpa_key_check_and_set () { + if [ "$#" -ne 3 ]; then + return 0 + fi + + local KEY + local KEY_LEN + local KEY_TYPE + local ENC_TYPE + + case "$1" in + '"'*'"') + # Strip surrounding quotation marks + KEY=$(echo -n "$1" | sed 's/^"//;s/"$//') + ;; + *) + KEY="$1" + ;; + esac + + KEY_LEN="${#KEY}" + + case "$2" in + wep_key*) + ENC_TYPE="WEP" + ;; + psk) + ENC_TYPE="WPA" + ;; + *) + return 0 + ;; + esac + + if [ "$ENC_TYPE" = "WEP" ]; then + if ishex "$KEY"; then + case "$KEY_LEN" in + 10|26|32|58) + # 64/128/152/256-bit WEP + KEY_TYPE="raw" + ;; + *) + KEY_TYPE="ascii" + ;; + esac + else + KEY_TYPE="ascii" + fi + + if [ "$KEY_TYPE" = "ascii" ]; then + if [ "$KEY_LEN" -lt "5" ]; then + wpa_msg stderr "WARNING: plaintext or ascii WEP key has $KEY_LEN characters," + wpa_msg stderr "it must have at least 5 to be valid." + fi + fi + elif [ "$ENC_TYPE" = "WPA" ]; then + if ishex "$KEY"; then + case "$KEY_LEN" in + 64) + # 256-bit WPA + KEY_TYPE="raw" + ;; + *) + KEY_TYPE="ascii" + ;; + esac + else + KEY_TYPE="ascii" + fi + + if [ "$KEY_TYPE" = "ascii" ]; then + if [ "$KEY_LEN" -lt "8" ] || [ "$KEY_LEN" -gt "63" ]; then + wpa_msg stderr "WARNING: plaintext or ascii WPA key has $KEY_LEN characters," + wpa_msg stderr "it must have between 8 and 63 to be valid." + wpa_msg stderr "If the WPA key is a 256-bit hexadecimal key, it must have" + wpa_msg stderr "exactly 64 characters." + fi + fi + fi + + wpa_cli_do "$KEY" "$KEY_TYPE" set_network "$2" "$3" +} + +##################################################################### +## formulate a usable configuration from interfaces(5) wpa- lines +# A series of wpa_cli commands corresponding to environment variables +# created as a result of wpa- lines in an interfaces stanza. +# +# NB: no-act when roaming daemon is used (to avoid prematurely +# attaching to ctrl_interface socket) +# +conf_wpa_supplicant () { + if [ -n "$WPA_ACTION_SCRIPT" ]; then + return 0 + fi + + if [ "$IF_WPA_DRIVER" = "wired" ]; then + IF_WPA_AP_SCAN="0" + wpa_msg verbose "forcing ap_scan=0 (required for wired IEEE8021X auth)" + fi + + if [ -n "$IF_WPA_ESSID" ]; then + # #403316, be similar to wireless tools + IF_WPA_SSID="$IF_WPA_ESSID" + fi + + wpa_cli_do "$IF_WPA_AP_SCAN" raw \ + ap_scan wpa-ap-scan + + wpa_cli_do "$IF_WPA_PREAUTHENTICATE" raw \ + preauthenticate wpa-preauthenticate + + if [ -n "$IF_WPA_SSID" ] || [ "$IF_WPA_DRIVER" = "wired" ] || \ + [ -n "$IF_WPA_KEY_MGMT" ]; then + + case "$IF_WPA_SSID" in + '"'*'"') + IF_WPA_SSID=$(echo -n "$IF_WPA_SSID" | sed 's/^"//;s/"$//') + ;; + *) + ;; + esac + + WPA_ID=$(wpa_cli add_network) + + wpa_msg verbose "configuring network block -- $WPA_ID" + + wpa_cli_do "$IF_WPA_SSID" ascii \ + set_network ssid wpa-ssid + + wpa_cli_do "$IF_WPA_PRIORITY" raw \ + set_network priority wpa-priority + + wpa_cli_do "$IF_WPA_BSSID" raw \ + set_network bssid wpa-bssid + + if [ -s "$IF_WPA_PSK_FILE" ]; then + IF_WPA_PSK=$(cat "$IF_WPA_PSK_FILE") + fi + + # remain compat with wpa-passphrase-file + if [ -s "$IF_WPA_PASSPHRASE_FILE" ]; then + IF_WPA_PSK=$(cat "$IF_WPA_PASSPHRASE_FILE") + fi + + # remain compat with wpa-passphrase + if [ -n "$IF_WPA_PASSPHRASE" ]; then + IF_WPA_PSK="$IF_WPA_PASSPHRASE" + fi + + if [ -n "$IF_WPA_PSK" ]; then + wpa_key_check_and_set "$IF_WPA_PSK" \ + psk wpa-psk + fi + + wpa_cli_do "$IF_WPA_PAIRWISE" raw \ + set_network pairwise wpa-pairwise + + wpa_cli_do "$IF_WPA_GROUP" raw \ + set_network group wpa-group + + wpa_cli_do "$IF_WPA_MODE" raw \ + set_network mode wpa-mode + + wpa_cli_do "$IF_WPA_FREQUENCY" raw \ + set_network frequency wpa-frequency + + wpa_cli_do "$IF_WPA_SCAN_FREQ" raw \ + set_network scan_freq wpa-scan-freq + + wpa_cli_do "$IF_WPA_FREQ_LIST" raw \ + set_network freq_list wpa-freq-list + + wpa_cli_do "$IF_WPA_KEY_MGMT" raw \ + set_network key_mgmt wpa-key-mgmt + + wpa_cli_do "$IF_WPA_PROTO" raw \ + set_network proto wpa-proto + + wpa_cli_do "$IF_WPA_AUTH_ALG" raw \ + set_network auth_alg wpa-auth-alg + + wpa_cli_do "$IF_WPA_SCAN_SSID" raw \ + set_network scan_ssid wpa-scan-ssid + + wpa_cli_do "$IF_WPA_IDENTITY" ascii \ + set_network identity wpa-identity + + wpa_cli_do "$IF_WPA_ANONYMOUS_IDENTITY" ascii \ + set_network anonymous_identity wpa-anonymous-identity + + wpa_cli_do "$IF_WPA_EAP" raw \ + set_network eap wpa-eap + + wpa_cli_do "$IF_WPA_EAPPSK" raw \ + set_network eappsk wpa-eappsk + + wpa_cli_do "$IF_WPA_NAI" ascii \ + set_network nai wpa-nai + + wpa_cli_do "$IF_WPA_PASSWORD" ascii \ + set_network password wpa-password + + wpa_cli_do "$IF_WPA_CA_CERT" ascii \ + set_network ca_cert wpa-ca-cert + + wpa_cli_do "$IF_WPA_CA_PATH" ascii \ + set_network ca_path wpa-ca-path + + wpa_cli_do "$IF_WPA_CLIENT_CERT" ascii \ + set_network client_cert wpa-client-cert + + wpa_cli_do "$IF_WPA_PRIVATE_KEY" ascii \ + set_network private_key wpa-private-key + + wpa_cli_do "$IF_WPA_PRIVATE_KEY_PASSWD" ascii \ + set_network private_key_passwd wpa-private-key-passwd + + wpa_cli_do "$IF_WPA_DH_FILE" ascii \ + set_network dh_file wpa-dh-file + + wpa_cli_do "$IF_WPA_SUBJECT_MATCH" ascii \ + set_network subject_match wpa-subject-match + + wpa_cli_do "$IF_WPA_ALTSUBJECT_MATCH" ascii \ + set_network altsubject_match wpa-altsubject-match + + wpa_cli_do "$IF_WPA_CA_CERT2" ascii \ + set_network ca_cert2 wpa-ca-cert2 + + wpa_cli_do "$IF_WPA_CA_PATH2" ascii \ + set_network ca_path2 wpa-ca-path2 + + wpa_cli_do "$IF_WPA_CLIENT_CERT2" ascii \ + set_network client_cert2 wpa-client-cert2 + + wpa_cli_do "$IF_WPA_PRIVATE_KEY2" ascii \ + set_network private_key2 wpa-private-key2 + + wpa_cli_do "$IF_WPA_PRIVATE_KEY_PASSWD2" ascii \ + set_network private_key_passwd2 wpa-private-key-passwd2 + + wpa_cli_do "$IF_WPA_DH_FILE2" ascii \ + set_network dh_file2 wpa-dh-file2 + + wpa_cli_do "$IF_WPA_SUBJECT_MATCH2" ascii \ + set_network subject_match2 wpa-subject-match2 + + wpa_cli_do "$IF_WPA_ALTSUBJECT_MATCH2" ascii \ + set_network altsubject_match2 wpa-altsubject-match2 + + wpa_cli_do "$IF_WPA_EAP_METHODS" raw \ + set_network eap_methods wpa-eap-methods + + wpa_cli_do "$IF_WPA_PHASE1" ascii \ + set_network phase1 wpa-phase1 + + wpa_cli_do "$IF_WPA_PHASE2" ascii \ + set_network phase2 wpa-phase2 + + wpa_cli_do "$IF_WPA_PCSC" raw \ + set_network pcsc wpa-pcsc + + wpa_cli_do "$IF_WPA_PIN" ascii \ + set_network pin wpa-pin + + wpa_cli_do "$IF_WPA_ENGINE" raw \ + set_network engine wpa-engine + + wpa_cli_do "$IF_WPA_ENGINE_ID" ascii \ + set_network engine_id wpa-engine-id + + wpa_cli_do "$IF_WPA_KEY_ID" ascii \ + set_network key_id wpa-key-id + + wpa_cli_do "$IF_WPA_EAPOL_FLAGS" raw \ + set_network eapol_flags wpa-eapol-flags + + if [ -n "$IF_WPA_WEP_KEY0" ]; then + wpa_key_check_and_set "$IF_WPA_WEP_KEY0" \ + wep_key0 wpa-wep-key0 + fi + + if [ -n "$IF_WPA_WEP_KEY1" ]; then + wpa_key_check_and_set "$IF_WPA_WEP_KEY1" \ + wep_key1 wpa-wep-key1 + fi + + if [ -n "$IF_WPA_WEP_KEY2" ]; then + wpa_key_check_and_set "$IF_WPA_WEP_KEY2" \ + wep_key2 wpa-wep-key2 + fi + + if [ -n "$IF_WPA_WEP_KEY3" ]; then + wpa_key_check_and_set "$IF_WPA_WEP_KEY3" \ + wep_key3 wpa-wep-key3 + fi + + wpa_cli_do "$IF_WPA_WEP_TX_KEYIDX" raw \ + set_network wep_tx_keyidx wpa-wep-tx-keyidx + + wpa_cli_do "$IF_WPA_PROACTIVE_KEY_CACHING" raw \ + set_network proactive_key_caching wpa-proactive-key-caching + + wpa_cli_do "$IF_WPA_PAC_FILE" ascii \ + set_network pac_file wpa-pac-file + + wpa_cli_do "$IF_WPA_PEERKEY" raw \ + set_network peerkey wpa-peerkey + + wpa_cli_do "$IF_FRAGMENT_SIZE" raw \ + set_network fragment_size wpa-fragment-size + + wpa_cli_do "$IF_WPA_ID_STR" ascii \ + set_network id_str wpa-id-str + + wpa_cli_do "$WPA_ID" raw \ + enable_network "enabling network block" + fi +} + +##################################################################### +## Log wpa_cli environment variables +wpa_log_env () { + wpa_msg log "WPA_IFACE=$WPA_IFACE WPA_ACTION=$WPA_ACTION" + wpa_msg log "WPA_ID=$WPA_ID WPA_ID_STR=$WPA_ID_STR WPA_CTRL_DIR=$WPA_CTRL_DIR" +} + +##################################################################### +## hysteresis checking +# Networking tools such as dhcp clients used with ifupdown can +# synthesize artificial ACTION events, particuarly just after a +# DISCONNECTED/CONNECTED events are experienced in quick succession. +# This can lead to infinite event loops, and in extreme cases has the +# potential to cause system instability. +# +wpa_hysteresis_event () { + echo "$(date +%s)" > "$WPA_CLI_TIMESTAMP" 2>/dev/null +} + +wpa_hysteresis_check () { + if [ -f "$WPA_CLI_TIMESTAMP" ]; then + local TIME + local TIMESTAMP + local TIMEWAIT + TIME=$(date +%s) + # current time minus 4 second event buffer + TIMEWAIT=$(($TIME-4)) + # get time of last event + TIMESTAMP=$(cat $WPA_CLI_TIMESTAMP) + # compare values, allowing new action to be processed + # only if last action was more than 4 seconds ago + if [ "$TIMEWAIT" -le "$TIMESTAMP" ]; then + wpa_msg log "$WPA_ACTION event blocked by hysteresis check" + return 1 + fi + fi + + return 0 +} + +##################################################################### +## ifupdown locking functions +# A collection of rudimentary locking functions to lock ifup/ifdown +# actions. +# + +ifupdown_lock () { + ln -s lock "$WPA_CLI_IFUPDOWN" +} + +ifupdown_locked () { + [ -L "$WPA_CLI_IFUPDOWN" ] && return 0 + + return 1 +} + +ifupdown_unlock () { + rm -f "$WPA_CLI_IFUPDOWN" +} + +##################################################################### +## apply mapping logic and ifup logical interface +# Apply mapping logic via id_str or external mapping script, check +# state of IFACE with respect to ifupdown and ifup logical interaface +# +ifup () { + local INTERFACES_FILE + local IFSTATE_FILE + local IFUP_RETVAL + local WPA_LOGICAL_IFACE + + if [ -e /etc/network/interfaces ]; then + INTERFACES_FILE="/etc/network/interfaces" + else + wpa_msg log "/etc/network/interfaces does not exist, $WPA_IFACE will not be configured" + return 1 + fi + + if [ -e /etc/network/run/ifstate ]; then + # debian's ifupdown + IFSTATE_FILE="/etc/network/run/ifstate" + elif [ -e /var/run/network/ifstate ]; then + # ubuntu's + IFSTATE_FILE="/var/run/network/ifstate" + else + unset IFSTATE_FILE + fi + + if [ -z "$IF_WPA_MAPPING_SCRIPT_PRIORITY" ] && [ -n "$WPA_ID_STR" ]; then + WPA_LOGICAL_IFACE="$WPA_ID_STR" + fi + + if [ -z "$WPA_LOGICAL_IFACE" ] && [ -n "$IF_WPA_MAPPING_SCRIPT" ]; then + local WPA_MAP_STDIN + + WPA_MAP_STDIN=$(set | sed -n 's/^\(IF_WPA_MAP[0-9]*\)=.*/echo \$\1/p') + + if [ -n "$WPA_MAP_STDIN" ]; then + WPA_LOGICAL_IFACE=$(eval "$WPA_MAP_STDIN" | "$IF_WPA_MAPPING_SCRIPT" "$WPA_IFACE") + else + WPA_LOGICAL_IFACE=$("$IF_WPA_MAPPING_SCRIPT" "$WPA_IFACE") + fi + + if [ -n "$WPA_LOGICAL_IFACE" ]; then + wpa_msg log "mapping script result: $WPA_LOGICAL_IFACE" + else + wpa_msg log "mapping script failed." + fi + fi + + if [ -z "$WPA_LOGICAL_IFACE" ]; then + if [ -n "$IF_WPA_ROAM_DEFAULT_IFACE" ]; then + WPA_LOGICAL_IFACE="$IF_WPA_ROAM_DEFAULT_IFACE" + else + WPA_LOGICAL_IFACE="default" + fi + fi + + if [ -n "$WPA_LOGICAL_IFACE" ]; then + if egrep -q "^iface[[:space:]]+${WPA_LOGICAL_IFACE}[[:space:]]+inet" "$INTERFACES_FILE"; then + : # logical network is defined + else + wpa_msg log "network settings not defined for $WPA_LOGICAL_IFACE in $INTERFACES_FILE" + WPA_LOGICAL_IFACE="default" + fi + + wpa_msg log "ifup $WPA_IFACE=$WPA_LOGICAL_IFACE" + + ifupdown_lock + + if [ -n "$IFSTATE_FILE" ] && grep -q "^$WPA_IFACE=$WPA_IFACE" "$IFSTATE_FILE"; then + # Force settings over the unconfigured "master" IFACE + /sbin/ifup -v --force "$WPA_IFACE=$WPA_LOGICAL_IFACE" + else + /sbin/ifup -v "$WPA_IFACE=$WPA_LOGICAL_IFACE" + fi + IFUP_RETVAL="$?" + + ifupdown_unlock + fi + + wpa_msg log "creating sendsigs omission pidfile: $WPA_SUP_OMIT_PIDFILE" + cat "$WPA_SUP_PIDFILE" > "$WPA_SUP_OMIT_PIDFILE" + + return "$IFUP_RETVAL" +} + +##################################################################### +## ifdown IFACE +# Check IFACE state and ifdown as requested. +# +ifdown () { + wpa_msg log "ifdown $WPA_IFACE" + + ifupdown_lock + + /sbin/ifdown -v "$WPA_IFACE" + + ifupdown_unlock + + wpa_msg log "removing sendsigs omission pidfile: $WPA_SUP_OMIT_PIDFILE" + rm -f "$WPA_SUP_OMIT_PIDFILE" +} + +##################################################################### +## keep IFACE scanning +# After ifdown, the IFACE may be left "down", and inhibits +# wpa_supplicant's ability to continue roaming. +# +# NB: use iproute if present, flushing the IFACE first +# +if_post_down_up () { + if [ -x /bin/ip ]; then + ip addr flush dev "$WPA_IFACE" 2>/dev/null + ip link set "$WPA_IFACE" up + else + ifconfig "$WPA_IFACE" up + fi +} diff --git a/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/ifupdown.sh b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/ifupdown.sh new file mode 100644 index 0000000..9dab925 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/ifupdown.sh @@ -0,0 +1,172 @@ +#!/bin/sh + +##################################################################### +## Purpose +# This file is executed by ifupdown in pre-up, post-up, pre-down and +# post-down phases of network interface configuration. It allows +# ifup(8), and ifdown(8) to manage wpa_supplicant(8) and wpa_cli(8) +# processes running in daemon mode. +# +# /etc/wpa_supplicant/functions.sh is sourced by this file. +# +# This file is provided by the wpasupplicant package. + +##################################################################### +# Copyright (C) 2006 - 2009 Debian/Ubuntu wpasupplicant Maintainers +# +# +# 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. +# +# On Debian GNU/Linux systems, the text of the GPL license, +# version 2, can be found in /usr/share/common-licenses/GPL-2. + +if [ -n "$IF_WPA_MAINT_DEBUG" ]; then + set -x +fi + +# quit if we're called for the loopback +if [ "$IFACE" = lo ]; then + exit 0 +fi + +# allow wpa_supplicant interface to be specified via wpa-iface +# useful for starting wpa_supplicant on one interface of a bridge +if [ -n "$IF_WPA_IFACE" ]; then + WPA_IFACE="$IF_WPA_IFACE" +else + WPA_IFACE="$IFACE" +fi + +# source functions +if [ -f /etc/wpa_supplicant/functions.sh ]; then + . /etc/wpa_supplicant/functions.sh +else + exit 0 +fi + +# quit if executables are not installed +if [ ! -x "$WPA_SUP_BIN" ] || [ ! -x "$WPA_CLI_BIN" ]; then + exit 0 +fi + +do_start () { + if test_wpa_cli; then + # if wpa_action is active for this IFACE, do nothing + ifupdown_locked && exit 0 + + # if the administrator is calling ifup, say something useful + if [ "$PHASE" = "pre-up" ]; then + wpa_msg stderr "wpa_action is managing ifup/ifdown state of $WPA_IFACE" + wpa_msg stderr "execute \`ifdown --force $WPA_IFACE' to stop wpa_action" + fi + exit 1 + elif ! set | grep -q "^IF_WPA"; then + # no wpa- option defined for IFACE, do nothing + exit 0 + fi + + # ensure stale ifupdown_lock marker is purged + ifupdown_unlock + + # preliminary sanity checks for roaming daemon + if [ -n "$IF_WPA_ROAM" ]; then + if [ "$METHOD" != "manual" ]; then + wpa_msg stderr "wpa-roam can only be used with the \"manual\" inet METHOD" + exit 1 + fi + if [ -n "$IF_WPA_MAPPING_SCRIPT" ]; then + if ! type "$IF_WPA_MAPPING_SCRIPT" >/dev/null; then + wpa_msg stderr "wpa-mapping-script \"$IF_WPA_MAPPING_SCRIPT\" is not valid" + exit 1 + fi + fi + if [ -n "$IF_WPA_MAPPING_SCRIPT_PRIORITY" ] && [ -z "$IF_WPA_MAPPING_SCRIPT" ]; then + wpa_msg stderr "\"wpa-mapping-script-priority 1\" is invalid without a wpa-mapping-script" + exit 1 + fi + IF_WPA_CONF="$IF_WPA_ROAM" + WPA_ACTION_SCRIPT="/usr/sbin/wpa_action" + fi + + # master function; determines if ifupdown.sh should do something or not + if [ -n "$IF_WPA_CONF" ] && [ "$IF_WPA_CONF" != "managed" ]; then + if [ ! -s "$IF_WPA_CONF" ]; then + wpa_msg stderr "cannot read contents of $IF_WPA_CONF" + exit 1 + fi + WPA_SUP_CONF_CTRL_DIR=$(sed -n -e 's/[[:space:]]*#.*//g' -e 's/[[:space:]]\+.*$//g' \ + -e 's/^ctrl_interface=\(DIR=\)\?\(.*\)/\2/p' "$IF_WPA_CONF") + if [ -n "$WPA_SUP_CONF_CTRL_DIR" ]; then + WPA_CTRL_DIR="$WPA_SUP_CONF_CTRL_DIR" + WPA_SUP_CONF="-c $IF_WPA_CONF" + else + # specify the default ctrl_interface since none was defined in + # the given IF_WPA_CONF + WPA_SUP_CONF="-c $IF_WPA_CONF -C $WPA_CTRL_DIR" + fi + else + # specify the default ctrl_interface + WPA_SUP_CONF="-C $WPA_CTRL_DIR" + fi +} + +do_stop () { + if test_wpa_cli; then + # if wpa_action is active for this IFACE and calling ifdown, + # do nothing + ifupdown_locked && exit 0 + elif test_wpa_supplicant; then + # wpa_supplicant process exists for this IFACE, but wpa_cli + # process does not. Allow stop mode to kill this process. + : + else + exit 0 + fi +} + +case "$MODE" in + start) + do_start + case "$PHASE" in + pre-up) + kill_wpa_supplicant + init_wpa_supplicant || exit 1 + conf_wpa_supplicant || { kill_wpa_supplicant; exit 1; } + ;; + post-up) + init_wpa_cli || { kill_wpa_supplicant; exit 1; } + ;; + esac + ;; + + stop) + do_stop + case "$PHASE" in + pre-down) + kill_wpa_cli + ;; + post-down) + kill_wpa_supplicant + ;; + *) + wpa_msg stderr "unknown phase: \"$PHASE\"" + exit 1 + ;; + esac + ;; + + *) + wpa_msg stderr "unknown mode: \"$MODE\"" + exit 1 + ;; +esac + +exit 0 diff --git a/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/wpa_action b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/wpa_action new file mode 100644 index 0000000..7ef57ac --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/wpa_action @@ -0,0 +1,81 @@ +#!/bin/sh + +# Copyright (C) 2006 - 2009 Debian/Ubuntu wpasupplicant Maintainers +# +# +# 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. +# +# On Debian GNU/Linux systems, the text of the GPL license, +# version 2, can be found in /usr/share/common-licenses/GPL-2. + +if [ -n "$IF_WPA_ROAM_MAINT_DEBUG" ]; then + set -x +fi + +if [ -z "$1" ] || [ -z "$2" ]; then + echo "Usage: $0 IFACE ACTION" + exit 1 +fi + +# network interface +WPA_IFACE="$1" +# [CONNECTED|DISCONNECTED|stop|reload|check] +WPA_ACTION="$2" + +if [ -f /etc/wpa_supplicant/functions.sh ]; then + . /etc/wpa_supplicant/functions.sh +else + exit 0 +fi + +case "$WPA_ACTION" in + "CONNECTED") + wpa_log_env + wpa_hysteresis_check || exit 1 + wpa_hysteresis_event + if ifup; then + wpa_cli status | wpa_msg log + else + wpa_cli status | wpa_msg log + wpa_cli reassociate + fi + ;; + + "DISCONNECTED") + wpa_log_env + wpa_hysteresis_check || exit 1 + ifdown + if_post_down_up + ;; + + "stop"|"down") + test_wpa_cli && kill_wpa_cli + ifdown + test_wpa_supplicant && kill_wpa_supplicant + ;; + + "restart"|"reload") + test_wpa_supplicant || exit 1 + reload_wpa_supplicant + ;; + + "check") + test_wpa_supplicant || exit 1 + test_wpa_cli || exit 1 + ;; + + *) + echo "Unknown action: \"$WPA_ACTION\"" + exit 1 + ;; +esac + +exit 0 diff --git a/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/wpa_action.8 b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/wpa_action.8 new file mode 100644 index 0000000..e8f1b28 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant-0.7.3/wpa_action.8 @@ -0,0 +1,148 @@ +.TH WPA_ACTION "8" "26 May 2006" "" "" +.SH NAME +wpa_action \- wpa_cli action script +.SH SYNOPSIS +\fBwpa_action\fR \fIIFACE ACTION\fR +.SH "DESCRIPTION" +\fBwpa_action\fR is a shell script designed to control the \fBifupdown\fR +framework according to \fIACTION\fR events received from \fBwpa_supplicant\fR. +\fBwpa_cli\fR receives \fICONNECTED\fR and \fIDISCONNECTED\fR events from +\fBwpa_supplicant\fR via the crtl_iface socket and gives the \fIACTION\fR event +to the \fBwpa_action\fR script as an argument, along with the \fIIFACE\fR to be +acted upon. +.PP +\fBwpa_action\fR also receives an environment variable from \fBwpa_cli\fR, +\fIWPA_ID_STR\fR, containing an alphanumeric identification string for the +\fICURRENT\fR network block. \fIWPA_ID_STR\fR is provided by the 'id_str' +network block option of \fBwpa_supplicant.conf\fR, and provides a means to map +the \fIACTION\fR to a \fILOGICAL\fR interface configured in the \fBinterfaces\fR +file. +.PP +If either the ifupdown \fBinterfaces\fR or \fIifstate\fR file cannot be found, +\fBwpa_action\fR will exit silently (status 0). \fBwpa_action\fR will search +the following locations for their existance: +.nf + /etc/network/run/ifstate + /var/run/network/ifstate + /etc/network/interfaces +.fi +.PP +.SH IFACE +Network interface to be acted upon, for example 'eth1' or 'wlan0'. +.SH ACTION +An \fIACTION\fR to be performed on the \fIIFACE\fR. +.TP +\fBCONNECTED\fR +\fBwpa_supplicant\fR has completed authentication. +\fBifup\fR \fIIFACE=WPA_ID_STR\fR is invoked and the action is logged to +syslog. Network settings for the \fILOGICAL\fR interface \fIWPA_ID_STR\fR +are applied. +.TP +\fBDISCONNECTED\fR +\fBwpa_supplicant\fR has detected disconnection. +\fBifdown\fR \fIIFACE=WPA_ID_STR\fR is invoked and the action is logged to +syslog. Network settings for the \fILOGICAL\fR interface \fIWPA_ID_STR\fR +are undone. +.TP +\fBstop\fR +The 'stop' \fIACTION\fR is a called manually by the user, to stop the +\fBwpa_cli\fR daemon, invoke \fBifdown\fR \fIIFACE\fR (if the \fIIFACE\fR is +present in the \fIifstate\fR file) and stop the \fBwpa_supplicant\fR daemon. +.TP +\fBreload\fR +The 'reload' \fIACTION\fR can be used to reload the \fBwpa_supplicant\fR +configuration file specified by \fIwpa-roam\fR . 'restart' is a synonym +for 'reload' and can be used equally. The action is logged to +\fI/var/log/wpa_action.log\fR. +.SH ENVIRONMENT +An alphanumeric identification string provided by the 'id_str' network block +option of \fBwpa_supplicant.conf\fR is exported to \fBwpa_action\fR as an +environment variable, \fIWPA_ID_STR\fR. When 'id_str' is not configured for the +\fICURRENT\fR network block, 'default' is substituted for the absent +\fIWPA_ID_STR\fR environment variable. +.PP +A unique network identifier, \fIWPA_ID\fR, is exported to \fBwpa_action\fR. It +is the number assigned to the \fICURRENT\fR \fBwpa_supplicant\fR network block +(network_id). +.SH USAGE +The only reasons for \fBwpa_action\fR to be explicitly executed by the user is +to stop \fBwpa_cli\fR from controlling \fBifupdown\fR or reload the +\fIwpa_supplicant.conf\fR file after editing. +.PP +.RS +\fBwpa_action\fR \fIeth1 stop\fR +.RE +.PP +Otherwise, \fBwpa_action\fR is given as an argument to a \fBwpa_cli\fR +daemon. +.PP +.RS +\fBwpa_cli\fR \fI-i eth1 -a /sbin/wpa_action -B\fR +.RE +.PP +This can be done by using the \fIwpa-roam\fR option in the \fBinterfaces\fR +file. \fIwpa-roam\fR takes one argument, a user provided +\fBwpa_supplicant.conf\fR file. +.PP +The inet \fIMETHOD\fR must be 'manual' for this interface, as it will +be configured according to \fBwpa_cli\fR action events. Also supply a 'default' +\fBinterfaces\fR stanza using the dhcp inet \fIMETHOD\fR so that networks +without an 'id_str' option can fallback to attempting to receive an ip via +dhcp. If one or more networks requires additional network configuration, +provide an unique 'id_str' for each network, and an \fBinterfaces\fR stanza +using the 'id_str' value as a \fILOGICAL\fR interface. The following interfaces +file is configured to use dhcp for any network without an 'id_str', a static ip +for the network with an 'id_str' of 'home_static' and dhcp plus an additional +post-up command for the network with an 'id_str' of 'uni'. +.PP +An example wpa_supplicant.conf configured to roam between 3 different networks: +.PP +.RS +.nf +network={ + ssid="foo" + id_str="uni" + key_mgmt=NONE +} + +network={ + ssid="bar" + id_str="home_static" + psk=123456789... +} + +network={ + ssid="" + key_mgmt=NONE +} +.fi +.RE +.PP +The corresponding \fBinterfaces\fR file would contain \fILOGICAL\fR interfaces, +that correlate to each unique 'id_str' provided by the configuration file: +.PP +.RS +.nf +iface eth1 inet manual + wpa-driver wext + wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf + +iface default inet dhcp + +iface uni inet dhcp + +iface home_static inet static + address 192.168.0.20 + netmask 255.255.255.0 + network 192.168.0.0 + broadcast 192.168.0.255 + gateway 192.168.0.1 +.fi +.RE +.PP +.SH SEE ALSO +\fBwpa_cli(8)\fR, \fBwpa_supplicant(8)\fR, \fBwpa_supplicant.conf(5)\fR, +\fBifup(8)\fR, \fBinterfaces(5)\fR +.SH AUTHOR +This manual page was written by Kel Modderman for +the Debian GNU system (but may be used by others). diff --git a/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant_0.7.3.bbappend b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant_0.7.3.bbappend new file mode 100644 index 0000000..8ad898b --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/wpa-supplicant/wpa-supplicant_0.7.3.bbappend @@ -0,0 +1,40 @@ +DEPENDS += "openssl" +PR .= "-vuplus0" + +SRC_URI += " \ + file://action_wpa.sh \ + file://functions.sh \ + file://ifupdown.sh \ + file://wpa_action \ + file://wpa_action.8 \ +" + +do_configure_append() { + sed -e '/^CONFIG_TLS = gnutls/d' -i .config + echo "CONFIG_DEBUG_SYSLOG=y" >> .config +} +do_install_append() { + rm -rf ${D}${sysconfdir}/network/if-*.d + + install -d ${D}${sysconfdir}/wpa_supplicant + install -m 755 ${WORKDIR}/action_wpa.sh ${D}${sysconfdir}/wpa_supplicant + install -m 755 ${WORKDIR}/functions.sh ${D}${sysconfdir}/wpa_supplicant + install -m 755 ${WORKDIR}/ifupdown.sh ${D}${sysconfdir}/wpa_supplicant + + install -d ${D}${sbindir} + install -m 755 ${WORKDIR}/wpa_action ${D}${sbindir} + + install -d ${D}${mandir}/man8 + install -m 755 ${WORKDIR}/wpa_action.8 ${D}${mandir}/man8 + + install -d ${D}${sysconfdir}/network/if-down.d + install -d ${D}${sysconfdir}/network/if-post-down.d + install -d ${D}${sysconfdir}/network/if-pre-up.d + install -d ${D}${sysconfdir}/network/if-up.d + ln -s ../../wpa_supplicant/ifupdown.sh ${D}${sysconfdir}/network/if-down.d/${PN} + ln -s ../../wpa_supplicant/ifupdown.sh ${D}${sysconfdir}/network/if-post-down.d/${PN} + ln -s ../../wpa_supplicant/ifupdown.sh ${D}${sysconfdir}/network/if-pre-up.d/${PN} + ln -s ../../wpa_supplicant/ifupdown.sh ${D}${sysconfdir}/network/if-up.d/${PN} +} + +FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" diff --git a/meta-openvuplus/recipes-connectivity/zd1211/zd1211-firmware_1.4.bb b/meta-openvuplus/recipes-connectivity/zd1211/zd1211-firmware_1.4.bb new file mode 100644 index 0000000..2f785f0 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/zd1211/zd1211-firmware_1.4.bb @@ -0,0 +1,25 @@ +SUMMARY = "Firmware images for the zd1211rw wireless driver" +SECTION = "kernel" +HOMEPAGE = "http://zd1211.wiki.sourceforge.net/" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=eb723b61539feef013de476e68b5c50a" +PR = "r1" + +SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BP}.tar.bz2" +SRC_URI[md5sum] = "19f28781d76569af8551c9d11294c870" +SRC_URI[sha256sum] = "866308f6f59f7075f075d4959dff2ede47735c751251fecd1496df1ba4d338e1" + +S = "${WORKDIR}/${BPN}" + +inherit allarch + +do_compile() { + : +} + +do_install() { + install -d ${D}/lib/firmware/zd1211/ + install -m 0644 zd1211* ${D}/lib/firmware/zd1211/ +} + +FILES_${PN} += "/lib/firmware/*" diff --git a/meta-openvuplus/recipes-connectivity/zd1211/zd1211b/cross_compile.patch b/meta-openvuplus/recipes-connectivity/zd1211/zd1211b/cross_compile.patch new file mode 100644 index 0000000..cb6a003 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/zd1211/zd1211b/cross_compile.patch @@ -0,0 +1,41 @@ +Index: ZD1211LnxDrv_2_22_0_0/Makefile +=================================================================== +--- ZD1211LnxDrv_2_22_0_0.orig/Makefile 2010-12-13 15:10:36.000000000 +0000 ++++ ZD1211LnxDrv_2_22_0_0/Makefile 2010-12-13 15:13:30.000000000 +0000 +@@ -5,10 +5,10 @@ + # + + HOST= +-CC=$(HOST)gcc +-LD=$(HOST)ld +-KERN_VER=$(shell uname -r | cut -b1-3;) +-KDIR := /lib/modules/$(shell uname -r)/build ++CC?=$(HOST)gcc ++LD?=$(HOST)ld ++KERN_VER ?= $(shell uname -r | cut -b1-3;) ++KDIR ?= /lib/modules/$(shell uname -r)/build + PWD := $(shell pwd) + + SUBDIRS=. +@@ -17,10 +17,10 @@ + + ifeq ($(KERN_VER), 2.6) + KERN_26=y +- KERNEL_SOURCE=/usr/src/linux-2.6.9 ++ KERNEL_SOURCE?=/usr/src/linux-2.6.9 + else + KERN_24=y +- KERNEL_SOURCE=/usr/src/linux-2.4 ++ KERNEL_SOURCE?=/usr/src/linux-2.4 + endif + + SRC_DIR=src +@@ -28,7 +28,7 @@ + + + KERNRELEASE := $(shell uname -r;) +-MODPATH := /lib/modules/$(KERNRELEASE) ++MODPATH ?= /lib/modules/$(KERNRELEASE) + + + diff --git a/meta-openvuplus/recipes-connectivity/zd1211/zd1211b/zdiface.patch b/meta-openvuplus/recipes-connectivity/zd1211/zd1211b/zdiface.patch new file mode 100644 index 0000000..da51ae7 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/zd1211/zd1211b/zdiface.patch @@ -0,0 +1,12 @@ +diff -Naur org/src/zdusb.c patched/src/zdusb.c +--- org/src/zdusb.c 2007-11-06 13:06:36.000000000 +0100 ++++ patched/src/zdusb.c 2008-08-19 12:44:48.000000000 +0200 +@@ -371,6 +371,8 @@ + g_dev = net; //save this for CBs use + //macp = net->priv; //kernel 2.4 + net->priv = macp; //kernel 2.6 ++ /* ath_desc: use /dev/wlanX as device node */ ++ strcpy(net->name, "wlan%d"); + macp->device = net; + macp->usb = dev; + SET_MODULE_OWNER(net); diff --git a/meta-openvuplus/recipes-connectivity/zd1211/zd1211b_2.22.0.0.bb b/meta-openvuplus/recipes-connectivity/zd1211/zd1211b_2.22.0.0.bb new file mode 100644 index 0000000..ad7effa --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/zd1211/zd1211b_2.22.0.0.bb @@ -0,0 +1,32 @@ +SUMMARY = "Driver for zd1211b family of wireless USB Dongles" +HOMEPAGE = "http://zd1211.ath.cx/" +SECTION = "kernel/modules" +LICENSE = "MPL-1.1 | GPLv2" +LIC_FILES_CHKSUM = "file://src/zd1211.c;endline=31;md5=76cb7cb1283c3b6e20de40280a74f87f" +RDEPENDS = "wireless-tools" + +inherit module + +PR = "r3" + +SRC_URI = " \ + http://www.reactivated.net/software/zd1211-vendor/releases/ZD1211LnxDrv_2_22_0_0.tar.gz \ + file://cross_compile.patch \ + file://zdiface.patch \ +" + +SRC_URI[md5sum] = "0ac1145f1f30d883694b4a1317f142c4" +SRC_URI[sha256sum] = "262f44f0d1274d2baf6548e53df96c6664b076f39e3aaeeb022bbd5caccbe3e3" + +S = "${WORKDIR}/ZD1211LnxDrv_2_22_0_0" + +do_compile() { + unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS + oe_runmake KERN_VER=2.6 KDIR=${STAGING_KERNEL_DIR} KERNEL_SOURCE=${STAGING_KERNEL_DIR} \ + MODPATH=${D}${base_libdir}/modules/${KERNEL_VERSION} ZD1211REV_B=1 +} + +do_install() { + install -d ${D}${base_libdir}/modules/${KERNEL_VERSION}/kernel/drivers/net + install -m 0644 ${S}/zd1211*${KERNEL_OBJECT_SUFFIX} ${D}${base_libdir}/modules/${KERNEL_VERSION}/kernel/drivers/net +} diff --git a/meta-openvuplus/recipes-connectivity/zeroconf/zeroconf_0.9.bbappend b/meta-openvuplus/recipes-connectivity/zeroconf/zeroconf_0.9.bbappend new file mode 100644 index 0000000..5ee8d24 --- /dev/null +++ b/meta-openvuplus/recipes-connectivity/zeroconf/zeroconf_0.9.bbappend @@ -0,0 +1,5 @@ +PR .= "-vuplus0" + +do_install_append() { + sed -e 's,^#FALLBACK=yes,FALLBACK=yes,' -i ${D}${sysconfdir}/default/zeroconf +} diff --git a/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch b/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch new file mode 100644 index 0000000..9eb2b87 --- /dev/null +++ b/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch @@ -0,0 +1,125 @@ +--- libsigc++-1.2.5-old/configure.in 2003-05-14 10:04:25.000000000 +0200 ++++ libsigc++-1.2.5/configure.in 2004-07-03 10:00:13.000000000 +0200 +@@ -35,9 +35,9 @@ + dnl AC_SUBST(SIGC_RELEASE, $SIGC_RELEASE) + AC_SUBST(SIGC_VERSION) + +-AC_DEFINE_UNQUOTED(SIGC_MAJOR_VERSION, $SIGC_MAJOR_VERSION) +-AC_DEFINE_UNQUOTED(SIGC_MINOR_VERSION, $SIGC_MINOR_VERSION) +-AC_DEFINE_UNQUOTED(SIGC_MICRO_VERSION, $SIGC_MICRO_VERSION) ++AC_DEFINE_UNQUOTED(SIGC_MAJOR_VERSION, $SIGC_MAJOR_VERSION, [library major version]) ++AC_DEFINE_UNQUOTED(SIGC_MINOR_VERSION, $SIGC_MINOR_VERSION, [library minor version]) ++AC_DEFINE_UNQUOTED(SIGC_MICRO_VERSION, $SIGC_MICRO_VERSION, [library micro version]) + + AC_CONFIG_AUX_DIR(scripts) + +@@ -50,6 +50,23 @@ + + dnl Specify a configuration file + AM_CONFIG_HEADER(sigc++/config/sigcconfig.h) ++AH_BOTTOM([ ++// Window DLL declarations ++ ++#ifdef LIBSIGC_DLL ++ #if defined(LIBSIGC_COMPILATION) && defined(DLL_EXPORT) ++ #define LIBSIGC_API __declspec(dllexport) ++ #define LIBSIGC_TMPL ++ #elif !defined(LIBSIGC_COMPILATION) ++ #define LIBSIGC_API __declspec(dllimport) ++ #define LIBSIGC_TMPL extern ++ #else ++ #define LIBSIGC_API ++ #endif /* LIBSIGC_COMPILATION - DLL_EXPORT */ ++#else ++ #define LIBSIGC_API ++#endif /* LIBSIGC_DLL */ ++]) + + AM_MAINTAINER_MODE + +@@ -288,10 +307,10 @@ + }; + ],[ + ], +- AC_DEFINE(SIGC_CXX_EXPLICIT,explicit) ++ AC_DEFINE(SIGC_CXX_EXPLICIT,explicit,[if C++ compiler supports explicit]) + ac_cxx_explicit=yes + , +- AC_DEFINE(SIGC_CXX_EXPLICIT,) ++ AC_DEFINE(SIGC_CXX_EXPLICIT) + ac_cxx_explicit=no + ) + AC_MSG_RESULT([$ac_cxx_explicit]) +@@ -305,7 +324,7 @@ + }; + ],[ + ], +- AC_DEFINE(SIGC_CXX_EXPLICIT_COPY,explicit) ++ AC_DEFINE(SIGC_CXX_EXPLICIT_COPY,explicit,[if C++ compiler supports explicit copy ctor]) + ac_cxx_explicit_copy_ctor=yes + , + AC_DEFINE(SIGC_CXX_EXPLICIT_COPY,) +@@ -413,7 +432,7 @@ + k a; + ],[ + ac_cxx_partial_specialization=yes +- AC_DEFINE(SIGC_CXX_PARTIAL_SPEC) ++ AC_DEFINE(SIGC_CXX_PARTIAL_SPEC,,[if C++ compiler supports partial specialization]) + ],[ + # config_error=yes + ac_cxx_partial_specialization=no +@@ -434,7 +453,7 @@ + ],[ + ac_cxx_namespaces=yes + AC_MSG_RESULT([$ac_cxx_namespaces]) +- AC_DEFINE(SIGC_CXX_NAMESPACES) ++ AC_DEFINE(SIGC_CXX_NAMESPACES,,[if C++ compiler supports name spaces]) + ],[ + ac_cxx_namespaces=no + AC_MSG_RESULT([$ac_cxx_namespaces]) +@@ -474,7 +493,7 @@ + A i; + ],[ + ],[ +- AC_DEFINE(SIGC_CXX_INT_CTOR) ++ AC_DEFINE(SIGC_CXX_INT_CTOR,,[if C++ compiler has intrinsic constructors]) + ac_cxx_tmpl_intctor=yes + ],[ + ac_cxx_tmpl_intctor=no +@@ -515,7 +534,7 @@ + ],[ + ],[ + ac_cxx_void_return=yes +- AC_DEFINE(SIGC_CXX_VOID_RETURN) ++ AC_DEFINE(SIGC_CXX_VOID_RETURN,,[if C++ compiler allows void returns]) + ],[ + ac_cxx_void_return=no + ]) +@@ -530,7 +549,7 @@ + ],[ + ],[ + ac_cxx_void_cast_return=yes +- AC_DEFINE(SIGC_CXX_VOID_CAST_RETURN) ++ AC_DEFINE(SIGC_CXX_VOID_CAST_RETURN,,[if C++ compiler supports void cast return]) + ],[ + ac_cxx_void_cast_return=no + ]) +@@ -565,7 +584,7 @@ + P::ptr q=b; + ],[ + ac_cxx_specialize_references=yes +- AC_DEFINE(SIGC_CXX_SPECIALIZE_REFERENCES) ++ AC_DEFINE(SIGC_CXX_SPECIALIZE_REFERENCES,,[if C++ compiler allows specialization of references]) + ],[ + ac_cxx_specialize_references=no + ]) +--- libsigc++-1.2.5-old/Makefile.am 2004-06-27 12:45:19.000000000 +0200 ++++ libsigc++-1.2.5/Makefile.am 2004-07-03 08:40:44.000000000 +0200 +@@ -1,6 +1,6 @@ + SUBDIRS = sigc++ tests doc + DIST_SUBDIRS = $(SUBDIRS) examples scripts MSVC_6 MSVC_Net2003 +-ACLOCAL_AMFLAGS = -I $(srcdir)/scripts ++ACLOCAL_AMFLAGS = -I ./scripts + + EXTRA_DIST = \ + FEATURES IDEAS \ diff --git a/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch b/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch new file mode 100644 index 0000000..1cdfedb --- /dev/null +++ b/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch @@ -0,0 +1,15 @@ +upstream: unmaintained + +| ...build/tmp/sysroots/i686-linux/usr/bin/install: will not overwrite just-created `...build/tmp/work/mipsel-oe-linux/libsigc++-1.2-1.2.5-r2/image/usr/include/sigc++-1.2/sigc++/method_slot.h' with `method_slot.h' + +--- libsigc++-1.2.7/sigc++/Makefile.am.orig 2010-09-24 12:03:24.000000000 +0000 ++++ libsigc++-1.2.7/sigc++/Makefile.am 2010-09-24 12:03:30.000000000 +0000 +@@ -12,7 +12,7 @@ + sigc_built_h = bind_return.h \ + object_slot.h retype_return.h slot.h bind.h \ + class_slot.h hide.h retype.h signal.h \ +- method_slot.h method_slot.h ++ method_slot.h + + built_sources = $(sigc_built_cc) $(sigc_built_h) + dist_sources = $(sigc_fixed_cc) $(sigc_fixed_h) diff --git a/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch b/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch new file mode 100644 index 0000000..7495a4d --- /dev/null +++ b/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch @@ -0,0 +1,13 @@ + +# +# Patch managed by http://www.holgerschurig.de/patcher.html +# + +--- libsigc++-1.2.5/sigc++-1.2.pc.in~pkgconfig ++++ libsigc++-1.2.5/sigc++-1.2.pc.in +@@ -7,4 +7,4 @@ + Description: Type-safe signal and callback system for C++ + Version: @VERSION@ + Libs: -L${libdir} -lsigc-1.2 +-Cflags: -I${exec_prefix}/lib/sigc++-1.2/include -I${includedir}/sigc++-1.2 ++Cflags: -I${libdir}/sigc++-1.2/include -I${includedir}/sigc++-1.2 diff --git a/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch b/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch new file mode 100644 index 0000000..21fa729 --- /dev/null +++ b/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch @@ -0,0 +1,159 @@ +diff -Naur libsigc++-1.2.5/sigc++/macros/signal.h.m4 libsigc++-1.2.7/sigc++/macros/signal.h.m4 +--- libsigc++-1.2.5/sigc++/macros/signal.h.m4 2003-03-06 09:06:12.000000000 +0100 ++++ libsigc++-1.2.7/sigc++/macros/signal.h.m4 2005-01-29 00:10:34.000000000 +0100 +@@ -82,6 +82,8 @@ + bool empty(); + void clear(); + void cleanup(); // nothrow ++ private: ++ void _remove(SignalConnectionNode* c); + }; + + class LIBSIGC_API SignalBase +diff -Naur libsigc++-1.2.5/sigc++/object.h libsigc++-1.2.7/sigc++/object.h +--- libsigc++-1.2.5/sigc++/object.h 2003-05-08 21:35:11.000000000 +0200 ++++ libsigc++-1.2.7/sigc++/object.h 2012-02-14 13:08:00.193044640 +0100 +@@ -69,7 +69,7 @@ + virtual void unreference() const; + virtual void set_manage(); + +- ObjectBase& operator=(const ObjectBase& /* o */) ++ ObjectBase& operator=(const ObjectBase& o) + { return *this; } + + ObjectBase() +@@ -79,7 +79,11 @@ + : control_(0) {} + + virtual ~ObjectBase()=0; +- ++ ++ Control_* control() const ++ { ++ return const_cast(this)->control(); ++ } + Control_* control() + { + if (!control_) +@@ -129,7 +133,6 @@ + template + Ptr(const Ptr& p2) + { +- T* test_assignment_ = (T2*)0; + assign( p2.get() ); + } + +@@ -144,7 +147,7 @@ + + template + Ptr& operator=(const Ptr& p2) +- { T *test_assignment_=(T2*)0; reset(p2.get()); return *this; } ++ { reset(p2.get()); return *this; } + + Ptr& operator=(const Ptr& p) + { reset(p.get()); return *this; } +@@ -175,7 +178,7 @@ + if (control_) + control_->ref(); + } +- ++ + void reset(T* t = 0) + { + if (object_ == t) +@@ -197,4 +200,3 @@ + + + #endif // SIGC_OBJECT +- +diff -Naur libsigc++-1.2.5/sigc++/signal.cc libsigc++-1.2.7/sigc++/signal.cc +--- libsigc++-1.2.5/sigc++/signal.cc 2002-12-12 20:18:24.000000000 +0100 ++++ libsigc++-1.2.7/sigc++/signal.cc 2005-01-29 00:10:34.000000000 +0100 +@@ -93,33 +93,11 @@ + defered_ = false; + + SignalConnectionNode* i = begin_; +- +- while(begin_ && begin_->defered_) +- begin_ = begin_->next_; +- +- while(end_ && end_->defered_) +- end_ = end_->prev_; +- +- // Hmm, this looks a bit tricky to me. The code above removes all +- // elements from the front and the back that have defered_ = true set. +- // But the following loop unreferences *all* defered elements, including +- // those that are still in the list. +- // +- // I don't know whether this is a bug -- it's possible that defered nodes +- // are always at the front or back. If not, a node could be unreferenced +- // twice which is bad. +- // +- // --Daniel +- + while(i) + { + SignalConnectionNode* next = i->next_; +- + if(i->defered_) +- { +- i->parent_ = 0; +- i->unreference(); +- } ++ _remove(i); + + i = next; + } +@@ -141,7 +119,7 @@ + begin_->prev_=c; + else + end_=c; +- end_=c; ++ begin_=c; + return c; + } + +@@ -161,21 +139,8 @@ + + void SignalNode::remove(SignalConnectionNode* c) + { +- if (!exec_count_) +- { +- if (c->prev_) +- c->prev_->next_=c->next_; +- else +- begin_=c->next_; +- +- if (c->next_) +- c->next_->prev_=c->prev_; +- else +- end_=c->prev_; +- +- c->parent_ = 0; +- c->unreference(); +- } ++ if(!exec_count_) ++ _remove(c); + else + { + c->defered_=true; +@@ -184,6 +149,19 @@ + } + } + ++void SignalNode::_remove(SignalConnectionNode* c) ++ { ++ if (c->prev_) ++ c->prev_->next_=c->next_; ++ else ++ begin_=c->next_; ++ if (c->next_) ++ c->next_->prev_=c->prev_; ++ else ++ end_=c->prev_; ++ c->parent_ = 0; ++ c->unreference(); ++ } + + + /**********************************************************/ diff --git a/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2_1.2.5.bb b/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2_1.2.5.bb new file mode 100644 index 0000000..632a6f5 --- /dev/null +++ b/meta-openvuplus/recipes-core/libsigc++-1.2/libsigc++-1.2_1.2.5.bb @@ -0,0 +1,21 @@ +SUMMARY = "A library for loose coupling of C++ method calls" +SECTION = "libs" +LICENSE = "LGPLv2.1" +LIC_FILES_CHKSUM = "file://COPYING;md5=d8045f3b8f929c1cb29a1e3fd737b499" +PR = "r2" + +SRC_URI = "${SOURCEFORGE_MIRROR}/libsigc/libsigc++-${PV}.tar.gz \ + file://autofoo.patch \ + file://fix-install.patch \ + file://pkgconfig.patch \ + file://to_1.2.7.patch" +SRC_URI[md5sum] = "d0d1ffcae0eced97ef4f17ce0ba81352" +SRC_URI[sha256sum] = "dcd6d3ea9a2c185b5286f80eefe9ac1402036b8fa21cfc742442d99579bd2b3e" + +S = "${WORKDIR}/libsigc++-${PV}" + +inherit autotools pkgconfig + +EXTRA_AUTORECONF = "--exclude=autoheader" + +FILES_${PN}-dev += "${libdir}/sigc++-*/" diff --git a/meta-openvuplus/recipes-devtools/mtd/mtd-utils-1.4.9/disable-ubi.patch b/meta-openvuplus/recipes-devtools/mtd/mtd-utils-1.4.9/disable-ubi.patch new file mode 100644 index 0000000..d9384d9 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/mtd/mtd-utils-1.4.9/disable-ubi.patch @@ -0,0 +1,19 @@ +--- mtd-utils-1.4.9.org/Makefile 2012-04-02 11:41:10.339446661 +0200 ++++ mtd-utils-1.4.9/Makefile 2012-04-02 11:40:33.659447111 +0200 +@@ -30,13 +30,13 @@ + ubidetach ubinize ubiformat ubirename mtdinfo ubirsvol + + BINS = $(MTD_BINS) +-BINS += mkfs.ubifs/mkfs.ubifs +-BINS += $(addprefix ubi-utils/,$(UBI_BINS)) ++#BINS += mkfs.ubifs/mkfs.ubifs ++#BINS += $(addprefix ubi-utils/,$(UBI_BINS)) + SCRIPTS = flash_eraseall + + TARGETS = $(BINS) + TARGETS += lib/libmtd.a +-TARGETS += ubi-utils/libubi.a ++#TARGETS += ubi-utils/libubi.a + + OBJDEPS = $(BUILDDIR)/include/version.h + diff --git a/meta-openvuplus/recipes-devtools/mtd/mtd-utils_1.4.9.bbappend b/meta-openvuplus/recipes-devtools/mtd/mtd-utils_1.4.9.bbappend new file mode 100644 index 0000000..6eb3342 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/mtd/mtd-utils_1.4.9.bbappend @@ -0,0 +1,7 @@ +PR .= "-vuplus0" + +FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" + +DREAMBOX_KERNEL_VERSION = "3.2" + +SRC_URI += "${@base_version_less_or_equal('DREAMBOX_KERNEL_VERSION', '2.6.18', 'file://disable-ubi.patch', '', d)}" diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg-collateral.bbappend b/meta-openvuplus/recipes-devtools/opkg/opkg-collateral.bbappend new file mode 100644 index 0000000..429c37f --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg-collateral.bbappend @@ -0,0 +1,3 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +PR .= "-vuplus0" diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg-collateral/dest b/meta-openvuplus/recipes-devtools/opkg/opkg-collateral/dest new file mode 100644 index 0000000..e041eb7 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg-collateral/dest @@ -0,0 +1,5 @@ +dest root / +dest cf /media/cf/ +dest ram /media/ram/ +dest hdd /media/hdd/ +dest usb /media/usb/ diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch b/meta-openvuplus/recipes-devtools/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch new file mode 100644 index 0000000..4553124 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch @@ -0,0 +1,32 @@ +Upstream-Status: Backport + +From 319d02609992273e887242ed9788db68d3310b6c Mon Sep 17 00:00:00 2001 +From: "pixdamix@gmail.com" + +Date: Thu, 19 Jan 2012 13:52:06 +0000 +Subject: [PATCH 01/10] Fixed opkg losing auto_installed flag on upgrading + +Thanks-to: Christian Hitz + +git-svn-id: http://opkg.googlecode.com/svn/trunk@635 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 +--- + libopkg/opkg_install.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/libopkg/opkg_install.c b/libopkg/opkg_install.c +index 74a2ce1..3925f58 100644 +--- a/libopkg/opkg_install.c ++++ b/libopkg/opkg_install.c +@@ -1449,6 +1449,9 @@ opkg_install_pkg(pkg_t *pkg, int from_upgrade) + /* removing files from old package, to avoid ghost files */ + remove_data_files_and_list(old_pkg); + remove_maintainer_scripts(old_pkg); ++ ++ /* maintain the "Auto-Installed: yes" flag */ ++ pkg->auto_installed = old_pkg->auto_installed; + } + + +-- +1.7.9.5 + diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch b/meta-openvuplus/recipes-devtools/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch new file mode 100644 index 0000000..9e122de --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch @@ -0,0 +1,29 @@ +From 8c00c6be3723a0dcf05a10b5aba8c1c3b1fe4cf7 Mon Sep 17 00:00:00 2001 +From: Andreas Oberritter +Date: Wed, 16 May 2012 23:29:04 +0200 +Subject: [PATCH 02/10] Don't mark Conflicts as Depends + +- Fixes 'whatconflicts' sub-command. + +Signed-off-by: Andreas Oberritter +--- + libopkg/pkg_depends.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c +index 1e14d1f..a61e80e 100644 +--- a/libopkg/pkg_depends.c ++++ b/libopkg/pkg_depends.c +@@ -609,8 +609,8 @@ void buildConflicts(pkg_t * pkg) + + conflicts = pkg->conflicts = xcalloc(pkg->conflicts_count, sizeof(compound_depend_t)); + for (i = 0; i < pkg->conflicts_count; i++) { +- conflicts->type = CONFLICTS; + parseDepends(conflicts, pkg->conflicts_str[i]); ++ conflicts->type = CONFLICTS; + free(pkg->conflicts_str[i]); + conflicts++; + } +-- +1.7.9.5 + diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch b/meta-openvuplus/recipes-devtools/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch new file mode 100644 index 0000000..cfb7268 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch @@ -0,0 +1,107 @@ +From 698fdfccb2b2855fbe73ecad159b7987b49ddded Mon Sep 17 00:00:00 2001 +From: Andreas Oberritter +Date: Thu, 17 May 2012 01:23:43 +0200 +Subject: [PATCH 03/10] Statically link libopkg and libbb + +* Based on https://dev.openwrt.org/browser/trunk/package/opkg/patches/007-force_static.patch + +Signed-off-by: Andreas Oberritter +--- + libbb/Makefile.am | 8 ++++---- + libopkg/Makefile.am | 14 +++----------- + src/Makefile.am | 4 ++-- + tests/Makefile.am | 6 +++--- + 4 files changed, 12 insertions(+), 20 deletions(-) + +diff --git a/libbb/Makefile.am b/libbb/Makefile.am +index 1cc82df..337d94f 100644 +--- a/libbb/Makefile.am ++++ b/libbb/Makefile.am +@@ -2,9 +2,9 @@ HOST_CPU=@host_cpu@ + BUILD_CPU=@build_cpu@ + ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ + +-noinst_LTLIBRARIES = libbb.la ++noinst_LIBRARIES = libbb.a + +-libbb_la_SOURCES = gz_open.c \ ++libbb_a_SOURCES = gz_open.c \ + libbb.h \ + unzip.c \ + wfopen.c \ +@@ -22,5 +22,5 @@ libbb_la_SOURCES = gz_open.c \ + all_read.c \ + mode_string.c + +-libbb_la_CFLAGS = $(ALL_CFLAGS) +-#libbb_la_LDFLAGS = -static ++libbb_a_CFLAGS = $(ALL_CFLAGS) ++#libbb_a_LDFLAGS = -static +diff --git a/libopkg/Makefile.am b/libopkg/Makefile.am +index 043c5c4..5882595 100644 +--- a/libopkg/Makefile.am ++++ b/libopkg/Makefile.am +@@ -38,18 +38,10 @@ if HAVE_SHA256 + opkg_util_sources += sha256.c sha256.h + endif + +-lib_LTLIBRARIES = libopkg.la +-libopkg_la_SOURCES = \ ++noinst_LIBRARIES = libopkg.a ++libopkg_a_SOURCES = \ + $(opkg_libcore_sources) \ + $(opkg_cmd_sources) $(opkg_db_sources) \ + $(opkg_util_sources) $(opkg_list_sources) + +-libopkg_la_LIBADD = $(top_builddir)/libbb/libbb.la $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS) +- +-libopkg_la_LDFLAGS = -version-info 1:0:0 +- +-# make sure we only export symbols that are for public use +-#libopkg_la_LDFLAGS = -export-symbols-regex "^opkg_.*" +- +- +- ++libopkg_a_LIBADD = $(top_builddir)/libbb/libbb.a $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS) +diff --git a/src/Makefile.am b/src/Makefile.am +index efdc19d..bb7a792 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -2,5 +2,5 @@ AM_CFLAGS = -I${top_srcdir}/libopkg ${ALL_CFLAGS} + bin_PROGRAMS = opkg-cl + + opkg_cl_SOURCES = opkg-cl.c +-opkg_cl_LDADD = $(top_builddir)/libopkg/libopkg.la \ +- $(top_builddir)/libbb/libbb.la ++opkg_cl_LDADD = $(top_builddir)/libopkg/libopkg.a \ ++ $(top_builddir)/libbb/libbb.a +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 1a6f565..132c792 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -4,11 +4,11 @@ AM_CFLAGS = $(ALL_CFLAGS) -Wall -g -O3 -I${top_srcdir}/libopkg + #noinst_PROGRAMS = libopkg_test opkg_active_list_test + noinst_PROGRAMS = libopkg_test + +-#opkg_hash_test_LDADD = $(top_builddir)/libbb/libbb.la $(top_builddir)/libopkg/libopkg.la ++#opkg_hash_test_LDADD = $(top_builddir)/libbb/libbb.a $(top_builddir)/libopkg/libopkg.a + #opkg_hash_test_SOURCES = opkg_hash_test.c + #opkg_hash_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir) + +-#opkg_extract_test_LDADD = $(top_builddir)/libbb/libbb.la $(top_builddir)/libopkg/libopkg.la ++#opkg_extract_test_LDADD = $(top_builddir)/libbb/libbb.a $(top_builddir)/libopkg/libopkg.a + #opkg_extract_test_SOURCES = opkg_extract_test.c + #opkg_extract_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir) + +@@ -16,7 +16,7 @@ noinst_PROGRAMS = libopkg_test + #opkg_active_list_test_SOURCES = opkg_active_list_test.c + #opkg_active_list_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir) + +-libopkg_test_LDADD = $(top_builddir)/libopkg/libopkg.la ++libopkg_test_LDADD = $(top_builddir)/libopkg/libopkg.a $(top_builddir)/libbb/libbb.a + libopkg_test_SOURCE = libopkg_test.c + libopkg_test_LDFLAGS = -static + +-- +1.7.9.5 + diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch b/meta-openvuplus/recipes-devtools/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch new file mode 100644 index 0000000..c9b9d6b --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch @@ -0,0 +1,50 @@ +From ca86fc9ad82713e17cd69e92ce2033631fa73675 Mon Sep 17 00:00:00 2001 +From: Andreas Oberritter +Date: Thu, 17 May 2012 01:32:43 +0200 +Subject: [PATCH 04/10] Makefile.am: remove -g and -O compiler flags + +Signed-off-by: Andreas Oberritter +--- + Makefile.am | 2 +- + libbb/Makefile.am | 2 +- + tests/Makefile.am | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 26f2d99..1c6226f 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -6,7 +6,7 @@ SUBDIRS = libbb libopkg src tests utils man + HOST_CPU=@host_cpu@ + BUILD_CPU=@build_cpu@ + OPKGLIBDIR=@opkglibdir@ +-ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ -DLIBDIR=\"@libdir@\" -DOPKGLIBDIR=\"@opkglibdir@\" -DDATADIR=\"@datadir@\" ++ALL_CFLAGS=-Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ -DLIBDIR=\"@libdir@\" -DOPKGLIBDIR=\"@opkglibdir@\" -DDATADIR=\"@datadir@\" + + PATHFINDER_CFLAGS = @PATHFINDER_CFLAGS@ + PATHFINDER_LIBS = @PATHFINDER_LIBS@ +diff --git a/libbb/Makefile.am b/libbb/Makefile.am +index 337d94f..6af5f04 100644 +--- a/libbb/Makefile.am ++++ b/libbb/Makefile.am +@@ -1,6 +1,6 @@ + HOST_CPU=@host_cpu@ + BUILD_CPU=@build_cpu@ +-ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ ++ALL_CFLAGS=-Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ + + noinst_LIBRARIES = libbb.a + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 132c792..4dccb74 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = $(ALL_CFLAGS) -Wall -g -O3 -I${top_srcdir}/libopkg ++AM_CFLAGS = $(ALL_CFLAGS) -Wall -I${top_srcdir}/libopkg + + #noinst_PROGRAMS = opkg_hash_test opkg_extract_test + #noinst_PROGRAMS = libopkg_test opkg_active_list_test +-- +1.7.9.5 + diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch b/meta-openvuplus/recipes-devtools/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch new file mode 100644 index 0000000..1820e52 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch @@ -0,0 +1,48 @@ +From 4a5bc6cbce81497442f79ded5c78389024df0e60 Mon Sep 17 00:00:00 2001 +From: Andreas Oberritter +Date: Thu, 17 May 2012 01:14:23 +0200 +Subject: [PATCH 05/10] pkg_depends: remove unused variables to fix compiler + warnings + +Signed-off-by: Andreas Oberritter +--- + libopkg/pkg_depends.c | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c +index a61e80e..68a81f9 100644 +--- a/libopkg/pkg_depends.c ++++ b/libopkg/pkg_depends.c +@@ -269,13 +269,10 @@ is_pkg_a_replaces(pkg_t *pkg_scout,pkg_t *pkg) + { + int i ; + int replaces_count = pkg->replaces_count; +- abstract_pkg_t **replaces; + + if (pkg->replaces_count==0) // No replaces, it's surely a conflict + return 0; + +- replaces = pkg->replaces; +- + for (i = 0; i < replaces_count; i++) { + if (strcmp(pkg_scout->name,pkg->replaces[i]->name)==0) { // Found + opkg_msg(DEBUG2, "Seems I've found a replace %s %s\n", +@@ -295,7 +292,6 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) + depend_t ** possible_satisfiers; + depend_t * possible_satisfier; + int i, j, k; +- int count; + abstract_pkg_t * ab_pkg; + pkg_t **pkg_scouts; + pkg_t *pkg_scout; +@@ -315,7 +311,6 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) + } + installed_conflicts = pkg_vec_alloc(); + +- count = pkg->conflicts_count; + + + +-- +1.7.9.5 + diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch b/meta-openvuplus/recipes-devtools/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch new file mode 100644 index 0000000..89934f2 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch @@ -0,0 +1,34 @@ +From e2b289330280e9f9fb5dd2cc10c736ca06d273f4 Mon Sep 17 00:00:00 2001 +From: Andreas Oberritter +Date: Thu, 17 May 2012 01:15:15 +0200 +Subject: [PATCH 06/10] pkg_hash_fetch_conflicts: fix possible segfaults + +Signed-off-by: Andreas Oberritter +--- + libopkg/pkg_depends.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c +index 68a81f9..6ff75f1 100644 +--- a/libopkg/pkg_depends.c ++++ b/libopkg/pkg_depends.c +@@ -322,10 +322,14 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) + /* foreach possible satisfier */ + for(j = 0; j < conflicts->possibility_count; j++){ + possible_satisfier = possible_satisfiers[j]; +- if (!possible_satisfier) ++ if (!possible_satisfier) { + opkg_msg(ERROR, "Internal error: possible_satisfier=NULL\n"); +- if (!possible_satisfier->pkg) ++ continue; ++ } ++ if (!possible_satisfier->pkg) { + opkg_msg(ERROR, "Internal error: possible_satisfier->pkg=NULL\n"); ++ continue; ++ } + test_vec = possible_satisfier->pkg->pkgs; + if (test_vec) { + /* pkg_vec found, it is an actual package conflict +-- +1.7.9.5 + diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch b/meta-openvuplus/recipes-devtools/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch new file mode 100644 index 0000000..575c1e1 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch @@ -0,0 +1,94 @@ +From b925a520a63fb291675f707e602d04295236c85b Mon Sep 17 00:00:00 2001 +From: Andreas Oberritter +Date: Thu, 17 May 2012 01:17:52 +0200 +Subject: [PATCH 07/10] pkg_hash_fetch_conflicts: move iteration over + conflicts to subroutine + +Signed-off-by: Andreas Oberritter +--- + libopkg/pkg_depends.c | 46 ++++++++++++++++++++++++---------------------- + 1 file changed, 24 insertions(+), 22 deletions(-) + +diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c +index 6ff75f1..1999b64 100644 +--- a/libopkg/pkg_depends.c ++++ b/libopkg/pkg_depends.c +@@ -284,39 +284,22 @@ is_pkg_a_replaces(pkg_t *pkg_scout,pkg_t *pkg) + + } + +- +-pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) ++static void __pkg_hash_fetch_conflicts(pkg_t * pkg, pkg_vec_t * installed_conflicts) + { +- pkg_vec_t * installed_conflicts, * test_vec; ++ pkg_vec_t * test_vec; + compound_depend_t * conflicts; + depend_t ** possible_satisfiers; + depend_t * possible_satisfier; + int i, j, k; +- abstract_pkg_t * ab_pkg; + pkg_t **pkg_scouts; + pkg_t *pkg_scout; + +- /* +- * this is a setup to check for redundant/cyclic dependency checks, +- * which are marked at the abstract_pkg level +- */ +- if(!(ab_pkg = pkg->parent)){ +- opkg_msg(ERROR, "Internal error: %s not in hash table\n", pkg->name); +- return (pkg_vec_t *)NULL; +- } +- + conflicts = pkg->conflicts; +- if(!conflicts){ +- return (pkg_vec_t *)NULL; +- } +- installed_conflicts = pkg_vec_alloc(); +- +- +- ++ if(!conflicts) ++ return; + + /* foreach conflict */ + for(i = 0; i < pkg->conflicts_count; i++){ +- + possible_satisfiers = conflicts->possibilities; + + /* foreach possible satisfier */ +@@ -352,11 +335,30 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) + } + conflicts++; + } ++} ++ ++pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) ++{ ++ pkg_vec_t * installed_conflicts; ++ abstract_pkg_t * ab_pkg; ++ ++ /* ++ * this is a setup to check for redundant/cyclic dependency checks, ++ * which are marked at the abstract_pkg level ++ */ ++ if(!(ab_pkg = pkg->parent)){ ++ opkg_msg(ERROR, "Internal error: %s not in hash table\n", pkg->name); ++ return (pkg_vec_t *)NULL; ++ } ++ ++ installed_conflicts = pkg_vec_alloc(); ++ ++ __pkg_hash_fetch_conflicts(pkg, installed_conflicts); + + if (installed_conflicts->len) + return installed_conflicts; + pkg_vec_free(installed_conflicts); +- return (pkg_vec_t *)NULL; ++ return (pkg_vec_t *)NULL; + } + + int version_constraints_satisfied(depend_t * depends, pkg_t * pkg) +-- +1.7.9.5 + diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch b/meta-openvuplus/recipes-devtools/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch new file mode 100644 index 0000000..e958289 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch @@ -0,0 +1,49 @@ +From 53de52b533ee30676d051ee941cfc0a517e9190e Mon Sep 17 00:00:00 2001 +From: Andreas Oberritter +Date: Thu, 17 May 2012 01:18:42 +0200 +Subject: [PATCH 08/10] pkg_hash_fetch_conflicts: take into account conflicts + of installed packages + +Signed-off-by: Andreas Oberritter +--- + libopkg/pkg_depends.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c +index 1999b64..f237733 100644 +--- a/libopkg/pkg_depends.c ++++ b/libopkg/pkg_depends.c +@@ -337,6 +337,22 @@ static void __pkg_hash_fetch_conflicts(pkg_t * pkg, pkg_vec_t * installed_confli + } + } + ++static void __pkg_hash_fetch_conflictees(pkg_t *pkg, pkg_vec_t *installed_conflicts) ++{ ++ int i; ++ ++ pkg_vec_t *available_pkgs = pkg_vec_alloc(); ++ pkg_hash_fetch_all_installed(available_pkgs); ++ ++ for (i = 0; i < available_pkgs->len; i++) { ++ pkg_t *cpkg = available_pkgs->pkgs[i]; ++ if (pkg_conflicts(cpkg, pkg) && !is_pkg_in_pkg_vec(installed_conflicts, cpkg)) ++ pkg_vec_insert(installed_conflicts, cpkg); ++ } ++ ++ pkg_vec_free(available_pkgs); ++} ++ + pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) + { + pkg_vec_t * installed_conflicts; +@@ -354,6 +370,7 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg) + installed_conflicts = pkg_vec_alloc(); + + __pkg_hash_fetch_conflicts(pkg, installed_conflicts); ++ __pkg_hash_fetch_conflictees(pkg, installed_conflicts); + + if (installed_conflicts->len) + return installed_conflicts; +-- +1.7.9.5 + diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch b/meta-openvuplus/recipes-devtools/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch new file mode 100644 index 0000000..bf61aef --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch @@ -0,0 +1,100 @@ +From 70d10c10288da23755055c881bea01b61a2d4df7 Mon Sep 17 00:00:00 2001 +From: Andreas Oberritter +Date: Thu, 17 May 2012 22:57:35 +0200 +Subject: [PATCH 09/10] Revert "Add Recommended packages to the + depended_upon_by field." + +This reverts commit ac2222f7d6514fb403ce0848f6812a22a48f75c7. +--- + libopkg/pkg_depends.c | 70 ++++++++++++++++++++++--------------------------- + 1 file changed, 32 insertions(+), 38 deletions(-) + +diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c +index f237733..ec60b99 100644 +--- a/libopkg/pkg_depends.c ++++ b/libopkg/pkg_depends.c +@@ -787,49 +787,43 @@ pkg_depend_str(pkg_t *pkg, int idx) + return str; + } + ++/* ++ * WARNING: This function assumes pre_depends and depends are at the ++ * start of the pkg->depends array. ++ */ + void buildDependedUponBy(pkg_t * pkg, abstract_pkg_t * ab_pkg) + { +- compound_depend_t * depends; +- int count, othercount; +- int i, j; +- abstract_pkg_t * ab_depend; +- abstract_pkg_t ** temp; +- +- count = pkg->pre_depends_count + +- pkg->depends_count + +- pkg->recommends_count + +- pkg->suggests_count; +- +- for (i = 0; i < count; i++) { +- depends = &pkg->depends[i]; +- if (depends->type != PREDEPEND +- && depends->type != DEPEND +- && depends->type != RECOMMEND) +- continue; +- for (j = 0; j < depends->possibility_count; j++) { +- ab_depend = depends->possibilities[j]->pkg; +- if (!ab_depend->depended_upon_by) { +- ab_depend->depended_upon_by = +- xcalloc(1, sizeof(abstract_pkg_t *)); +- } ++ compound_depend_t * depends; ++ int count, othercount; ++ int i, j; ++ abstract_pkg_t * ab_depend; ++ abstract_pkg_t ** temp; + +- temp = ab_depend->depended_upon_by; +- othercount = 1; +- while (*temp) { +- temp++; +- othercount++; +- } +- *temp = ab_pkg; ++ count = pkg->pre_depends_count + pkg->depends_count; ++ depends = pkg->depends; + +- ab_depend->depended_upon_by = +- xrealloc(ab_depend->depended_upon_by, +- (othercount + 1) * sizeof(abstract_pkg_t *)); ++ for (i = 0; i < count; i++) { ++ for (j = 0; j < depends->possibility_count; j++){ ++ ab_depend = depends->possibilities[j]->pkg; ++ if(!ab_depend->depended_upon_by) ++ ab_depend->depended_upon_by = xcalloc(1, sizeof(abstract_pkg_t *)); ++ ++ temp = ab_depend->depended_upon_by; ++ othercount = 1; ++ while(*temp){ ++ temp++; ++ othercount++; ++ } ++ *temp = ab_pkg; + +- /* the array may have been moved by realloc */ +- temp = ab_depend->depended_upon_by + othercount; +- *temp = NULL; +- } +- } ++ ab_depend->depended_upon_by = xrealloc(ab_depend->depended_upon_by, ++ (othercount + 1) * sizeof(abstract_pkg_t *)); ++ /* the array may have moved */ ++ temp = ab_depend->depended_upon_by + othercount; ++ *temp = NULL; ++ } ++ depends++; ++ } + } + + static depend_t * depend_init(void) +-- +1.7.9.5 + diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch b/meta-openvuplus/recipes-devtools/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch new file mode 100644 index 0000000..3bc2e5d --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch @@ -0,0 +1,33 @@ +From 719cc4ab765c008bd7e4f2d085692657c33d171e Mon Sep 17 00:00:00 2001 +From: Andreas Oberritter +Date: Mon, 21 May 2012 14:05:37 +0200 +Subject: [PATCH 10/10] opkg_remove: auto-delete .pyo files + +Signed-off-by: Andreas Oberritter +--- + libopkg/opkg_remove.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/libopkg/opkg_remove.c b/libopkg/opkg_remove.c +index 5f4219b..4320dc3 100644 +--- a/libopkg/opkg_remove.c ++++ b/libopkg/opkg_remove.c +@@ -375,8 +375,15 @@ remove_data_files_and_list(pkg_t *pkg) + } + + if (!conf->noaction) { ++ size_t l = strlen(file_name); + opkg_msg(INFO, "Deleting %s.\n", file_name); + unlink(file_name); ++ if (l >= 3 && !strcmp(&file_name[l - 3], ".py")) { ++ char pyo_file_name[l + 2]; ++ strcpy(pyo_file_name, file_name); ++ strcat(pyo_file_name, "o"); ++ unlink(pyo_file_name); ++ } + } else + opkg_msg(INFO, "Not deleting %s. (noaction)\n", + file_name); +-- +1.7.9.5 + diff --git a/meta-openvuplus/recipes-devtools/opkg/opkg_svn.bbappend b/meta-openvuplus/recipes-devtools/opkg/opkg_svn.bbappend new file mode 100644 index 0000000..e5a54e4 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/opkg/opkg_svn.bbappend @@ -0,0 +1,14 @@ +PR .= "-vuplus0" + +SRC_URI += "file://0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch \ + file://0002-Don-t-mark-Conflicts-as-Depends.patch \ + file://0003-Statically-link-libopkg-and-libbb.patch \ + file://0004-Makefile.am-remove-g-and-O-compiler-flags.patch \ + file://0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch \ + file://0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch \ + file://0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch \ + file://0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch \ + file://0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch \ + file://0010-opkg_remove-auto-delete-.pyo-files.patch" + +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" diff --git a/meta-openvuplus/recipes-devtools/python/python-coherence_git.bb b/meta-openvuplus/recipes-devtools/python/python-coherence_git.bb new file mode 100644 index 0000000..202e827 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-coherence_git.bb @@ -0,0 +1,33 @@ +SUMMARY = "Python UPnP framework" +HOMEPAGE = "http://coherence.beebits.net/" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENCE;md5=3f7c147addd67ce1d53239c68a6b7022" +DEPENDS = "libxml2" +SRCREV = "f4864b1f63866d738c18c02dcb16d824a049880c" +PV = "0.6.7" +PR = "r4" + +SRC_URI = "git://github.com/sreichholf/coherence.git;protocol=git" + +S = "${WORKDIR}/git/Coherence" + +inherit setuptools + +do_configure_prepend() { + sed -e 's,^from coherence import __version__$,__version__ = "${PV}",' -i setup.py +} +do_install_append() { + rm ${D}${bindir}/applet-coherence + rm -r ${D}${PYTHON_SITEPACKAGES_DIR}/Coherence-${PV}-*.egg-info + rm -r ${D}${PYTHON_SITEPACKAGES_DIR}/coherence/test + rm -r ${D}${PYTHON_SITEPACKAGES_DIR}/misc/Desktop-Applet +} + +RDEPENDS_${PN} = "python-xmlrpc python-twisted-web" + +PACKAGES =+ "${PN}-bin" + +RDEPENDS_${PN}-bin = "${PN} python-zopeinterface" + +FILES_${PN}-bin = "${bindir} ${PYTHON_SITEPACKAGES_DIR}/misc/*.py" diff --git a/meta-openvuplus/recipes-devtools/python/python-daap/python-daap.patch b/meta-openvuplus/recipes-devtools/python/python-daap/python-daap.patch new file mode 100644 index 0000000..8fb9ae5 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-daap/python-daap.patch @@ -0,0 +1,57 @@ +--- python-daap-0.7.1/daap.py 2007-09-10 20:35:45.000000000 +0200 ++++ python-daap-0.7.1/daap.py 2010-11-03 19:39:09.000000000 +0100 +@@ -417,18 +417,21 @@ + # this returns an HTTP response object + response = self._get_response(r, params) + status = response.status +- content = response.read() +- # if we got gzipped data base, gunzip it. +- if response.getheader("Content-Encoding") == "gzip": +- log.debug("gunzipping data") +- old_len = len(content) +- compressedstream = StringIO( content ) +- gunzipper = gzip.GzipFile(fileobj=compressedstream) +- content = gunzipper.read() +- log.debug("expanded from %s bytes to %s bytes", old_len, len(content)) +- # close this, we're done with it ++ #Dr.Best --> fix ++ if status == 200: ++ content = response.read() ++ # if we got gzipped data base, gunzip it. ++ if response.getheader("Content-Encoding") == "gzip": ++ log.debug("gunzipping data") ++ old_len = len(content) ++ compressedstream = StringIO( content ) ++ gunzipper = gzip.GzipFile(fileobj=compressedstream) ++ content = gunzipper.read() ++ log.debug("expanded from %s bytes to %s bytes", old_len, len(content)) ++ # close this, we're done with it + response.close() + ++ + if status == 401: + raise DAAPError('DAAPClient: %s: auth required'%r) + elif status == 403: +@@ -511,7 +514,7 @@ + # the atoms we want. Making this list smaller reduces memory footprint, + # and speeds up reading large libraries. It also reduces the metainformation + # available to the client. +-daap_atoms = "dmap.itemid,dmap.itemname,daap.songalbum,daap.songartist,daap.songformat,daap.songtime,daap.songsize,daap.songgenre,daap.songyear,daap.songtracknumber" ++daap_atoms = "dmap.itemid,dmap.itemname,daap.songalbum,daap.songartist,daap.songformat,daap.songtime,daap.songsize,daap.songgenre,daap.songyear,daap.songtracknumber,daap.songtrackcount,daap.songbitrate" + + class DAAPDatabase(object): + +@@ -560,7 +563,12 @@ + 'id':'miid', + 'type':'asfm', + 'time':'astm', +- 'size':'assz'} ++ 'size':'assz', ++ 'year':'asyr', ++ 'genre':'asgn', ++ 'tracknr': 'astn', ++ 'trackcount': 'astc', ++ 'bitrate': 'asbr'} + + def __init__(self, database, atom): + self.database = database diff --git a/meta-openvuplus/recipes-devtools/python/python-daap_0.7.1.bb b/meta-openvuplus/recipes-devtools/python/python-daap_0.7.1.bb new file mode 100644 index 0000000..994b3a7 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-daap_0.7.1.bb @@ -0,0 +1,17 @@ +SUMMARY = "A pure Python DAAP client implementation" +SECTION = "devel/python" +PRIORITY = "optional" +LICENSE = "LGPLv2.1" +LIC_FILES_CHKSUM = "file://LICENSE;md5=fbc093901857fcd118f065f900982c24" +PR = "r3" + +inherit distutils + +SRC_URI = "http://jerakeen.org/files/PythonDaap-${PV}.tar.gz" +S = "${WORKDIR}/PythonDaap-${PV}" + +RDEPENDS_${PN} = "python-compression" + + +SRC_URI[md5sum] = "b3db3d60b0ee83f5f23101d2c3bb99e0" +SRC_URI[sha256sum] = "ea1d3a8141654781a0df31e6607c4722436fa33eb2e9934492770b3b61be8122" diff --git a/meta-openvuplus/recipes-devtools/python/python-daap_0.7.1.bbappend b/meta-openvuplus/recipes-devtools/python/python-daap_0.7.1.bbappend new file mode 100644 index 0000000..26d705e --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-daap_0.7.1.bbappend @@ -0,0 +1,5 @@ +PR .= "-vuplus0" + +SRC_URI += " \ + file://python-daap.patch \ +" diff --git a/meta-openvuplus/recipes-devtools/python/python-flickrapi_1.4.2.bb b/meta-openvuplus/recipes-devtools/python/python-flickrapi_1.4.2.bb new file mode 100644 index 0000000..e0c0db9 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-flickrapi_1.4.2.bb @@ -0,0 +1,31 @@ +SUMMARY = "The official Python interface to the Flickr API" +HOMEPAGE = "http://stuvel.eu/flickrapi" +SECTION = "devel/python" +LICENSE = "PSF" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d54e175a4083eea51ac31acaff818df5" +PRIORITY = "optional" +PR = "r3" + +SRC_URI = "http://pypi.python.org/packages/source/f/flickrapi/flickrapi-${PV}.zip" +SRC_URI[md5sum] = "90dca08a45968b18da0894887f3e59b3" +SRC_URI[sha256sum] = "ac9304f571175b8af4fc2ee17d3e110847b526640665ca53d97bbf9df98329bc" + +S = "${WORKDIR}/flickrapi-${PV}" + +inherit distutils + +# NOTE: the package only offers documentation as data, so fix the path here +# instead of trying to move all files retroactively. +DISTUTILS_INSTALL_ARGS += "--install-data=${D}/${docdir}/${PN}" + +# NOTE: requires python-misc for webbrowser and subprocess as missing dependency of the webbrowser +RDEPENDS_${PN} = "\ + python-core \ + python-elementtree \ + python-logging \ + python-misc \ + python-netclient \ + python-subprocess \ + python-threading \ + python-xml \ +" diff --git a/meta-openvuplus/recipes-devtools/python/python-gdata_2.0.14.bb b/meta-openvuplus/recipes-devtools/python/python-gdata_2.0.14.bb new file mode 100644 index 0000000..8c0ab29 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-gdata_2.0.14.bb @@ -0,0 +1,21 @@ +SUMMARY = "Google Data APIs Python Client Library" +HOMEPAGE = "http://code.google.com/p/gdata-python-client/" +SECTION = "devel/python" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://README.txt;beginline=1;endline=13;md5=7a713fc5eed20ac1904c2efe0b816a33" +RDEPENDS = "python-elementtree" +RDEPENDS_${PN}-tests = "${PN}" +PR = "r2" + +SRC_URI = "http://gdata-python-client.googlecode.com/files/gdata-${PV}.tar.gz;name=archive" +SRC_URI[archive.md5sum] = "29cf394b4f75aa4fae8c1b59079f2a02" +SRC_URI[archive.sha256sum] = "ba291d2b9d36a0f1b1b31a5a3ac3ba11f1bcce21c915a6ec78d109a43dafb1b0" + +S = "${WORKDIR}/gdata-${PV}" + +inherit distutils + +PACKAGES =+ "${PN}-tests" + +FILES_${PN}-tests = "${libdir}/${PYTHON_DIR}/site-packages/gdata/test*" +FILES_${PN} += "${datadir}" diff --git a/meta-openvuplus/recipes-devtools/python/python-mutagen/patch.diff b/meta-openvuplus/recipes-devtools/python/python-mutagen/patch.diff new file mode 100644 index 0000000..73a112c --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-mutagen/patch.diff @@ -0,0 +1,12 @@ +diff -Naur mutagen/easymp4.py mutagen_pach/easymp4.py +--- mutagen/mutagen/easymp4.py 2009-08-10 12:57:55.000000000 +0200 ++++ mutagen/mutagen/easymp4.py 2010-01-11 19:24:05.000000000 +0100 +@@ -204,7 +204,7 @@ + '\xa9cmt': 'comment', + 'desc': 'description', + '\xa9grp': 'grouping', +- '\xa9grn': 'genre', ++ '\xa9gen': 'genre', + 'cprt': 'copyright', + 'soal': 'albumsort', + 'soaa': 'albumartistsort', diff --git a/meta-openvuplus/recipes-devtools/python/python-mutagen_1.18.bb b/meta-openvuplus/recipes-devtools/python/python-mutagen_1.18.bb new file mode 100644 index 0000000..b785e2a --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-mutagen_1.18.bb @@ -0,0 +1,22 @@ +SUMMARY = "Module for manipulating ID3 (v1 + v2) tags in Python" +SECTION = "devel/python" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" +SRCNAME = "mutagen" +PR = "r2" + +DEPENDS = "python" +RDEPENDS = "python-shell" + +SRC_URI = "http://mutagen.googlecode.com/files/mutagen-${PV}.tar.gz \ + file://patch.diff \ +" + +SRC_URI[md5sum] = "0c2cd954e4bacd79fadd45afc4acce4c" +SRC_URI[sha256sum] = "30b6147baf59ab3609939acf49a1a1c73b15d8b1c637a01bfee89da7feea0d6c" + +S = "${WORKDIR}/mutagen-${PV}" + +inherit distutils + + diff --git a/meta-openvuplus/recipes-devtools/python/python-native_2.7.2.bbappend b/meta-openvuplus/recipes-devtools/python/python-native_2.7.2.bbappend new file mode 100644 index 0000000..04139f0 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-native_2.7.2.bbappend @@ -0,0 +1,2 @@ +RPROVIDES += "python-pickle-native python-pprint-native" + diff --git a/meta-openvuplus/recipes-devtools/python/python-pycrypto/no-usr-include.patch b/meta-openvuplus/recipes-devtools/python/python-pycrypto/no-usr-include.patch new file mode 100644 index 0000000..4b74b5a --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-pycrypto/no-usr-include.patch @@ -0,0 +1,11 @@ +--- pycrypto-2.5/setup.py.orig 2012-03-13 17:29:36.215553438 +0100 ++++ pycrypto-2.5/setup.py 2012-03-13 17:29:46.339553341 +0100 +@@ -366,7 +366,7 @@ + 'ext_modules': plat_ext + [ + # _fastmath (uses GNU mp library) + Extension("Crypto.PublicKey._fastmath", +- include_dirs=['src/','/usr/include/'], ++ include_dirs=['src/'], + libraries=['gmp'], + sources=["src/_fastmath.c"]), + diff --git a/meta-openvuplus/recipes-devtools/python/python-pycrypto_2.5.bb b/meta-openvuplus/recipes-devtools/python/python-pycrypto_2.5.bb new file mode 100644 index 0000000..b7a4811 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-pycrypto_2.5.bb @@ -0,0 +1,17 @@ +SUMMARY = "A collection of cryptographic algorithms and protocols" +SECTION = "devel/python" +LICENSE = "PD & Python-2.0" +LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=35f354d199e8cb7667b059a23578e63d" +DEPENDS = "gmp" +PR = "r2" + +SRC_URI = "http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-${PV}.tar.gz \ + file://no-usr-include.patch" +SRC_URI[md5sum] = "783e45d4a1a309e03ab378b00f97b291" +SRC_URI[sha256sum] = "e950a78184e2a7defccf5d45e0c29c1e9edeb29984433f0d110a21e9631e38de" + +S = "${WORKDIR}/pycrypto-${PV}" + +inherit autotools distutils + +BBCLASSEXTEND = "native" diff --git a/meta-openvuplus/recipes-devtools/python/python-transmissionrpc_hg.bb b/meta-openvuplus/recipes-devtools/python/python-transmissionrpc_hg.bb new file mode 100644 index 0000000..01db4e3 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-transmissionrpc_hg.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "Transmission RPC is a python module that can communicate with the bittorrent client Transmission through json-rpc" +HOMEPAGE = "http://bitbucket.org/blueluna/transmissionrpc/wiki/Home" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=725cfd8eb1ec903074184b7edf9379c9" +SRCREV = "4fe71eb818d0" +PV = "0.7+hg${SRCREV}" +PRIORITY = "optional" +PR = "r1" + +SRC_URI = "hg://bitbucket.org/blueluna;proto=http;module=transmissionrpc;rev=${SRCREV}" + +S = "${WORKDIR}/transmissionrpc" + +inherit setuptools + +RDEPENDS_${PN} = "python-simplejson" diff --git a/meta-openvuplus/recipes-devtools/python/python-twisted_12.0.0.bb b/meta-openvuplus/recipes-devtools/python/python-twisted_12.0.0.bb new file mode 100644 index 0000000..a4314f7 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-twisted_12.0.0.bb @@ -0,0 +1,237 @@ +DESCRIPTION = "Twisted is an event-driven networking framework written in Python and licensed under the LGPL. \ +Twisted supports TCP, UDP, SSL/TLS, multicast, Unix sockets, a large number of protocols \ +(including HTTP, NNTP, IMAP, SSH, IRC, FTP, and others), and much more." +HOMEPAGE = "http://www.twistedmatrix.com" +SECTION = "console/network" + +#twisted/topfiles/NEWS:655: - Relicensed: Now under the MIT license, rather than LGPL. +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;beginline=40;md5=3fced11d6df719b47505837a51c16ae5" + +SRC_URI = "http://twistedmatrix.com/Releases/Twisted/12.0/Twisted-${PV}.tar.bz2" +SRC_URI[md5sum] = "cf49a8676c21c50faf1b42b528049471" +SRC_URI[sha256sum] = "e5561c9714583fd052ea9e0b10331609a719b3878f9d2593e4c57eab0ba0effd" + +S = "${WORKDIR}/Twisted-${PV}" +PR = "r2" + +inherit setuptools + +do_install_append() { + # remove some useless files before packaging + find ${D} -name "*.bat" -o -name "*.c" -o -name "*.h" -exec rm {} \; +} + +PACKAGES += "\ + ${PN}-zsh \ + ${PN}-test \ + ${PN}-protocols \ + ${PN}-bin \ + ${PN}-conch \ + ${PN}-lore \ + ${PN}-mail \ + ${PN}-names \ + ${PN}-news \ + ${PN}-runner \ + ${PN}-web \ + ${PN}-words \ + ${PN}-flow \ + ${PN}-pair \ + ${PN}-core \ +" + +RDEPENDS_${PN} += "\ + ${PN}-bin \ + ${PN}-conch \ + ${PN}-lore \ + ${PN}-mail \ + ${PN}-names \ + ${PN}-news \ + ${PN}-runner \ + ${PN}-web \ + ${PN}-words \ +" + +ALLOW_EMPTY_${PN} = "1" +FILES_${PN} = "" + +FILES_${PN}-test = " \ + ${libdir}/${PYTHON_DIR}/site-packages/twisted/test \ + ${libdir}/${PYTHON_DIR}/site-packages/twisted/*/test \ +" +RDEPENDS_${PN}-test = "${PN}" + +FILES_${PN}-protocols = " \ + ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/ \ +" + +FILES_${PN}-zsh = " \ + ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zsh \ + ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zshcomp.* \ +" + +FILES_${PN}-bin = " \ + ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/_c_urlarg.so \ + ${libdir}/${PYTHON_DIR}/site-packages/twisted/spread/cBanana.so \ +" + +FILES_${PN}-conch = " \ + ${bindir}/ckeygen \ + ${bindir}/tkconch \ + ${bindir}/conch \ + ${bindir}/conchftp \ + ${bindir}/cftp \ + ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_conch.py* \ + ${libdir}/${PYTHON_DIR}/site-packages/twisted/conch \ +" +RDEPENDS_${PN}-conch = "${PN}-core ${PN}-protocols" + +FILES_${PN}-core = " \ +${bindir}/manhole \ +${bindir}/mktap \ +${bindir}/twistd \ +${bindir}/tap2deb \ +${bindir}/tap2rpm \ +${bindir}/tapconvert \ +${bindir}/tkmktap \ +${bindir}/trial \ +${bindir}/easy_install* \ +${bindir}/pyhtmlizer \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/*.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__init__.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/notestplugin.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/testplugin.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_ftp.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_inet.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_manhole.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_portforward.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_socks.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_telnet.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_trial.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/dropin.cache \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/application \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/cred \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/enterprise \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/internet \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/manhole \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/manhole \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/persisted \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols\ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python\ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/timeoutqueue.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/filepath.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dxprofile.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/plugin.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/htmlizer.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/__init__.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dispatch.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/hook.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/threadpool.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/otp.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/usage.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/roots.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/versions.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/urlpath.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/util.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/components.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/logfile.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/runtime.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/reflect.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/context.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/threadable.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/rebuild.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/failure.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/lockfile.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/formmethod.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/finalize.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/win32.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dist.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/shortcut.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zipstream.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/release.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/syslog.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/log.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/compat.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zshcomp.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/procutils.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/text.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_twisted_zsh_stub \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_epoll.so \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_initgroups.so \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/scripts/ \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/spread/ \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/tap/ \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/trial/ \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/__init__.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/_version.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/copyright.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/im.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/*.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/python/*.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/*.py* \ +" +RDEPENDS_${PN}-core = "python-core python-zopeinterface" + +FILES_${PN}-lore = " \ +${bindir}/bookify \ +${bindir}/lore \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_lore.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/lore \ +" +RDEPENDS_${PN}-lore = "${PN}-core" + +FILES_${PN}-mail = " \ +${bindir}/mailmail \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_mail.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/mail \ +" +RDEPENDS_${PN}-mail = "${PN}-core ${PN}-protocols" + +FILES_${PN}-names = " \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_names.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/names \ +" +RDEPENDS_${PN}-names = "${PN}-core" + +FILES_${PN}-news = " \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_news.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/news \ +" +RDEPENDS_${PN}-news = "${PN}-core ${PN}-protocols" + +FILES_${PN}-runner = " \ +${libdir}/site-packages/twisted/runner/portmap.so \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/runner\ +" +RDEPENDS_${PN}-runner = "${PN}-core ${PN}-protocols" + +FILES_${PN}-web = " \ +${bindir}/websetroot \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_web.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/web\ +" +RDEPENDS_${PN}-web += "${PN}-core ${PN}-protocols" + +FILES_${PN}-words = " \ +${bindir}/im \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_words.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/words\ +" +RDEPENDS_${PN}-words += "${PN}-core" + +FILES_${PN}-flow = " \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_flow.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/flow \" +RDEPENDS_${PN}-flow += "${PN}-core" + +FILES_${PN}-pair = " \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_pair.py* \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/pair \ +" +RDEPENDS_${PN}-pair += "${PN}-core" + +FILES_${PN}-dbg += " \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/*/.debug \ +${libdir}/${PYTHON_DIR}/site-packages/twisted/*/*/.debug \ +" +RDEPENDS_${PN}-dbg = "${PN}" diff --git a/meta-openvuplus/recipes-devtools/python/python-wifi_0.5.0.bb b/meta-openvuplus/recipes-devtools/python/python-wifi_0.5.0.bb new file mode 100644 index 0000000..e831a74 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python-wifi_0.5.0.bb @@ -0,0 +1,29 @@ +SUMMARY = "Provides access to Linux Wireless Extensions" +HOMEPAGE = "http://pythonwifi.wikispot.org/" +SECTION = "devel/python" +LICENSE = "LGPLv2+" +LICENSE_${PN}-examples = "GPLv2+" +LIC_FILES_CHKSUM = "file://README;beginline=56;endline=57;md5=31ebd3ff22b6f3c0160a143e0c4a98a3 \ + file://examples/iwconfig.py;beginline=1;endline=20;md5=60fd41501905b3e20e9065995edfc0cf \ + file://pythonwifi/iwlibs.py;beginline=1;endline=22;md5=679475d61cc083a24158bb8b473f0c6f" +RDEPENDS_${PN} = "python-ctypes python-datetime" +PR = "r2" + +SRC_URI = "http://download.berlios.de/pythonwifi/${P}.tar.bz2" +SRC_URI[md5sum] = "8fe7fd0a4edce1f9bedaff4acb7fd500" +SRC_URI[sha256sum] = "3e3f645d37ab20450f60c785cec5f21b330f28a6c46c7c1b0898305dd7a34b26" + +inherit setuptools + +do_install_append() { + install -d ${D}${docdir}/${PN} + mv ${D}${datadir}/README ${D}${docdir}/${PN} + mv ${D}${datadir}/INSTALL ${D}${docdir}/${PN} + mv ${D}${datadir}/docs/* ${D}${docdir}/${PN} + install -d ${D}${sbindir} + mv ${D}${datadir}/examples/* ${D}${sbindir} +} + +PACKAGES =+ "${PN}-examples" + +FILES_${PN}-examples = "${sbindir}" diff --git a/meta-openvuplus/recipes-devtools/python/python/ctypes-error-handling-fix.patch b/meta-openvuplus/recipes-devtools/python/python/ctypes-error-handling-fix.patch new file mode 100644 index 0000000..5e07082 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python/ctypes-error-handling-fix.patch @@ -0,0 +1,40 @@ +--- a/Modules/_ctypes/_ctypes.c 2012-01-26 15:41:30.000000000 +0100 ++++ b/Modules/_ctypes/_ctypes.c 2012-01-26 15:44:41.046977137 +0100 +@@ -602,10 +602,16 @@ + #ifdef __CYGWIN__ + /* dlerror() isn't very helpful on cygwin */ + PyErr_Format(PyExc_ValueError, +- "symbol '%s' not found (%s) ", ++ "symbol '%s' not found", + name); + #else +- PyErr_SetString(PyExc_ValueError, ctypes_dlerror()); ++ const char *err = ctypes_dlerror(); ++ if (!err) ++ PyErr_Format(PyExc_ValueError, ++ "symbol '%s' not found", ++ name); ++ else ++ PyErr_SetString(PyExc_ValueError, err); + #endif + return NULL; + } +@@ -3290,10 +3296,16 @@ + #ifdef __CYGWIN__ + /* dlerror() isn't very helpful on cygwin */ + PyErr_Format(PyExc_AttributeError, +- "function '%s' not found (%s) ", ++ "function '%s' not found", + name); + #else +- PyErr_SetString(PyExc_AttributeError, ctypes_dlerror()); ++ const char *err = ctypes_dlerror(); ++ if (!err) ++ PyErr_Format(PyExc_AttributeError, ++ "function '%s' not found", ++ name); ++ else ++ PyErr_SetString(PyExc_AttributeError, err); + #endif + return NULL; + } diff --git a/meta-openvuplus/recipes-devtools/python/python/fix_pthread_site.patch b/meta-openvuplus/recipes-devtools/python/python/fix_pthread_site.patch new file mode 100644 index 0000000..d392060 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python/fix_pthread_site.patch @@ -0,0 +1,38 @@ +--- configure.in.org 2008-05-01 12:40:58.000000000 +0200 ++++ configure.in 2008-05-01 12:39:39.000000000 +0200 +@@ -998,7 +999,7 @@ + # so we need to run a program to see whether it really made the + # function available. + AC_MSG_CHECKING(whether $CC accepts -pthread) +-AC_CACHE_VAL(ac_cv_thread, ++AC_CACHE_VAL(ac_cv_pthread, + [ac_save_cc="$CC" + CC="$CC -pthread" + AC_TRY_RUN([ +@@ -1023,11 +1024,11 @@ + + # If we have set a CC compiler flag for thread support then + # check if it works for CXX, too. +-ac_cv_cxx_thread=no + if test ! -z "$CXX" + then + AC_MSG_CHECKING(whether $CXX also accepts flags for thread support) +-ac_save_cxx="$CXX" ++AC_CACHE_VAL(ac_cv_cxx_thread, ++[ac_save_cxx="$CXX" + + if test "$ac_cv_kpthread" = "yes" + then +@@ -1056,9 +1057,11 @@ + fi + rm -fr conftest* + fi ++CXX="$ac_save_cxx"]) + AC_MSG_RESULT($ac_cv_cxx_thread) ++else ++ ac_cv_cxx_thread=no + fi +-CXX="$ac_save_cxx" + + dnl # check for ANSI or K&R ("traditional") preprocessor + dnl AC_MSG_CHECKING(for C preprocessor type) diff --git a/meta-openvuplus/recipes-devtools/python/python/no-ldconfig.patch b/meta-openvuplus/recipes-devtools/python/python/no-ldconfig.patch new file mode 100644 index 0000000..fff1ccd --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python/no-ldconfig.patch @@ -0,0 +1,23 @@ +Fixes exception on 'import uuid' if ldconfig is unavailable. + +diff -Naur Python-2.6.7.orig/Lib/ctypes/util.py Python-2.6.7/Lib/ctypes/util.py +--- Python-2.6.7.orig/Lib/ctypes/util.py 2010-03-20 03:11:16.000000000 +0100 ++++ Python-2.6.7/Lib/ctypes/util.py 2012-01-12 15:26:37.562726637 +0100 +@@ -204,7 +204,16 @@ + return res.group(1) + + def find_library(name): +- return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) ++ from glob import glob ++ paths = ['/lib', '/usr/lib'] ++ if os.environ.has_key('LD_LIBRARY_PATH'): ++ paths = os.environ['LD_LIBRARY_PATH'].split(':') + paths ++ for path in paths: ++ for lib in glob("%s/lib%s.so.*" % (path, name)): ++ rpath = os.path.realpath(lib) ++ if os.path.isfile(rpath): ++ return rpath ++ return None + + ################################################################ + # test code diff --git a/meta-openvuplus/recipes-devtools/python/python/some_configure_fixes.patch b/meta-openvuplus/recipes-devtools/python/python/some_configure_fixes.patch new file mode 100644 index 0000000..eced413 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python/some_configure_fixes.patch @@ -0,0 +1,32 @@ +--- configure.in 2008-02-13 20:17:17.000000000 +0100 ++++ configure.in 2008-10-21 22:45:31.000000000 +0200 +@@ -3369,27 +3369,9 @@ + AC_MSG_RESULT(no) + ) + +-AC_MSG_CHECKING(for /dev/ptmx) ++AC_CHECK_FILE(/dev/ptmx, AC_DEFINE(HAVE_DEV_PTMX, 1, [Define if we have /dev/ptmx.])) + +-if test -r /dev/ptmx +-then +- AC_MSG_RESULT(yes) +- AC_DEFINE(HAVE_DEV_PTMX, 1, +- [Define if we have /dev/ptmx.]) +-else +- AC_MSG_RESULT(no) +-fi +- +-AC_MSG_CHECKING(for /dev/ptc) +- +-if test -r /dev/ptc +-then +- AC_MSG_RESULT(yes) +- AC_DEFINE(HAVE_DEV_PTC, 1, +- [Define if we have /dev/ptc.]) +-else +- AC_MSG_RESULT(no) +-fi ++AC_CHECK_FILE(/dev/ptc, AC_DEFINE(HAVE_DEV_PTC, 1, [Define if we have /dev/ptc.])) + + case $MACHDEP in + darwin) diff --git a/meta-openvuplus/recipes-devtools/python/python_2.7.2.bbappend b/meta-openvuplus/recipes-devtools/python/python_2.7.2.bbappend new file mode 100644 index 0000000..dca8c27 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/python/python_2.7.2.bbappend @@ -0,0 +1,19 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +PR .= "-vuplus0" + +SRC_URI += " \ + file://some_configure_fixes.patch;striplevel=0 \ + file://fix_pthread_site.patch;striplevel=0 \ + file://no-ldconfig.patch \ + file://ctypes-error-handling-fix.patch \ +" + +EXTRA_OECONF += " \ + ac_cv_file__dev_ptmx=yes \ + ac_cv_file__dev_ptc=no \ + ac_cv_no_strict_aliasing_ok=yes \ + ac_cv_pthread=yes \ + ac_cv_cxx_thread=yes \ + ac_cv_sizeof_off_t=8 \ +" diff --git a/meta-openvuplus/recipes-devtools/swig/swig_2.0.4.bb b/meta-openvuplus/recipes-devtools/swig/swig_2.0.4.bb new file mode 100644 index 0000000..e05c9d6 --- /dev/null +++ b/meta-openvuplus/recipes-devtools/swig/swig_2.0.4.bb @@ -0,0 +1,11 @@ +require recipes-devtools/swig/swig.inc + +LIC_FILES_CHKSUM = "file://LICENSE;md5=e7807a6282784a7dde4c846626b08fc6 \ + file://LICENSE-GPL;md5=d32239bcb673463ab874e80d47fae504 \ + file://LICENSE-UNIVERSITIES;md5=8ce9dcc8f7c994de4a408b205c72ba08" + +DEPENDS += "libpcre-native" +PR = "${INC_PR}.0" + +SRC_URI[md5sum] = "4319c503ee3a13d2a53be9d828c3adc0" +SRC_URI[sha256sum] = "763a117730d26f8e5ed67f5718c6c0761fbb8461680fc20269db8c0839e1ec8a" diff --git a/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab/aio-grab_vuplus.patch b/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab/aio-grab_vuplus.patch deleted file mode 100644 index 1459e22..0000000 --- a/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab/aio-grab_vuplus.patch +++ /dev/null @@ -1,94 +0,0 @@ -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 deleted file mode 100644 index bc89b2d..0000000 --- a/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bb +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index 9199d4a..0000000 --- a/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bbappend +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index 40cf4ad..0000000 --- a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/Makefile.in.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- 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 deleted file mode 100644 index 55f39b2..0000000 --- a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/cdparanoia-III-10.2-privatefix.patch +++ /dev/null @@ -1,561 +0,0 @@ -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 deleted file mode 100644 index 2ca2516..0000000 --- a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/configure.in.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- 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 deleted file mode 100644 index 414ff39..0000000 --- a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/fixes10.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- 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 deleted file mode 100644 index 4dbd2bb..0000000 --- a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/interface_Makefile.in.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- 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 deleted file mode 100644 index 962a43a..0000000 --- a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/paranoia_Makefile.in.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- 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 deleted file mode 100644 index b88c74b..0000000 --- a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia_svn.bb +++ /dev/null @@ -1,43 +0,0 @@ -# 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 deleted file mode 100644 index 7f5188a..0000000 --- a/meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes.bb +++ /dev/null @@ -1,34 +0,0 @@ -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 deleted file mode 100644 index bb2a4a2..0000000 --- a/meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes_1.1.bb +++ /dev/null @@ -1,26 +0,0 @@ -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 deleted file mode 100644 index 5ee1ebd..0000000 --- a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns +++ /dev/null @@ -1,3 +0,0 @@ -#!/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 deleted file mode 100644 index f0ea5a5..0000000 --- a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns-remove +++ /dev/null @@ -1,5 +0,0 @@ -#!/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 deleted file mode 100644 index c099b6e..0000000 --- a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dial.modem +++ /dev/null @@ -1,20 +0,0 @@ -#!/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 deleted file mode 100644 index ef0cc50..0000000 --- a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/disconnect.modem +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 deleted file mode 100644 index 25b3144..0000000 --- a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dm800/options +++ /dev/null @@ -1,18 +0,0 @@ -/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 deleted file mode 100644 index 746ee81..0000000 --- a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/options +++ /dev/null @@ -1,18 +0,0 @@ -/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 deleted file mode 100644 index 7825deb..0000000 --- a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/pap-secrets +++ /dev/null @@ -1,3 +0,0 @@ -# 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 deleted file mode 100644 index 859ab5c..0000000 --- a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts_0.1.bb +++ /dev/null @@ -1,25 +0,0 @@ -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 deleted file mode 100644 index b91a750..0000000 --- a/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-tip.diff +++ /dev/null @@ -1,37589 +0,0 @@ -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 deleted file mode 100644 index 55c3419..0000000 --- a/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-trunk.diff +++ /dev/null @@ -1,84321 +0,0 @@ -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
Output stream to address:port using udp\n" -+ " udpif
Output stream to address:port using udp\n" -+ " forcing the specified interface\n" -+ " rtp
Output stream to address:port using udp-rtp\n" -+ " rtpif
Output stream to address:port using udp-rtp\n" -+ " forcing the specified interface\n" -+ " -timeout Number of seconds to output channel for\n" -+ " (0=>exit immediately after successful tuning, default is to output forever)\n" -+ " -cammenu Show the CAM menu\n" -+ " -nomoveca Do not attempt to move CA descriptors from stream to programme level\n" -+ " \n"; -+ fprintf(stderr, "%s\n", _usage); -+ -+ exit(1); -+} -+ -+int find_channel(struct dvbcfg_zapchannel *channel, void *private_data) -+{ -+ struct dvbcfg_zapchannel *tmpchannel = private_data; -+ -+ if (strcmp(channel->name, tmpchannel->name) == 0) { -+ memcpy(tmpchannel, channel, sizeof(struct dvbcfg_zapchannel)); -+ return 1; -+ } -+ -+ return 0; -+} -+ -+int main(int argc, char *argv[]) -+{ -+ int adapter_id = 0; -+ int frontend_id = 0; -+ int demux_id = 0; -+ int caslot_num = 0; -+ char *chanfile = "/etc/channels.conf"; -+ char *secfile = NULL; -+ char *secid = NULL; -+ char *channel_name = NULL; -+ int output_type = OUTPUT_TYPE_DECODER; -+ char *outfile = NULL; -+ char *outhost = NULL; -+ char *outport = NULL; -+ char *outif = NULL; -+ struct addrinfo *outaddrs = NULL; -+ int timeout = -1; -+ int moveca = 1; -+ int cammenu = 0; -+ int argpos = 1; -+ struct gnutv_dvb_params gnutv_dvb_params; -+ struct gnutv_ca_params gnutv_ca_params; -+ int ffaudiofd = -1; -+ int usertp = 0; -+ int buffer_size = 0; -+ -+ while(argpos != argc) { -+ if (!strcmp(argv[argpos], "-h")) { -+ usage(); -+ } else if (!strcmp(argv[argpos], "-adapter")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (sscanf(argv[argpos+1], "%i", &adapter_id) != 1) -+ usage(); -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-frontend")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (sscanf(argv[argpos+1], "%i", &frontend_id) != 1) -+ usage(); -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-demux")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (sscanf(argv[argpos+1], "%i", &demux_id) != 1) -+ usage(); -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-caslotnum")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (sscanf(argv[argpos+1], "%i", &caslot_num) != 1) -+ usage(); -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-channels")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ chanfile = argv[argpos+1]; -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-secfile")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ secfile = argv[argpos+1]; -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-secid")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ secid = argv[argpos+1]; -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-buffer")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (sscanf(argv[argpos+1], "%i", &buffer_size) != 1) -+ usage(); -+ if (buffer_size < 0) -+ usage(); -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-out")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (!strcmp(argv[argpos+1], "decoder")) { -+ output_type = OUTPUT_TYPE_DECODER; -+ } else if (!strcmp(argv[argpos+1], "decoderabypass")) { -+ output_type = OUTPUT_TYPE_DECODER_ABYPASS; -+ } else if (!strcmp(argv[argpos+1], "dvr")) { -+ output_type = OUTPUT_TYPE_DVR; -+ } else if (!strcmp(argv[argpos+1], "null")) { -+ output_type = OUTPUT_TYPE_NULL; -+ } else if (!strcmp(argv[argpos+1], "stdout")) { -+ output_type = OUTPUT_TYPE_STDOUT; -+ } else if (!strcmp(argv[argpos+1], "file")) { -+ output_type = OUTPUT_TYPE_FILE; -+ if ((argc - argpos) < 3) -+ usage(); -+ outfile = argv[argpos+2]; -+ argpos++; -+ } else if ((!strcmp(argv[argpos+1], "udp")) || -+ (!strcmp(argv[argpos+1], "rtp"))) { -+ output_type = OUTPUT_TYPE_UDP; -+ if ((argc - argpos) < 4) -+ usage(); -+ -+ if (!strcmp(argv[argpos+1], "rtp")) -+ usertp = 1; -+ outhost = argv[argpos+2]; -+ outport = argv[argpos+3]; -+ argpos+=2; -+ } else if ((!strcmp(argv[argpos+1], "udpif")) || -+ (!strcmp(argv[argpos+1], "rtpif"))) { -+ output_type = OUTPUT_TYPE_UDP; -+ if ((argc - argpos) < 5) -+ usage(); -+ -+ if (!strcmp(argv[argpos+1], "rtpif")) -+ usertp = 1; -+ outhost = argv[argpos+2]; -+ outport = argv[argpos+3]; -+ outif = argv[argpos+4]; -+ argpos+=3; -+ } else { -+ usage(); -+ } -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-timeout")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (sscanf(argv[argpos+1], "%i", &timeout) != 1) -+ usage(); -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-nomoveca")) { -+ moveca = 0; -+ argpos++; -+ } else if (!strcmp(argv[argpos], "-cammenu")) { -+ cammenu = 1; -+ argpos++; -+ } else { -+ if ((argc - argpos) != 1) -+ usage(); -+ channel_name = argv[argpos]; -+ argpos++; -+ } -+ } -+ -+ // the user didn't select anything! -+ if ((channel_name == NULL) && (!cammenu)) -+ usage(); -+ -+ // resolve host/port -+ if ((outhost != NULL) && (outport != NULL)) { -+ int res; -+ struct addrinfo hints; -+ memset(&hints, 0, sizeof(hints)); -+ hints.ai_family = AF_UNSPEC; -+ hints.ai_socktype = SOCK_DGRAM; -+ if ((res = getaddrinfo(outhost, outport, &hints, &outaddrs)) != 0) { -+ fprintf(stderr, "Unable to resolve requested address: %s\n", gai_strerror(res)); -+ exit(1); -+ } -+ } -+ -+ // setup any signals -+ signal(SIGINT, signal_handler); -+ signal(SIGPIPE, SIG_IGN); -+ -+ // start the CA stuff -+ gnutv_ca_params.adapter_id = adapter_id; -+ gnutv_ca_params.caslot_num = caslot_num; -+ gnutv_ca_params.cammenu = cammenu; -+ gnutv_ca_params.moveca = moveca; -+ gnutv_ca_start(&gnutv_ca_params); -+ -+ // frontend setup if a channel name was supplied -+ if ((!cammenu) && (channel_name != NULL)) { -+ // find the requested channel -+ if (strlen(channel_name) >= sizeof(gnutv_dvb_params.channel.name)) { -+ fprintf(stderr, "Channel name is too long %s\n", channel_name); -+ exit(1); -+ } -+ FILE *channel_file = fopen(chanfile, "r"); -+ if (channel_file == NULL) { -+ fprintf(stderr, "Could open channel file %s\n", chanfile); -+ exit(1); -+ } -+ memcpy(gnutv_dvb_params.channel.name, channel_name, strlen(channel_name) + 1); -+ if (dvbcfg_zapchannel_parse(channel_file, find_channel, &gnutv_dvb_params.channel) != 1) { -+ fprintf(stderr, "Unable to find requested channel %s\n", channel_name); -+ exit(1); -+ } -+ fclose(channel_file); -+ -+ // default SEC with a DVBS card -+ if ((secid == NULL) && (gnutv_dvb_params.channel.fe_type == DVBFE_TYPE_DVBS)) -+ secid = "UNIVERSAL"; -+ -+ // look it up if one were supplied -+ gnutv_dvb_params.valid_sec = 0; -+ if (secid != NULL) { -+ if (dvbsec_cfg_find(secfile, secid, -+ &gnutv_dvb_params.sec)) { -+ fprintf(stderr, "Unable to find suitable sec/lnb configuration for channel\n"); -+ exit(1); -+ } -+ gnutv_dvb_params.valid_sec = 1; -+ } -+ -+ // open the frontend -+ gnutv_dvb_params.fe = dvbfe_open(adapter_id, frontend_id, 0); -+ if (gnutv_dvb_params.fe == NULL) { -+ fprintf(stderr, "Failed to open frontend\n"); -+ exit(1); -+ } -+ -+ // failover decoder to dvr output if decoder not available -+ if ((output_type == OUTPUT_TYPE_DECODER) || -+ (output_type == OUTPUT_TYPE_DECODER_ABYPASS)) { -+ ffaudiofd = dvbaudio_open(adapter_id, 0); -+ if (ffaudiofd < 0) { -+ fprintf(stderr, "Cannot open decoder; defaulting to dvr output\n"); -+ output_type = OUTPUT_TYPE_DVR; -+ } -+ } -+ -+ // start the DVB stuff -+ gnutv_dvb_params.adapter_id = adapter_id; -+ gnutv_dvb_params.frontend_id = frontend_id; -+ gnutv_dvb_params.demux_id = demux_id; -+ gnutv_dvb_params.output_type = output_type; -+ gnutv_dvb_start(&gnutv_dvb_params); -+ -+ // start the data stuff -+ gnutv_data_start(output_type, ffaudiofd, adapter_id, demux_id, buffer_size, outfile, outif, outaddrs, usertp); -+ } -+ -+ // the UI -+ time_t start = 0; -+ while(!quit_app) { -+ if (gnutv_dvb_locked() && (start == 0)) -+ start = time(NULL); -+ -+ // the timeout -+ if ((timeout != -1) && (start != 0)) { -+ if ((time(NULL) - start) >= timeout) -+ break; -+ } -+ -+ if (cammenu) -+ gnutv_ca_ui(); -+ else -+ usleep(1); -+ } -+ -+ // stop data handling -+ gnutv_data_stop(); -+ -+ // shutdown DVB stuff -+ if (channel_name != NULL) -+ gnutv_dvb_stop(); -+ -+ // shutdown CA stuff -+ gnutv_ca_stop(); -+ -+ // done -+ exit(0); -+} -+ -+static void signal_handler(int _signal) -+{ -+ (void) _signal; -+ -+ if (!quit_app) { -+ quit_app = 1; -+ } -+} -diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_ca.c dvb-apps/util/gnutv/gnutv_ca.c ---- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_ca.c 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/gnutv/gnutv_ca.c 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,404 @@ -+/* -+ gnutv utility -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include "gnutv.h" -+#include "gnutv_ca.h" -+ -+ -+ -+#define MMI_STATE_CLOSED 0 -+#define MMI_STATE_OPEN 1 -+#define MMI_STATE_ENQ 2 -+#define MMI_STATE_MENU 3 -+ -+static int gnutv_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids); -+static int gnutv_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ uint8_t application_type, uint16_t application_manufacturer, -+ uint16_t manufacturer_code, uint8_t menu_string_length, -+ uint8_t *menu_string); -+ -+static int gnutv_mmi_close_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ uint8_t cmd_id, uint8_t delay); -+static int gnutv_mmi_display_control_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ uint8_t cmd_id, uint8_t mmi_mode); -+static int gnutv_mmi_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ uint8_t blind_answer, uint8_t expected_answer_length, -+ uint8_t *text, uint32_t text_size); -+static int gnutv_mmi_menu_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ struct en50221_app_mmi_text *title, -+ struct en50221_app_mmi_text *sub_title, -+ struct en50221_app_mmi_text *bottom, -+ uint32_t item_count, struct en50221_app_mmi_text *items, -+ uint32_t item_raw_length, uint8_t *items_raw); -+static void *camthread_func(void* arg); -+ -+static struct en50221_transport_layer *tl = NULL; -+static struct en50221_session_layer *sl = NULL; -+static struct en50221_stdcam *stdcam = NULL; -+ -+static int ca_resource_connected = 0; -+static int mmi_state = MMI_STATE_CLOSED; -+static int mmi_enq_blind; -+static int mmi_enq_length; -+ -+static int camthread_shutdown = 0; -+static pthread_t camthread; -+int moveca = 0; -+int seenpmt = 0; -+int cammenu = 0; -+ -+char ui_line[256]; -+uint32_t ui_linepos = 0; -+ -+ -+void gnutv_ca_start(struct gnutv_ca_params *params) -+{ -+ // create transport layer -+ tl = en50221_tl_create(1, 16); -+ if (tl == NULL) { -+ fprintf(stderr, "Failed to create transport layer\n"); -+ return; -+ } -+ -+ // create session layer -+ sl = en50221_sl_create(tl, 16); -+ if (sl == NULL) { -+ fprintf(stderr, "Failed to create session layer\n"); -+ en50221_tl_destroy(tl); -+ return; -+ } -+ -+ // create the stdcam instance -+ stdcam = en50221_stdcam_create(params->adapter_id, params->caslot_num, tl, sl); -+ if (stdcam == NULL) { -+ en50221_sl_destroy(sl); -+ en50221_tl_destroy(tl); -+ return; -+ } -+ -+ // hook up the AI callbacks -+ if (stdcam->ai_resource) { -+ en50221_app_ai_register_callback(stdcam->ai_resource, gnutv_ai_callback, stdcam); -+ } -+ -+ // hook up the CA callbacks -+ if (stdcam->ca_resource) { -+ en50221_app_ca_register_info_callback(stdcam->ca_resource, gnutv_ca_info_callback, stdcam); -+ } -+ -+ // hook up the MMI callbacks -+ if (params->cammenu) { -+ if (stdcam->mmi_resource) { -+ en50221_app_mmi_register_close_callback(stdcam->mmi_resource, gnutv_mmi_close_callback, stdcam); -+ en50221_app_mmi_register_display_control_callback(stdcam->mmi_resource, gnutv_mmi_display_control_callback, stdcam); -+ en50221_app_mmi_register_enq_callback(stdcam->mmi_resource, gnutv_mmi_enq_callback, stdcam); -+ en50221_app_mmi_register_menu_callback(stdcam->mmi_resource, gnutv_mmi_menu_callback, stdcam); -+ en50221_app_mmi_register_list_callback(stdcam->mmi_resource, gnutv_mmi_menu_callback, stdcam); -+ } else { -+ fprintf(stderr, "CAM Menus are not supported by this interface hardware\n"); -+ exit(1); -+ } -+ } -+ -+ // any other stuff -+ moveca = params->moveca; -+ cammenu = params->cammenu; -+ -+ // start the cam thread -+ pthread_create(&camthread, NULL, camthread_func, NULL); -+} -+ -+void gnutv_ca_stop(void) -+{ -+ if (stdcam == NULL) -+ return; -+ -+ // shutdown the cam thread -+ camthread_shutdown = 1; -+ pthread_join(camthread, NULL); -+ -+ // destroy the stdcam -+ if (stdcam->destroy) -+ stdcam->destroy(stdcam, 1); -+ -+ // destroy session layer -+ en50221_sl_destroy(sl); -+ -+ // destroy transport layer -+ en50221_tl_destroy(tl); -+} -+ -+void gnutv_ca_ui(void) -+{ -+ // make up polling structure for stdin -+ struct pollfd pollfd; -+ pollfd.fd = 0; -+ pollfd.events = POLLIN|POLLPRI|POLLERR; -+ -+ if (stdcam == NULL) -+ return; -+ -+ // is there a character? -+ if (poll(&pollfd, 1, 10) != 1) -+ return; -+ if (pollfd.revents & POLLERR) -+ return; -+ -+ // try to read the character -+ char c; -+ if (read(0, &c, 1) != 1) -+ return; -+ if (c == '\r') { -+ return; -+ } else if (c == '\n') { -+ switch(mmi_state) { -+ case MMI_STATE_CLOSED: -+ case MMI_STATE_OPEN: -+ if ((ui_linepos == 0) && (ca_resource_connected)) { -+ en50221_app_ai_entermenu(stdcam->ai_resource, stdcam->ai_session_number); -+ } -+ break; -+ -+ case MMI_STATE_ENQ: -+ if (ui_linepos == 0) { -+ en50221_app_mmi_answ(stdcam->mmi_resource, stdcam->mmi_session_number, -+ MMI_ANSW_ID_CANCEL, NULL, 0); -+ } else { -+ en50221_app_mmi_answ(stdcam->mmi_resource, stdcam->mmi_session_number, -+ MMI_ANSW_ID_ANSWER, (uint8_t*) ui_line, ui_linepos); -+ } -+ mmi_state = MMI_STATE_OPEN; -+ break; -+ -+ case MMI_STATE_MENU: -+ ui_line[ui_linepos] = 0; -+ en50221_app_mmi_menu_answ(stdcam->mmi_resource, stdcam->mmi_session_number, -+ atoi(ui_line)); -+ mmi_state = MMI_STATE_OPEN; -+ break; -+ } -+ ui_linepos = 0; -+ } else { -+ if (ui_linepos < (sizeof(ui_line)-1)) { -+ ui_line[ui_linepos++] = c; -+ } -+ } -+} -+ -+int gnutv_ca_new_pmt(struct mpeg_pmt_section *pmt) -+{ -+ uint8_t capmt[4096]; -+ int size; -+ -+ if (stdcam == NULL) -+ return -1; -+ -+ if (ca_resource_connected) { -+ fprintf(stderr, "Received new PMT - sending to CAM...\n"); -+ -+ // translate it into a CA PMT -+ int listmgmt = CA_LIST_MANAGEMENT_ONLY; -+ if (seenpmt) { -+ listmgmt = CA_LIST_MANAGEMENT_UPDATE; -+ } -+ seenpmt = 1; -+ -+ if ((size = en50221_ca_format_pmt(pmt, capmt, sizeof(capmt), moveca, listmgmt, -+ CA_PMT_CMD_ID_OK_DESCRAMBLING)) < 0) { -+ fprintf(stderr, "Failed to format PMT\n"); -+ return -1; -+ } -+ -+ // set it -+ if (en50221_app_ca_pmt(stdcam->ca_resource, stdcam->ca_session_number, capmt, size)) { -+ fprintf(stderr, "Failed to send PMT\n"); -+ return -1; -+ } -+ -+ // we've seen this PMT -+ return 1; -+ } -+ -+ return 0; -+} -+ -+void gnutv_ca_new_dvbtime(time_t dvb_time) -+{ -+ if (stdcam == NULL) -+ return; -+ -+ if (stdcam->dvbtime) -+ stdcam->dvbtime(stdcam, dvb_time); -+} -+ -+static void *camthread_func(void* arg) -+{ -+ (void) arg; -+ int entered_menu = 0; -+ -+ while(!camthread_shutdown) { -+ stdcam->poll(stdcam); -+ -+ if ((!entered_menu) && cammenu && ca_resource_connected && stdcam->mmi_resource) { -+ en50221_app_ai_entermenu(stdcam->ai_resource, stdcam->ai_session_number); -+ entered_menu = 1; -+ } -+ } -+ -+ return 0; -+} -+ -+static int gnutv_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ uint8_t application_type, uint16_t application_manufacturer, -+ uint16_t manufacturer_code, uint8_t menu_string_length, -+ uint8_t *menu_string) -+{ -+ (void) arg; -+ (void) slot_id; -+ (void) session_number; -+ -+ fprintf(stderr, "CAM Application type: %02x\n", application_type); -+ fprintf(stderr, "CAM Application manufacturer: %04x\n", application_manufacturer); -+ fprintf(stderr, "CAM Manufacturer code: %04x\n", manufacturer_code); -+ fprintf(stderr, "CAM Menu string: %.*s\n", menu_string_length, menu_string); -+ -+ return 0; -+} -+ -+static int gnutv_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids) -+{ -+ (void) arg; -+ (void) slot_id; -+ (void) session_number; -+ -+ fprintf(stderr, "CAM supports the following ca system ids:\n"); -+ uint32_t i; -+ for(i=0; i< ca_id_count; i++) { -+ fprintf(stderr, " 0x%04x\n", ca_ids[i]); -+ } -+ ca_resource_connected = 1; -+ return 0; -+} -+ -+static int gnutv_mmi_close_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ uint8_t cmd_id, uint8_t delay) -+{ -+ (void) arg; -+ (void) slot_id; -+ (void) session_number; -+ (void) cmd_id; -+ (void) delay; -+ -+ // note: not entirely correct as its supposed to delay if asked -+ mmi_state = MMI_STATE_CLOSED; -+ return 0; -+} -+ -+static int gnutv_mmi_display_control_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ uint8_t cmd_id, uint8_t mmi_mode) -+{ -+ struct en50221_app_mmi_display_reply_details reply; -+ (void) arg; -+ (void) slot_id; -+ -+ // don't support any commands but set mode -+ if (cmd_id != MMI_DISPLAY_CONTROL_CMD_ID_SET_MMI_MODE) { -+ en50221_app_mmi_display_reply(stdcam->mmi_resource, session_number, -+ MMI_DISPLAY_REPLY_ID_UNKNOWN_CMD_ID, &reply); -+ return 0; -+ } -+ -+ // we only support high level mode -+ if (mmi_mode != MMI_MODE_HIGH_LEVEL) { -+ en50221_app_mmi_display_reply(stdcam->mmi_resource, session_number, -+ MMI_DISPLAY_REPLY_ID_UNKNOWN_MMI_MODE, &reply); -+ return 0; -+ } -+ -+ // ack the high level open -+ reply.u.mode_ack.mmi_mode = mmi_mode; -+ en50221_app_mmi_display_reply(stdcam->mmi_resource, session_number, -+ MMI_DISPLAY_REPLY_ID_MMI_MODE_ACK, &reply); -+ mmi_state = MMI_STATE_OPEN; -+ return 0; -+} -+ -+static int gnutv_mmi_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ uint8_t blind_answer, uint8_t expected_answer_length, -+ uint8_t *text, uint32_t text_size) -+{ -+ (void) arg; -+ (void) slot_id; -+ (void) session_number; -+ -+ fprintf(stderr, "%.*s: ", text_size, text); -+ fflush(stdout); -+ -+ mmi_enq_blind = blind_answer; -+ mmi_enq_length = expected_answer_length; -+ mmi_state = MMI_STATE_ENQ; -+ return 0; -+} -+ -+static int gnutv_mmi_menu_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ struct en50221_app_mmi_text *title, -+ struct en50221_app_mmi_text *sub_title, -+ struct en50221_app_mmi_text *bottom, -+ uint32_t item_count, struct en50221_app_mmi_text *items, -+ uint32_t item_raw_length, uint8_t *items_raw) -+{ -+ (void) arg; -+ (void) slot_id; -+ (void) session_number; -+ (void) item_raw_length; -+ (void) items_raw; -+ -+ fprintf(stderr, "------------------------------\n"); -+ -+ if (title->text_length) { -+ fprintf(stderr, "%.*s\n", title->text_length, title->text); -+ } -+ if (sub_title->text_length) { -+ fprintf(stderr, "%.*s\n", sub_title->text_length, sub_title->text); -+ } -+ -+ uint32_t i; -+ fprintf(stderr, "0. Quit menu\n"); -+ for(i=0; i< item_count; i++) { -+ fprintf(stderr, "%i. %.*s\n", i+1, items[i].text_length, items[i].text); -+ } -+ -+ if (bottom->text_length) { -+ fprintf(stderr, "%.*s\n", bottom->text_length, bottom->text); -+ } -+ fprintf(stderr, "Enter option: "); -+ fflush(stdout); -+ -+ mmi_state = MMI_STATE_MENU; -+ return 0; -+} -diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_ca.h dvb-apps/util/gnutv/gnutv_ca.h ---- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_ca.h 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/gnutv/gnutv_ca.h 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,40 @@ -+/* -+ gnutv utility -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+*/ -+ -+#ifndef gnutv_CA_H -+#define gnutv_CA_H 1 -+ -+struct gnutv_ca_params { -+ int adapter_id; -+ int caslot_num; -+ int cammenu; -+ int moveca; -+}; -+ -+extern void gnutv_ca_start(struct gnutv_ca_params *params); -+extern void gnutv_ca_ui(void); -+extern void gnutv_ca_stop(void); -+ -+extern int gnutv_ca_new_pmt(struct mpeg_pmt_section *pmt); -+extern void gnutv_ca_new_dvbtime(time_t dvb_time); -+ -+#endif -diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_data.c dvb-apps/util/gnutv/gnutv_data.c ---- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_data.c 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/gnutv/gnutv_data.c 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,483 @@ -+/* -+ gnutv utility -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+*/ -+ -+#define _FILE_OFFSET_BITS 64 -+#define _LARGEFILE_SOURCE 1 -+#define _LARGEFILE64_SOURCE 1 -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "gnutv.h" -+#include "gnutv_dvb.h" -+#include "gnutv_ca.h" -+#include "gnutv_data.h" -+ -+static void *fileoutputthread_func(void* arg); -+static void *udpoutputthread_func(void* arg); -+ -+static int gnutv_data_create_decoder_filter(int adapter, int demux, uint16_t pid, int pestype); -+static int gnutv_data_create_dvr_filter(int adapter, int demux, uint16_t pid); -+ -+static void gnutv_data_decoder_pmt(struct mpeg_pmt_section *pmt); -+static void gnutv_data_dvr_pmt(struct mpeg_pmt_section *pmt); -+ -+static void gnutv_data_append_pid_fd(int pid, int fd); -+static void gnutv_data_free_pid_fds(void); -+ -+static pthread_t outputthread; -+static int outfd = -1; -+static int dvrfd = -1; -+static int pat_fd_dvrout = -1; -+static int pmt_fd_dvrout = -1; -+static int outputthread_shutdown = 0; -+ -+static int usertp = 0; -+static int adapter_id = -1; -+static int demux_id = -1; -+static int output_type = 0; -+static struct addrinfo *outaddrs = NULL; -+ -+struct pid_fd { -+ int pid; -+ int fd; -+}; -+static struct pid_fd *pid_fds = NULL; -+static int pid_fds_count = 0; -+ -+void gnutv_data_start(int _output_type, -+ int ffaudiofd, int _adapter_id, int _demux_id, int buffer_size, -+ char *outfile, -+ char* outif, struct addrinfo *_outaddrs, int _usertp) -+{ -+ usertp = _usertp; -+ demux_id = _demux_id; -+ adapter_id = _adapter_id; -+ output_type = _output_type; -+ -+ // setup output -+ switch(output_type) { -+ case OUTPUT_TYPE_DECODER: -+ case OUTPUT_TYPE_DECODER_ABYPASS: -+ dvbaudio_set_bypass(ffaudiofd, (output_type == OUTPUT_TYPE_DECODER_ABYPASS) ? 1 : 0); -+ close(ffaudiofd); -+ break; -+ -+ case OUTPUT_TYPE_STDOUT: -+ case OUTPUT_TYPE_FILE: -+ if (output_type == OUTPUT_TYPE_FILE) { -+ // open output file -+ outfd = open(outfile, O_WRONLY|O_CREAT|O_LARGEFILE|O_TRUNC, 0644); -+ if (outfd < 0) { -+ fprintf(stderr, "Failed to open output file\n"); -+ exit(1); -+ } -+ } else { -+ outfd = STDOUT_FILENO; -+ } -+ -+ // open dvr device -+ dvrfd = dvbdemux_open_dvr(adapter_id, 0, 1, 0); -+ if (dvrfd < 0) { -+ fprintf(stderr, "Failed to open DVR device\n"); -+ exit(1); -+ } -+ -+ // optionally set dvr buffer size -+ if (buffer_size > 0) { -+ if (dvbdemux_set_buffer(dvrfd, buffer_size) != 0) { -+ fprintf(stderr, "Failed to set DVR buffer size\n"); -+ exit(1); -+ } -+ } -+ -+ pthread_create(&outputthread, NULL, fileoutputthread_func, NULL); -+ break; -+ -+ case OUTPUT_TYPE_UDP: -+ outaddrs = _outaddrs; -+ -+ // open output socket -+ outfd = socket(outaddrs->ai_family, outaddrs->ai_socktype, outaddrs->ai_protocol); -+ if (outfd < 0) { -+ fprintf(stderr, "Failed to open output socket\n"); -+ exit(1); -+ } -+ -+ // bind to local interface if requested -+ if (outif != NULL) { -+ if (setsockopt(outfd, SOL_SOCKET, SO_BINDTODEVICE, outif, strlen(outif)) < 0) { -+ fprintf(stderr, "Failed to bind to interface %s\n", outif); -+ exit(1); -+ } -+ } -+ -+ // open dvr device -+ dvrfd = dvbdemux_open_dvr(adapter_id, 0, 1, 0); -+ if (dvrfd < 0) { -+ fprintf(stderr, "Failed to open DVR device\n"); -+ exit(1); -+ } -+ -+ // optionally set dvr buffer size -+ if (buffer_size > 0) { -+ if (dvbdemux_set_buffer(dvrfd, buffer_size) != 0) { -+ fprintf(stderr, "Failed to set DVR buffer size\n"); -+ exit(1); -+ } -+ } -+ -+ pthread_create(&outputthread, NULL, udpoutputthread_func, NULL); -+ break; -+ } -+ -+ // output PAT to DVR if requested -+ switch(output_type) { -+ case OUTPUT_TYPE_DVR: -+ case OUTPUT_TYPE_FILE: -+ case OUTPUT_TYPE_STDOUT: -+ case OUTPUT_TYPE_UDP: -+ pat_fd_dvrout = gnutv_data_create_dvr_filter(adapter_id, demux_id, TRANSPORT_PAT_PID); -+ } -+} -+ -+void gnutv_data_stop() -+{ -+ // shutdown output thread if necessary -+ if (dvrfd != -1) { -+ outputthread_shutdown = 1; -+ pthread_join(outputthread, NULL); -+ } -+ gnutv_data_free_pid_fds(); -+ if (pat_fd_dvrout != -1) -+ close(pat_fd_dvrout); -+ if (pmt_fd_dvrout != -1) -+ close(pmt_fd_dvrout); -+ if (outaddrs) -+ freeaddrinfo(outaddrs); -+} -+ -+void gnutv_data_new_pat(int pmt_pid) -+{ -+ // output PMT to DVR if requested -+ switch(output_type) { -+ case OUTPUT_TYPE_DVR: -+ case OUTPUT_TYPE_FILE: -+ case OUTPUT_TYPE_STDOUT: -+ case OUTPUT_TYPE_UDP: -+ if (pmt_fd_dvrout != -1) -+ close(pmt_fd_dvrout); -+ pmt_fd_dvrout = gnutv_data_create_dvr_filter(adapter_id, demux_id, pmt_pid); -+ } -+} -+ -+int gnutv_data_new_pmt(struct mpeg_pmt_section *pmt) -+{ -+ // close all old PID FDs -+ gnutv_data_free_pid_fds(); -+ -+ // deal with the PMT appropriately -+ switch(output_type) { -+ case OUTPUT_TYPE_DECODER: -+ case OUTPUT_TYPE_DECODER_ABYPASS: -+ gnutv_data_decoder_pmt(pmt); -+ break; -+ -+ case OUTPUT_TYPE_DVR: -+ case OUTPUT_TYPE_FILE: -+ case OUTPUT_TYPE_STDOUT: -+ case OUTPUT_TYPE_UDP: -+ gnutv_data_dvr_pmt(pmt); -+ break; -+ } -+ -+ return 1; -+} -+ -+static void *fileoutputthread_func(void* arg) -+{ -+ (void)arg; -+ uint8_t buf[4096]; -+ struct pollfd pollfd; -+ int written; -+ -+ pollfd.fd = dvrfd; -+ pollfd.events = POLLIN|POLLPRI|POLLERR; -+ -+ while(!outputthread_shutdown) { -+ if (poll(&pollfd, 1, 1000) == -1) { -+ if (errno == EINTR) -+ continue; -+ fprintf(stderr, "DVR device poll failure\n"); -+ return 0; -+ } -+ -+ if (pollfd.revents == 0) -+ continue; -+ -+ int size = read(dvrfd, buf, sizeof(buf)); -+ if (size < 0) { -+ if (errno == EINTR) -+ continue; -+ -+ if (errno == EOVERFLOW) { -+ // The error flag has been cleared, next read should succeed. -+ fprintf(stderr, "DVR overflow\n"); -+ continue; -+ } -+ -+ fprintf(stderr, "DVR device read failure\n"); -+ return 0; -+ } -+ -+ written = 0; -+ while(written < size) { -+ int tmp = write(outfd, buf + written, size - written); -+ if (tmp == -1) { -+ if (errno != EINTR) { -+ fprintf(stderr, "Write error: %m\n"); -+ break; -+ } -+ } else { -+ written += tmp; -+ } -+ } -+ } -+ -+ return 0; -+} -+ -+#define TS_PAYLOAD_SIZE (188*7) -+ -+static void *udpoutputthread_func(void* arg) -+{ -+ (void)arg; -+ uint8_t buf[12 + TS_PAYLOAD_SIZE]; -+ struct pollfd pollfd; -+ int bufsize = 0; -+ int bufbase = 0; -+ int readsize; -+ uint16_t rtpseq = 0; -+ -+ pollfd.fd = dvrfd; -+ pollfd.events = POLLIN|POLLPRI|POLLERR; -+ -+ if (usertp) { -+ srandom(time(NULL)); -+ int ssrc = random(); -+ rtpseq = random(); -+ buf[0x0] = 0x80; -+ buf[0x1] = 0x21; -+ buf[0x4] = 0x00; // } -+ buf[0x5] = 0x00; // } FIXME: should really be a valid stamp -+ buf[0x6] = 0x00; // } -+ buf[0x7] = 0x00; // } -+ buf[0x8] = ssrc >> 24; -+ buf[0x9] = ssrc >> 16; -+ buf[0xa] = ssrc >> 8; -+ buf[0xb] = ssrc; -+ bufbase = 12; -+ } -+ -+ while(!outputthread_shutdown) { -+ if (poll(&pollfd, 1, 1000) != 1) -+ continue; -+ if (pollfd.revents & POLLERR) { -+ if (errno == EINTR) -+ continue; -+ fprintf(stderr, "DVR device read failure\n"); -+ return 0; -+ } -+ -+ readsize = TS_PAYLOAD_SIZE - bufsize; -+ readsize = read(dvrfd, buf + bufbase + bufsize, readsize); -+ if (readsize < 0) { -+ if (errno == EINTR) -+ continue; -+ fprintf(stderr, "DVR device read failure\n"); -+ return 0; -+ } -+ bufsize += readsize; -+ -+ if (bufsize == TS_PAYLOAD_SIZE) { -+ if (usertp) { -+ buf[2] = rtpseq >> 8; -+ buf[3] = rtpseq; -+ } -+ if (sendto(outfd, buf, bufbase + bufsize, 0, outaddrs->ai_addr, outaddrs->ai_addrlen) < 0) { -+ if (errno != EINTR) { -+ fprintf(stderr, "Socket send failure: %m\n"); -+ return 0; -+ } -+ } -+ rtpseq++; -+ bufsize = 0; -+ } -+ } -+ -+ if (bufsize) { -+ if (usertp) { -+ buf[2] = rtpseq >> 8; -+ buf[3] = rtpseq; -+ } -+ if (sendto(outfd, buf, bufbase + bufsize, 0, outaddrs->ai_addr, outaddrs->ai_addrlen) < 0) { -+ if (errno != EINTR) -+ fprintf(stderr, "Socket send failure: %m\n"); -+ } -+ } -+ -+ return 0; -+} -+ -+static int gnutv_data_create_decoder_filter(int adapter, int demux, uint16_t pid, int pestype) -+{ -+ int demux_fd = -1; -+ -+ // open the demuxer -+ if ((demux_fd = dvbdemux_open_demux(adapter, demux, 0)) < 0) { -+ return -1; -+ } -+ -+ // create a section filter -+ if (dvbdemux_set_pes_filter(demux_fd, pid, DVBDEMUX_INPUT_FRONTEND, DVBDEMUX_OUTPUT_DECODER, pestype, 1)) { -+ close(demux_fd); -+ return -1; -+ } -+ -+ // done -+ return demux_fd; -+} -+ -+static int gnutv_data_create_dvr_filter(int adapter, int demux, uint16_t pid) -+{ -+ int demux_fd = -1; -+ -+ // open the demuxer -+ if ((demux_fd = dvbdemux_open_demux(adapter, demux, 0)) < 0) { -+ return -1; -+ } -+ -+ // create a section filter -+ if (dvbdemux_set_pid_filter(demux_fd, pid, DVBDEMUX_INPUT_FRONTEND, DVBDEMUX_OUTPUT_DVR, 1)) { -+ close(demux_fd); -+ return -1; -+ } -+ -+ // done -+ return demux_fd; -+} -+ -+static void gnutv_data_decoder_pmt(struct mpeg_pmt_section *pmt) -+{ -+ int audio_pid = -1; -+ int video_pid = -1; -+ struct mpeg_pmt_stream *cur_stream; -+ mpeg_pmt_section_streams_for_each(pmt, cur_stream) { -+ switch(cur_stream->stream_type) { -+ case 1: -+ case 2: // video -+ video_pid = cur_stream->pid; -+ break; -+ -+ case 3: -+ case 4: // audio -+ audio_pid = cur_stream->pid; -+ break; -+ } -+ } -+ -+ if (audio_pid != -1) { -+ int fd = gnutv_data_create_decoder_filter(adapter_id, demux_id, audio_pid, DVBDEMUX_PESTYPE_AUDIO); -+ if (fd < 0) { -+ fprintf(stderr, "Unable to create dvr filter for PID %i\n", audio_pid); -+ } else { -+ gnutv_data_append_pid_fd(audio_pid, fd); -+ } -+ } -+ if (video_pid != -1) { -+ int fd = gnutv_data_create_decoder_filter(adapter_id, demux_id, video_pid, DVBDEMUX_PESTYPE_VIDEO); -+ if (fd < 0) { -+ fprintf(stderr, "Unable to create dvr filter for PID %i\n", video_pid); -+ } else { -+ gnutv_data_append_pid_fd(video_pid, fd); -+ } -+ } -+ int fd = gnutv_data_create_decoder_filter(adapter_id, demux_id, pmt->pcr_pid, DVBDEMUX_PESTYPE_PCR); -+ if (fd < 0) { -+ fprintf(stderr, "Unable to create dvr filter for PID %i\n", pmt->pcr_pid); -+ } else { -+ gnutv_data_append_pid_fd(pmt->pcr_pid, fd); -+ } -+} -+ -+static void gnutv_data_dvr_pmt(struct mpeg_pmt_section *pmt) -+{ -+ struct mpeg_pmt_stream *cur_stream; -+ mpeg_pmt_section_streams_for_each(pmt, cur_stream) { -+ int fd = gnutv_data_create_dvr_filter(adapter_id, demux_id, cur_stream->pid); -+ if (fd < 0) { -+ fprintf(stderr, "Unable to create dvr filter for PID %i\n", cur_stream->pid); -+ } else { -+ gnutv_data_append_pid_fd(cur_stream->pid, fd); -+ } -+ } -+} -+ -+static void gnutv_data_append_pid_fd(int pid, int fd) -+{ -+ struct pid_fd *tmp; -+ if ((tmp = realloc(pid_fds, (pid_fds_count +1) * sizeof(struct pid_fd))) == NULL) { -+ fprintf(stderr, "Out of memory when adding a new pid_fd\n"); -+ exit(1); -+ } -+ tmp[pid_fds_count].pid = pid; -+ tmp[pid_fds_count].fd = fd; -+ pid_fds_count++; -+ pid_fds = tmp; -+} -+ -+static void gnutv_data_free_pid_fds() -+{ -+ if (pid_fds_count) { -+ int i; -+ for(i=0; i< pid_fds_count; i++) { -+ close(pid_fds[i].fd); -+ } -+ } -+ if (pid_fds) -+ free(pid_fds); -+ -+ pid_fds_count = 0; -+ pid_fds = NULL; -+} -diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_data.h dvb-apps/util/gnutv/gnutv_data.h ---- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_data.h 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/gnutv/gnutv_data.h 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,39 @@ -+/* -+ gnutv utility -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+*/ -+ -+#ifndef gnutv_DATA_H -+#define gnutv_DATA_H 1 -+ -+#include -+ -+extern void gnutv_data_start(int output_type, -+ int ffaudiofd, int adapter_id, int demux_id, int buffer_size, -+ char *outfile, -+ char* outif, struct addrinfo *outaddrs, int usertp); -+extern void gnutv_data_stop(void); -+ -+extern void gnutv_data_new_pat(int pmt_pid); -+extern int gnutv_data_new_pmt(struct mpeg_pmt_section *pmt); -+ -+ -+ -+#endif -diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_dvb.c dvb-apps/util/gnutv/gnutv_dvb.c ---- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_dvb.c 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/gnutv/gnutv_dvb.c 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,376 @@ -+/* -+ gnutv utility -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "gnutv.h" -+#include "gnutv_dvb.h" -+#include "gnutv_data.h" -+#include "gnutv_ca.h" -+ -+#define FE_STATUS_PARAMS (DVBFE_INFO_LOCKSTATUS|DVBFE_INFO_SIGNAL_STRENGTH|DVBFE_INFO_BER|DVBFE_INFO_SNR|DVBFE_INFO_UNCORRECTED_BLOCKS) -+ -+static int dvbthread_shutdown = 0; -+static pthread_t dvbthread; -+static int tune_state = 0; -+ -+static int pat_version = -1; -+static int ca_pmt_version = -1; -+static int data_pmt_version = -1; -+ -+static void *dvbthread_func(void* arg); -+ -+static void process_pat(int pat_fd, struct gnutv_dvb_params *params, int *pmt_fd, struct pollfd *pollfd); -+static void process_tdt(int tdt_fd); -+static void process_pmt(int pmt_fd, struct gnutv_dvb_params *params); -+static int create_section_filter(int adapter, int demux, uint16_t pid, uint8_t table_id); -+ -+ -+int gnutv_dvb_start(struct gnutv_dvb_params *params) -+{ -+ pthread_create(&dvbthread, NULL, dvbthread_func, (void*) params); -+ return 0; -+} -+ -+void gnutv_dvb_stop(void) -+{ -+ dvbthread_shutdown = 1; -+ pthread_join(dvbthread, NULL); -+} -+ -+int gnutv_dvb_locked(void) -+{ -+ return tune_state == 2; -+} -+ -+static void *dvbthread_func(void* arg) -+{ -+ int pat_fd = -1; -+ int pmt_fd = -1; -+ int tdt_fd = -1; -+ struct pollfd pollfds[3]; -+ -+ struct gnutv_dvb_params *params = (struct gnutv_dvb_params *) arg; -+ -+ tune_state = 0; -+ -+ // create PAT filter -+ if ((pat_fd = create_section_filter(params->adapter_id, params->demux_id, -+ TRANSPORT_PAT_PID, stag_mpeg_program_association)) < 0) { -+ fprintf(stderr, "Failed to create PAT section filter\n"); -+ exit(1); -+ } -+ pollfds[0].fd = pat_fd; -+ pollfds[0].events = POLLIN|POLLPRI|POLLERR; -+ -+ // create TDT filter -+ if ((tdt_fd = create_section_filter(params->adapter_id, params->demux_id, TRANSPORT_TDT_PID, stag_dvb_time_date)) < 0) { -+ fprintf(stderr, "Failed to create TDT section filter\n"); -+ exit(1); -+ } -+ pollfds[1].fd = tdt_fd; -+ pollfds[1].events = POLLIN|POLLPRI|POLLERR; -+ -+ // zero PMT filter -+ pollfds[2].fd = 0; -+ pollfds[2].events = 0; -+ -+ // the DVB loop -+ while(!dvbthread_shutdown) { -+ // tune frontend + monitor lock status -+ if (tune_state == 0) { -+ // get the type of frontend -+ struct dvbfe_info result; -+ char *types; -+ memset(&result, 0, sizeof(result)); -+ dvbfe_get_info(params->fe, 0, &result, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0); -+ switch(result.type) { -+ case DVBFE_TYPE_DVBS: -+ types = "DVB-S"; -+ break; -+ case DVBFE_TYPE_DVBC: -+ types = "DVB-C"; -+ break; -+ case DVBFE_TYPE_DVBT: -+ types = "DVB-T"; -+ break; -+ case DVBFE_TYPE_ATSC: -+ types = "ATSC"; -+ break; -+ default: -+ types = "Unknown"; -+ } -+ fprintf(stderr, "Using frontend \"%s\", type %s\n", result.name, types); -+ -+ // do we have a valid SEC configuration? -+ struct dvbsec_config *sec = NULL; -+ if (params->valid_sec) -+ sec = ¶ms->sec; -+ -+ // tune! -+ if (dvbsec_set(params->fe, -+ sec, -+ params->channel.polarization, -+ (params->channel.diseqc_switch & 0x01) ? DISEQC_SWITCH_B : DISEQC_SWITCH_A, -+ (params->channel.diseqc_switch & 0x02) ? DISEQC_SWITCH_B : DISEQC_SWITCH_A, -+ ¶ms->channel.fe_params, -+ 0)) { -+ fprintf(stderr, "Failed to set frontend\n"); -+ exit(1); -+ } -+ -+ tune_state++; -+ } else if (tune_state == 1) { -+ struct dvbfe_info result; -+ memset(&result, 0, sizeof(result)); -+ dvbfe_get_info(params->fe, -+ FE_STATUS_PARAMS, -+ &result, -+ DVBFE_INFO_QUERYTYPE_IMMEDIATE, -+ 0); -+ -+ fprintf(stderr, "status %c%c%c%c%c | signal %04x | snr %04x | ber %08x | unc %08x | %s\r", -+ result.signal ? 'S' : ' ', -+ result.carrier ? 'C' : ' ', -+ result.viterbi ? 'V' : ' ', -+ result.sync ? 'Y' : ' ', -+ result.lock ? 'L' : ' ', -+ result.signal_strength, -+ result.snr, -+ result.ber, -+ result.ucblocks, -+ result.lock ? "FE_HAS_LOCK" : ""); -+ fflush(stderr); -+ -+ if (result.lock) { -+ tune_state++; -+ fprintf(stderr, "\n"); -+ fflush(stderr); -+ } else { -+ usleep(500000); -+ } -+ } -+ -+ // is there SI data? -+ int count = poll(pollfds, 3, 100); -+ if (count < 0) { -+ if (errno != EINTR) -+ fprintf(stderr, "Poll error: %m\n"); -+ break; -+ } -+ if (count == 0) { -+ continue; -+ } -+ -+ // PAT -+ if (pollfds[0].revents & (POLLIN|POLLPRI)) { -+ process_pat(pat_fd, params, &pmt_fd, &pollfds[2]); -+ } -+ -+ // TDT -+ if (pollfds[1].revents & (POLLIN|POLLPRI)) { -+ process_tdt(tdt_fd); -+ } -+ -+ // PMT -+ if (pollfds[2].revents & (POLLIN|POLLPRI)) { -+ process_pmt(pmt_fd, params); -+ } -+ } -+ -+ // close demuxers -+ if (pat_fd != -1) -+ close(pat_fd); -+ if (pmt_fd != -1) -+ close(pmt_fd); -+ if (tdt_fd != -1) -+ close(tdt_fd); -+ -+ return 0; -+} -+ -+static void process_pat(int pat_fd, struct gnutv_dvb_params *params, int *pmt_fd, struct pollfd *pollfd) -+{ -+ int size; -+ uint8_t sibuf[4096]; -+ -+ // read the section -+ if ((size = read(pat_fd, sibuf, sizeof(sibuf))) < 0) { -+ return; -+ } -+ -+ // parse section -+ struct section *section = section_codec(sibuf, size); -+ if (section == NULL) { -+ return; -+ } -+ -+ // parse section_ext -+ struct section_ext *section_ext = section_ext_decode(section, 0); -+ if (section_ext == NULL) { -+ return; -+ } -+ if (pat_version == section_ext->version_number) { -+ return; -+ } -+ -+ // parse PAT -+ struct mpeg_pat_section *pat = mpeg_pat_section_codec(section_ext); -+ if (pat == NULL) { -+ return; -+ } -+ -+ // try and find the requested program -+ struct mpeg_pat_program *cur_program; -+ mpeg_pat_section_programs_for_each(pat, cur_program) { -+ if (cur_program->program_number == params->channel.service_id) { -+ // close old PMT fd -+ if (*pmt_fd != -1) -+ close(*pmt_fd); -+ -+ // create PMT filter -+ if ((*pmt_fd = create_section_filter(params->adapter_id, params->demux_id, -+ cur_program->pid, stag_mpeg_program_map)) < 0) { -+ return; -+ } -+ pollfd->fd = *pmt_fd; -+ pollfd->events = POLLIN|POLLPRI|POLLERR; -+ -+ gnutv_data_new_pat(cur_program->pid); -+ -+ // we have a new PMT pid -+ data_pmt_version = -1; -+ ca_pmt_version = -1; -+ break; -+ } -+ } -+ -+ // remember the PAT version -+ pat_version = section_ext->version_number; -+} -+ -+static void process_tdt(int tdt_fd) -+{ -+ int size; -+ uint8_t sibuf[4096]; -+ -+ // read the section -+ if ((size = read(tdt_fd, sibuf, sizeof(sibuf))) < 0) { -+ return; -+ } -+ -+ // parse section -+ struct section *section = section_codec(sibuf, size); -+ if (section == NULL) { -+ return; -+ } -+ -+ // parse TDT -+ struct dvb_tdt_section *tdt = dvb_tdt_section_codec(section); -+ if (tdt == NULL) { -+ return; -+ } -+ -+ // done -+ gnutv_ca_new_dvbtime(dvbdate_to_unixtime(tdt->utc_time)); -+} -+ -+static void process_pmt(int pmt_fd, struct gnutv_dvb_params *params) -+{ -+ int size; -+ uint8_t sibuf[4096]; -+ -+ // read the section -+ if ((size = read(pmt_fd, sibuf, sizeof(sibuf))) < 0) { -+ return; -+ } -+ -+ // parse section -+ struct section *section = section_codec(sibuf, size); -+ if (section == NULL) { -+ return; -+ } -+ -+ // parse section_ext -+ struct section_ext *section_ext = section_ext_decode(section, 0); -+ if (section_ext == NULL) { -+ return; -+ } -+ if ((section_ext->table_id_ext != params->channel.service_id) || -+ ((section_ext->version_number == data_pmt_version) && -+ (section_ext->version_number == ca_pmt_version))) { -+ return; -+ } -+ -+ // parse PMT -+ struct mpeg_pmt_section *pmt = mpeg_pmt_section_codec(section_ext); -+ if (pmt == NULL) { -+ return; -+ } -+ -+ // do data handling -+ if (section_ext->version_number != data_pmt_version) { -+ if (gnutv_data_new_pmt(pmt) == 1) -+ data_pmt_version = pmt->head.version_number; -+ } -+ -+ // do ca handling -+ if (section_ext->version_number != ca_pmt_version) { -+ if (gnutv_ca_new_pmt(pmt) == 1) -+ ca_pmt_version = pmt->head.version_number; -+ } -+} -+ -+static int create_section_filter(int adapter, int demux, uint16_t pid, uint8_t table_id) -+{ -+ int demux_fd = -1; -+ uint8_t filter[18]; -+ uint8_t mask[18]; -+ -+ // open the demuxer -+ if ((demux_fd = dvbdemux_open_demux(adapter, demux, 0)) < 0) { -+ return -1; -+ } -+ -+ // create a section filter -+ memset(filter, 0, sizeof(filter)); -+ memset(mask, 0, sizeof(mask)); -+ filter[0] = table_id; -+ mask[0] = 0xFF; -+ if (dvbdemux_set_section_filter(demux_fd, pid, filter, mask, 1, 1)) { -+ close(demux_fd); -+ return -1; -+ } -+ -+ // done -+ return demux_fd; -+} -diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_dvb.h dvb-apps/util/gnutv/gnutv_dvb.h ---- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_dvb.h 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/gnutv/gnutv_dvb.h 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,44 @@ -+/* -+ gnutv utility -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+*/ -+ -+#ifndef gnutv_DVB_H -+#define gnutv_DVB_H 1 -+ -+#include -+#include -+ -+struct gnutv_dvb_params { -+ int adapter_id; -+ int frontend_id; -+ int demux_id; -+ struct dvbcfg_zapchannel channel; -+ struct dvbsec_config sec; -+ int valid_sec; -+ int output_type; -+ struct dvbfe_handle *fe; -+}; -+ -+extern int gnutv_dvb_start(struct gnutv_dvb_params *params); -+extern void gnutv_dvb_stop(void); -+extern int gnutv_dvb_locked(void); -+ -+#endif -diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv.h dvb-apps/util/gnutv/gnutv.h ---- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv.h 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/gnutv/gnutv.h 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,37 @@ -+/* -+ gnutv utility -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+*/ -+ -+#ifndef __CA_gnutv_H__ -+#define __CA_gnutv_H__ -+ -+#include -+#include -+ -+#define OUTPUT_TYPE_DECODER 0 -+#define OUTPUT_TYPE_DECODER_ABYPASS 1 -+#define OUTPUT_TYPE_DVR 2 -+#define OUTPUT_TYPE_NULL 3 -+#define OUTPUT_TYPE_FILE 4 -+#define OUTPUT_TYPE_UDP 5 -+#define OUTPUT_TYPE_STDOUT 6 -+ -+#endif -diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/Makefile dvb-apps/util/gnutv/Makefile ---- linuxtv-dvb-apps-1.1.1/util/gnutv/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/gnutv/Makefile 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,21 @@ -+# Makefile for linuxtv.org dvb-apps/util/gnutv -+ -+objects = gnutv_ca.o \ -+ gnutv_dvb.o \ -+ gnutv_data.o -+ -+binaries = gnutv -+ -+inst_bin = $(binaries) -+ -+CPPFLAGS += -I../../lib -+LDFLAGS += -L../../lib/libdvbapi -L../../lib/libdvbcfg -L../../lib/libdvbsec -L../../lib/libdvben50221 -L../../lib/libucsi -+LDLIBS += -ldvbcfg -ldvben50221 -lucsi -ldvbsec -ldvbapi -lpthread -+ -+.PHONY: all -+ -+all: $(binaries) -+ -+$(binaries): $(objects) -+ -+include ../../Make.rules -diff -Nurd linuxtv-dvb-apps-1.1.1/util/lib/lnb.c dvb-apps/util/lib/lnb.c ---- linuxtv-dvb-apps-1.1.1/util/lib/lnb.c 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/lib/lnb.c 1970-01-01 01:00:00.000000000 +0100 -@@ -1,101 +0,0 @@ --#include --#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 >= sizeof(lnbs) / sizeof(lnbs[0])) -- return (struct lnb_types_st *)NULL; -- return &lnbs[curno]; --} -- --/* Decode an lnb type, for example given on a command line -- * If alpha and standard type, e.g. "Universal" then match that -- * otherwise low[,high[,switch]] -- */ -- --int --lnb_decode(char *str, struct lnb_types_st *lnbp) --{ --int i; --char *cp, *np; -- -- memset(lnbp, 0, sizeof(*lnbp)); -- cp = str; -- while(*cp && isspace(*cp)) -- cp++; -- if (isalpha(*cp)) { -- for(i = 0; i < (sizeof(lnbs) / sizeof(lnbs[0])); i++) { -- if (!strcasecmp(lnbs[i].name, cp)) { -- *lnbp = lnbs[i]; -- return 1; -- } -- } -- return -1; -- } -- if (*cp == '\0' || !isdigit(*cp)) -- return -1; -- lnbp->low_val = strtoul(cp, &np, 0); -- if (lnbp->low_val == 0) -- return -1; -- cp = np; -- while(*cp && (isspace(*cp) || *cp == ',')) -- cp++; -- if (*cp == '\0') -- return 1; -- if (!isdigit(*cp)) -- return -1; -- lnbp->high_val = strtoul(cp, &np, 0); -- cp = np; -- while(*cp && (isspace(*cp) || *cp == ',')) -- cp++; -- if (*cp == '\0') -- return 1; -- if (!isdigit(*cp)) -- return -1; -- lnbp->switch_val = strtoul(cp, NULL, 0); -- return 1; --} -diff -Nurd linuxtv-dvb-apps-1.1.1/util/lib/lnb.h dvb-apps/util/lib/lnb.h ---- linuxtv-dvb-apps-1.1.1/util/lib/lnb.h 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/lib/lnb.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,24 +0,0 @@ -- --struct lnb_types_st { -- char *name; -- char **desc; -- unsigned long low_val; -- unsigned long high_val; /* zero indicates no hiband */ -- unsigned long switch_val; /* zero indicates no hiband */ --}; -- --/* Enumerate through standard types of LNB's until NULL returned. -- * Increment curno each time -- */ -- --struct lnb_types_st * --lnb_enum(int curno); -- --/* Decode an lnb type, for example given on a command line -- * If alpha and standard type, e.g. "Universal" then match that -- * otherwise low[,high[,switch]] -- */ -- --int --lnb_decode(char *str, struct lnb_types_st *lnbp); -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/lib/Makefile dvb-apps/util/lib/Makefile ---- linuxtv-dvb-apps-1.1.1/util/lib/Makefile 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/lib/Makefile 1970-01-01 01:00:00.000000000 +0100 -@@ -1,20 +0,0 @@ -- --CC = gcc --CFLAGS = -MD -g -Wall -O2 -I../../include -I. --LFLAGS = -g -Wall -- --OBJS = lnb.o --SRCS = $(OBJS:.o=.c) -- --TARGET = lnb.o -- --$(TARGET): $(SRCS) -- --.c.o: -- $(CC) $(CFLAGS) -c $< -o $@ -- --clean: -- $(RM) *.o *.d $(TARGET) -- ---include $(wildcard *.d) dummy -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/Makefile dvb-apps/util/Makefile ---- linuxtv-dvb-apps-1.1.1/util/Makefile 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/Makefile 2009-06-21 13:29:06.000000000 +0200 -@@ -1,12 +1,19 @@ - # Makefile for linuxtv.org dvb-apps/util - --%:: FORCE -- $(MAKE) -C lib $(MAKECMDGOALS) -- $(MAKE) -C szap $(MAKECMDGOALS) -- $(MAKE) -C scan $(MAKECMDGOALS) -- $(MAKE) -C dvbnet $(MAKECMDGOALS) -- $(MAKE) -C dvbdate $(MAKECMDGOALS) -- $(MAKE) -C dvbtraffic $(MAKECMDGOALS) -- $(MAKE) -C av7110_loadkeys $(MAKECMDGOALS) -+.PHONY: all clean install - --FORCE: -+all clean install: -+ $(MAKE) -C atsc_epg $@ -+ $(MAKE) -C av7110_loadkeys $@ -+ $(MAKE) -C dib3000-watch $@ -+ $(MAKE) -C dst-utils $@ -+ $(MAKE) -C dvbdate $@ -+ $(MAKE) -C dvbnet $@ -+ $(MAKE) -C dvbtraffic $@ -+ $(MAKE) -C dvbscan $@ -+ $(MAKE) -C femon $@ -+ $(MAKE) -C scan $@ -+ $(MAKE) -C szap $@ -+ $(MAKE) -C ttusb_dec_reset $@ -+ $(MAKE) -C gnutv $@ -+ $(MAKE) -C zap $@ -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-ATSC-center-frequencies-8VSB dvb-apps/util/scan/atsc/us-ATSC-center-frequencies-8VSB ---- linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-ATSC-center-frequencies-8VSB 2006-04-29 22:31:08.000000000 +0200 -+++ dvb-apps/util/scan/atsc/us-ATSC-center-frequencies-8VSB 2009-06-21 13:29:06.000000000 +0200 -@@ -68,4 +68,3 @@ - A 791028615 8VSB - A 797028615 8VSB - A 803028615 8VSB -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-NTSC-center-frequencies-8VSB dvb-apps/util/scan/atsc/us-NTSC-center-frequencies-8VSB ---- linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-NTSC-center-frequencies-8VSB 2006-04-29 22:31:08.000000000 +0200 -+++ dvb-apps/util/scan/atsc/us-NTSC-center-frequencies-8VSB 2009-06-21 13:29:06.000000000 +0200 -@@ -68,4 +68,3 @@ - A 791000000 8VSB - A 797000000 8VSB - A 803000000 8VSB -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-NY-TWC-NYC dvb-apps/util/scan/atsc/us-NY-TWC-NYC ---- linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-NY-TWC-NYC 2006-04-29 22:31:08.000000000 +0200 -+++ dvb-apps/util/scan/atsc/us-NY-TWC-NYC 1970-01-01 01:00:00.000000000 +0100 -@@ -1,53 +0,0 @@ --#initial tuning data for Time Warner Cable in New York City -- --#80 --A 561000000 QAM256 --A 567000000 QAM256 --A 573000000 QAM256 --A 579000000 QAM256 --A 585000000 QAM256 --A 591000000 QAM256 --A 597000000 QAM256 --A 603000000 QAM256 --A 609000000 QAM256 --A 615000000 QAM256 --#90 --A 621000000 QAM256 --A 627000000 QAM256 --A 633000000 QAM256 --A 639000000 QAM256 --A 645000000 QAM256 --A 93000000 QAM256 --A 99000000 QAM256 --A 105000000 QAM256 --A 111025000 QAM256 --A 117025000 QAM256 --#100 --A 651000000 QAM256 --A 657000000 QAM256 --A 663000000 QAM256 --A 669000000 QAM256 --A 675000000 QAM256 --A 681000000 QAM256 --A 687000000 QAM256 --A 693000000 QAM256 --A 699000000 QAM256 --A 705000000 QAM256 --#110 --A 711000000 QAM256 --A 717000000 QAM256 --A 723000000 QAM256 --A 729000000 QAM256 --A 735000000 QAM256 --A 741000000 QAM256 --A 747000000 QAM256 --A 753000000 QAM256 --A 759000000 QAM256 --A 765000000 QAM256 --#120 --A 771000000 QAM256 --A 777000000 QAM256 --A 783000000 QAM256 --A 789000000 QAM256 --A 795000000 QAM256 --A 801000000 QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.c dvb-apps/util/scan/atsc_psip_section.c ---- linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.c 2006-05-18 01:33:25.000000000 +0200 -+++ dvb-apps/util/scan/atsc_psip_section.c 1970-01-01 01:00:00.000000000 +0100 -@@ -1,62 +0,0 @@ --#include "atsc_psip_section.h" -- --struct ATSC_extended_channel_name_descriptor read_ATSC_extended_channel_name_descriptor(const u8 *b) --{ -- struct ATSC_extended_channel_name_descriptor v; -- v.descriptor_tag = getBits(b, 0, 8); -- v.descriptor_length = getBits(b, 8, 8); -- v.TODO = getBits(b, 16, 1); -- return v; --} -- --struct ATSC_service_location_descriptor read_ATSC_service_location_descriptor(const u8 *b) --{ -- struct ATSC_service_location_descriptor v; -- v.descriptor_tag = getBits(b, 0, 8); -- v.descriptor_length = getBits(b, 8, 8); -- v.reserved = getBits(b, 16, 3); -- v.PCR_PID = getBits(b, 19,13); -- v.number_elements = getBits(b, 32, 8); -- return v; --} -- --struct ATSC_service_location_element read_ATSC_service_location_element(const u8 *b) --{ -- struct ATSC_service_location_element v; -- v.stream_type = getBits(b, 0, 8); -- v.reserved = getBits(b, 8, 3); -- v.elementary_PID = getBits(b, 11,13); -- v.ISO_639_language_code = getBits(b, 24,24); -- return v; --} -- --struct tvct_channel read_tvct_channel(const u8 *b) --{ -- struct tvct_channel v; -- v.short_name0 = getBits(b, 0,16); -- v.short_name1 = getBits(b, 16,16); -- v.short_name2 = getBits(b, 32,16); -- v.short_name3 = getBits(b, 48,16); -- v.short_name4 = getBits(b, 64,16); -- v.short_name5 = getBits(b, 80,16); -- v.short_name6 = getBits(b, 96,16); -- v.reserved0 = getBits(b,112, 4); -- v.major_channel_number = getBits(b,116,10); -- v.minor_channel_number = getBits(b,126,10); -- v.modulation_mode = getBits(b,136, 8); -- v.carrier_frequency = getBits(b,144,32); -- v.channel_TSID = getBits(b,176,16); -- v.program_number = getBits(b,192,16); -- v.ETM_location = getBits(b,208, 2); -- v.access_controlled = getBits(b,210, 1); -- v.hidden = getBits(b,211, 1); -- v.reserved1 = getBits(b,212, 2); -- v.hide_guide = getBits(b,214, 1); -- v.reserved2 = getBits(b,215, 3); -- v.service_type = getBits(b,218, 6); -- v.source_id = getBits(b,224,16); -- v.reserved3 = getBits(b,240, 6); -- v.descriptors_length = getBits(b,246,10); -- return v; --} -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.h dvb-apps/util/scan/atsc_psip_section.h ---- linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.h 2006-05-18 01:33:27.000000000 +0200 -+++ dvb-apps/util/scan/atsc_psip_section.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,60 +0,0 @@ --#ifndef __ATSC_PSIP_SECTION_H_ --#define __ATSC_PSIP_SECTION_H_ -- --#include "section.h" -- --#define ATSC_EXTENDED_CHANNEL_NAME_DESCRIPTOR_ID 0xA0 --struct ATSC_extended_channel_name_descriptor { -- u8 descriptor_tag : 8; -- u8 descriptor_length : 8; -- u8 TODO : 1; --} PACKED; --struct ATSC_extended_channel_name_descriptor read_ATSC_extended_channel_name_descriptor(const u8 *); -- --#define ATSC_SERVICE_LOCATION_DESCRIPTOR_ID 0xA1 --struct ATSC_service_location_descriptor { -- u8 descriptor_tag : 8; -- u8 descriptor_length : 8; -- u8 reserved : 3; -- u16 PCR_PID :13; -- u8 number_elements : 8; --} PACKED; --struct ATSC_service_location_descriptor read_ATSC_service_location_descriptor(const u8 *); -- --struct ATSC_service_location_element { -- u8 stream_type : 8; -- u8 reserved : 3; -- u16 elementary_PID :13; -- u32 ISO_639_language_code :24; --} PACKED; --struct ATSC_service_location_element read_ATSC_service_location_element(const u8 *); -- --struct tvct_channel { -- u16 short_name0 :16; -- u16 short_name1 :16; -- u16 short_name2 :16; -- u16 short_name3 :16; -- u16 short_name4 :16; -- u16 short_name5 :16; -- u16 short_name6 :16; -- u8 reserved0 : 4; -- u16 major_channel_number :10; -- u16 minor_channel_number :10; -- u8 modulation_mode : 8; -- u32 carrier_frequency :32; -- u16 channel_TSID :16; -- u16 program_number :16; -- u8 ETM_location : 2; -- u8 access_controlled : 1; -- u8 hidden : 1; -- u8 reserved1 : 2; -- u8 hide_guide : 1; -- u8 reserved2 : 3; -- u8 service_type : 6; -- u16 source_id :16; -- u8 reserved3 : 6; -- u16 descriptors_length :10; --} PACKED; --struct tvct_channel read_tvct_channel(const u8 *); -- --#endif -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.pl dvb-apps/util/scan/atsc_psip_section.pl ---- linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.pl 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/atsc_psip_section.pl 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,76 @@ -+use strict; -+ -+return { -+#{ 0x80, 0x80, "ATSC stuffing descriptor" }, -+#{ 0x81, 0x81, "ATSC AC-3 audio descriptor" }, -+#{ 0x82, 0x85, "ATSC TODO" }, -+#{ 0x86, 0x86, "ATSC caption service descriptor" }, -+#{ 0x87, 0x87, "ATSC content advisory descriptor" }, -+#{ 0x88, 0x8F, "ATSC TODO" }, -+#{ 0xA0, 0xA0, "ATSC extended channel name descriptor" }, -+#{ 0xA1, 0xA1, "ATSC service location descriptor" }, -+#{ 0xA2, 0xA2, "ATSC time-shifted service descriptor" }, -+#{ 0xA3, 0xA3, "ATSC component name descriptor" }, -+#{ 0xA4, 0xA7, "ATSC TODO" }, -+#{ 0xA8, 0xA8, "ATSC DCC departing request descriptor" }, -+#{ 0xA9, 0xA9, "ATSC DCC arriving request descriptor" }, -+#{ 0xAA, 0xAA, "ATSC redistribution control descriptor" }, -+ descriptors => [ -+ { id => 0xa0, -+ name => "ATSC_extended_channel_name_descriptor", -+ elements => [ -+ descriptor_tag => 8, -+ descriptor_length => 8, -+ TODO => 1, -+ ], -+ }, -+ { id => 0xa1, -+ name => "ATSC_service_location_descriptor", -+ elements => [ -+ descriptor_tag => 8, -+ descriptor_length => 8, -+ reserved => 3, -+ PCR_PID => 13, -+ number_elements => 8, -+ ], -+ } -+ ], -+ misc => [ -+ { name => "ATSC_service_location_element", -+ elements => [ -+ stream_type => 8, -+ reserved => 3, -+ elementary_PID => 13, -+ ISO_639_language_code => 24, -+ ], -+ }, -+ { name => "tvct_channel", -+ elements => [ -+ short_name0 => 16, -+ short_name1 => 16, -+ short_name2 => 16, -+ short_name3 => 16, -+ short_name4 => 16, -+ short_name5 => 16, -+ short_name6 => 16, -+ reserved0 => 4, -+ major_channel_number => 10, -+ minor_channel_number => 10, -+ modulation_mode => 8, -+ carrier_frequency => 32, -+ channel_TSID => 16, -+ program_number => 16, -+ ETM_location => 2, -+ access_controlled => 1, -+ hidden => 1, -+ reserved1 => 2, -+ hide_guide => 1, -+ reserved2 => 3, -+ service_type => 6, -+ source_id => 16, -+ reserved3 => 6, -+ descriptors_length => 10, -+ ], -+ }, -+ ] -+}; -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/diseqc.c dvb-apps/util/scan/diseqc.c ---- linuxtv-dvb-apps-1.1.1/util/scan/diseqc.c 2006-05-18 01:33:25.000000000 +0200 -+++ dvb-apps/util/scan/diseqc.c 2009-06-21 13:29:06.000000000 +0200 -@@ -37,9 +37,6 @@ - ; - } - --#define printf(x...) -- -- - int diseqc_send_msg (int fd, fe_sec_voltage_t v, struct diseqc_cmd **cmd, - fe_sec_tone_mode_t t, fe_sec_mini_cmd_t b) - { -@@ -104,5 +101,3 @@ - (i/2) % 2 ? SEC_TONE_ON : SEC_TONE_OFF, - (i/4) % 2 ? SEC_MINI_B : SEC_MINI_A); - } -- -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/diseqc.h dvb-apps/util/scan/diseqc.h ---- linuxtv-dvb-apps-1.1.1/util/scan/diseqc.h 2006-05-18 01:33:27.000000000 +0200 -+++ dvb-apps/util/scan/diseqc.h 2009-06-21 13:29:06.000000000 +0200 -@@ -22,4 +22,3 @@ - - - #endif -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dump-vdr.c dvb-apps/util/scan/dump-vdr.c ---- linuxtv-dvb-apps-1.1.1/util/scan/dump-vdr.c 2006-05-18 01:33:25.000000000 +0200 -+++ dvb-apps/util/scan/dump-vdr.c 2009-06-21 13:29:06.000000000 +0200 -@@ -138,7 +138,7 @@ - { - int i; - -- if ((video_pid || audio_pid[0]) && ((ca_select > 0) || ((ca_select == 0) && (scrambled == 0)))) { -+ if (video_pid || audio_pid[0]) { - if (vdr_version <= 2) { - audio_lang = NULL; - network_id = 0; -@@ -174,10 +174,17 @@ - if (audio_lang && audio_lang[0][0]) - fprintf (f, "=%.4s", audio_lang[0]); - } -- if (scrambled == 1) scrambled = ca_select; -+ if (scrambled == 1) { -+ if (ca_select == -1) -+ if (vdr_version <= 2) -+ scrambled = 1; -+ else -+ scrambled = 0; -+ else -+ scrambled = ca_select; -+ } - fprintf (f, ":%d:%d:%d:%d:%d:0", teletext_pid, scrambled, - service_id, network_id, transport_stream_id); - fprintf (f, "\n"); - } - } -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dump-vdr.h dvb-apps/util/scan/dump-vdr.h ---- linuxtv-dvb-apps-1.1.1/util/scan/dump-vdr.h 2006-05-18 01:33:27.000000000 +0200 -+++ dvb-apps/util/scan/dump-vdr.h 2009-06-21 13:29:06.000000000 +0200 -@@ -36,4 +36,3 @@ - int channel_num); - - #endif -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dump-zap.c dvb-apps/util/scan/dump-zap.c ---- linuxtv-dvb-apps-1.1.1/util/scan/dump-zap.c 2006-05-18 01:33:25.000000000 +0200 -+++ dvb-apps/util/scan/dump-zap.c 2009-06-21 13:29:06.000000000 +0200 -@@ -123,4 +123,3 @@ - fprintf (f, ":%i:%i:%i", video_pid, audio_pid[0], service_id); - fprintf (f, "\n"); - } -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dump-zap.h dvb-apps/util/scan/dump-zap.h ---- linuxtv-dvb-apps-1.1.1/util/scan/dump-zap.h 2006-05-18 01:33:27.000000000 +0200 -+++ dvb-apps/util/scan/dump-zap.h 2009-06-21 13:29:06.000000000 +0200 -@@ -17,4 +17,3 @@ - uint16_t service_id); - - #endif -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-Innsbruck dvb-apps/util/scan/dvb-c/at-Innsbruck ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-Innsbruck 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/at-Innsbruck 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# scan config for Innsbruck Telesystem cable provider -+# freq sr fec mod -+C 450000000 6875000 NONE QAM64 -+C 490000000 6875000 NONE QAM64 -+C 442000000 6875000 NONE QAM64 -+C 546000000 6875000 NONE QAM64 -+C 554000000 6875000 NONE QAM64 -+C 562000000 6875000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-KarrerNet dvb-apps/util/scan/dvb-c/at-KarrerNet ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-KarrerNet 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/at-KarrerNet 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# Kabel St. Florian bei Linz/AT KarrerNet -+# 2009-01-10 -+# freq sr fec mod -+C 418000000 6900000 NONE QAM64 -+C 426000000 6900000 NONE QAM64 -+C 434000000 6900000 NONE QAM64 -+C 442000000 6900000 NONE QAM64 -+C 450000000 6900000 NONE QAM64 -+C 458000000 6900000 NONE QAM64 -+C 466000000 6900000 NONE QAM64 -+C 474000000 6900000 NONE QAM64 -+C 482000000 6900000 NONE QAM64 -+C 522000000 6900000 NONE QAM64 -+C 530000000 6900000 NONE QAM64 -+C 538000000 6900000 NONE QAM64 -+C 578000000 6900000 NONE QAM64 -+C 402000000 6900000 NONE QAM256 -+C 410000000 6900000 NONE QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-Liwest dvb-apps/util/scan/dvb-c/at-Liwest ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-Liwest 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/at-Liwest 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,31 @@ -+# Kabel Linz/AT Liwest -+# 2006-08-01 -+# freq sr fec mod -+C 394000000 6900000 NONE QAM64 -+C 402000000 6900000 NONE QAM64 -+C 410000000 6875000 NONE QAM64 -+C 418000000 6900000 NONE QAM64 -+C 426000000 6900000 NONE QAM64 -+C 434000000 6900000 NONE QAM64 -+C 442000000 6900000 NONE QAM64 -+C 506000000 6900000 NONE QAM64 -+C 514000000 6900000 NONE QAM64 -+C 522000000 6900000 NONE QAM64 -+C 530000000 6900000 NONE QAM64 -+C 538000000 6900000 NONE QAM64 -+C 546000000 6900000 NONE QAM64 -+C 554000000 6900000 NONE QAM64 -+C 562000000 6900000 NONE QAM64 -+C 570000000 6900000 NONE QAM64 -+C 578000000 6900000 NONE QAM64 -+C 586000000 6900000 NONE QAM64 -+C 594000000 6900000 NONE QAM64 -+C 666000000 6900000 NONE QAM64 -+C 674000000 6900000 NONE QAM64 -+C 682000000 6900000 NONE QAM64 -+C 586000000 6900000 NONE QAM256 -+C 634000000 6900000 NONE QAM256 -+C 642000000 6900000 NONE QAM256 -+C 650000000 6900000 NONE QAM256 -+C 658000000 6900000 NONE QAM256 -+C 690000000 6900000 NONE QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-SalzburgAG dvb-apps/util/scan/dvb-c/at-SalzburgAG ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-SalzburgAG 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/at-SalzburgAG 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# scan config for Salzburg AG cable provider -+# freq sr fec mod -+C 306000000 6900000 NONE QAM64 -+C 370000000 6900000 NONE QAM64 -+C 410000000 6900000 NONE QAM64 -+C 418000000 6900000 NONE QAM64 -+C 426000000 6900000 NONE QAM64 -+C 442000000 6900000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/be-IN.DI-Integan dvb-apps/util/scan/dvb-c/be-IN.DI-Integan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/be-IN.DI-Integan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/be-IN.DI-Integan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,16 @@ -+# Integan DVB-C (Belgium, IN.DI region) -+# freq sr fec mod -+C 330000000 6875000 NONE QAM256 -+C 338000000 6875000 NONE QAM256 -+C 346000000 6875000 NONE QAM256 -+C 354000000 6875000 NONE QAM256 -+C 362000000 6875000 NONE QAM64 -+C 370000000 6875000 NONE QAM256 -+C 378000000 6875000 NONE QAM256 -+C 386000000 6875000 NONE QAM256 -+C 394000000 6875000 NONE QAM256 -+C 458000000 6875000 NONE QAM256 -+C 466000000 6875000 NONE QAM256 -+C 474000000 6875000 NONE QAM256 -+C 482000000 6875000 NONE QAM256 -+C 586000000 6875000 NONE QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Rega-Sense dvb-apps/util/scan/dvb-c/ch-Rega-Sense ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Rega-Sense 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/ch-Rega-Sense 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,34 @@ -+# Rega Sense, Switzerland -+# freq sr fec mod -+ -+# Pay TV -+C 434000000 6900000 NONE QAM64 # Teleclub -+C 714000000 6900000 NONE QAM64 -+C 722000000 6900000 NONE QAM64 -+ -+# Basis offer -+C 125000000 6900000 NONE QAM64 -+C 450000000 6900000 NONE QAM64 -+C 458000000 6900000 NONE QAM64 -+C 466000000 6900000 NONE QAM64 -+C 474000000 6900000 NONE QAM64 -+C 482000000 6900000 NONE QAM64 -+C 514000000 6900000 NONE QAM64 -+C 522000000 6900000 NONE QAM64 -+C 578000000 6900000 NONE QAM64 -+C 586000000 6900000 NONE QAM64 -+C 634000000 6900000 NONE QAM64 -+C 642000000 6900000 NONE QAM64 -+C 650000000 6900000 NONE QAM64 -+C 658000000 6900000 NONE QAM64 -+C 666000000 6900000 NONE QAM64 -+C 682000000 6900000 NONE QAM64 -+C 698000000 6900000 NONE QAM64 -+C 730000000 6900000 NONE QAM64 -+ -+C 618000000 6900000 NONE QAM256 -+C 674000000 6900000 NONE QAM256 -+ -+# HDTV -+C 642000000 6900000 NONE QAM256 -+C 690000000 6900000 NONE QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Video2000 dvb-apps/util/scan/dvb-c/ch-Video2000 ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Video2000 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/ch-Video2000 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# Cable Video2000 -+# Canton of Neuchatel, Switzerland -+ -+# freq sr fec mod -+C 306000000 6900000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Zuerich-cablecom dvb-apps/util/scan/dvb-c/ch-Zuerich-cablecom ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Zuerich-cablecom 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/ch-Zuerich-cablecom 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Kabel cablecom.ch Zuerich -+# freq sr fec mod -+C 410000000 6900000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/cz-Moravianet dvb-apps/util/scan/dvb-c/cz-Moravianet ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/cz-Moravianet 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/cz-Moravianet 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,24 @@ -+# DVB-C Moravianet (http://www.moravia.net/) -+# Available in villages and cities around Brno: -+# Bohuslavice, Bukovany, Hrusovany u Brna, Hustopece, Ivancice, Jirikovice, -+# Kyjov, Moravsky Krumlov, Mutenice, Neslovice, Nove Branice, Oslavany, -+# Popuvky, Padochov, Troubsko, Rosice, Tisnov, Vojkovice, Svatoborice, -+# Slapanice, Zabcice, Zidlochovice -+# The same content is available also from NejTV where they provide DVB-C. -+# Currently it is in Havlickuv Brod, Breclav, Velke Mezirici -+# -+# 2008-12-03 -+# -+# freq sr fec mod -+C 218000000 6900000 NONE QAM64 -+C 226000000 6900000 NONE QAM64 -+C 234000000 6900000 NONE QAM64 -+C 242000000 6900000 NONE QAM64 -+C 250000000 6900000 NONE QAM64 -+C 258000000 6900000 NONE QAM64 -+C 266000000 6900000 NONE QAM64 -+C 274000000 6900000 NONE QAM64 -+C 282000000 6900000 NONE QAM64 -+C 290000000 6900000 NONE QAM64 -+C 298000000 6900000 NONE QAM64 -+C 306000000 6900000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Berlin dvb-apps/util/scan/dvb-c/de-Berlin ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Berlin 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/de-Berlin 2009-06-21 13:29:06.000000000 +0200 -@@ -2,3 +2,4 @@ - # freq sr fec mod - C 394000000 6900000 NONE QAM64 - C 113000000 6900000 NONE QAM64 -+C 466000000 6900000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-iesy dvb-apps/util/scan/dvb-c/de-iesy ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-iesy 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/de-iesy 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,20 @@ --# Kabel iesy -+# Unity Media (iesy Hessen, ish Nordrhein-Westfalen) - # freq sr fec mod -+C 113000000 6900000 NONE QAM64 -+C 121000000 6900000 NONE QAM64 -+C 346000000 6900000 NONE QAM256 -+C 354000000 6900000 NONE QAM64 -+C 362000000 6900000 NONE QAM64 -+C 370000000 6900000 NONE QAM64 -+C 378000000 6900000 NONE QAM64 -+C 386000000 6900000 NONE QAM64 -+C 394000000 6900000 NONE QAM64 -+C 402000000 6900000 NONE QAM256 - C 410000000 6900000 NONE QAM64 -+C 426000000 6900000 NONE QAM64 -+C 434000000 6900000 NONE QAM256 -+C 442000000 6900000 NONE QAM256 -+C 450000000 6900000 NONE QAM64 -+C 458000000 6900000 NONE QAM64 -+C 466000000 6900000 NONE QAM64 -+C 538000000 6900000 NONE QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Kabel_BW dvb-apps/util/scan/dvb-c/de-Kabel_BW ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Kabel_BW 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/de-Kabel_BW 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,16 @@ -+# Kabel-BW, Stand 04/2007 -+# -+# Nur eine Anfangsfrequenz ist noetig, um den Ball ins -+# Rollen zu bringen. Quasi als Einstiegspunkt fuer eine -+# umfassende Suche. Es besteht kein Grund, sich um all die -+# vielen anderen Frequenzen und deren aktuell verwendete -+# Parameter zu kuemmern und diese dann womoeglich auch -+# noch auf einem aktuellen Stand halten zu wollen. Bei der -+# schieren Anzahl der innerhalb des Ausbaugebiets durch -+# Kabel BW genutzten Frequenzen waere das nur zeitraubend -+# und fehleranfaellig... ;-) -+# -+# Dirk Ritter -+# -+# freq sr fec mod -+C 113000000 6900000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Muenchen dvb-apps/util/scan/dvb-c/de-Muenchen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Muenchen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/de-Muenchen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,27 @@ -+# 2008-06-22 -+# Area: Muenchen City -+# Cable Provider: Kabel & Medien Service - http://www.atcable.de -+# Cable Content: Cablevista GmbH - http://www.cablevista.de -+# -+# freq sr fec mod -+C 113000000 6900000 NONE QAM64 -+C 121000000 6900000 NONE QAM64 -+C 346000000 6900000 NONE QAM64 -+C 354000000 6900000 NONE QAM64 -+C 362000000 6900000 NONE QAM64 -+C 370000000 6900000 NONE QAM64 -+C 378000000 6900000 NONE QAM64 -+C 386000000 6900000 NONE QAM64 -+C 394000000 6900000 NONE QAM64 -+C 402000000 6900000 NONE QAM64 -+C 410000000 6900000 NONE QAM64 -+C 418000000 6900000 NONE QAM64 -+C 426000000 6900000 NONE QAM64 -+C 434000000 6900000 NONE QAM64 -+C 442000000 6900000 NONE QAM64 -+C 450000000 6900000 NONE QAM64 -+C 466000000 6900000 NONE QAM64 -+C 482000000 6900000 NONE QAM64 -+C 322000000 6900000 NONE QAM256 -+C 458000000 6900000 NONE QAM256 -+C 490000000 6900000 NONE QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-neftv dvb-apps/util/scan/dvb-c/de-neftv ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-neftv 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/de-neftv 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,23 @@ -+# Cable conf for NEFtv -+# (Nuernberg, Erlangen, Fuerth and Herzogenaurach) -+ -+# freq sr fec mod -+C 346000000 6875000 NONE QAM64 -+C 354000000 6875000 NONE QAM64 -+C 362000000 6875000 NONE QAM64 -+C 370000000 6875000 NONE QAM64 -+C 378000000 6875000 NONE QAM64 -+C 386000000 6875000 NONE QAM64 -+C 394000000 6875000 NONE QAM64 -+C 402000000 6875000 NONE QAM64 -+C 410000000 6875000 NONE QAM64 -+C 418000000 6875000 NONE QAM64 -+C 426000000 6875000 NONE QAM64 -+C 434000000 6875000 NONE QAM64 -+C 450000000 6875000 NONE QAM64 -+C 458000000 6875000 NONE QAM64 -+C 474000000 6875000 NONE QAM64 -+C 490000000 6875000 NONE QAM64 -+C 498000000 6875000 NONE QAM64 -+C 514000000 6875000 NONE QAM64 -+C 546000000 6875000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Primacom dvb-apps/util/scan/dvb-c/de-Primacom ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Primacom 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/de-Primacom 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,23 @@ -+# Primacom -+# freq sr fec mod -+C 121000000 6900000 NONE QAM64 -+C 306000000 6900000 NONE QAM64 -+C 314000000 6900000 NONE QAM64 -+C 322000000 6900000 NONE QAM64 -+C 330000000 6900000 NONE QAM64 -+C 338000000 6900000 NONE QAM256 -+C 346000000 6900000 NONE QAM256 -+C 354000000 6900000 NONE QAM256 -+C 362000000 6900000 NONE QAM256 -+C 370000000 6900000 NONE QAM256 -+C 378000000 6900000 NONE QAM256 -+C 386000000 6900000 NONE QAM256 -+C 394000000 6900000 NONE QAM256 -+C 418000000 6900000 NONE QAM256 -+C 434000000 6900000 NONE QAM64 -+C 442000000 6900000 NONE QAM64 -+C 450000000 6900000 NONE QAM64 -+C 458000000 6900000 NONE QAM64 -+C 466000000 6900000 NONE QAM64 -+C 610000000 6900000 NONE QAM64 -+C 746000000 6900000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Unitymedia dvb-apps/util/scan/dvb-c/de-Unitymedia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Unitymedia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/de-Unitymedia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,35 @@ -+# Unitymedia -+# Created from http://www.unitymedia.de/service/tv/frequenzen.html -+# and http://blob.unitymedia.de/Download/Unitymedia_Senderlineup_digital_2008-05-28.pdf -+# freq sr fec mod -+C 113000000 6900000 NONE QAM256 -+C 121000000 6900000 NONE QAM256 -+C 338000000 6900000 NONE QAM256 -+C 346000000 6900000 NONE QAM256 -+C 354000000 6900000 NONE QAM64 -+C 362000000 6900000 NONE QAM64 -+C 370000000 6900000 NONE QAM64 -+C 378000000 6900000 NONE QAM64 -+C 386000000 6900000 NONE QAM64 -+C 394000000 6900000 NONE QAM256 -+C 402000000 6900000 NONE QAM256 -+C 410000000 6900000 NONE QAM256 -+C 418000000 6900000 NONE QAM256 -+C 426000000 6900000 NONE QAM256 -+C 434000000 6900000 NONE QAM256 -+C 442000000 6900000 NONE QAM64 -+C 450000000 6900000 NONE QAM64 -+C 458000000 6900000 NONE QAM256 -+C 466000000 6900000 NONE QAM256 -+C 474000000 6900000 NONE QAM64 -+C 522000000 6900000 NONE QAM256 -+C 530000000 6900000 NONE QAM256 -+C 538000000 6900000 NONE QAM256 -+C 554000000 6900000 NONE QAM256 -+C 562000000 6900000 NONE QAM256 -+C 570000000 6900000 NONE QAM256 -+C 610000000 6900000 NONE QAM64 -+C 650000000 6900000 NONE QAM256 -+C 658000000 6900000 NONE QAM256 -+C 666000000 6900000 NONE QAM256 -+C 674000000 6900000 NONE QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/dk-Copenhagen-AFDK dvb-apps/util/scan/dvb-c/dk-Copenhagen-AFDK ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/dk-Copenhagen-AFDK 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/dk-Copenhagen-AFDK 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,11 @@ -+# AFDK, Copenhagen -+# http://www.afdk.tv/ -+# freq sr fec mod -+C 386000000 6875000 NONE QAM64 -+C 394000000 6875000 NONE QAM64 -+C 402000000 6875000 NONE QAM64 -+C 490000000 6875000 NONE QAM64 -+C 602000000 6875000 NONE QAM64 -+C 610000000 6875000 NONE QAM64 -+C 618000000 6875000 NONE QAM64 -+C 794000000 6875000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/dk-Odense dvb-apps/util/scan/dvb-c/dk-Odense ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/dk-Odense 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/dk-Odense 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# Glentevejs Antennelaug (Denmark / Odense) -+# freq sr fec mod -+C 442000000 6900000 NONE QAM64 -+C 434000000 6875000 NONE QAM256 -+C 255000000 5000000 NONE QAM256 -+C 506000000 6875000 NONE QAM256 -+C 562000000 6875000 NONE QAM256 -+C 610000000 6875000 NONE QAM256 -+C 754000000 6875000 NONE QAM256 -+C 770000000 6875000 NONE QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/es-Euskaltel dvb-apps/util/scan/dvb-c/es-Euskaltel ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/es-Euskaltel 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/es-Euskaltel 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+# Scan config for Euskaltel (DVB-C) -+# Basque Country - Spain -+# file automatically generated by w_scan -+# (http://free.pages.at/wirbel4vdr/w_scan/index2.html) -+# freq sr fec mod -+C 714000000 6875000 NONE QAM64 -+C 722000000 6875000 NONE QAM64 -+C 730000000 6875000 NONE QAM64 -+C 738000000 6875000 NONE QAM64 -+C 746000000 6875000 NONE QAM64 -+C 754000000 6875000 NONE QAM64 -+C 762000000 6875000 NONE QAM64 -+C 770000000 6875000 NONE QAM64 -+C 778000000 6875000 NONE QAM64 -+C 786000000 6875000 NONE QAM64 -+C 794000000 6875000 NONE QAM64 -+C 802000000 6875000 NONE QAM64 -+C 810000000 6875000 NONE QAM64 -+C 818000000 6875000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-3ktv dvb-apps/util/scan/dvb-c/fi-3ktv ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-3ktv 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/fi-3ktv 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,20 @@ --# 3KTV --# freq sr fec mod --C 306000000 6875000 NONE QAM64 -+# 3KTV network reference channels -+# freq sr fec mod -+C 154000000 6875000 NONE QAM128 -+C 162000000 6875000 NONE QAM128 -+C 170000000 6875000 NONE QAM128 -+C 232000000 6875000 NONE QAM128 -+C 298000000 6875000 NONE QAM128 -+C 306000000 6875000 NONE QAM128 -+C 314000000 6875000 NONE QAM128 -+C 322000000 6875000 NONE QAM128 -+C 330000000 6875000 NONE QAM128 -+C 338000000 6875000 NONE QAM128 -+C 346000000 6875000 NONE QAM128 -+C 354000000 6875000 NONE QAM128 -+C 362000000 6875000 NONE QAM128 -+C 370000000 6875000 NONE QAM128 -+C 378000000 6875000 NONE QAM128 -+C 394000000 6875000 NONE QAM128 -+C 402000000 6875000 NONE QAM128 -+C 450000000 6875000 NONE QAM128 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-HTV dvb-apps/util/scan/dvb-c/fi-HTV ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-HTV 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/fi-HTV 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# HTV -+# freq sr fec mod -+C 283000000 5900000 NONE QAM128 -+C 154000000 6900000 NONE QAM128 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-jkl dvb-apps/util/scan/dvb-c/fi-jkl ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-jkl 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/fi-jkl 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# OnCable (Finland / Jyväskylä) -+# freq sr fec mod -+C 514000000 6900000 NONE QAM128 -+C 426000000 6900000 NONE QAM128 -+C 162000000 6900000 NONE QAM128 -+C 418000000 6900000 NONE QAM128 -+C 490000000 6900000 NONE QAM128 -+C 498000000 6900000 NONE QAM128 -+C 402000000 6900000 NONE QAM128 -+C 410000000 6900000 NONE QAM128 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-Joensuu-Tikka dvb-apps/util/scan/dvb-c/fi-Joensuu-Tikka ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-Joensuu-Tikka 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/fi-Joensuu-Tikka 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,13 @@ -+# DVB-C, Tikka Media, Joensuu, Finland -+# freq sr fec mod -+C 154000000 6900000 NONE QAM128 -+C 162000000 6900000 NONE QAM128 -+C 170000000 6900000 NONE QAM128 -+C 402000000 6900000 NONE QAM128 -+C 410000000 6900000 NONE QAM128 -+C 418000000 6900000 NONE QAM128 -+C 426000000 6900000 NONE QAM128 -+C 434000000 6900000 NONE QAM128 -+C 458000000 6900000 NONE QAM128 -+C 466000000 6900000 NONE QAM128 -+C 474000000 6900000 NONE QAM128 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-sonera dvb-apps/util/scan/dvb-c/fi-sonera ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-sonera 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/fi-sonera 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Sonera kaapeli-tv (Finland) -+# Maksuttomat kanavat ovat 162 ja 170 MHz:n muxeissa -+# -+# freq      sr      fec  mod -+C 154000000 6900000 NONE QAM128 -+C 162000000 6900000 NONE QAM128 -+C 170000000 6900000 NONE QAM128 -+C 314000000 6900000 NONE QAM128 -+C 322000000 6900000 NONE QAM128 -+C 338000000 6900000 NONE QAM128 -+C 346000000 6900000 NONE QAM128 -+C 354000000 6900000 NONE QAM128 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-TTV dvb-apps/util/scan/dvb-c/fi-TTV ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-TTV 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/fi-TTV 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# TTV -+# freq sr fec mod -+C 418000000 6900000 NONE QAM128 -+C 346000000 6900000 NONE QAM128 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-Turku dvb-apps/util/scan/dvb-c/fi-Turku ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-Turku 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/fi-Turku 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,17 @@ -+# Turun Kaapelitelevisio Oy (Turku) -+# freq sr fec mod -+C 146000000 6900000 NONE QAM128 -+C 154000000 6900000 NONE QAM128 -+C 162000000 6900000 NONE QAM128 -+C 322000000 6900000 NONE QAM128 -+C 330000000 6900000 NONE QAM128 -+C 338000000 6900000 NONE QAM128 -+C 362000000 6900000 NONE QAM128 -+C 378000000 6900000 NONE QAM128 -+C 386000000 6900000 NONE QAM128 -+C 402000000 6900000 NONE QAM128 -+C 410000000 6900000 NONE QAM128 -+C 418000000 6900000 NONE QAM128 -+C 426000000 6900000 NONE QAM128 -+C 442000000 6900000 NONE QAM128 -+C 354000000 6900000 NONE QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fr-noos-numericable dvb-apps/util/scan/dvb-c/fr-noos-numericable ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fr-noos-numericable 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/fr-noos-numericable 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,41 @@ -+# Cable en France -+# freq sr fec mod -+C 123000000 6875000 NONE QAM64 -+C 131000000 6875000 NONE QAM64 -+C 139000000 6875000 NONE QAM64 -+C 147000000 6875000 NONE QAM64 -+C 155000000 6875000 NONE QAM64 -+C 163000000 6875000 NONE QAM64 -+C 171000000 6875000 NONE QAM64 -+C 179000000 6875000 NONE QAM64 -+C 187000000 6875000 NONE QAM64 -+C 195000000 6875000 NONE QAM64 -+C 203000000 6875000 NONE QAM64 -+C 211000000 6875000 NONE QAM64 -+C 219000000 6875000 NONE QAM64 -+C 227000000 6875000 NONE QAM64 -+C 235000000 6875000 NONE QAM64 -+C 243000000 6875000 NONE QAM64 -+C 251000000 6875000 NONE QAM64 -+C 259000000 6875000 NONE QAM64 -+C 267000000 6875000 NONE QAM64 -+C 275000000 6875000 NONE QAM64 -+C 283000000 6875000 NONE QAM64 -+C 291000000 6875000 NONE QAM64 -+C 299000000 6875000 NONE QAM64 -+C 315000000 6875000 NONE QAM64 -+C 323000000 6875000 NONE QAM64 -+C 339000000 6875000 NONE QAM64 -+C 347000000 6875000 NONE QAM64 -+C 706000000 6875000 NONE QAM64 -+C 714000000 6875000 NONE QAM64 -+C 722000000 6875000 NONE QAM64 -+C 730000000 6875000 NONE QAM64 -+C 738000000 6875000 NONE QAM64 -+C 746000000 6875000 NONE QAM64 -+C 748000000 6875000 NONE QAM64 -+C 754000000 6875000 NONE QAM64 -+C 762000000 6875000 NONE QAM64 -+C 834000000 6875000 NONE QAM64 -+C 842000000 6875000 NONE QAM64 -+C 850000000 6875000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/lu-Ettelbruck-ACE dvb-apps/util/scan/dvb-c/lu-Ettelbruck-ACE ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/lu-Ettelbruck-ACE 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/lu-Ettelbruck-ACE 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,20 @@ -+# Scan config for Antenne Collective Ettelbruck a.s.b.l. -+# (http://antenne-ettelbruck.lu) -+# Luxembourg - Ettelbruck -+# freq sr fec mod -+C 634000000 6900000 NONE QAM64 -+C 642000000 6900000 NONE QAM64 -+C 650000000 6900000 NONE QAM64 -+C 666000000 6900000 NONE QAM64 -+C 674000000 6900000 NONE QAM64 -+C 682000000 6900000 NONE QAM64 -+C 690000000 6900000 NONE QAM64 -+C 698000000 6900000 NONE QAM64 -+C 706000000 6900000 NONE QAM64 -+C 714000000 6900000 NONE QAM64 -+C 656000000 3450000 NONE QAM64 -+C 660000000 3450000 NONE QAM64 -+C 720000000 3450000 NONE QAM64 -+C 732000000 3450000 NONE QAM64 -+C 724000000 3450000 NONE QAM64 -+C 728000000 3450000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/nl-Ziggo dvb-apps/util/scan/dvb-c/nl-Ziggo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/nl-Ziggo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/nl-Ziggo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,14 @@ -+# Initial Tuning file for nl-Ziggo -+# This file only lists the main -+# frequencies. You still need to do -+# a network scan to find other -+# transponders. -+# -+# based on: -+# http://blob.ziggo.nl/dynamic/NL_HOME/PDF-UPLOAD/Gebruikers-Handleiding-DigitaleTV.pdf -+# Chapter 4 -+# -+C 372000000 6875000 NONE QAM64 # Main Frequency Ziggo/Casema -+C 514000000 6875000 NONE QAM64 # Main Frequency Ziggo/Multikabel -+C 356000000 6875000 NONE QAM64 # Main Frequency Ziggo/@Home Zuid -+C 369000000 6875000 NONE QAM64 # Main Frequency Ziggo/@Home Noord -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/nl-Ziggo-Zwolle dvb-apps/util/scan/dvb-c/nl-Ziggo-Zwolle ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/nl-Ziggo-Zwolle 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/nl-Ziggo-Zwolle 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,26 @@ -+C 313000000 6875000 NONE QAM64 # TS 1 -+C 361000000 6875000 NONE QAM64 # TS 2 -+C 353000000 6875000 NONE QAM64 # TS 3 -+C 345000000 6875000 NONE QAM64 # TS 4 -+C 818000000 6875000 NONE QAM64 # TS 5 -+C 329000000 6875000 NONE QAM64 # TS 6 -+C 810000000 6875000 NONE QAM64 # TS 7 -+C 305000000 6875000 NONE QAM64 # TS 8 -+C 762000000 6875000 NONE QAM64 # TS 9 -+C 618000000 6875000 NONE QAM64 # TS 10 -+C 610000000 6875000 NONE QAM64 # TS 11 -+C 337000000 6875000 NONE QAM64 # TS 12 -+C 321000000 6875000 NONE QAM64 # TS 13 -+C 385000000 6875000 NONE QAM64 # TS 14 -+C 393000000 6875000 NONE QAM64 # TS 15 -+C 401000000 6875000 NONE QAM64 # TS 16 -+C 369000000 6875000 NONE QAM64 # TS 18 (main TS) -+C 297000000 6875000 NONE QAM64 # TS 19 -+C 377000000 6875000 NONE QAM64 # TS 22 -+C 754000000 6875000 NONE QAM64 # TS 23 -+C 642000000 6875000 NONE QAM64 # TS 24 -+C 650000000 6875000 NONE QAM64 # TS 25 -+C 794000000 6875000 NONE QAM64 # TS 26 -+C 409000000 6875000 NONE QAM64 # TS 27 -+C 425000000 6875000 NONE QAM64 # TS 206 -+C 417000000 6875000 NONE QAM64 # TS 207 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/no-Oslo-CanalDigital dvb-apps/util/scan/dvb-c/no-Oslo-CanalDigital ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/no-Oslo-CanalDigital 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/no-Oslo-CanalDigital 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,13 @@ -+# no-oslo-CanalDigital (cable) -+C 354000000 6950000 NONE QAM64 -+C 362000000 6950000 NONE QAM64 -+C 370000000 6950000 NONE QAM64 -+C 378000000 6950000 NONE QAM64 -+C 386000000 6950000 NONE QAM64 -+C 394000000 6950000 NONE QAM64 -+C 402000000 6950000 NONE QAM64 -+C 410000000 6950000 NONE QAM64 -+C 418000000 6950000 NONE QAM64 -+C 426000000 6950000 NONE QAM64 -+C 450000000 6950000 NONE QAM64 -+C 474000000 6950000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/no-Oslo-Get dvb-apps/util/scan/dvb-c/no-Oslo-Get ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/no-Oslo-Get 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/no-Oslo-Get 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,22 @@ -+# no-Oslo-Get (cable) -+C 241000000 6900000 NONE QAM256 -+C 272000000 6900000 NONE QAM256 -+C 280000000 6900000 NONE QAM256 -+C 290000000 6900000 NONE QAM256 -+C 298000000 6900000 NONE QAM256 -+C 306000000 6900000 NONE QAM256 -+C 314000000 6900000 NONE QAM256 -+C 322000000 6900000 NONE QAM256 -+C 330000000 6900000 NONE QAM256 -+C 338000000 6900000 NONE QAM256 -+C 346000000 6900000 NONE QAM256 -+C 354000000 6900000 NONE QAM256 -+C 362000000 6900000 NONE QAM256 -+C 370000000 6900000 NONE QAM256 -+C 378000000 6900000 NONE QAM256 -+C 386000000 6900000 NONE QAM256 -+C 394000000 6900000 NONE QAM256 -+C 410000000 6900000 NONE QAM256 -+C 442000000 6952000 NONE QAM256 -+C 482000000 6900000 NONE QAM256 -+C 498000000 6900000 NONE QAM256 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/se-comhem dvb-apps/util/scan/dvb-c/se-comhem ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/se-comhem 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/se-comhem 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# com hem -+# freq sr fec mod -+C 362000000 6875000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/se-Gothnet dvb-apps/util/scan/dvb-c/se-Gothnet ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/se-Gothnet 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-c/se-Gothnet 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,23 @@ -+# Gothnet DVB-C -+# Updated: 2008-09-19 -+# freq sr fec mod -+ -+# Free channels -+C 490000000 6875000 NONE QAM64 -+C 498000000 6875000 NONE QAM64 -+C 506000000 6875000 NONE QAM64 -+C 514000000 6875000 NONE QAM64 -+ -+# SPA channels -+C 682000000 6900000 NONE QAM64 -+C 690000000 6900000 NONE QAM64 -+C 698000000 6900000 NONE QAM64 -+C 706000000 6900000 NONE QAM64 -+ -+# Canal Digital channels -+C 314000000 7000000 NONE QAM64 -+C 322000000 7000000 NONE QAM64 -+C 346000000 7000000 NONE QAM64 -+C 354000000 7000000 NONE QAM64 -+C 362000000 7000000 NONE QAM64 -+C 370000000 7000000 NONE QAM64 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Helsinki dvb-apps/util/scan/dvb-h/fi-Helsinki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Helsinki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-h/fi-Helsinki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,2 @@ -+# H freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+H 586000000 8MHz 1/2 NONE QAM16 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Oulu dvb-apps/util/scan/dvb-h/fi-Oulu ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Oulu 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-h/fi-Oulu 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,2 @@ -+# H freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+H 498000000 8MHz 1/2 NONE QAM16 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Oulu-Nokia-devel dvb-apps/util/scan/dvb-h/fi-Oulu-Nokia-devel ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Oulu-Nokia-devel 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-h/fi-Oulu-Nokia-devel 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Nokia Oulu delelopment network -+# Network Name 'Nokia Oulu' -+# H freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+H 690000000 8MHz 1/2 NONE QPSK 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Turku dvb-apps/util/scan/dvb-h/fi-Turku ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Turku 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-h/fi-Turku 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,2 @@ -+# H freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+H 498000000 8MHz 1/2 NONE QAM16 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/README dvb-apps/util/scan/dvb-h/README ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/README 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-h/README 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+These files are mainly for informational and experimental purposes. -+The DVB-H file format hasn't been specified in any way; currently it's just -+a copy of the DVB-T format. -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ABS1-75.0E dvb-apps/util/scan/dvb-s/ABS1-75.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ABS1-75.0E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/ABS1-75.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# ABS-1 @ 75E -+# freq pol sr fec -+S 12518000 V 22000000 AUTO -+S 12548000 V 22000000 AUTO -+S 12579000 V 22000000 AUTO -+S 12640000 V 22000000 AUTO -+S 12670000 V 22000000 AUTO -+S 12693000 V 10000000 AUTO -+S 12704000 V 3900000 AUTO -+S 12740000 V 7408000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Amazonas-61.0W dvb-apps/util/scan/dvb-s/Amazonas-61.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Amazonas-61.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Amazonas-61.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,54 @@ -+# Amazonas @ 61.0W -+# freq pol sr fec -+ -+S 3957000 H 06666000 AUTO -+S 3966000 H 06666000 AUTO -+S 3975000 H 06666000 AUTO -+S 3993000 H 06666000 AUTO -+S 4137000 H 03409000 AUTO -+S 3941000 V 03480000 AUTO -+S 12092000 V 30000000 AUTO -+S 12132000 V 30000000 AUTO -+S 4174000 H 03330000 AUTO -+S 11128000 V 06666000 AUTO -+S 11185000 V 11800000 AUTO -+S 11049000 V 02000000 AUTO -+S 12052000 V 27000000 AUTO -+S 10975000 V 27000000 AUTO -+S 3631000 H 02785000 AUTO -+S 10975000 H 26666000 AUTO -+S 3677000 H 04400000 AUTO -+S 3985000 H 04444000 AUTO -+S 11810000 V 06666000 AUTO -+S 11921000 V 21740000 AUTO -+S 11943000 V 04750000 AUTO -+S 4168000 H 07307000 AUTO -+S 12052000 H 26667000 AUTO -+S 12172000 H 27500000 AUTO -+S 12092000 H 27500000 AUTO -+S 11175000 H 28880000 AUTO -+S 4154000 H 09615000 AUTO -+S 11099000 V 07576000 AUTO -+S 11885000 H 04890000 AUTO -+S 11882000 V 11343000 AUTO -+S 11133000 V 03111000 AUTO -+S 11078000 V 01862000 AUTO -+S 11912000 H 02222000 AUTO -+S 11906000 H 02220000 AUTO -+S 11108000 V 02170000 AUTO -+S 12132000 H 27500000 AUTO -+S 11135000 H 26667000 AUTO -+S 4144000 V 04540000 AUTO -+S 11808000 H 11111000 AUTO -+S 11972000 H 26667000 AUTO -+S 4156000 V 04540000 AUTO -+S 4149000 V 04540000 AUTO -+S 3948000 H 13300000 AUTO -+S 4178000 H 03333000 AUTO -+S 11844000 V 16600000 AUTO -+S 11095000 H 30000000 AUTO -+S 11790000 H 03600000 AUTO -+S 12172000 V 30000000 AUTO -+S 11015000 H 26666000 AUTO -+S 11055000 H 27500000 AUTO -+S 12012000 H 27500000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC1-103w dvb-apps/util/scan/dvb-s/AMC1-103w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC1-103w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/AMC1-103w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# AMC 1 @ 103W -+# freq pol sr fec -+ -+S 11942000 V 20000000 AUTO -+S 12100000 V 20000000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC2-85w dvb-apps/util/scan/dvb-s/AMC2-85w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC2-85w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/AMC2-85w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# AMC 2 @ 85W -+# freq pol sr fec -+ -+S 11731000 H 13021000 AUTO -+S 11744000 H 13021000 AUTO -+S 11771000 H 13021000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC3-87w dvb-apps/util/scan/dvb-s/AMC3-87w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC3-87w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/AMC3-87w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# AMC 3 @ 87.0W -+# freq pol sr fec -+ -+S 11716000 H 04859000 AUTO -+S 12142000 V 30000000 AUTO -+S 12147000 H 04340000 AUTO -+S 12159000 H 04444000 AUTO -+S 12165000 H 04444000 AUTO -+S 12172000 H 04444000 AUTO -+S 12182000 V 30000000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC4-101w dvb-apps/util/scan/dvb-s/AMC4-101w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC4-101w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/AMC4-101w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# AMC 4 @ 101.0W -+# freq pol sr fec -+ -+S 11573000 V 07234000 AUTO -+S 11655000 V 30000000 AUTO -+S 11708000 V 02170000 AUTO -+S 11822000 H 05700000 AUTO -+S 11860000 H 28138000 AUTO -+S 12120000 V 30000000 AUTO -+S 12169000 H 03003000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC5-79w dvb-apps/util/scan/dvb-s/AMC5-79w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC5-79w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/AMC5-79w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# AMC 5 @ 79W -+# freq pol sr fec -+ -+S 11742000 V 11110000 AUTO -+S 12182000 H 23000000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC6-72w dvb-apps/util/scan/dvb-s/AMC6-72w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC6-72w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/AMC6-72w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,44 @@ -+# AMC 6 @ 72W -+# freq pol sr fec -+ -+S 11482000 V 02656000 AUTO -+S 11494000 V 06560000 AUTO -+S 11499000 V 02964000 AUTO -+S 11505000 V 02963000 AUTO -+S 11546000 V 12000000 AUTO -+S 11548000 H 03002000 AUTO -+S 11552000 H 03002000 AUTO -+S 11557000 H 04392000 AUTO -+S 11563000 H 04392000 AUTO -+S 11570000 H 04392000 AUTO -+S 11576000 H 04392000 AUTO -+S 11586000 H 02652000 AUTO -+S 11603000 V 08500000 AUTO -+S 11605000 V 03600000 AUTO -+S 11611000 V 03400000 AUTO -+S 11628000 V 06560000 AUTO -+S 11637000 V 02800000 AUTO -+S 11641000 V 03702000 AUTO -+S 11648000 V 07500000 AUTO -+S 11667000 V 07400000 AUTO -+S 11674000 V 04000000 AUTO -+S 11680000 V 03255000 AUTO -+S 11703000 V 03979000 AUTO -+S 11709000 V 03979000 AUTO -+S 11715000 V 03979000 AUTO -+S 11746000 V 03979000 AUTO -+S 11748000 H 14015000 AUTO -+S 11752000 V 03979000 AUTO -+S 11763000 V 03979000 AUTO -+S 11817000 H 05000000 AUTO -+S 11874000 V 04000000 AUTO -+S 11986000 V 03979000 AUTO -+S 11995000 V 03979000 AUTO -+S 12004000 V 03979000 AUTO -+S 12013000 V 03979000 AUTO -+S 12025000 V 03979000 AUTO -+S 12031000 V 03979000 AUTO -+S 12046000 H 06111000 AUTO -+S 12055000 V 06890000 AUTO -+S 12144000 V 02573000 AUTO -+S 12188000 H 06511000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC9-83w dvb-apps/util/scan/dvb-s/AMC9-83w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC9-83w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/AMC9-83w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# AMC 9 @ 83W -+# freq pol sr fec -+ -+S 11745000 H 04232000 AUTO -+S 11751000 H 04232000 AUTO -+S 11757000 H 04232000 AUTO -+S 11763000 H 04232000 AUTO -+S 11769000 H 04232000 AUTO -+S 11775000 H 04232000 AUTO -+S 11826000 H 05632000 AUTO -+S 11864000 H 03979000 AUTO -+S 11871000 H 13000000 AUTO -+S 11889000 H 13025000 AUTO -+S 11926000 V 06511000 AUTO -+S 11953000 V 03979000 AUTO -+S 11960000 H 05000000 AUTO -+S 12002000 H 03979000 AUTO -+S 12011000 H 03979000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Amos-4w dvb-apps/util/scan/dvb-s/Amos-4w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Amos-4w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Amos-4w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,48 @@ -+# Amos 6 @ 4W -+# freq pol sr fec -+S 10722000 H 27500000 3/4 -+S 10722000 V 27500000 3/4 -+S 10722000 V 30000000 2/3 -+S 10758000 V 27500000 3/4 -+S 10758000 V 30000000 2/3 -+S 10759000 H 30000000 3/4 -+S 10806000 H 27500000 5/6 -+S 10806000 V 27500000 3/4 -+S 10842000 H 27500000 7/8 -+S 10842000 V 27500000 3/4 -+S 10842000 V 30000000 2/3 -+S 10890000 H 27500000 7/8 -+S 10890000 V 27500000 3/4 -+S 10925000 H 27500000 7/8 -+S 10925000 V 27500000 3/4 -+S 10972000 V 27500000 3/4 -+S 11008000 V 27500000 3/4 -+S 11015000 H 2295000 3/4 -+S 11123000 H 1850000 7/8 -+S 11167000 H 12500000 5/6 -+S 11179000 H 6666000 3/4 -+S 11260000 H 27500000 3/4 -+S 11304000 H 19540000 3/4 -+S 11319000 H 2750000 3/4 -+S 11329000 H 3333000 3/4 -+S 11333000 H 3500000 3/4 -+S 11347000 H 3350000 3/4 -+S 11384000 H 19000000 5/6 -+S 11411000 H 7925000 5/6 -+S 11429000 H 5925000 3/4 -+S 11435000 H 2089000 3/4 -+S 11474000 V 27500000 3/4 -+S 11510000 V 30000000 2/3 -+S 11558000 V 27500000 3/4 -+S 11559000 H 13400000 7/8 -+S 11572000 H 8888000 3/4 -+S 11592000 H 21350000 3/4 -+S 11593000 V 27500000 3/4 -+S 11625000 V 3000000 3/4 -+S 11630000 H 2963000 3/4 -+S 11630000 V 3000000 3/4 -+S 11637000 V 1480000 3/4 -+S 11647000 H 9167000 3/4 -+S 11647000 V 8518000 3/4 -+S 11654000 H 2000000 5/6 -+S 11658000 V 8520000 5/6 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Anik-F1-107.3W dvb-apps/util/scan/dvb-s/Anik-F1-107.3W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Anik-F1-107.3W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Anik-F1-107.3W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Anik F1 @ 107.3W -+# freq pol sr fec -+ -+S 12002000 H 19980000 AUTO -+S 12063000 H 19980000 AUTO -+S 12155000 H 22500000 AUTO -+S 12185000 H 19980000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AsiaSat3S_C-105.5E dvb-apps/util/scan/dvb-s/AsiaSat3S_C-105.5E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AsiaSat3S_C-105.5E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/AsiaSat3S_C-105.5E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,122 @@ -+# AsiaSat 3S 105.5E C-BAND -+# Generated by Xingbo Wang -+# Apr 2, 2005 -+ -+# MPEG-2 QPSK -+# freq pol sr fec -+ -+# [encrypted] ZEE English, ZEE TV International, ZEE Movies, MX, ZEE TV SE Asia, ZEE TV Asia, Trendz -+S 3700000 V 27500000 3/4 -+ -+# BTV World -+S 3725000 V 4450000 3/4 -+ -+# SAB TV -+S 3743000 V 3300000 3/4 -+ -+# AAJ TV -+S 3750000 V 2820000 3/4 -+ -+# Arirang TV -+S 3755150 V 4417900 7/8 -+ -+# [encrypted] STAR Plus India, STAR Movies India, STAR News India, National Geographic India, STAR Gold, STAR Movies (Middle East) -+# STAR Utsav -+S 3780000 V 28100000 3/4 -+ -+# Chinese Provincial TV: Guangxi, Shanxi, Anhui, Jiangsu, Heilongjiang -+S 3806000 V 4420000 3/4 -+S 3813000 V 4420000 3/4 -+S 3820000 V 4420000 3/4 -+S 3827000 V 4420000 3/4 -+S 3834000 V 4420000 3/4 -+ -+# [encrypted] ESPN Taiwan, STAR Sports Taiwan, ESPN Asia, STAR Sports South East Asia, STAR Sports India, ESPN India, ESPN Philippines -+S 3860000 V 27500000 3/4 -+ -+# Dragon TV -+S 3886000 V 4800000 3/4 -+ -+# Shandong TV -+S 3895000 V 6813000 3/4 -+ -+# CCTV-1(comprehensive), China National Radio Channel 1 -+S 3904000 V 4420000 7/8 -+ -+# Jilin Provincial TV -+S 3914500 V 4420000 3/4 -+ -+# [encrypted] A1, History, STAR Movies SEA/China, STAR World India, STAR Plus Pakistan, Channel[V] India, STAR Chinese Movies, CNBC India, STAR One, STAR Vijay -+S 3980000 V 28100000 3/4 -+ -+# Sahara One, Sahara Samay National, Sahara Samay Mumbai, Sahara Samay Uttar Pradesh, Sahara Samay Bihar, Sahara Samay Madhya Pradesh -+S 4020000 V 27250000 3/4 -+ -+# Tianjin TV -+S 4046000 V 5950000 3/4 -+ -+# PTV-1, PTV World, PTV Channel 3, AVT Khyber -+S 4091000 V 13333000 3/4 -+ -+# PTV National -+S 4106000 V 3333300 3/4 -+ -+# Indus News -+S 4115750 V 3333000 3/4 -+ -+# [encrypted] ZEE Biz, ZEE News, ZEE Cinema, ZEE Music, Alpha TV Punjabi, Alpha TV Gujarati, Alpha TV Bangla, Alpha TV Marathi, Smile TV -+S 4140000 V 27500000 3/4 -+ -+# Chinese Provincial TV: Henan, Fujian, Jiangxi, Liaoning -+S 4166000 V 4420000 3/4 -+S 4180000 V 4420000 3/4 -+S 4187000 V 4420000 3/4 -+S 4194000 V 4420000 3/4 -+ -+# CETV -+S 3680000 H 26670000 3/4 -+ -+# Channel NewsAsia -+S 3706000 H 6000000 3/4 -+ -+# Asia Plus -+S 3715500 H 7000000 3/4 -+ -+# TVB 8, CETV -+S 3729000 H 13650000 3/4 -+ -+# Network of the World, Bloomberg TV Asia, Indus Vision, Indus Music, Muslim TV Ahmadiyya, Living Asia Channel -+# [encrypted] Filmazia -+S 3760000 H 26000000 7/8 -+ -+# [encrypted] Fox News, Sky News, STAR Movies Int'l Taiwan, National Geographic Taiwan, STAR Chinese Channel, STAR Movies mandarin, Channel[V] Taiwan -+S 3840000 H 26850000 7/8 -+ -+# STAR Sports Asia -+# [encrypted] ESPN China, STAR Sports Hong Kong, ESPN Hong Kong -+S 3920000 H 26750000 7/8 -+ -+# [encrypted] CNN International Asia, CNN Newsource, Cartoon Network Asia, Cartoon Network Taiwan, Cartoon Network Philippines, Cartoon Network Australia/New Zealand, TCM Australia, Boomerang -+S 3960000 H 27500000 3/4 -+ -+# [encrypted] Phoenix Movies, star World Asia, Star Movies Int'l, Channel[V] International, National Geographic Regional -+# Phoenix Chinese Channel, Phoenix Info News Channel, Xiong Kong Int'l, Xing Kong Regional, Channel[V](Greater China) -+S 4000000 H 26850000 7/8 -+ -+# Chinese Provincial TV: Hubei, Sichuan -+S 4034600 H 4420000 3/4 -+S 4051000 H 4420000 3/4 -+ -+# Chinese Provincial TV: Qinghai, Hunan -+S 4067000 H 4420000 3/4 -+S 4082000 H 4420000 3/4 -+ -+# Sun TV -+S 4094000 H 5555000 3/4 -+ -+# MATV, Horizon Channel -+# [encrypted] Tian Ying Movies Channel, TVB Xing He Channel -+S 4111000 H 13650000 3/4 -+ -+# CCTV Channel 4 (International), Channel 9 (English language), CCTV E&F -+S 4129000 H 13240000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Astra-28.2E dvb-apps/util/scan/dvb-s/Astra-28.2E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Astra-28.2E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Astra-28.2E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,186 @@ -+# Astra 28.2E SDT info service transponder -+# freq pol sr fec -+ -+## Astra 2A -+# Transponder 1 -+S 11720000 H 29500000 3/4 -+# Transponder 2 -+S 11740000 V 27500000 2/3 -+# Transponder 3 -+S 11758000 H 27500000 2/3 -+# Transponder 4 -+S 11778000 V 27500000 2/3 -+# Transponder 5 -+S 11798000 H 29500000 3/4 -+# Transponder 6 -+S 11817000 V 27500000 2/3 -+# Transponder 7 -+S 11836000 H 27500000 2/3 -+# Transponder 8 -+S 11856000 V 27500000 2/3 -+# Transponder 9 -+S 11876000 H 27500000 2/3 -+# Transponder 10 -+S 11895000 V 27500000 2/3 -+# Transponder 11 -+S 11914000 H 27500000 2/3 -+# Transponder 12 -+S 11934000 V 27500000 2/3 -+# Transponder 13 -+S 11954000 H 27500000 2/3 -+# Transponder 18 -+S 12051000 V 27500000 2/3 -+# Transponder 22 -+S 12129000 V 27500000 2/3 -+# Transponder 23 -+S 12148000 H 27500000 2/3 -+# Transponder 24 -+S 12168000 V 27500000 2/3 -+# Transponder 27 -+S 12226000 H 27500000 2/3 -+# Transponder 28 -+S 12246000 V 27500000 2/3 -+# Transponder 37 -+S 12422000 H 27500000 2/3 -+# Transponder 40 -+S 12480000 V 27500000 2/3 -+ -+## Astra 2B -+# Transponder 14 -+S 11973000 V 27500000 2/3 -+# Transponder 15 -+S 11992000 H 27500000 2/3 -+# Transponder 16 -+S 12012000 V 27500000 2/3 -+# Transponder 17 -+S 12032000 H 27500000 2/3 -+# Transponder 19 -+S 12070000 H 27500000 2/3 -+# Transponder 20 -+S 12090000 V 27500000 2/3 -+# Transponder 21 -+S 12110000 H 27500000 2/3 -+# Transponder 25 -+S 12188000 H 27500000 2/3 -+# Transponder 26 -+S 12207000 V 27500000 2/3 -+# Transponder 29 -+S 12266000 H 27500000 2/3 -+# Transponder 30 -+S 12285000 V 27500000 2/3 -+# Transponder 31 -+S 12304000 H 27500000 2/3 -+# Transponder 32 -+S 12324000 V 29500000 3/4 -+# Transponder 33 -+S 12344000 H 29500000 3/4 -+# Transponder 34 -+S 12363000 V 29500000 3/4 -+# Transponder 35 -+S 12382000 H 27500000 2/3 -+# Transponder 36 -+S 12402000 V 27500000 2/3 -+# Transponder 38 -+S 12441000 V 27500000 2/3 -+# Transponder 39 -+S 12460000 H 27500000 2/3 -+ -+## Astra 2D -+# Transponder 41 -+S 10714000 H 22000000 5/6 -+# Transponder 42 -+S 10729000 V 22000000 5/6 -+# Transponder 43 -+S 10744000 H 22000000 5/6 -+# Transponder 44 -+S 10758000 V 22000000 5/6 -+# Transponder 45 -+S 10773000 H 22000000 5/6 -+# Transponder 46 -+S 10788000 V 22000000 5/6 -+# Transponder 47 -+S 10803000 H 22000000 5/6 -+# Transponder 48 -+S 10818000 V 22000000 5/6 -+# Transponder 49 -+S 10832000 H 22000000 5/6 -+# Transponder 50 -+S 10847000 V 22000000 5/6 -+# Transponder 51 -+S 10862000 H 22000000 5/6 -+# Transponder 52 -+S 10876000 V 22000000 5/6 -+# Transponder 53 -+S 10891000 H 22000000 5/6 -+# Transponder 54 -+S 10906000 V 22000000 5/6 -+# Transponder 55 -+S 10921000 H 22000000 5/6 -+# Transponder 56 -+S 10936000 V 22000000 5/6 -+ -+## Eurobird 1 -+# Transponder C1 -+S 11222170 H 27500000 2/3 -+# Transponder C2 -+S 11223670 V 27500000 2/3 -+# Transponder C2 -+S 11259000 V 27500000 2/3 -+# Transponder C1 -+S 11261000 H 27500000 2/3 -+# Transponder C3 -+S 11307000 H 27500000 2/3 -+# Transponder C4 -+S 11307000 V 27500000 2/3 -+# Transponder C4 -+S 11343000 V 27500000 2/3 -+# Transponder C3 -+S 11344000 H 27500000 2/3 -+# Transponder C5 -+S 11390000 H 27500000 2/3 -+# Transponder C6 -+S 11390000 V 27500000 2/3 -+# Transponder C5 -+S 11426000 H 27500000 2/3 -+# Transponder C6 -+S 11426000 V 27500000 2/3 -+# Transponder D1 -+S 11469000 H 27500000 2/3 -+# Transponder D2S -+S 11488000 V 27500000 2/3 -+# Transponder D3S -+S 11508000 H 27500000 2/3 -+# Transponder D4S -+S 11527000 V 27500000 2/3 -+# Transponder D5 -+S 11546000 H 27500000 2/3 -+# Transponder D6 -+S 11565000 V 27500000 2/3 -+# Transponder D7 -+S 11585000 H 27500000 2/3 -+# Transponder D8 -+S 11603850 V 27500000 2/3 -+# Transponder D9 -+S 11623000 H 27500000 2/3 -+# Transponder D10 -+S 11642000 V 27500000 2/3 -+# Transponder D11 -+S 11661540 H 27500000 2/3 -+# Transponder D12 -+S 11680770 V 27500000 2/3 -+# Transponder F1 -+S 12524000 H 27500000 2/3 -+# Transponder F2 -+S 12524000 V 27500000 2/3 -+# Transponder F1 -+S 12560000 H 27500000 2/3 -+# Transponder F2 -+S 12560000 V 27500000 2/3 -+# Transponder F4 -+S 12596000 V 27500000 2/3 -+# Transponder F3 -+S 12607000 H 27500000 3/4 -+# Transponder F4 -+S 12629000 V 6111000 3/4 -+# Transponder F5 -+S 12692000 V 19532000 1/2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Atlantic-Bird-1-12.5W dvb-apps/util/scan/dvb-s/Atlantic-Bird-1-12.5W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Atlantic-Bird-1-12.5W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Atlantic-Bird-1-12.5W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Atlantic Bird 1 @ 12.5W -+# freq pol sr fec -+S 11099000 H 2000000 5/6 -+S 11132000 H 3255000 3/4 -+S 11136000 V 3700000 5/6 -+S 11174000 H 15190000 3/4 -+S 11179000 V 22400000 2/3 -+S 11188000 H 5722000 5/6 -+S 11332000 H 6428000 2/3 -+S 11337000 H 1923000 7/8 -+S 11340000 H 2279000 5/6 -+S 11355000 H 11781000 7/8 -+S 11408000 V 27500000 3/4 -+S 11428000 H 30000000 5/6 -+S 11595000 V 27500000 5/6 -+S 11622000 H 3255000 AUTO -+S 11643000 H 2398000 AUTO -+S 11645000 V 4790000 AUTO -+S 11651000 V 3688000 AUTO -+S 12515000 H 17455000 3/4 -+S 12535000 V 2000000 3/4 -+S 12545000 H 17455000 3/4 -+S 12594000 H 2170000 3/4 -+S 12597000 H 1730000 3/4 -+S 12604000 H 1481000 3/4 -+S 12655000 H 4285000 3/4 -+S 12659000 H 2141000 3/4 -+S 12662000 V 3928000 3/4 -+S 12720000 V 1808000 3/4 -+S 12743000 V 3214000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B1-75.0W dvb-apps/util/scan/dvb-s/BrasilSat-B1-75.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B1-75.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/BrasilSat-B1-75.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,11 @@ -+# Brasilsat B1 @ 75.0W -+# freq pol sr fec -+ -+S 3648000 V 04285000 AUTO -+S 3657000 V 06620000 AUTO -+S 3653000 V 04710000 AUTO -+S 3655000 H 06620000 AUTO -+S 3629000 H 06620000 AUTO -+S 3711000 H 03200000 AUTO -+S 3644000 V 04440000 AUTO -+S 3638000 H 04440000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B2-65.0W dvb-apps/util/scan/dvb-s/BrasilSat-B2-65.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B2-65.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/BrasilSat-B2-65.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,34 @@ -+# Brasilsat B2 @ 65.0W -+# freq pol sr fec -+ -+S 3745000 H 03540000 AUTO -+S 4008000 H 03333000 AUTO -+S 4011000 V 05000000 AUTO -+S 3792000 V 03393000 AUTO -+S 4104000 V 03214000 AUTO -+S 4097000 V 06667000 AUTO -+S 3905000 H 06666000 AUTO -+S 3935000 H 06666000 AUTO -+S 3890000 H 06666000 AUTO -+S 3925000 H 06666000 AUTO -+S 4112000 V 04285000 AUTO -+S 3650000 V 04440000 AUTO -+S 3736000 H 01808000 AUTO -+S 3787000 H 06666000 AUTO -+S 3876000 V 02740000 AUTO -+S 4117000 V 02963000 AUTO -+S 3815000 H 06666000 AUTO -+S 3793000 H 06666000 AUTO -+S 3721000 H 02963000 AUTO -+S 3684000 H 06666000 AUTO -+S 3915000 H 06666000 AUTO -+S 3766000 H 03336000 AUTO -+S 3847000 H 04444000 AUTO -+S 3706000 H 02462000 AUTO -+S 3667000 H 07236000 AUTO -+S 3771000 V 01480000 AUTO -+S 3734000 V 02852000 AUTO -+S 3810000 H 13333000 AUTO -+S 3762000 H 02222000 AUTO -+S 3834000 H 03572000 AUTO -+S 3850000 H 01570000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B3-84.0W dvb-apps/util/scan/dvb-s/BrasilSat-B3-84.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B3-84.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/BrasilSat-B3-84.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,85 @@ -+# Brasilsat B3 @ 84.0W -+# freq pol sr fec -+ -+S 3728000 H 04340000 AUTO -+S 3698000 V 03333000 AUTO -+S 4054000 V 01287000 AUTO -+S 3745000 H 04300000 AUTO -+S 3738000 V 04708000 AUTO -+S 3923000 V 01808000 AUTO -+S 3768000 V 08000000 AUTO -+S 3955000 V 04340000 AUTO -+S 4167000 H 03255000 AUTO -+S 3791000 V 03330000 AUTO -+S 3866000 H 04425000 AUTO -+S 3932000 V 03255000 AUTO -+S 4132000 V 02532000 AUTO -+S 3906000 H 03928000 AUTO -+S 3858000 V 04288000 AUTO -+S 3665000 V 03177000 AUTO -+S 3732000 V 03214000 AUTO -+S 3774000 H 03330000 AUTO -+S 3927000 V 03255000 AUTO -+S 3710000 H 03261000 AUTO -+S 3883000 H 04278000 AUTO -+S 3770000 H 03333000 AUTO -+S 3754000 V 05000000 AUTO -+S 3764000 H 04285000 AUTO -+S 3910000 H 03616000 AUTO -+S 3705000 H 04280000 AUTO -+S 3852000 V 03806000 AUTO -+S 3845000 H 10127000 AUTO -+S 3936000 V 03255000 AUTO -+S 3653000 V 03807000 AUTO -+S 3751000 H 03565000 AUTO -+S 3871000 H 04435000 AUTO -+S 3895000 H 04430000 AUTO -+S 3936000 H 03255000 AUTO -+S 3800000 H 03255000 AUTO -+S 3855000 H 04000000 AUTO -+S 4171000 H 02170000 AUTO -+S 3716000 H 04800000 AUTO -+S 4068000 H 02600000 AUTO -+S 4070000 V 02964000 AUTO -+S 3949000 V 04340000 AUTO -+S 3684000 V 03200000 AUTO -+S 4169000 V 08140000 AUTO -+S 4144000 H 02734000 AUTO -+S 3736000 H 04285000 AUTO -+S 3790000 H 10444000 AUTO -+S 3724000 V 02075000 AUTO -+S 4121000 H 02500000 AUTO -+S 3629000 H 06666000 AUTO -+S 3970000 V 04445000 AUTO -+S 3985000 V 03300000 AUTO -+S 3916000 H 03255000 AUTO -+S 4155000 V 03255000 AUTO -+S 3692000 V 03330000 AUTO -+S 3644000 V 04687000 AUTO -+S 4087000 H 17200000 AUTO -+S 3889000 H 04440000 AUTO -+S 4176000 V 03515000 AUTO -+S 3829000 V 04340000 AUTO -+S 3805000 V 02662000 AUTO -+S 3943000 V 02460000 AUTO -+S 3757000 H 03565000 AUTO -+S 3696000 H 01808000 AUTO -+S 3989000 V 02666000 AUTO -+S 3690000 V 03200000 AUTO -+S 3657000 V 03600000 AUTO -+S 3996000 V 02300000 AUTO -+S 3926000 H 04000000 AUTO -+S 4126000 H 04000000 AUTO -+S 4136000 H 02142000 AUTO -+S 3675000 V 04285000 AUTO -+S 3931000 H 04000000 AUTO -+S 3786000 V 04286000 AUTO -+S 3688000 V 02308000 AUTO -+S 4075000 V 04444000 AUTO -+S 3911000 V 03255000 AUTO -+S 3824000 H 03002000 AUTO -+S 3778000 V 06850000 AUTO -+S 3710000 V 12960000 AUTO -+S 3877000 H 04450000 AUTO -+S 3940000 V 03255000 AUTO -+S 4064000 H 03300000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B4-70.0W dvb-apps/util/scan/dvb-s/BrasilSat-B4-70.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B4-70.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/BrasilSat-B4-70.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,39 @@ -+# Brasilsat B4 @ 70.0W -+# freq pol sr fec -+ -+S 3951000 H 03214000 AUTO -+S 3714000 V 04400000 AUTO -+S 3672000 H 04713000 AUTO -+S 3955000 H 04400000 AUTO -+S 3965000 V 02930000 AUTO -+S 3628000 H 03000000 AUTO -+S 3644000 V 03214000 AUTO -+S 3650000 H 04285000 AUTO -+S 3688000 H 06000000 AUTO -+S 3680000 H 06000000 AUTO -+S 3662000 V 04606000 AUTO -+S 3945000 H 03214000 AUTO -+S 3640000 H 03263000 AUTO -+S 3979000 V 03617000 AUTO -+S 3752000 V 06220000 AUTO -+S 3685000 V 04500000 AUTO -+S 3650000 V 04400000 AUTO -+S 3985000 H 02170000 AUTO -+S 4010000 H 13021000 AUTO -+S 3665000 H 04700000 AUTO -+S 3637000 H 02228000 AUTO -+S 3708000 V 03928000 AUTO -+S 4047000 V 07143000 AUTO -+S 3672000 V 08454000 AUTO -+S 3820000 V 27500000 AUTO -+S 3940000 V 27500000 AUTO -+S 3964000 H 01875000 AUTO -+S 3695000 H 03598000 AUTO -+S 3900000 V 27500000 AUTO -+S 3645000 H 03520000 AUTO -+S 3983000 V 01630000 AUTO -+S 3631000 H 04687000 AUTO -+S 3874000 V 05926000 AUTO -+S 3700000 V 09123000 AUTO -+S 3997000 V 02300000 AUTO -+S 3973000 V 04338000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Estrela-do-Sul-63.0W dvb-apps/util/scan/dvb-s/Estrela-do-Sul-63.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Estrela-do-Sul-63.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Estrela-do-Sul-63.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,27 @@ -+# Estrela do Sul @ 63.0W -+# freq pol sr fec -+ -+S 11892000 V 02964000 AUTO -+S 11987000 H 03330000 AUTO -+S 12054000 H 26660000 AUTO -+S 11830000 V 06000000 AUTO -+S 11603000 V 03124000 AUTO -+S 11598000 V 03124000 AUTO -+S 11803000 V 04444000 AUTO -+S 11958000 H 04444000 AUTO -+S 11610000 V 03124000 AUTO -+S 11861000 V 02964000 AUTO -+S 11879000 V 02964000 AUTO -+S 11903000 V 02362000 AUTO -+S 11817000 V 06666000 AUTO -+S 11577000 V 03124000 AUTO -+S 11582000 V 03124000 AUTO -+S 11982000 H 08888000 AUTO -+S 11888000 V 02392000 AUTO -+S 11898000 V 02480000 AUTO -+S 11871000 V 02000000 AUTO -+S 11795000 V 04444000 AUTO -+S 11845000 V 04444000 AUTO -+S 11640000 V 18100000 AUTO -+S 11875000 V 03333000 AUTO -+S 11543000 V 10410000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Eurobird1-28.5E dvb-apps/util/scan/dvb-s/Eurobird1-28.5E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Eurobird1-28.5E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Eurobird1-28.5E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# Eurobird 28.5E SDT info service transponder -+# freq pol sr fec -+S 11623000 H 27500000 2/3 -+S 11224000 V 27500000 2/3 -+S 11527000 V 27500000 2/3 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Eurobird9-9.0E dvb-apps/util/scan/dvb-s/Eurobird9-9.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Eurobird9-9.0E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Eurobird9-9.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,16 @@ -+# Eurobird 9.0E -+# freq pol sr fec -+S 11727000 V 27500000 5/6 -+S 11747000 H 27500000 3/4 -+S 11766000 V 27500000 5/6 -+S 11785000 H 27500000 3/4 -+S 11804000 V 27500000 3/4 -+S 11823000 H 27500000 3/4 -+S 11843000 V 27500000 3/4 -+S 11881000 V 26700000 3/4 -+S 11919000 V 27500000 5/6 -+S 11938000 H 27500000 3/4 -+S 11977000 H 27500000 3/4 -+S 11996000 V 27500000 3/4 -+S 12054000 H 27500000 3/4 -+S 12092000 H 27500000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/EutelsatW2-16E dvb-apps/util/scan/dvb-s/EutelsatW2-16E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/EutelsatW2-16E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/EutelsatW2-16E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,59 @@ -+# Eutelsat W2 @ 16E -+# freq pol sr fec -+ -+S 10957000 H 2821000 AUTO -+S 10968000 H 6400000 AUTO -+S 10972000 V 27500000 AUTO -+S 10976000 H 6400000 AUTO -+S 10989000 H 6400000 AUTO -+S 10997000 H 6400000 AUTO -+S 11005000 H 6400000 AUTO -+S 11011000 V 27500000 AUTO -+S 11015000 H 6400000 AUTO -+S 11025000 H 2894000 AUTO -+S 11046000 H 10555000 AUTO -+S 11057000 H 3327000 AUTO -+S 11061000 H 5722000 AUTO -+S 11078000 H 5208000 AUTO -+S 11092000 V 32000000 AUTO -+S 11094000 H 2734000 AUTO -+S 11132000 V 14185000 AUTO -+S 11178000 V 27500000 AUTO -+S 11192000 H 2667000 AUTO -+S 11267000 H 2170000 AUTO -+S 11276000 H 11100000 AUTO -+S 11294000 H 13333000 AUTO -+S 11304000 V 30000000 AUTO -+S 11324000 H 27500000 AUTO -+S 11428000 V 30000000 AUTO -+S 11449000 H 27500000 AUTO -+S 11471000 V 29950000 AUTO -+S 11492000 H 29950000 AUTO -+S 11513000 V 29950000 AUTO -+S 11534000 H 30000000 AUTO -+S 11554000 V 30000000 AUTO -+S 11575000 H 30000000 AUTO -+S 11594000 V 28800000 AUTO -+S 11617000 H 29950000 AUTO -+S 11634000 V 17578000 AUTO -+S 11658000 H 30000000 AUTO -+S 11659000 V 17578000 AUTO -+S 11682000 V 14468000 AUTO -+S 12538000 V 4340000 AUTO -+S 12549000 V 2894000 AUTO -+S 12555000 H 5632000 AUTO -+S 12557000 V 2156000 AUTO -+S 12562000 H 5632000 AUTO -+S 12563000 V 2222000 AUTO -+S 12568000 H 3703000 AUTO -+S 12625000 V 4444000 AUTO -+S 12633000 V 4883000 AUTO -+S 12642000 V 3418000 AUTO -+S 12650000 H 15000000 AUTO -+S 12656000 V 4883000 AUTO -+S 12677000 V 6111000 AUTO -+S 12683000 H 2894000 AUTO -+S 12703000 H 2748000 AUTO -+S 12716000 H 6000000 AUTO -+S 12723000 H 3000000 AUTO -+S 12733000 V 16277000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Express-3A-11.0W dvb-apps/util/scan/dvb-s/Express-3A-11.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Express-3A-11.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Express-3A-11.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Express 3A @ 11.0W -+# freq pol sr fec -+ -+S 3675000 V 29623000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM1-40.0E dvb-apps/util/scan/dvb-s/ExpressAM1-40.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM1-40.0E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/ExpressAM1-40.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# Express AM1 @ 40E -+# freq pol sr fec -+S 10967000 V 20000000 AUTO -+S 10995000 V 20000000 AUTO -+S 11097000 H 4000000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM22-53.0E dvb-apps/util/scan/dvb-s/ExpressAM22-53.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM22-53.0E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/ExpressAM22-53.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# Express AM 22 @ 53E -+# freq pol sr fec -+S 11044000 V 44950000 3/4 -+S 10974000 H 8150000 3/4 -+#S 10974000 V 32223000 7/8 -+S 11031000 H 3750000 3/4 -+S 11096000 V 6400000 3/4 -+S 11124000 V 7593000 3/4 -+S 11161000 V 5785000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM2-80.0E dvb-apps/util/scan/dvb-s/ExpressAM2-80.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM2-80.0E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/ExpressAM2-80.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,35 @@ -+# Express AM2 @ 80E -+# freq pol sr fec -+S 10973000 V 4444000 AUTO -+S 10991000 V 4444000 AUTO -+S 11044000 H 44948000 AUTO -+S 11081000 V 5064000 AUTO -+S 11088000 V 4548000 AUTO -+S 11191000 H 3255000 AUTO -+S 11462000 V 3200000 AUTO -+S 11478000 H 4400000 AUTO -+S 11544000 V 44950000 AUTO -+S 11606000 V 44948000 AUTO -+S 11650000 V 3500000 AUTO -+ -+# Express AM2 @ 80E C-BAND -+# Generated by Roman Kashcheev -+# Mar 30, 2008 -+# freq pol sr fec -+ -+# RSCC -+S 3525000 V 31106000 3/4 -+# TRK Sever -+S 3558000 V 3215000 3/4 -+# TRV Muji -+S 3562000 V 3225000 3/4 -+# OTV Sakhalin -+S 3625000 V 3000000 3/4 -+# RSCC -+S 3675000 V 33483000 7/8 -+# 5 Kanal -+S 3929000 H 8705000 3/4 -+# TV Centr -+S 4147000 V 27500000 3/4 -+# Blagovest Telekanal -+S 4175000 V 6510000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy10R-123w dvb-apps/util/scan/dvb-s/Galaxy10R-123w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy10R-123w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Galaxy10R-123w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# Galaxy 10R @ 123W -+# freq pol sr fec -+ -+S 11720000 V 27692000 AUTO -+S 11732000 H 13240000 AUTO -+S 11800000 V 26657000 AUTO -+S 11805000 H 04580000 AUTO -+S 11966000 V 13021000 AUTO -+S 12104000 V 02222000 AUTO -+S 12114000 V 04444000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy11-91w dvb-apps/util/scan/dvb-s/Galaxy11-91w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy11-91w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Galaxy11-91w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,49 @@ -+# Galaxy 11 @ 91W -+# freq pol sr fec -+ -+S 10964000 V 19850000 AUTO -+S 10994000 V 20000000 AUTO -+S 11024000 V 20000000 AUTO -+S 11806000 V 03979000 AUTO -+S 11815000 V 03979000 AUTO -+S 11825000 V 06111000 AUTO -+S 11925000 V 03979000 AUTO -+S 11930000 V 03979000 AUTO -+S 11935000 V 03979000 AUTO -+S 11940000 V 03979000 AUTO -+S 11945000 V 03979000 AUTO -+S 11950000 H 03979000 AUTO -+S 11950000 V 03979000 AUTO -+S 11955000 H 03979000 AUTO -+S 11955000 V 03979000 AUTO -+S 11960000 H 03979000 AUTO -+S 11965000 V 03979000 AUTO -+S 11965000 H 03979000 AUTO -+S 11970000 V 03979000 AUTO -+S 11970000 H 03979000 AUTO -+S 11975000 V 03979000 AUTO -+S 11975000 H 03979000 AUTO -+S 11980000 V 03979000 AUTO -+S 11985000 H 03979000 AUTO -+S 11985000 V 03979000 AUTO -+S 11990000 H 03979000 AUTO -+S 11990000 V 03979000 AUTO -+S 11995000 H 03979000 AUTO -+S 11995000 V 03979000 AUTO -+S 12000000 H 03979000 AUTO -+S 12005000 V 03979000 AUTO -+S 12010000 H 03979000 AUTO -+S 12010000 V 03979000 AUTO -+S 12015000 H 03979000 AUTO -+S 12015000 V 03979000 AUTO -+S 12020000 V 03979000 AUTO -+S 12025000 V 03979000 AUTO -+S 12030000 V 03979000 AUTO -+S 12035000 V 03979000 AUTO -+S 12066000 H 05632000 AUTO -+S 12075000 H 03979000 AUTO -+S 12083000 H 05632000 AUTO -+S 12086000 V 06144000 AUTO -+S 12096000 V 06144000 AUTO -+S 12104000 V 06144000 AUTO -+S 12114000 V 06144000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy25-97w dvb-apps/util/scan/dvb-s/Galaxy25-97w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy25-97w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Galaxy25-97w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+# Galaxy 25 @ 97W -+# freq pol sr fec -+ -+S 11789000 V 28125000 AUTO -+S 11836000 V 20770000 AUTO -+S 11867000 V 22000000 AUTO -+S 11874000 H 22000000 AUTO -+S 11898000 V 22000000 AUTO -+S 11936000 H 20000000 AUTO -+S 11966000 H 22000000 AUTO -+S 11991000 V 22000000 AUTO -+S 11999000 H 20000000 AUTO -+S 12053000 V 22000000 AUTO -+S 12084000 V 22000000 AUTO -+S 12090000 H 20000000 AUTO -+S 12115000 V 22425000 AUTO -+S 12146000 V 22000000 AUTO -+S 12152000 H 20000000 AUTO -+S 12177000 V 23000000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy26-93w dvb-apps/util/scan/dvb-s/Galaxy26-93w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy26-93w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Galaxy26-93w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,58 @@ -+# Galaxy 26 @ 93W -+# freq pol sr fec -+ -+S 11711000 V 14312000 AUTO -+S 11721000 V 03979000 AUTO -+S 11727000 V 03979000 AUTO -+S 11732000 V 03979000 AUTO -+S 11737000 V 03979000 AUTO -+S 11737000 H 03979000 AUTO -+S 11742000 V 03979000 AUTO -+S 11748000 V 03979000 AUTO -+S 11753000 V 03979000 AUTO -+S 11767000 V 03979000 AUTO -+S 11772000 V 03979000 AUTO -+S 11772000 H 03979000 AUTO -+S 11777000 V 03979000 AUTO -+S 11782000 V 03979000 AUTO -+S 11788000 V 03979000 AUTO -+S 11793000 V 03979000 AUTO -+S 11809000 V 03979000 AUTO -+S 11814000 V 03979000 AUTO -+S 11841000 H 04000000 AUTO -+S 11887000 V 03979000 AUTO -+S 11893000 V 03979000 AUTO -+S 11904000 H 03010000 AUTO -+S 11919000 V 03979000 AUTO -+S 11924000 V 03979000 AUTO -+S 11926000 H 08848000 AUTO -+S 11929000 V 03979000 AUTO -+S 11935000 V 03979000 AUTO -+S 11936000 H 08848000 AUTO -+S 11944000 H 08848000 AUTO -+S 11949000 V 03979000 AUTO -+S 11954000 V 03979000 AUTO -+S 11956000 H 03979000 AUTO -+S 11960000 V 03979000 AUTO -+S 11961000 H 03979000 AUTO -+S 11965000 V 03979000 AUTO -+S 11967000 H 03979000 AUTO -+S 11970000 V 03979000 AUTO -+S 11972000 H 03979000 AUTO -+S 11977000 H 03979000 AUTO -+S 12047000 V 03979000 AUTO -+S 12048000 H 03979000 AUTO -+S 12054000 H 03979000 AUTO -+S 12058000 V 03979000 AUTO -+S 12059000 H 03979000 AUTO -+S 12063000 V 03979000 AUTO -+S 12064000 H 03979000 AUTO -+S 12069000 H 03979000 AUTO -+S 12076000 V 08681000 AUTO -+S 12089000 V 06511000 AUTO -+S 12110000 H 04104000 AUTO -+S 12116000 H 03979000 AUTO -+S 12121000 H 03979000 AUTO -+S 12126000 H 03979000 AUTO -+S 12132000 H 03979000 AUTO -+S 12175000 V 05147000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy27-129w dvb-apps/util/scan/dvb-s/Galaxy27-129w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy27-129w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Galaxy27-129w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Galaxy 27 @ 129W -+# freq pol sr fec -+ -+S 11964000 H 02920000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy28-89w dvb-apps/util/scan/dvb-s/Galaxy28-89w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy28-89w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Galaxy28-89w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,41 @@ -+# Galaxy 28 @ 89W -+# freq pol sr fec -+ -+S 11717000 H 04411000 AUTO -+S 11747000 H 06620000 AUTO -+S 11756000 H 06620000 AUTO -+S 11780000 H 29000000 AUTO -+S 11800000 H 27500000 AUTO -+S 11825000 H 04552000 AUTO -+S 11865000 H 03700000 AUTO -+S 11882000 H 04883000 AUTO -+S 11925000 H 03979000 AUTO -+S 11930000 H 03979000 AUTO -+S 11935000 H 03979000 AUTO -+S 11936000 H 06000000 AUTO -+S 11940000 H 03979000 AUTO -+S 11945000 H 03979000 AUTO -+S 11950000 H 03979000 AUTO -+S 11955000 V 19532000 AUTO -+S 11960000 H 28800000 AUTO -+S 11965000 H 03979000 AUTO -+S 11970000 H 03979000 AUTO -+S 11975000 V 03979000 AUTO -+S 11980000 H 03979000 AUTO -+S 11985000 H 03979000 AUTO -+S 11989000 V 06111000 AUTO -+S 11990000 H 03979000 AUTO -+S 11995000 H 03979000 AUTO -+S 12000000 H 28800000 AUTO -+S 12009000 V 06111000 AUTO -+S 12032000 H 06666000 AUTO -+S 12092000 H 02314000 AUTO -+S 12114000 H 14398000 AUTO -+S 12134000 H 04000000 AUTO -+S 12164000 H 03979000 AUTO -+S 12170000 H 03979000 AUTO -+S 12175000 H 03979000 AUTO -+S 12180000 H 03979000 AUTO -+S 12185000 H 03979000 AUTO -+S 12191000 H 03979000 AUTO -+S 12196000 H 03979000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy3C-95w dvb-apps/util/scan/dvb-s/Galaxy3C-95w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy3C-95w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Galaxy3C-95w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Galaxy 3C @ 95W -+# freq pol sr fec -+ -+S 11780000 H 20760000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Hispasat-30.0W dvb-apps/util/scan/dvb-s/Hispasat-30.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Hispasat-30.0W 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Hispasat-30.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -1,6 +1,43 @@ - # Hispasat 30.0W - # freq pol sr fec -+ - S 11539000 V 24500000 5/6 -+S 11749000 V 03520000 AUTO -+S 11760000 V 03260000 AUTO -+S 11766000 V 04500000 AUTO -+S 11776000 V 02387000 AUTO -+S 11783000 V 01200000 AUTO -+S 11787000 V 02500000 AUTO -+S 11807000 V 06510000 AUTO -+S 11823000 V 02387000 AUTO -+S 11884000 V 27500000 AUTO -+S 11907000 V 02592000 AUTO -+S 11917000 V 05681000 AUTO - S 11931000 H 27500000 3/4 -+S 11931000 V 02220000 AUTO -+S 11936000 V 05185000 AUTO -+S 11940000 V 01481000 AUTO -+S 11972000 H 27500000 AUTO -+S 11997000 H 04422000 AUTO -+S 12003000 H 05632000 AUTO -+S 12008000 H 06111000 AUTO -+S 12015000 H 03492000 AUTO - S 12015000 V 27500000 3/4 -+S 12040000 H 05632000 AUTO -+S 12052000 V 27500000 AUTO -+S 12085000 H 05632000 AUTO -+S 12131000 H 27500000 AUTO -+S 12135000 V 04444000 AUTO -+S 12137000 V 03030000 AUTO -+S 12141000 V 03255000 AUTO -+S 12146000 V 04200000 AUTO -+S 12156000 V 02222000 AUTO -+S 12158000 V 02348000 AUTO -+S 12163000 V 03030000 AUTO -+S 12168000 V 05240000 AUTO -+S 12172000 H 27500000 AUTO -+S 12175000 V 04500000 AUTO -+S 12182000 V 03340000 AUTO -+S 12188000 V 02583000 AUTO -+S 12192000 V 02593000 AUTO - S 12567000 H 19850000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Hotbird-13.0E dvb-apps/util/scan/dvb-s/Hotbird-13.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Hotbird-13.0E 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Hotbird-13.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,96 @@ - # EUTELSAT SkyPlex, Hotbird 13E - # freq pol sr fec - S 12539000 H 27500000 3/4 -+S 10719000 V 27500000 3/4 -+S 10723000 H 29900000 3/4 -+S 10757000 V 27500000 3/4 -+S 10775000 H 28000000 3/4 -+S 10795000 V 27500000 3/4 -+S 10834000 V 27500000 3/4 -+S 10853000 H 27500000 3/4 -+S 10872000 V 27500000 3/4 -+S 10892000 H 27500000 3/4 -+S 10910000 V 27500000 3/4 -+S 10930000 H 27500000 3/4 -+S 10949000 V 27500000 3/4 -+S 10971000 H 27500000 3/4 -+S 10992000 V 27500000 2/3 -+S 11013000 H 27500000 3/4 -+S 11034000 V 27500000 3/4 -+S 11054000 H 27500000 5/6 -+S 11075000 V 27500000 3/4 -+S 11095000 H 28000000 3/4 -+S 11117000 V 27500000 3/4 -+S 11137000 H 27500000 3/4 -+S 11158000 V 27500000 3/4 -+S 11178000 H 27500000 3/4 -+S 11200000 V 27500000 5/6 -+S 11219000 H 27500000 3/4 -+S 11242000 V 27500000 3/4 -+S 11278000 V 27500000 3/4 -+S 11295000 H 27500000 3/4 -+S 11334000 H 27500000 2/3 -+S 11355000 V 27500000 3/4 -+S 11373000 H 27500000 2/3 -+S 11393000 V 27500000 3/4 -+S 11411000 H 27500000 5/6 -+S 11432000 V 27500000 2/3 -+S 11470000 V 27500000 5/6 -+S 11488000 H 27500000 3/4 -+S 11526000 H 27500000 3/4 -+S 11541000 V 22000000 5/6 -+S 11565000 H 27500000 3/4 -+S 11585000 V 27500000 3/4 -+S 11604000 H 27500000 5/6 -+S 11623000 V 27500000 3/4 -+S 11645000 H 27500000 3/4 -+S 11662000 V 27500000 3/4 -+S 11677000 H 27500000 3/4 -+S 11727000 V 27500000 3/4 -+S 11747000 H 27500000 3/4 -+S 11765000 V 27500000 2/3 -+S 11785000 H 27500000 3/4 -+S 11804000 V 27500000 2/3 -+S 11823000 H 27500000 3/4 -+S 11842000 V 27500000 3/4 -+S 11861000 H 27500000 3/4 -+S 11880000 V 27500000 3/4 -+S 11900000 H 27500000 3/4 -+S 11919000 V 27500000 2/3 -+S 11938000 H 27500000 3/4 -+S 11958000 V 27500000 3/4 -+S 11976000 H 27500000 3/4 -+S 12015000 H 27500000 3/4 -+S 12034000 V 27500000 3/4 -+S 12054000 H 27500000 3/4 -+S 12072000 V 27500000 3/4 -+S 12092000 H 27500000 3/4 -+S 12111000 V 27500000 3/4 -+S 12149000 V 27500000 3/4 -+S 12169000 H 27500000 3/4 -+S 12188000 V 27500000 3/4 -+S 12207000 H 27500000 3/4 -+S 12226000 V 27500000 3/4 -+S 12245000 H 27500000 3/4 -+S 12264000 V 27500000 3/4 -+S 12284000 H 27500000 3/4 -+S 12302000 V 27500000 3/4 -+S 12322000 H 27500000 3/4 -+S 12341000 V 27500000 3/4 -+S 12360000 H 27500000 3/4 -+S 12379000 V 27500000 3/4 -+S 12398000 H 27500000 3/4 -+S 12418000 V 27500000 3/4 -+S 12437000 H 27500000 3/4 -+S 12475000 H 27500000 3/4 -+S 12519000 V 27500000 3/4 -+S 12558000 V 27500000 3/4 -+S 12577000 H 27500000 3/4 -+S 12596000 V 27500000 3/4 -+S 12616000 H 27500000 3/4 -+S 12635000 V 27500000 3/4 -+S 12654000 H 27500000 3/4 -+S 12673000 V 27500000 3/4 -+S 12692000 H 27500000 3/4 -+S 12713000 V 27500000 3/4 -+S 12731000 H 27500000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA5-97w dvb-apps/util/scan/dvb-s/IA5-97w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA5-97w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/IA5-97w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# Intelsat Americas 5 @ 97W -+# freq pol sr fec -+ -+S 11789000 V 25000000 AUTO -+S 11836000 V 20765000 AUTO -+S 11867000 V 22000000 AUTO -+S 11874000 H 22000000 AUTO -+S 11898000 V 22000000 AUTO -+S 11966000 H 22000000 AUTO -+S 11991000 V 22000000 AUTO -+S 12053000 V 22000000 AUTO -+S 12084000 V 22000000 AUTO -+S 12090000 H 20000000 AUTO -+S 12115000 V 22425000 AUTO -+S 12122000 H 22000000 AUTO -+S 12146000 V 22000000 AUTO -+S 12152000 H 20000000 AUTO -+S 12177000 V 23000000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA6-93w dvb-apps/util/scan/dvb-s/IA6-93w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA6-93w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/IA6-93w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,61 @@ -+# Intelsat Americas 6 @ 93W -+# freq pol sr fec -+ -+S 11711000 V 14312000 AUTO -+S 11721000 V 03979000 AUTO -+S 11727000 V 03979000 AUTO -+S 11732000 V 03979000 AUTO -+S 11737000 V 03979000 AUTO -+S 11737000 H 03979000 AUTO -+S 11742000 V 03979000 AUTO -+S 11748000 V 03979000 AUTO -+S 11753000 V 03979000 AUTO -+S 11767000 V 03979000 AUTO -+S 11772000 V 03979000 AUTO -+S 11772000 H 03979000 AUTO -+S 11777000 V 03979000 AUTO -+S 11782000 V 03979000 AUTO -+S 11788000 V 03979000 AUTO -+S 11793000 V 03979000 AUTO -+S 11809000 V 03979000 AUTO -+S 11814000 V 03979000 AUTO -+S 11827000 V 08429000 AUTO -+S 11836000 H 07179000 AUTO -+S 11841000 H 04000000 AUTO -+S 11865000 V 03516000 AUTO -+S 11887000 V 03979000 AUTO -+S 11893000 V 03979000 AUTO -+S 11904000 V 05000000 AUTO -+S 11919000 V 03979000 AUTO -+S 11924000 V 03979000 AUTO -+S 11926000 H 08848000 AUTO -+S 11929000 V 03979000 AUTO -+S 11935000 V 03979000 AUTO -+S 11936000 H 08848000 AUTO -+S 11944000 H 08848000 AUTO -+S 11949000 V 03979000 AUTO -+S 11954000 V 03979000 AUTO -+S 11956000 H 03979000 AUTO -+S 11960000 V 03979000 AUTO -+S 11961000 H 03979000 AUTO -+S 11965000 V 03979000 AUTO -+S 11967000 H 03979000 AUTO -+S 11970000 V 03979000 AUTO -+S 11972000 H 03979000 AUTO -+S 11977000 H 03979000 AUTO -+S 12047000 V 03979000 AUTO -+S 12048000 H 03979000 AUTO -+S 12054000 H 03979000 AUTO -+S 12058000 V 03979000 AUTO -+S 12059000 H 03979000 AUTO -+S 12063000 V 03979000 AUTO -+S 12064000 H 03979000 AUTO -+S 12069000 H 03979000 AUTO -+S 12076000 V 08679000 AUTO -+S 12089000 V 06511000 AUTO -+S 12110000 H 04104000 AUTO -+S 12116000 H 03979000 AUTO -+S 12121000 H 03979000 AUTO -+S 12126000 H 03979000 AUTO -+S 12132000 H 03979000 AUTO -+S 12175000 V 05147000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA7-129w dvb-apps/util/scan/dvb-s/IA7-129w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA7-129w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/IA7-129w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Intelsat Americas 7 @ 129W -+# freq pol sr fec -+ -+S 11989000 H 02821000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA8-89w dvb-apps/util/scan/dvb-s/IA8-89w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA8-89w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/IA8-89w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,34 @@ -+# Intelsat Americas 8 @ 89W -+# freq pol sr fec -+ -+S 11780000 H 29000000 AUTO -+S 11925000 H 03979000 AUTO -+S 11930000 H 03979000 AUTO -+S 11935000 H 03979000 AUTO -+S 11940000 H 03979000 AUTO -+S 11945000 H 03979000 AUTO -+S 11945000 V 03979000 AUTO -+S 11950000 H 03979000 AUTO -+S 11950000 V 03979000 AUTO -+S 11955000 H 03979000 AUTO -+S 11955000 V 03979000 AUTO -+S 11960000 V 03979000 AUTO -+S 11965000 V 03979000 AUTO -+S 11965000 H 03979000 AUTO -+S 11970000 V 03979000 AUTO -+S 11970000 H 03979000 AUTO -+S 11975000 V 03979000 AUTO -+S 11975000 H 03979000 AUTO -+S 11980000 H 03979000 AUTO -+S 11985000 H 03979000 AUTO -+S 11989000 V 06111000 AUTO -+S 11990000 H 03979000 AUTO -+S 11995000 H 03979000 AUTO -+S 12009000 V 06111000 AUTO -+S 12164000 H 03979000 AUTO -+S 12170000 H 03979000 AUTO -+S 12175000 H 03979000 AUTO -+S 12180000 H 03979000 AUTO -+S 12185000 H 03979000 AUTO -+S 12191000 H 03979000 AUTO -+S 12196000 H 03979000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intel4-72.0E dvb-apps/util/scan/dvb-s/Intel4-72.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intel4-72.0E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intel4-72.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Intel4 @ 72E -+# freq pol sr fec -+S 11533000 V 4220000 AUTO -+S 11638000 H 5632000 AUTO -+S 12518000 V 8232000 AUTO -+S 12526000 V 3266000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intel904-60.0E dvb-apps/util/scan/dvb-s/Intel904-60.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intel904-60.0E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intel904-60.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,13 @@ -+# Intel904 @ 60E -+# freq pol sr fec -+S 11003000 H 2975000 AUTO -+S 11011000 H 2975000 AUTO -+S 11015000 H 2975000 AUTO -+S 11093000 V 3980000 AUTO -+S 11101000 V 4105000 AUTO -+S 11142000 H 2963000 AUTO -+S 11152000 H 2963000 AUTO -+S 11157000 H 2963000 AUTO -+S 11515000 V 7300000 AUTO -+S 11635000 V 29700000 AUTO -+S 11675000 V 29700000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-1002-1.0W dvb-apps/util/scan/dvb-s/Intelsat-1002-1.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-1002-1.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-1002-1.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,20 @@ -+# Intelsat 1002 @ 1.0W -+# freq pol sr fec -+S 4175000 V 28000000 AUTO -+S 4180000 H 21050000 AUTO -+S 11093000 H 19191000 7/8 -+S 11166000 V 1450000 7/8 -+S 11182000 V 3100000 7/8 -+S 11606000 H 13356000 7/8 -+S 12527000 H 27500000 3/4 -+S 12563000 H 27500000 3/4 -+S 12563000 V 27500000 3/4 -+S 12607000 H 27500000 3/4 -+S 12607000 V 27500000 3/4 -+S 12643000 H 27500000 3/4 -+S 12643000 V 27500000 3/4 -+S 12687000 H 27500000 3/4 -+S 12687000 V 27500000 3/4 -+S 12718000 V 18400000 3/4 -+S 12723000 H 27500000 3/4 -+S 12735000 V 8800000 5/6 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-11-43.0W dvb-apps/util/scan/dvb-s/Intelsat-11-43.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-11-43.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-11-43.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Intelsat 11 @ 43.0W -+# freq pol sr fec -+ -+S 3944000 H 05945000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-1R-45.0W dvb-apps/util/scan/dvb-s/Intelsat-1R-45.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-1R-45.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-1R-45.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,44 @@ -+# Intelsat 1R @ 45.0W -+# freq pol sr fec -+ -+S 4104000 V 14450000 AUTO -+S 3854000 H 02370000 AUTO -+S 11893000 H 06620000 AUTO -+S 3869000 H 03515000 AUTO -+S 4186000 V 02000000 AUTO -+S 4040000 V 04347000 AUTO -+S 4071000 V 02615000 AUTO -+S 3991000 V 04044000 AUTO -+S 3882000 V 04410000 AUTO -+S 11788000 V 10000000 AUTO -+S 11728000 V 05057000 AUTO -+S 11737000 V 05057000 AUTO -+S 11722000 V 03000000 AUTO -+S 11718000 H 24667000 AUTO -+S 11833000 H 17360000 AUTO -+S 11930000 V 11790000 AUTO -+S 11808000 H 04779000 AUTO -+S 4132000 H 05749000 AUTO -+S 3780000 V 02941000 AUTO -+S 11705000 V 04440000 AUTO -+S 3759000 V 02941000 AUTO -+S 4171000 V 04410000 AUTO -+S 3899000 V 06611000 AUTO -+S 4192000 H 02075000 AUTO -+S 4096000 H 08102000 AUTO -+S 11873000 H 06000000 AUTO -+S 11856000 V 03000000 AUTO -+S 11746000 V 06900000 AUTO -+S 11715000 V 05500000 AUTO -+S 3985000 V 03310000 AUTO -+S 3892000 V 06110000 AUTO -+S 4135000 H 26600000 AUTO -+S 4121000 H 03510000 AUTO -+S 3742000 V 04444000 AUTO -+S 3910000 V 04292000 AUTO -+S 3975000 V 03310000 AUTO -+S 4133000 V 03255000 AUTO -+S 3785000 V 04409000 AUTO -+S 3868000 V 10075000 AUTO -+S 3774000 V 08820000 AUTO -+S 4128000 V 03310000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-3R-43.0W dvb-apps/util/scan/dvb-s/Intelsat-3R-43.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-3R-43.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-3R-43.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,35 @@ -+# Intelsat 3R @ 43.0W -+# freq pol sr fec -+ -+S 3936000 H 03310000 AUTO -+S 3901000 V 06620000 AUTO -+S 3891000 V 06111000 AUTO -+S 3935000 V 17360000 AUTO -+S 3872000 H 06620000 AUTO -+S 3736000 H 29270000 AUTO -+S 4106000 V 26470000 AUTO -+S 3910000 V 05632000 AUTO -+S 3919000 V 06620000 AUTO -+S 4083000 V 06599000 AUTO -+S 4106000 H 29270000 AUTO -+S 3994000 H 21090000 AUTO -+S 3867000 V 06429000 AUTO -+S 3958000 V 06500000 AUTO -+S 3980000 V 03500000 AUTO -+S 3828000 V 04350000 AUTO -+S 3888000 H 07813000 AUTO -+S 3785000 H 30800000 AUTO -+S 3942000 V 01200000 AUTO -+S 3946000 V 02592000 AUTO -+S 3988000 V 04070000 AUTO -+S 3845000 H 30800000 AUTO -+S 4040000 H 30800000 AUTO -+S 3865000 V 06900000 AUTO -+S 3850000 V 28800000 AUTO -+S 11705000 H 03700000 AUTO -+S 11745000 H 03111000 AUTO -+S 11711000 H 04687000 AUTO -+S 11754000 H 03109000 AUTO -+S 3746000 V 21261000 AUTO -+S 4150000 H 24570000 AUTO -+S 3930000 H 02812000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-6B-43.0W dvb-apps/util/scan/dvb-s/Intelsat-6B-43.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-6B-43.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-6B-43.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,17 @@ -+# Intelsat 6B @ 43.0W -+# freq pol sr fec -+ -+S 10882000 H 30000000 AUTO -+S 10882000 V 30000000 AUTO -+S 10970000 H 30000000 AUTO -+S 10970000 V 30000000 AUTO -+S 11050000 H 30000000 AUTO -+S 11130000 H 30000000 AUTO -+S 11382000 V 30000000 AUTO -+S 11130000 V 30000000 AUTO -+S 10720000 H 30000000 AUTO -+S 10720000 V 30000000 AUTO -+S 11050000 V 30000000 AUTO -+S 11382000 H 30000000 AUTO -+S 10800000 H 30000000 AUTO -+S 10800000 V 30000000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-705-50.0W dvb-apps/util/scan/dvb-s/Intelsat-705-50.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-705-50.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-705-50.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Intelsat 705 @ 50.0W -+# freq pol sr fec -+ -+S 3911000 V 03617000 AUTO -+S 3917000 V 04087000 AUTO -+S 3838000 H 07053000 AUTO -+S 4126000 H 06111000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-707-53.0W dvb-apps/util/scan/dvb-s/Intelsat-707-53.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-707-53.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-707-53.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# Intelsat 707 @ 53.0W -+# freq pol sr fec -+ -+S 3820000 V 03255000 AUTO -+S 11483000 V 05333000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-805-55.5W dvb-apps/util/scan/dvb-s/Intelsat-805-55.5W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-805-55.5W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-805-55.5W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,67 @@ -+# Intelsat 805 @ 55.5W -+# freq pol sr fec -+ -+S 4171000 H 06111000 AUTO -+S 4147000 H 06111000 AUTO -+S 3914000 V 01809000 AUTO -+S 3572000 V 11800000 AUTO -+S 4135000 H 06111000 AUTO -+S 3737000 H 01809000 AUTO -+S 3932000 V 03255000 AUTO -+S 3759000 V 04167000 AUTO -+S 3750000 V 05632000 AUTO -+S 3850000 H 20000000 AUTO -+S 4010000 V 06111000 AUTO -+S 3715000 H 08890000 AUTO -+S 3670000 H 01374000 AUTO -+S 4158000 H 01447000 AUTO -+S 3549000 V 06510000 AUTO -+S 3451000 H 04444000 AUTO -+S 3667000 H 03300000 AUTO -+S 3522000 H 30000000 AUTO -+S 4055000 V 21703000 AUTO -+S 3698000 V 03600000 AUTO -+S 4119000 V 01631000 AUTO -+S 3446000 H 03200000 AUTO -+S 3675000 V 02660000 AUTO -+S 3717000 V 11574000 AUTO -+S 4030000 V 06111000 AUTO -+S 3767000 H 04427000 AUTO -+S 4027000 V 02000000 AUTO -+S 4089000 V 05540000 AUTO -+S 3685000 V 05632000 AUTO -+S 3751000 H 05632000 AUTO -+S 4127000 V 02000000 AUTO -+S 3980000 V 19510000 AUTO -+S 3590000 V 10127000 AUTO -+S 4000000 V 05200000 AUTO -+S 3762000 H 03662000 AUTO -+S 3936000 H 03255000 AUTO -+S 3727000 H 03000000 AUTO -+S 4104000 H 05062000 AUTO -+S 3777000 H 07400000 AUTO -+S 3431000 H 03500000 AUTO -+S 3478000 V 05632000 AUTO -+S 4093000 H 02540000 AUTO -+S 3929000 H 02941000 AUTO -+S 4195000 H 04444000 AUTO -+S 4140000 V 04700000 AUTO -+S 4096000 H 05247000 AUTO -+S 3467000 V 04340000 AUTO -+S 3442000 H 03000000 AUTO -+S 4080000 V 04340000 AUTO -+S 4084000 H 10317000 AUTO -+S 3723000 H 03000000 AUTO -+S 3815000 H 26667000 AUTO -+S 4006000 V 03690000 AUTO -+S 3918000 V 04400000 AUTO -+S 3735000 V 08680000 AUTO -+S 3727000 V 03000000 AUTO -+S 3940000 H 02575000 AUTO -+S 3792000 H 02244000 AUTO -+S 3900000 H 03612000 AUTO -+S 3677000 H 04232000 AUTO -+S 4127000 H 02532000 AUTO -+S 4152000 V 03600000 AUTO -+S 4177000 V 27690000 AUTO -+S 4111000 H 03333000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-903-34.5W dvb-apps/util/scan/dvb-s/Intelsat-903-34.5W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-903-34.5W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-903-34.5W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Intelsat 903 @ 34.5W -+# freq pol sr fec -+ -+S 4178000 V 32555000 AUTO -+S 4045000 H 04960000 AUTO -+S 3895000 H 13021000 AUTO -+S 4004000 V 02170000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-905-24.5W dvb-apps/util/scan/dvb-s/Intelsat-905-24.5W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-905-24.5W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-905-24.5W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# Intelsat 905 @ 24.5W -+# freq pol sr fec -+ -+S 4171000 V 06111000 AUTO -+S 4181000 V 06111000 AUTO -+S 4194000 V 05193000 AUTO -+S 4162000 V 06111000 AUTO -+S 4060000 V 06111000 AUTO -+S 4070000 V 06111000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-907-27.5W dvb-apps/util/scan/dvb-s/Intelsat-907-27.5W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-907-27.5W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-907-27.5W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# Intelsat 907 @ 27.5W -+# freq pol sr fec -+ -+S 3873000 H 04687000 AUTO -+S 3935000 H 04687000 AUTO -+S 3743000 V 02900000 AUTO -+S 3732000 V 14000000 AUTO -+S 3943000 H 01808000 AUTO -+S 3938000 H 03544000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-9-58.0W dvb-apps/util/scan/dvb-s/Intelsat-9-58.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-9-58.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Intelsat-9-58.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,58 @@ -+# Intelsat 9 @ 58.0W -+# freq pol sr fec -+ -+S 4122000 H 02222000 AUTO -+S 4146000 H 06620000 AUTO -+S 4157000 H 06620000 AUTO -+S 4160000 V 03000000 AUTO -+S 3960000 V 29270000 AUTO -+S 3960000 H 29270000 AUTO -+S 4080000 H 27684000 AUTO -+S 3720000 H 19510000 AUTO -+S 4131000 H 04444000 AUTO -+S 4155000 H 06111000 AUTO -+S 4173000 H 06620000 AUTO -+S 3995000 H 05632000 AUTO -+S 3986000 H 06111000 AUTO -+S 4175000 H 04410000 AUTO -+S 4107000 H 08850000 AUTO -+S 3925000 H 06666000 AUTO -+S 3905000 H 06620000 AUTO -+S 3915000 H 06620000 AUTO -+S 3925000 H 06620000 AUTO -+S 4005000 H 06620000 AUTO -+S 4015000 H 06620000 AUTO -+S 3720000 V 27700000 AUTO -+S 4166000 H 06200000 AUTO -+S 3794000 H 03332000 AUTO -+S 3807000 H 03428000 AUTO -+S 3880000 V 27690000 AUTO -+S 3800000 V 26470000 AUTO -+S 3760000 V 27690000 AUTO -+S 3996000 H 03330000 AUTO -+S 3935000 H 05632000 AUTO -+S 11852000 V 30000000 AUTO -+S 11895000 V 20000000 AUTO -+S 11913000 V 10000000 AUTO -+S 4155000 V 03310000 AUTO -+S 3934000 V 07000000 AUTO -+S 3787000 H 07407000 AUTO -+S 3924000 V 06620000 AUTO -+S 3800000 H 04444000 AUTO -+S 3911000 V 13330000 AUTO -+S 4040000 H 16180000 AUTO -+S 4080000 V 27690000 AUTO -+S 4144000 V 02205000 AUTO -+S 4151000 V 02890000 AUTO -+S 4147000 V 02941000 AUTO -+S 4170000 V 02941000 AUTO -+S 3760000 H 28500000 AUTO -+S 4120000 V 27500000 AUTO -+S 11670000 V 16470000 AUTO -+S 4125000 H 02941000 AUTO -+S 4137000 H 02941000 AUTO -+S 3880000 H 27690000 AUTO -+S 4174000 V 02941000 AUTO -+S 3840000 V 27690000 AUTO -+S 3840000 H 27690000 AUTO -+S 3815000 H 06250000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Nahuel-1-71.8W dvb-apps/util/scan/dvb-s/Nahuel-1-71.8W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Nahuel-1-71.8W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Nahuel-1-71.8W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,11 @@ -+# Nahuel 1 @ 71.8W -+# freq pol sr fec -+ -+S 11673000 V 04000000 AUTO -+S 11680000 V 03335000 AUTO -+S 11654000 V 04170000 AUTO -+S 11874000 V 04000000 AUTO -+S 12136000 V 02960000 AUTO -+S 11873000 H 08000000 AUTO -+S 12116000 H 14396000 AUTO -+S 11997000 V 08500000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Nilesat101+102-7.0W dvb-apps/util/scan/dvb-s/Nilesat101+102-7.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Nilesat101+102-7.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Nilesat101+102-7.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,41 @@ -+# Nilesat 101/102 & Atlantic Bird @ 7W -+# freq pol sr fec -+S 10719000 V 27500000 3/4 -+S 10723000 H 27500000 3/4 -+S 10758000 V 27500000 3/4 -+S 10775000 H 27500000 3/4 -+S 10796000 V 27500000 3/4 -+S 10892000 H 27500000 3/4 -+S 10911000 V 27500000 3/4 -+S 10930000 H 27500000 3/4 -+S 11317000 V 27500000 3/4 -+S 11747000 V 27500000 3/4 -+S 11766000 H 27500000 3/4 -+S 11785000 V 27500000 3/4 -+S 11804000 H 27500000 3/4 -+S 11823000 V 27500000 3/4 -+S 11843000 H 27500000 3/4 -+S 11862000 V 27500000 3/4 -+S 11881000 H 27500000 3/4 -+S 11900000 V 27500000 3/4 -+S 11919000 H 27500000 3/4 -+S 11938000 V 27500000 3/4 -+S 11958000 H 27500000 3/4 -+S 11977000 V 27600000 5/6 -+S 11996000 H 27500000 3/4 -+S 12015000 V 27500000 3/4 -+S 12034000 H 27500000 3/4 -+S 12054000 V 27500000 3/4 -+S 12073000 H 27500000 3/4 -+S 12130000 V 27500000 3/4 -+S 12149000 H 27500000 3/4 -+S 12207000 V 27500000 3/4 -+S 12226000 H 27500000 3/4 -+S 12284000 V 27500000 3/4 -+S 12303000 H 27500000 3/4 -+S 12341000 V 27500000 3/4 -+S 12360000 H 27500000 3/4 -+S 12380000 V 27500000 3/4 -+S 12399000 H 27500000 3/4 -+S 12418000 V 27500000 3/4 -+S 12476000 H 27500000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-10-37.5W dvb-apps/util/scan/dvb-s/NSS-10-37.5W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-10-37.5W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/NSS-10-37.5W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# NSS 10 @ 37.5W -+# freq pol sr fec -+ -+S 4055000 V 02700000 AUTO -+S 3824000 H 01808000 AUTO -+S 4059000 V 03214000 AUTO -+S 3828000 H 02532000 AUTO -+S 3844000 H 04340000 AUTO -+S 4071000 V 03150000 AUTO -+S 4051000 V 04440000 AUTO -+S 4044000 V 03250000 AUTO -+S 4077000 V 03200000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-7-22.0W dvb-apps/util/scan/dvb-s/NSS-7-22.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-7-22.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/NSS-7-22.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# NSS 7 @ 22.0W -+# freq pol sr fec -+ -+S 3926000 H 03715000 AUTO -+S 3920000 H 03715000 AUTO -+S 3954000 V 05632000 AUTO -+S 3929000 V 05632000 AUTO -+S 3915000 H 03715000 AUTO -+S 3761000 V 22650000 AUTO -+S 11825000 H 05904000 AUTO -+S 12162000 H 06510000 AUTO -+S 11777000 H 04000000 AUTO -+S 11860000 H 35000000 AUTO -+S 12049000 H 06500000 AUTO -+S 11921000 H 35000000 AUTO -+S 4003000 H 06667000 AUTO -+S 4011000 H 06667000 AUTO -+S 4126000 H 03680000 AUTO -+S 3969000 H 01808000 AUTO -+S 3976000 H 01842000 AUTO -+S 11814000 H 05630000 AUTO -+S 4038000 V 03690000 AUTO -+S 3674000 V 02222000 AUTO -+S 4033000 V 03689000 AUTO -+S 4016000 H 03663000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-806-40.5W dvb-apps/util/scan/dvb-s/NSS-806-40.5W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-806-40.5W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/NSS-806-40.5W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,108 @@ -+# NSS 806 @ 40.5W -+# freq pol sr fec -+ -+S 11921000 H 35000000 AUTO -+S 3660000 H 04350000 AUTO -+S 3986000 H 03179000 AUTO -+S 3859000 H 02600000 AUTO -+S 4120000 V 02960000 AUTO -+S 4016000 V 05712000 AUTO -+S 3978000 H 03978000 AUTO -+S 4100000 V 06111000 AUTO -+S 3965000 V 02540000 AUTO -+S 3774000 H 06670000 AUTO -+S 3725000 V 26667000 AUTO -+S 3600000 V 25185000 AUTO -+S 3758000 V 26667000 AUTO -+S 3982000 V 17800000 AUTO -+S 4090000 V 02515000 AUTO -+S 4042000 H 08680000 AUTO -+S 4009000 V 06666000 AUTO -+S 4003000 H 06666000 AUTO -+S 3648000 H 02000000 AUTO -+S 3664000 V 02170000 AUTO -+S 3644000 H 02534000 AUTO -+S 3695000 H 02963000 AUTO -+S 4082000 H 06666000 AUTO -+S 4143000 V 04800000 AUTO -+S 3641000 V 02666000 AUTO -+S 3991000 H 03578000 AUTO -+S 4000000 H 02450000 AUTO -+S 4009000 H 02450000 AUTO -+S 3960000 V 03170000 AUTO -+S 3755000 H 20000000 AUTO -+S 4135000 V 02000000 AUTO -+S 4005000 H 02450000 AUTO -+S 4003000 H 02450000 AUTO -+S 3600000 H 29185000 AUTO -+S 3868000 V 02100000 AUTO -+S 3685000 H 06500000 AUTO -+S 3688000 V 06666000 AUTO -+S 3679000 V 02220000 AUTO -+S 3961000 H 01481000 AUTO -+S 4130000 V 02000000 AUTO -+S 3923000 H 27500000 AUTO -+S 4052000 V 02459000 AUTO -+S 4071000 V 03333000 AUTO -+S 4146000 H 02571000 AUTO -+S 3646000 V 03978000 AUTO -+S 3837000 H 19510000 AUTO -+S 4132000 H 02480000 AUTO -+S 3653000 V 05924000 AUTO -+S 4055000 H 07233000 AUTO -+S 3938000 V 04785000 AUTO -+S 4152000 V 03280000 AUTO -+S 3832000 V 13310000 AUTO -+S 4090000 H 06620000 AUTO -+S 4082000 V 06510000 AUTO -+S 4107000 V 02100000 AUTO -+S 3500000 H 06666000 AUTO -+S 4126000 V 02531000 AUTO -+S 3860000 V 02713000 AUTO -+S 3983000 H 02222000 AUTO -+S 4065000 H 08400000 AUTO -+S 4063000 V 08500000 AUTO -+S 3972000 H 03330000 AUTO -+S 4024000 H 16030000 AUTO -+S 3803000 V 26860000 AUTO -+S 3920000 V 20000000 AUTO -+S 4053000 V 06666000 AUTO -+S 3676000 V 03000000 AUTO -+S 3637000 H 02963000 AUTO -+S 3516000 V 05632000 AUTO -+S 3516000 H 05632000 AUTO -+S 4093000 V 02887000 AUTO -+S 4177000 H 04391000 AUTO -+S 4124000 H 03480000 AUTO -+S 4139000 V 02220000 AUTO -+S 3693000 V 04441000 AUTO -+S 4194000 H 06660000 AUTO -+S 3803000 H 27500000 AUTO -+S 4112000 V 02000000 AUTO -+S 3676000 H 05900000 AUTO -+S 3652000 H 04000000 AUTO -+S 3725000 H 26669000 AUTO -+S 3898000 V 04195000 AUTO -+S 4162000 H 07200000 AUTO -+S 4168000 H 02400000 AUTO -+S 3965000 H 03332000 AUTO -+S 4100000 H 06654000 AUTO -+S 4127000 H 03000000 AUTO -+S 4109000 H 06654000 AUTO -+S 3670000 H 02960000 AUTO -+S 3853000 H 05900000 AUTO -+S 3660000 V 02540000 AUTO -+S 4170000 H 02222000 AUTO -+S 3630000 H 05632000 AUTO -+S 3695000 V 02220000 AUTO -+S 4184000 H 06142000 AUTO -+S 4122000 V 01860000 AUTO -+S 4022000 V 03800000 AUTO -+S 4137000 H 04400000 AUTO -+S 3878000 V 22117000 AUTO -+S 4132000 V 02800000 AUTO -+S 4043000 V 07440000 AUTO -+S 4142000 H 02222000 AUTO -+S 3990000 V 04195000 AUTO -+S 3667000 V 03340000 AUTO -+S 3673000 V 03000000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/OptusC1-156E dvb-apps/util/scan/dvb-s/OptusC1-156E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/OptusC1-156E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/OptusC1-156E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,20 @@ -+# Optus C1 satellite 156E -+# freq pol sr fec -+S 12278000 H 30000000 2/3 -+S 12305000 H 30000000 2/3 -+S 12358000 H 27000000 2/3 -+S 12398000 H 27800000 3/4 -+S 12407000 V 30000000 2/3 -+S 12438000 H 27800000 3/4 -+S 12487000 V 27800000 3/4 -+S 12501000 H 29473000 3/4 -+S 12518000 H 27800000 3/4 -+S 12527000 V 30000000 3/4 -+S 12558000 H 27800000 3/4 -+S 12564000 H 29473000 3/4 -+S 12567000 V 27800000 2/3 -+S 12598000 H 27800000 3/4 -+S 12607000 V 29473000 3/4 -+S 12638000 H 27800000 3/4 -+S 12689000 H 27800000 3/4 -+S 12720000 V 30000000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Satmex-5-116.8W dvb-apps/util/scan/dvb-s/Satmex-5-116.8W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Satmex-5-116.8W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Satmex-5-116.8W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,72 @@ -+# Satmex 5 @ 116.8W -+# freq pol sr fec -+ -+S 12034000 H 02532000 AUTO -+S 12175000 H 04232000 AUTO -+S 4060000 H 19510000 AUTO -+S 3905000 V 02963000 AUTO -+S 4084000 H 03162000 AUTO -+S 3767000 H 01620000 AUTO -+S 11975000 H 05000000 AUTO -+S 11960000 H 02000000 AUTO -+S 4180000 H 19510000 AUTO -+S 4115000 H 03253000 AUTO -+S 3840000 V 29270000 AUTO -+S 4160000 V 29270000 AUTO -+S 3940000 H 28125000 AUTO -+S 4052000 V 04307000 AUTO -+S 12024000 H 03000000 AUTO -+S 4134000 H 03617000 AUTO -+S 12028000 H 03255000 AUTO -+S 12060000 V 03078000 AUTO -+S 4012000 V 03131000 AUTO -+S 3949000 V 03255000 AUTO -+S 4076000 H 02962000 AUTO -+S 3749000 H 04070000 AUTO -+S 3744000 H 04480000 AUTO -+S 3755000 H 04000000 AUTO -+S 3869000 H 03000000 AUTO -+S 3876000 H 02170000 AUTO -+S 3879000 H 01984000 AUTO -+S 3957000 V 02600000 AUTO -+S 3975000 V 03131000 AUTO -+S 3982000 H 02531000 AUTO -+S 3832000 H 02500000 AUTO -+S 3953000 V 02597000 AUTO -+S 3987000 V 08860000 AUTO -+S 3996000 V 02170000 AUTO -+S 3748000 V 02100000 AUTO -+S 3932000 V 02500000 AUTO -+S 3914000 V 03223000 AUTO -+S 3888000 H 05351000 AUTO -+S 3805000 V 04679000 AUTO -+S 4001000 V 04100000 AUTO -+S 4023000 H 06400000 AUTO -+S 12176000 H 03985000 AUTO -+S 4108000 H 02666000 AUTO -+S 4038000 V 07675000 AUTO -+S 3809000 V 03100000 AUTO -+S 4080000 V 29270000 AUTO -+S 3910000 H 02500000 AUTO -+S 4164000 H 01733000 AUTO -+S 12193000 V 07885000 AUTO -+S 12164000 V 02000000 AUTO -+S 12044000 V 04340000 AUTO -+S 3720000 V 27000000 AUTO -+S 3922000 V 09760000 AUTO -+S 3797000 V 03200000 AUTO -+S 3968000 V 07500000 AUTO -+S 4037000 H 02222000 AUTO -+S 4046000 H 02441000 AUTO -+S 4080000 H 02441000 AUTO -+S 3773000 V 02892000 AUTO -+S 3767000 V 02893000 AUTO -+S 3935000 V 04440000 AUTO -+S 3972000 H 03364000 AUTO -+S 3905000 H 02400000 AUTO -+S 4007000 V 05582000 AUTO -+S 3885000 H 03000000 AUTO -+S 3826000 H 02712000 AUTO -+S 3944000 V 03410000 AUTO -+S 3915000 H 01520000 AUTO -+S 3876000 V 02920000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Satmex-6-113.0W dvb-apps/util/scan/dvb-s/Satmex-6-113.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Satmex-6-113.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Satmex-6-113.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+# Satmex 6 @ 113.0W -+# freq pol sr fec -+ -+S 4078000 H 03609000 AUTO -+S 4080000 V 03255000 AUTO -+S 12145000 V 03255000 AUTO -+S 4085000 V 02821000 AUTO -+S 12126000 V 06022000 AUTO -+S 12166000 H 17500000 AUTO -+S 4075000 V 03782000 AUTO -+S 4091000 V 03720000 AUTO -+S 3985000 V 02300000 AUTO -+S 12126000 H 02170000 AUTO -+S 12157000 V 03038000 AUTO -+S 12091000 V 03337000 AUTO -+S 3947000 V 03700000 AUTO -+S 3761000 V 02120000 AUTO -+S 12107000 V 02222000 AUTO -+S 12080000 H 25635000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/SBS6-74w dvb-apps/util/scan/dvb-s/SBS6-74w ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/SBS6-74w 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/SBS6-74w 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# SBS 6 @ 74W -+# freq pol sr fec -+ -+S 11744000 H 06616000 AUTO -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Sirius-5.0E dvb-apps/util/scan/dvb-s/Sirius-5.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Sirius-5.0E 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Sirius-5.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -1,5 +1,62 @@ - # Sirius 5.0E - # freq pol sr fec -+S 11215000 V 6666000 1/2 -+S 11227000 H 23145000 3/4 -+S 11247000 V 23145000 3/4 -+S 11420000 H 23145000 3/4 -+S 11727000 H 27500000 5/6 -+S 11747000 V 27500000 3/4 -+S 11766000 H 27500000 3/4 -+S 11785000 V 27500000 3/4 -+S 11804000 H 27500000 3/4 - S 11823000 V 27500000 3/4 -+S 11843000 H 27500000 3/4 -+S 11862000 V 27500000 3/4 -+S 11881000 H 27500000 3/4 -+S 11900000 V 27500000 3/4 -+S 11919000 H 27500000 3/4 -+S 11938000 V 27500000 3/4 -+S 11958000 H 27500000 3/4 - S 11977000 V 27500000 3/4 -+S 11996000 H 27500000 3/4 -+S 12015000 V 27500000 5/6 -+S 12034000 H 27500000 3/4 - S 12054000 V 27500000 3/4 -+S 12073000 H 27500000 3/4 -+S 12092000 V 27500000 3/4 -+S 12111000 H 27500000 5/6 -+S 12130000 V 27500000 3/4 -+S 12149000 H 27500000 3/4 -+S 12169000 V 27500000 3/4 -+S 12188000 H 27500000 7/8 -+S 12207000 V 27500000 3/4 -+S 12226000 H 25540000 7/8 -+S 12245000 V 27500000 3/4 -+S 12265000 H 27500000 3/4 -+S 12284000 V 27500000 3/4 -+S 12303000 H 25547000 7/8 -+S 12322000 V 27500000 3/4 -+S 12341000 H 27500000 3/4 -+S 12360000 V 27500000 7/8 -+S 12379000 H 27500000 3/4 -+S 12399000 V 27500000 2/3 -+S 12418000 H 27500000 3/4 -+S 12437000 V 27500000 2/3 -+S 12456000 H 27500000 3/4 -+S 12476000 V 27500000 3/4 -+S 12608000 H 27500000 3/4 -+S 12637000 H 14465000 3/4 -+S 12668000 V 6666000 1/2 -+S 12672000 H 3300000 3/4 -+S 12674000 V 10000000 3/4 -+S 12678000 V 13333000 5/6 -+S 12680000 H 9404000 3/4 -+S 12685000 V 4444000 3/4 -+S 12690000 H 3330000 3/4 -+S 12693000 V 3333000 5/6 -+S 12701000 H 6111000 3/4 -+S 12715000 H 3330000 3/4 -+S 12718000 V 23500000 3/4 -+S 12724000 H 1772000 3/4 -+S 12728000 V 19720000 3/4 -+S 12737000 V 6150000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Telecom2-8.0W dvb-apps/util/scan/dvb-s/Telecom2-8.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Telecom2-8.0W 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Telecom2-8.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -1,4 +1,17 @@ - # Telecom2 8.0W - # freq pol sr fec --S 11635000 H 6800000 5/6 --S 12687000 V 1879000 3/4 -+S 10972000 V 27500000 3/4 -+S 10974000 H 27500000 3/4 -+S 11010000 H 27500000 3/4 -+S 11011000 V 27500000 3/4 -+S 11042000 H 7860000 3/4 -+S 11053000 H 2850000 3/4 -+S 11064000 H 12667000 3/4 -+S 11387000 H 24740000 5/6 -+S 11428000 H 27500000 3/4 -+S 11500000 H 3460000 AUTO -+S 11554000 V 27500000 3/4 -+S 11595000 V 27500000 3/4 -+S 12545000 H 3038000 3/4 -+S 12566000 V 27500000 3/4 -+S 12649000 V 27500000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Telstar12-15.0W dvb-apps/util/scan/dvb-s/Telstar12-15.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Telstar12-15.0W 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Telstar12-15.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -1,4 +1,26 @@ - # Telstar 12 15.0W - # freq pol sr fec --S 12041000 H 3256000 2/3 --S 12520000 V 8700000 1/2 -+S 10988000 H 2893000 3/4 -+S 10992000 H 2893000 3/4 -+S 11060000 H 19279000 3/4 -+S 11123000 V 19279000 3/4 -+S 11124000 H 18386000 3/4 -+S 11150000 H 18386000 3/4 -+S 11150000 V 19279000 3/4 -+S 11531000 H 3198000 7/8 -+S 11566000 H 4284000 3/4 -+S 11677000 V 2200000 1/2 -+S 11709000 V 3195000 AUTO -+S 11806000 V 7596000 3/4 -+S 11963000 H 14714000 3/4 -+S 12082000 H 3935000 3/4 -+S 12117000 H 4772000 AUTO -+S 12159000 H 7777000 2/3 -+S 12166000 H 3503000 3/4 -+S 12173000 H 3503000 3/4 -+S 12524000 V 26470000 3/4 -+S 12547000 H 11900000 2/3 -+S 12589000 V 4503000 1/2 -+S 12608000 H 19279000 2/3 -+S 12615000 V 11939000 2/3 -+S 12645000 H 3255000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Thor-1.0W dvb-apps/util/scan/dvb-s/Thor-1.0W ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Thor-1.0W 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Thor-1.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -1,8 +1,36 @@ - # Thor 1.0W - # freq pol sr fec -+S 11216000 V 24500000 7/8 -+S 11229000 H 24500000 7/8 - S 11247000 V 24500000 7/8 -+S 11261000 H 24500000 7/8 -+S 11278000 V 24500000 7/8 - S 11293000 H 24500000 7/8 -+S 11309000 V 24500000 7/8 - S 11325000 H 24500000 7/8 --S 12054000 H 28000000 7/8 -+S 11325000 V 24500000 7/8 -+S 11325000 V 24500000 7/8 -+S 11341000 V 24500000 7/8 -+S 11357000 H 24500000 7/8 -+S 11372000 V 24500000 7/8 -+S 11389000 H 24500000 7/8 -+S 11403000 V 24500000 7/8 -+S 11421000 H 24500000 7/8 -+S 11434000 V 24500000 7/8 -+S 11747000 H 28000000 5/6 -+S 11785000 H 28000000 5/6 -+S 11823000 H 28000000 7/8 -+S 11938000 H 25000000 3/4 -+S 12015000 H 30000000 3/4 -+S 12130000 H 30000000 3/4 -+S 12149000 V 28000000 5/6 - S 12169000 H 28000000 7/8 --S 12226000 V 28000000 7/8 -+S 12188000 V 25000000 3/4 -+S 12226000 V 28000000 3/4 -+S 12245000 H 28000000 5/6 -+S 12303000 V 28000000 5/6 -+S 12322000 H 27800000 3/4 -+S 12399000 H 28000000 7/8 -+S 12418000 V 28000000 7/8 -+S 12456000 V 28000000 3/4 -+S 12476000 H 28000000 5/6 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Turksat-42.0E dvb-apps/util/scan/dvb-s/Turksat-42.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Turksat-42.0E 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Turksat-42.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -1,4 +1,104 @@ - # Turksat 42.0E - # freq pol sr fec --S 11594000 H 4557000 5/6 --S 10978000 V 2344000 3/4 -+S 10968000 V 4557000 3/4 -+S 10970000 H 30000000 5/6 -+S 10999000 V 2222000 3/4 -+S 11003000 V 2175000 3/4 -+S 11007000 V 2950000 5/6 -+S 11011000 V 2125000 5/6 -+S 11014000 V 2050000 3/4 -+S 11018000 V 2150000 3/4 -+S 11028000 V 2400000 3/4 -+S 11083000 V 8888000 3/4 -+S 11136000 V 2170000 3/4 -+S 11143000 V 2200000 3/4 -+S 11159000 V 2596000 3/4 -+S 11162000 V 2222000 5/6 -+S 11166000 V 2960000 3/4 -+S 11177000 V 2200000 3/4 -+S 11554000 H 2916000 2/3 -+S 11576000 H 2400000 5/6 -+S 11581000 H 4444000 3/4 -+S 11607000 H 3750000 2/3 -+S 11712000 V 2963000 3/4 -+S 11716000 V 2222000 3/4 -+S 11729000 V 15555000 5/6 -+S 11734000 H 3291000 3/4 -+S 11739000 H 3125000 3/4 -+S 11743000 H 2222000 3/4 -+S 11743000 V 2222000 3/4 -+S 11748000 H 4444000 5/6 -+S 11753000 H 3000000 7/8 -+S 11754000 V 3900000 5/6 -+S 11758000 V 2962000 3/4 -+S 11760000 H 5925000 3/4 -+S 11762000 V 2155000 3/4 -+S 11765000 V 2222000 3/4 -+S 11770000 V 2177000 3/4 -+S 11773000 V 2420000 5/6 -+S 11775000 H 2222000 3/4 -+S 11777000 V 3150000 5/6 -+S 11781000 V 2815000 5/6 -+S 11794000 H 5632000 3/4 -+S 11800000 H 2400000 5/6 -+S 11804000 V 24444000 5/6 -+S 11830000 V 6666000 3/4 -+S 11839000 V 4444000 3/4 -+S 11846000 V 3333000 5/6 -+S 11852000 V 4444000 5/6 -+S 11858000 V 2400000 7/8 -+S 11867000 V 4444000 5/6 -+S 11874000 V 3400000 7/8 -+S 11878000 V 3750000 5/6 -+S 11882000 V 2965000 5/6 -+S 11887000 V 3333000 7/8 -+S 11892000 H 12800000 5/6 -+S 11892000 V 2960000 5/6 -+S 11896000 V 2222000 3/4 -+S 11905000 H 6666000 3/4 -+S 11912000 H 3333000 5/6 -+S 11919000 V 24444000 3/4 -+S 11951000 V 8800000 5/6 -+S 11959000 V 2960000 3/4 -+S 11963000 V 2300000 5/6 -+S 11967000 V 4340000 3/4 -+S 11970000 H 17900000 5/6 -+S 11973000 V 2240000 5/6 -+S 11984000 H 4000000 5/6 -+S 11996000 V 26000000 5/6 -+S 12002000 H 4800000 5/6 -+S 12008000 H 4400000 5/6 -+S 12015000 H 4800000 5/6 -+S 12022000 H 5380000 5/6 -+S 12028000 H 4557000 5/6 -+S 12126000 V 6666000 5/6 -+S 12127000 H 7400000 5/6 -+S 12140000 H 2222000 3/4 -+S 12140000 V 4444000 3/4 -+S 12513000 H 4400000 3/4 -+S 12518000 H 3125000 3/4 -+S 12524000 H 4250000 5/6 -+S 12530000 H 4444000 5/6 -+S 12536000 H 2962000 3/4 -+S 12540000 H 3125000 3/4 -+S 12563000 H 24000000 7/8 -+S 12590000 V 3000000 5/6 -+S 12595000 V 2500000 5/6 -+S 12605000 V 2961000 3/4 -+S 12609000 V 3700000 5/6 -+S 12614000 V 3333000 5/6 -+S 12633000 V 4800000 5/6 -+S 12636000 H 4800000 5/6 -+S 12638000 V 2400000 5/6 -+S 12647000 V 3333000 5/6 -+S 12652000 H 22500000 5/6 -+S 12652000 V 3900000 5/6 -+S 12660000 V 9150000 5/6 -+S 12672000 H 2222000 5/6 -+S 12680000 H 8888000 3/4 -+S 12692000 H 2800000 5/6 -+S 12696000 H 2222000 3/4 -+S 12699000 H 2400000 3/4 -+S 12702000 H 2285000 7/8 -+S 12717000 V 5925000 5/6 -+S 12731000 V 3333000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Yamal201-90.0E dvb-apps/util/scan/dvb-s/Yamal201-90.0E ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Yamal201-90.0E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-s/Yamal201-90.0E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,48 @@ -+# Yamal201 @ 90E -+# freq pol sr fec -+S 10990000 V 2170000 AUTO -+S 10995000 V 4285000 AUTO -+S 11057000 V 26470000 AUTO -+S 11092000 V 26470000 AUTO -+S 11145000 V 22222000 AUTO -+S 11671000 V 18200000 AUTO -+ -+# Yamal201 @ 90E C-BAND -+# Generated by Roman Kashcheev -+# Mar 30, 2008 -+# freq pol sr fec -+ -+# NauTV -+S 3536000 H 2532000 3/4 -+# Turkmenistan -+S 3553000 H 20000000 3/4 -+# CNL -+S 3577000 H 2626000 3/4 -+# Nord TV -+S 3588000 H 4285000 3/4 -+# Telekompanija OTV -+S 3600000 H 4285000 3/4 -+# Oblastnoe Televidenie -+S 3603000 V 4285000 3/4 -+# CNL -+S 3605000 H 2626000 3/4 -+# Gascom -+S 3645000 H 28000000 3/4 -+# Spas -+S 3674000 H 17500000 3/4 -+# TV Gubernia -+S 3725000 H 3200000 3/4 -+# Yuzhniy Region -+S 3900000 H 4285000 3/4 -+# Rostov TV -+S 3907000 H 4265000 3/4 -+# ORTRK 12 Kanal -+S 3912000 H 4295000 3/4 -+# O2 -+S 3944000 H 15550000 3/4 -+# Klub Puteshestviy -+S 3980000 H 38000000 3/4 -+# Music Box -+S 4042000 V 8681000 3/4 -+# NetService -+S 4084000 V 2500000 3/4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ad-Andorra dvb-apps/util/scan/dvb-t/ad-Andorra ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ad-Andorra 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/ad-Andorra 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# DVB-T Andorra -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/at-Official dvb-apps/util/scan/dvb-t/at-Official ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/at-Official 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/at-Official 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,24 @@ -+# Austria, all DVB-T transmitters run by ORS -+# Created from http://www.ors.at/view08/ors.php?mid=94 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 490000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 498000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 514000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 522000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 530000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 538000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 546000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 554000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 562000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 578000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 578000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE -+T 594000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 602000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 610000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 634000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 650000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 666000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 698000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 722000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -+T 754000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Adelaide dvb-apps/util/scan/dvb-t/au-Adelaide ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Adelaide 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Adelaide 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Adelaide / Mt Lofty -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC -+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven -+T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Nine -+T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten -+T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS -+T 564500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Brisbane dvb-apps/util/scan/dvb-t/au-Brisbane ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Brisbane 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Brisbane 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Brisbane (Mt Coot-tha transmitters) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC -+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven -+T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Nine -+T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten -+T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS -+T 585625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Cairns dvb-apps/util/scan/dvb-t/au-Cairns ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Cairns 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Cairns 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Cairns (Mt Bellenden-Ker transmitters) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC VHF 8 -+T 191500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SEVEN VHF 11 -+T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# WIN VHF 12 -+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# TEN VHF 6 (Expected Start Date Dec 2006) -+T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS UHF 29 -+T 536500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-canberra dvb-apps/util/scan/dvb-t/au-canberra ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-canberra 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-canberra 2009-06-21 13:29:06.000000000 +0200 -@@ -1,12 +1,12 @@ - # Australia / Canberra / Woden - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy - # ABC --T 205625000 7MHz 3/4 3/4 QAM64 8k 1/16 NONE -+T 205625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE - # Seven --T 177500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 177500000 7MHz 3/4 NONE QAM64 8k 1/8 NONE - # Nine - T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE - # Ten --T 219500000 7MHz 3/4 1/2 QAM64 8k 1/16 NONE -+T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE - # SBS - T 543500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Canberra-Black-Mt dvb-apps/util/scan/dvb-t/au-Canberra-Black-Mt ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Canberra-Black-Mt 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Canberra-Black-Mt 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Canberra / Black Mt -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC -+T 205500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Prime -+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# WIN -+T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten -+T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS -+T 543500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Coonabarabran dvb-apps/util/scan/dvb-t/au-Coonabarabran ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Coonabarabran 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Coonabarabran 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,16 @@ -+# Australia / Coonabarabran -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# -+# ABC VHF12 -+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# TEN UHF46 -+T 655500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Nine UHF45 -+T 648500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven VHF11 -+#T 618250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS UHF44 -+T 641500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# D44 UHF35 -+#T 578500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Darwin dvb-apps/util/scan/dvb-t/au-Darwin ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Darwin 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Darwin 2009-06-21 13:29:06.000000000 +0200 -@@ -1,5 +1,9 @@ - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC (UHF 30) - T 543625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE --T 550500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# Nine (UHF 31) -+T 550500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS (UHF 29) - T 536625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE --T 557625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# Southern Cross (UHF 32) -+T 557625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-GoldCoast dvb-apps/util/scan/dvb-t/au-GoldCoast ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-GoldCoast 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-GoldCoast 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,21 @@ -+# DVB-T frequencies & modulation for the Gold Coast, Australia (Mt Tamborine) -+# See http://www.dba.org.au/index.asp?sectionID=22&recLocation=Gold+Coast -+# and http://www.dba.org.au/index.asp?sectionID=120 -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC (UHF 62) -+T 767500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS (UHF 36) -+T 585500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# Seven (UHF 53) -+T 704500000 7MHz 3/4 NONE QAM64 8k 1/8 NONE -+# NBN (UHF 68) -+T 809500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Prime (UHF 65) -+T 788500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Southern Cross Ten (UHF 43) -+T 634500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Nine (UHF 59) -+T 746500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten (UHF 56) -+T 725500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Hobart dvb-apps/util/scan/dvb-t/au-Hobart ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Hobart 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Hobart 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Tasmania / Hobart -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC VHF 8 -+T 191500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS VHF 9a -+T 205500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# SCT VHF 10 -+T 212500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# WIN VHF 7 -+T 184625000 7MHz 3/4 NONE QAM64 8k 1/8 NONE -+# TDT VHF 11 -+T 219500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Mackay dvb-apps/util/scan/dvb-t/au-Mackay ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Mackay 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Mackay 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,14 @@ -+# Australia / Mackay (Mt Blackwood transmitters) -+# aufreq=((UHF channel number)*8+306) -+ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC -+T 212500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven Network -+T 205500000 7MHz 3/4 NONE QAM64 8k 1/8 NONE -+# WIN Digital -+T 578500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Southern Cross Ten -+T 557500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS -+T 536500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Melbourne dvb-apps/util/scan/dvb-t/au-Melbourne ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Melbourne 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Melbourne 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Melbourne (Mt Dandenong transmitters) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC -+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven -+T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Nine -+T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten -+T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS -+T 536625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Melbourne-Upwey dvb-apps/util/scan/dvb-t/au-Melbourne-Upwey ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Melbourne-Upwey 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Melbourne-Upwey 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Melbourne (Upwey Repeater) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC -+T 662500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven -+T 620500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Nine -+T 641500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten -+T 711500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS -+T 683500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-MidNorthCoast dvb-apps/util/scan/dvb-t/au-MidNorthCoast ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-MidNorthCoast 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-MidNorthCoast 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,22 @@ -+# Australia ABC Mid North Coast -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC middle brother -+T 184625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Prime Middle Brother -+T 198500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# NBN Middle Brother -+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten Middle Brother -+T 641500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS middle brother -+T 205500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# ABC Moombil -+T 585500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Prime Moombil -+T 543500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# NBN Moombil -+T 564500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten Moombil -+T 599500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS Moombil -+T 606500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Newcastle dvb-apps/util/scan/dvb-t/au-Newcastle ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Newcastle 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Newcastle 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Newcastle -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# SBS -+T 599500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# NBN -+T 585500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Prime -+T 704500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# ABC -+T 592500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SC10 -+T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Perth dvb-apps/util/scan/dvb-t/au-Perth ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Perth 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Perth 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Perth -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC -+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven Network -+T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Nine Network -+T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Network TEN -+T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS -+T 536625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Perth_Roleystone dvb-apps/util/scan/dvb-t/au-Perth_Roleystone ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Perth_Roleystone 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Perth_Roleystone 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Perth (Roleystone transmitter) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# SBS -+T 704500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# ABC -+T 725500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven -+T 746500000 7MHz 2/3 NONE QAM64 8k 1/16 NONE -+# Nine -+T 767500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten -+T 788500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-SpencerGulf dvb-apps/util/scan/dvb-t/au-SpencerGulf ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-SpencerGulf 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-SpencerGulf 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# Australia / South Australia / Pt Pirie (THE BLUFF) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC -+T 599500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Southern Cross -+T 641500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS -+T 620500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-SunshineCoast dvb-apps/util/scan/dvb-t/au-SunshineCoast ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-SunshineCoast 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-SunshineCoast 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Sunshine Coast -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# SBS36 SBS *** -+T 585625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# TNQ47 10 *** -+T 662625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# ABQ62 ABC *** -+T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# STQ65 7 *** -+T 788625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# STQ68 WIN *** -+T 809500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Sydney_Kings_Cross dvb-apps/util/scan/dvb-t/au-Sydney_Kings_Cross ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Sydney_Kings_Cross 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Sydney_Kings_Cross 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,14 @@ -+# Australia / Sydney / Kings Cross and North Head -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# -+# ABC UHF30 -+T 543500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven UHF48 -+T 669500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Nine UHF33 -+T 564500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten UHF45 -+T 648500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS UHF34 -+T 571500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-sydney_north_shore dvb-apps/util/scan/dvb-t/au-sydney_north_shore ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-sydney_north_shore 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-sydney_north_shore 1970-01-01 01:00:00.000000000 +0100 -@@ -1,12 +0,0 @@ --# Australia / Sydney / North Shore (aka Artarmon/Gore Hill) --# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --# ABC --T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE --# Seven --T 177500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE --# Nine --T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE --# Ten --T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE --# SBS --T 571500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Sydney_North_Shore dvb-apps/util/scan/dvb-t/au-Sydney_North_Shore ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Sydney_North_Shore 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Sydney_North_Shore 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,16 @@ -+# Australia / Sydney / North Shore (aka Artarmon/Gore Hill/Willoughby) -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# -+# ABC VHF12 -+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven VHF6 -+T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Nine VHF8 -+T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten VHF11 -+T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS UHF34 -+T 571500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# D44 UHF35 -+T 578500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Tamworth dvb-apps/util/scan/dvb-t/au-Tamworth ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Tamworth 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Tamworth 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,38 @@ -+# Australia / NSW / New England / Tamworth / Mt.Soma -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# SBS -+T 690500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# NBN -+T 753500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Prime -+T 732500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# ABC -+T 711500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SC10 -+T 774500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+ -+# Australia / NSW / New England / Upper Namoi / Mt.Dowe -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# SBS -+T 585500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# NBN -+T 592500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Prime -+T 205625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# ABC -+T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SC10 -+T 613500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+ -+# Australia / NSW / Western Districts / Central Western Slopes / Mt. Cenn Cruaich -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# SBS -+T 641500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# WIN -+T 648500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Prime -+T 620500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# ABC -+T 226625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SC10 -+T 641500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Townsville dvb-apps/util/scan/dvb-t/au-Townsville ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Townsville 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Townsville 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Brisbane (Mt Coot-tha transmitters) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# SBS -+T 592500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# ABC -+T 550500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Seven -+T 599500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Nine -+T 620500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten -+T 585500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-WaggaWagga dvb-apps/util/scan/dvb-t/au-WaggaWagga ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-WaggaWagga 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-WaggaWagga 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Australia / Wagga Wagga (Mt Ulundra) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# ABC -+T 655500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS -+T 669500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# Prime -+T 662500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Southern Cross Ten -+T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# WIN -+T 683500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Wollongong dvb-apps/util/scan/dvb-t/au-Wollongong ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Wollongong 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/au-Wollongong 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,40 @@ -+# Australia / Wollongong -+# -+# Australia modulation params: -+# - http://www.dba.org.au/index.asp?sectionID=120 -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# -+# North (Broadcast Site Escarpment Road BROKERS NOSE) -+# - http://www.dba.org.au/index.asp?query=true§ionID=22&recLocation=Wollongong+%2D+North -+# -+# ABC UHF52 -+T 697500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Prime UHF46 -+T 655500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# WIN UHF40 -+T 613500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten UHF43 -+T 634500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS UHF54 -+T 711625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -+# -+# Illawarra (Broadcast Australia Digital Television Tower KNIGHTS HILL) -+# - http://www.dba.org.au/index.asp?query=true§ionID=22&recLocation=Wollongong+%2D+Illawarra -+# -+# ABC UHF51 -+T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Prime UHF38 -+T 599500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# WIN UHF36 -+T 585500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Ten UHF37 -+T 592500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE -+# SBS - same as North -+# -+# Stanwell Park (Bald Hill STANWELL TOPS) -+# - http://www.dba.org.au/index.asp?query=true§ionID=22&recLocation=Wollongong+%2D+Stanwell%20Park -+# -+# ABC, Prime, WIN, Ten are identical to Wollongong / North -+# SBS UHF49 -+T 676500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Brussels dvb-apps/util/scan/dvb-t/be-Brussels ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Brussels 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/be-Brussels 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# Brussels - Belgium (Transmitters of the RTBF and the VRT) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # RTBF -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # BE-TV -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # VRT -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Libramont dvb-apps/util/scan/dvb-t/be-Libramont ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Libramont 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/be-Libramont 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# Libramont - Belgique -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# Canal 7 191.5 MHz M6 -+# Canal 24 498.0 MHz RTL-TVI Club-RTL Plug-TV RTL 4,5,7 -+# Canal 27 522.0 MHz RTL Lux, den 2ten RTL -+# Canal 56 834.0 MHz RTBF 1,2,3 + radio -+T 191500000 7MHz 1/2 NONE QAM64 8k 1/8 NONE -+T 498000000 8MHz 1/2 NONE QAM64 8k 1/16 NONE -+T 522000000 8MHz 1/2 NONE QAM64 8k 1/16 NONE -+T 834000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Schoten dvb-apps/util/scan/dvb-t/be-Schoten ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Schoten 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/be-Schoten 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Schoten-Antwerpen - Belgie -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 778000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-St_Pieters_Leeuw dvb-apps/util/scan/dvb-t/be-St_Pieters_Leeuw ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-St_Pieters_Leeuw 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/be-St_Pieters_Leeuw 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# St.-Pieters-Leeuw - Belgie -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Tournai dvb-apps/util/scan/dvb-t/be-Tournai ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Tournai 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/be-Tournai 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Tournai - Belgique -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ch-All dvb-apps/util/scan/dvb-t/ch-All ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ch-All 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/ch-All 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,31 @@ -+# Switzerland, whole country -+# Created from http://www.broadcast.ch/portal.aspx?pid=705 -+# and http://www.broadcast.ch/data_program_dvbt.aspx -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 522000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 538000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 554000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 562000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 578000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 602000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 618000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 626000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 642000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 658000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 658000000 8MHz 5/6 NONE QAM16 8k 1/8 NONE -+T 666000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 674000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 682000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 690000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 698000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 714000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 722000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 722000000 8MHz 5/6 NONE QAM16 8k 1/8 NONE -+T 738000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 754000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 762000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 786000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 802000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 826000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 850000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ch-Citycable dvb-apps/util/scan/dvb-t/ch-Citycable ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ch-Citycable 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/ch-Citycable 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# Lausanne - Switzerland (DVB-T on CityCable cable network) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 522000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 554000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 570000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 578000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 586000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 610000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 618000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 626000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 658000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 730000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 746000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 818000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 826000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 834000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -+T 842000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Brno dvb-apps/util/scan/dvb-t/cz-Brno ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Brno 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/cz-Brno 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# DVB-T Brno (Brno, Czech Republic) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# MUX 1 Ceska televize -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+# MUX 2 Ceske radiokomunikace -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+# MUX 3 Czech Digital Group -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+# MUX 4 Telefonica O2 -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Domazlice dvb-apps/util/scan/dvb-t/cz-Domazlice ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Domazlice 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/cz-Domazlice 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# DVB-T Domažlice (Domažlice, Czech Republic) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Klet dvb-apps/util/scan/dvb-t/cz-Klet ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Klet 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/cz-Klet 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# DVB-T Ceske Budejovice (Klet, Czech Republic) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# CRa - Ceske radiokomunikace, TX Klet -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Ostrava dvb-apps/util/scan/dvb-t/cz-Ostrava ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Ostrava 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/cz-Ostrava 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# DVB-T Ostrava (Ostrava, Czech Republic) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Plzen dvb-apps/util/scan/dvb-t/cz-Plzen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Plzen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/cz-Plzen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# DVB-T Plzen (Pilsen, Czech Republic) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# MUX 1 Ceska televize -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+# MUX 2 Ceske Radiokomunikace -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+# MUX 3 Czech Digital Group -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Praha dvb-apps/util/scan/dvb-t/cz-Praha ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Praha 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/cz-Praha 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# DVB-T Praha (Prague, Czech Republic) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Baden-Wuerttemberg dvb-apps/util/scan/dvb-t/de-Baden-Wuerttemberg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Baden-Wuerttemberg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Baden-Wuerttemberg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,20 @@ -+# DVB-T Baden-Württemberg -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsPlus -+T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: SWR-BW, BR, hr, WDR -+T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: SWR-BW, BR, hr, WDR -+T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: SWR-BW, BR, hr, WDR -+T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, arte, Phoenix, EinsPlus -+T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SWR-BW, BR, hr, WDR -+T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsPlus -+ # CH50: SWR-BW, BR, hr, WDR -+T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: Das Erste, arte, Phoenix, EinsPlus -+T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Das Erste, arte, Phoenix, EinsPlus -+ # CH53: SWR-BW, BR, hr, WDR -+T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Das Erste, arte, Phoenix, EinsPlus -+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsPlus -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Bayern dvb-apps/util/scan/dvb-t/de-Bayern ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Bayern 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Bayern 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,40 @@ -+# DVB-T Bayern -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 184500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH06: Das Erste, arte, Phoenix, EinsPlus -+T 191500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH07: Das Erste, arte, Phoenix, EinsPlus -+T 212500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH10: Das Erste, arte, Phoenix, EinsPlus -+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: BR, BRalpha, SWR, Das Erste -+ # CH25: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: BR, BRalpha, SWR, Das Erste -+T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: BR, BRalpha, SWR, Das Erste -+ # CH28: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: Das Erste, arte, Phoenix, EinsPlus -+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Das Erste, arte, Phoenix, EinsPlus -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL II, Super RTL, VOX -+ # CH34: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: Das Erste, arte, Phoenix, EinsPlus -+T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: BR, BRalpha, hr, mdr -+ # CH40: Das Erste, arte, Phoenix, EinsPlus -+T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: BR, BRalpha, hr, mdr -+ # CH45: Das Erste, arte, Phoenix, EinsPlus -+T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: BR, BRalpha, SWR, Das Erste -+ # CH46: BR, BRalpha, hr, mdr -+T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: BR, BRalpha, hr, mdr -+ # CH47: Das Erste, arte, Phoenix, EinsPlus -+T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Pro7, Sat.1, Kabel1, N24 -+T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: Pro7, Sat.1, Kabel1, N24 -+T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: BR, BRalpha, SWR, Das Erste -+ # CH53: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: http://www.digitalfernsehen.de/news/news_769785.html -+T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Das Erste, arte, Phoenix, EinsPlus -+T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: BR, BRalpha, SWR, Das Erste -+T 770000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH58: Das Erste, arte, Phoenix, EinsPlus -+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Eurosport, MonA, Franken Fernsehen -+T 834000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH66: RTL, RTL II, Super RTL, VOX -+ # CH66: Tele 5, Eurosport, HSE 24, münchen.tv -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Berlin dvb-apps/util/scan/dvb-t/de-Berlin ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Berlin 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Berlin 2009-06-21 13:29:06.000000000 +0200 -@@ -1,5 +1,11 @@ - # DVB-T Berlin -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 522000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # ard / rbb --T 570000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # zdf --T 658000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # t-systems -+T 177500000 7MHz 3/4 NONE QAM16 8k 1/8 NONE # CH05: HSE 24/MONA, FAB, WDR, SWR -+T 191500000 7MHz 2/3 NONE QAM16 8k 1/8 NONE # CH07: MDR, NDR, arte -+T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: RTL, RTL II, Super RTL, VOX -+T 522000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH27: Das Erste, RBB, Phoenix, EinsExtra -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 658000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH44: Pro7, Sat.1, Kabel1, N24 -+T 754000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH56: Eurosport, TV.B, DSF, Neun live -+T 778000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH59: n-tv, EuroNews, + 26 Radioprogramme -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Brandenburg dvb-apps/util/scan/dvb-t/de-Brandenburg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Brandenburg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Brandenburg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# DVB-T Brandenburg -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 730000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE # CH53: Das Erste, RBB, Phoenix, EinsExtra -+T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: MDR, NDR, arte -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Bremen dvb-apps/util/scan/dvb-t/de-Bremen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Bremen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Bremen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# DVB-T Bremen -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste (RB), RB TV (NDR NDS), arte, Phoenix -+T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL II, Super RTL, VOX -+T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, Neun live, Eurosport, MONA/DMAX -+T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Pro7, Sat.1, Kabel1, N24 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Hamburg dvb-apps/util/scan/dvb-t/de-Hamburg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Hamburg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Hamburg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,16 @@ -+# DVB-T Hamburg -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 490000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH -+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Pro7, Sat.1, Kabel1, N24 -+T 546000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH30: Pro7, Sat.1, Kabel1, N24 -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra -+T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL II, Super RTL, VOX -+T 626000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH40: RTL, RTL II, Super RTL, VOX -+T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Neun live, HH1, BibelTV, Eurosport -+T 674000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH46: Neun live, HH1, BibelTV, Eurosport -+T 738000000 8MHz 1/2 NONE QAM64 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR SH -+T 738000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR SH -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Hessen dvb-apps/util/scan/dvb-t/de-Hessen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Hessen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Hessen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+# DVB-T Hessen -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 198500000 7MHz 2/3 NONE QAM16 8k 1/4 NONE # CH08: Phoenix, BR, SWR-RP -+T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: Phoenix, BR, SWR-RP, WDR -+T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: Das Erste, hr, EinsExtra/arte -+T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL II, Super RTL, VOX -+T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: Das Erste, hr, EinsExtra/arte -+T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: Phoenix, BR, SWR-RP, mdr -+T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, hr, EinsExtra/arte -+T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: BR, hr, SWR-BW, WDR -+T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Pro7, Sat.1, Kabel1, N24 -+T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Phoenix, NDR, mdr, WDR -+T 818000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH64: Tele5, Eurosport, rheinmaintv -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Mecklenburg-Vorpommern dvb-apps/util/scan/dvb-t/de-Mecklenburg-Vorpommern ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Mecklenburg-Vorpommern 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Mecklenburg-Vorpommern 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# DVB-T Mecklenburg-Vorpommern -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste, NDR MVP, RBB, MDR/NDR SH -+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, NDR MVP, RBB, MDR/NDR SH -+T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: Das Erste, NDR MVP, RBB, MDR/NDR SH -+T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: Das Erste, NDR MVP, RBB, MDR/NDR SH -+T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 714000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH51: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Niedersachsen dvb-apps/util/scan/dvb-t/de-Niedersachsen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Niedersachsen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Niedersachsen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,40 @@ -+# DVB-T Niedersachsen -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste (RB), RB TV (NDR NDS), arte, Phoenix -+ # CH22: Das Erste, arte, Phoenix, EinsExtra -+ # CH22: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: RTL, RTL II, Super RTL, VOX -+ # CH24: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: Tele 5, NICK/Comedy Central, Eurosport, MONA/DMAX -+T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra -+T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 610000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH38: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: Das Erste, arte, Phoenix, EinsExtra -+T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL II, Super RTL, VOX -+ # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, arte, Phoenix, EinsExtra -+ # CH43: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: Pro7, Sat.1, Kabel1, N24 -+T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, Neun live, Eurosport, MONA/DMAX -+T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Das Erste, arte, Phoenix, EinsExtra -+T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Das Erste, arte, Phoenix, EinsExtra -+T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Pro7, Sat.1, Kabel1, N24 -+T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsExtra -+T 714000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH51: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Das Erste, arte, Phoenix, EinsExtra -+T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 770000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH58: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH -+T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Das Erste, arte, Phoenix, EinsExtra -+ # CH59: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Comedy Central, Eurosport, MONA/DMAX -+ # CH60: Tele 5, NICK/Comedy Central, Eurosport, MONA/DMAX -+T 826000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH65: Das Erste, arte, Phoenix, EinsExtra -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Nordrhein-Westfalen dvb-apps/util/scan/dvb-t/de-Nordrhein-Westfalen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Nordrhein-Westfalen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Nordrhein-Westfalen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,27 @@ -+# DVB-T Nordrhein-Westfalen -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: Das Erste, arte, Phoenix, EinsFestival -+T 482000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH22: WDR-Wuppertal, NDR/WDR-Düsseldorf, MDR, SWR -+T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: WDR-Dortmund, NDR/WDR-Essen, MDR, SWR -+T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsFestival -+ # CH26: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 522000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH27: WDR-Siegen, NDR, MDR, SWR -+T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: RTL, RTL II, Super RTL, VOX -+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 554000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH31: WDR-Bielefeld, NDR/WDR-Siegen, MDR, SWR -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: CNN, Eurosport, Tele5, VIVA -+T 602000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH37: WDR-Aachen, NDR/WDR-Köln, MDR, SWR -+T 666000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH45: WDR-Münster, NDR/WDR-Dortmund, MDR, SWR -+T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: WDR-Düsseldorf, MDR/WDR-Duisburg, NDR/WDR-Wuppertal, SWR -+T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Das Erste, arte, Phoenix, EinsFestival -+T 698000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH49: WDR-Köln, MDR/WDR-Bonn, NDR/WDR-Aachen, SWR -+T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsFestival -+T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: CNN, Eurosport, Tele5, VIVA -+T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Pro7, Sat.1, Kabel1, N24 -+T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Pro7, Sat.1, Kabel1, N24 -+T 762000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH57: WDR-Essen, NDR/WDR-Dortmund, MDR, SWR -+T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsFestival -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Rheinland-Pfalz dvb-apps/util/scan/dvb-t/de-Rheinland-Pfalz ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Rheinland-Pfalz 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Rheinland-Pfalz 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# DVB-T Rheinland-Pfalz -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: SWR-RP, BR, hr, WDR -+T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, BR, hr, WDR -+T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Das Erste, arte, Phoenix, EinsPlus -+T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: SWR-RP, BR, hr, WDR -+T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: Das Erste, arte, Phoenix, EinsPlus -+T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: Das Erste, arte, Phoenix, EinsPlus -+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsPlus -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Saarland dvb-apps/util/scan/dvb-t/de-Saarland ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Saarland 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Saarland 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# DVB-T Saarland -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: Das Erste, SR Fernsehen, arte, Phoenix -+T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, BR, hr, WDR -+T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SaarTV, Tele 5, QVC, BibelTV -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Sachsen dvb-apps/util/scan/dvb-t/de-Sachsen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Sachsen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Sachsen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# DVB-T Sachsen -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 205500000 7MHz 2/3 NONE QAM64 8k 1/16 NONE # CH09: MDR-SN, rbb, BR, WDR -+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH24: Das Erste, arte, Phoenix, EinsFestival -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH25: Das Erste, arte, Phoenix, EinsFestival -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-SN, rbb, BR, WDR -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: MDR-SN, rbb, BR, WDR -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH32: MDR-SN, rbb, BR, WDR -+T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH39: Das Erste, arte, Phoenix, EinsFestival -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Sachsen-Anhalt dvb-apps/util/scan/dvb-t/de-Sachsen-Anhalt ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Sachsen-Anhalt 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Sachsen-Anhalt 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# DVB-T Sachsen-Anhalt -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH24: Das Erste, arte, Phoenix, EinsFestival -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: Das Erste, arte, Phoenix, EinsFestival -+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH34: MDR-ST, rbb, NDR, WDR -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH35: MDR-ST, rbb, NDR, WDR -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH38: MDR-ST, rbb, NDR, WDR -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH41: Das Erste, arte, Phoenix, EinsFestival -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Schleswig-Holstein dvb-apps/util/scan/dvb-t/de-Schleswig-Holstein ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Schleswig-Holstein 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Schleswig-Holstein 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# DVB-T Schleswig-Holstein -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH -+T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH -+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Pro7, Sat.1, Kabel1, N24 -+T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra -+T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: Pro7, Sat.1, Kabel1, N24 -+T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH -+T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL II, Super RTL, VOX -+T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: RTL, RTL II, Super RTL, VOX -+T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Das Erste, arte, Phoenix, EinsExtra -+T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: Neun live, Tele 5, Eurosport, MONA/DMAX -+T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Neun live, Tele 5, Eurosport, MONA/DMAX -+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsExtra -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Thueringen dvb-apps/util/scan/dvb-t/de-Thueringen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Thueringen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/de-Thueringen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# DVB-T Thüringen -+# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH21: Das Erste, arte, Phoenix, EinsFestival -+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH25: Das Erste, arte, Phoenix, EinsFestival -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-TH, rbb, hr, BR -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH48: MDR-TH, rbb, hr, BR -+T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH53: Das Erste, arte, Phoenix, EinsFestival -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/dk-All dvb-apps/util/scan/dvb-t/dk-All ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/dk-All 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/dk-All 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,17 @@ -+# Denmark, whole country -+# Created from http://www.digi-tv.dk/Indhold_og_tilbud/frekvenser.asp -+# and http://www.digi-tv.dk/Sendenettets_opbygning/ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Albacete dvb-apps/util/scan/dvb-t/es-Albacete ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Albacete 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Albacete 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# Spain, Albacete -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 59: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3 -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: CLMTV -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo, Veo 2, Net TV, Teledeporte -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alfabia dvb-apps/util/scan/dvb-t/es-Alfabia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alfabia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Alfabia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# DVB-T Alfabia, Mallorca, Balearic Islands, Spain. -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.63: 24h, 50 aniv., ClanTV, La 2, TVE1; RNE 1, RNE 3, RNE C; Digitext, EPG, Lanzadera. -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.65: IB3, Aprenda Ingles TV -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.66: NetTV, Teledeporte, VeoTV1, VeoTV2. -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.67: 40 Latino TV, CNN+, Cuatro, La Sexta 1. -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.68: Fly Music, Tele 5, Tele 5 Estrellas, Tele 5 Sport. -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.69: Antena 3, La Sexta 2, Neox, Nova. -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alicante dvb-apps/util/scan/dvb-t/es-Alicante ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alicante 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Alicante 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# DVB-T Alicante, Spain -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 55: TV3, K33/33, 3/24, Canal 300 -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 58: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3 -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: Telemadrid, La Otra, Onda 6 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo, Veo 2, Net TV, Teledeporte -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alpicat dvb-apps/util/scan/dvb-t/es-Alpicat ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alpicat 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Alpicat 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# DVB-T Alpicat (Lleida) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c58: TV3, K3/33, 3/24, 300, 3i -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c64: TVE1, TVE2, Teledeporte, C24h -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c66: TVE ClanTV, TVE 50a, Veo1, Veo2, Net -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c67: Cuatro, 40Latino, CNN+, LaSexta 1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c68: T5, T5 Sports, T5 Estrellas, Net Fly Music -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c69: Antena3, Antena.Neox, Antena.Nova, La Sexta 2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Asturias dvb-apps/util/scan/dvb-t/es-Asturias ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Asturias 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Asturias 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# DVB-T Asturias -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TPA TPA2 -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TVE 1, TVE 2, 24H TVE, CLAN/50 TVE, RNE1, RNE CLASICA, RNE3 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TELEDEPORTE, VEO TV, VEO 2, NET TV -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CUATRO, CNN+, 40 LATINO, LA SEXTA 1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TELECINCO, T5 ESTRELLAS, T5 SPORT, FLYMUSIC -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, LA SEXTA 2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Bilbao dvb-apps/util/scan/dvb-t/es-Bilbao ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Bilbao 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Bilbao 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: CNN+. Cuatro, La Sexta, 40 latino TV -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, La Sexta 2, Neo, Nova, Telehit, Onda Cero, Europa FM, Onda Melodia -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo, Veo 2, Net TV, Teledeporte -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 61: ETB1, ETB2, ETB-Sat, Canal Vasco, Euskadi Irratia, Radio Euskadi, Euskadi Gastea, Radio EITB -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Cadiz dvb-apps/util/scan/dvb-t/es-Cadiz ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Cadiz 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Cadiz 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# DVB-T Cadiz (Andalucia) by terrex Feb 2009 -+# T freq bw fec_hi fec_lo mod transm-mode guard-interval hierarchy -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C59 -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C64 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C66 -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C67 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C68 -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C69 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Carceres dvb-apps/util/scan/dvb-t/es-Carceres ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Carceres 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Carceres 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 39: 8Madrid, TMT-Popular TV, Kiss TV, Intereconomía TV -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 50: EsMadrid TV, Ver-t, EM2, Libertad Digital TV -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 58: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3 -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: Telemadrid, La Otra, Onda 6 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo, Veo 2, Net TV, Teledeporte -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2 -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 61: Canal Extremadura, Extremadura Television -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Collserola dvb-apps/util/scan/dvb-t/es-Collserola ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Collserola 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Collserola 2009-06-21 13:29:06.000000000 +0200 -@@ -1,6 +1,10 @@ - # DVB-T Collserola (Barcelona) - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 650000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE # C43: tvc --T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C61: tve, t5, a3, c+ --T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C66: veotv, nettv -- -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c26: BTV -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c33: CityTV -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c61: TV3, K3/33, 3/24, 300 -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c64: TVE1, TVE2, TVE 24H, Clan/TVE 50 Años, RNE1, RNEC, RNE3 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c66: Veo TV, Veo2, Net TV, Teledeporte -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c67: Cuatro, CNN+, 40 Latino, La Sexta1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c68: Telecino, T5 Sport, T5 Estrellas, Fly Music -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c69: Antena 3, Antena.Neox, Antena.Nova, La Sexta2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Donostia dvb-apps/util/scan/dvb-t/es-Donostia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Donostia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Donostia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,14 @@ -+# The channels with 1/32 guard-interval are French and should be perfectly visible -+# here. However I have only managed to get a lock for the channel 57 of the French ones. -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 32: CNN+, Cuatro, La Sexta 1, 40 Latino TV, EPG Soge V2 5 -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 40: Antena 3, Antena.Neox, Antena.Nova, Telehit, Onda Cero, Europa FM, Onda Melodia, A3Lanzadera, A3Portal, EPGA3, A3Ticker -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # Canal 42: Direct8, TMC, BFM, iTele, Europe2TV, Gulli -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # Canal 49: M6, W9, NT1 -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # Canal 51: Canal+, Canal+ Cinema, Canal+ Sport -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # Canal 57: TF1, NRJ12, Eurosport, TPS Star, LCI -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 60: ETB1, ETB2, ETB-Sat, Canal Vasco, Euskadi Irratia, Radio Euskadi, Euskadi Gaztea, Radio Etb, TGov, Eguraldi -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: TVE1, TVE2, 24H TVE, Clan/TVE 50 anos, RNE, RNEC, RNE3, Lanzadera, EPG, Digitext, Meteo, Bolsa, Trafico, Empleat -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # Canal 65: France 2, France 3, France 4, France 5, Arte, LCP -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Net TV, Teledeporte, Veo TV1, Veo TV2, Lanzadera, EPG, Digitext, Meteo, Bolsa, Trafico, Empleat -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Fly Music, Tele 5, Tele 5 Estrellas, Tele 5 Sport -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Huesca dvb-apps/util/scan/dvb-t/es-Huesca ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Huesca 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Huesca 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# DVB-T Huesca (Aragón) [Spain] [es-Huesca] -+# Generated by Vicente Hernando Ara -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # Canal 57: ARAGON TV, ARAGON RADIO, ARAGON HD -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 61: La 1, La 2, 24h, Clan, RNE1, RNEC, RNE3 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Teledeporte, Canal Ingenieria, VEO7, SONY TV en VEO, Tienda en VEO, GUIDE PLUS+, Intereconomia, Radio Intereconomia, RADIO MARCA -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: laSexta, CUATRO, CNN+, 40 LATINO, PROMO, SER, 40 PRINCIPALES, CADENA DIAL -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, FDF, Telecinco 2, Disney Channel, Cincoshop -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, ONDA CERO, EUROPA FM, ONDA MELODÍA, HOGAR 10 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Las_Palmas dvb-apps/util/scan/dvb-t/es-Las_Palmas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Las_Palmas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Las_Palmas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# Funciona correctamente en Las Palmas de Gran Canaria (24-4-2007) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 60: TVE1, TVE2, 24H TVE, Clan/TVE, RNE, RNEC, RNE3, Lanzadera, EPG, Digitext, Meteo, Bolsa, Trafico, Empleat -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 65: TV C, TV C2 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Net TV, Teledeporte, Veo TV1, SETenVeo, Radio Intereconomía Lanzadera, EPG, Digitext, Meteo, Bolsa, Trafico, Empleat -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: CNN+, Cuatro, La Sexta 1, 40 Latino TV, EPG Soge V2 5 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Fly Music, Punto Radio, Tele 5, Tele 5 Estrellas, Tele 5 Sport -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena.Neox, Antena.Nova, Telehit, Onda Cero, Europa FM, Onda Melodia, A3Lanzadera, A3Portal, EPGA3, A3Ticker -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Lugo dvb-apps/util/scan/dvb-t/es-Lugo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Lugo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Lugo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# DVB-T Lugo (Centro emisor Paramo) - Rev. 1.2 - 11.12.05 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TVE 1, TVE 2, 24H TVE, CLAN/50 TVE, RNE1, RNE CLASICA, RNE3 -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TVG, GALICIA TV AMERICA, RADIO GALEGA, R.GALEGA MUSICA, SON GALICIA RADIO, PROBAS RETEGAL -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TELEDEPORTE, VEO TV, VEO 2, NET TV -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CUATRO, CNN+, 40 LATINO, LA SEXTA 1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TELECINCO, T5 ESTRELLAS, T5 SPORT, FLYMUSIC -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, LA SEXTA 2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Madrid dvb-apps/util/scan/dvb-t/es-Madrid ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Madrid 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Madrid 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 39: 8Madrid, TMT-Popular TV, Kiss TV, Intereconomía TV -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 50: EsMadrid TV, Ver-t, EM2, Libertad Digital TV -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 58: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3 -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: Telemadrid, La Otra, Onda 6 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo, Veo 2, Net TV, Teledeporte -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Malaga dvb-apps/util/scan/dvb-t/es-Malaga ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Malaga 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Malaga 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# DVB-T Malaga (Andalucia) by Pedro Leon 4 Mayo 2007 -+# T freq bw fec_hi fec_lo mod transm-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C57 La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3 -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C63 Canal Sur, Canal 2 Andalucia -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C66 TELEDEPORTE, VEO, *Canal Ingenieria, SETenVEO, Tienda en VEO, NET TV, Radio Intereconomia -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C67 CUATRO, CNN+, 40 LATINO, laSexta -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C68 Telecinco, T5 Estrellas, T5 Sport, FLYMUSIC, PUNTO RADIO -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C69 ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, *tvtv DIGITAL, ONDA CERO, EUROPA FM, ONDA MELODIA, Telehit -+# * Canales de datos o MHT -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Muros-Noia dvb-apps/util/scan/dvb-t/es-Muros-Noia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Muros-Noia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Muros-Noia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# DVB-T Muros and Noia -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 27: Local Ribeira -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 61: RAR A Corunha -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: RGE Galicia -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: SFN 1 -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: SFN 2 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: SFN 3 -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: SFN 4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Mussara dvb-apps/util/scan/dvb-t/es-Mussara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Mussara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Mussara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# DVB-T La Mussara (Reus-Tarragona) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c59: TV3, K3/33, 3/24, 300, 3i -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c64: TVE1, TVE2, Teledeporte, C24h -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c66: TVE ClanTV, TVE 50a, Veo1, Veo2, Net -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c67: Cuatro, 40Latino, CNN+, LaSexta 1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c68: T5, T5 Sports, T5 Estrellas, Net Fly Music -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c69: Antena3, Antena.Neox, Antena.Nova, La Sexta 2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Rocacorba dvb-apps/util/scan/dvb-t/es-Rocacorba ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Rocacorba 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Rocacorba 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# DVB-T Rocacorba (Girona) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TVE 1, TVE 2, ANTENA 3, TELECINCO, CUATRO -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TV3, K3/33, 3XL.NET, 3/24, CANAL PILOT -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # SERVICIO PRUEBAS CANAL 67 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Santander dvb-apps/util/scan/dvb-t/es-Santander ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Santander 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Santander 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# file automatically generated by w_scan -+# (http://wirbel.htpc-forum.de/w_scan/index2.html) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Santiago_de_Compostela dvb-apps/util/scan/dvb-t/es-Santiago_de_Compostela ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Santiago_de_Compostela 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Santiago_de_Compostela 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# DVB-T Santiago de Compostela -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 23: Local Santiago -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 40: RAR Santiago -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: RGE Galicia -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: SFN 1 -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: SFN 2 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: SFN 3 -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: SFN 4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Sevilla dvb-apps/util/scan/dvb-t/es-Sevilla ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Sevilla 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Sevilla 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# DVB-T Sevilla (Andalucia) by x2 15 Agosto 2006 -+# T freq bw fec_hi fec_lo mod transm-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C57 -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C61 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C66 -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C67 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C68 -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C69 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Valencia dvb-apps/util/scan/dvb-t/es-Valencia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Valencia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Valencia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# DVB-T Valencia, Spain -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 23: TMV, Tele 7, Aprende ingles TV, Ed. Prensa Val.,R.Mediamed -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 55: TV3, 33, 3/24, K3/300 -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 57: Canal 9, Punt 2, Popular TV, LP Teva, Radio 9, Si Radio -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 58: TVE 1, La 2, 24H TVE, Clan TVE, RNE 1, RNE C, RNE 3 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo, Sony TV en Veo, Tienda en Veo, Intereconomia, Teledeporte, R. Interec., R. Marca -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, Promo, La Sexta, Ser, 40 Princ., Cad. Dial -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, Telecinco 2, FDF, Cinco Shop, Disney Channel, Punto Radio -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena Neox, Antena Nova, Hogar 10, Onda Cero, Europa FM, Onda Melodia -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Valladolid dvb-apps/util/scan/dvb-t/es-Valladolid ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Valladolid 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Valladolid 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# DVB-T Valladolid -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 57: Clan TVE, 24H TVE, La 2, TVE 1, RNE1, RNE3, RNC -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo, Veo 2, Net TV, Teledeporte -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Vilamarxant dvb-apps/util/scan/dvb-t/es-Vilamarxant ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Vilamarxant 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Vilamarxant 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# DVB-T Vilamarxant, Valencia, C. Valenciana, Spain. -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Zaragoza dvb-apps/util/scan/dvb-t/es-Zaragoza ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Zaragoza 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/es-Zaragoza 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# DVB-T Zaragoza (Aragón) [Spain] [es-Zaragoza] -+# Generated by Víctor Martínez Romanos -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: TVE 1, TVE 2, 24H, CLAN/50, RNE1, RNEC, RNE3 -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: TELEDEPORTE, VEO TV, VEO 2, NET TV -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: CUATRO, CNN+, 40 LATINO, LA SEXTA 1 -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: T5 ESTRELLAS, T5 SPORT, TELECINCO, FLYMUSIC -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, LA SEXTA 2 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Aanekoski dvb-apps/util/scan/dvb-t/fi-Aanekoski ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Aanekoski 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Aanekoski 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Aanekoski_Konginkangas dvb-apps/util/scan/dvb-t/fi-Aanekoski_Konginkangas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Aanekoski_Konginkangas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Aanekoski_Konginkangas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ahtari dvb-apps/util/scan/dvb-t/fi-Ahtari ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ahtari 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ahtari 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Alajarvi dvb-apps/util/scan/dvb-t/fi-Alajarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Alajarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Alajarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ala-Vuokki dvb-apps/util/scan/dvb-t/fi-Ala-Vuokki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ala-Vuokki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ala-Vuokki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ammansaari dvb-apps/util/scan/dvb-t/fi-Ammansaari ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ammansaari 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ammansaari 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Anjalankoski dvb-apps/util/scan/dvb-t/fi-Anjalankoski ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Anjalankoski 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Anjalankoski 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Enontekio_Ahovaara_Raattama dvb-apps/util/scan/dvb-t/fi-Enontekio_Ahovaara_Raattama ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Enontekio_Ahovaara_Raattama 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Enontekio_Ahovaara_Raattama 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Espoo dvb-apps/util/scan/dvb-t/fi-Espoo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Espoo 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Espoo 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,6 @@ --# Espoo A-mux (Digita Finland) -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy - T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Eurajoki dvb-apps/util/scan/dvb-t/fi-Eurajoki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Eurajoki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Eurajoki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Fiskars dvb-apps/util/scan/dvb-t/fi-Fiskars ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Fiskars 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Fiskars 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Haapavesi dvb-apps/util/scan/dvb-t/fi-Haapavesi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Haapavesi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Haapavesi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hameenkyro_Kyroskoski dvb-apps/util/scan/dvb-t/fi-Hameenkyro_Kyroskoski ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hameenkyro_Kyroskoski 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Hameenkyro_Kyroskoski 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hameenlinna_Painokangas dvb-apps/util/scan/dvb-t/fi-Hameenlinna_Painokangas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hameenlinna_Painokangas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Hameenlinna_Painokangas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hanko dvb-apps/util/scan/dvb-t/fi-Hanko ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hanko 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Hanko 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hartola dvb-apps/util/scan/dvb-t/fi-Hartola ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hartola 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Hartola 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Heinavesi dvb-apps/util/scan/dvb-t/fi-Heinavesi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Heinavesi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Heinavesi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Heinola dvb-apps/util/scan/dvb-t/fi-Heinola ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Heinola 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Heinola 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hetta dvb-apps/util/scan/dvb-t/fi-Hetta ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hetta 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Hetta 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Houtskari dvb-apps/util/scan/dvb-t/fi-Houtskari ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Houtskari 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Houtskari 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi_Kyparavaara dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi_Kyparavaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi_Kyparavaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi_Kyparavaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi_Paljakka dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi_Paljakka ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi_Paljakka 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi_Paljakka 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyvinkaa_Musta-Mannisto dvb-apps/util/scan/dvb-t/fi-Hyvinkaa_Musta-Mannisto ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyvinkaa_Musta-Mannisto 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Hyvinkaa_Musta-Mannisto 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ii_Raiskio dvb-apps/util/scan/dvb-t/fi-Ii_Raiskio ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ii_Raiskio 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ii_Raiskio 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Iisalmi dvb-apps/util/scan/dvb-t/fi-Iisalmi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Iisalmi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Iisalmi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ikaalinen dvb-apps/util/scan/dvb-t/fi-Ikaalinen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ikaalinen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ikaalinen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ikaalinen_Riitiala dvb-apps/util/scan/dvb-t/fi-Ikaalinen_Riitiala ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ikaalinen_Riitiala 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ikaalinen_Riitiala 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari dvb-apps/util/scan/dvb-t/fi-Inari ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Inari 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari_Janispaa dvb-apps/util/scan/dvb-t/fi-Inari_Janispaa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari_Janispaa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Inari_Janispaa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari_Naatamo dvb-apps/util/scan/dvb-t/fi-Inari_Naatamo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari_Naatamo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Inari_Naatamo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ivalo_Saarineitamovaara dvb-apps/util/scan/dvb-t/fi-Ivalo_Saarineitamovaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ivalo_Saarineitamovaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ivalo_Saarineitamovaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jalasjarvi dvb-apps/util/scan/dvb-t/fi-Jalasjarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jalasjarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Jalasjarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Kaipola dvb-apps/util/scan/dvb-t/fi-Jamsa_Kaipola ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Kaipola 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Jamsa_Kaipola 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Kuorevesi_Halli dvb-apps/util/scan/dvb-t/fi-Jamsa_Kuorevesi_Halli ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Kuorevesi_Halli 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Jamsa_Kuorevesi_Halli 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Matkosvuori dvb-apps/util/scan/dvb-t/fi-Jamsa_Matkosvuori ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Matkosvuori 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Jamsa_Matkosvuori 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsankoski dvb-apps/util/scan/dvb-t/fi-Jamsankoski ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsankoski 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Jamsankoski 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Ouninpohja dvb-apps/util/scan/dvb-t/fi-Jamsa_Ouninpohja ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Ouninpohja 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Jamsa_Ouninpohja 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joensuu_Vestinkallio dvb-apps/util/scan/dvb-t/fi-Joensuu_Vestinkallio ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joensuu_Vestinkallio 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Joensuu_Vestinkallio 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joroinen_Puukkola dvb-apps/util/scan/dvb-t/fi-Joroinen_Puukkola ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joroinen_Puukkola 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Joroinen_Puukkola 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joutsa_Lankia dvb-apps/util/scan/dvb-t/fi-Joutsa_Lankia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joutsa_Lankia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Joutsa_Lankia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joutseno dvb-apps/util/scan/dvb-t/fi-Joutseno ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joutseno 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Joutseno 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Juntusranta dvb-apps/util/scan/dvb-t/fi-Juntusranta ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Juntusranta 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Juntusranta 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Juupajoki_Kopsamo dvb-apps/util/scan/dvb-t/fi-Juupajoki_Kopsamo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Juupajoki_Kopsamo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Juupajoki_Kopsamo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jyvaskyla dvb-apps/util/scan/dvb-t/fi-Jyvaskyla ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jyvaskyla 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Jyvaskyla 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jyvaskylan_mlk_Vaajakoski dvb-apps/util/scan/dvb-t/fi-Jyvaskylan_mlk_Vaajakoski ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jyvaskylan_mlk_Vaajakoski 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Jyvaskylan_mlk_Vaajakoski 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kaavi_Sivakkavaara_Luikonlahti dvb-apps/util/scan/dvb-t/fi-Kaavi_Sivakkavaara_Luikonlahti ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kaavi_Sivakkavaara_Luikonlahti 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kaavi_Sivakkavaara_Luikonlahti 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kajaani_Pollyvaara dvb-apps/util/scan/dvb-t/fi-Kajaani_Pollyvaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kajaani_Pollyvaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kajaani_Pollyvaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kalajoki dvb-apps/util/scan/dvb-t/fi-Kalajoki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kalajoki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kalajoki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kangaslampi dvb-apps/util/scan/dvb-t/fi-Kangaslampi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kangaslampi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kangaslampi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kangasniemi_Turkinmaki dvb-apps/util/scan/dvb-t/fi-Kangasniemi_Turkinmaki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kangasniemi_Turkinmaki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kangasniemi_Turkinmaki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kankaanpaa dvb-apps/util/scan/dvb-t/fi-Kankaanpaa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kankaanpaa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kankaanpaa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karigasniemi dvb-apps/util/scan/dvb-t/fi-Karigasniemi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karigasniemi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Karigasniemi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karkkila dvb-apps/util/scan/dvb-t/fi-Karkkila ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karkkila 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Karkkila 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karstula dvb-apps/util/scan/dvb-t/fi-Karstula ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karstula 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Karstula 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karvia dvb-apps/util/scan/dvb-t/fi-Karvia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karvia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Karvia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kaunispaa dvb-apps/util/scan/dvb-t/fi-Kaunispaa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kaunispaa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kaunispaa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kemijarvi_Suomutunturi dvb-apps/util/scan/dvb-t/fi-Kemijarvi_Suomutunturi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kemijarvi_Suomutunturi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kemijarvi_Suomutunturi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kerimaki dvb-apps/util/scan/dvb-t/fi-Kerimaki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kerimaki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kerimaki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Keuruu dvb-apps/util/scan/dvb-t/fi-Keuruu ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Keuruu 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Keuruu 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Keuruu_Haapamaki dvb-apps/util/scan/dvb-t/fi-Keuruu_Haapamaki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Keuruu_Haapamaki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Keuruu_Haapamaki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kihnio dvb-apps/util/scan/dvb-t/fi-Kihnio ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kihnio 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kihnio 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kiihtelysvaara dvb-apps/util/scan/dvb-t/fi-Kiihtelysvaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kiihtelysvaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kiihtelysvaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kilpisjarvi dvb-apps/util/scan/dvb-t/fi-Kilpisjarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kilpisjarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kilpisjarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kittila_Sirkka_Levitunturi dvb-apps/util/scan/dvb-t/fi-Kittila_Sirkka_Levitunturi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kittila_Sirkka_Levitunturi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kittila_Sirkka_Levitunturi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kolari_Vuolittaja dvb-apps/util/scan/dvb-t/fi-Kolari_Vuolittaja ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kolari_Vuolittaja 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kolari_Vuolittaja 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Koli dvb-apps/util/scan/dvb-t/fi-Koli ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Koli 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Koli 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Korpilahti_Vaarunvuori dvb-apps/util/scan/dvb-t/fi-Korpilahti_Vaarunvuori ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Korpilahti_Vaarunvuori 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Korpilahti_Vaarunvuori 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Korppoo dvb-apps/util/scan/dvb-t/fi-Korppoo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Korppoo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Korppoo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kruunupyy dvb-apps/util/scan/dvb-t/fi-Kruunupyy ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kruunupyy 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kruunupyy 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Iivantiira dvb-apps/util/scan/dvb-t/fi-Kuhmo_Iivantiira ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Iivantiira 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kuhmo_Iivantiira 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen dvb-apps/util/scan/dvb-t/fi-Kuhmoinen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kuhmoinen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen_Harjunsalmi dvb-apps/util/scan/dvb-t/fi-Kuhmoinen_Harjunsalmi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen_Harjunsalmi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kuhmoinen_Harjunsalmi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen_Puukkoinen dvb-apps/util/scan/dvb-t/fi-Kuhmoinen_Puukkoinen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen_Puukkoinen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kuhmoinen_Puukkoinen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Lentiira dvb-apps/util/scan/dvb-t/fi-Kuhmo_Lentiira ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Lentiira 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kuhmo_Lentiira 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Tikkasenmaki dvb-apps/util/scan/dvb-t/fi-Kuhmo_Tikkasenmaki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Tikkasenmaki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kuhmo_Tikkasenmaki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuopio dvb-apps/util/scan/dvb-t/fi-Kuopio ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuopio 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kuopio 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kustavi_Viherlahti dvb-apps/util/scan/dvb-t/fi-Kustavi_Viherlahti ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kustavi_Viherlahti 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kustavi_Viherlahti 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuttanen dvb-apps/util/scan/dvb-t/fi-Kuttanen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuttanen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kuttanen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuusamo_Hamppulampi dvb-apps/util/scan/dvb-t/fi-Kuusamo_Hamppulampi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuusamo_Hamppulampi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kuusamo_Hamppulampi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kyyjarvi_Noposenaho dvb-apps/util/scan/dvb-t/fi-Kyyjarvi_Noposenaho ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kyyjarvi_Noposenaho 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Kyyjarvi_Noposenaho 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lahti dvb-apps/util/scan/dvb-t/fi-Lahti ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lahti 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Lahti 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lapua dvb-apps/util/scan/dvb-t/fi-Lapua ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lapua 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Lapua 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Laukaa dvb-apps/util/scan/dvb-t/fi-Laukaa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Laukaa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Laukaa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Laukaa_Vihtavuori dvb-apps/util/scan/dvb-t/fi-Laukaa_Vihtavuori ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Laukaa_Vihtavuori 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Laukaa_Vihtavuori 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lavia_Lavianjarvi dvb-apps/util/scan/dvb-t/fi-Lavia_Lavianjarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lavia_Lavianjarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Lavia_Lavianjarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lieksa_Vieki dvb-apps/util/scan/dvb-t/fi-Lieksa_Vieki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lieksa_Vieki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Lieksa_Vieki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lohja dvb-apps/util/scan/dvb-t/fi-Lohja ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lohja 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Lohja 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Loimaa dvb-apps/util/scan/dvb-t/fi-Loimaa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Loimaa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Loimaa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Luhanka dvb-apps/util/scan/dvb-t/fi-Luhanka ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Luhanka 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Luhanka 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Luopioinen dvb-apps/util/scan/dvb-t/fi-Luopioinen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Luopioinen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Luopioinen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mantta dvb-apps/util/scan/dvb-t/fi-Mantta ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mantta 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Mantta 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mantyharju dvb-apps/util/scan/dvb-t/fi-Mantyharju ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mantyharju 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Mantyharju 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mikkeli dvb-apps/util/scan/dvb-t/fi-Mikkeli ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mikkeli 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Mikkeli 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Muonio_Olostunturi dvb-apps/util/scan/dvb-t/fi-Muonio_Olostunturi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Muonio_Olostunturi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Muonio_Olostunturi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia dvb-apps/util/scan/dvb-t/fi-Nilsia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Nilsia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia_Keski-Siikajarvi dvb-apps/util/scan/dvb-t/fi-Nilsia_Keski-Siikajarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia_Keski-Siikajarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Nilsia_Keski-Siikajarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia_Pisa dvb-apps/util/scan/dvb-t/fi-Nilsia_Pisa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia_Pisa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Nilsia_Pisa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nokia dvb-apps/util/scan/dvb-t/fi-Nokia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nokia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Nokia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nokia_Siuro_Linnavuori dvb-apps/util/scan/dvb-t/fi-Nokia_Siuro_Linnavuori ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nokia_Siuro_Linnavuori 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Nokia_Siuro_Linnavuori 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nummi-Pusula_Hyonola dvb-apps/util/scan/dvb-t/fi-Nummi-Pusula_Hyonola ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nummi-Pusula_Hyonola 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Nummi-Pusula_Hyonola 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nurmes_Kortevaara dvb-apps/util/scan/dvb-t/fi-Nurmes_Kortevaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nurmes_Kortevaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Nurmes_Kortevaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Orivesi_Langelmaki_Talviainen dvb-apps/util/scan/dvb-t/fi-Orivesi_Langelmaki_Talviainen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Orivesi_Langelmaki_Talviainen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Orivesi_Langelmaki_Talviainen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Oulu dvb-apps/util/scan/dvb-t/fi-Oulu ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Oulu 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Oulu 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Padasjoki dvb-apps/util/scan/dvb-t/fi-Padasjoki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Padasjoki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Padasjoki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Padasjoki_Arrakoski dvb-apps/util/scan/dvb-t/fi-Padasjoki_Arrakoski ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Padasjoki_Arrakoski 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Padasjoki_Arrakoski 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Paltamo_Kivesvaara dvb-apps/util/scan/dvb-t/fi-Paltamo_Kivesvaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Paltamo_Kivesvaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Paltamo_Kivesvaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Parikkala dvb-apps/util/scan/dvb-t/fi-Parikkala ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Parikkala 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Parikkala 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Parkano dvb-apps/util/scan/dvb-t/fi-Parkano ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Parkano 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Parkano 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pello dvb-apps/util/scan/dvb-t/fi-Pello ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pello 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pello 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pello_Ratasvaara dvb-apps/util/scan/dvb-t/fi-Pello_Ratasvaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pello_Ratasvaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pello_Ratasvaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Perho dvb-apps/util/scan/dvb-t/fi-Perho ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Perho 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Perho 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pernaja dvb-apps/util/scan/dvb-t/fi-Pernaja ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pernaja 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pernaja 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pieksamaki_Halkokumpu dvb-apps/util/scan/dvb-t/fi-Pieksamaki_Halkokumpu ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pieksamaki_Halkokumpu 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pieksamaki_Halkokumpu 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pihtipudas dvb-apps/util/scan/dvb-t/fi-Pihtipudas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pihtipudas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pihtipudas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Porvoo_Suomenkyla dvb-apps/util/scan/dvb-t/fi-Porvoo_Suomenkyla ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Porvoo_Suomenkyla 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Porvoo_Suomenkyla 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Posio dvb-apps/util/scan/dvb-t/fi-Posio ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Posio 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Posio 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi dvb-apps/util/scan/dvb-t/fi-Pudasjarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pudasjarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi_Iso-Syote dvb-apps/util/scan/dvb-t/fi-Pudasjarvi_Iso-Syote ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi_Iso-Syote 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pudasjarvi_Iso-Syote 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi_Kangasvaara dvb-apps/util/scan/dvb-t/fi-Pudasjarvi_Kangasvaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi_Kangasvaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pudasjarvi_Kangasvaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Puolanka dvb-apps/util/scan/dvb-t/fi-Puolanka ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Puolanka 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Puolanka 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pyhatunturi dvb-apps/util/scan/dvb-t/fi-Pyhatunturi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pyhatunturi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pyhatunturi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pyhavuori dvb-apps/util/scan/dvb-t/fi-Pyhavuori ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pyhavuori 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pyhavuori 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pylkonmaki_Karankajarvi dvb-apps/util/scan/dvb-t/fi-Pylkonmaki_Karankajarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pylkonmaki_Karankajarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Pylkonmaki_Karankajarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Raahe_Mestauskallio dvb-apps/util/scan/dvb-t/fi-Raahe_Mestauskallio ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Raahe_Mestauskallio 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Raahe_Mestauskallio 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Raahe_Piehinki dvb-apps/util/scan/dvb-t/fi-Raahe_Piehinki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Raahe_Piehinki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Raahe_Piehinki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ranua_Haasionmaa dvb-apps/util/scan/dvb-t/fi-Ranua_Haasionmaa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ranua_Haasionmaa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ranua_Haasionmaa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ranua_Leppiaho dvb-apps/util/scan/dvb-t/fi-Ranua_Leppiaho ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ranua_Leppiaho 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ranua_Leppiaho 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rautavaara_Angervikko dvb-apps/util/scan/dvb-t/fi-Rautavaara_Angervikko ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rautavaara_Angervikko 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Rautavaara_Angervikko 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rautjarvi_Simpele dvb-apps/util/scan/dvb-t/fi-Rautjarvi_Simpele ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rautjarvi_Simpele 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Rautjarvi_Simpele 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ristijarvi dvb-apps/util/scan/dvb-t/fi-Ristijarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ristijarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ristijarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi dvb-apps/util/scan/dvb-t/fi-Rovaniemi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Ala-Nampa_Yli-Nampa_Rantalaki dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Ala-Nampa_Yli-Nampa_Rantalaki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Ala-Nampa_Yli-Nampa_Rantalaki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Ala-Nampa_Yli-Nampa_Rantalaki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Kaihuanvaara dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Kaihuanvaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Kaihuanvaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Kaihuanvaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Karhuvaara_Marrasjarvi dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Karhuvaara_Marrasjarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Karhuvaara_Marrasjarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Karhuvaara_Marrasjarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Marasenkallio dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Marasenkallio ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Marasenkallio 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Marasenkallio 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Meltaus_Sorviselka dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Meltaus_Sorviselka ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Meltaus_Sorviselka 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Meltaus_Sorviselka 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Sonka dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Sonka ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Sonka 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Sonka 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ruka dvb-apps/util/scan/dvb-t/fi-Ruka ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ruka 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ruka 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ruovesi_Storminiemi dvb-apps/util/scan/dvb-t/fi-Ruovesi_Storminiemi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ruovesi_Storminiemi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ruovesi_Storminiemi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi dvb-apps/util/scan/dvb-t/fi-Saarijarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Saarijarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi_Kalmari dvb-apps/util/scan/dvb-t/fi-Saarijarvi_Kalmari ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi_Kalmari 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Saarijarvi_Kalmari 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi_Mahlu dvb-apps/util/scan/dvb-t/fi-Saarijarvi_Mahlu ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi_Mahlu 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Saarijarvi_Mahlu 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Hirvasvaara dvb-apps/util/scan/dvb-t/fi-Salla_Hirvasvaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Hirvasvaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Salla_Hirvasvaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Ihistysjanka dvb-apps/util/scan/dvb-t/fi-Salla_Ihistysjanka ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Ihistysjanka 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Salla_Ihistysjanka 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Naruska dvb-apps/util/scan/dvb-t/fi-Salla_Naruska ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Naruska 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Salla_Naruska 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Sallatunturi dvb-apps/util/scan/dvb-t/fi-Salla_Sallatunturi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Sallatunturi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Salla_Sallatunturi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Sarivaara dvb-apps/util/scan/dvb-t/fi-Salla_Sarivaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Sarivaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Salla_Sarivaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salo_Isokyla dvb-apps/util/scan/dvb-t/fi-Salo_Isokyla ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salo_Isokyla 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Salo_Isokyla 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Savukoski_Martti_Haarahonganmaa dvb-apps/util/scan/dvb-t/fi-Savukoski_Martti_Haarahonganmaa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Savukoski_Martti_Haarahonganmaa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Savukoski_Martti_Haarahonganmaa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Savukoski_Tanhua dvb-apps/util/scan/dvb-t/fi-Savukoski_Tanhua ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Savukoski_Tanhua 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Savukoski_Tanhua 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Siilinjarvi dvb-apps/util/scan/dvb-t/fi-Siilinjarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Siilinjarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Siilinjarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sipoo_Norrkulla dvb-apps/util/scan/dvb-t/fi-Sipoo_Norrkulla ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sipoo_Norrkulla 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Sipoo_Norrkulla 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sodankyla_Pittiovaara dvb-apps/util/scan/dvb-t/fi-Sodankyla_Pittiovaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sodankyla_Pittiovaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Sodankyla_Pittiovaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sulkava_Vaatalanmaki dvb-apps/util/scan/dvb-t/fi-Sulkava_Vaatalanmaki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sulkava_Vaatalanmaki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Sulkava_Vaatalanmaki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Suomussalmi_Myllylahti dvb-apps/util/scan/dvb-t/fi-Suomussalmi_Myllylahti ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Suomussalmi_Myllylahti 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Suomussalmi_Myllylahti 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sysma_Liikola dvb-apps/util/scan/dvb-t/fi-Sysma_Liikola ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sysma_Liikola 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Sysma_Liikola 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Taivalkoski dvb-apps/util/scan/dvb-t/fi-Taivalkoski ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Taivalkoski 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Taivalkoski 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Taivalkoski_Taivalvaara dvb-apps/util/scan/dvb-t/fi-Taivalkoski_Taivalvaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Taivalkoski_Taivalvaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Taivalkoski_Taivalvaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tammela dvb-apps/util/scan/dvb-t/fi-Tammela ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tammela 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Tammela 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tammisaari dvb-apps/util/scan/dvb-t/fi-Tammisaari ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tammisaari 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Tammisaari 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tampere dvb-apps/util/scan/dvb-t/fi-Tampere ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tampere 2004-01-19 18:10:16.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Tampere 2009-06-21 13:29:06.000000000 +0200 -@@ -1,6 +1,6 @@ --# Tampere DVB-T (Digita Finland) -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy - T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE - T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE - T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -- -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tampere_Pyynikki dvb-apps/util/scan/dvb-t/fi-Tampere_Pyynikki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tampere_Pyynikki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Tampere_Pyynikki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tervola dvb-apps/util/scan/dvb-t/fi-Tervola ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tervola 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Tervola 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Turku dvb-apps/util/scan/dvb-t/fi-Turku ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Turku 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Turku 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,6 @@ --# Turku A-mux (Digita Finland) -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy - T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki dvb-apps/util/scan/dvb-t/fi-Utsjoki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Utsjoki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuorgam_Njallavaara dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuorgam_Njallavaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuorgam_Njallavaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuorgam_Njallavaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuorgam_raja dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuorgam_raja ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuorgam_raja 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuorgam_raja 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuvvus dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuvvus ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuvvus 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuvvus 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Outakoski dvb-apps/util/scan/dvb-t/fi-Utsjoki_Outakoski ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Outakoski 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Outakoski 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Polvarniemi dvb-apps/util/scan/dvb-t/fi-Utsjoki_Polvarniemi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Polvarniemi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Polvarniemi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Rovisuvanto dvb-apps/util/scan/dvb-t/fi-Utsjoki_Rovisuvanto ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Rovisuvanto 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Rovisuvanto 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Tenola dvb-apps/util/scan/dvb-t/fi-Utsjoki_Tenola ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Tenola 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Tenola 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Uusikaupunki_Orivo dvb-apps/util/scan/dvb-t/fi-Uusikaupunki_Orivo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Uusikaupunki_Orivo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Uusikaupunki_Orivo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vaala dvb-apps/util/scan/dvb-t/fi-Vaala ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vaala 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Vaala 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vaasa dvb-apps/util/scan/dvb-t/fi-Vaasa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vaasa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Vaasa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Valtimo dvb-apps/util/scan/dvb-t/fi-Valtimo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Valtimo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Valtimo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Jyranvuori dvb-apps/util/scan/dvb-t/fi-Vammala_Jyranvuori ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Jyranvuori 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Vammala_Jyranvuori 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Roismala dvb-apps/util/scan/dvb-t/fi-Vammala_Roismala ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Roismala 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Vammala_Roismala 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Savi dvb-apps/util/scan/dvb-t/fi-Vammala_Savi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Savi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Vammala_Savi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vantaa_Hakunila dvb-apps/util/scan/dvb-t/fi-Vantaa_Hakunila ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vantaa_Hakunila 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Vantaa_Hakunila 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Varpaisjarvi_Honkamaki dvb-apps/util/scan/dvb-t/fi-Varpaisjarvi_Honkamaki ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Varpaisjarvi_Honkamaki 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Varpaisjarvi_Honkamaki 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Virrat_Lappavuori dvb-apps/util/scan/dvb-t/fi-Virrat_Lappavuori ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Virrat_Lappavuori 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Virrat_Lappavuori 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vuokatti dvb-apps/util/scan/dvb-t/fi-Vuokatti ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vuokatti 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Vuokatti 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vuotso dvb-apps/util/scan/dvb-t/fi-Vuotso ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vuotso 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Vuotso 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ylitornio_Ainiovaara dvb-apps/util/scan/dvb-t/fi-Ylitornio_Ainiovaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ylitornio_Ainiovaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ylitornio_Ainiovaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ylitornio_Raanujarvi dvb-apps/util/scan/dvb-t/fi-Ylitornio_Raanujarvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ylitornio_Raanujarvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Ylitornio_Raanujarvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Yllas dvb-apps/util/scan/dvb-t/fi-Yllas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Yllas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fi-Yllas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Abbeville dvb-apps/util/scan/dvb-t/fr-Abbeville ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Abbeville 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Abbeville 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Abbeville - France (DVB-T transmitter of Abbeville ( LaMotte ) ) -+# Abbeville - France (signal DVB-T transmis depuis l'émetteur de LaMotte ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Abbeville - LaMotte #### -+#R1 -+T 506000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Agen dvb-apps/util/scan/dvb-t/fr-Agen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Agen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Agen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Agen - France (DVB-T transmitter of Agen ( Agglomération ) ) -+# Agen - France (signal DVB-T transmis depuis l'émetteur de Agglomération ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Agen - Agglomération #### -+#R1 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ajaccio dvb-apps/util/scan/dvb-t/fr-Ajaccio ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ajaccio 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Ajaccio 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Ajaccio - France (DVB-T transmitter of Ajaccio ( Baied'Ajaccio ) ) -+# Ajaccio - France (signal DVB-T transmis depuis l'émetteur de Baied'Ajaccio ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Ajaccio - Baied'Ajaccio #### -+#R1 -+T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Albi dvb-apps/util/scan/dvb-t/fr-Albi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Albi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Albi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Albi - France (DVB-T transmitter of Albi ( Agglomération ) ) -+# Albi - France (signal DVB-T transmis depuis l'émetteur de Agglomération ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Albi - Agglomération #### -+#R1 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 818000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Alençon dvb-apps/util/scan/dvb-t/fr-Alençon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Alençon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Alençon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Alençon - France (DVB-T transmitter of Alençon ( Montsd'Amain ) ) -+# Alençon - France (signal DVB-T transmis depuis l'émetteur de Montsd'Amain ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Alençon - Montsd'Amain #### -+#R1 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 826000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ales dvb-apps/util/scan/dvb-t/fr-Ales ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ales 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Ales 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Alès - France (DVB-T transmitter of Alès ( Agglomération ) ) -+# Alès - France (signal DVB-T transmis depuis l'émetteur de Agglomération ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Alès - Agglomération #### -+#R1 -+T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ales-Bouquet dvb-apps/util/scan/dvb-t/fr-Ales-Bouquet ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ales-Bouquet 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Ales-Bouquet 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Alès - France (DVB-T transmitter of Alès ( MontBouquet ) ) -+# Alès - France (signal DVB-T transmis depuis l'émetteur de MontBouquet ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Alès - MontBouquet #### -+#R1 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Amiens dvb-apps/util/scan/dvb-t/fr-Amiens ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Amiens 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Amiens 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Amiens - France (DVB-T transmitter of Amiens ( LesSaintJust ) ) -+# Amiens - France (signal DVB-T transmis depuis l'émetteur de LesSaintJust ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Amiens - LesSaintJust #### -+#R1 -+T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Angers dvb-apps/util/scan/dvb-t/fr-Angers ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Angers 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Angers 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Angers - France (DVB-T transmitter of Angers ( RochefortsurLoire ) ) -+# Angers - France (signal DVB-T transmis depuis l'émetteur de RochefortsurLoire ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Angers - RochefortsurLoire #### -+#R1 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Annecy dvb-apps/util/scan/dvb-t/fr-Annecy ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Annecy 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Annecy 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Annecy - France (DVB-T transmitter of Annecy ( Agglomération ) ) -+# Annecy - France (signal DVB-T transmis depuis l'émetteur de Agglomération ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Annecy - Agglomération #### -+#R1 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 482000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 530000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 506000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 834000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Arcachon dvb-apps/util/scan/dvb-t/fr-Arcachon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Arcachon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Arcachon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Arcachon - France (DVB-T transmitter of Arcachon ( Agglomération ) ) -+# Arcachon - France (signal DVB-T transmis depuis l'émetteur de Agglomération ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Arcachon - Agglomération #### -+#R1 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Argenton dvb-apps/util/scan/dvb-t/fr-Argenton ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Argenton 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Argenton 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Argenton - France (DVB-T transmitter of Argenton ( Malicornay ) ) -+# Argenton - France (signal DVB-T transmis depuis l'émetteur de Malicornay ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Argenton - Malicornay #### -+#R1 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Aubenas dvb-apps/util/scan/dvb-t/fr-Aubenas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Aubenas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Aubenas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Aubenas - France (DVB-T transmitter of Aubenas ( Nord ) ) -+# Aubenas - France (signal DVB-T transmis depuis l'émetteur de Nord ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Aubenas - Nord #### -+#R1 -+T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Aurillac dvb-apps/util/scan/dvb-t/fr-Aurillac ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Aurillac 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Aurillac 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Aurillac - France (DVB-T transmitter of Aurillac ( Agglomération ) ) -+# Aurillac - France (signal DVB-T transmis depuis l'émetteur de Agglomération ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Aurillac - Agglomération #### -+#R1 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Autun dvb-apps/util/scan/dvb-t/fr-Autun ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Autun 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Autun 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Autun - France (DVB-T transmitter of Autun ( BoisduRoi ) ) -+# Autun - France (signal DVB-T transmis depuis l'émetteur de BoisduRoi ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Autun - BoisduRoi #### -+#R1 -+T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 834000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 850000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Auxerre dvb-apps/util/scan/dvb-t/fr-Auxerre ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Auxerre 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Auxerre 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Auxerre - France (DVB-T transmitter of Auxerre ( Molesmes ) ) -+# Auxerre - France (signal DVB-T transmis depuis l'émetteur de Molesmes ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Auxerre - Molesmes #### -+#R1 -+T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Avignon dvb-apps/util/scan/dvb-t/fr-Avignon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Avignon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Avignon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Avignon - France (DVB-T transmitter of Avignon ( MontVentoux ) ) -+# Avignon - France (signal DVB-T transmis depuis l'émetteur de MontVentoux ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Avignon - MontVentoux #### -+#R1 -+T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-BarleDuc dvb-apps/util/scan/dvb-t/fr-BarleDuc ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-BarleDuc 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-BarleDuc 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# BarleDuc - France (DVB-T transmitter of BarleDuc ( Willeroncourt ) ) -+# BarleDuc - France (signal DVB-T transmis depuis l'émetteur de Willeroncourt ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### BarleDuc - Willeroncourt #### -+#R1 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bastia dvb-apps/util/scan/dvb-t/fr-Bastia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bastia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Bastia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Bastia - France (DVB-T transmitter of Bastia ( SerradiPigno ) ) -+# Bastia - France (signal DVB-T transmis depuis l'émetteur de SerradiPigno ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Bastia - SerradiPigno #### -+#R1 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bayonne dvb-apps/util/scan/dvb-t/fr-Bayonne ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bayonne 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Bayonne 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Bayonne - France (DVB-T transmitter of Bayonne ( LaRhune ) ) -+# Bayonne - France (signal DVB-T transmis depuis l'émetteur de LaRhune ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Bayonne - LaRhune #### -+#R1 -+T 826000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bergerac dvb-apps/util/scan/dvb-t/fr-Bergerac ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bergerac 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Bergerac 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Bergerac - France (DVB-T transmitter of Bergerac ( Audrix ) ) -+# Bergerac - France (signal DVB-T transmis depuis l'émetteur de Audrix ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Bergerac - Audrix #### -+#R1 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 482000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Besançon dvb-apps/util/scan/dvb-t/fr-Besançon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Besançon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Besançon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Besançon - France (DVB-T transmitter of Besançon ( Brégille ) ) -+# Besançon - France (signal DVB-T transmis depuis l'émetteur de Brégille ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Besançon - Brégille #### -+#R1 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux dvb-apps/util/scan/dvb-t/fr-Bordeaux ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Bordeaux 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# Bordeaux - France (DVB-T transmitter of Bouliac or Cauderan) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux-Bouliac dvb-apps/util/scan/dvb-t/fr-Bordeaux-Bouliac ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux-Bouliac 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Bordeaux-Bouliac 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Bordeaux - France (DVB-T transmitter of Bordeaux ( BordeauxEst ) ) -+# Bordeaux - France (signal DVB-T transmis depuis l'émetteur de BordeauxEst ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Bordeaux - BordeauxEst #### -+#R1 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux-Cauderan dvb-apps/util/scan/dvb-t/fr-Bordeaux-Cauderan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux-Cauderan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Bordeaux-Cauderan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Bordeaux - France (DVB-T transmitter of Bordeaux ( Caudéran ) ) -+# Bordeaux - France (signal DVB-T transmis depuis l'émetteur de Caudéran ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Bordeaux - Caudéran #### -+#R1 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 482000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Boulogne dvb-apps/util/scan/dvb-t/fr-Boulogne ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Boulogne 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Boulogne 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Boulogne - France (DVB-T transmitter of Boulogne ( MontLambert ) ) -+# Boulogne - France (signal DVB-T transmis depuis l'émetteur de MontLambert ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Boulogne - MontLambert #### -+#R1 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bourges dvb-apps/util/scan/dvb-t/fr-Bourges ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bourges 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Bourges 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Bourges - France (DVB-T transmitter of Bourges ( CollinesduSancerrois ) ) -+# Bourges - France (signal DVB-T transmis depuis l'émetteur de CollinesduSancerrois ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Bourges - CollinesduSancerrois #### -+#R1 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Brest dvb-apps/util/scan/dvb-t/fr-Brest ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Brest 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Brest 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# Brest - France -+# Emetteur du Roch Tredudon -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 482000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 506000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 490000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 530000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 514000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Brive dvb-apps/util/scan/dvb-t/fr-Brive ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Brive 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Brive 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Brive - France (DVB-T transmitter of Brive ( Lissac ) ) -+# Brive - France (signal DVB-T transmis depuis l'émetteur de Lissac ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Brive - Lissac #### -+#R1 -+T 530000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Caen dvb-apps/util/scan/dvb-t/fr-Caen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Caen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Caen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Caen - France (DVB-T transmitter of Caen ( CaenNord ) ) -+# Caen - France (signal DVB-T transmis depuis l'émetteur de CaenNord ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Caen - CaenNord #### -+#R1 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Caen-Pincon dvb-apps/util/scan/dvb-t/fr-Caen-Pincon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Caen-Pincon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Caen-Pincon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Caen - France (DVB-T transmitter of Caen ( MontPinçon ) ) -+# Caen - France (signal DVB-T transmis depuis l'émetteur de MontPinçon ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Caen - MontPinçon #### -+#R1 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cannes dvb-apps/util/scan/dvb-t/fr-Cannes ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cannes 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Cannes 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Cannes - France (DVB-T transmitter of Cannes ( Vallauris ) ) -+# Cannes - France (signal DVB-T transmis depuis l'émetteur de Vallauris ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Cannes - Vallauris #### -+#R1 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Carcassonne dvb-apps/util/scan/dvb-t/fr-Carcassonne ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Carcassonne 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Carcassonne 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Carcassonne - France (DVB-T transmitter of Carcassonne ( MontagneNoire ) ) -+# Carcassonne - France (signal DVB-T transmis depuis l'émetteur de MontagneNoire ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Carcassonne - MontagneNoire #### -+#R1 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chambery dvb-apps/util/scan/dvb-t/fr-Chambery ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chambery 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Chambery 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Chambéry - France (DVB-T transmitter of Chambéry ( Nondéfini ) ) -+# Chambéry - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Chambéry - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Chambéry n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chartres dvb-apps/util/scan/dvb-t/fr-Chartres ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chartres 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Chartres 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Chartres - France (DVB-T transmitter of Chartres ( Montlandon ) ) -+# Chartres - France (signal DVB-T transmis depuis l'émetteur de Montlandon ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Chartres - Montlandon #### -+#R1 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chennevieres dvb-apps/util/scan/dvb-t/fr-Chennevieres ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chennevieres 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Chennevieres 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# ParisEst - France (DVB-T transmitter of ParisEst ( Chennevières ) ) -+# ParisEst - France (signal DVB-T transmis depuis l'émetteur de Chennevières ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### ParisEst - Chennevières #### -+#R1 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cherbourg dvb-apps/util/scan/dvb-t/fr-Cherbourg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cherbourg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Cherbourg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Cherbourg - France (DVB-T transmitter of Cherbourg ( Digosville ) ) -+# Cherbourg - France (signal DVB-T transmis depuis l'émetteur de Digosville ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Cherbourg - Digosville #### -+#R1 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-ClermontFerrand dvb-apps/util/scan/dvb-t/fr-ClermontFerrand ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-ClermontFerrand 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-ClermontFerrand 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Clermont-Ferrand - France (DVB-T transmitter of Clermont-Ferrand ( PuydeDôme ) ) -+# Clermont-Ferrand - France (signal DVB-T transmis depuis l'émetteur de PuydeDôme ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Clermont-Ferrand - PuydeDôme #### -+#R1 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cluses dvb-apps/util/scan/dvb-t/fr-Cluses ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cluses 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Cluses 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,23 @@ -+# Cluses - France (DVB-T transmitter of Cluses ( St Sigismond ) ) -+# Cluses - France (signal DVB-T transmis depuis l'émetteur de St Sigismond ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Cluses - Nondéfini #### -+#R1 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dieppe dvb-apps/util/scan/dvb-t/fr-Dieppe ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dieppe 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Dieppe 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Dieppe - France (DVB-T transmitter of Dieppe ( Neuville ) ) -+# Dieppe - France (signal DVB-T transmis depuis l'émetteur de Neuville ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Dieppe - Neuville #### -+#R1 -+T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dijon dvb-apps/util/scan/dvb-t/fr-Dijon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dijon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Dijon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,28 @@ -+# Dijon - France (DVB-T transmitter of Dijon ( Nuit Saint Georges ) ) -+# Dijon - France (signal DVB-T transmis depuis l'émetteur de Nuit Saint Georges ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# Fichier mis à jour par Maxence Antonczyk -+# le Dimanche 7 Septembre 2008, à 13h00 -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Dijon - Nuit Saint Georges #### -+#R1 (France 2,France 3,France 5,Arte,LCP/Public Sénat, Chaîne Locale) -+T 506000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 (I-Télé,BFM TV,Direct 8,Gulli,Virgin 17,France 4) -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 (Canal+,Canal+ Cinéma,Canal+ Sport,Planète,Canal J,TPS Star) -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 (M6,W9,NT1,TF6,Paris Première, AB1) -+T 834000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 (TF1,TNC,NRJ 12,LCI,Eurosport France) -+T 530000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dunkerque dvb-apps/util/scan/dvb-t/fr-Dunkerque ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dunkerque 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Dunkerque 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Dunkerque - France (DVB-T transmitter of Dunkerque ( Nondéfini ) ) -+# Dunkerque - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Dunkerque - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Dunkerque n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Epinal dvb-apps/util/scan/dvb-t/fr-Epinal ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Epinal 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Epinal 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Epinal - France (DVB-T transmitter of Epinal ( BoisdelaVierge ) ) -+# Epinal - France (signal DVB-T transmis depuis l'émetteur de BoisdelaVierge ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Epinal - BoisdelaVierge #### -+#R1 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Evreux dvb-apps/util/scan/dvb-t/fr-Evreux ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Evreux 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Evreux 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Evreux - France (DVB-T transmitter of Evreux ( Netreville ) ) -+# Evreux - France (signal DVB-T transmis depuis l'émetteur de Netreville ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Evreux - Netreville #### -+#R1 -+T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Forbach dvb-apps/util/scan/dvb-t/fr-Forbach ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Forbach 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Forbach 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Forbach - France (DVB-T transmitter of Forbach ( Nondéfini ) ) -+# Forbach - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Forbach - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Forbach n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Gex dvb-apps/util/scan/dvb-t/fr-Gex ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Gex 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Gex 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Gex - France (DVB-T transmitter of Gex ( Nondéfini ) ) -+# Gex - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Gex - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Gex n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Grenoble dvb-apps/util/scan/dvb-t/fr-Grenoble ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Grenoble 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Grenoble 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Grenoble - France (DVB-T transmitter of Grenoble ( ToursansVenin ) ) -+# Grenoble - France (signal DVB-T transmis depuis l'émetteur de ToursansVenin ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Grenoble - ToursansVenin #### -+#R1 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 474000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Gueret dvb-apps/util/scan/dvb-t/fr-Gueret ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Gueret 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Gueret 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Guéret - France (DVB-T transmitter of Guéret ( StLégerleGueretois ) ) -+# Guéret - France (signal DVB-T transmis depuis l'émetteur de StLégerleGueretois ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Guéret - StLégerleGueretois #### -+#R1 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Hirson dvb-apps/util/scan/dvb-t/fr-Hirson ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Hirson 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Hirson 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Hirson - France (DVB-T transmitter of Hirson ( Nondéfini ) ) -+# Hirson - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Hirson - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Hirson n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Hyeres dvb-apps/util/scan/dvb-t/fr-Hyeres ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Hyeres 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Hyeres 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Hyères - France (DVB-T transmitter of Hyères ( CapBenat ) ) -+# Hyères - France (signal DVB-T transmis depuis l'émetteur de CapBenat ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Hyères - CapBenat #### -+#R1 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LaRochelle dvb-apps/util/scan/dvb-t/fr-LaRochelle ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LaRochelle 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-LaRochelle 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Rochelle(La) - France (DVB-T transmitter of Rochelle(La) ( Mireuil ) ) -+# Rochelle(La) - France (signal DVB-T transmis depuis l'émetteur de Mireuil ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Rochelle(La) - Mireuil #### -+#R1 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Laval dvb-apps/util/scan/dvb-t/fr-Laval ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Laval 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Laval 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Laval - France (DVB-T transmitter of Laval ( MontRochard ) ) -+# Laval - France (signal DVB-T transmis depuis l'émetteur de MontRochard ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Laval - MontRochard #### -+#R1 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeCreusot dvb-apps/util/scan/dvb-t/fr-LeCreusot ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeCreusot 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-LeCreusot 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Creusot(Le) - France (DVB-T transmitter of Creusot(Le) ( MontStVincent ) ) -+# Creusot(Le) - France (signal DVB-T transmis depuis l'émetteur de MontStVincent ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Creusot(Le) - MontStVincent #### -+#R1 -+T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 818000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeHavre dvb-apps/util/scan/dvb-t/fr-LeHavre ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeHavre 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-LeHavre 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Havre(Le) - France (DVB-T transmitter of Havre(Le) ( Harfleur ) ) -+# Havre(Le) - France (signal DVB-T transmis depuis l'émetteur de Harfleur ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Havre(Le) - Harfleur #### -+#R1 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeMans dvb-apps/util/scan/dvb-t/fr-LeMans ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeMans 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-LeMans 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,21 @@ -+# Le Mans - France (DVB-T transmitter of Mayet) -+# Le Mans - France (signal DVB-T transmis depuis l'émetteur de Mayet ) -+# Pour plus d'informations vous pouvez consulter : -+# - le topic sur l'émetteur de Mayet sur le forum du site tvnt.net : -+# http://www.tvnt.net/forum/viewtopic.php?t=48 -+# - le site de TDF : http://tnt.niv2.com/72100-LE-MANS.html -+# contact : Matthieu Duchemin -+ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# R1 : Canal 26 -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R2 : Canal 23 -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R3 : Canal 56 -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R4 : Canal 31 -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R5 : Canal 37 -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R6 : Canal 36 -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LePuyEnVelay dvb-apps/util/scan/dvb-t/fr-LePuyEnVelay ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LePuyEnVelay 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-LePuyEnVelay 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# PuyenVelay(Le) - France (DVB-T transmitter of PuyenVelay(Le) ( Agglomération ) ) -+# PuyenVelay(Le) - France (signal DVB-T transmis depuis l'émetteur de Agglomération ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### PuyenVelay(Le) - Agglomération #### -+#R1 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lille dvb-apps/util/scan/dvb-t/fr-Lille ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lille 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Lille 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Lille - France (DVB-T transmitter of Lille ( Nondéfini ) ) -+# Lille - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Lille - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Lille n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lille-Lambersart dvb-apps/util/scan/dvb-t/fr-Lille-Lambersart ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lille-Lambersart 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Lille-Lambersart 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Lille - France (DVB-T transmitter of Lille ( Lambersart ) ) -+# Lille - France (signal DVB-T transmis depuis l'émetteur de Lambersart ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Lille - Lambersart #### -+#R1 -+T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LilleT2 dvb-apps/util/scan/dvb-t/fr-LilleT2 ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LilleT2 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-LilleT2 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,13 @@ -+# Lille - France (DVB-T transmitter of Lambersart) -+#offset of 167000 for Cinergy T2. Other type of card users need to replace 167 by 000 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#R2 -+T 538167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R4 -+T 546167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R3 -+T 562167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R6 -+T 586167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R1 -+T 594167000 8MHz 3/4 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Limoges dvb-apps/util/scan/dvb-t/fr-Limoges ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Limoges 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Limoges 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Limoges - France (DVB-T transmitter of Limoges ( Agglomération ) ) -+# Limoges - France (signal DVB-T transmis depuis l'émetteur de Agglomération ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Limoges - Agglomération #### -+#R1 -+T 826000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Longwy dvb-apps/util/scan/dvb-t/fr-Longwy ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Longwy 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Longwy 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Longwy - France (DVB-T transmitter of Longwy ( Nondéfini ) ) -+# Longwy - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Longwy - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Longwy n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lorient dvb-apps/util/scan/dvb-t/fr-Lorient ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lorient 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Lorient 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Lorient - France (DVB-T transmitter of Lorient ( Ploemer ) ) -+# Lorient - France (signal DVB-T transmis depuis l'émetteur de Ploemer ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Lorient - Ploemer #### -+#R1 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 818000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lyon-Fourviere dvb-apps/util/scan/dvb-t/fr-Lyon-Fourviere ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lyon-Fourviere 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Lyon-Fourviere 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# Lyon - France (DVB-T transmitter of Fourvière) -+# Lyon - France (signal DVB-T transmis depuis l'émetteur de Fourvière) -+# see : http://tnt.niv2.com/69000-LYON.html -+# contact : Nicolas Estre -+ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# R1 : Canal 56 -+T 754167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R2 : Canal 36 -+T 594167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R3 : Canal 21 -+T 474167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R4 : Canal 54 -+T 738167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R5 : Canal 27 -+T 522167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R6 : Canal 24 -+T 498167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lyon-Pilat dvb-apps/util/scan/dvb-t/fr-Lyon-Pilat ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lyon-Pilat 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Lyon-Pilat 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,17 @@ -+# Lyon - France (DVB-T transmitter of Mt Pilat) -+# Lyon - France (signal DVB-T transmis depuis l'émetteur du Mont Pilat) -+# see : http://tnt.niv2.com/69000-LYON.html -+# contact : Nicolas Estre -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# R1 : Canal 45 -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R2 : Canal 36 -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R3 : Canal 39 -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R4 : Canal 54 -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R5 : Canal 42 -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# R6 : Canal 47 -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Macon dvb-apps/util/scan/dvb-t/fr-Macon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Macon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Macon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Mâcon - France (DVB-T transmitter of Mâcon ( Nondéfini ) ) -+# Mâcon - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Mâcon - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Mâcon n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mantes dvb-apps/util/scan/dvb-t/fr-Mantes ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mantes 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Mantes 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Mantes - France (DVB-T transmitter of Mantes ( MaudétourenVexin ) ) -+# Mantes - France (signal DVB-T transmis depuis l'émetteur de MaudétourenVexin ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Mantes - MaudétourenVexin #### -+#R1 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Marseille dvb-apps/util/scan/dvb-t/fr-Marseille ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Marseille 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Marseille 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Maubeuge dvb-apps/util/scan/dvb-t/fr-Maubeuge ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Maubeuge 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Maubeuge 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Maubeuge - France (DVB-T transmitter of Maubeuge ( Nondéfini ) ) -+# Maubeuge - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Maubeuge - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Maubeuge n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Meaux dvb-apps/util/scan/dvb-t/fr-Meaux ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Meaux 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Meaux 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Meaux - France (DVB-T transmitter of Meaux ( Mareuil ) ) -+# Meaux - France (signal DVB-T transmis depuis l'émetteur de Mareuil ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Meaux - Mareuil #### -+#R1 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 818000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mende dvb-apps/util/scan/dvb-t/fr-Mende ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mende 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Mende 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Mende - France (DVB-T transmitter of Mende ( TrucdeFortunio ) ) -+# Mende - France (signal DVB-T transmis depuis l'émetteur de TrucdeFortunio ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Mende - TrucdeFortunio #### -+#R1 -+T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 474000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Menton dvb-apps/util/scan/dvb-t/fr-Menton ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Menton 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Menton 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Menton - France (DVB-T transmitter of Menton ( CapMartin ) ) -+# Menton - France (signal DVB-T transmis depuis l'émetteur de CapMartin ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Menton - CapMartin #### -+#R1 -+T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 842000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Metz dvb-apps/util/scan/dvb-t/fr-Metz ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Metz 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Metz 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Metz - France (DVB-T transmitter of Metz ( Nondéfini ) ) -+# Metz - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Metz - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Metz n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mezieres dvb-apps/util/scan/dvb-t/fr-Mezieres ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mezieres 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Mezieres 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Mézières - France (DVB-T transmitter of Mézières ( Nondéfini ) ) -+# Mézières - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Mézières - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Mézières n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montbeliard dvb-apps/util/scan/dvb-t/fr-Montbeliard ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montbeliard 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Montbeliard 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# Montbéliard - France (DVB-T transmitter of Montbéliard "Fort Lachaux" ) -+# Montbéliard - France (signal DVB-T transmis depuis l'émetteur de Fort Lachaux ) -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# multiplex R1 (GR1), canal 29V + offset 167000 : FRANCE 2 SD , FRANCE 5 , ARTE SD , La Chaîne Parlementaire/Public Sénat , FRANCE 3 , FRANCE 3 Franche-Comté -+T 538167000 8MHz AUTO NONE QAM64 8k AUTO NONE -+# multiplex R3 (CNH), canal 43V + offset 167000 : CANAL+ , CANAL+HD , CANAL+ CINEMA , CANAL+ SPORT , PLANETE , CANAL J et TPS STAR -+T 650167000 8MHz AUTO NONE QAM64 8k AUTO NONE -+# multiplex R2 (NTN), canal 55V + offset 167000 : DIRECT 8 , BFM TV , I>TELE , FRANCE 4 , VIRGIN 17 , GULLI et France 4 -+T 746167000 8MHz AUTO NONE QAM64 8k AUTO NONE -+# multiplex R6 (SMR6), canal 32V + offset 167000 : TF1 SD , NRJ 12 , TMC , EUROSPORT , LCI et TF6 -+T 562167000 8MHz AUTO NONE QAM64 8k AUTO NONE -+# Télévision Suisse, canal 56V + offset 000000 : TSR1 , TSR2 , TSI1 et SF 1 -+T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+# multiplex R4 (MULTI4), canal 58V + offset 167000 : ARTE HD , PARIS PREMIERE, M6 SD , W9 , NT1 -+T 770167000 8MHz AUTO NONE QAM64 8k AUTO NONE -+# multiplex R5 (???), canal ??? : TF1 HD , FRANCE 2 HD, M6 HD -+# canal d'émission pas encore défini (février 2009) -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montlucon dvb-apps/util/scan/dvb-t/fr-Montlucon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montlucon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Montlucon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Montluçon - France (DVB-T transmitter of Montluçon ( Agglomération ) ) -+# Montluçon - France (signal DVB-T transmis depuis l'émetteur de Agglomération ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Montluçon - Agglomération #### -+#R1 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 826000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montpellier dvb-apps/util/scan/dvb-t/fr-Montpellier ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montpellier 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Montpellier 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Montpellier - France (DVB-T transmitter of Montpellier ( SaintBaudille ) ) -+# Montpellier - France (signal DVB-T transmis depuis l'émetteur de SaintBaudille ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Montpellier - SaintBaudille #### -+#R1 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mulhouse dvb-apps/util/scan/dvb-t/fr-Mulhouse ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mulhouse 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Mulhouse 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,26 @@ -+# Mulhouse - France (DVB-T transmitter of Mulhouse ( Belvédère ) ) -+# Mulhouse - France (signal DVB-T transmis depuis l'émetteur du Belvédère ) -+# -+# Fichier réalisé par : -+# IUT COLMAR DEPARTEMENT RESEAUX ET TELECOMMUNICATIONS -+# Novembre 2007 -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+# R1 - ch 53 : France 2, 3 (Alsace), 5, LCP et Arte (France) -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+ -+# R2 - ch 55 : I-TELE, BFM TV, Direct 8, Gulli, Virgin 17 (ex-Europe 2 TV) et France 4 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+ -+# R3 - ch 54 : TV payante : CANAL+, CANAL+ CINEMA, CANAL+ SPORT, PLANETE, CANAL J et TPS STAR -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+ -+# R4 - ch 37 : M6, W9 et NT1 + TV payante : PARIS PREMIERE, TF6 et AB1 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+ -+# R5 -+# ch 66, candidat a la TVHD -+ -+# R6 - ch 65 : TF 1, NRJ 12 et TMC + TV payante : Eurosport France et LCI -+T 826000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nancy dvb-apps/util/scan/dvb-t/fr-Nancy ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nancy 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Nancy 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Nancy - France (DVB-T transmitter of Nancy ( Nondéfini ) ) -+# Nancy - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Nancy - Nondéfini #### -+#R1 -+T 522166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R2 -+T 682166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R3 -+T 794166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R4 -+T 770166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R5 -+T 498166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R6 -+T 826166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nantes dvb-apps/util/scan/dvb-t/fr-Nantes ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nantes 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Nantes 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# Nantes - France -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-NeufchatelEnBray dvb-apps/util/scan/dvb-t/fr-NeufchatelEnBray ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-NeufchatelEnBray 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-NeufchatelEnBray 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Neufchatel-en-Bray - France (DVB-T transmitter of Neufchatel-en-Bray ( Croixdalle ) ) -+# Neufchatel-en-Bray - France (signal DVB-T transmis depuis l'émetteur de Croixdalle ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Neufchatel-en-Bray - Croixdalle #### -+#R1 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nice dvb-apps/util/scan/dvb-t/fr-Nice ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nice 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Nice 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Nice - France (DVB-T transmitter of Nice ( MontAlban ) ) -+# Nice - France (signal DVB-T transmis depuis l'émetteur de MontAlban ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Nice - MontAlban #### -+#R1 -+T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Niort dvb-apps/util/scan/dvb-t/fr-Niort ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Niort 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Niort 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Niort - France (DVB-T transmitter of Niort-Maisonnay) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 602000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 738000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 778000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 802000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Orleans dvb-apps/util/scan/dvb-t/fr-Orleans ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Orleans 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Orleans 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,17 @@ -+# Orléans / France -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# -+# R2: canal 38 : direct8 TMC Gulli europe2 bfm itélé -+T 610166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# R1: canal 46 : F2 F3 F4 F5 arte LCP -+T 674166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# R4: canal 48 : M6 W9 NT1 -+T 690166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# R6: canal 51 : TF1 NRJ12 -+T 714166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# R3: canal 63 : canalplus -+T 810166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Paris dvb-apps/util/scan/dvb-t/fr-Paris ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Paris 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Paris 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+# Paris - France - various DVB-T transmitters -+# contributed by Alexis de Lattre -+# Paris - Tour Eiffel : 21 24 27 29 32 35 -+# Paris Est - Chennevières : 35 51 54 57 60 63 -+# Paris Nord - Sannois : 35 51 54 57 60 63 -+# Paris Sud - Villebon : 35 51 56 57 60 63 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 498166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 522166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 538166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 562166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 586166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE -+T 714166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE -+T 738166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 754166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 762166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 786166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 810166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Parthenay dvb-apps/util/scan/dvb-t/fr-Parthenay ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Parthenay 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Parthenay 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Parthenay - France (DVB-T transmitter of Parthenay ( Amailloux ) ) -+# Parthenay - France (signal DVB-T transmis depuis l'émetteur de Amailloux ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Parthenay - Amailloux #### -+#R1 -+T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Perpignan dvb-apps/util/scan/dvb-t/fr-Perpignan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Perpignan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Perpignan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Perpignan - France (DVB-T transmitter of Perpignan ( PicdeNeulos ) ) -+# Perpignan - France (signal DVB-T transmis depuis l'émetteur de PicdeNeulos ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Perpignan - PicdeNeulos #### -+#R1 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 474000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Poitiers dvb-apps/util/scan/dvb-t/fr-Poitiers ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Poitiers 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Poitiers 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Poitiers - France (DVB-T transmitter of Poitiers ( Agglomération ) ) -+# Poitiers - France (signal DVB-T transmis depuis l'émetteur de Agglomération ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Poitiers - Agglomération #### -+#R1 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Privas dvb-apps/util/scan/dvb-t/fr-Privas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Privas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Privas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Privas - France (DVB-T transmitter of Privas ( Sud ) ) -+# Privas - France (signal DVB-T transmis depuis l'émetteur de Sud ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Privas - Sud #### -+#R1 -+T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Reims dvb-apps/util/scan/dvb-t/fr-Reims ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Reims 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Reims 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Reims - France (DVB-T transmitter of Reims ( Hautvillers ) ) -+# Reims - France (signal DVB-T transmis depuis l'émetteur de Hautvillers ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Reims - Hautvillers #### -+#R1 -+T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Rennes dvb-apps/util/scan/dvb-t/fr-Rennes ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Rennes 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Rennes 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Rennes - France -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 586000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 650000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 674000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -+T 626000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Roanne dvb-apps/util/scan/dvb-t/fr-Roanne ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Roanne 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Roanne 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Roanne - France (DVB-T transmitter of Roanne ( Perreux ) ) -+# Roanne - France (signal DVB-T transmis depuis l'émetteur de Perreux ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Roanne - Perreux #### -+#R1 -+T 474000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Rouen dvb-apps/util/scan/dvb-t/fr-Rouen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Rouen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Rouen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# Rouen - France -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-SaintEtienne dvb-apps/util/scan/dvb-t/fr-SaintEtienne ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-SaintEtienne 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-SaintEtienne 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Saint-Etienne - France (DVB-T transmitter of Saint-Etienne ( CroixduGuisay ) ) -+# Saint-Etienne - France (signal DVB-T transmis depuis l'émetteur de CroixduGuisay ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Saint-Etienne - CroixduGuisay #### -+#R1 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-SaintRaphael dvb-apps/util/scan/dvb-t/fr-SaintRaphael ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-SaintRaphael 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-SaintRaphael 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Saint-Raphaël - France (DVB-T transmitter of Saint-Raphaël ( Picdel'Ours ) ) -+# Saint-Raphaël - France (signal DVB-T transmis depuis l'émetteur de Picdel'Ours ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Saint-Raphaël - Picdel'Ours #### -+#R1 -+T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sannois dvb-apps/util/scan/dvb-t/fr-Sannois ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sannois 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Sannois 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# ParisNord - France (DVB-T transmitter of ParisNord ( Sannois ) ) -+# ParisNord - France (signal DVB-T transmis depuis l'émetteur de Sannois ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### ParisNord - Sannois #### -+#R1 -+T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sarrebourg dvb-apps/util/scan/dvb-t/fr-Sarrebourg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sarrebourg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Sarrebourg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Sarrebourg - France (DVB-T transmitter of Sarrebourg ( Nondéfini ) ) -+# Sarrebourg - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Sarrebourg - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Sarrebourg n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sens dvb-apps/util/scan/dvb-t/fr-Sens ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sens 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Sens 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Sens - France (DVB-T transmitter of Sens ( GisylesNobles ) ) -+# Sens - France (signal DVB-T transmis depuis l'émetteur de GisylesNobles ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Sens - GisylesNobles #### -+#R1 -+T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Strasbourg dvb-apps/util/scan/dvb-t/fr-Strasbourg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Strasbourg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Strasbourg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# Strasbourg - France (DVB-T transmitter of Strasbourg (Nordheim)) -+# contributed by Benjamin Zores -+# -+# Strasbourg - Nordheim: 22 47 48 51 61 69 -+# See http://www.tvnt.net/V2/pages/342/medias/pro-bo-doc-tk-frequences_tnt.pdf -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE -+T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE -+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulon dvb-apps/util/scan/dvb-t/fr-Toulon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Toulon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Toulon - France (DVB-T transmitter of Toulon ( CapSicié ) ) -+# Toulon - France (signal DVB-T transmis depuis l'émetteur de CapSicié ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Toulon - CapSicié #### -+#R1 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulouse dvb-apps/util/scan/dvb-t/fr-Toulouse ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulouse 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Toulouse 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# Toulouse - France (DVB-T transmitter of Bohnoure) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 698167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 722167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 714167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 746167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 730167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulouse-Midi dvb-apps/util/scan/dvb-t/fr-Toulouse-Midi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulouse-Midi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Toulouse-Midi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Toulouse - France (DVB-T transmitter of Toulouse ( PicduMidi ) ) -+# Toulouse - France (signal DVB-T transmis depuis l'émetteur de PicduMidi ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Toulouse - PicduMidi #### -+#R1 -+T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 482000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Tours dvb-apps/util/scan/dvb-t/fr-Tours ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Tours 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Tours 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Tours - France (DVB-T transmitter of Tours ( Chissay ) ) -+# Tours - France (signal DVB-T transmis depuis l'émetteur de Chissay ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Tours - Chissay #### -+#R1 -+T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Troyes dvb-apps/util/scan/dvb-t/fr-Troyes ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Troyes 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Troyes 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Troyes - France (DVB-T transmitter of Troyes ( LesRiceys ) ) -+# Troyes - France (signal DVB-T transmis depuis l'émetteur de LesRiceys ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Troyes - LesRiceys #### -+#R1 -+T 482000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 506000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 530000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ussel dvb-apps/util/scan/dvb-t/fr-Ussel ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ussel 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Ussel 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Ussel - France (DVB-T transmitter of Ussel ( Meymac ) ) -+# Ussel - France (signal DVB-T transmis depuis l'émetteur de Meymac ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Ussel - Meymac #### -+#R1 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Valence dvb-apps/util/scan/dvb-t/fr-Valence ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Valence 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Valence 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Valence - France (DVB-T transmitter of Valence ( StRomaindeLerps ) ) -+# Valence - France (signal DVB-T transmis depuis l'émetteur de StRomaindeLerps ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Valence - StRomaindeLerps #### -+#R1 -+T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Valenciennes dvb-apps/util/scan/dvb-t/fr-Valenciennes ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Valenciennes 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Valenciennes 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Valenciennes - France (DVB-T transmitter of Valenciennes ( Nondéfini ) ) -+# Valenciennes - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Valenciennes - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Valenciennes n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Vannes dvb-apps/util/scan/dvb-t/fr-Vannes ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Vannes 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Vannes 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Vannes / France -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 698167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 762167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 778167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 818167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Villebon dvb-apps/util/scan/dvb-t/fr-Villebon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Villebon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Villebon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,22 @@ -+# Paris - France (DVB-T transmitter of Villebon ) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+# Villebon - France (DVB-T transmitter of Villebon (South of Paris)) -+# Villebon - France (signal DVB-T transmis depuis l'émetteur de Villebon (Sud de Paris)) -+# see : http://tnt.niv2.com/91140-VILLEBON-SUR-YVETTE.html -+# contact : Nicolas Estre -+ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### VILLEBON SUR YVETTE #### -+#R1 35 -+T 586000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE -+#R2 56 -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R3 60 -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R4 63 -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R5 51 -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#R6 57 -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Vittel dvb-apps/util/scan/dvb-t/fr-Vittel ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Vittel 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Vittel 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Vittel - France (DVB-T transmitter of Vittel ( Nondéfini ) ) -+# Vittel - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Vittel - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Vittel n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Voiron dvb-apps/util/scan/dvb-t/fr-Voiron ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Voiron 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/fr-Voiron 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,30 @@ -+# Voiron - France (DVB-T transmitter of Voiron ( Nondéfini ) ) -+# Voiron - France (signal DVB-T transmis depuis l'émetteur de Nondéfini ) -+# -+# ATTENTION ! Ce fichier a ete construit automatiquement a partir -+# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm -+# en Avril 2006. Si vous constatez des problemes et voulez apporter des -+# modifications au fichier, envoyez le fichier modifie a -+# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb) -+# ou a l'auteur du fichier : -+# Nicolas Estre -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#### Voiron - Nondéfini #### -+#R1 -+#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R2 -+#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R3 -+#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R4 -+#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R5 -+#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE -+#R6 -+#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE -+############################################################## -+# en Avril 2006, l'emetteur pour Voiron n'etait pas defini -+# Vous devez donc modifier les frequences manuellement. -+# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus. -+############################################################## -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/gr-Athens dvb-apps/util/scan/dvb-t/gr-Athens ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/gr-Athens 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/gr-Athens 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Initial scan config for Digital DVB-T (Ert) in Athens Greece -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 690000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/hk-HongKong dvb-apps/util/scan/dvb-t/hk-HongKong ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/hk-HongKong 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/hk-HongKong 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# Hong Kong (DMB-TH) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+# TVB (band 35) -+T 586000000 8MHz AUTO NONE QAM64 8k 1/32 NONE -+# ATV (band 37) -+T 602000000 8MHz AUTO NONE QAM64 8k 1/32 NONE -+ -+# Simulcast (band 22) -+T 482000000 8MHz AUTO NONE QAM64 8k 1/32 NONE -+# Simulcast (band 30) -+T 546000000 8MHz AUTO NONE QAM64 8k 1/32 NONE -+# Simulcast (band 32) -+T 562000000 8MHz AUTO NONE QAM64 8k 1/32 NONE -+# Simulcast (band 40) -+T 628000000 8MHz AUTO NONE QAM64 8k 1/32 NONE -+# Simulcast (band 43) -+T 650000000 8MHz AUTO NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/hr-Zagreb dvb-apps/util/scan/dvb-t/hr-Zagreb ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/hr-Zagreb 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/hr-Zagreb 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# DVB-T Hamburg -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 3/4 NONE AUTO 8k 1/32 NONE # CH27: -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/is-Reykjavik dvb-apps/util/scan/dvb-t/is-Reykjavik ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/is-Reykjavik 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/is-Reykjavik 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,13 @@ -+# Initial scan config for Digital Ísland in Iceland -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Aosta dvb-apps/util/scan/dvb-t/it-Aosta ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Aosta 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Aosta 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,21 @@ -+# Italia / Aosta (it-Aosta) -- mailto: Marco -+# -+# A me funziona solo il Mux Mediaset 2 non riesco a capire come mai... -+# (magari colpa della mia pinnacle pctv 301i saa7133) -+# Gli altri Mux inseriti li ho inseriti come da sito http://www.digitv.it... -+# -+# Chi avesse news o riuscisse a venirne a capo usando anche gli altri mux potrebbe scrivermi -+# inviare una maila kaffeine-user@lists.sf.net per aggiornare/correggere questo file... -+# -+# MUX-A RAI -+T 226500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 1 -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MBONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 2 -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# TIMB1 -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bari dvb-apps/util/scan/dvb-t/it-Bari ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bari 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Bari 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# Italy, Bari -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# MUX-A RAI -+T 219500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-B RAI -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 1 -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE -+T 226500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 2 -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MBONE -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# TIMB1 -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# TeleNorba, TelePuglia, altro... -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bologna dvb-apps/util/scan/dvb-t/it-Bologna ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bologna 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Bologna 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,28 @@ -+# DVB-T Collserola (Barcelona) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#TeleSanterno -+T 186000000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -+#RaiA -+T 203500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -+#Sestarete / Rete 7 -+T 212500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -+#Modena -+T 219500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -+#ReteA, Camera e Senato -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#Sestarete / Rete 7 -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#DFree -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#Mediaset Mux-B -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#La7 -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#RaiB -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#Mediaset Mux-A -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#TeleSanterno -+T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#LA7-2 -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bolzano dvb-apps/util/scan/dvb-t/it-Bolzano ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bolzano 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Bolzano 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# DVB-T Bolzano -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+#RAS DVB-t NETWORK -+T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Cagliari dvb-apps/util/scan/dvb-t/it-Cagliari ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Cagliari 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Cagliari 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,23 @@ -+# DVB-T Cagliari -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 205500000 7MHz 3/4 NONE QAM64 8k 1/32 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 514000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 562000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 674000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 722000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 730000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 762000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Caivano dvb-apps/util/scan/dvb-t/it-Caivano ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Caivano 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Caivano 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,17 @@ -+# DVB-T Caivano (Naples) 80023 -+# 30/10/2008 by Nicola Costanzo -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 1 -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 2 -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX LA7/MTV -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# TIMB1 -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-A RAI -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Catania dvb-apps/util/scan/dvb-t/it-Catania ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Catania 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Catania 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,27 @@ -+# it-Catania -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+# MUX DFREE (Canale 5,Italia1,SportItalia,LCI,RadioItalia Tv) -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX LA7/MTV (La 7,MTV ITALIA,Canale D,Music Box) -+#T 586000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX RTI (Rete 4,Class News,Sole 24 Ore TV,BBC World) -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX MEDIASET 1 -+T 226500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX MEDIASET 2 -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX-A RAI (Rai Utile,Rai Doc,RaiSportSAT,RaiNews24,Rai EDU1) -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX-B RAI (Rai Utile,Rai Doc,RaiSportSAT,RaiNews24,Rai EDU1) -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Conero dvb-apps/util/scan/dvb-t/it-Conero ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Conero 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Conero 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# Italia / Conero (it-Conero) -- mailto: simon -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# C50 -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C46 -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C21 -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Firenze dvb-apps/util/scan/dvb-t/it-Firenze ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Firenze 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Firenze 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,20 @@ -+# This channel list is made by Michele Ficarra -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# MUX-A RAI -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-B RAI -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 1 -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 2 -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX La7/MTV -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MBON -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX Digitoscana -+T 219500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX Tele37 -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Genova dvb-apps/util/scan/dvb-t/it-Genova ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Genova 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Genova 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# Italia / Genova (it-Genova) - Angelo Conforti -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# MUX-A RAI -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-B RAI -+T 219500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX La7/MTV -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX Mediaset -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Livorno dvb-apps/util/scan/dvb-t/it-Livorno ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Livorno 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Livorno 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,15 @@ -+# This channel list is made by G.U.L.LI. LIvorno's Linux Users Group -+# Thanks to: Alessandro Guarguaglini, Stefano Lenzi -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# MUX-A RAI -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-B RAI -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 1 -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 2 -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX La7/MTV -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Milano dvb-apps/util/scan/dvb-t/it-Milano ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Milano 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Milano 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,15 @@ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# MUX-A RAI -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-B RAI -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-A MEDIASET -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-A MEDIASET-2 -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX La7/MTV -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE 2 -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pagnacco dvb-apps/util/scan/dvb-t/it-Pagnacco ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pagnacco 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Pagnacco 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,27 @@ -+# Italia / Pagnacco (it-Pagnacco) -+# DVB-T Pagnacco (Italia) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+# MUX-A RAI -+ -+T 602000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE -+ -+# MUX-B RAI -+ -+T 490000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE -+T 226500000 8MHz 3/4 NONE QAM64 8k 1/32 NONE -+ -+# MUX-Dfree -+ -+T 634000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE -+T 594000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE -+ -+# MUX-LA7/MTV -+ -+T 522000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE -+ -+# Mediaset -+ -+T 818000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE -+ -+# Europa -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Palermo dvb-apps/util/scan/dvb-t/it-Palermo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Palermo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Palermo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,23 @@ -+# Palermo, Italy -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+# MUX DFREE (Canale 5,Italia1,SportItalia,LCI,RadioItalia Tv) -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX LA7/MTV (La 7,MTV ITALIA,Canale D,Music Box) -+#T 730000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX RTI (Rete 4,Class News,Sole 24 Ore TV,BBC World) -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX MEDIASET 2 -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX-A RAI (Rai Utile,Rai Doc,RaiSportSAT,RaiNews24,Rai EDU1) -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+ -+# MUX-B RAI (Rai Utile,Rai Doc,RaiSportSAT,RaiNews24,Rai EDU1) -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pescara dvb-apps/util/scan/dvb-t/it-Pescara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pescara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Pescara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,15 @@ -+# Italy, Pescara San Silvestro -+# Antonio de Vincentiis, www.devincentiis.it, Montesilvano (PE) -+# update 06.02.2009 -+# MUX-A RAI canale: VHF-E polarizzazione: O -+T 186000000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-B RAI canale: VHF-F polarizzazione: O -+T 194500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 1 canale: UHF-69 polarizzazione: V -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE canale: UHF-56 polarizzazione: V -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 2 canale: UHF-49 polarizzazione: V -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MBONE canale: UHF-34 polarizzazione: V -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pisa dvb-apps/util/scan/dvb-t/it-Pisa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pisa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Pisa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+# This channel list is made by G.U.L.LI. LIvorno's Linux Users Group -+# Thanks to: Alessandro Guarguaglini, Stefano Lenzi -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# MUX-A RAI -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-B RAI -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 1 -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 2 -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MBONE -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX TIMB1 -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Roma dvb-apps/util/scan/dvb-t/it-Roma ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Roma 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Roma 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,16 @@ -+# DVB-T Roma -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# MUX DFREE -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX La7/MTV -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 1 -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET 2 -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-A RAI -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-B RAI -+T 186000000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -+# SUPER 3 -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Sassari dvb-apps/util/scan/dvb-t/it-Sassari ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Sassari 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Sassari 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,33 @@ -+# DVB-T Sassari Channels List by frippertronics@alice.it ;) -+# MUX DFREE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX LA7/MTV -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET1 -+T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX MEDIASET2 -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-A RAI -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX-B RAI -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 858000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MBONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# TCS -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# VIDEOLINA -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# TIMEDIA MUX A -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# TIMEDIA MUX B -+T 177500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# T 177500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# SUPER TV -+# T 650000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-S-Stefano_al_mare dvb-apps/util/scan/dvb-t/it-S-Stefano_al_mare ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-S-Stefano_al_mare 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-S-Stefano_al_mare 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+#DVB Santo Stefano al mare (IM) -+#Aggiornato al 10/08/2008 -+#Fonte: DGTVI.it -+#s-stefano@email.it -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#MUX-A RAI -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#MUX-B RAI -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#MUX MEDIASET 1 -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#MUX MEDIASET 2 -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#MUX MBONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#MUX DFREE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+#MUX TIMB 1 -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Torino dvb-apps/util/scan/dvb-t/it-Torino ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Torino 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Torino 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,13 @@ -+# DVB-T Torino (Italia) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+#MUX-A RAI -+T 834000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+#MUX-B RAI -+T 514000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+#MUX RTI -+T 474000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+#MUX LA7 -+T 850000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 602000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+#MUX DFREE -+T 650000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Trieste dvb-apps/util/scan/dvb-t/it-Trieste ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Trieste 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Trieste 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,23 @@ -+# Trieste, Italy -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# MUX MEDIASET 1 (Class News, 24Ore TV, Coming soon, BBC World, Boing, Mediaset Premium) -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# -+# MUX-B RAI (Rai Doc-Futura, RaiSportSAT, RaiNotizie24, Rai EDU1, Sat2000, Radio1, Radio2, Radio3, FDAuditorium) -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# -+# MUX-A RAI (Rai Uno, Rai Due, Rai Tre, Rai Utile) -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# -+# MUX DFREE (Rete 4, Italia 1, Sportitalia, LCI / Prima, Si Live24) -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# -+# MUX (All Music) -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# -+# MUX (Triveneta) -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# -+# MUX (La7 Telemarket Retecapri MTv italia Sitcom Uno) -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Varese dvb-apps/util/scan/dvb-t/it-Varese ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Varese 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Varese 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,16 @@ -+# Italia / Varese -- mailto: b.gabriele -+# -+# From: http://www.dgtvi.it/copertura.aspx -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# -+# MUX-A RAI VHF H2 226,5 O CAMPO DEI FIORI -+T 226500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX DFREE UHF C50 706 V CAMPO DEI FIORI -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX LA7-MTV UHF C37 602 V CAMPO DEI FIORI -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX RTI UHF C26 514 O CAMPO DEI FIORI PRIMA CAPPELLA -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# MUX RTI UHF C38 514 V CAMPO DEI FIORI ALBERGO -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Venezia dvb-apps/util/scan/dvb-t/it-Venezia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Venezia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Venezia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+# Italia / Venzia (it-Venezia) -- mailto: Rob -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# -+# According to Eurosat 1/2006 -+# -+# C50 - MediaSet -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C37 - Rai A - Doesn't work in Mestre though -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C23 -Rai B -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C64 DFree -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C65 La 7 -+T 826000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C58 Mediaset 2 -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C36 DFree -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Verona dvb-apps/util/scan/dvb-t/it-Verona ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Verona 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/it-Verona 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+# Italia / Verona / Sommacampagna - 02/03/2009 -+# Italia / Verona / Zevio - 28/02/2009 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# C26 - TIMB1 -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C34 - Mux B Rai -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C41 - Mux DFree -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C54 - MBone -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C58 - Rete All Music -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C61 - Mux Mediaset 2 -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C64 - Mux DFree -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -+# C67 - Mediaset 1 -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/lu-All dvb-apps/util/scan/dvb-t/lu-All ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/lu-All 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/lu-All 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# DVB-T Luxembourg [2007-11-18] -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 191500000 7MHz 2/3 NONE QAM16 8k 1/8 NONE # Kanal 7 M6, RTL 8, LUXE.TV -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # Kanal 24 club RTL, RTL TVI, plug TV, RTL 4, RTL 5, RTL 7 -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # Kanal 27 RTL TeleLetz, 2 ten RTL -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/lv-Riga dvb-apps/util/scan/dvb-t/lv-Riga ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/lv-Riga 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/lv-Riga 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+# Latvia - Riga (lv-Riga) -+# Generated by Raimonds Cicans -+# UTF8 encoding -+ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+# DLRTC -+T 610000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE # Weak signal! VājÅ¡ signāls! Слабый сигнал! -+ -+# Baltkom TV -+T 650000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE -+T 658000000 8MHz 1/2 NONE QPSK 8k 1/4 NONE -+T 666000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE -+T 690000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE -+T 778000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE -+T 834000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE -+ -+# WARNING! -+# Some applications detect incorrect guard-interval. -+ -+# UZMANĪBU! -+# Dažas programmas nekorekti nosaka "guard-interval" parametru. -+ -+# ВНИМАНИЕ! -+# Некоторые программы некорректно определяют параметр "guard-interval" -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-All dvb-apps/util/scan/dvb-t/nl-All ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-All 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/nl-All 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,42 @@ -+# The Netherlands, whole country -+# Created from http://radio-tv-nederland.nl/TV%20zenderlijst%20Nederland.xls -+# and http://radio-tv-nederland.nl/dvbt/dvbt-lokaal.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 482000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 514000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 538000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 546000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 562000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 578000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 618000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 642000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 666000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 690000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 706000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 722000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 738000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 746000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 786000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 826000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 834000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE -+T 850000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-AlphenaandenRijn dvb-apps/util/scan/dvb-t/nl-AlphenaandenRijn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-AlphenaandenRijn 2004-01-25 17:50:15.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/nl-AlphenaandenRijn 1970-01-01 01:00:00.000000000 +0100 -@@ -1,7 +0,0 @@ --# Digitenne (Alphen aan den Rijn, The Netherlands) --# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 474000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE --T 578000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE --T 722000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE --T 762000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE --T 818000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-Randstad dvb-apps/util/scan/dvb-t/nl-Randstad ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-Randstad 2004-01-25 17:50:15.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/nl-Randstad 1970-01-01 01:00:00.000000000 +0100 -@@ -1,7 +0,0 @@ --# Digitenne (Randstad, The Netherlands) --# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 474000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE --T 490000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE --T 578000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE --T 762000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE --T 818000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/no-Trondelag_Stjordal dvb-apps/util/scan/dvb-t/no-Trondelag_Stjordal ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/no-Trondelag_Stjordal 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/no-Trondelag_Stjordal 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Norway / Trondelag / Stjordal -+# modified according to data automatically generated by w_scan -+# free (nrk) channels are on 658000000 -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nz-Waiatarua dvb-apps/util/scan/dvb-t/nz-Waiatarua ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nz-Waiatarua 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/nz-Waiatarua 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,13 @@ -+# Waiatarua, Auckland NZ -+# -+# Channel allocation details for NZ can be found at -+# http://www.rsm.govt.nz/cms/policy-and-planning/current-projects/broadcasting/digital-television-2007-frequency-plan -+# -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+# Multiplex DA -+T 538000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Multiplex DB -+T 570000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE -+# Multiplex DC -+T 666000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Rzeszow dvb-apps/util/scan/dvb-t/pl-Rzeszow ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Rzeszow 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/pl-Rzeszow 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Rzeszow / Sucha Gora, South-East Poland -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Warszawa dvb-apps/util/scan/dvb-t/pl-Warszawa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Warszawa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/pl-Warszawa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Warsaw / PKiN, Central Poland -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 690000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -+T 746000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Wroclaw dvb-apps/util/scan/dvb-t/pl-Wroclaw ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Wroclaw 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/pl-Wroclaw 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Wroclaw / Zorawina, South-West Poland -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvdalen_Brunnsberg dvb-apps/util/scan/dvb-t/se-Alvdalen_Brunnsberg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvdalen_Brunnsberg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Alvdalen_Brunnsberg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Älvdalen/Brunnsberg -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvdalsasen dvb-apps/util/scan/dvb-t/se-Alvdalsasen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvdalsasen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Alvdalsasen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - ÄlvdalsÃ¥sen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvsbyn dvb-apps/util/scan/dvb-t/se-Alvsbyn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvsbyn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Alvsbyn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Älvsbyn -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Amot dvb-apps/util/scan/dvb-t/se-Amot ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Amot 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Amot 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Åmot -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Angebo dvb-apps/util/scan/dvb-t/se-Angebo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Angebo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Angebo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Ängebo -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Angelholm_Vegeholm dvb-apps/util/scan/dvb-t/se-Angelholm_Vegeholm ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Angelholm_Vegeholm 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Angelholm_Vegeholm 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Ängelholm/Vegeholm -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ange_Snoberg dvb-apps/util/scan/dvb-t/se-Ange_Snoberg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ange_Snoberg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ange_Snoberg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Ånge/Snöberg -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Arvidsjaur_Jultrask dvb-apps/util/scan/dvb-t/se-Arvidsjaur_Jultrask ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Arvidsjaur_Jultrask 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Arvidsjaur_Jultrask 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Arvidsjaur/Julträsk -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Aspeboda dvb-apps/util/scan/dvb-t/se-Aspeboda ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Aspeboda 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Aspeboda 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Aspeboda -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Atvidaberg dvb-apps/util/scan/dvb-t/se-Atvidaberg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Atvidaberg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Atvidaberg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Åtvidaberg -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Avesta_Krylbo dvb-apps/util/scan/dvb-t/se-Avesta_Krylbo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Avesta_Krylbo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Avesta_Krylbo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Avesta/Krylbo -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Backefors dvb-apps/util/scan/dvb-t/se-Backefors ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Backefors 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Backefors 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Bäckefors -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 586000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 754000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 826000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bankeryd dvb-apps/util/scan/dvb-t/se-Bankeryd ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bankeryd 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Bankeryd 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Bankeryd -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bergsjo_Balleberget dvb-apps/util/scan/dvb-t/se-Bergsjo_Balleberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bergsjo_Balleberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Bergsjo_Balleberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Bergsjö/BÃ¥lleberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bergvik dvb-apps/util/scan/dvb-t/se-Bergvik ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bergvik 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Bergvik 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Bergvik -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bollebygd dvb-apps/util/scan/dvb-t/se-Bollebygd ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bollebygd 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Bollebygd 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Bollebygd -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bollnas dvb-apps/util/scan/dvb-t/se-Bollnas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bollnas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Bollnas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Bollnäs -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 618000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Boras_Dalsjofors dvb-apps/util/scan/dvb-t/se-Boras_Dalsjofors ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Boras_Dalsjofors 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Boras_Dalsjofors 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - BorÃ¥s/Dalsjöfors -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Boras_Sjobo dvb-apps/util/scan/dvb-t/se-Boras_Sjobo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Boras_Sjobo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Boras_Sjobo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - BorÃ¥s/Sjöbo -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Borlange_Idkerberget dvb-apps/util/scan/dvb-t/se-Borlange_Idkerberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Borlange_Idkerberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Borlange_Idkerberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Borlänge/Idkerberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Borlange_Nygardarna dvb-apps/util/scan/dvb-t/se-Borlange_Nygardarna ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Borlange_Nygardarna 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Borlange_Nygardarna 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Borlänge/NygÃ¥rdarna -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bottnaryd_Ryd dvb-apps/util/scan/dvb-t/se-Bottnaryd_Ryd ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bottnaryd_Ryd 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Bottnaryd_Ryd 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Bottnaryd/Ryd -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bromsebro dvb-apps/util/scan/dvb-t/se-Bromsebro ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bromsebro 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Bromsebro 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Brömsebro -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bruzaholm dvb-apps/util/scan/dvb-t/se-Bruzaholm ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bruzaholm 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Bruzaholm 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Bruzaholm -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Byxelkrok dvb-apps/util/scan/dvb-t/se-Byxelkrok ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Byxelkrok 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Byxelkrok 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Byxelkrok -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dadran dvb-apps/util/scan/dvb-t/se-Dadran ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dadran 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Dadran 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - DÃ¥dran -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dalfors dvb-apps/util/scan/dvb-t/se-Dalfors ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dalfors 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Dalfors 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Dalfors -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dalstuga dvb-apps/util/scan/dvb-t/se-Dalstuga ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dalstuga 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Dalstuga 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Dalstuga -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Degerfors dvb-apps/util/scan/dvb-t/se-Degerfors ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Degerfors 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Degerfors 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Degerfors -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Delary dvb-apps/util/scan/dvb-t/se-Delary ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Delary 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Delary 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Delary -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Djura dvb-apps/util/scan/dvb-t/se-Djura ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Djura 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Djura 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Djura -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Drevdagen dvb-apps/util/scan/dvb-t/se-Drevdagen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Drevdagen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Drevdagen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Drevdagen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Duvnas dvb-apps/util/scan/dvb-t/se-Duvnas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Duvnas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Duvnas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Duvnäs -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Duvnas_Basna dvb-apps/util/scan/dvb-t/se-Duvnas_Basna ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Duvnas_Basna 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Duvnas_Basna 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Duvnäs/Bäsna -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Edsbyn dvb-apps/util/scan/dvb-t/se-Edsbyn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Edsbyn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Edsbyn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Edsbyn -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Emmaboda_Balshult dvb-apps/util/scan/dvb-t/se-Emmaboda_Balshult ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Emmaboda_Balshult 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Emmaboda_Balshult 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Emmaboda/Bälshult -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Enviken dvb-apps/util/scan/dvb-t/se-Enviken ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Enviken 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Enviken 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Enviken -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fagersta dvb-apps/util/scan/dvb-t/se-Fagersta ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fagersta 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Fagersta 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Fagersta -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Falerum_Centrum dvb-apps/util/scan/dvb-t/se-Falerum_Centrum ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Falerum_Centrum 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Falerum_Centrum 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Falerum/Centrum -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Falun_Lovberget dvb-apps/util/scan/dvb-t/se-Falun_Lovberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Falun_Lovberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Falun_Lovberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Falun/Lövberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Farila dvb-apps/util/scan/dvb-t/se-Farila ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Farila 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Farila 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Färila -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Faro_Ajkerstrask dvb-apps/util/scan/dvb-t/se-Faro_Ajkerstrask ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Faro_Ajkerstrask 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Faro_Ajkerstrask 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - FÃ¥rö/Ajkersträsk -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Farosund_Bunge dvb-apps/util/scan/dvb-t/se-Farosund_Bunge ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Farosund_Bunge 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Farosund_Bunge 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - FÃ¥rösund/Bunge -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Filipstad_Klockarhojden dvb-apps/util/scan/dvb-t/se-Filipstad_Klockarhojden ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Filipstad_Klockarhojden 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Filipstad_Klockarhojden 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Filipstad/Klockarhöjden -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Finnveden dvb-apps/util/scan/dvb-t/se-Finnveden ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Finnveden 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Finnveden 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Finnveden -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fredriksberg dvb-apps/util/scan/dvb-t/se-Fredriksberg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fredriksberg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Fredriksberg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Fredriksberg -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fritsla dvb-apps/util/scan/dvb-t/se-Fritsla ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fritsla 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Fritsla 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Fritsla -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Furudal dvb-apps/util/scan/dvb-t/se-Furudal ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Furudal 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Furudal 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Furudal -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gallivare dvb-apps/util/scan/dvb-t/se-Gallivare ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gallivare 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Gallivare 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Gällivare -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Garpenberg_Kuppgarden dvb-apps/util/scan/dvb-t/se-Garpenberg_Kuppgarden ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Garpenberg_Kuppgarden 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Garpenberg_Kuppgarden 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Garpenberg/KuppgÃ¥rden -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gavle dvb-apps/util/scan/dvb-t/se-Gavle ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gavle 2004-01-25 15:33:02.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Gavle 1970-01-01 01:00:00.000000000 +0100 -@@ -1,6 +0,0 @@ --# Gavle (Senda/Boxer Sweden) --# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE --T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE --T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE --T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gavle_Skogmur dvb-apps/util/scan/dvb-t/se-Gavle_Skogmur ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gavle_Skogmur 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Gavle_Skogmur 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Gävle/Skogmur -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnarp dvb-apps/util/scan/dvb-t/se-Gnarp ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnarp 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Gnarp 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Gnarp -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnesta dvb-apps/util/scan/dvb-t/se-Gnesta ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnesta 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Gnesta 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Gnesta -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnosjo_Marieholm dvb-apps/util/scan/dvb-t/se-Gnosjo_Marieholm ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnosjo_Marieholm 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Gnosjo_Marieholm 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Gnosjö/Marieholm -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Goteborg_Brudaremossen dvb-apps/util/scan/dvb-t/se-Goteborg_Brudaremossen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Goteborg_Brudaremossen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Goteborg_Brudaremossen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Göteborg/Brudaremossen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Goteborg_Slattadamm dvb-apps/util/scan/dvb-t/se-Goteborg_Slattadamm ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Goteborg_Slattadamm 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Goteborg_Slattadamm 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Göteborg/Slättadamm -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gullbrandstorp dvb-apps/util/scan/dvb-t/se-Gullbrandstorp ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gullbrandstorp 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Gullbrandstorp 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Gullbrandstorp -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gunnarsbo dvb-apps/util/scan/dvb-t/se-Gunnarsbo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gunnarsbo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Gunnarsbo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Gunnarsbo -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gusum dvb-apps/util/scan/dvb-t/se-Gusum ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gusum 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Gusum 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Gusum -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hagfors_Varmullsasen dvb-apps/util/scan/dvb-t/se-Hagfors_Varmullsasen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hagfors_Varmullsasen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hagfors_Varmullsasen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Hagfors/VärmullsÃ¥sen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hallaryd dvb-apps/util/scan/dvb-t/se-Hallaryd ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hallaryd 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hallaryd 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Hallaryd -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hallbo dvb-apps/util/scan/dvb-t/se-Hallbo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hallbo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hallbo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Hällbo -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Halmstad_Hamnen dvb-apps/util/scan/dvb-t/se-Halmstad_Hamnen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Halmstad_Hamnen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Halmstad_Hamnen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Halmstad/Hamnen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Halmstad_Oskarstrom dvb-apps/util/scan/dvb-t/se-Halmstad_Oskarstrom ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Halmstad_Oskarstrom 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Halmstad_Oskarstrom 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Halmstad/Oskarström -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 610000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 666000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Harnosand_Harnon dvb-apps/util/scan/dvb-t/se-Harnosand_Harnon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Harnosand_Harnon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Harnosand_Harnon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Härnösand/Härnön -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hassela dvb-apps/util/scan/dvb-t/se-Hassela ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hassela 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hassela 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Hassela -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Havdhem dvb-apps/util/scan/dvb-t/se-Havdhem ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Havdhem 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Havdhem 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Havdhem -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hedemora dvb-apps/util/scan/dvb-t/se-Hedemora ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hedemora 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hedemora 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Hedemora -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Helsingborg_Olympia dvb-apps/util/scan/dvb-t/se-Helsingborg_Olympia ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Helsingborg_Olympia 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Helsingborg_Olympia 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Helsingborg/Olympia -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hennan dvb-apps/util/scan/dvb-t/se-Hennan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hennan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hennan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Hennan -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hestra_Aspas dvb-apps/util/scan/dvb-t/se-Hestra_Aspas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hestra_Aspas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hestra_Aspas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Hestra/ÄspÃ¥s -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hjo_Grevback dvb-apps/util/scan/dvb-t/se-Hjo_Grevback ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hjo_Grevback 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hjo_Grevback 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Hjo/Grevbäck -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hofors dvb-apps/util/scan/dvb-t/se-Hofors ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hofors 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hofors 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Hofors -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hogfors dvb-apps/util/scan/dvb-t/se-Hogfors ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hogfors 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hogfors 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Högfors -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hogsby_Virstad dvb-apps/util/scan/dvb-t/se-Hogsby_Virstad ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hogsby_Virstad 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hogsby_Virstad 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Högsby/Virstad -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Holsbybrunn_Holsbyholm dvb-apps/util/scan/dvb-t/se-Holsbybrunn_Holsbyholm ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Holsbybrunn_Holsbyholm 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Holsbybrunn_Holsbyholm 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Holsbybrunn/Holsbyholm -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Horby_Sallerup dvb-apps/util/scan/dvb-t/se-Horby_Sallerup ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Horby_Sallerup 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Horby_Sallerup 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Hörby/Sallerup -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Horken dvb-apps/util/scan/dvb-t/se-Horken ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Horken 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Horken 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Hörken -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hudiksvall_Forsa dvb-apps/util/scan/dvb-t/se-Hudiksvall_Forsa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hudiksvall_Forsa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hudiksvall_Forsa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Hudiksvall/Forsa -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 618000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hudiksvall_Galgberget dvb-apps/util/scan/dvb-t/se-Hudiksvall_Galgberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hudiksvall_Galgberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Hudiksvall_Galgberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Hudiksvall/Galgberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Huskvarna dvb-apps/util/scan/dvb-t/se-Huskvarna ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Huskvarna 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Huskvarna 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Huskvarna -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Idre dvb-apps/util/scan/dvb-t/se-Idre ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Idre 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Idre 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Idre -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ingatorp dvb-apps/util/scan/dvb-t/se-Ingatorp ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ingatorp 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ingatorp 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Ingatorp -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ingvallsbenning dvb-apps/util/scan/dvb-t/se-Ingvallsbenning ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ingvallsbenning 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ingvallsbenning 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Ingvallsbenning -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Irevik dvb-apps/util/scan/dvb-t/se-Irevik ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Irevik 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Irevik 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Irevik -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jamjo dvb-apps/util/scan/dvb-t/se-Jamjo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jamjo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Jamjo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Jämjö -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jarnforsen dvb-apps/util/scan/dvb-t/se-Jarnforsen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jarnforsen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Jarnforsen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Järnforsen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jarvso dvb-apps/util/scan/dvb-t/se-Jarvso ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jarvso 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Jarvso 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Järvsö -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jokkmokk_Tjalmejaure dvb-apps/util/scan/dvb-t/se-Jokkmokk_Tjalmejaure ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jokkmokk_Tjalmejaure 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Jokkmokk_Tjalmejaure 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Jokkmokk/Tjalmejaure -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jonkoping_Bondberget dvb-apps/util/scan/dvb-t/se-Jonkoping_Bondberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jonkoping_Bondberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Jonkoping_Bondberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Jönköping/Bondberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kalix dvb-apps/util/scan/dvb-t/se-Kalix ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kalix 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kalix 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Kalix -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 770000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 786000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 746000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karbole dvb-apps/util/scan/dvb-t/se-Karbole ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karbole 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Karbole 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - KÃ¥rböle -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlsborg_Vaberget dvb-apps/util/scan/dvb-t/se-Karlsborg_Vaberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlsborg_Vaberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Karlsborg_Vaberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Karlsborg/Vaberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlshamn dvb-apps/util/scan/dvb-t/se-Karlshamn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlshamn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Karlshamn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Karlshamn -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 498000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 522000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlskrona_Vamo dvb-apps/util/scan/dvb-t/se-Karlskrona_Vamo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlskrona_Vamo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Karlskrona_Vamo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Karlskrona/Vämö -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 498000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 522000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlstad_Sormon dvb-apps/util/scan/dvb-t/se-Karlstad_Sormon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlstad_Sormon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Karlstad_Sormon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,9 @@ -+# Sweden - Karlstad Sörmon Valid from 2007 09 26. Ver. 2 Correct FEC -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+# Channels -+# Mux3=30 -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+# Mux4=42 -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+# Mux1=43 -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kaxholmen_Vistakulle dvb-apps/util/scan/dvb-t/se-Kaxholmen_Vistakulle ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kaxholmen_Vistakulle 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kaxholmen_Vistakulle 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Kaxholmen/Vistakulle -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kinnastrom dvb-apps/util/scan/dvb-t/se-Kinnastrom ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kinnastrom 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kinnastrom 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Kinnaström -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kiruna_Kirunavaara dvb-apps/util/scan/dvb-t/se-Kiruna_Kirunavaara ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kiruna_Kirunavaara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kiruna_Kirunavaara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Kiruna/Kirunavaara -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kisa dvb-apps/util/scan/dvb-t/se-Kisa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kisa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kisa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Kisa -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Knared dvb-apps/util/scan/dvb-t/se-Knared ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Knared 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Knared 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Knäred -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kopmanholmen dvb-apps/util/scan/dvb-t/se-Kopmanholmen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kopmanholmen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kopmanholmen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Köpmanholmen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kopparberg dvb-apps/util/scan/dvb-t/se-Kopparberg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kopparberg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kopparberg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Kopparberg -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kramfors_Lugnvik dvb-apps/util/scan/dvb-t/se-Kramfors_Lugnvik ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kramfors_Lugnvik 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kramfors_Lugnvik 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Kramfors/Lugnvik -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kristinehamn_Utsiktsberget dvb-apps/util/scan/dvb-t/se-Kristinehamn_Utsiktsberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kristinehamn_Utsiktsberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kristinehamn_Utsiktsberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Kristinehamn/Utsiktsberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 522000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 626000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kungsater dvb-apps/util/scan/dvb-t/se-Kungsater ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kungsater 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kungsater 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Kungsäter -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kungsberget_GI dvb-apps/util/scan/dvb-t/se-Kungsberget_GI ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kungsberget_GI 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Kungsberget_GI 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Kungsberget/GI -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Langshyttan dvb-apps/util/scan/dvb-t/se-Langshyttan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Langshyttan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Langshyttan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - LÃ¥ngshyttan -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Langshyttan_Engelsfors dvb-apps/util/scan/dvb-t/se-Langshyttan_Engelsfors ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Langshyttan_Engelsfors 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Langshyttan_Engelsfors 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - LÃ¥ngshyttan/Engelsfors -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Leksand_Karingberget dvb-apps/util/scan/dvb-t/se-Leksand_Karingberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Leksand_Karingberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Leksand_Karingberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Leksand/Käringberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lerdala dvb-apps/util/scan/dvb-t/se-Lerdala ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lerdala 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Lerdala 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Lerdala -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lilltjara_Digerberget dvb-apps/util/scan/dvb-t/se-Lilltjara_Digerberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lilltjara_Digerberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Lilltjara_Digerberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Lilltjära/Digerberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Limedsforsen dvb-apps/util/scan/dvb-t/se-Limedsforsen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Limedsforsen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Limedsforsen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Limedsforsen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lindshammar_Ramkvilla dvb-apps/util/scan/dvb-t/se-Lindshammar_Ramkvilla ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lindshammar_Ramkvilla 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Lindshammar_Ramkvilla 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Lindshammar/Ramkvilla -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Linkoping_Vattentornet dvb-apps/util/scan/dvb-t/se-Linkoping_Vattentornet ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Linkoping_Vattentornet 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Linkoping_Vattentornet 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Linköping/Vattentornet -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ljugarn dvb-apps/util/scan/dvb-t/se-Ljugarn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ljugarn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ljugarn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Ljugarn -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Loffstrand dvb-apps/util/scan/dvb-t/se-Loffstrand ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Loffstrand 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Loffstrand 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Loffstrand -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 650000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 762000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 770000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lonneberga dvb-apps/util/scan/dvb-t/se-Lonneberga ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lonneberga 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Lonneberga 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Lönneberga -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lorstrand dvb-apps/util/scan/dvb-t/se-Lorstrand ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lorstrand 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Lorstrand 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Lörstrand -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ludvika_Bjorkasen dvb-apps/util/scan/dvb-t/se-Ludvika_Bjorkasen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ludvika_Bjorkasen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ludvika_Bjorkasen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Ludvika/BjörkÃ¥sen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lumsheden_Trekanten dvb-apps/util/scan/dvb-t/se-Lumsheden_Trekanten ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lumsheden_Trekanten 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Lumsheden_Trekanten 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Lumsheden/Trekanten -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lycksele_Knaften dvb-apps/util/scan/dvb-t/se-Lycksele_Knaften ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lycksele_Knaften 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Lycksele_Knaften 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Lycksele/Knaften -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mahult dvb-apps/util/scan/dvb-t/se-Mahult ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mahult 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Mahult 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Mahult -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Malmo_Jagersro dvb-apps/util/scan/dvb-t/se-Malmo_Jagersro ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Malmo_Jagersro 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Malmo_Jagersro 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Malmö/Jägersro -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Malung dvb-apps/util/scan/dvb-t/se-Malung ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Malung 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Malung 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Malung -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mariannelund dvb-apps/util/scan/dvb-t/se-Mariannelund ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mariannelund 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Mariannelund 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Mariannelund -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Markaryd_Hualtet dvb-apps/util/scan/dvb-t/se-Markaryd_Hualtet ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Markaryd_Hualtet 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Markaryd_Hualtet 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Markaryd/Hualtet -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Matfors dvb-apps/util/scan/dvb-t/se-Matfors ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Matfors 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Matfors 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Matfors -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Molnbo_Tallstugan dvb-apps/util/scan/dvb-t/se-Molnbo_Tallstugan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Molnbo_Tallstugan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Molnbo_Tallstugan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,2 @@ -+# Sweden - Mölnbo/Tallstugan -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Molndal_Vasterberget dvb-apps/util/scan/dvb-t/se-Molndal_Vasterberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Molndal_Vasterberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Molndal_Vasterberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Mölndal/Västerberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mora_Eldris dvb-apps/util/scan/dvb-t/se-Mora_Eldris ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mora_Eldris 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Mora_Eldris 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Mora/Eldris -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Motala_Ervasteby dvb-apps/util/scan/dvb-t/se-Motala_Ervasteby ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Motala_Ervasteby 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Motala_Ervasteby 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Motala/Ervasteby -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mullsjo_Torestorp dvb-apps/util/scan/dvb-t/se-Mullsjo_Torestorp ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mullsjo_Torestorp 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Mullsjo_Torestorp 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Mullsjö/Torestorp -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 850000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Nassjo dvb-apps/util/scan/dvb-t/se-Nassjo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Nassjo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Nassjo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Nässjö -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Navekvarn dvb-apps/util/scan/dvb-t/se-Navekvarn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Navekvarn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Navekvarn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Nävekvarn -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrahammar dvb-apps/util/scan/dvb-t/se-Norrahammar ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrahammar 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Norrahammar 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Norrahammar -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrkoping_Krokek dvb-apps/util/scan/dvb-t/se-Norrkoping_Krokek ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrkoping_Krokek 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Norrkoping_Krokek 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Norrköping/Krokek -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrtalje_Sodra_Bergen dvb-apps/util/scan/dvb-t/se-Norrtalje_Sodra_Bergen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrtalje_Sodra_Bergen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Norrtalje_Sodra_Bergen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Norrtälje/Södra Bergen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Nykoping dvb-apps/util/scan/dvb-t/se-Nykoping ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Nykoping 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Nykoping 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Nyköping -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Orebro_Lockhyttan dvb-apps/util/scan/dvb-t/se-Orebro_Lockhyttan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Orebro_Lockhyttan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Orebro_Lockhyttan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Örebro/Lockhyttan -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ornskoldsvik_As dvb-apps/util/scan/dvb-t/se-Ornskoldsvik_As ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ornskoldsvik_As 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ornskoldsvik_As 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Örnsköldsvik/Ås -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Oskarshamn dvb-apps/util/scan/dvb-t/se-Oskarshamn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Oskarshamn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Oskarshamn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Oskarshamn -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ostersund_Brattasen dvb-apps/util/scan/dvb-t/se-Ostersund_Brattasen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ostersund_Brattasen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ostersund_Brattasen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Östersund/BrattÃ¥sen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Osthammar_Valo dvb-apps/util/scan/dvb-t/se-Osthammar_Valo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Osthammar_Valo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Osthammar_Valo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Östhammar/Valö -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Overkalix dvb-apps/util/scan/dvb-t/se-Overkalix ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Overkalix 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Overkalix 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Överkalix -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 770000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 786000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 746000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Oxberg dvb-apps/util/scan/dvb-t/se-Oxberg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Oxberg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Oxberg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Oxberg -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Pajala dvb-apps/util/scan/dvb-t/se-Pajala ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Pajala 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Pajala 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Pajala -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE #Teracom_Mux_2 -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE #Teracom_Mux_3 -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE #Teracom_Mux_1 -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE #Teracom_Mux_4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Paulistom dvb-apps/util/scan/dvb-t/se-Paulistom ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Paulistom 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Paulistom 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Paulistöm -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rattvik dvb-apps/util/scan/dvb-t/se-Rattvik ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rattvik 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Rattvik 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Rättvik -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rengsjo dvb-apps/util/scan/dvb-t/se-Rengsjo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rengsjo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Rengsjo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Rengsjö -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rorbacksnas dvb-apps/util/scan/dvb-t/se-Rorbacksnas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rorbacksnas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Rorbacksnas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Rörbäcksnäs -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sagmyra dvb-apps/util/scan/dvb-t/se-Sagmyra ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sagmyra 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Sagmyra 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - SÃ¥gmyra -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Salen dvb-apps/util/scan/dvb-t/se-Salen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Salen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Salen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Sälen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Salfjallet dvb-apps/util/scan/dvb-t/se-Salfjallet ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Salfjallet 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Salfjallet 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Sälfjället -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sarna_Mickeltemplet dvb-apps/util/scan/dvb-t/se-Sarna_Mickeltemplet ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sarna_Mickeltemplet 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Sarna_Mickeltemplet 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Särna/Mickeltemplet -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Satila dvb-apps/util/scan/dvb-t/se-Satila ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Satila 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Satila 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Sätila -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Saxdalen dvb-apps/util/scan/dvb-t/se-Saxdalen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Saxdalen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Saxdalen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Saxdalen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Siljansnas_Uvberget dvb-apps/util/scan/dvb-t/se-Siljansnas_Uvberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Siljansnas_Uvberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Siljansnas_Uvberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Siljansnäs/Uvberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skarstad dvb-apps/util/scan/dvb-t/se-Skarstad ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skarstad 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Skarstad 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Skärstad -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skattungbyn dvb-apps/util/scan/dvb-t/se-Skattungbyn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skattungbyn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Skattungbyn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Skattungbyn -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skelleftea dvb-apps/util/scan/dvb-t/se-Skelleftea ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skelleftea 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Skelleftea 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - SkellefteÃ¥ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skene_Nycklarberget dvb-apps/util/scan/dvb-t/se-Skene_Nycklarberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skene_Nycklarberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Skene_Nycklarberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Skene/Nycklarberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skovde dvb-apps/util/scan/dvb-t/se-Skovde ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skovde 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Skovde 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Skövde -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Smedjebacken_Uvberget dvb-apps/util/scan/dvb-t/se-Smedjebacken_Uvberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Smedjebacken_Uvberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Smedjebacken_Uvberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Smedjebacken/Uvberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Soderhamn dvb-apps/util/scan/dvb-t/se-Soderhamn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Soderhamn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Soderhamn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Söderhamn -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 810000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Soderkoping dvb-apps/util/scan/dvb-t/se-Soderkoping ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Soderkoping 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Soderkoping 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Söderköping -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sodertalje_Ragnhildsborg dvb-apps/util/scan/dvb-t/se-Sodertalje_Ragnhildsborg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sodertalje_Ragnhildsborg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Sodertalje_Ragnhildsborg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# Sweden - Södertälje/Ragnhildsborg -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Solleftea_Hallsta dvb-apps/util/scan/dvb-t/se-Solleftea_Hallsta ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Solleftea_Hallsta 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Solleftea_Hallsta 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - SollefteÃ¥/Hallsta -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Solleftea_Multra dvb-apps/util/scan/dvb-t/se-Solleftea_Multra ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Solleftea_Multra 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Solleftea_Multra 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - SollefteÃ¥/MultrÃ¥ -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sorsjon dvb-apps/util/scan/dvb-t/se-Sorsjon ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sorsjon 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Sorsjon 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Sörsjön -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stockholm_Marieberg dvb-apps/util/scan/dvb-t/se-Stockholm_Marieberg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stockholm_Marieberg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Stockholm_Marieberg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Stockholm/Marieberg -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stockholm_Nacka dvb-apps/util/scan/dvb-t/se-Stockholm_Nacka ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stockholm_Nacka 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Stockholm_Nacka 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# Sweden - Stockholm/Nacka -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Teracom_Mux_1 -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Teracom_Mux_2 -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Teracom_Mux_3 -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Teracom_Mux_4 -+T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Teracom_Mux_5 -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Teracom_Mux_6 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stora_Skedvi dvb-apps/util/scan/dvb-t/se-Stora_Skedvi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stora_Skedvi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Stora_Skedvi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Stora Skedvi -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Storfjaten dvb-apps/util/scan/dvb-t/se-Storfjaten ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Storfjaten 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Storfjaten 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Storfjäten -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Storuman dvb-apps/util/scan/dvb-t/se-Storuman ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Storuman 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Storuman 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Storuman -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stromstad dvb-apps/util/scan/dvb-t/se-Stromstad ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stromstad 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Stromstad 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Strömstad -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 730000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 754000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 554000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Styrsjobo dvb-apps/util/scan/dvb-t/se-Styrsjobo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Styrsjobo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Styrsjobo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Styrsjöbo -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundborn dvb-apps/util/scan/dvb-t/se-Sundborn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundborn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Sundborn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Sundborn -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundsbruk dvb-apps/util/scan/dvb-t/se-Sundsbruk ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundsbruk 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Sundsbruk 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Sundsbruk -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundsvall_S_Stadsberget dvb-apps/util/scan/dvb-t/se-Sundsvall_S_Stadsberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundsvall_S_Stadsberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Sundsvall_S_Stadsberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Sundsvall/S Stadsberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sunne_Blabarskullen dvb-apps/util/scan/dvb-t/se-Sunne_Blabarskullen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sunne_Blabarskullen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Sunne_Blabarskullen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Sunne/BlÃ¥bärskullen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Svartnas dvb-apps/util/scan/dvb-t/se-Svartnas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Svartnas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Svartnas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Svartnäs -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sveg_Brickan dvb-apps/util/scan/dvb-t/se-Sveg_Brickan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sveg_Brickan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Sveg_Brickan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Sveg/Brickan -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Taberg dvb-apps/util/scan/dvb-t/se-Taberg ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Taberg 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Taberg 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Taberg -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tandadalen dvb-apps/util/scan/dvb-t/se-Tandadalen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tandadalen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Tandadalen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - TandÃ¥dalen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tasjo dvb-apps/util/scan/dvb-t/se-Tasjo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tasjo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Tasjo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - TÃ¥sjö -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tollsjo dvb-apps/util/scan/dvb-t/se-Tollsjo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tollsjo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Tollsjo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Töllsjö -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Torsby_Bada dvb-apps/util/scan/dvb-t/se-Torsby_Bada ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Torsby_Bada 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Torsby_Bada 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Torsby/Bada -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tranas_Bredkarr dvb-apps/util/scan/dvb-t/se-Tranas_Bredkarr ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tranas_Bredkarr 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Tranas_Bredkarr 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - TranÃ¥s/Bredkärr -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tranemo dvb-apps/util/scan/dvb-t/se-Tranemo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tranemo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Tranemo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Tranemo -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Transtrand_Bolheden dvb-apps/util/scan/dvb-t/se-Transtrand_Bolheden ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Transtrand_Bolheden 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Transtrand_Bolheden 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Transtrand/Bolheden -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Traryd_Betas dvb-apps/util/scan/dvb-t/se-Traryd_Betas ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Traryd_Betas 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Traryd_Betas 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Traryd/BetÃ¥s -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Trollhattan dvb-apps/util/scan/dvb-t/se-Trollhattan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Trollhattan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Trollhattan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Trollhättan -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 730000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 754000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 554000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Trosa dvb-apps/util/scan/dvb-t/se-Trosa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Trosa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Trosa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Trosa -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tystberga dvb-apps/util/scan/dvb-t/se-Tystberga ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tystberga 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Tystberga 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Tystberga -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uddevalla_Herrestad dvb-apps/util/scan/dvb-t/se-Uddevalla_Herrestad ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uddevalla_Herrestad 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Uddevalla_Herrestad 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Uddevalla/Herrestad -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 730000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 754000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 554000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ullared dvb-apps/util/scan/dvb-t/se-Ullared ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ullared 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ullared 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Ullared -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ulricehamn dvb-apps/util/scan/dvb-t/se-Ulricehamn ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ulricehamn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ulricehamn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Ulricehamn -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 842000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ulvshyttan_Porjus dvb-apps/util/scan/dvb-t/se-Ulvshyttan_Porjus ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ulvshyttan_Porjus 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ulvshyttan_Porjus 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Ulvshyttan/Porjus -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uppsala_Rickomberga dvb-apps/util/scan/dvb-t/se-Uppsala_Rickomberga ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uppsala_Rickomberga 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Uppsala_Rickomberga 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Uppsala/Rickomberga -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uppsala_Vedyxa dvb-apps/util/scan/dvb-t/se-Uppsala_Vedyxa ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uppsala_Vedyxa 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Uppsala_Vedyxa 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Uppsala/Vedyxa -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vaddo_Elmsta dvb-apps/util/scan/dvb-t/se-Vaddo_Elmsta ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vaddo_Elmsta 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Vaddo_Elmsta 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Väddö/Elmsta -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Valdemarsvik dvb-apps/util/scan/dvb-t/se-Valdemarsvik ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Valdemarsvik 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Valdemarsvik 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# Sweden - Valdemarsvik -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 794000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vannas_Granlundsberget dvb-apps/util/scan/dvb-t/se-Vannas_Granlundsberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vannas_Granlundsberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Vannas_Granlundsberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Vännäs/Granlundsberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vansbro_Hummelberget dvb-apps/util/scan/dvb-t/se-Vansbro_Hummelberget ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vansbro_Hummelberget 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Vansbro_Hummelberget 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Vansbro/Hummelberget -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Varberg_Grimeton dvb-apps/util/scan/dvb-t/se-Varberg_Grimeton ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Varberg_Grimeton 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Varberg_Grimeton 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Varberg/Grimeton -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 610000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 666000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vasteras_Lillharad dvb-apps/util/scan/dvb-t/se-Vasteras_Lillharad ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vasteras_Lillharad 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Vasteras_Lillharad 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - VästerÃ¥s/Lillhärad -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vastervik_Farhult dvb-apps/util/scan/dvb-t/se-Vastervik_Farhult ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vastervik_Farhult 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Vastervik_Farhult 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Västervik/FÃ¥rhult -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vaxbo dvb-apps/util/scan/dvb-t/se-Vaxbo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vaxbo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Vaxbo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Växbo -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vessigebro dvb-apps/util/scan/dvb-t/se-Vessigebro ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vessigebro 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Vessigebro 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Vessigebro -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vetlanda_Nye dvb-apps/util/scan/dvb-t/se-Vetlanda_Nye ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vetlanda_Nye 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Vetlanda_Nye 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Vetlanda/Nye -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vikmanshyttan dvb-apps/util/scan/dvb-t/se-Vikmanshyttan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vikmanshyttan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Vikmanshyttan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Vikmanshyttan -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Virserum dvb-apps/util/scan/dvb-t/se-Virserum ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Virserum 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Virserum 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Virserum -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visby_Follingbo dvb-apps/util/scan/dvb-t/se-Visby_Follingbo ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visby_Follingbo 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Visby_Follingbo 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Visby/Follingbo -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visby_Hamnen dvb-apps/util/scan/dvb-t/se-Visby_Hamnen ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visby_Hamnen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Visby_Hamnen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Visby/Hamnen -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visingso dvb-apps/util/scan/dvb-t/se-Visingso ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visingso 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Visingso 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Visingsö -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vislanda_Nydala dvb-apps/util/scan/dvb-t/se-Vislanda_Nydala ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vislanda_Nydala 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Vislanda_Nydala 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Sweden - Vislanda/Nydala -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -+T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Voxna dvb-apps/util/scan/dvb-t/se-Voxna ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Voxna 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Voxna 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Voxna -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ystad_Metallgatan dvb-apps/util/scan/dvb-t/se-Ystad_Metallgatan ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ystad_Metallgatan 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Ystad_Metallgatan 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Sweden - Ystad/Metallgatan -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -+T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Yttermalung dvb-apps/util/scan/dvb-t/se-Yttermalung ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Yttermalung 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/se-Yttermalung 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,3 @@ -+# Sweden - Yttermalung -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-BanskaBystrica dvb-apps/util/scan/dvb-t/sk-BanskaBystrica ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-BanskaBystrica 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/sk-BanskaBystrica 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# DVB-T Banska Bystrica (Banska Bystrica, Slovak Republic) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-Bratislava dvb-apps/util/scan/dvb-t/sk-Bratislava ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-Bratislava 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/sk-Bratislava 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# DVB-T Bratislava (Bratislava, Slovak Republic) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-Kosice dvb-apps/util/scan/dvb-t/sk-Kosice ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-Kosice 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/sk-Kosice 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,4 @@ -+# DVB-T Kosice (Kosice, Slovak Republic) -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+ -+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/tw-Kaohsiung dvb-apps/util/scan/dvb-t/tw-Kaohsiung ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/tw-Kaohsiung 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/tw-Kaohsiung 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+# Taiwan - Kaohsiung, southern Taiwan -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 545000000 6MHz 2/3 NONE QAM16 8k 1/4 NONE -+T 545000000 6MHz 2/3 NONE QAM16 8k 1/8 NONE -+T 557000000 6MHz 2/3 NONE QAM16 8k 1/4 NONE -+T 557000000 6MHz 2/3 NONE QAM16 8k 1/8 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/tw-Taipei dvb-apps/util/scan/dvb-t/tw-Taipei ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/tw-Taipei 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/tw-Taipei 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# Taiwan - Taipei, northern Taiwan -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 533000000 6MHz 1/2 NONE QAM16 8k 1/8 NONE -+T 545000000 6MHz 2/3 NONE QAM16 8k 1/8 NONE -+T 557000000 6MHz 2/3 NONE QAM16 8k 1/4 NONE -+T 581000000 6MHz 2/3 NONE QAM16 8k 1/4 NONE -+T 593000000 6MHz 2/3 NONE QAM16 8k 1/4 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Aberdare dvb-apps/util/scan/dvb-t/uk-Aberdare ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Aberdare 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Aberdare 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Aberdare -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 562167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 489833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Angus dvb-apps/util/scan/dvb-t/uk-Angus ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Angus 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Angus 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Angus -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 850000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 834167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 777833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 801833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 753833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 825833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BeaconHill dvb-apps/util/scan/dvb-t/uk-BeaconHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BeaconHill 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-BeaconHill 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Beacon Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 721833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 794167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 770167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 738167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 753833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 818167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Belmont dvb-apps/util/scan/dvb-t/uk-Belmont ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Belmont 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Belmont 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Belmont -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 690000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 850000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 834000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 786000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 762167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bilsdale dvb-apps/util/scan/dvb-t/uk-Bilsdale ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bilsdale 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Bilsdale 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Bilsdale -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 474000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 554000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 498167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 522167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BlackHill dvb-apps/util/scan/dvb-t/uk-BlackHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BlackHill 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-BlackHill 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,10 @@ --# uk BlackHill -+# UK, Black Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 634167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 634167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 682167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 658167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 746000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 826000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Blaenplwyf dvb-apps/util/scan/dvb-t/uk-Blaenplwyf ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Blaenplwyf 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Blaenplwyf 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Blaenplwyf -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 506167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BluebellHill dvb-apps/util/scan/dvb-t/uk-BluebellHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BluebellHill 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-BluebellHill 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Bluebell Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 778000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 498000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 522000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 665833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 641833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bressay dvb-apps/util/scan/dvb-t/uk-Bressay ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bressay 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Bressay 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Bressay -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 497833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 521833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 553833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 834000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 850000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BrierleyHill dvb-apps/util/scan/dvb-t/uk-BrierleyHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BrierleyHill 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-BrierleyHill 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Brierley Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 850000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 825833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 753833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 777833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 834167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 801833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BristolIlchesterCres dvb-apps/util/scan/dvb-t/uk-BristolIlchesterCres ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BristolIlchesterCres 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-BristolIlchesterCres 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Bristol Ilchester Cres. -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 618000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 634167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 658167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BristolKingsWeston dvb-apps/util/scan/dvb-t/uk-BristolKingsWeston ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BristolKingsWeston 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-BristolKingsWeston 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Bristol King's Weston -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 482000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 506000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 530000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 562000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bromsgrove dvb-apps/util/scan/dvb-t/uk-Bromsgrove ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bromsgrove 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Bromsgrove 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Bromsgrove -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 537833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 569833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 489833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 545833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BrougherMountain dvb-apps/util/scan/dvb-t/uk-BrougherMountain ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BrougherMountain 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-BrougherMountain 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Brougher Mountain -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 490167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 514167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Caldbeck dvb-apps/util/scan/dvb-t/uk-Caldbeck ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Caldbeck 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Caldbeck 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Caldbeck -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 506000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 490000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 514167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-CaradonHill dvb-apps/util/scan/dvb-t/uk-CaradonHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-CaradonHill 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-CaradonHill 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Caradon Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 553833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 690000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 497833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 522000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Carmel dvb-apps/util/scan/dvb-t/uk-Carmel ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Carmel 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Carmel 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Carmel -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 825833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 777833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 801833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 850000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 834167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Chatton dvb-apps/util/scan/dvb-t/uk-Chatton ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Chatton 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Chatton 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Chatton -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 626167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 706167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 650167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 674167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Chesterfield dvb-apps/util/scan/dvb-t/uk-Chesterfield ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Chesterfield 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Chesterfield 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Chesterfield -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 626000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 650000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 674000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 706000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 722000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Craigkelly dvb-apps/util/scan/dvb-t/uk-Craigkelly ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Craigkelly 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Craigkelly 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Craigkelly -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 570000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 538000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 489833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-CrystalPalace dvb-apps/util/scan/dvb-t/uk-CrystalPalace ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-CrystalPalace 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-CrystalPalace 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,10 @@ --# Crystal Palace -+# UK, Crystal Palace -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 505833333 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 505833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 481833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 561833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 529833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 537833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Darvel dvb-apps/util/scan/dvb-t/uk-Darvel ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Darvel 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Darvel 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Darvel -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 481833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 505833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 561833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 529833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Divis dvb-apps/util/scan/dvb-t/uk-Divis ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Divis 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Divis 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Divis -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 538000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 569833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 489833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Dover dvb-apps/util/scan/dvb-t/uk-Dover ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Dover 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Dover 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,14 @@ -+# UK, Dover -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 850000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 794167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 745833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 770167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 762167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 785833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+# UK, Dover B -+T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 642000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 618167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Durris dvb-apps/util/scan/dvb-t/uk-Durris ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Durris 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Durris 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Durris -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 722167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 713833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 634000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 658000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Eitshal dvb-apps/util/scan/dvb-t/uk-Eitshal ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Eitshal 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Eitshal 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Eitshal -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 546167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 481833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 505833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 529833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 561833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-EmleyMoor dvb-apps/util/scan/dvb-t/uk-EmleyMoor ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-EmleyMoor 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-EmleyMoor 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Emley Moor -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 722167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 625833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 649833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 673833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 705833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Fenham dvb-apps/util/scan/dvb-t/uk-Fenham ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Fenham 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Fenham 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Fenham -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 545833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 506167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 762167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Fenton dvb-apps/util/scan/dvb-t/uk-Fenton ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Fenton 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Fenton 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Fenton -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 577833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 545833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 506167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Ferryside dvb-apps/util/scan/dvb-t/uk-Ferryside ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Ferryside 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Ferryside 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# UK, Ferryside -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 545833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 498000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 522000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Guildford dvb-apps/util/scan/dvb-t/uk-Guildford ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Guildford 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Guildford 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Guildford -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 658167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 634167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 738000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Hannington dvb-apps/util/scan/dvb-t/uk-Hannington ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Hannington 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Hannington 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,10 @@ --# Hannington, North Hampshire -+# UK, Hannington -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy - T 706000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 650167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 626167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 674167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 658167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 634167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Hastings dvb-apps/util/scan/dvb-t/uk-Hastings ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Hastings 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Hastings 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Hastings -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 553833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 521833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 474000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 497833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 810000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 786000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Heathfield dvb-apps/util/scan/dvb-t/uk-Heathfield ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Heathfield 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Heathfield 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Heathfield -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 538000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 689833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 681833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 738000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 713833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-HemelHempstead dvb-apps/util/scan/dvb-t/uk-HemelHempstead ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-HemelHempstead 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-HemelHempstead 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Hemel Hempstead -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 690167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 746000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 786167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 777833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 802000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 826000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-HuntshawCross dvb-apps/util/scan/dvb-t/uk-HuntshawCross ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-HuntshawCross 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-HuntshawCross 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,13 @@ -+# UK, Huntshaw Cross -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 737833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 769833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 793833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 817833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 729833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 761833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+# UK, Huntshaw Cross B -+T 714000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 682000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Idle dvb-apps/util/scan/dvb-t/uk-Idle ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Idle 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Idle 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Idle -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 730000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 578000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 754000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 545833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KeelylangHill dvb-apps/util/scan/dvb-t/uk-KeelylangHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KeelylangHill 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-KeelylangHill 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Keelylang Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 690167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 722167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 634167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 658167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Keighley dvb-apps/util/scan/dvb-t/uk-Keighley ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Keighley 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Keighley 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Keighley -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 850000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 834000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 729833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KilveyHill dvb-apps/util/scan/dvb-t/uk-KilveyHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KilveyHill 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-KilveyHill 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Kilvey Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 505833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 481833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 529833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 561833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 553833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KnockMore dvb-apps/util/scan/dvb-t/uk-KnockMore ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KnockMore 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-KnockMore 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Knock More -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 546167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 730000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 762167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 786000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 753833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Lancaster dvb-apps/util/scan/dvb-t/uk-Lancaster ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Lancaster 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Lancaster 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Lancaster -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 506167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 545833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-LarkStoke dvb-apps/util/scan/dvb-t/uk-LarkStoke ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-LarkStoke 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-LarkStoke 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Lark Stoke -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 554000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 498167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 522167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 762000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 786000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Limavady dvb-apps/util/scan/dvb-t/uk-Limavady ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Limavady 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Limavady 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Limavady -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 842000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 769833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 730000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 761833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 786167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 810167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Llanddona dvb-apps/util/scan/dvb-t/uk-Llanddona ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Llanddona 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Llanddona 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Llanddona -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 706000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 738167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 770167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 794167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 818167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 674000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Malvern dvb-apps/util/scan/dvb-t/uk-Malvern ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Malvern 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Malvern 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Malvern -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 722167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 618000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 682000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 658000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 714000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 634000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Mendip dvb-apps/util/scan/dvb-t/uk-Mendip ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Mendip 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Mendip 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Mendip -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 778167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 746167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 802167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 826167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 842000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Midhurst dvb-apps/util/scan/dvb-t/uk-Midhurst ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Midhurst 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Midhurst 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Midhurst -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 826167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 802167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 778167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 817833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 786167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Moel-y-Parc dvb-apps/util/scan/dvb-t/uk-Moel-y-Parc ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Moel-y-Parc 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Moel-y-Parc 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Moel-y-Parc -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 738000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 770000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 794000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 818000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Nottingham dvb-apps/util/scan/dvb-t/uk-Nottingham ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Nottingham 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Nottingham 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Nottingham -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 842000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 730000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 810000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 538000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 778000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-OliversMount dvb-apps/util/scan/dvb-t/uk-OliversMount ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-OliversMount 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-OliversMount 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Oliver's Mount -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 698000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 842167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 738167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 770167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 794167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 818167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Oxford dvb-apps/util/scan/dvb-t/uk-Oxford ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Oxford 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Oxford 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,10 @@ --# Oxford -+# UK, Oxford -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 578000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 850000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 713833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 721833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 538000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-PendleForest dvb-apps/util/scan/dvb-t/uk-PendleForest ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-PendleForest 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-PendleForest 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Pendle Forest -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 497833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 521833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 553833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 545833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Plympton dvb-apps/util/scan/dvb-t/uk-Plympton ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Plympton 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Plympton 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Plympton -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 722000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 842167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 833833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 785833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 809833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 754000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-PontopPike dvb-apps/util/scan/dvb-t/uk-PontopPike ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-PontopPike 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-PontopPike 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,10 @@ --# Pontop Pike, UK -+# UK, Pontop Pike -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 690000000 8MHz 1/2 NONE QAM16 2k 1/32 NONE -+T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 746167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 778167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 802167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 826167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 729833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Pontypool dvb-apps/util/scan/dvb-t/uk-Pontypool ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Pontypool 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Pontypool 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Pontypool -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 722000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 690000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 642000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 482167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Presely dvb-apps/util/scan/dvb-t/uk-Presely ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Presely 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Presely 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Presely -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 714167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 618000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 641833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 665833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Redruth dvb-apps/util/scan/dvb-t/uk-Redruth ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Redruth 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Redruth 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,10 @@ --# Redruth, Cornwall -+# UK, Redruth -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy - T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 642167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 666167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 650167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 705833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Reigate dvb-apps/util/scan/dvb-t/uk-Reigate ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Reigate 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Reigate 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,10 @@ --# Reigate -+# UK, Reigate -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 554000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 554000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 474000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 498000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 522000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 618167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 834000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-RidgeHill dvb-apps/util/scan/dvb-t/uk-RidgeHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-RidgeHill 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-RidgeHill 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Ridge Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 730000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 762000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 786000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 810000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rosemarkie dvb-apps/util/scan/dvb-t/uk-Rosemarkie ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rosemarkie 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Rosemarkie 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Rosemarkie -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 714167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 633833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 657833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 674167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 706167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rosneath dvb-apps/util/scan/dvb-t/uk-Rosneath ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rosneath 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Rosneath 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Rosneath -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 842000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 729833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 761833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 785833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 809833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rowridge dvb-apps/util/scan/dvb-t/uk-Rowridge ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rowridge 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Rowridge 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,10 @@ --# Rowridge, Isle of Wight -+# UK, Rowridge -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 489833333 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 489833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 530000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 545833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-RumsterForest dvb-apps/util/scan/dvb-t/uk-RumsterForest ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-RumsterForest 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-RumsterForest 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Rumster Forest -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 506167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 802000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 778000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Saddleworth dvb-apps/util/scan/dvb-t/uk-Saddleworth ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Saddleworth 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Saddleworth 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Saddleworth -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 682000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 633833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 657833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 713833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 618167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 738000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Salisbury dvb-apps/util/scan/dvb-t/uk-Salisbury ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Salisbury 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Salisbury 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Salisbury -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 745833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 753833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 777833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 801833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 826000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 721833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-SandyHeath dvb-apps/util/scan/dvb-t/uk-SandyHeath ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-SandyHeath 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-SandyHeath 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,10 @@ --# Sandy Heath -+# UK, Sandy Heath -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 641833334 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 641833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 665833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 650167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 842000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 626167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 674167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Selkirk dvb-apps/util/scan/dvb-t/uk-Selkirk ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Selkirk 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Selkirk 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Selkirk -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 730167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 762167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 786167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 810167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 834167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Sheffield dvb-apps/util/scan/dvb-t/uk-Sheffield ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Sheffield 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Sheffield 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Sheffield -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 730000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 762000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 786000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-StocklandHill dvb-apps/util/scan/dvb-t/uk-StocklandHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-StocklandHill 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-StocklandHill 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Stockland Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 481833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 529833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 505833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 561833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Storeton dvb-apps/util/scan/dvb-t/uk-Storeton ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Storeton 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Storeton 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,10 @@ --# Storeton, Wirral -+# UK, Storeton -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy - T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 490167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 514167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Sudbury dvb-apps/util/scan/dvb-t/uk-Sudbury ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Sudbury 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Sudbury 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+# UK, Sudbury -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 698167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 850000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 690167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 738000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 706167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+# UK, Sudbury B -+T 754000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-SuttonColdfield dvb-apps/util/scan/dvb-t/uk-SuttonColdfield ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-SuttonColdfield 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-SuttonColdfield 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Sutton Coldfield -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 634167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 658167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 682167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 722167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 746000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Tacolneston dvb-apps/util/scan/dvb-t/uk-Tacolneston ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Tacolneston 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Tacolneston 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Tacolneston -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 810000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 786000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 730167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 769833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 794000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 818000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-TheWrekin dvb-apps/util/scan/dvb-t/uk-TheWrekin ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-TheWrekin 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-TheWrekin 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,15 @@ -+# UK, The Wrekin -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 554000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 498167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 522167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 730000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 762000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+# UK, The Wrekin B -+T 618167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 698000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 642000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Torosay dvb-apps/util/scan/dvb-t/uk-Torosay ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Torosay 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Torosay 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Torosay -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 490167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 514167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 538167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 553833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-TunbridgeWells dvb-apps/util/scan/dvb-t/uk-TunbridgeWells ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-TunbridgeWells 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-TunbridgeWells 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Tunbridge Wells -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 746000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 794000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 642167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 666167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 778000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Waltham dvb-apps/util/scan/dvb-t/uk-Waltham ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Waltham 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Waltham 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Waltham -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 698000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 490000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 514000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 570000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Wenvoe dvb-apps/util/scan/dvb-t/uk-Wenvoe ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Wenvoe 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-Wenvoe 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Wenvoe -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 578000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 625833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 705833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 649833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 673833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-WhitehawkHill dvb-apps/util/scan/dvb-t/uk-WhitehawkHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-WhitehawkHill 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-WhitehawkHill 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,10 @@ -+# UK, Whitehawk Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 834000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 706000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 746000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 770167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 794167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-WinterHill dvb-apps/util/scan/dvb-t/uk-WinterHill ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-WinterHill 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/uk-WinterHill 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,13 @@ --# Winter Hill, North-West England -+# UK, Winter Hill -+# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html -+# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html - # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy --T 754166670 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 834167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 850167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE -+T 842167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 786167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 810167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+# UK, Winter Hill B -+T 650000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -+T 626000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/vn-Hanoi dvb-apps/util/scan/dvb-t/vn-Hanoi ---- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/vn-Hanoi 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/dvb-t/vn-Hanoi 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,5 @@ -+# Hanoi - Vietnam - DVB-T by VTC -+# contributed by Pham Thanh Nam -+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy -+T 514000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE -+T 578000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/list.h dvb-apps/util/scan/list.h ---- linuxtv-dvb-apps-1.1.1/util/scan/list.h 2006-05-18 01:33:27.000000000 +0200 -+++ dvb-apps/util/scan/list.h 2009-06-21 13:29:06.000000000 +0200 -@@ -26,7 +26,7 @@ - } while (0) - - /* -- * Insert a new entry between two known consecutive entries. -+ * Insert a new entry between two known consecutive entries. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! -@@ -98,7 +98,7 @@ - static __inline__ void list_del_init(struct list_head *entry) - { - __list_del(entry->prev, entry->next); -- INIT_LIST_HEAD(entry); -+ INIT_LIST_HEAD(entry); - } - - /** -@@ -126,7 +126,7 @@ - */ - #define list_for_each(pos, head) \ - for (pos = (head)->next; pos != (head); pos = pos->next) -- -+ - /** - * list_for_each_safe - iterate over a list safe against removal of list entry - * @pos: the &struct list_head to use as a loop counter. -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/lnb.c dvb-apps/util/scan/lnb.c ---- linuxtv-dvb-apps-1.1.1/util/scan/lnb.c 2006-05-18 01:33:25.000000000 +0200 -+++ dvb-apps/util/scan/lnb.c 2009-06-21 13:29:06.000000000 +0200 -@@ -1,6 +1,7 @@ - #include - #include - #include -+#include - #include "lnb.h" - - static char *univ_desc[] = { -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/lnb.h dvb-apps/util/scan/lnb.h ---- linuxtv-dvb-apps-1.1.1/util/scan/lnb.h 2006-05-18 01:33:27.000000000 +0200 -+++ dvb-apps/util/scan/lnb.h 2009-06-21 13:29:06.000000000 +0200 -@@ -1,4 +1,3 @@ -- - struct lnb_types_st { - char *name; - char **desc; -@@ -21,4 +20,3 @@ - - int - lnb_decode(char *str, struct lnb_types_st *lnbp); -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/Makefile dvb-apps/util/scan/Makefile ---- linuxtv-dvb-apps-1.1.1/util/scan/Makefile 2006-05-18 01:34:53.000000000 +0200 -+++ dvb-apps/util/scan/Makefile 2009-06-21 13:29:06.000000000 +0200 -@@ -1,21 +1,41 @@ -+# Makefile for linuxtv.org dvb-apps/util/scan - --CC = gcc --CFLAGS = -MD -g -Wall -O2 -I../../include --LFLAGS = -g -Wall -+objects = atsc_psip_section.o \ -+ diseqc.o \ -+ dump-vdr.o \ -+ dump-zap.o \ -+ lnb.o \ -+ scan.o \ -+ section.o - --OBJS = diseqc.o dump-zap.o dump-vdr.o scan.o lnb.o section.o atsc_psip_section.o --SRCS = $(OBJS:.o=.c) -+binaries = scan - --TARGET = scan -+inst_bin = $(binaries) - --$(TARGET): $(OBJS) -- $(CC) $(LFLAGS) -o $(TARGET) $(OBJS) -+removing = atsc_psip_section.c atsc_psip_section.h - --.c.o: -- $(CC) $(CFLAGS) -c $< -o $@ -+CPPFLAGS += -DDATADIR=\"$(prefix)/share\" - --clean: -- $(RM) *.o *.d $(TARGET) -+.PHONY: all - ---include $(wildcard *.d) dummy -+all: $(binaries) -+ -+$(binaries): $(objects) - -+$(objects): atsc_psip_section.c atsc_psip_section.h -+ -+atsc_psip_section.c atsc_psip_section.h: -+ perl section_generate.pl atsc_psip_section.pl -+ -+include ../../Make.rules -+ -+install:: -+ @echo installing scan files -+ @mkdir -p $(DESTDIR)$(sharedir)/dvb/atsc -+ @mkdir -p $(DESTDIR)$(sharedir)/dvb/dvb-c -+ @mkdir -p $(DESTDIR)$(sharedir)/dvb/dvb-s -+ @mkdir -p $(DESTDIR)$(sharedir)/dvb/dvb-t -+ @install -m 664 atsc/* $(DESTDIR)$(sharedir)/dvb/atsc/ -+ @install -m 664 dvb-c/* $(DESTDIR)$(sharedir)/dvb/dvb-c/ -+ @install -m 664 dvb-s/* $(DESTDIR)$(sharedir)/dvb/dvb-s/ -+ @install -m 664 dvb-t/* $(DESTDIR)$(sharedir)/dvb/dvb-t/ -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/README dvb-apps/util/scan/README ---- linuxtv-dvb-apps-1.1.1/util/scan/README 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/scan/README 2009-06-21 13:29:06.000000000 +0200 -@@ -1,18 +1,20 @@ --Hi, -+This is a little channel scan utility to generate szap/tzap/czap/azap -+compatible channel lists. An atsc/dvbscan does not do a frequency scan, however, -+so you must manually provide the data for tuning to one or more start -+transponders. A number of initial-tuning-data files are provided for various -+dvb-c, dvb-s, dvb-t and atsc networks around the world. If you make a new one -+feel free to submit it to the linux-dvb mailing list -+http://www.linuxtv.org/lists.php. - --this is a little channel scan utility to generate szap/tzap/czap compatible --channel lists. Scan does not do a frequency scan, however, so you must --manually provide the data for tuning to one or more start transponders. --A number of initial-tuning-data files are provided for various dvb-c, dvb-s --and dvb-t networks around the world. If you make a new one feel free to --submit it to the linux-dvb mailing list http://linuxtv.org/mailinglists.xml. -+Basic usage: ./dvbscan dvb-s/Astra-19.2E | tee mychannels.conf -+or ./atscscan atsc/us-NTSC-center-frequencies-8VSB - --Basic usage: ./scan dvb-s/Astra-19.2E | tee mychannels.conf -+If you want it to check a specific frequency, tune to that frequency -+(e.g. using szap/tzap/czap/azap) and then use './dvbscan -c' or './atscscan -c'. - --If you want it to check a specific frequency, tune to that frequency --(e.g. using szap/tzap/czap) and then use './scan -c'. -+For more scan options see ./dvbscan -h or ./atscscan -h - --For more scan options see ./scan -h. -+atscscan is _just_ a copy of dvbscan to not confuse ATSC-user. - - Good luck, --Holger + Johannes -+Holger + Johannes + Patrick (beat me for ATSC) -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/scan.c dvb-apps/util/scan/scan.c ---- linuxtv-dvb-apps-1.1.1/util/scan/scan.c 2006-05-18 01:33:25.000000000 +0200 -+++ dvb-apps/util/scan/scan.c 2009-06-21 13:29:06.000000000 +0200 -@@ -61,9 +61,9 @@ - static int vdr_dump_channum; - static int no_ATSC_PSIP; - static int ATSC_type=1; --static int ca_select = 1; -+static int ca_select = -1; - static int serv_select = 7; --static int vdr_version = 2; -+static int vdr_version = 3; - static struct lnb_types_st lnb_type; - static int unique_anon_services; - -@@ -130,6 +130,7 @@ - struct list_head list; - struct list_head services; - int network_id; -+ int original_network_id; - int transport_stream_id; - enum fe_type type; - struct dvb_frontend_parameters param; -@@ -236,6 +237,7 @@ - static void copy_transponder(struct transponder *d, struct transponder *s) - { - d->network_id = s->network_id; -+ d->original_network_id = s->original_network_id; - d->transport_stream_id = s->transport_stream_id; - d->type = s->type; - memcpy(&d->param, &s->param, sizeof(d->param)); -@@ -755,12 +757,15 @@ - switch (buf[0]) { - case 0x01: - case 0x02: -+ case 0x1b: /* H.264 video stream */ - moreverbose(" VIDEO : PID 0x%04x\n", elementary_pid); - if (s->video_pid == 0) - s->video_pid = elementary_pid; - break; - case 0x03: - case 0x81: /* Audio per ATSC A/53B [2] Annex B */ -+ case 0x0f: /* ADTS Audio Stream - usually AAC */ -+ case 0x11: /* ISO/IEC 14496-3 Audio with LATM transport */ - case 0x04: - moreverbose(" AUDIO : PID 0x%04x\n", elementary_pid); - if (s->audio_num < AUDIO_CHAN_MAX) { -@@ -772,6 +777,12 @@ - warning("more than %i audio channels, truncating\n", - AUDIO_CHAN_MAX); - break; -+ case 0x07: -+ moreverbose(" MHEG : PID 0x%04x\n", elementary_pid); -+ break; -+ case 0x0B: -+ moreverbose(" DSM-CC : PID 0x%04x\n", elementary_pid); -+ break; - case 0x06: - if (find_descriptor(0x56, buf + 5, ES_info_len, NULL, NULL)) { - moreverbose(" TELETEXT : PID 0x%04x\n", elementary_pid); -@@ -860,6 +871,7 @@ - memset(&tn, 0, sizeof(tn)); - tn.type = -1; - tn.network_id = network_id; -+ tn.original_network_id = (buf[2] << 8) | buf[3]; - tn.transport_stream_id = transport_stream_id; - - parse_descriptors (NIT, buf + 6, descriptors_loop_len, &tn); -@@ -1462,21 +1474,34 @@ - } - - if (t->type == FE_QPSK) { -- int hiband = 0; -+ if (lnb_type.high_val) { -+ if (lnb_type.switch_val) { -+ /* Voltage-controlled switch */ -+ int hiband = 0; - -- if (lnb_type.switch_val && lnb_type.high_val && -- p.frequency >= lnb_type.switch_val) -- hiband = 1; -+ if (p.frequency >= lnb_type.switch_val) -+ hiband = 1; - -- setup_switch (frontend_fd, -- switch_pos, -- t->polarisation == POLARISATION_VERTICAL ? 0 : 1, -- hiband); -- usleep(50000); -- if (hiband) -- p.frequency = abs(p.frequency - lnb_type.high_val); -- else -+ setup_switch (frontend_fd, -+ switch_pos, -+ t->polarisation == POLARISATION_VERTICAL ? 0 : 1, -+ hiband); -+ usleep(50000); -+ if (hiband) -+ p.frequency = abs(p.frequency - lnb_type.high_val); -+ else -+ p.frequency = abs(p.frequency - lnb_type.low_val); -+ } else { -+ /* C-Band Multipoint LNBf */ -+ p.frequency = abs(p.frequency - (t->polarisation == POLARISATION_VERTICAL ? -+ lnb_type.low_val: lnb_type.high_val)); -+ } -+ } else { -+ /* Monopoint LNBf without switch */ - p.frequency = abs(p.frequency - lnb_type.low_val); -+ } -+ if (verbosity >= 2) -+ dprintf(1,"DVB-S IF freq is %d\n",p.frequency); - } - - if (ioctl(frontend_fd, FE_SET_FRONTEND, &p) == -1) { -@@ -1991,7 +2016,7 @@ - //FIXME: s->subtitling_pid - s->ac3_pid, - s->service_id, -- t->network_id, -+ t->original_network_id, - s->transport_stream_id, - t->orbital_pos, - t->we_flag, -@@ -2066,14 +2091,15 @@ - " -5 multiply all filter timeouts by factor 5\n" - " for non-DVB-compliant section repitition rates\n" - " -o fmt output format: 'zap' (default), 'vdr' or 'pids' (default with -c)\n" -- " -x N Conditional Axcess, (default 1)\n" -+ " -x N Conditional Access, (default -1)\n" - " N=0 gets only FTA channels\n" -+ " N=-1 gets all channels\n" - " N=xxx sets ca field in vdr output to :xxx:\n" - " -t N Service select, Combined bitfield parameter.\n" - " 1 = TV, 2 = Radio, 4 = Other, (default 7)\n" - " -p for vdr output format: dump provider name\n" -- " -e N VDR version, default 2 for VDR-1.2.x\n" -- " ANYTHING ELSE GIVES NONZERO NIT and TID\n" -+ " -e N VDR version, default 3 for VDR-1.3.x and newer\n" -+ " value 2 sets NIT and TID to zero\n" - " Vdr version 1.3.x and up implies -p.\n" - " -l lnb-type (DVB-S Only) (use -l help to print types) or \n" - " -l low[,high[,switch]] in Mhz\n" -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/scan.h dvb-apps/util/scan/scan.h ---- linuxtv-dvb-apps-1.1.1/util/scan/scan.h 2006-05-18 01:33:27.000000000 +0200 -+++ dvb-apps/util/scan/scan.h 2009-06-21 13:29:06.000000000 +0200 -@@ -26,4 +26,3 @@ - #define verbosedebug(msg...) dpprintf(6, msg) - - #endif -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/section_generate.pl dvb-apps/util/scan/section_generate.pl ---- linuxtv-dvb-apps-1.1.1/util/scan/section_generate.pl 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/scan/section_generate.pl 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,92 @@ -+#!/usr/bin/perl -w -+ -+use strict; -+ -+die "no section perl file given" unless @ARGV; -+ -+my $h = require($ARGV[0]); -+ -+our $basename; -+our $debug = $ARGV[1]; -+ -+($basename) = $ARGV[0] =~ /([a-zA-Z0-9_\-_]+).pl/; -+ -+local *H; -+local *C; -+ -+h_header(); -+c_header(); -+ -+foreach (sort keys %{$h}) { -+ foreach my $item (@{$h->{$_}}) { -+ if ($_ eq "descriptors") { -+ printf H ("#define %s_ID 0x%02X\n",uc($item->{name}),$item->{id}); -+ } -+ -+ do_it ($item->{name},$item->{elements}); -+ } -+} -+ -+h_footer(); -+c_footer(); -+ -+sub type -+{ -+ if ($_[0] > 16) { -+ return "u32"; -+ } elsif ($_[0] > 8) { -+ return "u16"; -+ } else { -+ return "u8 "; -+ } -+} -+ -+sub do_it -+{ -+ my ($name,$val) = @_; -+ print H "struct $name {\n"; -+ -+ print C <[$i+1]),$val->[$i],$val->[$i+1]); -+ -+ printf C ("\tv.%-25s = getBits(b,%3d,%2d);\n",$val->[$i],$offs,$val->[$i+1]); -+ printf C ("\tfprintf(stderr,\" %s = %%x %%d\\n\",v.%s,v.%s);\n",$val->[$i],$val->[$i],$val->[$i]) if $debug; -+ $offs += $val->[$i+1]; -+ } -+ print H "} PACKED;\n"; -+ print H "struct $name read_$name(const u8 *);\n\n"; -+ -+ print C "\treturn v;\n}\n\n" -+} -+ -+sub h_header -+{ -+ open(H,">$basename.h"); -+ print H "#ifndef __".uc($basename)."_H_\n"; -+ print H "#define __".uc($basename)."_H_\n\n"; -+ print H "#include \"section.h\"\n\n"; -+} -+ -+sub c_header -+{ -+ open(C,">$basename.c"); -+ print C "#include \"$basename.h\"\n\n"; -+} -+ -+ -+sub c_footer -+{ -+ close(C); -+} -+ -+sub h_footer -+{ -+ print H "#endif\n"; -+ close(H); -+} -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/azap.c dvb-apps/util/szap/azap.c ---- linuxtv-dvb-apps-1.1.1/util/szap/azap.c 2006-05-18 01:31:40.000000000 +0200 -+++ dvb-apps/util/szap/azap.c 2009-06-21 13:29:06.000000000 +0200 -@@ -103,7 +103,10 @@ - return -3; /* to fit in 32 bit */ - }; - -+ errno = 0; - *val = strtol(number, NULL, 10); -+ if (errno == ERANGE) -+ return -4; - - return 0; - } -@@ -189,9 +192,9 @@ - - if ((err = try_parse_param(fd, - modulation_list, LIST_SIZE(modulation_list), -- (int *) &frontend->u.vsb.modulation, -- "modulation"))) -+ &tmp, "modulation"))) - return -4; -+ frontend->u.vsb.modulation = tmp; - - if ((err = try_parse_int(fd, vpid, "Video PID"))) - return -5; -@@ -389,4 +392,3 @@ - - return 0; - } -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/atsc/make_atsc_chanconf.pl dvb-apps/util/szap/channels-conf/atsc/make_atsc_chanconf.pl ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/atsc/make_atsc_chanconf.pl 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/atsc/make_atsc_chanconf.pl 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,110 @@ -+#!/usr/bin/perl -+ -+# Angel Li sent me this script to help in setting up a -+# ~/.azap/channels.conf file automagicly. This probbably -+# isn't the final version -+ -+ use LWP; -+ use HTML::Form; -+ use HTTP::Cookies; -+ use XML::XPath; -+ use XML::XPath::XMLParser; -+ -+ #$DEBUG = 1; -+ -+ # -+ # Center frequencies for NTSC channels -+ # -+ @ntsc = ( -+ 0, 0, 57, 63, 69, 79, 85, 177, 183, 189, -+ 195, 201, 207, 213, 473, 479, 485, 491, 497, 503, -+ 509, 515, 521, 527, 533, 539, 545, 551, 557, 563, -+ 569, 575, 581, 587, 593, 599, 605, 611, 617, 623, -+ 629, 635, 641, 647, 653, 659, 665, 671, 677, 683, -+ 689, 695, 701, 707, 713, 719, 725, 731, 737, 743, -+ 749, 755, 761, 767, 773, 779, 785, 791, 797, 803, -+ ); -+ -+ $ZIPCODE = 'txtZipcode'; -+ $XML = 'stationXml'; -+ $WEBSITE = 'http://www.antennaweb.org'; -+ -+ $zipCode = $ARGV[0]; -+ unless ($zipCode) { -+ die "Zipcode missing on the command line"; -+ } -+ unless ($zipCode =~ /^\d\d\d\d\d$/) { -+ die "Illegal zipcode: $zipCode"; -+ } -+ -+ $ua = LWP::UserAgent->new; -+ $ua->cookie_jar({}); -+ push @{$ua->requests_redirectable}, 'POST'; -+ $response = $ua->get($WEBSITE); -+ if ($response->is_success) { -+ $form = HTML::Form->parse($response); -+ $request = $form->click("btnStart"); -+ $response2 = $ua->request($request); -+ if ($response2->is_success) { -+ $form2 = HTML::Form->parse($response2); -+ $form2->param($ZIPCODE, $zipCode); -+ $request2 = $form2->click("btnSubmit"); -+ $response3 = $ua->request($request2); -+ $form3 = HTML::Form->parse($response3); -+ $request3 = $form3->click("btnContinue"); -+ $response4 = $ua->request($request3); -+ if ($response4->is_success) { -+ $form4 = HTML::Form->parse($response4); -+ $xml = $form4->value($XML); -+ $xml =~ s/%22/"/g; -+ $xml =~ s/%2c/,/g; -+ $xml =~ s/%2f/\//g; -+ $xml =~ s/%3c//g; -+ $xml =~ s/\+/ /g; -+ genConf($xml); -+ exit(0); -+ } -+ else { -+ print STDERR "Could not submit zipcode: $zipCode\n"; -+ die $response3->status_line; -+ } -+ } -+ print STDERR "Could not reach zipcode page"; -+ die $response2->status_line; -+ } -+ else { -+ print STDERR "Error reaching $WEBSITE\n"; -+ die $response->status_line; -+ } -+ -+ sub genConf { -+ my($xml) = @_; -+ my($s); -+ my($callSign); -+ my($channel); -+ my($c); -+ my($psipChannel); -+ my($freq); -+ -+ $xp = XML::XPath->new(xml => $xml); -+ foreach $s ($xp->find('//Station[BroadcastType="D"]')->get_nodelist) { -+ if ($s->find('LiveStatus')->string_value eq "1") { -+ $callSign = $s->find('CallSign')->string_value; -+ $callSign =~ s/-DT//; -+ $channel = $s->find('Channel')->string_value; # Channel to tune -+ $psipChannel = $s->find('PsipChannel')->string_value; -+ -+ if ($DEBUG) { -+ print STDERR $callSign, "\t", $channel, " -> ", $psipChannel, "\n"; -+ } -+ -+ $psipChannel =~ s/\.\d+$//; -+ $freq = $ntsc[$channel]*1000000; -+ if ($freq) { -+ print $callSign, ":", $freq, ":8VSB:0:0\n"; -+ } -+ } -+ } -+ } -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/atsc/us-Raleigh-Durham dvb-apps/util/szap/channels-conf/atsc/us-Raleigh-Durham ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/atsc/us-Raleigh-Durham 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/atsc/us-Raleigh-Durham 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,8 @@ -+# Most of the major channels in the Raleigh Durham Area. Frequencies the NTSC center freq. -+WRAL:707000000:8VSB:33:36 -+WNCN:719000000:8VSB:49:52 -+WTVD:701000000:8VSB:49:52 -+WRAZ:683000000:8VSB:49:52 -+WUNC:743000000:8VSB:49:52 -+WRDU:551000000:8VSB:33:36 -+WLFL:731000000:8VSB:33:36 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-c/de-Berlin dvb-apps/util/szap/channels-conf/dvb-c/de-Berlin ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-c/de-Berlin 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-c/de-Berlin 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,171 @@ -+3sat:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:210:220 -+ARD-Online-Kanal:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1805 -+CNBC:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:510:520 -+DLF-Köln:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:810 -+DLR-Berlin:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:710 -+EinsExtra:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:101:102 -+EinsFestival:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:201:202 -+EinsMuXx:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:301:302 -+EuroNews:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2221:2233 -+Eurosport:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:410:420 -+Fritz:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:901 -+KiKa:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:310:320 -+MDR FERNSEHEN:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:401:402 -+MDR KULTUR:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:801 -+MDR info:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1101 -+MHP ARD Online-Kanal:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:102 -+NDR Fernsehen:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2401:2402 -+ORB-Fernsehen:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:501:502 -+RADIOmultikulti:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1301 -+Radio 3:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:701 -+SFB1:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:601:602 -+SWR2:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1401 -+SÜDWEST BW:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:801:802 -+SÜDWEST RP:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3101:3102 -+WDR 3:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1501 -+WDR 5:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1601 -+ZDF:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:110:120 -+ZDFdigitext:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+ZDFdokukanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:660:670 -+ZDFinfokanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:610:620 -+ZDFtheaterkanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+JUMP:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1001 -+SPUTNIK:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1201 -+Österreich 1:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:169 -+ATV 2:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:631:632 -+ATV 2:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:631:632 -+Adagio:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+All Jazz:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Avante:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:741:743 -+B5 aktuell:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3101 -+BBC Prime:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:761:762 -+BData3:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+BData4:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+BData5:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+BR-alpha:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702 -+Barock Fantasie:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Bayerisches FS:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:201:202 -+Bayern 1:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3601 -+Bayern 4 Klassik:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3001 -+BibelTV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:731:732 -+Bloomberg:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+CLASSICA:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:767:768 -+COUNTRY:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:656 -+Canal 24 Horas:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:991:992 -+Club:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:711:713 -+Cristal New Age:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+DANCE:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:304 -+DW-tv:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:634:632 -+Das Erste:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:101:102 -+Detskij Mir:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:931:932 -+ERT-Sat:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:691:692 -+Einstein TV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702 -+Euronews:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:597:596 -+Eurosport News:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:771:772 -+Extreme Sports:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:791:793 -+Extreme Sports:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Fashion TV:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Fox Kids:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:671:672 -+Fox Kids:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:671:673 -+GOLD:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:320 -+HITLISTE:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:784 -+HR XXL:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3501 -+JAZZ:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:640 -+Jazz legends:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Kabel Wizard:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Kanal 7:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Kanal 7:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:49:52 -+Kanal D:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:651:652 -+Kanal D:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:651:652 -+LATIN:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:368 -+Landscape:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Leitseite:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2254:0 -+Liberty TV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:721:723 -+MTV Base:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:781:782 -+MV-Test:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Modem-Setup:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Movie Sounds:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Musica Antica:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+Musica Camerata:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+NDR Info:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3701 -+NTV international:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+NTVI:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:611:612 -+Nashe Kino:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:621:622 -+NordwestRadio:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3801 -+OLD GOLD:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:336 -+Opernfestival:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+PCNE:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:681:682 -+PREMIERE SPORT INTERACTIVE:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+PREMIERE DIREKT 1:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+PREMIERE DIREKT 2:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+PREMIERE DIREKT 3:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+PREMIERE DIREKT 4:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2815:2816 -+PREMIERE EROTIK:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280 -+PREMIERE NOSTALGIE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2559:2560 -+PREMIERE SERIE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024 -+PREMIERE SPORT 1:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:258 -+PREMIERE SPORT 2:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3839:3840 -+PREMIERE START:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:256 -+Parlamentsfernsehen:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:33:36 -+Phoenix:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:901:902 -+Portal:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+RTP Internacional:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:661:662 -+Rai 1:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:951:952 -+Rai 2:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:961:962 -+Rai 3:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:971:972 -+SCHLAGER:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:384 -+SR 1:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3901 -+SR Fernsehen Suedwest:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:501:502 -+Show TV:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:911:912 -+Sinfonica:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+TGRT:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:921:922 -+TM V1.0:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+TV Polonia:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:641:642 -+TVEi:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:981:982 -+TW1:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:751:752 -+Test-R:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702 -+Travel:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:595:594 -+VCR-Setup:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+VH1 Classic:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:604:603 -+Videotext:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+WDR FERNSEHEN:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:601:602 -+ZEE TV:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+arte:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:401:403 -+hessen fernsehen:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:301:302 -+hr-chronos:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3201 -+hr-klassik:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3401 -+hr2:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3301 -+13 TH STREET:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2303:2304 -+ALTERNATIVE ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:544 -+BEATE-UHSE.TV:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024 -+CHILLOUT:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:400 -+CLASSIC ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:352 -+DISCOVERY CHANNEL:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1792 -+DISNEY CHANNEL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2559:2560 -+DEUTSCHE HITS:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:800 -+EASY LISTENING:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:608 -+Einstein:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+FILM & MUSICAL:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:592 -+FOX KIDS:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280 -+GOLDSTAR TV:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3839:3840 -+HARD ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:816 -+HEIMATKANAL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536 -+HIP HOP/R&B:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:576 -+JUNIOR:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:256 -+K-TOON:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -+KLASSIK POPULÄR:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:624 -+KRIMI &CO:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536 -+LOVE SONGS:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:592 -+NEW COUNTRY:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:384 -+ORCHESTRALE WERKE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:560 -+PLANET:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1792 -+PREMIERE 1:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:511:512 -+PREMIERE 2:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1793 -+PREMIERE 3:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2303:2304 -+PREMIERE 4:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:767:768 -+PREMIERE 5:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280 -+PREMIERE 6:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536 -+PREMIERE 7:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024 -+SOUL CLASSICS:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:352 -+STUDIO UNIVERSAL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2047:2048 -+Sonnenklar TV:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/Astra-19.2E dvb-apps/util/szap/channels-conf/dvb-s/Astra-19.2E ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/Astra-19.2E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-s/Astra-19.2E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,226 @@ -+Das Erste:11837:h:0:27500:101:102:28106 -+ZDF:11954:h:0:27500:110:120:28006 -+3sat:11954:h:0:27500:210:220:28007 -+EinsMuXx:12110:h:0:27500:301:302:28203 -+EinsFestival:12110:h:0:27500:201:202:28202 -+EinsExtra:12110:h:0:27500:101:102:28201 -+MDR FERNSEHEN:12110:h:0:27500:401:402:28204 -+ORB-Fernsehen:12110:h:0:27500:501:502:28205 -+B1 Berlin:12110:h:0:27500:601:602:28206 -+SWR Fernsehen:11837:h:0:27500:801:802:28113 -+SR Fernsehen Suedwes:11837:h:0:27500:501:502:28110 -+hessen fernsehen:11837:h:0:27500:301:302:28108 -+WDR FERNSEHEN:11837:h:0:27500:601:602:28111 -+Bayerisches FS:11837:h:0:27500:201:202:28107 -+N3:12110:h:0:27500:2401:2402:28224 -+BR-alpha:11837:h:0:27500:701:702:28112 -+KiKa:11954:h:0:27500:310:320:28008 -+arte:11836:h:0:27500:401:402:28109 -+ZDF Theaterkanal:11954:h:0:27500:1110:1120:28016 -+ZDF.info:11954:h:0:27500:610:620:28011 -+ZDF.doku:11954:h:0:27500:660:670:28014 -+Phoenix:11837:h:0:27500:901:902:28114 -+DW-tv:10786:v:0:21997:305:306:9005 -+RTL Television:12188:h:0:27500:163:104:12003 -+SAT.1:12480:v:0:27500:1791:1792:46 -+ProSieben:12480:v:0:27500:255:256:898 -+RTL2:12188:h:0:27500:166:128:12020 -+Super RTL:12188:h:0:27500:165:120:12040 -+KABEL1:12480:v:0:27500:511:512:899 -+VOX:12188:h:0:27500:167:136:12060 -+tm3:12480:v:0:27500:767:768:897 -+Bloomberg TV Germany:12552:v:0:22000:162:99:12160 -+EuroNews:11954:h:0:27500:2221:2233:28015 -+N24:12480:v:0:27500:2047:2048:47 -+n-tv:12670:v:0:22000:162:96:12730 -+DSF:12480:v:0:27500:1023:1024:900 -+Eurosport:11954:h:0:27500:410:420:28009 -+Via 1 - Sch ner Re:12148:h:0:27500:511:512:44 -+Home Order Tel:12480:v:0:27500:1279:1280:40 -+QVC GERMANY:12552:v:0:22000:165:166:12100 -+TW 1:12692:h:0:22000:166:167:13013 -+Canal Canarias:12441:v:0:27500:513:681:29700 -+ProSieben A:12051:v:0:27500:161:84:20002 -+ProSieben CH:12051:v:0:27500:289:290:20001 -+Kabel 1 Austria:12051:v:0:27500:166:167:20004 -+Kabel 1 Schweiz:12051:v:0:27500:162:163:20003 -+CNN Int.:12168:v:0:27500:165:100:28512 -+Sky News:12552:v:0:22000:305:306:3995 -+Travel:12168:v:0:27500:163:92:28001 -+AB SAT / XXL:12266:h:0:27500:164:96:17004 -+MOTEURS:12266:h:0:27500:160:80:17000 -+HOT GM:12148:h:0:27500:767:768:45 -+KTO:12129:v:0:27500:170:120:8411 -+LA CINQUIEME:12207:v:0:27500:160:80:8501 -+LCP:12207:v:0:27500:165:100:8506 -+LibertyTV.com:12611:v:0:22000:941:942:12280 -+TV5 Europe:12611:v:0:22000:45:46:12240 -+Motors TV:12611:v:0:22000:191:194:12300 -+Wishline:12611:v:0:22000:214:216:12320 -+TV 5:10786:v:0:21997:164:112:9001 -+RTM - MAROC:10786:v:0:21997:162:96:9002 -+ESC1 - EGYPTE:10786:v:0:21997:163:104:9003 -+RAI 1:10786:v:0:21997:289:290:9004 -+RTPI:10786:v:0:21997:300:301:9006 -+TV7:10786:v:0:21997:166:128:9007 -+ARTE:10786:v:0:21997:167:136:9009 -+Colourbars:12611:v:0:22000:48:49:3982 -+Alice:12611:v:0:22000:162:96:12200 -+Video Italia:12611:v:0:22000:121:122:12220 -+ANDALUCIA TV:11934:v:0:27500:166:104:29011 -+TVC INT.:12441:v:0:27500:512:660:29701 -+TV4:11992:h:0:27500:165:98:20365 -+TV Niepokalanow:11876:h:0:27500:161:82:20601 -+VIVA:12670:v:0:22000:309:310:12732 -+VIVA ZWEI:12552:v:0:22000:171:172:12120 -+MTV Central:12699:v:0:22000:3031:3032:28643 -+ONYX:12692:h:1:27500:161:84:502 -+VIVA polska:11603:h:1:27500:190:191:611 -+DeeJay TV:11603:h:1:27500:160:161:602 -+NBC:11053:h:1:27500:550:551:8008 -+EWTN:10722:h:1:29900:1001:1201:4601 -+MTA INTL:10722:h:1:29900:1004:1204:4604 -+VOX:11053:h:1:27500:500:501:8002 -+SAT.1 A:11053:h:1:27500:511:512:8003 -+RTL2 AUSTRIA:11053:h:1:27500:520:521:8004 -+ZDF:11053:h:1:27500:570:571:8011 -+K-TV:11053:h:1:27500:580:581:8012 -+RTL Television:11053:h:1:27500:160:80:8001 -+ARTE:11059:v:1:6510:98:99:1 -+HOT Italia:11095:h:1:27500:4194:4195:3714 -+Olisat:11095:h:1:27500:33:34:3718 -+VIVA-POLSKA:11128:h:1:4340:98:99:1 -+DW-tv:11195:v:1:9099:101:102:5301 -+Canal 24 Horas:11203:h:1:3999:4130:4131:5301 -+TV5:11337:v:1:5631:512:640:1 -+SAT.1 CH:11603:h:1:27500:101:102:601 -+KurdSat:11603:h:1:27500:111:112:603 -+ARD "Das Erste":11603:h:1:27500:172:173:606 -+RTL 2 CH:11603:h:1:27500:175:176:609 -+Super RTL A:11603:h:1:27500:180:181:610 -+TV ROMANIA:11622:v:1:27500:227:247:10707 -+MRTV:11622:v:1:27500:222:242:10702 -+102.5 HIT Ch:11622:v:1:27500:224:244:10704 -+TLC SAT:11622:v:1:27500:225:245:10705 -+PRO-SAT:11622:v:1:27500:246:226:10706 -+Channel SUN:11622:v:1:27500:229:249:10709 -+Racing Channel:11622:v:1:27500:228:248:10708 -+3 ABN:11622:v:1:27500:221:241:10701 -+Bloom.Germany:11642:h:1:27500:1460:1420:4 -+Bloomberg TV UK:11642:h:1:27500:1560:1520:4 -+Sat 7:11642:h:1:27500:1660:1620:4 -+EDTV 1:11746:h:1:27500:4130:4131:9501 -+EDTV SPORT:11746:h:1:27500:4386:4387:9502 -+EDTV BUSINESS:11746:h:1:27500:4642:4643:9503 -+EDTV DRAMA:11746:h:1:27500:4898:4899:9504 -+RAI1:11765:v:1:27499:160:80:3401 -+RAI2:11765:v:1:27499:161:84:3402 -+RAI3:11765:v:1:27499:162:88:3403 -+RaiWayTEST2:11765:v:1:27499:516:654:3405 -+RAIMOSAICO:11765:v:1:27499:518:8191:3407 -+RAINews24:11803:v:1:27500:516:654:3301 -+CAMERA DEPUTATI:11803:v:1:27500:517:655:3302 -+TELEPACE:11803:v:1:27500:515:653:3304 -+RAISPORTSAT:11803:v:1:27500:512:650:3305 -+RAINettunoSAT2:11803:v:1:27500:513:651:3306 -+RAIeducational:11803:v:1:27500:514:652:3307 -+RAINettunoSAT1:11803:v:1:27500:519:657:3308 -+SAT2000:11803:v:1:27500:518:656:3309 -+I1:11918:v:1:27499:512:650:1 -+C5:11918:v:1:27499:513:660:2 -+R4:11918:v:1:27499:514:670:3 -+Telesierra:12091:h:1:27500:4160:4161:8704 -+C. Milagro:12091:h:1:27500:4368:4369:8711 -+Italia Sat:12091:h:1:27500:4600:4601:8728 -+TVE Internacional:12091:h:1:27500:4208:4209:8707 -+Fiesta:12091:h:1:27500:4432:4433:8720 -+Retelsat:12091:h:1:27500:4464:4465:8722 -+ART EUROPE:12013:h:1:27495:164:96:450 -+EGYPT SAT. CH. 2:12013:h:1:27495:166:104:470 -+IQRA:12013:h:1:27495:168:112:474 -+MAURITANIA TV:12110:v:1:27500:230:231:704 -+ARMENIA TV:12110:v:1:27500:240:241:705 -+SAILING CHANNEL:12110:v:1:27500:260:261:707 -+AL JAZEERA:12110:v:1:27500:270:271:708 -+Coming Soon TV:12110:v:1:27500:310:311:717 -+SaluteBenessere:12110:v:1:27500:320:321:718 -+AH-EDP1:12148:v:1:27499:96:97:7201 -+AH-EDP2:12148:v:1:27499:112:113:7202 -+Espresso:12148:v:1:27499:192:193:7203 -+Alice:12148:v:1:27499:160:161:7220 -+Nuvolari:12148:v:1:27499:176:177:7221 -+Leonardo:12148:v:1:27499:128:129:7222 -+AH-EDP3:12148:v:1:27499:36:37:7205 -+OTE Promo:12187:v:1:27500:517:655:1001 -+RTS SAT:12187:v:1:27500:519:657:1022 -+ERT SAT:12187:v:1:27500:514:652:1102 -+EXTRA:12187:v:1:27500:516:654:1106 -+TRIAL:12187:v:1:27500:513:651:1108 -+Minimax:11303:h:1:19540:300:301:3 -+TVN1:12209:h:1:5631:4194:4195:1 -+RR TEST:10978:v:1:8998:33:34:1 -+TV 5 Thailand:10978:v:1:8998:1057:1058:2 -+TEST-1:10978:v:1:8998:3105:3106:4 -+FASHION:12244:h:1:27500:123:133:103 -+AJARA TV:12244:h:1:27500:127:137:107 -+SLO-TV1:12300:v:1:27495:200:201:3201 -+POLONIA 1:12302:v:1:27500:205:206:3203 -+SUPER 1:12302:v:1:27500:207:208:3207 -+NAPOLI INT.:12302:v:1:27500:240:241:3210 -+MAGIC:12302:v:1:27500:245:246:3211 -+COUNTDOWN:12302:v:1:27500:235:236:3212 -+TBNE:12302:v:1:27500:230:231:3213 -+NAPOLI CHANNEL:12302:v:1:27500:227:228:3215 -+KURDISTAN TV:12302:v:1:27500:225:226:3214 -+ATLAS TV:12379:v:1:27500:3022:3032:3002 -+TELE 24 SWITZERLAND:12379:v:1:27500:3023:3033:3003 -+Abu Dhabi TV:12379:v:1:27500:3024:3034:3004 -+RTV MONTENEGRO:12379:v:1:27500:3026:3036:3006 -+JAAM-E-JAM 1:12436:h:1:27500:160:80:1 -+JAAM-E-JAM 2:12436:h:1:27500:161:82:2 -+SAHAR:12436:h:1:27500:162:84:3 -+SAHAR 2:12436:h:1:27500:163:86:4 -+IRINN:12436:h:1:27500:164:88:5 -+Musicmax:11303:h:1:19540:500:501:6 -+TEST:12474:h:1:27500:771:8191:10608 -+EbS:12474:h:1:27500:101:201:10601 -+MOU.2:12474:h:1:27500:42:43:10602 -+PINK PLUS:12474:h:1:27500:308:256:10605 -+LibertyTV.com:12474:h:1:27500:941:942:10603 -+2M Maroc:12474:h:1:27500:601:602:10607 -+ZEE TV:12474:h:1:27500:910:911:10604 -+WorldNet Europe:12483:v:1:8299:4260:4220:1 -+WorldNet:12483:v:1:8299:4560:4520:4 -+SICILIA INTERNATIONA:12519:v:1:27499:501:502:8309 -+SARDEGNA UNO:12519:v:1:27499:503:504:8310 -+EuroMed:12519:v:1:27499:510:511:8312 -+TGRT:12519:v:1:27499:505:506:8313 -+VIDEOLINA:12519:v:1:27499:515:516:8318 -+MEDIOLANUM:12538:h:1:27500:1131:1132:8987 -+www.travel:12538:h:1:27500:1180:1183:8992 -+MonteCarloSat:12538:h:1:27500:5126:5122:8877 -+Bulgaria TV:12538:h:1:27500:4612:4613:8827 -+TVN1:12571:h:1:5631:4194:4195:1 -+JSTV 1:12595:v:1:27500:2000:2001:8213 -+JSTV 2:12595:v:1:27500:2011:2013:8214 -+MBC:12595:v:1:27500:160:80:8201 -+ANN:12595:v:1:27500:161:84:8202 -+BET:12595:v:1:27500:167:108:8208 -+EuroNews:12595:v:1:27500:2221:2231:8211 -+Sharjah Arabs:12653:h:1:27500:1160:1120:1 -+Qatar Arabs:12653:h:1:27500:1260:1220:2 -+Saudi 1 Arabs:12653:h:1:27500:1360:1320:3 -+Kuwait Arabs:12653:h:1:27500:1460:1420:4 -+Libya Arabs:12653:h:1:27500:1560:1520:5 -+Sudan Arabs:12653:h:1:27500:1660:1620:6 -+Oman Arabs:12653:h:1:27500:1760:1720:7 -+Jordan Arabs:12653:h:1:27500:1860:1820:8 -+IRAQ TV:12653:h:1:27500:1960:1920:9 -+Dubai Sport:12653:h:1:27500:1060:1020:10 -+Digitaly:12672:v:1:27500:220:221:4203 -+Telemarket:12672:v:1:27500:350:351:4211 -+eVision:12672:v:1:27500:360:361:4214 -+Thai TV5:12672:v:1:27500:200:201:4201 -+Studio Europa:12672:v:1:27500:230:231:4204 -+Video Italia:12672:v:1:27500:340:341:4210 -+GAME NETWORK:12672:v:1:27500:291:292:4213 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/Astra-28.2E dvb-apps/util/szap/channels-conf/dvb-s/Astra-28.2E ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/Astra-28.2E 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-s/Astra-28.2E 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,522 @@ -+BBC 1 London:10773:h:0:22000:2304:2306:6301 -+BBC 2 England:10773:h:0:22000:2320:2322:6302 -+BBC NEWS 24:10773:h:0:22000:2329:2331:6304 -+ETV:10773:h:0:22000:2333:2335:6306 -+BBC TES 3:10773:h:0:22000:2325:2327:6315 -+CBBC Channel:10773:h:0:22000:2325:2327:6317 -+CBeebies:10773:h:0:22000:2333:2335:6318 -+BBC 1 NI:10773:h:0:22000:2316:2318:6331 -+BBC R Cymru:10773:h:0:22000:0:2340:6363 -+BBC TES Test:10773:h:0:22000:0:0:6308 -+BBC TES 2:10773:h:0:22000:0:0:6309 -+BBC FOUR:10773:h:0:22000:0:0:6316 -+BBC THREE:10773:h:0:22000:0:0:6319 -+[1341]:11469:h:0:27500:521:649:4929 -+[1342]:11469:h:0:27500:522:650:4930 -+MMS 5:11469:h:0:27500:0:0:5044 -+MMS 6:11469:h:0:27500:0:0:5045 -+Sky Active:11469:h:0:27500:0:0:5107 -+[140a]:11469:h:0:27500:518:646:5130 -+[146b]:11469:h:0:27500:512:640:5227 -+[146c]:11469:h:0:27500:513:641:5228 -+[1016]:11469:h:0:27500:514:642:4118 -+[10e9]:11469:h:0:27500:519:647:4329 -+[1279]:11469:h:0:27500:520:648:4729 -+Sky Customer Service:11469:h:0:27500:0:0:5240 -+Directgov - Govt Info:11469:h:0:27500:0:0:5241 -+[1596]:11469:h:0:27500:515:643:5526 -+[1597]:11469:h:0:27500:516:644:5527 -+[159a]:11469:h:0:27500:517:645:5530 -+[15a4]:11469:h:0:27500:0:0:5540 -+[05dc]:11469:h:0:27500:0:0:1500 -+[1017]:11469:h:0:27500:0:0:4119 -+Sky Box Office:11469:h:0:27500:0:0:4121 -+Sky Box Office:11469:h:0:27500:0:0:4122 -+Sky Box Office:11469:h:0:27500:0:0:4123 -+Sky Box Office:11469:h:0:27500:0:0:4124 -+Sky Box Office:11469:h:0:27500:0:0:4129 -+POP:12285:v:0:27500:2311:2312:52500 -+3751 PH:12285:v:0:27500:2311:2312:52501 -+Chart Show TV:12285:v:0:27500:2309:2310:52505 -+3761 PH:12285:v:0:27500:2313:2314:52512 -+The Vault:12285:v:0:27500:2322:2323:52515 -+Chase-it.tv:12285:v:0:27500:2318:2319:52520 -+OBE:12285:v:0:27500:2307:2308:52525 -+Tiny Pop:12285:v:0:27500:2316:2317:52530 -+Spice Extreme:12285:v:0:27500:2320:2321:52561 -+Climax3 - 1:12285:v:0:27500:2324:2325:52562 -+Climax3 - 2:12285:v:0:27500:2326:2327:52563 -+Climax3 - 3:12285:v:0:27500:2328:2329:52564 -+Adult Channel:12285:v:0:27500:2330:2331:52565 -+Playboy TV:12285:v:0:27500:2313:2314:52566 -+52567:12285:v:0:27500:2330:2331:52567 -+3911 PH:12285:v:0:27500:2320:2321:52581 -+IDMT:12148:h:0:27500:2307:2308:52200 -+ Broadband UK:12148:h:0:27500:2305:2306:52210 -+52220:12148:h:0:27500:2309:2310:52220 -+Trouble Reload:12148:h:0:27500:2311:2312:52230 -+Challenge+1:12148:h:0:27500:2314:2315:52232 -+Ftn:12148:h:0:27500:0:0:52231 -+[15ff]:10920:h:0:22000:516:644:5631 -+D'covery H&L+:10920:h:0:22000:2305:2306:50003 -+Eurosportnews:10920:h:0:22000:2307:2308:5009 -+Hallmark:10920:h:0:22000:2310:2311:5010 -+[13a2]:10920:h:0:22000:512:640:5026 -+[13a4]:10920:h:0:22000:514:642:5028 -+[13a5]:10920:h:0:22000:515:643:5029 -+[05e6]:10920:h:0:22000:0:0:1510 -+Sky Box Office:10920:h:0:22000:0:0:4122 -+Sky Box Office:10920:h:0:22000:0:0:4123 -+Sky Box Office:10920:h:0:22000:0:0:4124 -+Sky Box Office:10920:h:0:22000:0:0:4129 -+SportxxxBabes:10920:h:0:22000:0:0:4137 -+[1393]:10920:h:0:22000:0:0:5011 -+[15fb]:10920:h:0:22000:0:0:5627 -+SAB TV:12226:h:0:27500:2310:2311:52401 -+Performance:12226:h:0:27500:2312:2313:52402 -+channel U:12226:h:0:27500:2314:2315:52403 -+Gems.tv:12226:h:0:27500:2317:2318:52404 -+Soundtrack ch.:12226:h:0:27500:2307:2308:52405 -+HorrorChannel:12226:h:0:27500:2342:2343:52406 -+Chat Box:12226:h:0:27500:2319:2320:52407 -+Golf Channel:12226:h:0:27500:2321:2322:52408 -+Ex&Mart TV:12226:h:0:27500:2323:2324:52409 -+TVW Select:12226:h:0:27500:2305:2306:52412 -+Game In TV:12226:h:0:27500:2335:2336:52414 -+Majestic TV:12226:h:0:27500:2340:2341:52415 -+18PlusXXX:12226:h:0:27500:0:0:52410 -+XXXHousewive:12226:h:0:27500:0:0:52411 -+52421:12226:h:0:27500:0:0:52421 -+[10ea]:11603:v:0:27500:514:662:4330 -+[114e]:11603:v:0:27500:515:663:4430 -+[11b2]:11603:v:0:27500:516:664:4530 -+[1215]:11603:v:0:27500:521:669:4629 -+[1216]:11603:v:0:27500:517:665:4630 -+[127a]:11603:v:0:27500:518:666:4730 -+[12de]:11603:v:0:27500:519:667:4830 -+[13a6]:11603:v:0:27500:512:660:5030 -+[1409]:11603:v:0:27500:522:670:5129 -+[146a]:11603:v:0:27500:520:668:5226 -+[1599]:11603:v:0:27500:523:671:5529 -+[15fa]:11603:v:0:27500:513:661:5626 -+Sky Box Office:11603:v:0:27500:0:0:4124 -+Sky Box Office:11603:v:0:27500:0:0:4129 -+MMS 4:11603:v:0:27500:0:0:5043 -+MMS 8:11603:v:0:27500:0:0:5047 -+[1603]:11603:v:0:27500:0:0:5635 -+[05e9]:11603:v:0:27500:0:0:1513 -+Sky Box Office:11603:v:0:27500:0:0:4121 -+Sky Box Office:11603:v:0:27500:0:0:4122 -+Sky Box Office:11603:v:0:27500:0:0:4123 -+1391:10935:v:0:22000:2321:2320:5421 -+1392:10935:v:0:22000:2305:2320:5422 -+1393:10935:v:0:22000:2306:2320:5423 -+1394:10935:v:0:22000:2307:2320:5424 -+1395:10935:v:0:22000:2308:2320:5425 -+1396:10935:v:0:22000:2309:2320:5426 -+1397:10935:v:0:22000:2310:2320:5427 -+1398:10935:v:0:22000:2311:2320:5428 -+1399:10935:v:0:22000:2312:2320:5429 -+1471:10935:v:0:22000:2305:2313:5471 -+1472:10935:v:0:22000:2306:2314:5472 -+1473:10935:v:0:22000:2307:2315:5473 -+1474:10935:v:0:22000:2308:2316:5474 -+1475:10935:v:0:22000:2309:2317:5475 -+1476:10935:v:0:22000:2310:2318:5476 -+1477:10935:v:0:22000:2311:2319:5477 -+1478:10935:v:0:22000:2312:2320:5478 -+[05ea]:10935:v:0:22000:0:0:1514 -+1326:10935:v:0:22000:0:0:5307 -+1334:10935:v:0:22000:0:0:5310 -+SPl:10935:v:0:22000:0:0:5404 -+rc:10935:v:0:22000:0:0:5407 -+nata:10935:v:0:22000:0:0:5466 -+natd:10935:v:0:22000:0:0:5467 -+ISM Sky News v6:11507:h:0:27500:2305:2306:9318 -+ISM Movies v6:11507:h:0:27500:0:0:9319 -+EIA2 Test:11507:h:0:27500:2305:2306:9322 -+UK Online test:11507:h:0:27500:0:0:9323 -+1784:11507:h:0:27500:2305:2306:9324 -+1786:11507:h:0:27500:0:0:9325 -+SCS:11507:h:0:27500:0:0:9326 -+STT:11507:h:0:27500:2305:2306:9327 -+1787:11507:h:0:27500:2305:2306:9329 -+5ADT:11507:h:0:27500:2305:2306:9331 -+EIA2 Test 6:11507:h:0:27500:2305:2306:9332 -+8N2:11507:h:0:27500:0:0:9335 -+EIA2 Test 5:11507:h:0:27500:2305:2306:9336 -+[2479]:11507:h:0:27500:0:0:9337 -+[247a]:11507:h:0:27500:0:0:9338 -+7909:11507:h:0:27500:2305:2306:3909 -+EIA2 Test 3:11507:h:0:27500:2305:2306:4909 -+EIA2 Test 4:11507:h:0:27500:2305:2306:4912 -+ISM Test1 v5:11507:h:0:27500:2305:2306:5902 -+PlayJam:11507:h:0:27500:0:2445:9306 -+PlayMonteCarlo & Roulette:11507:h:0:27500:0:2457:9308 -+PlayJam test:11507:h:0:27500:0:2445:9310 -+ISM Sky One v6:11507:h:0:27500:2305:2306:9316 -+ISM Sports 1 v6:11507:h:0:27500:2305:2306:9317 -+[05f3]:11507:h:0:27500:0:0:1523 -+Playboy / Adult:11507:h:0:27500:0:0:4128 -+Playboy TV:11507:h:0:27500:0:0:4131 -+Private Girls:11507:h:0:27500:0:0:4133 -+XXX TV:11507:h:0:27500:0:0:4134 -+Amateur Babes:11507:h:0:27500:0:0:4135 -+[1207]:11507:h:0:27500:0:0:4615 -+[1209]:11507:h:0:27500:0:0:4617 -+[232d]:11507:h:0:27500:0:0:9005 -+YO-YO" test:11507:h:0:27500:0:0:9309 -+UCB TV:12070:h:0:27500:2313:2314:52001 -+ATN:12070:h:0:27500:2310:2311:52002 -+Overload:12070:h:0:27500:2306:2307:52003 -+Golf Pro-Shop:12070:h:0:27500:2315:2316:52004 -+You TV:12070:h:0:27500:2336:2337:52005 -+Escape:12070:h:0:27500:2317:2318:52006 -+52007:12070:h:0:27500:2324:2325:52007 -+Get Lucky TV:12070:h:0:27500:2319:2320:52008 -+[fffe]:12070:h:0:27500:0:0:65534 -+Wonderful:12070:h:0:27500:2308:2309:52009 -+Musicians Chnl:12070:h:0:27500:2326:2327:52010 -+Rangers TV:12070:h:0:27500:2328:2329:52011 -+Celtic TV:12070:h:0:27500:2330:2331:52012 -+Advert Channel:12070:h:0:27500:2332:2333:52013 -+LONDON TV:12070:h:0:27500:2334:2335:52014 -+Pure Dance:12070:h:0:27500:0:2312:52025 -+Club Asia:12070:h:0:27500:0:2305:52026 -+Setanta Sports:12070:h:0:27500:0:0:52021 -+Setanta Sports:12070:h:0:27500:0:0:52022 -+Setanta PPV2:12070:h:0:27500:0:0:52032 -+FilmFour:11565:v:0:27500:2320:2321:50500 -+FilmFour +1:11565:v:0:27500:2323:2324:50505 -+Film4 Weekly:11565:v:0:27500:2326:2327:50510 -+E4:11565:v:0:27500:2329:2330:50515 -+Game 6:11565:v:0:27500:0:2336:50540 -+Game 7:11565:v:0:27500:0:2342:50541 -+Game 8:11565:v:0:27500:0:2344:50542 -+FF TEST1:11565:v:0:27500:2320:2321:50543 -+PCNE Chinese:11565:v:0:27500:6144:6145:50550 -+Bloomberg:11565:v:0:27500:2316:2317:50555 -+[05f5]:11565:v:0:27500:0:0:1525 -+SCRD4:10861:h:0:22000:0:0:8009 -+SBZP:10861:h:0:22000:0:0:8059 -+LMIN:10861:h:0:22000:0:0:8108 -+TRLN:10861:h:0:22000:0:0:8116 -+SCD2:10861:h:0:22000:0:0:8126 -+DOMI:10861:h:0:22000:0:0:8145 -+WINC:10861:h:0:22000:2325:2326:8164 -+The Betting Zone:10861:h:0:22000:0:0:8186 -+TLM(Browser):10861:h:0:22000:2342:2344:8888 -+Disney Chnl:10861:h:0:22000:2308:2309:9001 -+Disney Chnl +1:10861:h:0:22000:2313:2314:9002 -+Toon Disney:10861:h:0:22000:2317:2318:9003 -+Playhse Disney:10861:h:0:22000:2320:2321:9004 -+The Betting Zone:10861:h:0:22000:2336:2338:50008 -+[05f6]:10861:h:0:22000:0:0:1526 -+ALTU:10861:h:0:22000:0:0:8087 -+DCT2 (t51):10861:h:0:22000:0:0:8999 -+DCT (t51):10861:h:0:22000:0:0:9000 -+Sky Travel +1:10876:v:0:22000:2310:2318:3905 -+Sky Travel Active Dummy:10876:v:0:22000:0:0:4911 -+Sky Travel:10876:v:0:22000:2308:2309:5005 -+5006:10876:v:0:22000:2308:2309:5006 -+Sky Trvl Extra:10876:v:0:22000:2305:2306:9312 -+[0602]:10876:v:0:22000:0:0:1538 -+Tel Sell:12460:h:0:27500:2319:2320:50832 -+mSync:12460:h:0:27500:0:0:50837 -+NASN:12460:h:0:27500:2322:2323:50839 -+Classics TV:12460:h:0:27500:2324:2325:50840 -+Information TV:12460:h:0:27500:2326:2327:50841 -+Wrestling Chnl:12460:h:0:27500:2329:2330:50842 -+TWC Reloaded:12460:h:0:27500:2331:2332:50843 -+FRIENDLY TV:12460:h:0:27500:2333:2334:50848 -+McColls:12460:h:0:27500:0:2335:50851 -+Moto:12460:h:0:27500:0:2336:50852 -+Teds FM:12460:h:0:27500:0:2337:50853 -+Topps FM:12460:h:0:27500:0:2338:50855 -+Kiss:12460:h:0:27500:0:2339:50856 -+Smash Hits!:12460:h:0:27500:0:2340:50857 -+Kerrang:12460:h:0:27500:0:2341:50858 -+The Hits:12460:h:0:27500:0:2342:50859 -+Magic:12460:h:0:27500:0:2343:50860 -+Q:12460:h:0:27500:0:2344:50861 -+MOJO:12460:h:0:27500:0:2345:50862 -+Heat:12460:h:0:27500:0:2346:50863 -+GlobeCast:12460:h:0:27500:0:2347:50864 -+PTV Prime:12460:h:0:27500:2315:2316:50865 -+Fashion TV:12460:h:0:27500:0:0:50850 -+Best Direct:12246:v:0:27500:2314:2315:53500 -+BestDirect+:12246:v:0:27500:2316:2317:53505 -+Dating Channel:12246:v:0:27500:2320:2321:53515 -+Wine TV:12246:v:0:27500:2323:2324:53520 -+Flaunt:12246:v:0:27500:2326:2327:53525 -+Scuzz:12246:v:0:27500:2328:2329:53530 -+The Amp:12246:v:0:27500:2330:2331:53535 -+Radio Caroline:12246:v:0:27500:0:2332:53550 -+Amrit Bani:12246:v:0:27500:0:2333:53551 -+Desi Radio:12246:v:0:27500:0:2334:53552 -+CalvaryRadio:12246:v:0:27500:0:2335:53553 -+Apple FM:12246:v:0:27500:0:2336:53554 -+TWR:12246:v:0:27500:0:2337:53555 -+Spectrum 1:12246:v:0:27500:0:2338:53556 -+RTE Europe:12246:v:0:27500:0:2339:53557 -+WRN Europe:12246:v:0:27500:0:2340:53558 -+Raaj Radio:12246:v:0:27500:0:2341:53559 -+On Air:12246:v:0:27500:0:2342:53560 -+53561:12246:v:0:27500:0:2306:53561 -+PulseUnsignd:12246:v:0:27500:0:2343:53564 -+53581:12246:v:0:27500:0:0:53581 -+RTE One:10743:h:0:22000:2306:2307:9601 -+RTE TWO:10743:h:0:22000:2309:2310:9602 -+TG4:10743:h:0:22000:2312:2313:9603 -+TV3:10743:h:0:22000:2315:2316:9605 -+DW-TV:10743:h:0:22000:2318:2319:9606 -+TVEi:10743:h:0:22000:2320:2321:9607 -+RTE Radio 1:10743:h:0:22000:0:2322:9611 -+RTE 2FM:10743:h:0:22000:0:2323:9612 -+RTE R na G:10743:h:0:22000:0:2324:9613 -+RTE Lyric fm:10743:h:0:22000:0:2325:9614 -+BBC R5 Live:10802:h:0:22000:0:2338:6401 -+ETV2:10802:h:0:22000:2304:2306:6407 -+BBC 1 Wales:10802:h:0:22000:2304:2306:6411 -+BBC 2W:10802:h:0:22000:2321:2323:6412 -+BBC 1 Scotland:10802:h:0:22000:2311:2313:6421 -+BBC 2 Scotland:10802:h:0:22000:2325:2327:6422 -+BBC 2 NI:10802:h:0:22000:2329:2331:6432 -+BBC R1:10802:h:0:22000:0:2333:6451 -+BBC R2:10802:h:0:22000:0:2334:6452 -+BBC R3:10802:h:0:22000:0:2335:6453 -+BBC R4 FM:10802:h:0:22000:0:2336:6454 -+BBC R4 LW:10802:h:0:22000:0:2337:6455 -+BBC R Scot.:10802:h:0:22000:0:2339:6457 -+BBC R Wales:10802:h:0:22000:0:2340:6458 -+BBC R Ulster:10802:h:0:22000:0:2341:6459 -+BBC Asian Nt.:10802:h:0:22000:0:2342:6460 -+BBC World Sv.:10802:h:0:22000:0:2343:6461 -+ETV3:10802:h:0:22000:0:2333:6462 -+BBC 5L SportX:10802:h:0:22000:0:2344:6464 -+BBC WS Extra:10802:h:0:22000:0:2345:6465 -+1Xtra BBC:10802:h:0:22000:0:2347:6466 -+BBC 6 Music:10802:h:0:22000:0:2346:6467 -+BBC 7:10802:h:0:22000:0:2348:6468 -+BBC R n Gael:10802:h:0:22000:0:2349:6469 -+T4 STRM-0:10847:v:0:22000:2305:2306:6900 -+T4 STRM-1:10847:v:0:22000:2320:2321:6901 -+BBC PARL'MNT:10847:v:0:22000:2327:2328:6902 -+BBC 1 East (W):10847:v:0:22000:2338:2339:6903 -+BBC 1 CI:10847:v:0:22000:2343:2344:6904 -+T4 DEV-0:10847:v:0:22000:2305:2306:6990 -+T4 DEV-1:10847:v:0:22000:2320:2321:6991 -+T4 DEV-2:10847:v:0:22000:2327:2328:6992 -+T4 DEV-3:10847:v:0:22000:2338:2339:6993 -+T4 DEV-4:10847:v:0:22000:2343:2344:6994 -+BBC 1 W Mids:10788:v:0:22000:2305:2306:10301 -+BBC 1 N West:10788:v:0:22000:2318:2319:10302 -+BBC 1 Yrks&Lin:10788:v:0:22000:2321:2322:10303 -+BBC 1 Yorks:10788:v:0:22000:2324:2325:10304 -+BBC 1 E Mids:10788:v:0:22000:2327:2328:10305 -+BBC 1 East (E):10788:v:0:22000:2330:2331:10306 -+ETV5:10788:v:0:22000:2305:2306:10321 -+BBC 1 West:10817:v:0:22000:2305:2306:10351 -+BBC 1 S East:10817:v:0:22000:2317:2318:10352 -+BBC 1 South:10817:v:0:22000:2320:2321:10353 -+BBC 1 S West:10817:v:0:22000:2323:2324:10354 -+BBC 1 NE & C:10817:v:0:22000:2326:2327:10355 -+BBC 1 Oxford:10817:v:0:22000:2329:2330:10356 -+ETV6:10817:v:0:22000:2305:2306:10371 -+POP:11426:v:0:27500:2311:2312:52500 -+3751 PH:11426:v:0:27500:2311:2312:52501 -+Chart Show TV:11426:v:0:27500:2309:2310:52505 -+3761 PH:11426:v:0:27500:2313:2314:52512 -+The Vault:11426:v:0:27500:2322:2323:52515 -+Chase-it.tv:11426:v:0:27500:2318:2319:52520 -+OBE:11426:v:0:27500:2307:2308:52525 -+Tiny Pop:11426:v:0:27500:2316:2317:52530 -+Spice Extreme:11426:v:0:27500:2320:2321:52561 -+Climax3 - 1:11426:v:0:27500:2324:2325:52562 -+Climax3 - 2:11426:v:0:27500:2326:2327:52563 -+Climax3 - 3:11426:v:0:27500:2328:2329:52564 -+Adult Channel:11426:v:0:27500:2330:2331:52565 -+Playboy TV:11426:v:0:27500:2313:2314:52566 -+52567:11426:v:0:27500:2330:2331:52567 -+3911 PH:11426:v:0:27500:2320:2321:52581 -+Simply Home:11488:v:0:27500:2364:2365:50102 -+DTPCad4:11488:v:0:27500:2315:2316:50103 -+Shop Vector:11488:v:0:27500:2322:2323:50105 -+Simply Ideas:11488:v:0:27500:2324:2325:50115 -+Simply Shop.:11488:v:0:27500:2353:2354:50120 -+JobsTV:11488:v:0:27500:2366:2367:50125 -+GayDateTV:11488:v:0:27500:2361:2362:50130 -+Motors TV:11488:v:0:27500:3329:3330:50135 -+nation217:11488:v:0:27500:2329:2330:50170 -+52536:11488:v:0:27500:2353:2354:50176 -+3786 PH:11488:v:0:27500:2342:2343:50177 -+Avago Roulette:11488:v:0:27500:0:0:50180 -+50181:11488:v:0:27500:2353:2354:50181 -+XplicitXXX:11488:v:0:27500:0:0:50175 -+3901 PH:11584:h:0:27500:2348:2349:50101 -+50621:11584:h:0:27500:0:0:50621 -+Gay TV:11584:h:0:27500:2333:2334:50671 -+Red Hot Films:11584:h:0:27500:2338:2339:50672 -+Red Hot Euro:11584:h:0:27500:2336:2337:50673 -+Television X 2:11584:h:0:27500:2326:2327:50674 -+Television X 3:11584:h:0:27500:2314:2315:50675 -+Television X:11584:h:0:27500:2306:2307:50676 -+RedHot All Girl:11584:h:0:27500:2340:2341:50677 -+ExpressShop.:11584:h:0:27500:2331:2332:50678 -+Real Estate TV:11584:h:0:27500:2329:2330:50679 -+Red Hot Only 18:11584:h:0:27500:2311:2312:50680 -+Red Hot Wives:11584:h:0:27500:2344:2345:50681 -+RH 40+ Wives:11584:h:0:27500:2346:2347:50682 -+redhot amateur:11584:h:0:27500:2342:2343:50683 -+redhot uktalent:11584:h:0:27500:0:0:50100 -+50686:11584:h:0:27500:0:0:50686 -+AvaTest:11546:h:0:27500:2319:2320:50446 -+SFI:11546:h:0:27500:0:0:50455 -+Shop on TV:11546:h:0:27500:2315:2316:50400 -+Thane Direct:11546:h:0:27500:2317:2318:50405 -+AVAGO:11546:h:0:27500:2319:2320:50410 -+SouthForYou:11546:h:0:27500:2313:2314:50420 -+Stop + Shop:11546:h:0:27500:2324:2325:50430 -+VHR:11546:h:0:27500:2326:2327:50435 -+ditg:11546:h:0:27500:0:0:50439 -+cso:11546:h:0:27500:2331:2332:50440 -+Channel 425:11546:h:0:27500:2355:2357:50445 -+Thomas Cook:11526:v:0:27500:2312:2313:50300 -+B4:11526:v:0:27500:2361:2362:50305 -+Al Jazeera:11526:v:0:27500:2310:2311:50325 -+NHS 1:11526:v:0:27500:2314:2315:50370 -+NHS 2:11526:v:0:27500:0:2329:50371 -+NHS 2:11526:v:0:27500:0:2337:50372 -+NHS Direct Interactive:11526:v:0:27500:0:0:50373 -+NHS 4:11526:v:0:27500:2345:2347:50374 -+SAB TV:11388:h:0:27500:2310:2311:52401 -+Performance:11388:h:0:27500:2312:2313:52402 -+channel U:11388:h:0:27500:2314:2315:52403 -+Gems.tv:11388:h:0:27500:2317:2318:52404 -+Soundtrack ch.:11388:h:0:27500:2307:2308:52405 -+HorrorChannel:11388:h:0:27500:2342:2343:52406 -+Chat Box:11388:h:0:27500:2319:2320:52407 -+Golf Channel:11388:h:0:27500:2321:2322:52408 -+Ex&Mart TV:11388:h:0:27500:2323:2324:52409 -+TVW Select:11388:h:0:27500:2305:2306:52412 -+Game In TV:11388:h:0:27500:2335:2336:52414 -+Majestic TV:11388:h:0:27500:2340:2341:52415 -+52421:11388:h:0:27500:0:0:52421 -+18PlusXXX:11388:h:0:27500:0:0:52410 -+XXXHousewive:11388:h:0:27500:0:0:52411 -+Open Access 2:11642:v:0:27500:2312:2318:50152 -+Unlimited TV:11642:v:0:27500:2319:2320:50153 -+Racing UK:11642:v:0:27500:2306:2313:50951 -+Vectone Bangla:11642:v:0:27500:2325:2326:50952 -+VECTONE Urdu:11642:v:0:27500:2328:2329:50953 -+VECTONE Tamil:11642:v:0:27500:2331:2332:50954 -+VECTONE Bolly:11642:v:0:27500:2334:2335:50955 -+Open Access:11642:v:0:27500:2356:2357:50956 -+Classic FM TV:11642:v:0:27500:2358:2359:50957 -+50959:11642:v:0:27500:2314:2315:50959 -+Extreme Sports:11680:v:0:27500:2307:2308:51101 -+EuroNews:11680:v:0:27500:2310:2311:51102 -+GOD Channel:11680:v:0:27500:2319:2320:51103 -+GOD REVIVAL:11680:v:0:27500:2321:2322:51104 -+CrossRhythm:11680:v:0:27500:0:2306:51106 -+Life TV:11680:v:0:27500:2323:2324:51108 -+TBN Europe:11680:v:0:27500:2325:2326:51109 -+HollywoodTV:11680:v:0:27500:2327:2328:51112 -+GOD 2:11680:v:0:27500:2321:2322:51115 -+revelation:11680:v:0:27500:2339:2340:51116 -+Live XXX TV:11680:v:0:27500:0:0:51113 -+51117:11680:v:0:27500:0:0:51117 -+Alphameric1:11680:v:0:27500:0:0:51121 -+Alphameric2:11680:v:0:27500:0:0:51122 -+CFC TV:11680:v:0:27500:0:0:51105 -+mta-muslim tv:11661:h:0:27500:2311:2312:51001 -+BEN:11661:h:0:27500:2327:2328:51008 -+Abu Dhabi TV:11661:h:0:27500:2329:2330:51009 -+TV Travelshop 2:11661:h:0:27500:2370:2371:51010 -+CCTV-9:11661:h:0:27500:2333:2334:51011 -+Islam Channel:11661:h:0:27500:2337:2338:51014 -+51020:11661:h:0:27500:0:2339:51020 -+PlayMonteCarlo & Roulette:11661:h:0:27500:0:2319:51022 -+2gbstp:11661:h:0:27500:0:0:51013 -+Tel Sell:11623:h:0:27500:2319:2320:50832 -+mSync:11623:h:0:27500:0:0:50837 -+NASN:11623:h:0:27500:2322:2323:50839 -+Classics TV:11623:h:0:27500:2324:2325:50840 -+Information TV:11623:h:0:27500:2326:2327:50841 -+Wrestling Chnl:11623:h:0:27500:2329:2330:50842 -+TWC Reloaded:11623:h:0:27500:2331:2332:50843 -+FRIENDLY TV:11623:h:0:27500:2333:2334:50848 -+McColls:11623:h:0:27500:0:2335:50851 -+Moto:11623:h:0:27500:0:2336:50852 -+Teds FM:11623:h:0:27500:0:2337:50853 -+Topps FM:11623:h:0:27500:0:2338:50855 -+Kiss:11623:h:0:27500:0:2339:50856 -+Smash Hits!:11623:h:0:27500:0:2340:50857 -+Kerrang:11623:h:0:27500:0:2341:50858 -+The Hits:11623:h:0:27500:0:2342:50859 -+Magic:11623:h:0:27500:0:2343:50860 -+Q:11623:h:0:27500:0:2344:50861 -+MOJO:11623:h:0:27500:0:2345:50862 -+Heat:11623:h:0:27500:0:2346:50863 -+GlobeCast:11623:h:0:27500:0:2347:50864 -+PTV Prime:11623:h:0:27500:2315:2316:50865 -+Fashion TV:11623:h:0:27500:0:0:50850 -+ITV1 London:10832:h:0:22000:2305:2307:10000 -+ITV News:10832:h:0:22000:2329:2336:10009 -+ITV1 Central:10832:h:0:22000:2327:2328:10010 -+ITV1 HTV Wales:10832:h:0:22000:2334:2335:10020 -+ITV1 HTV West:10832:h:0:22000:2341:2342:10030 -+ITV1 W Country:10832:h:0:22000:2348:2349:10040 -+G49:10832:h:0:22000:2334:2335:10099 -+ITV1 Anglia:10891:h:0:22000:2305:2306:10100 -+ITV1 Border:10891:h:0:22000:2327:2328:10110 -+ITV1 BorderSco:10891:h:0:22000:2334:2335:10120 -+ITV1 Meridian S:10891:h:0:22000:2348:2349:10140 -+ITV1 Meridian E:10891:h:0:22000:2341:2342:10141 -+ITV1 Tyne Tees:10891:h:0:22000:2355:2356:10150 -+ITV1 Yorkshire:10891:h:0:22000:2362:2363:10160 -+G53:10891:h:0:22000:2334:2335:10199 -+ITV Channel Is:10906:v:0:22000:2326:2328:10200 -+Grampian TV:10906:v:0:22000:2333:2334:10210 -+Scottish TV:10906:v:0:22000:2340:2341:10220 -+UTV:10906:v:0:22000:2347:2348:10230 -+ITV2:10906:v:0:22000:2350:2351:10240 -+ITV1 Granada:10906:v:0:22000:2305:2306:10250 -+ITV3:10906:v:0:22000:2363:2364:10260 -+G54:10906:v:0:22000:2357:2358:10299 -+6300:10758:v:0:22000:2305:2306:10119 -+LONDON TV:11222:h:0:27500:2334:2335:52014 -+Setanta Sports:11222:h:0:27500:0:0:52021 -+Setanta Sports:11222:h:0:27500:0:0:52022 -+Pure Dance:11222:h:0:27500:0:2312:52025 -+Club Asia:11222:h:0:27500:0:2305:52026 -+Setanta PPV2:11222:h:0:27500:0:0:52032 -+[fffe]:11222:h:0:27500:0:0:65534 -+UCB TV:11222:h:0:27500:2313:2314:52001 -+ATN:11222:h:0:27500:2310:2311:52002 -+Overload:11222:h:0:27500:2306:2307:52003 -+Golf Pro-Shop:11222:h:0:27500:2315:2316:52004 -+You TV:11222:h:0:27500:2336:2337:52005 -+Escape:11222:h:0:27500:2317:2318:52006 -+52007:11222:h:0:27500:2324:2325:52007 -+Get Lucky TV:11222:h:0:27500:2319:2320:52008 -+Wonderful:11222:h:0:27500:2308:2309:52009 -+Musicians Chnl:11222:h:0:27500:2326:2327:52010 -+Rangers TV:11222:h:0:27500:2328:2329:52011 -+Celtic TV:11222:h:0:27500:2330:2331:52012 -+Advert Channel:11222:h:0:27500:2332:2333:52013 -+E4+1:10729:v:0:22000:2306:2307:8300 -+3310:10729:v:0:22000:2317:2318:8310 -+3315:10729:v:0:22000:0:0:8315 -+3320:10729:v:0:22000:0:0:8320 -+[fffe]:11264:h:0:22000:0:0:65534 -+52101:11264:h:0:22000:2305:2306:52101 -+52102:11264:h:0:22000:2307:2308:52102 -+52103:11264:h:0:22000:2309:2310:52103 -+52104:11264:h:0:22000:2311:2312:52104 -+IDMT:11307:h:0:27500:2307:2308:52200 -+ Broadband UK:11307:h:0:27500:2305:2306:52210 -+52220:11307:h:0:27500:2309:2310:52220 -+Trouble Reload:11307:h:0:27500:2311:2312:52230 -+Challenge+1:11307:h:0:27500:2314:2315:52232 -+Ftn:11307:h:0:27500:0:0:52231 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/BrasilSat-B3-84.0W dvb-apps/util/szap/channels-conf/dvb-s/BrasilSat-B3-84.0W ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/BrasilSat-B3-84.0W 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-s/BrasilSat-B3-84.0W 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,39 @@ -+NoName:3675:v:0:4285:1110:1211:1 -+Rede 21:3688:v:0:2308:308:256:1 -+SNG#3 TERRA VIVA:3692:v:0:3200:308:256:1 -+TV PONTA PORA :3697:v:0:3333:1110:1211:1 -+Servico 1:3710:v:0:12960:36:37:1 -+TV Assembleia:3710:v:0:12960:39:40:2 -+Servico 3:3710:v:0:12960:42:43:3 -+TV Cultura:3710:v:0:12960:33:34:4 -+TV Ra-Tim-Bum:3710:v:0:12960:45:46:5 -+Tv Morena:3738:v:0:4710:4096:4097:1 -+[6d65]:3754:v:0:5000:0:0:28005 -+[6dc9]:3754:v:0:5000:0:0:28105 -+[0faa]:3754:v:0:5000:0:0:4010 -+[0fb4]:3754:v:0:5000:0:0:4020 -+[6d61]:3754:v:0:5000:0:0:28001 -+[0f9f]:3754:v:0:5000:0:0:3999 -+[0fbe]:3754:v:0:5000:0:0:4030 -+[000b]:3754:v:0:5000:0:0:11 -+[5014]:3754:v:0:5000:0:0:20500 -+STV:3768:v:0:8000:160:80:1 -+CANAL 2:3768:v:0:8000:161:84:2 -+TELECONF:3768:v:0:8000:162:88:3 -+REDETV RO:3805:v:0:3255:4194:4195:1 -+Videocom:3858:v:0:4289:1110:1211:1 -+TVSULBAHIA:3911:v:0:3255:33:36:2 -+TV ARATU BA:3927:v:0:3255:33:36:2 -+TV BAND BA:3931:h:0:3255:337:340:21 -+TV BAND BA:3932:v:0:3255:337:340:21 -+REDE SUPER:3940:v:0:3255:337:340:1 -+RBI:3949:v:0:4340:337:340:33 -+TV TRIBUNA:3955:v:0:4340:337:340:1 -+5 :3970:v:0:4445:1160:1120:1 -+TV EDUCATIVA MS:4013:v:0:3255:337:340:33 -+TV Justica:4060:v:0:3330:289:290:1 -+CNT GERACAO 1:4075:v:0:4444:289:290:20101 -+ASS-LEG-SC:4132:v:0:2532:337:340:33 -+EMBRATEL 21:4152:v:0:2300:257:514:1 -+SEXY TV:4155:v:0:2170:257:258:1 -+BASA:4169:v:0:8140:4141:4140:4 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Adelaide dvb-apps/util/szap/channels-conf/dvb-t/au-Adelaide ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Adelaide 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/au-Adelaide 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,28 @@ -+ABC HDTV:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:0:592 -+ABC TV Adelaide:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:593 -+ABC TV 2:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:594 -+ABC TV 3:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:595 -+ABC TV 4:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:596 -+ABC DiG Radio:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2311:598 -+7 Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1281:1282:1360 -+7 Digital 1:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1281:1282:1361 -+7 Digital 2:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1281:1282:1362 -+7 Digital 3:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1281:1282:1363 -+7 HD Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1345:1346:1364 -+NINE Digital:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1105 -+NINE HD:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:513:0:1112 -+TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1617 -+TEN Digital 1:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1618 -+TEN Digital 2:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1619 -+TEN Digital 3:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1620 -+TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1621 -+TEN Digital 4:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1622 -+TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1623 -+TEN HD:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1624 -+Ten Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1625 -+SBS HD:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:832 -+SBS DIGITAL 1:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:833 -+SBS DIGITAL 2:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:834 -+SBS EPG:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:835 -+SBS RADIO 1:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:846 -+SBS RADIO 2:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:847 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Brisbane dvb-apps/util/szap/channels-conf/dvb-t/au-Brisbane ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Brisbane 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/au-Brisbane 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,29 @@ -+ABC HDTV:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:0:576 -+ABC TV Brisbane:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:577 -+ABC TV 2:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:578 -+ABC TV 3:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:579 -+ABC TV 4:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:580 -+ABC DiG Radio:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2310:582 -+7 Digital:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1025:1026:1344 -+7 Digital 1:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1025:1026:1345 -+7 Digital 2:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1025:1026:1346 -+7 Digital 3:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1025:1026:1347 -+7 HD Digital:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1089:1090:1348 -+Nine Digital:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:513:660:1025 -+Nine Guide:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:517:660:1030 -+Nine High Definition:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:0:1152 -+TEN Digital:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1601 -+TEN Digital 1:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1602 -+TEN Digital 2:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1603 -+TEN Digital 3:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1604 -+TEN Digital:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1605 -+TEN Digital 4:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1606 -+TEN Digital:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1607 -+TEN HD:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1608 -+TEN Digital:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1609 -+SBS HD:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:816 -+SBS DIGITAL 1:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:817 -+SBS DIGITAL 2:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:818 -+SBS EPG:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:819 -+SBS RADIO 1:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:830 -+SBS RADIO 2:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:831 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Hobart dvb-apps/util/szap/channels-conf/dvb-t/au-Hobart ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Hobart 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/au-Hobart 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,18 @@ -+ABC HDTV:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2314:0:624 -+ABC TV Hobart:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:625 -+ABC2:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2309:2310:626 -+ABC TV:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:627 -+ABC DiG Radio:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2317:630 -+ABC DiG Jazz:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2318:631 -+SBS HD:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:848 -+SBS DIGITAL 1:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:849 -+SBS DIGITAL 2:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:850 -+SBS EPG:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:851 -+SBS RADIO 1:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:862 -+SBS RADIO 2:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:863 -+SCT Hobart:212500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:625:626:2306 -+SCT - HD:212500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:3611:0:2338 -+WIN TELEVISION:184500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:116:117:1 -+WIN HD:184500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:129:130:10 -+TDT - SD:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:657:658:2071 -+TDT - HD:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:3511:0:2103 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Melbourne dvb-apps/util/szap/channels-conf/dvb-t/au-Melbourne ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Melbourne 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/au-Melbourne 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,17 @@ -+ABC HDTV:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:2308:560 -+ABC TV Melbourne:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:561 -+ABC DiG Radio:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2310:566 -+TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1585 -+TEN HD:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1592 -+Nine Digital:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:519:720:1072 -+Nine Digital HD:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:0:1073 -+Nine Guide:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:517:700:1074 -+7 Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1328 -+7 HD Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:833:834:1332 -+7 Program Guide:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:865:866:1334 -+SBS HD:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:784 -+SBS DIGITAL 1:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:785 -+SBS DIGITAL 2:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:786 -+SBS EPG:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:787 -+SBS RADIO 1:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:798 -+SBS RADIO 2:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:799 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Sydney-NorthShore dvb-apps/util/szap/channels-conf/dvb-t/au-Sydney-NorthShore ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Sydney-NorthShore 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/au-Sydney-NorthShore 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,31 @@ -+ABC HDTV:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:0:544 -+ABC TV Sydney:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:545 -+ABC TV 2:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:546 -+ABC TV 3:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:547 -+ABC TV 4 :226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:548 -+ABC DiG Radio:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2310:550 -+Test.:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:0:549 -+7 Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:514:1312 -+7 Digital 1:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:514:1313 -+7 Digital 2:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:514:1314 -+7 Digital 3:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:514:1315 -+7 HD Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:577:578:1316 -+Program Guide:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:609:610:1318 -+NINE DIGITAL:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:519:720:1 -+NINE HD:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:0:5 -+NINE GUIDE:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:517:720:6 -+TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1569 -+TEN Digital 1:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1570 -+TEN Digital 2:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1571 -+TEN Digital 3:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1572 -+TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1573 -+TEN Digital 4:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1574 -+TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1575 -+TEN HD:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1576 -+Ten Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1577 -+SBS HD:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:768 -+SBS DIGITAL 1:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:769 -+SBS DIGITAL 2:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:770 -+SBS EPG:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:772 -+SBS RADIO 1:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:782 -+SBS RADIO 2:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:783 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/cz-Praha dvb-apps/util/szap/channels-conf/dvb-t/cz-Praha ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/cz-Praha 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/cz-Praha 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,16 @@ -+CT2.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:512:650:1 -+Nova.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:661:2 -+CT1.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:2325:2326:3 -+Prima.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:514:671:4 -+Stanice O.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:2322:2323:5 -+Radiozurnal.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:652:6 -+Praha.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:653:7 -+Vltava.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:651:8 -+iTV:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:9 -+Prima:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:161:84:1 -+CT2:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:164:96:4 -+TV Program:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2501:2502:5 -+RADIO2:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2832:6 -+RADIO:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2831:9 -+Proglas:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:180:11 -+Nova.:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:205:206:3 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Berlin dvb-apps/util/szap/channels-conf/dvb-t/de-Berlin ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Berlin 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/de-Berlin 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,47 @@ -+rbb Brandenburg:522000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1101:1102:11 -+rbb Berlin:522000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1201:1202:12 -+Phoenix:522000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1301:1302:13 -+Das Erste:522000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1401:1402:14 -+ARD-MHP-Data:522000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16 -+ZDF:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:545:546:514 -+Info/3sat:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:561:562:515 -+Doku/KiKa:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:593:594:517 -+SAT.1:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:385:386:16408 -+N24:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:225:226:16398 -+ProSieben:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:305:306:16403 -+KABEL1:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:162:16394 -+MDR FERNSEHEN:191500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:101:102:1 -+ARD-Online-Kanal:191500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:10 -+ARD-MHP-Data:191500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:9 -+NDR FERNSEHEN:191500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:301:302:3 -+arte:191500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:201:202:2 -+Test Programm:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:3841:3842:16624 -+SUD enhanced:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16650 -+13 TH STREET:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:4273:4274:16651 -+BMCO Nokia IPDC Signalling:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16652 -+BMCO Nokia IPDC 1:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16653 -+BMCO Nokia IPDC 2:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16654 -+BMCO Nokia IPDC 3:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16655 -+IP Services:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16640 -+Media Broadcast Services:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16641 -+SUD:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16642 -+SUD 1:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16643 -+Kathrein Download:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16644 -+HUMAX DOWNLOAD SVC:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16645 -+BMCO Nokia IPDC 4:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16656 -+BMCO Nokia IPDC 5:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16657 -+BMCO Nokia IPDC 6:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16658 -+BMCO Nokia IPDC 7:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16659 -+BMCO Nokia IPDC 8:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16660 -+RTL:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:337:338:16405 -+RTL2:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:353:354:16406 -+Super RTL:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:433:434:16411 -+VOX:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:545:546:16418 -+Südwest BW/RP:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:257:258:16 -+WDR:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:241:242:15 -+BBC World:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:49:50:16387 -+FAB:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:3073:3074:16576 -+DSF:754000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:129:130:16392 -+Testkanal NEUN LIVE:754000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:273:274:16401 -+VIVA Plus:754000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:529:530:16417 -+Eurosport:754000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:577:578:16420 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Braunschweig dvb-apps/util/szap/channels-conf/dvb-t/de-Braunschweig ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Braunschweig 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/de-Braunschweig 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+arte:198500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4385:4386:2 -+Phoenix:198500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4401:4402:3 -+EinsExtra:198500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4417:4418:4 -+Das Erste:198500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4369:4370:128 -+ZDF:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:514 -+Info/3sat:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:561:562:515 -+Doku/KiKa:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:593:594:517 -+RTL Television:498000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:337:338:16405 -+RTL2:498000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:353:354:16406 -+Super RTL:498000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:369:370:16407 -+VOX:498000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:16418 -+hr-fernsehen:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4673:4674:65 -+MDR FERNSEHEN:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4657:4658:100 -+NDR FS NDS:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:129 -+NDR FS HH *:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:130 -+NDR FS SH *:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:131 -+NDR FS MVP *:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:132 -+WDR Köln:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4641:4642:262 -+SAT.1:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:385:386:16408 -+N24:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:225:226:16398 -+ProSieben:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:305:306:16403 -+KABEL1:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:162:16394 -+Eurosport:786000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:577:578:16420 -+TERRA NOVA:786000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:609:610:16422 -+TELE 5:786000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:465:466:16413 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Bremen dvb-apps/util/szap/channels-conf/dvb-t/de-Bremen ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Bremen 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/de-Bremen 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,25 @@ -+arte:482000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:202:2 -+Phoenix:482000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:3 -+NDR RB:482000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:518:519:161 -+Das Erste RB:482000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:261:262:160 -+hr-fernsehen:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4673:4674:65 -+MDR FERNSEHEN:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4657:4658:100 -+NDR FS NDS:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:129 -+NDR FS HH *:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:130 -+NDR FS SH *:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:131 -+NDR FS MVP *:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:132 -+WDR Köln:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4641:4642:262 -+ZDF:562000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:514 -+Info/3sat:562000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:561:562:515 -+Doku/KiKa:562000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:593:594:517 -+RTL Television:642000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:337:338:16405 -+RTL2:642000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:353:354:16406 -+Super RTL:642000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:369:370:16407 -+VOX:642000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:16418 -+Eurosport:666000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:577:578:16420 -+TERRA NOVA:666000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:609:610:16422 -+TELE 5:666000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:465:466:16413 -+SAT.1:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:385:386:16408 -+N24:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:225:226:16398 -+ProSieben:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:305:306:16403 -+KABEL1:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:162:16394 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Koeln-Bonn dvb-apps/util/szap/channels-conf/dvb-t/de-Koeln-Bonn ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Koeln-Bonn 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/de-Koeln-Bonn 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,23 @@ -+RTL Television:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:337:338:16405 -+RTL2:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:353:354:16406 -+Super RTL:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:433:434:16411 -+VOX:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:16418 -+ZDF:514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:514 -+Info/3sat:514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:561:562:515 -+Doku/KiKa:514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:593:594:517 -+MDR Fernsehen:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4657:4658:100 -+NDR FS NDS:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4641:4642:129 -+SÜDWEST RP:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4673:4674:226 -+WDR Köln:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:262 -+N24:650000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:225:226:16398 -+ProSieben:650000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:305:306:16403 -+KABEL1:650000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:162:16394 -+SAT.1:650000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:2078:2077:16408 -+arte:826000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4385:4386:2 -+Phoenix:826000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4401:4402:3 -+EinsMuXx:826000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4417:4418:6 -+Das Erste:826000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4369:4370:256 -+Eurosport:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:577:578:16420 -+VIVA:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:513:514:16416 -+TERRA NOVA:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:609:610:16422 -+CNN Int.:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:97:98:16390 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Leipzig dvb-apps/util/szap/channels-conf/dvb-t/de-Leipzig ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Leipzig 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/de-Leipzig 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,7 @@ -+# channels.conf for DVB-T - Leipzig (Germany) Transmitter -+# Generated by Albrecht Lohoefener -+ -+MDR:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1553:1554:97 -+rbb:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:2833:2834:177 -+WDR:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:4193:4194:262 -+BR:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:529:530:33 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Luebeck dvb-apps/util/szap/channels-conf/dvb-t/de-Luebeck ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Luebeck 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/de-Luebeck 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,22 @@ -+ZDF:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:545:546:514 -+Info/3sat:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:561:562:515 -+Doku/KiKa:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:593:594:517 -+Bayerisches Fernsehen:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5185:5186:34 -+MDR FERNSEHEN:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5169:5170:100 -+NDR FS NDS *:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5137:5138:129 -+NDR FS HH *:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5137:5138:130 -+NDR FS SH:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5137:5138:131 -+NDR FS MVP *:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5137:5138:132 -+WDR Köln:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5153:5154:262 -+N24:546000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:225:226:16398 -+ProSieben:546000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:305:306:16403 -+KABEL1:546000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:161:162:16394 -+SAT.1:546000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:385:386:16408 -+arte:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4385:4386:2 -+Phoenix:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4401:4402:3 -+EinsExtra:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4417:4418:4 -+Das Erste:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4369:4370:128 -+RTL Television:626000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:337:338:16405 -+RTL2:626000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:353:354:16406 -+Super RTL:626000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:369:370:16407 -+VOX:626000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:16418 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Rhein-Main dvb-apps/util/szap/channels-conf/dvb-t/de-Rhein-Main ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Rhein-Main 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/de-Rhein-Main 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,6 @@ -+c8:198500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82 -+c22:482000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82 -+c34:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82 -+c54:738000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82 -+c57:762000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82 -+c64:818000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Ruhrgebiet dvb-apps/util/szap/channels-conf/dvb-t/de-Ruhrgebiet ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Ruhrgebiet 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/de-Ruhrgebiet 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,46 @@ -+# channels.conf for dvb-t in germany, broadcasting area 'Duesseldorf/Ruhrgebiet'. -+# see -+# http://nrw.ueberallfernsehen.de/fileadmin/downloads/Programm_Ruhr_2005_04_04_final.pdf -+# for details on the regional availability of some channels (see the comments below). -+# -+RTL Television:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:337:338:16405 -+RTL2:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:353:354:16406 -+Super RTL:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:433:434:16411 -+VOX:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:16418 -+ZDF:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:514 -+Info/3sat:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:561:562:515 -+Doku/KiKa:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:593:594:517 -+CNN Int.:722000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:97:98:16390 -+VIVA:722000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:513:514:16416 -+Eurosport:722000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:577:578:16420 -+TERRA NOVA:722000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:609:610:16422 -+ProSieben:746000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:305:306:16403 -+SAT.1:746000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:385:386:16408 -+KABEL1:746000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:162:16394 -+N24:746000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:225:226:16398 -+arte:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4385:4386:2 -+Phoenix:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4401:4402:3 -+EinsMuXx:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4417:4418:6 -+Das Erste:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4369:4370:256 -+## -+### regionale Sender/regional channels -+## -+## Kanal 25; Senderstandorte/broadcasting locations: Langenberg, Dortmund -+MDR FERNSEHEN-25:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5425:5426:100 -+NDR FS NDS-25:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5409:5410:129 -+SUEDWEST RP-25:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5441:5442:226 -+WDR Dortmund-25:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5393:5394:259 -+WDR Essen-25:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5393:5394:261 -+# -+## Kanal 46; Senderstandorte/broadcasting locations: Duesseldorf, Wesel, Langenberg -+MDR FERNSEHEN-46:674000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4913:4914:100 -+NDR FS NDS-46:674000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4897:4898:129 -+SUEDWEST RP-46:674000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4929:4930:226 -+WDR Duesseldorf-46:674000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4881:4882:260 -+WDR Wuppertal-46:674000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4881:4882:265 -+## Kanal 59; Senderstandorte/broadcasting locations: Essen -+MDR FERNSEHEN-59:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5169:5170:100 -+NDR FS NDS-59:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5153:5154:129 -+SUEDWEST RP-59:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5185:5186:226 -+WDR Dortmund-59:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5137:5138:259 -+WDR Essen-59:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5137:5138:261 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Alpicat dvb-apps/util/szap/channels-conf/dvb-t/es-Alpicat ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Alpicat 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/es-Alpicat 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+#channels.conf for DVB-T - Alpicat (Lleida) Transmitter -+ -+#C42 -+TV3:642000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:111:112:801 -+K3/33:642000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:121:122:802 -+3/24:642000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:131:132:803 -+Canal Pilot:642000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:141:142:804 -+3XL.net:642000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:151:152:805 -+ -+#C58 -+TVE 1:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:1377 -+TVE 2:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:1441 -+ANTENA 3:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:1121 -+CANAL+:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:1057 -+TELECINCO:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:403:1185 -+ -+#C66 -+Veo TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:1536 -+Net TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:402:1825 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Collserola dvb-apps/util/szap/channels-conf/dvb-t/es-Collserola ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Collserola 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/es-Collserola 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+#channels.conf for DVB-T - Collserola (Barcelona) Transmitter -+ -+#C43 -+TV3:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:111:112:801 -+K3/33:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:121:122:802 -+3/24:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:131:132:803 -+Canal Pilot:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:141:142:804 -+3XL.net:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:151:152:805 -+ -+#C61 -+TVE 1:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:1377 -+TVE 2:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:1441 -+ANTENA 3:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:1121 -+CANAL+:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:1057 -+TELECINCO:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:403:1185 -+ -+#C66 -+Veo TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:1536 -+Net TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:402:1825 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Madrid dvb-apps/util/szap/channels-conf/dvb-t/es-Madrid ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Madrid 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/es-Madrid 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,26 @@ -+TVE 1:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:380 -+TVE 2:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:381 -+24H TVE:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1001:1003:382 -+RNE1:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:2001:385 -+RNEC:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:2011:386 -+CLAN/50 TVE:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1501:1503:383 -+RNE3:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:2021:387 -+TM3:810000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:111:113:421 -+LAOTRA:810000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:211:212:422 -+ONDA6:810000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:311:312:423 -+TELEDEPORTE:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:100 -+VEO TV:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1001:1002:260 -+VEO 2:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:261 -+NET TV:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1501:1502:300 -+CUATRO:842000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:160:80:1057 -+CNN+:842000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:84:1058 -+40 LATINO:842000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:162:88:1059 -+LA SEXTA 1:842000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1501:0:340 -+T5 Estrellas:850000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:301:181 -+T5 Sport:850000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:202:302:182 -+Telecinco:850000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:203:303:180 -+FLYMUSIC:850000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1501:1502:301 -+antena 3:858000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:140 -+a3.neox:858000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:141 -+a3.nova:858000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1001:1003:142 -+La Sexta 2:858000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1501:0:341 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Mussara dvb-apps/util/szap/channels-conf/dvb-t/es-Mussara ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Mussara 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/es-Mussara 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,19 @@ -+#channels.conf for DVB-T - La Mussara (Reus-Tarragona) Transmitter -+ -+#C56 -+TV3:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:111:112:801 -+K3/33:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:121:122:802 -+3/24:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:131:132:803 -+Canal Pilot:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:141:142:804 -+3XL.net:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:151:152:805 -+ -+#C59 -+TVE 1:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:1377 -+TVE 2:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:1441 -+ANTENA 3:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:1121 -+CANAL+:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:1057 -+TELECINCO:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:403:1185 -+ -+#C66 -+Veo TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:1536 -+Net TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:402:1825 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Crystal-Palace dvb-apps/util/szap/channels-conf/dvb-t/uk-Crystal-Palace ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Crystal-Palace 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/uk-Crystal-Palace 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,67 @@ -+#channels.conf for DVB-T - Crystal Palace Transmitter -+ -+# Multiplex 1 BBC - Channel 25, Offset -, Freq 505833333 -+BBCi:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0:4479 -+CBBC Channel:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0:4671 -+BBC ONE:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601 -+BBC TWO:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611 -+BBC THREE:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 -+BBC NEWS 24:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641 -+ -+# Multiplex 2 Digital 3&4 - Channel 22, Offset -, Freq 481833333 -+Teletext:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+FourText:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+CHANNEL4:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2827:2828 -+ITV NEWS:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2850:2851 -+ITV 1:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:512:650 -+ITV 2:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819 -+Ch 14:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841 -+ -+#Multiplex A SDN - Channel 32, Offset -, Frequency 561833333 -+ntl:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+Ch 15:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660 -+BBC Radio 1:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6210 -+BBC Radio 2:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6226 -+BBC Radio 3:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6242 -+BBC Radio 4:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6258 -+QVC:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050 -+FIVE:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018 -+bid-up.tv:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274 -+TV Travel Shop:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6161 -+ -+#Multiplex B BBC - Channel 28, Offset -, Frequency 529833333 -+#Community (0x4e00) 01: PCR 0x1fff -+#703 (0x4c80) 01: PCR 0x1fff -+BBC PARLMNT:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403 -+BBC FOUR:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401 -+701:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411 -+702:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407 -+CBeebies:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402 -+BBC Asian Net:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:435 -+1Xtra BBC:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:434 -+BBC 7:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:433 -+BBC 6 Music:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:432 -+BBC 5L SportsX:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:431 -+BBC R5 Live:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:430 -+ -+# Multiplex C Crown Castle - Channel 34, Offset +, Frequency 578166666 -+UKHistory:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402 -+Sky Travel:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302 -+Sky Spts News:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 -+Sky News:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 -+ -+# Multiplex D Crown Castle - Channel 29, Offset -, Freq 537833333 -+#UKBrightIdeas (0x64c0) 01: PCR 0x1fff -+THE HITS:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 -+TMF:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 -+CBM:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:501:502 -+Free2Play:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+Q:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1901 -+Magic:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1801 -+The Hits Radio:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1701 -+BBC World Sv:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1601 -+oneworld:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1501 -+jazz fm:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1401 -+Kerrang:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1301 -+Smash Hits:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1201 -+Kiss:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1101 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Hannington dvb-apps/util/szap/channels-conf/dvb-t/uk-Hannington ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Hannington 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/uk-Hannington 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,28 @@ -+BBC One:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601 -+BBC Two:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611 -+CBBC:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 -+BBC Three:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 -+BBC News 24:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641 -+CBeebies:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401 -+BBC Four:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401 -+BBC Parliament:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403 -+701:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407 -+702:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411 -+703:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+ITV 1:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651 -+ITV 2:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819 -+Channel 4:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823 -+ITV News:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823 -+price-drop.tv:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841 -+Five:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018 -+QVC:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6059:6050 -+Tv Travel Shop:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6162 -+Channel 15:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660 -+bid-up.tv:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274 -+Sky News:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 -+Sky Sports News:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 -+Sky Travel:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302 -+UK History:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402 -+The Hits:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 -+TMF:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 -+UK Bright Ideas:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Oxford dvb-apps/util/szap/channels-conf/dvb-t/uk-Oxford ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Oxford 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/uk-Oxford 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,41 @@ -+BBC-Choice:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 -+BBC-Knowledge:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:630:631 -+BBC-News24:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641 -+BBC-1:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601 -+BBC-Parliament:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660 -+BBC-2:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611 -+ITV-1:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651 -+ITV-2:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819 -+ITV-Sport:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2836:2837 -+FilmFour:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823 -+C4:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2826:2827 -+E4:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2831:2832 -+C5:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018 -+Shop:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050 -+ITVSelect-Info:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6065:6066 -+ITVSelect-1:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6081:6082 -+ITVSelect-2:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6097:6098 -+ITVSelect-3:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6113:6114 -+ITVSelect-4:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6129:6130 -+Carlton-Cinema:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289 -+Sky-One:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545 -+Sky-Sports-1:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801 -+Sky-Premier:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1056:1057 -+CartoonNetwork:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313 -+UK-Horizons:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2336:2337 -+ITV-Sport-Plus:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2592:2593 -+ITVSportSelect:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:2596 -+BreezeMen&Mtrs:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801 -+Granada-Plus:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545 -+MTV:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1568:1569 -+Sky-Movie-Max:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313 -+Sky-Sports-2:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2080:2081 -+UK-Gold:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289 -+Wellbeing:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1824:1825 -+PLAY-uk:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289 -+UK-Style:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545 -+no-name:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801 -+Discovery:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313 -+Nick/Paramount:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2080:2081 -+Sky-Sports-3:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2336:2337 -+Brit-Eurosport:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2592:2593 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Reigate dvb-apps/util/szap/channels-conf/dvb-t/uk-Reigate ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Reigate 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/uk-Reigate 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,51 @@ -+BBC ONE:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601 -+BBC TWO:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611 -+ITV 1:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:512:650 -+Channel 4:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2827:2828 -+five:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018 -+ITV 2:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819 -+BBC THREE:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+Teletext:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+BBC FOUR:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+Sky Travel:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302 -+UKHistory:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402 -+Ch 14:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841 -+Ch 15:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660 -+QVC:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050 -+TV Travel Shop:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6162 -+The HITS:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 -+UKBrightIdeas:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302 -+f tn:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+TMF:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 -+bid-up.tv:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274 -+CBM:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:501:502 -+CBBC Channel:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 -+CBeebies:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401 -+BBC NEWS 24:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641 -+ITV News:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2850:2851 -+Sky News:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 -+Sky Spts News:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 -+BBC PARLMNT:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403 -+Community:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+FourText:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+BBCi:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+ntl:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -+BBC Radio 1:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6210 -+1Xtra BBC:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:434 -+BBC Radio 2:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6226 -+BBC Radio 3:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6242 -+BBC Radio 4:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6258 -+BBC R5 Live:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:430 -+BBC 5L SportsX:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:431 -+BBC 6 Music:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:432 -+BBC 7:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:433 -+BBC Asian Net.:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:435 -+BBC World Sv.:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1601 -+Smash Hits!:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1201 -+Kiss:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1101 -+Kerrang!:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1301 -+jazz fm:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1401 -+oneword:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1501 -+701:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407 -+702:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411 -+703:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Sandy-Heath dvb-apps/util/szap/channels-conf/dvb-t/uk-Sandy-Heath ---- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Sandy-Heath 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/channels-conf/dvb-t/uk-Sandy-Heath 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,12 @@ -+BBC-Choice:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 -+BBC-Knowledge:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:630:631 -+BBC-News24:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641 -+BBC-1:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601 -+BBC-Parliament:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660 -+BBC-2:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611 -+ITV-1:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651 -+ITV-2:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2819:2820 -+C4:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2823:2824 -+E4:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2831:2832 -+C5:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018 -+Shop:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbc-berlin dvb-apps/util/szap/channels.conf-dvbc-berlin ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbc-berlin 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbc-berlin 1970-01-01 01:00:00.000000000 +0100 -@@ -1,171 +0,0 @@ --3sat:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:210:220 --ARD-Online-Kanal:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1805 --CNBC:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:510:520 --DLF-Köln:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:810 --DLR-Berlin:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:710 --EinsExtra:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:101:102 --EinsFestival:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:201:202 --EinsMuXx:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:301:302 --EuroNews:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2221:2233 --Eurosport:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:410:420 --Fritz:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:901 --KiKa:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:310:320 --MDR FERNSEHEN:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:401:402 --MDR KULTUR:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:801 --MDR info:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1101 --MHP ARD Online-Kanal:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:102 --NDR Fernsehen:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2401:2402 --ORB-Fernsehen:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:501:502 --RADIOmultikulti:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1301 --Radio 3:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:701 --SFB1:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:601:602 --SWR2:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1401 --SÜDWEST BW:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:801:802 --SÜDWEST RP:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3101:3102 --WDR 3:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1501 --WDR 5:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1601 --ZDF:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:110:120 --ZDFdigitext:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --ZDFdokukanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:660:670 --ZDFinfokanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:610:620 --ZDFtheaterkanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --JUMP:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1001 --SPUTNIK:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1201 --Österreich 1:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:169 --ATV 2:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:631:632 --ATV 2:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:631:632 --Adagio:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --All Jazz:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Avante:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:741:743 --B5 aktuell:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3101 --BBC Prime:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:761:762 --BData3:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --BData4:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --BData5:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --BR-alpha:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702 --Barock Fantasie:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Bayerisches FS:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:201:202 --Bayern 1:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3601 --Bayern 4 Klassik:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3001 --BibelTV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:731:732 --Bloomberg:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --CLASSICA:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:767:768 --COUNTRY:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:656 --Canal 24 Horas:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:991:992 --Club:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:711:713 --Cristal New Age:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --DANCE:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:304 --DW-tv:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:634:632 --Das Erste:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:101:102 --Detskij Mir:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:931:932 --ERT-Sat:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:691:692 --Einstein TV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702 --Euronews:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:597:596 --Eurosport News:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:771:772 --Extreme Sports:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:791:793 --Extreme Sports:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Fashion TV:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Fox Kids:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:671:672 --Fox Kids:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:671:673 --GOLD:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:320 --HITLISTE:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:784 --HR XXL:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3501 --JAZZ:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:640 --Jazz legends:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Kabel Wizard:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Kanal 7:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Kanal 7:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:49:52 --Kanal D:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:651:652 --Kanal D:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:651:652 --LATIN:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:368 --Landscape:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Leitseite:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2254:0 --Liberty TV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:721:723 --MTV Base:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:781:782 --MV-Test:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Modem-Setup:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Movie Sounds:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Musica Antica:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --Musica Camerata:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --NDR Info:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3701 --NTV international:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --NTVI:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:611:612 --Nashe Kino:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:621:622 --NordwestRadio:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3801 --OLD GOLD:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:336 --Opernfestival:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --PCNE:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:681:682 --PREMIERE SPORT INTERACTIVE:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --PREMIERE DIREKT 1:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --PREMIERE DIREKT 2:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --PREMIERE DIREKT 3:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --PREMIERE DIREKT 4:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2815:2816 --PREMIERE EROTIK:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280 --PREMIERE NOSTALGIE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2559:2560 --PREMIERE SERIE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024 --PREMIERE SPORT 1:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:258 --PREMIERE SPORT 2:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3839:3840 --PREMIERE START:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:256 --Parlamentsfernsehen:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:33:36 --Phoenix:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:901:902 --Portal:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --RTP Internacional:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:661:662 --Rai 1:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:951:952 --Rai 2:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:961:962 --Rai 3:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:971:972 --SCHLAGER:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:384 --SR 1:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3901 --SR Fernsehen Suedwest:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:501:502 --Show TV:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:911:912 --Sinfonica:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --TGRT:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:921:922 --TM V1.0:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --TV Polonia:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:641:642 --TVEi:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:981:982 --TW1:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:751:752 --Test-R:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702 --Travel:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:595:594 --VCR-Setup:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --VH1 Classic:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:604:603 --Videotext:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --WDR FERNSEHEN:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:601:602 --ZEE TV:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --arte:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:401:403 --hessen fernsehen:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:301:302 --hr-chronos:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3201 --hr-klassik:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3401 --hr2:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3301 --13 TH STREET:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2303:2304 --ALTERNATIVE ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:544 --BEATE-UHSE.TV:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024 --CHILLOUT:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:400 --CLASSIC ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:352 --DISCOVERY CHANNEL:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1792 --DISNEY CHANNEL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2559:2560 --DEUTSCHE HITS:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:800 --EASY LISTENING:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:608 --Einstein:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --FILM & MUSICAL:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:592 --FOX KIDS:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280 --GOLDSTAR TV:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3839:3840 --HARD ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:816 --HEIMATKANAL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536 --HIP HOP/R&B:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:576 --JUNIOR:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:256 --K-TOON:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 --KLASSIK POPULÄR:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:624 --KRIMI &CO:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536 --LOVE SONGS:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:592 --NEW COUNTRY:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:384 --ORCHESTRALE WERKE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:560 --PLANET:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1792 --PREMIERE 1:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:511:512 --PREMIERE 2:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1793 --PREMIERE 3:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2303:2304 --PREMIERE 4:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:767:768 --PREMIERE 5:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280 --PREMIERE 6:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536 --PREMIERE 7:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024 --SOUL CLASSICS:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:352 --STUDIO UNIVERSAL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2047:2048 --Sonnenklar TV:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbs-astra dvb-apps/util/szap/channels.conf-dvbs-astra ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbs-astra 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbs-astra 1970-01-01 01:00:00.000000000 +0100 -@@ -1,226 +0,0 @@ --Das Erste:11837:h:0:27500:101:102:1:28106 --ZDF:11954:h:0:27500:110:120:1:28006 --3sat:11954:h:0:27500:210:220:1:28007 --EinsMuXx:12110:h:0:27500:301:302:1:28203 --EinsFestival:12110:h:0:27500:201:202:1:28202 --EinsExtra:12110:h:0:27500:101:102:1:28201 --MDR FERNSEHEN:12110:h:0:27500:401:402:1:28204 --ORB-Fernsehen:12110:h:0:27500:501:502:1:28205 --B1 Berlin:12110:h:0:27500:601:602:1:28206 --SWR Fernsehen:11837:h:0:27500:801:802:1:28113 --SR Fernsehen Suedwes:11837:h:0:27500:501:502:1:28110 --hessen fernsehen:11837:h:0:27500:301:302:1:28108 --WDR FERNSEHEN:11837:h:0:27500:601:602:1:28111 --Bayerisches FS:11837:h:0:27500:201:202:1:28107 --N3:12110:h:0:27500:2401:2402:1:28224 --BR-alpha:11837:h:0:27500:701:702:1:28112 --KiKa:11954:h:0:27500:310:320:1:28008 --arte:11836:h:0:27500:401:402:1:28109 --ZDF Theaterkanal:11954:h:0:27500:1110:1120:1:28016 --ZDF.info:11954:h:0:27500:610:620:1:28011 --ZDF.doku:11954:h:0:27500:660:670:1:28014 --Phoenix:11837:h:0:27500:901:902:1:28114 --DW-tv:10786:v:0:21997:305:306:1:9005 --RTL Television:12188:h:0:27500:163:104:1:12003 --SAT.1:12480:v:0:27500:1791:1792:1:46 --ProSieben:12480:v:0:27500:255:256:1:898 --RTL2:12188:h:0:27500:166:128:1:12020 --Super RTL:12188:h:0:27500:165:120:1:12040 --KABEL1:12480:v:0:27500:511:512:1:899 --VOX:12188:h:0:27500:167:136:1:12060 --tm3:12480:v:0:27500:767:768:1:897 --Bloomberg TV Germany:12552:v:0:22000:162:99:1:12160 --EuroNews:11954:h:0:27500:2221:2233:1:28015 --N24:12480:v:0:27500:2047:2048:1:47 --n-tv:12670:v:0:22000:162:96:1:12730 --DSF:12480:v:0:27500:1023:1024:1:900 --Eurosport:11954:h:0:27500:410:420:1:28009 --Via 1 - Sch ner Re:12148:h:0:27500:511:512:1:44 --Home Order Tel:12480:v:0:27500:1279:1280:1:40 --QVC GERMANY:12552:v:0:22000:165:166:1:12100 --TW 1:12692:h:0:22000:166:167:1:13013 --Canal Canarias:12441:v:0:27500:513:681:1:29700 --ProSieben A:12051:v:0:27500:161:84:1:20002 --ProSieben CH:12051:v:0:27500:289:290:1:20001 --Kabel 1 Austria:12051:v:0:27500:166:167:1:20004 --Kabel 1 Schweiz:12051:v:0:27500:162:163:1:20003 --CNN Int.:12168:v:0:27500:165:100:1:28512 --Sky News:12552:v:0:22000:305:306:1:3995 --Travel:12168:v:0:27500:163:92:1:28001 --AB SAT / XXL:12266:h:0:27500:164:96:1:17004 --MOTEURS:12266:h:0:27500:160:80:1:17000 --HOT GM:12148:h:0:27500:767:768:1:45 --KTO:12129:v:0:27500:170:120:1:8411 --LA CINQUIEME:12207:v:0:27500:160:80:1:8501 --LCP:12207:v:0:27500:165:100:1:8506 --LibertyTV.com:12611:v:0:22000:941:942:1:12280 --TV5 Europe:12611:v:0:22000:45:46:1:12240 --Motors TV:12611:v:0:22000:191:194:1:12300 --Wishline:12611:v:0:22000:214:216:1:12320 --TV 5:10786:v:0:21997:164:112:1:9001 --RTM - MAROC:10786:v:0:21997:162:96:1:9002 --ESC1 - EGYPTE:10786:v:0:21997:163:104:1:9003 --RAI 1:10786:v:0:21997:289:290:1:9004 --RTPI:10786:v:0:21997:300:301:1:9006 --TV7:10786:v:0:21997:166:128:1:9007 --ARTE:10786:v:0:21997:167:136:1:9009 --Colourbars:12611:v:0:22000:48:49:1:3982 --Alice:12611:v:0:22000:162:96:1:12200 --Video Italia:12611:v:0:22000:121:122:1:12220 --ANDALUCIA TV:11934:v:0:27500:166:104:1:29011 --TVC INT.:12441:v:0:27500:512:660:1:29701 --TV4:11992:h:0:27500:165:98:1:20365 --TV Niepokalanow:11876:h:0:27500:161:82:1:20601 --VIVA:12670:v:0:22000:309:310:1:12732 --VIVA ZWEI:12552:v:0:22000:171:172:1:12120 --MTV Central:12699:v:0:22000:3031:3032:1:28643 --ONYX:12692:h:1:27500:161:84:1:502 --VIVA polska:11603:h:1:27500:190:191:1:611 --DeeJay TV:11603:h:1:27500:160:161:1:602 --NBC:11053:h:1:27500:550:551:1:8008 --EWTN:10722:h:1:29900:1001:1201:1:4601 --MTA INTL:10722:h:1:29900:1004:1204:1:4604 --VOX:11053:h:1:27500:500:501:1:8002 --SAT.1 A:11053:h:1:27500:511:512:1:8003 --RTL2 AUSTRIA:11053:h:1:27500:520:521:1:8004 --ZDF:11053:h:1:27500:570:571:1:8011 --K-TV:11053:h:1:27500:580:581:1:8012 --RTL Television:11053:h:1:27500:160:80:1:8001 --ARTE:11059:v:1:6510:98:99:1:1 --HOT Italia:11095:h:1:27500:4194:4195:1:3714 --Olisat:11095:h:1:27500:33:34:1:3718 --VIVA-POLSKA:11128:h:1:4340:98:99:1:1 --DW-tv:11195:v:1:9099:101:102:1:5301 --Canal 24 Horas:11203:h:1:3999:4130:4131:1:5301 --TV5:11337:v:1:5631:512:640:1:1 --SAT.1 CH:11603:h:1:27500:101:102:1:601 --KurdSat:11603:h:1:27500:111:112:1:603 --ARD "Das Erste":11603:h:1:27500:172:173:1:606 --RTL 2 CH:11603:h:1:27500:175:176:1:609 --Super RTL A:11603:h:1:27500:180:181:1:610 --TV ROMANIA:11622:v:1:27500:227:247:1:10707 --MRTV:11622:v:1:27500:222:242:1:10702 --102.5 HIT Ch:11622:v:1:27500:224:244:1:10704 --TLC SAT:11622:v:1:27500:225:245:1:10705 --PRO-SAT:11622:v:1:27500:246:226:1:10706 --Channel SUN:11622:v:1:27500:229:249:1:10709 --Racing Channel:11622:v:1:27500:228:248:1:10708 --3 ABN:11622:v:1:27500:221:241:1:10701 --Bloom.Germany:11642:h:1:27500:1460:1420:1:4 --Bloomberg TV UK:11642:h:1:27500:1560:1520:1:4 --Sat 7:11642:h:1:27500:1660:1620:1:4 --EDTV 1:11746:h:1:27500:4130:4131:1:9501 --EDTV SPORT:11746:h:1:27500:4386:4387:1:9502 --EDTV BUSINESS:11746:h:1:27500:4642:4643:1:9503 --EDTV DRAMA:11746:h:1:27500:4898:4899:1:9504 --RAI1:11765:v:1:27499:160:80:1:3401 --RAI2:11765:v:1:27499:161:84:1:3402 --RAI3:11765:v:1:27499:162:88:1:3403 --RaiWayTEST2:11765:v:1:27499:516:654:1:3405 --RAIMOSAICO:11765:v:1:27499:518:8191:1:3407 --RAINews24:11803:v:1:27500:516:654:1:3301 --CAMERA DEPUTATI:11803:v:1:27500:517:655:1:3302 --TELEPACE:11803:v:1:27500:515:653:1:3304 --RAISPORTSAT:11803:v:1:27500:512:650:1:3305 --RAINettunoSAT2:11803:v:1:27500:513:651:1:3306 --RAIeducational:11803:v:1:27500:514:652:1:3307 --RAINettunoSAT1:11803:v:1:27500:519:657:1:3308 --SAT2000:11803:v:1:27500:518:656:1:3309 --I1:11918:v:1:27499:512:650:1:1 --C5:11918:v:1:27499:513:660:1:2 --R4:11918:v:1:27499:514:670:1:3 --Telesierra:12091:h:1:27500:4160:4161:1:8704 --C. Milagro:12091:h:1:27500:4368:4369:1:8711 --Italia Sat:12091:h:1:27500:4600:4601:1:8728 --TVE Internacional:12091:h:1:27500:4208:4209:1:8707 --Fiesta:12091:h:1:27500:4432:4433:1:8720 --Retelsat:12091:h:1:27500:4464:4465:1:8722 --ART EUROPE:12013:h:1:27495:164:96:1:450 --EGYPT SAT. CH. 2:12013:h:1:27495:166:104:1:470 --IQRA:12013:h:1:27495:168:112:1:474 --MAURITANIA TV:12110:v:1:27500:230:231:1:704 --ARMENIA TV:12110:v:1:27500:240:241:1:705 --SAILING CHANNEL:12110:v:1:27500:260:261:1:707 --AL JAZEERA:12110:v:1:27500:270:271:1:708 --Coming Soon TV:12110:v:1:27500:310:311:1:717 --SaluteBenessere:12110:v:1:27500:320:321:1:718 --AH-EDP1:12148:v:1:27499:96:97:1:7201 --AH-EDP2:12148:v:1:27499:112:113:1:7202 --Espresso:12148:v:1:27499:192:193:1:7203 --Alice:12148:v:1:27499:160:161:1:7220 --Nuvolari:12148:v:1:27499:176:177:1:7221 --Leonardo:12148:v:1:27499:128:129:1:7222 --AH-EDP3:12148:v:1:27499:36:37:1:7205 --OTE Promo:12187:v:1:27500:517:655:1:1001 --RTS SAT:12187:v:1:27500:519:657:1:1022 --ERT SAT:12187:v:1:27500:514:652:1:1102 --EXTRA:12187:v:1:27500:516:654:1:1106 --TRIAL:12187:v:1:27500:513:651:1:1108 --Minimax:11303:h:1:19540:300:301:1:3 --TVN1:12209:h:1:5631:4194:4195:1:1 --RR TEST:10978:v:1:8998:33:34:1:1 --TV 5 Thailand:10978:v:1:8998:1057:1058:1:2 --TEST-1:10978:v:1:8998:3105:3106:1:4 --FASHION:12244:h:1:27500:123:133:1:103 --AJARA TV:12244:h:1:27500:127:137:1:107 --SLO-TV1:12300:v:1:27495:200:201:1:3201 --POLONIA 1:12302:v:1:27500:205:206:1:3203 --SUPER 1:12302:v:1:27500:207:208:1:3207 --NAPOLI INT.:12302:v:1:27500:240:241:1:3210 --MAGIC:12302:v:1:27500:245:246:1:3211 --COUNTDOWN:12302:v:1:27500:235:236:1:3212 --TBNE:12302:v:1:27500:230:231:1:3213 --NAPOLI CHANNEL:12302:v:1:27500:227:228:1:3215 --KURDISTAN TV:12302:v:1:27500:225:226:1:3214 --ATLAS TV:12379:v:1:27500:3022:3032:1:3002 --TELE 24 SWITZERLAND:12379:v:1:27500:3023:3033:1:3003 --Abu Dhabi TV:12379:v:1:27500:3024:3034:1:3004 --RTV MONTENEGRO:12379:v:1:27500:3026:3036:1:3006 --JAAM-E-JAM 1:12436:h:1:27500:160:80:1:1 --JAAM-E-JAM 2:12436:h:1:27500:161:82:1:2 --SAHAR:12436:h:1:27500:162:84:1:3 --SAHAR 2:12436:h:1:27500:163:86:1:4 --IRINN:12436:h:1:27500:164:88:1:5 --Musicmax:11303:h:1:19540:500:501:1:6 --TEST:12474:h:1:27500:771:8191:1:10608 --EbS:12474:h:1:27500:101:201:1:10601 --MOU.2:12474:h:1:27500:42:43:1:10602 --PINK PLUS:12474:h:1:27500:308:256:1:10605 --LibertyTV.com:12474:h:1:27500:941:942:1:10603 --2M Maroc:12474:h:1:27500:601:602:1:10607 --ZEE TV:12474:h:1:27500:910:911:1:10604 --WorldNet Europe:12483:v:1:8299:4260:4220:1:1 --WorldNet:12483:v:1:8299:4560:4520:1:4 --SICILIA INTERNATIONA:12519:v:1:27499:501:502:1:8309 --SARDEGNA UNO:12519:v:1:27499:503:504:1:8310 --EuroMed:12519:v:1:27499:510:511:1:8312 --TGRT:12519:v:1:27499:505:506:1:8313 --VIDEOLINA:12519:v:1:27499:515:516:1:8318 --MEDIOLANUM:12538:h:1:27500:1131:1132:1:8987 --www.travel:12538:h:1:27500:1180:1183:1:8992 --MonteCarloSat:12538:h:1:27500:5126:5122:1:8877 --Bulgaria TV:12538:h:1:27500:4612:4613:1:8827 --TVN1:12571:h:1:5631:4194:4195:1:1 --JSTV 1:12595:v:1:27500:2000:2001:1:8213 --JSTV 2:12595:v:1:27500:2011:2013:1:8214 --MBC:12595:v:1:27500:160:80:1:8201 --ANN:12595:v:1:27500:161:84:1:8202 --BET:12595:v:1:27500:167:108:1:8208 --EuroNews:12595:v:1:27500:2221:2231:1:8211 --Sharjah Arabs:12653:h:1:27500:1160:1120:1:1 --Qatar Arabs:12653:h:1:27500:1260:1220:1:2 --Saudi 1 Arabs:12653:h:1:27500:1360:1320:1:3 --Kuwait Arabs:12653:h:1:27500:1460:1420:1:4 --Libya Arabs:12653:h:1:27500:1560:1520:1:5 --Sudan Arabs:12653:h:1:27500:1660:1620:1:6 --Oman Arabs:12653:h:1:27500:1760:1720:1:7 --Jordan Arabs:12653:h:1:27500:1860:1820:1:8 --IRAQ TV:12653:h:1:27500:1960:1920:1:9 --Dubai Sport:12653:h:1:27500:1060:1020:1:10 --Digitaly:12672:v:1:27500:220:221:1:4203 --Telemarket:12672:v:1:27500:350:351:1:4211 --eVision:12672:v:1:27500:360:361:1:4214 --Thai TV5:12672:v:1:27500:200:201:1:4201 --Studio Europa:12672:v:1:27500:230:231:1:4204 --Video Italia:12672:v:1:27500:340:341:1:4210 --GAME NETWORK:12672:v:1:27500:291:292:1:4213 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-australia dvb-apps/util/szap/channels.conf-dvbt-australia ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-australia 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbt-australia 1970-01-01 01:00:00.000000000 +0100 -@@ -1,31 +0,0 @@ --ABC HDTV:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:0:560 --ABC TV Melbourne:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:561 --ABC TV 2:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:562 --ABC TV 3:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:563 --ABC TV 4:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:564 --ABC DiG Radio:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2311:566 --TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1585 --TEN Digital 1:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1586 --TEN Digital 2:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1587 --TEN Digital 3:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1588 --TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1589 --TEN Digital 4:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1590 --TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1591 --TEN HD:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1592 --TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1593 --Nine Digital:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:513:660:1072 --Nine Digital HD:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:0:1073 --Nine Guide:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:670:1074 --7 Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1328 --7 Digital 1:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1329 --7 Digital 2:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1330 --7 Digital 3:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1331 --7 HD Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:833:834:1332 --7 Program Guide:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:865:866:1334 --SBS HD:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:784 --SBS DIGITAL 1:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:785 --SBS DIGITAL 2:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:786 --SBS EPG:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:787 --SBS RADIO 1:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:798 --SBS RADIO 2:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:799 -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-berlin dvb-apps/util/szap/channels.conf-dvbt-berlin ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-berlin 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbt-berlin 1970-01-01 01:00:00.000000000 +0100 -@@ -1,51 +0,0 @@ --c5:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82 --c7:191500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82 --c25:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82 --c27:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82 --c33:570000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82 --c44:658000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82 --c56:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82 --c59:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82 -- --SWR BW:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:257:258:16 --WDR:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:241:242:15 --BBC World:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:49:50:16387 --FAB:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:3073:3074:16576 -- --MDR Fernsehen:191500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:101:102:1 --arte:191500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:201:202:2 --NDR Fernsehen:191500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:301:302:3 -- --RTL:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:337:338:16405 --RTL2:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:353:354:16406 --Super RTL:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:433:434:16411 --VOX:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:545:546:16418 -- --Das Erste:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1401:1402:14 --Phoenix:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1301:1302:13 --RBB Berlin:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1201:1202:12 --RBB Brandenburg:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1101:1102:11 -- --ZDF:570000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:545:546:514 --Info/3sat:570000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:561:562:515 --Doku/KiKa:570000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:593:594:517 -- --Kabel 1:658000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:162:16394 --N24:658000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:225:226:16398 --ProSieben:658000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:305:306:16403 --SAT.1:658000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:385:386:16408 -- --DSF:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:129:130:16392 --Testkanal n-tv:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:273:274:16401 --VIVA Plus:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:529:530:16417 --Eurosport:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:577:578:16420 -- --Testkanal Eurosport:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:577:578:16420 --SUD:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16642 --HUMAX DOWNLOAD SVC:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16645 --IP Services:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16640 --Media Broadcast Services:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16641 --SUD 1:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16643 --Kathrein Download:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16644 --Testkanal MTV:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:193:194:16396 --Testkanal n-tv:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:273:274:16401 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-collserola dvb-apps/util/szap/channels.conf-dvbt-collserola ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-collserola 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbt-collserola 1970-01-01 01:00:00.000000000 +0100 -@@ -1,25 +0,0 @@ --#channels.conf for DVB-T - Collserola (Barcelona) Transmitter -- --#C43 --TV3:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:111:112:801 --K3/33:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:121:122:802 --3/24:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:131:132:803 --Canal Pilot:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:141:142:804 --3XL.net:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:151:152:805 -- --#C61 --TVE 1:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:1377 --TVE 2:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:1441 --ANTENA 3:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:1121 --CANAL+:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:1057 --TELECINCO:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:403:1185 -- --#C66 --Veo TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:1536 --Net TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:402:1825 --Video Promocional 1:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:210:212:425 --Video Promocional 2:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:110:0:420 --[1388]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5000 --[138c]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5004 --[138a]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5002 -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-crystal-palace dvb-apps/util/szap/channels.conf-dvbt-crystal-palace ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-crystal-palace 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbt-crystal-palace 1970-01-01 01:00:00.000000000 +0100 -@@ -1,70 +0,0 @@ --#channels.conf for DVB-T - Crystal Palace Transmitter -- --# Multiplex 1 BBC - Channel 25, Offset -, Freq 505833333 --BBCi:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0:4479 --CBBC Channel:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0:4671 --BBC ONE:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601 --BBC TWO:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611 --BBC THREE:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 --BBC NEWS 24:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641 -- --# Multiplex 2 Digital 3&4 - Channel 22, Offset -, Freq 481833333 --Teletext:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --FourText:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --CHANNEL4:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2827:2828 --ITV NEWS:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2850:2851 --ITV 1:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:512:650 --ITV 2:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819 --Ch 14:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841 -- --#Multiplex A SDN - Channel 32, Offset -, Frequency 561833333 --ntl:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --Ch 15:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660 --BBC Radio 1:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6210 --BBC Radio 2:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6226 --BBC Radio 3:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6242 --BBC Radio 4:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6258 --QVC:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050 --FIVE:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018 --bid-up.tv:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274 --TV Travel Shop:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6161 -- --#Multiplex B BBC - Channel 28, Offset -, Frequency 529833333 --#Community (0x4e00) 01: PCR 0x1fff --#703 (0x4c80) 01: PCR 0x1fff --BBC PARLMNT:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403 --BBC FOUR:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401 --701:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411 --702:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407 --CBeebies:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402 --BBC Asian Net:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:435 --1Xtra BBC:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:434 --BBC 7:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:433 --BBC 6 Music:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:432 --BBC 5L SportsX:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:431 --BBC R5 Live:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:430 -- --# Multiplex C Crown Castle - Channel 34, Offset +, Frequency 578166666 --UKHistory:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402 --Sky Travel:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302 --Sky Spts News:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 --Sky News:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 -- --# Multiplex D Crown Castle - Channel 29, Offset -, Freq 537833333 --#UKBrightIdeas (0x64c0) 01: PCR 0x1fff --THE HITS:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 --TMF:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 --CBM:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:501:502 --Free2Play:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --Q:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1901 --Magic:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1801 --The Hits Radio:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1701 --BBC World Sv:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1601 --oneworld:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1501 --jazz fm:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1401 --Kerrang:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1301 --Smash Hits:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1201 --Kiss:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1101 -- -- -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-hannington dvb-apps/util/szap/channels.conf-dvbt-hannington ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-hannington 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbt-hannington 1970-01-01 01:00:00.000000000 +0100 -@@ -1,28 +0,0 @@ --BBC One:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601 --BBC Two:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611 --CBBC:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 --BBC Three:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 --BBC News 24:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641 --CBeebies:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401 --BBC Four:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401 --BBC Parliament:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403 --701:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407 --702:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411 --703:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --ITV 1:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651 --ITV 2:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819 --Channel 4:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823 --ITV News:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823 --price-drop.tv:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841 --Five:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018 --QVC:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6059:6050 --Tv Travel Shop:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6162 --Channel 15:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660 --bid-up.tv:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274 --Sky News:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 --Sky Sports News:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 --Sky Travel:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302 --UK History:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402 --The Hits:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 --TMF:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 --UK Bright Ideas:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-madrid dvb-apps/util/szap/channels.conf-dvbt-madrid ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-madrid 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbt-madrid 1970-01-01 01:00:00.000000000 +0100 -@@ -1,16 +0,0 @@ --Veo TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:1536 --Net TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:402:1825 --[1388]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5000 --[138c]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5004 --[138a]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5002 --Video Promocional:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:420 --Informe Semanal:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:425 --TVE 2:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:1441 --ANTENA 3:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:1121 --TELECINCO:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:403:1185 --CANAL+:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:1057 --TVE 1:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:1377 --Telemadrid:810000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:111:113:421 --La Otra:810000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:211:212:422 --Quiero Madrid:810000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:411:412:424 --Onda 6:810000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:311:312:423 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-oxford dvb-apps/util/szap/channels.conf-dvbt-oxford ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-oxford 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbt-oxford 1970-01-01 01:00:00.000000000 +0100 -@@ -1,41 +0,0 @@ --BBC-Choice:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 --BBC-Knowledge:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:630:631 --BBC-News24:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641 --BBC-1:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601 --BBC-Parliament:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660 --BBC-2:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611 --ITV-1:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651 --ITV-2:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819 --ITV-Sport:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2836:2837 --FilmFour:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823 --C4:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2826:2827 --E4:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2831:2832 --C5:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018 --Shop:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050 --ITVSelect-Info:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6065:6066 --ITVSelect-1:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6081:6082 --ITVSelect-2:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6097:6098 --ITVSelect-3:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6113:6114 --ITVSelect-4:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6129:6130 --Carlton-Cinema:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289 --Sky-One:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545 --Sky-Sports-1:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801 --Sky-Premier:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1056:1057 --CartoonNetwork:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313 --UK-Horizons:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2336:2337 --ITV-Sport-Plus:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2592:2593 --ITVSportSelect:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:2596 --BreezeMen&Mtrs:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801 --Granada-Plus:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545 --MTV:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1568:1569 --Sky-Movie-Max:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313 --Sky-Sports-2:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2080:2081 --UK-Gold:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289 --Wellbeing:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1824:1825 --PLAY-uk:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289 --UK-Style:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545 --no-name:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801 --Discovery:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313 --Nick/Paramount:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2080:2081 --Sky-Sports-3:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2336:2337 --Brit-Eurosport:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2592:2593 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-reigate dvb-apps/util/szap/channels.conf-dvbt-reigate ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-reigate 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbt-reigate 1970-01-01 01:00:00.000000000 +0100 -@@ -1,51 +0,0 @@ --BBC ONE:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601 --BBC TWO:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611 --ITV 1:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:512:650 --Channel 4:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2827:2828 --five:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018 --ITV 2:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819 --BBC THREE:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --Teletext:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --BBC FOUR:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --Sky Travel:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302 --UKHistory:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402 --Ch 14:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841 --Ch 15:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660 --QVC:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050 --TV Travel Shop:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6162 --The HITS:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 --UKBrightIdeas:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302 --f tn:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --TMF:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 --bid-up.tv:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274 --CBM:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:501:502 --CBBC Channel:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 --CBeebies:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401 --BBC NEWS 24:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641 --ITV News:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2850:2851 --Sky News:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102 --Sky Spts News:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202 --BBC PARLMNT:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403 --Community:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --FourText:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --BBCi:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --ntl:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 --BBC Radio 1:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6210 --1Xtra BBC:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:434 --BBC Radio 2:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6226 --BBC Radio 3:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6242 --BBC Radio 4:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6258 --BBC R5 Live:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:430 --BBC 5L SportsX:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:431 --BBC 6 Music:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:432 --BBC 7:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:433 --BBC Asian Net.:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:435 --BBC World Sv.:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1601 --Smash Hits!:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1201 --Kiss:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1101 --Kerrang!:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1301 --jazz fm:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1401 --oneword:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1501 --701:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407 --702:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411 --703:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0 -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-sandy_heath dvb-apps/util/szap/channels.conf-dvbt-sandy_heath ---- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-sandy_heath 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/channels.conf-dvbt-sandy_heath 1970-01-01 01:00:00.000000000 +0100 -@@ -1,13 +0,0 @@ --BBC-Choice:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621 --BBC-Knowledge:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:630:631 --BBC-News24:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641 --BBC-1:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601 --BBC-Parliament:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660 --BBC-2:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611 --ITV-1:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651 --ITV-2:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2819:2820 --C4:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2823:2824 --E4:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2831:2832 --C5:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018 --Shop:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050 -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/czap.c dvb-apps/util/szap/czap.c ---- linuxtv-dvb-apps-1.1.1/util/szap/czap.c 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/czap.c 2009-06-21 13:29:06.000000000 +0200 -@@ -16,8 +16,9 @@ - - static char FRONTEND_DEV [80]; - static char DEMUX_DEV [80]; -+static int exit_after_tuning; - --#define CHANNEL_FILE "/.czap/channels.conf" -+#define CHANNEL_FILE "channels.conf" - - #define ERROR(x...) \ - do { \ -@@ -71,14 +72,17 @@ - - - static --int parse_param(const char *val, const Param * plist, int list_size) -+int parse_param(const char *val, const Param * plist, int list_size, int *ok) - { - int i; - - for (i = 0; i < list_size; i++) { -- if (strcasecmp(plist[i].name, val) == 0) -+ if (strcasecmp(plist[i].name, val) == 0) { -+ *ok = 1; - return plist[i].value; -+ } - } -+ *ok = 0; - return -1; - } - -@@ -119,6 +123,7 @@ - FILE *f; - char *chan; - char *name, *inv, *fec, *mod; -+ int ok; - - if ((f = fopen(fname, "r")) == NULL) { - PERROR("could not open file '%s'", fname); -@@ -144,19 +149,19 @@ - ERROR("cannot parse service data"); - return -3; - } -- frontend->inversion = parse_param(inv, inversion_list, LIST_SIZE(inversion_list)); -- if (frontend->inversion < 0) { -+ frontend->inversion = parse_param(inv, inversion_list, LIST_SIZE(inversion_list), &ok); -+ if (!ok) { - ERROR("inversion field syntax '%s'", inv); - return -4; - } -- frontend->u.qam.fec_inner = parse_param(fec, fec_list, LIST_SIZE(fec_list)); -- if (frontend->u.qam.fec_inner < 0) { -+ frontend->u.qam.fec_inner = parse_param(fec, fec_list, LIST_SIZE(fec_list), &ok); -+ if (!ok) { - ERROR("FEC field syntax '%s'", fec); - return -5; - } - frontend->u.qam.modulation = parse_param(mod, modulation_list, -- LIST_SIZE(modulation_list)); -- if (frontend->u.qam.modulation < 0) { -+ LIST_SIZE(modulation_list), &ok); -+ if (!ok) { - ERROR("modulation field syntax '%s'", mod); - return -6; - } -@@ -223,7 +228,7 @@ - - - static --int check_frontend (int fe_fd) -+int check_frontend (int fe_fd, int human_readable) - { - fe_status_t status; - uint16_t snr, signal; -@@ -236,9 +241,13 @@ - ioctl(fe_fd, FE_READ_BER, &ber); - ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks); - -- printf ("status %02x | signal %04x | snr %04x | " -- "ber %08x | unc %08x | ", -- status, signal, snr, ber, uncorrected_blocks); -+ if (human_readable) { -+ printf ("status %02x | signal %3u%% | snr %3u%% | ber %d | unc %d | ", -+ status, (signal * 100) / 0xffff, (snr * 100) / 0xffff, ber, uncorrected_blocks); -+ } else { -+ printf ("status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ", -+ status, signal, snr, ber, uncorrected_blocks); -+ } - - if (status & FE_HAS_LOCK) - printf("FE_HAS_LOCK"); -@@ -246,13 +255,16 @@ - usleep(1000000); - - printf("\n"); -+ -+ if (exit_after_tuning && (status & FE_HAS_LOCK)) -+ break; - } while (1); - - return 0; - } - - --static const char *usage = "\nusage: %s [-a adapter_num] [-f frontend_id] [-d demux_id] [-c conf_file] {| -n channel_num}\n" -+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"; - - -@@ -266,66 +278,78 @@ - int vpid, apid; - int frontend_fd, video_fd, audio_fd; - int opt, list_channels = 0, chan_no = 0; -+ int human_readable = 0; - -- while ((opt = getopt(argc, argv, "ln:hrn:a:f:d:c:")) != -1) { -- switch (opt) { -- case 'a': -- adapter = strtoul(optarg, NULL, 0); -- break; -- case 'f': -- frontend = strtoul(optarg, NULL, 0); -- break; -- case 'd': -- demux = strtoul(optarg, NULL, 0); -- break; -- case 'r': -- dvr = 1; -- break; -- case 'l': -- list_channels = 1; -- break; -- case 'n': -- chan_no = strtoul(optarg, NULL, 0); -- break; -- case 'c': -- confname = optarg; -- break; -- case '?': -- case 'h': -- default: -- fprintf (stderr, usage, argv[0], argv[0]); -- return -1; -- }; -- } -- -- if (optind < argc) -- channel = argv[optind]; -+ while ((opt = getopt(argc, argv, "Hln:hrn:a:f:d:c:x")) != -1) { -+ switch (opt) { -+ case 'a': -+ adapter = strtoul(optarg, NULL, 0); -+ break; -+ case 'f': -+ frontend = strtoul(optarg, NULL, 0); -+ break; -+ case 'd': -+ demux = strtoul(optarg, NULL, 0); -+ break; -+ case 'r': -+ dvr = 1; -+ break; -+ case 'l': -+ list_channels = 1; -+ break; -+ case 'n': -+ chan_no = strtoul(optarg, NULL, 0); -+ break; -+ case 'x': -+ exit_after_tuning = 1; -+ break; -+ case 'H': -+ human_readable = 1; -+ break; -+ case 'c': -+ confname = optarg; -+ break; -+ case '?': -+ case 'h': -+ default: -+ fprintf (stderr, usage, argv[0], argv[0]); -+ return -1; -+ }; -+ } - -- if (!channel && chan_no <= 0 && !list_channels) { -- fprintf (stderr, usage, argv[0], argv[0]); -- return -1; -- } -+ if (optind < argc) -+ channel = argv[optind]; -+ -+ if (!channel && chan_no <= 0 && !list_channels) { -+ fprintf (stderr, usage, argv[0], argv[0]); -+ return -1; -+ } - - if (!homedir) - ERROR("$HOME not set"); - -- snprintf (FRONTEND_DEV, sizeof(FRONTEND_DEV), -- "/dev/dvb/adapter%i/frontend%i", adapter, frontend); -+ snprintf (FRONTEND_DEV, sizeof(FRONTEND_DEV), -+ "/dev/dvb/adapter%i/frontend%i", adapter, frontend); - -- snprintf (DEMUX_DEV, sizeof(DEMUX_DEV), -- "/dev/dvb/adapter%i/demux%i", adapter, demux); -+ snprintf (DEMUX_DEV, sizeof(DEMUX_DEV), -+ "/dev/dvb/adapter%i/demux%i", adapter, demux); - - printf ("using '%s' and '%s'\n", FRONTEND_DEV, DEMUX_DEV); - - if (!confname) - { -+ int len = strlen(homedir) + strlen(CHANNEL_FILE) + 18; - if (!homedir) - ERROR("$HOME not set"); -- confname = malloc(strlen(homedir) + strlen(CHANNEL_FILE) + 1); -- memcpy(confname, homedir, strlen(homedir)); -- memcpy(confname + strlen(homedir), CHANNEL_FILE, -- strlen(CHANNEL_FILE) + 1); -+ confname = malloc(len); -+ snprintf(confname, len, "%s/.czap/%i/%s", -+ homedir, adapter, CHANNEL_FILE); -+ if (access(confname, R_OK)) -+ snprintf(confname, len, "%s/.czap/%s", -+ homedir, CHANNEL_FILE); - } -+ printf("reading channels from file '%s'\n", confname); -+ - memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters)); - - if (parse(confname, list_channels, chan_no, channel, &frontend_param, &vpid, &apid)) -@@ -357,7 +381,7 @@ - if (set_pesfilter (audio_fd, apid, DMX_PES_AUDIO, dvr) < 0) - return -1; - -- check_frontend (frontend_fd); -+ check_frontend (frontend_fd, human_readable); - - close (audio_fd); - close (video_fd); -@@ -365,4 +389,3 @@ - - return 0; - } -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/femon.c dvb-apps/util/szap/femon.c ---- linuxtv-dvb-apps-1.1.1/util/szap/femon.c 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/femon.c 1970-01-01 01:00:00.000000000 +0100 -@@ -1,149 +0,0 @@ --/* femon -- monitor frontend status -- * -- * Copyright (C) 2003 convergence GmbH -- * Johannes Stezenbach -- * -- * 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 --#include --#include -- --#include --#include -- --#include -- --#ifndef TRUE --#define TRUE (1==1) --#endif --#ifndef FALSE --#define FALSE (1==0) --#endif -- -- --#define FRONTENDDEVICE "/dev/dvb/adapter%d/frontend%d" -- --static char *usage_str = -- "\nusage: femon [options]\n" -- " -a number : use given adapter (default 0)\n" -- " -f number : use given frontend (default 0)\n\n"; -- -- --static void usage(void) --{ -- fprintf(stderr, usage_str); -- exit(1); --} -- -- --static --int check_frontend (int fe_fd) --{ -- fe_status_t status; -- uint16_t snr, signal; -- uint32_t ber, uncorrected_blocks; -- -- do { -- ioctl(fe_fd, FE_READ_STATUS, &status); -- ioctl(fe_fd, FE_READ_SIGNAL_STRENGTH, &signal); -- ioctl(fe_fd, FE_READ_SNR, &snr); -- ioctl(fe_fd, FE_READ_BER, &ber); -- ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks); -- -- printf ("status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ", -- status, signal, snr, ber, uncorrected_blocks); -- -- if (status & FE_HAS_LOCK) -- printf("FE_HAS_LOCK"); -- -- printf("\n"); -- usleep(1000000); -- } while (1); -- -- return 0; --} -- -- --static --int do_mon(unsigned int adapter, unsigned int frontend) --{ -- char fedev[128]; -- int fefd; -- int result; -- struct dvb_frontend_info fe_info; -- -- snprintf(fedev, sizeof(fedev), FRONTENDDEVICE, adapter, frontend); -- printf("using '%s'\n", fedev); -- -- if ((fefd = open(fedev, O_RDONLY | O_NONBLOCK)) < 0) { -- perror("opening frontend failed"); -- return FALSE; -- } -- -- result = ioctl(fefd, FE_GET_INFO, &fe_info); -- -- if (result < 0) { -- perror("ioctl FE_GET_INFO failed"); -- close(fefd); -- return FALSE; -- } -- -- printf("FE: %s (%s)\n", fe_info.name, fe_info.type == FE_QPSK ? "SAT" : -- fe_info.type == FE_QAM ? "CABLE": "TERRESTRIAL"); -- -- check_frontend (fefd); -- -- close(fefd); -- -- return result; --} -- --int main(int argc, char *argv[]) --{ -- unsigned int adapter = 0, frontend = 0; -- int opt; -- -- while ((opt = getopt(argc, argv, "hlrn:a:f:d:")) != -1) { -- switch (opt) -- { -- case '?': -- case 'h': -- default: -- usage(); -- case 'a': -- adapter = strtoul(optarg, NULL, 0); -- break; -- case 'f': -- frontend = strtoul(optarg, NULL, 0); -- } -- } -- -- do_mon(adapter, frontend); -- -- return FALSE; --} -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/lnb.c dvb-apps/util/szap/lnb.c ---- linuxtv-dvb-apps-1.1.1/util/szap/lnb.c 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/lnb.c 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,101 @@ -+#include -+#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/util/szap/lnb.h dvb-apps/util/szap/lnb.h ---- linuxtv-dvb-apps-1.1.1/util/szap/lnb.h 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/szap/lnb.h 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,22 @@ -+struct lnb_types_st { -+ char *name; -+ char **desc; -+ unsigned long low_val; -+ unsigned long high_val; /* zero indicates no hiband */ -+ unsigned long switch_val; /* zero indicates no hiband */ -+}; -+ -+/* Enumerate through standard types of LNB's until NULL returned. -+ * Increment curno each time -+ */ -+ -+struct lnb_types_st * -+lnb_enum(int curno); -+ -+/* Decode an lnb type, for example given on a command line -+ * If alpha and standard type, e.g. "Universal" then match that -+ * otherwise low[,high[,switch]] -+ */ -+ -+int -+lnb_decode(char *str, struct lnb_types_st *lnbp); -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/Makefile dvb-apps/util/szap/Makefile ---- linuxtv-dvb-apps-1.1.1/util/szap/Makefile 2006-05-18 01:31:54.000000000 +0200 -+++ dvb-apps/util/szap/Makefile 2009-06-21 13:29:06.000000000 +0200 -@@ -1,35 +1,18 @@ --CC = gcc --CFLAGS = -MD -Wall -g -O2 -I../../include -I../lib --LFLAGS = -Wall -g -O2 --RM = rm -f -- --TARGETS = szap tzap czap azap femon --OBJS = szap.o tzap.o czap.o azap.o femon.o -+# Makefile for linuxtv.org dvb-apps/util/szap - --all: $(OBJS) $(TARGETS) -- @echo -- @echo "--------------------------------------------------------------------------------" -- @echo " please copy an appropriate channels.conf-XXX channel list for DVB-S/C/T" -- @echo -- @echo " to ~/.szap/channels.conf" -- @echo " ~/.czap/channels.conf" -- @echo " ~/.tzap/channels.conf" -- @echo -- @echo " and then call ./szap for DVB-S, ./czap for DVB-C or ./tzap for DVB-T" -- @echo "--------------------------------------------------------------------------------" -- @echo -+objects = lnb.o - --szap: szap.o ../lib/lnb.o -- $(CC) $(LFLAGS) -o szap szap.o ../lib/lnb.o -+binaries = azap \ -+ czap \ -+ szap \ -+ tzap - --.c.o: -- $(CC) $(CFLAGS) -o $@ -c $< -+inst_bin = $(binaries) - --.o: -- $(CC) $(LFLAGS) -o $@ $< -+.PHONY: all - --clean: -- $(RM) $(TARGETS) core* *.o *.d .depend -+all: $(binaries) - ---include $(wildcard *.d) dummy -+$(binaries): $(objects) - -+include ../../Make.rules -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/README dvb-apps/util/szap/README ---- linuxtv-dvb-apps-1.1.1/util/szap/README 2004-01-25 20:23:39.000000000 +0100 -+++ dvb-apps/util/szap/README 2009-06-21 13:29:06.000000000 +0200 -@@ -5,23 +5,29 @@ - - For DVB-S, Astra Channel config file: - --$ ./szap -c channels.conf-dvbs-astra n24 -+$ ./szap -c channels-conf/dvb-s/Astra-19.2E n24 - - will tune to N24. For DVB-C, Berlin Cable channel config: - --$ ./czap -c channels.conf-dvbc-berlin Arte -+$ ./czap -c channels-conf/dvb-c/de-Berlin Arte - - For DVB-T, Berlin Config: - --$ ./czap -c channels.conf-dvbt-berlin phoenix -+$ ./tzap -c channels-conf/dvb-t/de-Berlin phoenix - --By default the MPEG stream is routed to a hardware decoder. If you want to --record the stream to disk you will route it to the DVR device by using the -+For ATSC, Raleigh Durham Config: -+ -+$ ./azap -c channels-conf/atsc/us-Raleigh-Durham WRAL -+ -+will tune to WRAL's Digital Channel 5-1. -+ -+By default the MPEG stream is routed to a hardware decoder. If you want to -+record the stream to disk you will route it to the DVR device by using the - '-r' option: - --$ ./czap -c channels.conf-dvbt-berlin phoenix -r -+$ ./tzap -c channels-conf/dvb-t/de-Berlin phoenix -r - [keep it running in one console] --$ cat /dev/dvr/adapter0/dvr0 > /tmp/recording.ts -+$ cat /dev/dvb/adapter0/dvr0 > /tmp/recording.ts - [in a second console, will dump the MPEG transport stream to /tmp/recording.ts] - - The status messages have the following meaning: -@@ -38,10 +44,9 @@ - unc [0...0xffffffff] --- Number of Uncorrectable Blocks. - Small numbers are Preferable. - --If everything is alright and all frontend circuits are working stable -+If everything is alright and all frontend circuits are working stable - (are locked) you should see a FE_HAS_LOCK in the rightmost line. - - Good luck, - - Holger -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/szap.c dvb-apps/util/szap/szap.c ---- linuxtv-dvb-apps-1.1.1/util/szap/szap.c 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/szap.c 2009-06-21 13:29:06.000000000 +0200 -@@ -36,6 +36,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -45,6 +46,7 @@ - - #include - #include -+#include - #include "lnb.h" - - #ifndef TRUE -@@ -64,6 +66,7 @@ - - #define FRONTENDDEVICE "/dev/dvb/adapter%d/frontend%d" - #define DEMUXDEVICE "/dev/dvb/adapter%d/demux%d" -+#define AUDIODEVICE "/dev/dvb/adapter%d/audio%d" - - static struct lnb_types_st lnb_type; - -@@ -79,18 +82,21 @@ - " -f number : use given frontend (default 0)\n" - " -d number : use given demux (default 0)\n" - " -c file : read channels list from 'file'\n" -+ " -b : enable Audio Bypass (default no)\n" - " -x : exit after tuning\n" -+ " -H : human readable output\n" - " -r : set up /dev/dvb/adapterX/dvr0 for TS recording\n" - " -l lnb-type (DVB-S Only) (use -l help to print types) or \n" - " -l low[,high[,switch]] in Mhz\n" - " -i : run interactively, allowing you to type in channel names\n" -+ " -p : add pat and pmt to TS recording (implies -r)\n" - " or -n numbers for zapping\n"; - --static int set_demux(int dmxfd, int pid, int audio, int dvr) -+static int set_demux(int dmxfd, int pid, int pes_type, int dvr) - { - struct dmx_pes_filter_params pesfilter; - -- if (pid <= 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */ -+ if (pid < 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */ - return TRUE; - - if (dvr) { -@@ -102,7 +108,7 @@ - pesfilter.pid = pid; - pesfilter.input = DMX_IN_FRONTEND; - pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER; -- pesfilter.pes_type = audio ? DMX_PES_AUDIO : DMX_PES_VIDEO; -+ pesfilter.pes_type = pes_type; - pesfilter.flags = DMX_IMMEDIATE_START; - - if (ioctl(dmxfd, DMX_SET_PES_FILTER, &pesfilter) == -1) { -@@ -114,6 +120,65 @@ - return TRUE; - } - -+int get_pmt_pid(char *dmxdev, int sid) -+{ -+ int patfd, count; -+ int pmt_pid = 0; -+ int patread = 0; -+ int section_length; -+ unsigned char buft[4096]; -+ unsigned char *buf = buft; -+ struct dmx_sct_filter_params f; -+ -+ memset(&f, 0, sizeof(f)); -+ f.pid = 0; -+ f.filter.filter[0] = 0x00; -+ f.filter.mask[0] = 0xff; -+ f.timeout = 0; -+ f.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC; -+ -+ if ((patfd = open(dmxdev, O_RDWR)) < 0) { -+ perror("openening pat demux failed"); -+ return -1; -+ } -+ -+ if (ioctl(patfd, DMX_SET_FILTER, &f) == -1) { -+ perror("ioctl DMX_SET_FILTER failed"); -+ close(patfd); -+ return -1; -+ } -+ -+ while (!patread){ -+ if (((count = read(patfd, buf, sizeof(buft))) < 0) && errno == EOVERFLOW) -+ count = read(patfd, buf, sizeof(buft)); -+ if (count < 0) { -+ perror("read_sections: read error"); -+ close(patfd); -+ return -1; -+ } -+ -+ section_length = ((buf[1] & 0x0f) << 8) | buf[2]; -+ if (count != section_length + 3) -+ continue; -+ -+ buf += 8; -+ section_length -= 8; -+ -+ patread = 1; /* assumes one section contains the whole pat */ -+ while (section_length > 0) { -+ int service_id = (buf[0] << 8) | buf[1]; -+ if (service_id == sid) { -+ pmt_pid = ((buf[2] & 0x1f) << 8) | buf[3]; -+ section_length = 0; -+ } -+ buf += 4; -+ section_length -= 4; -+ } -+ } -+ -+ close(patfd); -+ return pmt_pid; -+} - - struct diseqc_cmd { - struct dvb_diseqc_master_cmd cmd; -@@ -151,14 +216,14 @@ - { {{0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00}, 4}, 0 }; - - /* param: high nibble: reset bits, low nibble set bits, -- * bits are: option, position, polarizaion, band -+ * bits are: option, position, polarization, band - */ - cmd.cmd.msg[3] = - 0xf0 | (((sat_no * 4) & 0x0f) | (hi_band ? 1 : 0) | (pol_vert ? 0 : 2)); - - diseqc_send_msg(secfd, pol_vert ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18, - &cmd, hi_band ? SEC_TONE_ON : SEC_TONE_OFF, -- (sat_no / 4) % 2 ? SEC_MINI_B : SEC_MINI_A); -+ sat_no % 2 ? SEC_MINI_B : SEC_MINI_A); - - return TRUE; - } -@@ -189,8 +254,9 @@ - - - static --int check_frontend (int fe_fd, int dvr) -+int check_frontend (int fe_fd, int dvr, int human_readable) - { -+ (void)dvr; - fe_status_t status; - uint16_t snr, signal; - uint32_t ber, uncorrected_blocks; -@@ -210,8 +276,13 @@ - if (ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks) == -1) - uncorrected_blocks = -2; - -- printf ("status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ", -- status, signal, snr, ber, uncorrected_blocks); -+ if (human_readable) { -+ printf ("status %02x | signal %3u%% | snr %3u%% | ber %d | unc %d | ", -+ status, (signal * 100) / 0xffff, (snr * 100) / 0xffff, ber, uncorrected_blocks); -+ } else { -+ printf ("status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ", -+ status, signal, snr, ber, uncorrected_blocks); -+ } - - if (status & FE_HAS_LOCK) - printf("FE_HAS_LOCK"); -@@ -230,10 +301,12 @@ - static - int zap_to(unsigned int adapter, unsigned int frontend, unsigned int demux, - unsigned int sat_no, unsigned int freq, unsigned int pol, -- unsigned int sr, unsigned int vpid, unsigned int apid, int dvr) -+ unsigned int sr, unsigned int vpid, unsigned int apid, int sid, -+ int dvr, int rec_psi, int bypass, int human_readable) - { -- char fedev[128], dmxdev[128]; -- static int fefd, videofd, audiofd; -+ char fedev[128], dmxdev[128], auddev[128]; -+ static int fefd, dmxfda, dmxfdv, audiofd = -1, patfd, pmtfd; -+ int pmtpid; - uint32_t ifreq; - int hiband, result; - static struct dvb_frontend_info fe_info; -@@ -241,6 +314,7 @@ - if (!fefd) { - snprintf(fedev, sizeof(fedev), FRONTENDDEVICE, adapter, frontend); - snprintf(dmxdev, sizeof(dmxdev), DEMUXDEVICE, adapter, demux); -+ snprintf(auddev, sizeof(auddev), AUDIODEVICE, adapter, demux); - printf("using '%s' and '%s'\n", fedev, dmxdev); - - if ((fefd = open(fedev, O_RDWR | O_NONBLOCK)) < 0) { -@@ -262,18 +336,41 @@ - return FALSE; - } - -- if ((videofd = open(dmxdev, O_RDWR)) < 0) { -+ if ((dmxfdv = open(dmxdev, O_RDWR)) < 0) { - perror("opening video demux failed"); - close(fefd); - return FALSE; - } - -- if ((audiofd = open(dmxdev, O_RDWR)) < 0) { -+ if ((dmxfda = open(dmxdev, O_RDWR)) < 0) { - perror("opening audio demux failed"); -- close(videofd); - close(fefd); - return FALSE; - } -+ -+ if (dvr == 0) /* DMX_OUT_DECODER */ -+ audiofd = open(auddev, O_RDWR); -+ -+ if (rec_psi){ -+ if ((patfd = open(dmxdev, O_RDWR)) < 0) { -+ perror("opening pat demux failed"); -+ close(audiofd); -+ close(dmxfda); -+ close(dmxfdv); -+ close(fefd); -+ return FALSE; -+ } -+ -+ if ((pmtfd = open(dmxdev, O_RDWR)) < 0) { -+ perror("opening pmt demux failed"); -+ close(patfd); -+ close(audiofd); -+ close(dmxfda); -+ close(dmxfdv); -+ close(fefd); -+ return FALSE; -+ } -+ } - } - - hiband = 0; -@@ -293,15 +390,36 @@ - - if (diseqc(fefd, sat_no, pol, hiband)) - if (do_tune(fefd, ifreq, sr)) -- if (set_demux(videofd, vpid, 0, dvr)) -- if (set_demux(audiofd, apid, 1, dvr)) -- result = TRUE; -+ if (set_demux(dmxfdv, vpid, DMX_PES_VIDEO, dvr)) -+ if (audiofd >= 0) -+ (void)ioctl(audiofd, AUDIO_SET_BYPASS_MODE, bypass); -+ if (set_demux(dmxfda, apid, DMX_PES_AUDIO, dvr)) { -+ if (rec_psi) { -+ pmtpid = get_pmt_pid(dmxdev, sid); -+ if (pmtpid < 0) { -+ result = FALSE; -+ } -+ if (pmtpid == 0) { -+ fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid); -+ result = FALSE; -+ } -+ if (set_demux(patfd, 0, DMX_PES_OTHER, dvr)) -+ if (set_demux(pmtfd, pmtpid, DMX_PES_OTHER, dvr)) -+ result = TRUE; -+ } else { -+ result = TRUE; -+ } -+ } - -- check_frontend (fefd, dvr); -+ check_frontend (fefd, dvr, human_readable); - - if (!interactive) { -- close(audiofd); -- close(videofd); -+ close(patfd); -+ close(pmtfd); -+ if (audiofd >= 0) -+ close(audiofd); -+ close(dmxfda); -+ close(dmxfdv); - close(fefd); - } - -@@ -312,14 +430,15 @@ - static int read_channels(const char *filename, int list_channels, - uint32_t chan_no, const char *chan_name, - unsigned int adapter, unsigned int frontend, -- unsigned int demux, int dvr) -+ unsigned int demux, int dvr, int rec_psi, -+ int bypass, int human_readable) - { - FILE *cfp; - char buf[4096]; - char inp[256]; - char *field, *tmp, *p; - unsigned int line; -- unsigned int freq, pol, sat_no, sr, vpid, apid; -+ unsigned int freq, pol, sat_no, sr, vpid, apid, sid; - int ret; - - again: -@@ -399,20 +518,41 @@ - goto syntax_err; - - vpid = strtoul(field, NULL, 0); -+ if (!vpid) -+ vpid = 0x1fff; - - if (!(field = strsep(&tmp, ":"))) - goto syntax_err; - -+ p = strchr(field, ';'); -+ -+ if (p) { -+ *p = '\0'; -+ p++; -+ if (bypass) { -+ if (!p || !*p) -+ goto syntax_err; -+ field = p; -+ } -+ } -+ - apid = strtoul(field, NULL, 0); -+ if (!apid) -+ apid = 0x1fff; -+ -+ if (!(field = strsep(&tmp, ":"))) -+ goto syntax_err; -+ -+ sid = strtoul(field, NULL, 0); - - printf("sat %u, frequency = %u MHz %c, symbolrate %u, " -- "vpid = 0x%04x, apid = 0x%04x\n", -- sat_no, freq, pol ? 'V' : 'H', sr, vpid, apid); -+ "vpid = 0x%04x, apid = 0x%04x sid = 0x%04x\n", -+ sat_no, freq, pol ? 'V' : 'H', sr, vpid, apid, sid); - - fclose(cfp); - -- ret = zap_to(adapter, frontend, demux, -- sat_no, freq * 1000, pol, sr, vpid, apid, dvr); -+ ret = zap_to(adapter, frontend, demux, sat_no, freq * 1000, -+ pol, sr, vpid, apid, sid, dvr, rec_psi, bypass, human_readable); - if (interactive) - goto again; - -@@ -475,17 +615,22 @@ - int list_channels = 0; - unsigned int chan_no = 0; - const char *chan_name = NULL; -- unsigned int adapter = 0, frontend = 0, demux = 0, dvr = 0; -+ unsigned int adapter = 0, frontend = 0, demux = 0, dvr = 0, rec_psi = 0; -+ int bypass = 0; - int opt, copt = 0; -+ int human_readable = 0; - - lnb_type = *lnb_enum(0); -- while ((opt = getopt(argc, argv, "hqrn:a:f:d:c:l:xi")) != -1) { -+ while ((opt = getopt(argc, argv, "Hhqrpn:a:f:d:c:l:xib")) != -1) { - switch (opt) - { - case '?': - case 'h': - default: - bad_usage(argv[0], 0); -+ case 'b': -+ bypass = 1; -+ break; - case 'q': - list_channels = 1; - break; -@@ -501,6 +646,9 @@ - case 'f': - frontend = strtoul(optarg, NULL, 0); - break; -+ case 'p': -+ rec_psi = 1; -+ break; - case 'd': - demux = strtoul(optarg, NULL, 0); - break; -@@ -517,6 +665,9 @@ - case 'x': - exit_after_tuning = 1; - break; -+ case 'H': -+ human_readable = 1; -+ break; - case 'i': - interactive = 1; - exit_after_tuning = 1; -@@ -545,16 +696,21 @@ - fprintf(stderr, "error: $HOME not set\n"); - return TRUE; - } -- strncpy(chanfile, home, sizeof(chanfile)); -- strcat(chanfile, "/.szap/" CHANNEL_FILE); -+ snprintf(chanfile, sizeof(chanfile), -+ "%s/.szap/%i/%s", home, adapter, CHANNEL_FILE); -+ if (access(chanfile, R_OK)) -+ snprintf(chanfile, sizeof(chanfile), -+ "%s/.szap/%s", home, CHANNEL_FILE); - } - - printf("reading channels from file '%s'\n", chanfile); - -+ if (rec_psi) -+ dvr=1; -+ - if (!read_channels(chanfile, list_channels, chan_no, chan_name, -- adapter, frontend, demux, dvr)) -+ adapter, frontend, demux, dvr, rec_psi, bypass, human_readable)) - return TRUE; - - return FALSE; - } -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/tzap.c dvb-apps/util/szap/tzap.c ---- linuxtv-dvb-apps-1.1.1/util/szap/tzap.c 2004-01-17 17:59:46.000000000 +0100 -+++ dvb-apps/util/szap/tzap.c 2009-06-21 13:29:06.000000000 +0200 -@@ -1,3 +1,24 @@ -+/* tzap -- DVB-T zapping utility -+ */ -+ -+/* -+ * Added recording to a file -+ * arguments: -+ * -+ * -t timeout (seconds) -+ * -o filename output filename (use -o - for stdout) -+ * -s only print summary -+ * -S run silently (no output) -+ * -+ * Bernard Hatt 24/2/04 -+ */ -+ -+ -+ -+#define _FILE_OFFSET_BITS 64 -+#define _LARGEFILE_SOURCE 1 -+#define _LARGEFILE64_SOURCE 1 -+ - #include - #include - #include -@@ -9,15 +30,19 @@ - #include - #include - #include -+#include - - #include - #include - -- - static char FRONTEND_DEV [80]; - static char DEMUX_DEV [80]; -+static char DVR_DEV [80]; -+static int timeout_flag=0; -+static int silent=0,timeout=0; -+static int exit_after_tuning; - --#define CHANNEL_FILE "/.tzap/channels.conf" -+#define CHANNEL_FILE "channels.conf" - - #define ERROR(x...) \ - do { \ -@@ -68,14 +93,16 @@ - {"GUARD_INTERVAL_1_16", GUARD_INTERVAL_1_16}, - {"GUARD_INTERVAL_1_32", GUARD_INTERVAL_1_32}, - {"GUARD_INTERVAL_1_4", GUARD_INTERVAL_1_4}, -- {"GUARD_INTERVAL_1_8", GUARD_INTERVAL_1_8} -+ {"GUARD_INTERVAL_1_8", GUARD_INTERVAL_1_8}, -+ {"GUARD_INTERVAL_AUTO", GUARD_INTERVAL_AUTO} - }; - - static const Param hierarchy_list [] = { - { "HIERARCHY_1", HIERARCHY_1 }, - { "HIERARCHY_2", HIERARCHY_2 }, - { "HIERARCHY_4", HIERARCHY_4 }, -- { "HIERARCHY_NONE", HIERARCHY_NONE } -+ { "HIERARCHY_NONE", HIERARCHY_NONE }, -+ { "HIERARCHY_AUTO", HIERARCHY_AUTO } - }; - - static const Param constellation_list [] = { -@@ -84,12 +111,14 @@ - { "QAM_16", QAM_16 }, - { "QAM_256", QAM_256 }, - { "QAM_32", QAM_32 }, -- { "QAM_64", QAM_64 } -+ { "QAM_64", QAM_64 }, -+ { "QAM_AUTO", QAM_AUTO } - }; - - static const Param transmissionmode_list [] = { - { "TRANSMISSION_MODE_2K", TRANSMISSION_MODE_2K }, - { "TRANSMISSION_MODE_8K", TRANSMISSION_MODE_8K }, -+ { "TRANSMISSION_MODE_AUTO", TRANSMISSION_MODE_AUTO } - }; - - #define LIST_SIZE(x) sizeof(x)/sizeof(Param) -@@ -100,7 +129,7 @@ - { - char c; - int character = 0; -- int index = 0; -+ int _index = 0; - - while (1) { - if (read(fd, &c, 1) < 1) -@@ -111,9 +140,9 @@ - break; - - while (toupper(c) != plist->name[character]) { -- index++; -+ _index++; - plist++; -- if (index >= list_size) /* parse error, no valid */ -+ if (_index >= list_size) /* parse error, no valid */ - return -2; /* parameter name found */ - } - -@@ -150,7 +179,10 @@ - return -3; /* to fit in 32 bit */ - }; - -+ errno = 0; - *val = strtol(number, NULL, 10); -+ if (errno == ERANGE) -+ return -4; - - return 0; - } -@@ -167,13 +199,18 @@ - if (read(fd, &c, 1) < 1) - return -1; /* EOF! */ - -- if (c == ':' && channel[character] == '\0') -- break; -- -- if (toupper(c) == toupper(channel[character])) -- character++; -- else -+ if ( '\n' == c ) /* start of line */ - character = 0; -+ else if ( character >= 0 ) { /* we are in the namefield */ -+ -+ if (c == ':' && channel[character] == '\0') -+ break; -+ -+ if (toupper(c) == toupper(channel[character])) -+ character++; -+ else -+ character = -1; -+ } - }; - - return 0; -@@ -211,12 +248,32 @@ - return err; - } - -+static int check_fec(fe_code_rate_t *fec) -+{ -+ switch (*fec) -+ { -+ case FEC_NONE: -+ *fec = FEC_AUTO; -+ case FEC_AUTO: -+ case FEC_1_2: -+ case FEC_2_3: -+ case FEC_3_4: -+ case FEC_5_6: -+ case FEC_7_8: -+ return 0; -+ default: -+ ; -+ } -+ return 1; -+} -+ - - int parse(const char *fname, const char *channel, - struct dvb_frontend_parameters *frontend, int *vpid, int *apid) - { - int fd; - int err; -+ int tmp; - - if ((fd = open(fname, O_RDONLY | O_NONBLOCK)) < 0) { - PERROR ("could not open file '%s'", fname); -@@ -229,54 +286,57 @@ - return -2; - } - -- if ((err = try_parse_int(fd, &frontend->frequency, "frequency"))) -+ if ((err = try_parse_int(fd, &tmp, "frequency"))) - return -3; -+ frontend->frequency = tmp; - - if ((err = try_parse_param(fd, - inversion_list, LIST_SIZE(inversion_list), -- (int *) &frontend->inversion, -- "inversion"))) -+ &tmp, "inversion"))) - return -4; -+ frontend->inversion = tmp; - - if ((err = try_parse_param(fd, bw_list, LIST_SIZE(bw_list), -- (int *) &frontend->u.ofdm.bandwidth, -- "bandwidth"))) -+ &tmp, "bandwidth"))) - return -5; -+ frontend->u.ofdm.bandwidth = tmp; - - if ((err = try_parse_param(fd, fec_list, LIST_SIZE(fec_list), -- (int *) &frontend->u.ofdm.code_rate_HP, -- "code_rate_HP"))) -+ &tmp, "code_rate_HP"))) -+ return -6; -+ frontend->u.ofdm.code_rate_HP = tmp; -+ if (check_fec(&frontend->u.ofdm.code_rate_HP)) - return -6; - - if ((err = try_parse_param(fd, fec_list, LIST_SIZE(fec_list), -- (int *) &frontend->u.ofdm.code_rate_LP, -- "code_rate_LP"))) -+ &tmp, "code_rate_LP"))) -+ return -7; -+ frontend->u.ofdm.code_rate_LP = tmp; -+ if (check_fec(&frontend->u.ofdm.code_rate_LP)) - return -7; - - if ((err = try_parse_param(fd, constellation_list, - LIST_SIZE(constellation_list), -- (int *) &frontend->u.ofdm.constellation, -- "constellation"))) -+ &tmp, "constellation"))) - return -8; -+ frontend->u.ofdm.constellation = tmp; - - if ((err = try_parse_param(fd, transmissionmode_list, - LIST_SIZE(transmissionmode_list), -- (int *) &frontend->u.ofdm. -- transmission_mode, -- "transmission_mode"))) -+ &tmp, "transmission_mode"))) - return -9; -+ frontend->u.ofdm.transmission_mode = tmp; - - if ((err = try_parse_param(fd, guard_list, LIST_SIZE(guard_list), -- (int *) &frontend->u.ofdm. -- guard_interval, "guard_interval"))) -+ &tmp, "guard_interval"))) - return -10; -+ frontend->u.ofdm.guard_interval = tmp; - - if ((err = try_parse_param(fd, hierarchy_list, - LIST_SIZE(hierarchy_list), -- (int *) &frontend->u.ofdm. -- hierarchy_information, -- "hierarchy_information"))) -+ &tmp, "hierarchy_information"))) - return -11; -+ frontend->u.ofdm.hierarchy_information = tmp; - - if ((err = try_parse_int(fd, vpid, "Video PID"))) - return -12; -@@ -330,7 +390,8 @@ - return -1; - } - -- printf ("tuning to %i Hz\n", frontend->frequency); -+ if (silent<2) -+ fprintf (stderr,"tuning to %i Hz\n", frontend->frequency); - - if (ioctl(fe_fd, FE_SET_FRONTEND, frontend) < 0) { - PERROR("ioctl FE_SET_FRONTEND failed"); -@@ -340,38 +401,115 @@ - return 0; - } - -+static void -+do_timeout(int x) -+{ -+ (void)x; -+ if (timeout_flag==0) -+ { -+ timeout_flag=1; -+ alarm(2); -+ signal(SIGALRM, do_timeout); -+ } -+ else -+ { -+ /* something has gone wrong ... exit */ -+ exit(1); -+ } -+} - --static --int check_frontend (int fe_fd) -+static void -+print_frontend_stats (int fe_fd, int human_readable) - { - fe_status_t status; -- uint16_t snr, signal; -+ uint16_t snr, _signal; - uint32_t ber, uncorrected_blocks; - -- do { -- ioctl(fe_fd, FE_READ_STATUS, &status); -- ioctl(fe_fd, FE_READ_SIGNAL_STRENGTH, &signal); -- ioctl(fe_fd, FE_READ_SNR, &snr); -- ioctl(fe_fd, FE_READ_BER, &ber); -- ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks); -+ ioctl(fe_fd, FE_READ_STATUS, &status); -+ ioctl(fe_fd, FE_READ_SIGNAL_STRENGTH, &_signal); -+ ioctl(fe_fd, FE_READ_SNR, &snr); -+ ioctl(fe_fd, FE_READ_BER, &ber); -+ ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks); - -- printf ("status %02x | signal %04x | snr %04x | " -- "ber %08x | unc %08x | ", -- status, signal, snr, ber, uncorrected_blocks); -+ if (human_readable) { -+ printf ("status %02x | signal %3u%% | snr %3u%% | ber %d | unc %d | ", -+ status, (_signal * 100) / 0xffff, (snr * 100) / 0xffff, ber, uncorrected_blocks); -+ } else { -+ fprintf (stderr, "status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ", -+ status, _signal, snr, ber, uncorrected_blocks); -+ } - -- if (status & FE_HAS_LOCK) -- printf("FE_HAS_LOCK"); -+ if (status & FE_HAS_LOCK) -+ fprintf(stderr,"FE_HAS_LOCK"); - -- usleep(1000000); -+ fprintf(stderr,"\n"); -+} - -- printf("\n"); -- } while (1); -+static -+int check_frontend (int fe_fd, int human_readable) -+{ -+ fe_status_t status; -+ do { -+ ioctl(fe_fd, FE_READ_STATUS, &status); -+ if (!silent) -+ print_frontend_stats(fe_fd, human_readable); -+ if (exit_after_tuning && (status & FE_HAS_LOCK)) -+ break; -+ usleep(1000000); -+ } while (!timeout_flag); -+ if (silent < 2) -+ print_frontend_stats (fe_fd, human_readable); - - return 0; - } - -+#define BUFLEN (188*256) -+static -+void copy_to_file(int in_fd, int out_fd) -+{ -+ char buf[BUFLEN]; -+ int r; -+ long long int rc = 0LL; -+ while(timeout_flag==0) -+ { -+ r=read(in_fd,buf,BUFLEN); -+ if (r < 0) { -+ if (errno == EOVERFLOW) { -+ printf("buffer overrun\n"); -+ continue; -+ } -+ PERROR("Read failed"); -+ break; -+ } -+ if (write(out_fd,buf,r) < 0) { -+ PERROR("Write failed"); -+ break; -+ } -+ rc+=r; -+ } -+ if (silent<2) -+ { -+ fprintf(stderr, "copied %lld bytes (%lld Kbytes/sec)\n",rc,rc/(1024*timeout)); -+ } -+} - --static const char *usage = "\nusage: %s [-a adapter_num] [-f frontend_id] [-d demux_id] [-c conf_file] [-r] \n\n"; -+static char *usage = -+ "usage:\n" -+ " tzap [options] \n" -+ " zap to channel channel_name (case insensitive)\n" -+ " -a number : use given adapter (default 0)\n" -+ " -f number : use given frontend (default 0)\n" -+ " -d number : use given demux (default 0)\n" -+ " -c file : read channels list from 'file'\n" -+ " -x : exit after tuning\n" -+ " -r : set up /dev/dvb/adapterX/dvr0 for TS recording\n" -+ " -s : only print summary\n" -+ " -S : run silently (no output)\n" -+ " -H : human readable output\n" -+ " -F : set up frontend only, don't touch demux\n" -+ " -t number : timeout (seconds)\n" -+ " -o file : output filename (use -o - for stdout)\n" -+ " -h -? : display this help and exit\n"; - - - int main(int argc, char **argv) -@@ -382,10 +520,14 @@ - char *channel = NULL; - int adapter = 0, frontend = 0, demux = 0, dvr = 0; - int vpid, apid; -- int frontend_fd, audio_fd, video_fd; -+ int frontend_fd, audio_fd = 0, video_fd = 0, dvr_fd, file_fd; - int opt; -+ int record = 0; -+ int frontend_only = 0; -+ char *filename = NULL; -+ int human_readable = 0; - -- while ((opt = getopt(argc, argv, "hrn:a:f:d:c:")) != -1) { -+ while ((opt = getopt(argc, argv, "H?hrxRsFSn:a:f:d:c:t:o:")) != -1) { - switch (opt) { - case 'a': - adapter = strtoul(optarg, NULL, 0); -@@ -396,12 +538,34 @@ - case 'd': - demux = strtoul(optarg, NULL, 0); - break; -+ case 't': -+ timeout = strtoul(optarg, NULL, 0); -+ break; -+ case 'o': -+ filename = strdup(optarg); -+ record=1; -+ /* fall through */ - case 'r': - dvr = 1; - break; -+ case 'x': -+ exit_after_tuning = 1; -+ break; - case 'c': - confname = optarg; - break; -+ case 's': -+ silent = 1; -+ break; -+ case 'S': -+ silent = 2; -+ break; -+ case 'F': -+ frontend_only = 1; -+ break; -+ case 'H': -+ human_readable = 1; -+ break; - case '?': - case 'h': - default: -@@ -424,17 +588,25 @@ - snprintf (DEMUX_DEV, sizeof(DEMUX_DEV), - "/dev/dvb/adapter%i/demux%i", adapter, demux); - -- printf ("using '%s' and '%s'\n", FRONTEND_DEV, DEMUX_DEV); -+ snprintf (DVR_DEV, sizeof(DVR_DEV), -+ "/dev/dvb/adapter%i/dvr%i", adapter, demux); -+ -+ if (silent<2) -+ fprintf (stderr,"using '%s' and '%s'\n", FRONTEND_DEV, DEMUX_DEV); - - if (!confname) - { -+ int len = strlen(homedir) + strlen(CHANNEL_FILE) + 18; - if (!homedir) - ERROR ("$HOME not set"); -- confname = malloc (strlen(homedir) + strlen(CHANNEL_FILE) + 1); -- memcpy (confname, homedir, strlen(homedir)); -- memcpy (confname + strlen(homedir), CHANNEL_FILE, -- strlen(CHANNEL_FILE) + 1); -+ confname = malloc (len); -+ snprintf (confname, len, "%s/.tzap/%i/%s", -+ homedir, adapter, CHANNEL_FILE); -+ if (access (confname, R_OK)) -+ snprintf (confname, len, "%s/.tzap/%s", -+ homedir, CHANNEL_FILE); - } -+ printf("reading channels from file '%s'\n", confname); - - memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters)); - -@@ -449,12 +621,17 @@ - if (setup_frontend (frontend_fd, &frontend_param) < 0) - return -1; - -+ if (frontend_only) -+ goto just_the_frontend_dude; -+ - if ((video_fd = open(DEMUX_DEV, O_RDWR)) < 0) { - PERROR("failed opening '%s'", DEMUX_DEV); - return -1; - } - -- printf ("video pid 0x%04x, audio pid 0x%04x\n", vpid, apid); -+ if (silent<2) -+ fprintf (stderr,"video pid 0x%04x, audio pid 0x%04x\n", vpid, apid); -+ - if (set_pesfilter (video_fd, vpid, DMX_PES_VIDEO, dvr) < 0) - return -1; - -@@ -466,7 +643,51 @@ - if (set_pesfilter (audio_fd, apid, DMX_PES_AUDIO, dvr) < 0) - return -1; - -- check_frontend (frontend_fd); -+ signal(SIGALRM,do_timeout); -+ if (timeout>0) -+ alarm(timeout); -+ -+ -+ if (record) -+ { -+ if (filename!=NULL) -+ { -+ if (strcmp(filename,"-")!=0) -+ { -+ file_fd = open (filename,O_WRONLY|O_LARGEFILE|O_CREAT,0644); -+ if (file_fd<0) -+ { -+ PERROR("open of '%s' failed",filename); -+ return -1; -+ } -+ } -+ else -+ { -+ file_fd=1; -+ } -+ } -+ else -+ { -+ PERROR("Record mode but no filename!"); -+ return -1; -+ } -+ -+ if ((dvr_fd = open(DVR_DEV, O_RDONLY)) < 0) { -+ PERROR("failed opening '%s'", DVR_DEV); -+ return -1; -+ } -+ if (silent<2) -+ print_frontend_stats (frontend_fd, human_readable); -+ -+ copy_to_file(dvr_fd,file_fd); -+ -+ if (silent<2) -+ print_frontend_stats (frontend_fd, human_readable); -+ } -+ else { -+just_the_frontend_dude: -+ check_frontend (frontend_fd, human_readable); -+ } - - close (audio_fd); - close (video_fd); -@@ -474,4 +695,3 @@ - - return 0; - } -- -diff -Nurd linuxtv-dvb-apps-1.1.1/util/ttusb_dec_reset/Makefile dvb-apps/util/ttusb_dec_reset/Makefile ---- linuxtv-dvb-apps-1.1.1/util/ttusb_dec_reset/Makefile 2004-01-21 23:13:45.000000000 +0100 -+++ dvb-apps/util/ttusb_dec_reset/Makefile 2009-06-21 13:29:06.000000000 +0200 -@@ -1,17 +1,19 @@ --CC = gcc --RM = rm -f --CFLAGS = -g -Wall -O2 --LFLAGS = -g -Wall --LDFLAGS = -lusb -+# Makefile for linuxtv.org dvb-apps/util/ttusb_dec_reset - --OBJS = ttusb_dec_reset.o --TARGET = ttusb_dec_reset -+binaries = ttusb_dec_reset - --$(TARGET): $(OBJS) -- $(CC) $(LFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJS) -+ifneq ($(realpath $(binaries)),) -+inst_bin = $(binaries) -+endif - --.c.o: -- $(CC) $(CFLAGS) -c $< -o $@ -+LDLIBS += -lusb - --clean: -- $(RM) *.o $(TARGET) -+.PHONY: all -+ -+ifeq ($(ttusb_dec_reset),1) -+all: $(binaries) -+else -+all: clean -+endif -+ -+include ../../Make.rules -diff -Nurd linuxtv-dvb-apps-1.1.1/util/ttusb_dec_reset/ttusb_dec_reset.c dvb-apps/util/ttusb_dec_reset/ttusb_dec_reset.c ---- linuxtv-dvb-apps-1.1.1/util/ttusb_dec_reset/ttusb_dec_reset.c 2004-01-21 23:13:45.000000000 +0100 -+++ dvb-apps/util/ttusb_dec_reset/ttusb_dec_reset.c 2009-06-21 13:29:06.000000000 +0200 -@@ -25,10 +25,12 @@ - } - } - --int main() -+int main(int argc, char *argv[]) - { - struct usb_bus *busses; - struct usb_bus *bus; -+ (void) argc; -+ (void) argv; - - usb_init(); - usb_find_busses(); -diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/Makefile dvb-apps/util/zap/Makefile ---- linuxtv-dvb-apps-1.1.1/util/zap/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/zap/Makefile 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,20 @@ -+# Makefile for linuxtv.org dvb-apps/util/zap -+ -+objects = zap_ca.o \ -+ zap_dvb.o -+ -+binaries = zap -+ -+inst_bin = $(binaries) -+ -+CPPFLAGS += -I../../lib -+LDFLAGS += -L../../lib/libdvbapi -L../../lib/libdvbsec -L../../lib/libdvbcfg -L../../lib/libdvben50221 -L../../lib/libucsi -+LDLIBS += -ldvbcfg -ldvben50221 -ldvbsec -ldvbapi -lucsi -lpthread -+ -+.PHONY: all -+ -+all: $(binaries) -+ -+$(binaries): $(objects) -+ -+include ../../Make.rules -diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/zap.c dvb-apps/util/zap/zap.c ---- linuxtv-dvb-apps-1.1.1/util/zap/zap.c 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/zap/zap.c 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,226 @@ -+/* -+ ZAP utility -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ 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 -+#include -+#include -+#include -+#include -+#include "zap_dvb.h" -+#include "zap_ca.h" -+ -+ -+static void signal_handler(int _signal); -+ -+static int quit_app = 0; -+ -+void usage(void) -+{ -+ static const char *_usage = "\n" -+ " ZAP: A zapping application\n" -+ " Copyright (C) 2004, 2005, 2006 Manu Abraham (manu@kromtek.com)\n" -+ " Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)\n\n" -+ " usage: zap as follows:\n" -+ " -h help\n" -+ " -adapter adapter to use (default 0)\n" -+ " -frontend frontend to use (default 0)\n" -+ " -demux demux to use (default 0)\n" -+ " -caslotnum ca slot number to use (default 0)\n" -+ " -channels channels.conf file.\n" -+ " -secfile Optional sec.conf file.\n" -+ " -secid ID of the SEC configuration to use, one of:\n" -+ " -nomoveca Do not attempt to move CA descriptors from stream to programme level\n" -+ " \n"; -+ fprintf(stderr, "%s\n", _usage); -+ -+ exit(1); -+} -+ -+int find_channel(struct dvbcfg_zapchannel *channel, void *private_data) -+{ -+ struct dvbcfg_zapchannel *tmpchannel = private_data; -+ -+ if (strcmp(channel->name, tmpchannel->name) == 0) { -+ memcpy(tmpchannel, channel, sizeof(struct dvbcfg_zapchannel)); -+ return 1; -+ } -+ -+ return 0; -+} -+ -+int main(int argc, char *argv[]) -+{ -+ int adapter_id = 0; -+ int frontend_id = 0; -+ int demux_id = 0; -+ int caslot_num = 0; -+ char *chanfile = "/etc/channels.conf"; -+ char *secfile = NULL; -+ char *secid = NULL; -+ char *channel_name = NULL; -+ int moveca = 1; -+ int argpos = 1; -+ struct zap_dvb_params zap_dvb_params; -+ struct zap_ca_params zap_ca_params; -+ -+ while(argpos != argc) { -+ if (!strcmp(argv[argpos], "-h")) { -+ usage(); -+ } else if (!strcmp(argv[argpos], "-adapter")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (sscanf(argv[argpos+1], "%i", &adapter_id) != 1) -+ usage(); -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-frontend")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (sscanf(argv[argpos+1], "%i", &frontend_id) != 1) -+ usage(); -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-demux")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (sscanf(argv[argpos+1], "%i", &demux_id) != 1) -+ usage(); -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-caslotnum")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ if (sscanf(argv[argpos+1], "%i", &caslot_num) != 1) -+ usage(); -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-channels")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ chanfile = argv[argpos+1]; -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-secfile")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ secfile = argv[argpos+1]; -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-secid")) { -+ if ((argc - argpos) < 2) -+ usage(); -+ secid = argv[argpos+1]; -+ argpos+=2; -+ } else if (!strcmp(argv[argpos], "-nomoveca")) { -+ moveca = 0; -+ argpos++; -+ } else { -+ if ((argc - argpos) != 1) -+ usage(); -+ channel_name = argv[argpos]; -+ argpos++; -+ } -+ } -+ -+ // the user didn't select anything! -+ if (channel_name == NULL) -+ usage(); -+ -+ // setup any signals -+ signal(SIGINT, signal_handler); -+ signal(SIGPIPE, SIG_IGN); -+ -+ // start the CA stuff -+ zap_ca_params.adapter_id = adapter_id; -+ zap_ca_params.caslot_num = caslot_num; -+ zap_ca_params.moveca = moveca; -+ zap_ca_start(&zap_ca_params); -+ -+ // find the requested channel -+ if (strlen(channel_name) >= sizeof(zap_dvb_params.channel.name)) { -+ fprintf(stderr, "Channel name is too long %s\n", channel_name); -+ exit(1); -+ } -+ FILE *channel_file = fopen(chanfile, "r"); -+ if (channel_file == NULL) { -+ fprintf(stderr, "Could open channel file %s\n", chanfile); -+ exit(1); -+ } -+ memcpy(zap_dvb_params.channel.name, channel_name, strlen(channel_name) + 1); -+ if (dvbcfg_zapchannel_parse(channel_file, find_channel, &zap_dvb_params.channel) != 1) { -+ fprintf(stderr, "Unable to find requested channel %s\n", channel_name); -+ exit(1); -+ } -+ fclose(channel_file); -+ -+ // default SEC with a DVBS card -+ if ((secid == NULL) && (zap_dvb_params.channel.fe_type == DVBFE_TYPE_DVBS)) -+ secid = "UNIVERSAL"; -+ -+ // look it up if one were supplied -+ zap_dvb_params.valid_sec = 0; -+ if (secid != NULL) { -+ if (dvbsec_cfg_find(secfile, secid, -+ &zap_dvb_params.sec)) { -+ fprintf(stderr, "Unable to find suitable sec/lnb configuration for channel\n"); -+ exit(1); -+ } -+ zap_dvb_params.valid_sec = 1; -+ } -+ -+ // open the frontend -+ zap_dvb_params.fe = dvbfe_open(adapter_id, frontend_id, 0); -+ if (zap_dvb_params.fe == NULL) { -+ fprintf(stderr, "Failed to open frontend\n"); -+ exit(1); -+ } -+ -+ // start the DVB stuff -+ zap_dvb_params.adapter_id = adapter_id; -+ zap_dvb_params.frontend_id = frontend_id; -+ zap_dvb_params.demux_id = demux_id; -+ zap_dvb_start(&zap_dvb_params); -+ -+ // the UI -+ while(!quit_app) { -+ sleep(1); -+ } -+ -+ // shutdown DVB stuff -+ if (channel_name != NULL) -+ zap_dvb_stop(); -+ -+ // shutdown CA stuff -+ zap_ca_stop(); -+ -+ // done -+ exit(0); -+} -+ -+static void signal_handler(int _signal) -+{ -+ (void) _signal; -+ -+ if (!quit_app) { -+ quit_app = 1; -+ } -+} -diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/zap_ca.c dvb-apps/util/zap/zap_ca.c ---- linuxtv-dvb-apps-1.1.1/util/zap/zap_ca.c 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/zap/zap_ca.c 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,198 @@ -+/* -+ ZAP utility CA functions -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ 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 "zap_ca.h" -+ -+ -+static int zap_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids); -+static int zap_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ uint8_t application_type, uint16_t application_manufacturer, -+ uint16_t manufacturer_code, uint8_t menu_string_length, -+ uint8_t *menu_string); -+static void *camthread_func(void* arg); -+ -+static struct en50221_transport_layer *tl = NULL; -+static struct en50221_session_layer *sl = NULL; -+static struct en50221_stdcam *stdcam = NULL; -+ -+static int ca_resource_connected = 0; -+ -+static int camthread_shutdown = 0; -+static pthread_t camthread; -+static int seenpmt = 0; -+static int moveca = 0; -+ -+void zap_ca_start(struct zap_ca_params *params) -+{ -+ // create transport layer -+ tl = en50221_tl_create(1, 16); -+ if (tl == NULL) { -+ fprintf(stderr, "Failed to create transport layer\n"); -+ return; -+ } -+ -+ // create session layer -+ sl = en50221_sl_create(tl, 16); -+ if (sl == NULL) { -+ fprintf(stderr, "Failed to create session layer\n"); -+ en50221_tl_destroy(tl); -+ return; -+ } -+ -+ // create the stdcam instance -+ stdcam = en50221_stdcam_create(params->adapter_id, params->caslot_num, tl, sl); -+ if (stdcam == NULL) { -+ en50221_sl_destroy(sl); -+ en50221_tl_destroy(tl); -+ return; -+ } -+ -+ // hook up the AI callbacks -+ if (stdcam->ai_resource) { -+ en50221_app_ai_register_callback(stdcam->ai_resource, zap_ai_callback, stdcam); -+ } -+ -+ // hook up the CA callbacks -+ if (stdcam->ca_resource) { -+ en50221_app_ca_register_info_callback(stdcam->ca_resource, zap_ca_info_callback, stdcam); -+ } -+ -+ // any other stuff -+ moveca = params->moveca; -+ -+ // start the cam thread -+ pthread_create(&camthread, NULL, camthread_func, NULL); -+} -+ -+void zap_ca_stop(void) -+{ -+ if (stdcam == NULL) -+ return; -+ -+ // shutdown the cam thread -+ camthread_shutdown = 1; -+ pthread_join(camthread, NULL); -+ -+ // destroy session layer -+ en50221_sl_destroy(sl); -+ -+ // destroy transport layer -+ en50221_tl_destroy(tl); -+ -+ // destroy the stdcam -+ if (stdcam->destroy) -+ stdcam->destroy(stdcam, 1); -+} -+ -+int zap_ca_new_pmt(struct mpeg_pmt_section *pmt) -+{ -+ uint8_t capmt[4096]; -+ int size; -+ -+ if (stdcam == NULL) -+ return -1; -+ -+ if (ca_resource_connected) { -+ fprintf(stderr, "Received new PMT - sending to CAM...\n"); -+ -+ // translate it into a CA PMT -+ int listmgmt = CA_LIST_MANAGEMENT_ONLY; -+ if (seenpmt) { -+ listmgmt = CA_LIST_MANAGEMENT_UPDATE; -+ } -+ seenpmt = 1; -+ -+ if ((size = en50221_ca_format_pmt(pmt, capmt, sizeof(capmt), moveca, listmgmt, -+ CA_PMT_CMD_ID_OK_DESCRAMBLING)) < 0) { -+ fprintf(stderr, "Failed to format PMT\n"); -+ return -1; -+ } -+ -+ // set it -+ if (en50221_app_ca_pmt(stdcam->ca_resource, stdcam->ca_session_number, capmt, size)) { -+ fprintf(stderr, "Failed to send PMT\n"); -+ return -1; -+ } -+ -+ // we've seen this PMT -+ return 1; -+ } -+ -+ return 0; -+} -+ -+void zap_ca_new_dvbtime(time_t dvb_time) -+{ -+ if (stdcam == NULL) -+ return; -+ -+ if (stdcam->dvbtime) -+ stdcam->dvbtime(stdcam, dvb_time); -+} -+ -+static void *camthread_func(void* arg) -+{ -+ (void) arg; -+ -+ while(!camthread_shutdown) { -+ stdcam->poll(stdcam); -+ } -+ -+ return 0; -+} -+ -+static int zap_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number, -+ uint8_t application_type, uint16_t application_manufacturer, -+ uint16_t manufacturer_code, uint8_t menu_string_length, -+ uint8_t *menu_string) -+{ -+ (void) arg; -+ (void) slot_id; -+ (void) session_number; -+ -+ printf("CAM Application type: %02x\n", application_type); -+ printf("CAM Application manufacturer: %04x\n", application_manufacturer); -+ printf("CAM Manufacturer code: %04x\n", manufacturer_code); -+ printf("CAM Menu string: %.*s\n", menu_string_length, menu_string); -+ -+ return 0; -+} -+ -+static int zap_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids) -+{ -+ (void) arg; -+ (void) slot_id; -+ (void) session_number; -+ -+ printf("CAM supports the following ca system ids:\n"); -+ uint32_t i; -+ for(i=0; i< ca_id_count; i++) { -+ printf(" 0x%04x\n", ca_ids[i]); -+ } -+ ca_resource_connected = 1; -+ return 0; -+} -diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/zap_ca.h dvb-apps/util/zap/zap_ca.h ---- linuxtv-dvb-apps-1.1.1/util/zap/zap_ca.h 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/zap/zap_ca.h 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,37 @@ -+/* -+ ZAP utility CA functions -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU Lesser General Public License as -+ published by the Free Software Foundation; either version 2.1 of -+ the License, or (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with this library; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+*/ -+ -+#ifndef ZAP_CA_H -+#define ZAP_CA_H 1 -+ -+struct zap_ca_params { -+ int adapter_id; -+ int caslot_num; -+ int moveca; -+}; -+ -+extern void zap_ca_start(struct zap_ca_params *params); -+extern void zap_ca_stop(void); -+ -+extern int zap_ca_new_pmt(struct mpeg_pmt_section *pmt); -+extern void zap_ca_new_dvbtime(time_t dvb_time); -+ -+#endif -diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/zap_dvb.c dvb-apps/util/zap/zap_dvb.c ---- linuxtv-dvb-apps-1.1.1/util/zap/zap_dvb.c 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/zap/zap_dvb.c 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,353 @@ -+/* -+ ZAP utility DVB functions -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ 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 -+#include -+#include -+#include -+#include "zap_dvb.h" -+#include "zap_ca.h" -+ -+#define FE_STATUS_PARAMS (DVBFE_INFO_LOCKSTATUS|DVBFE_INFO_SIGNAL_STRENGTH|DVBFE_INFO_BER|DVBFE_INFO_SNR|DVBFE_INFO_UNCORRECTED_BLOCKS) -+ -+static int dvbthread_shutdown = 0; -+static pthread_t dvbthread; -+ -+static int pat_version = -1; -+static int ca_pmt_version = -1; -+ -+static void *dvbthread_func(void* arg); -+ -+static void process_pat(int pat_fd, struct zap_dvb_params *params, int *pmt_fd, struct pollfd *pollfd); -+static void process_tdt(int tdt_fd); -+static void process_pmt(int pmt_fd, struct zap_dvb_params *params); -+static int create_section_filter(int adapter, int demux, uint16_t pid, uint8_t table_id); -+ -+ -+int zap_dvb_start(struct zap_dvb_params *params) -+{ -+ pthread_create(&dvbthread, NULL, dvbthread_func, (void*) params); -+ return 0; -+} -+ -+void zap_dvb_stop(void) -+{ -+ dvbthread_shutdown = 1; -+ pthread_join(dvbthread, NULL); -+} -+ -+static void *dvbthread_func(void* arg) -+{ -+ int tune_state = 0; -+ int pat_fd = -1; -+ int pmt_fd = -1; -+ int tdt_fd = -1; -+ struct pollfd pollfds[3]; -+ -+ struct zap_dvb_params *params = (struct zap_dvb_params *) arg; -+ -+ // create PAT filter -+ if ((pat_fd = create_section_filter(params->adapter_id, params->demux_id, -+ TRANSPORT_PAT_PID, stag_mpeg_program_association)) < 0) { -+ fprintf(stderr, "Failed to create PAT section filter\n"); -+ exit(1); -+ } -+ pollfds[0].fd = pat_fd; -+ pollfds[0].events = POLLIN|POLLPRI|POLLERR; -+ -+ // create TDT filter -+ if ((tdt_fd = create_section_filter(params->adapter_id, params->demux_id, TRANSPORT_TDT_PID, stag_dvb_time_date)) < 0) { -+ fprintf(stderr, "Failed to create TDT section filter\n"); -+ exit(1); -+ } -+ pollfds[1].fd = tdt_fd; -+ pollfds[1].events = POLLIN|POLLPRI|POLLERR; -+ -+ // zero PMT filter -+ pollfds[2].fd = 0; -+ pollfds[2].events = 0; -+ -+ // the DVB loop -+ while(!dvbthread_shutdown) { -+ // tune frontend + monitor lock status -+ if (tune_state == 0) { -+ // get the type of frontend -+ struct dvbfe_info result; -+ char *types; -+ memset(&result, 0, sizeof(result)); -+ dvbfe_get_info(params->fe, 0, &result, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0); -+ switch(result.type) { -+ case DVBFE_TYPE_DVBS: -+ types = "DVB-S"; -+ break; -+ case DVBFE_TYPE_DVBC: -+ types = "DVB-C"; -+ break; -+ case DVBFE_TYPE_DVBT: -+ types = "DVB-T"; -+ break; -+ case DVBFE_TYPE_ATSC: -+ types = "ATSC"; -+ break; -+ default: -+ types = "Unknown"; -+ } -+ fprintf(stderr, "Using frontend \"%s\", type %s\n", result.name, types); -+ -+ // do we have a valid SEC configuration? -+ struct dvbsec_config *sec = NULL; -+ if (params->valid_sec) -+ sec = ¶ms->sec; -+ -+ // tune! -+ if (dvbsec_set(params->fe, -+ sec, -+ params->channel.polarization, -+ (params->channel.diseqc_switch & 0x01) ? DISEQC_SWITCH_B : DISEQC_SWITCH_A, -+ (params->channel.diseqc_switch & 0x02) ? DISEQC_SWITCH_B : DISEQC_SWITCH_A, -+ ¶ms->channel.fe_params, -+ 0)) { -+ fprintf(stderr, "Failed to set frontend\n"); -+ exit(1); -+ } -+ -+ tune_state++; -+ } else if (tune_state == 1) { -+ struct dvbfe_info result; -+ memset(&result, 0, sizeof(result)); -+ if (dvbfe_get_info(params->fe, -+ FE_STATUS_PARAMS, -+ &result, -+ DVBFE_INFO_QUERYTYPE_IMMEDIATE, -+ 0) != FE_STATUS_PARAMS) { -+ fprintf(stderr, "Problem retrieving frontend information: %m\n"); -+ } -+ -+ fprintf(stderr, "status %c%c%c%c%c | signal %04x | snr %04x | ber %08x | unc %08x | %s\r", -+ result.signal ? 'S' : ' ', -+ result.carrier ? 'C' : ' ', -+ result.viterbi ? 'V' : ' ', -+ result.sync ? 'Y' : ' ', -+ result.lock ? 'L' : ' ', -+ result.signal_strength, -+ result.snr, -+ result.ber, -+ result.ucblocks, -+ result.lock ? "FE_HAS_LOCK" : ""); -+ fflush(stderr); -+ -+ if (result.lock) { -+ tune_state++; -+ fprintf(stderr, "\n"); -+ fflush(stderr); -+ } else { -+ usleep(500000); -+ } -+ } -+ -+ // is there SI data? -+ int count = poll(pollfds, 3, 100); -+ if (count < 0) { -+ fprintf(stderr, "Poll error\n"); -+ break; -+ } -+ if (count == 0) { -+ continue; -+ } -+ -+ // PAT -+ if (pollfds[0].revents & (POLLIN|POLLPRI)) { -+ process_pat(pat_fd, params, &pmt_fd, &pollfds[2]); -+ } -+ -+ // TDT -+ if (pollfds[1].revents & (POLLIN|POLLPRI)) { -+ process_tdt(tdt_fd); -+ } -+ -+ // PMT -+ if (pollfds[2].revents & (POLLIN|POLLPRI)) { -+ process_pmt(pmt_fd, params); -+ } -+ } -+ -+ // close demuxers -+ if (pat_fd != -1) -+ close(pat_fd); -+ if (pmt_fd != -1) -+ close(pmt_fd); -+ if (tdt_fd != -1) -+ close(tdt_fd); -+ -+ return 0; -+} -+ -+static void process_pat(int pat_fd, struct zap_dvb_params *params, int *pmt_fd, struct pollfd *pollfd) -+{ -+ int size; -+ uint8_t sibuf[4096]; -+ -+ // read the section -+ if ((size = read(pat_fd, sibuf, sizeof(sibuf))) < 0) { -+ return; -+ } -+ -+ // parse section -+ struct section *section = section_codec(sibuf, size); -+ if (section == NULL) { -+ return; -+ } -+ -+ // parse section_ext -+ struct section_ext *section_ext = section_ext_decode(section, 0); -+ if (section_ext == NULL) { -+ return; -+ } -+ if (pat_version == section_ext->version_number) { -+ return; -+ } -+ -+ // parse PAT -+ struct mpeg_pat_section *pat = mpeg_pat_section_codec(section_ext); -+ if (pat == NULL) { -+ return; -+ } -+ -+ // try and find the requested program -+ struct mpeg_pat_program *cur_program; -+ mpeg_pat_section_programs_for_each(pat, cur_program) { -+ if (cur_program->program_number == params->channel.service_id) { -+ // close old PMT fd -+ if (*pmt_fd != -1) -+ close(*pmt_fd); -+ -+ // create PMT filter -+ if ((*pmt_fd = create_section_filter(params->adapter_id, params->demux_id, -+ cur_program->pid, stag_mpeg_program_map)) < 0) { -+ return; -+ } -+ pollfd->fd = *pmt_fd; -+ pollfd->events = POLLIN|POLLPRI|POLLERR; -+ -+ // we have a new PMT pid -+ ca_pmt_version = -1; -+ break; -+ } -+ } -+ -+ // remember the PAT version -+ pat_version = section_ext->version_number; -+} -+ -+static void process_tdt(int tdt_fd) -+{ -+ int size; -+ uint8_t sibuf[4096]; -+ -+ // read the section -+ if ((size = read(tdt_fd, sibuf, sizeof(sibuf))) < 0) { -+ return; -+ } -+ -+ // parse section -+ struct section *section = section_codec(sibuf, size); -+ if (section == NULL) { -+ return; -+ } -+ -+ // parse TDT -+ struct dvb_tdt_section *tdt = dvb_tdt_section_codec(section); -+ if (tdt == NULL) { -+ return; -+ } -+ -+ // done -+ zap_ca_new_dvbtime(dvbdate_to_unixtime(tdt->utc_time)); -+} -+ -+static void process_pmt(int pmt_fd, struct zap_dvb_params *params) -+{ -+ int size; -+ uint8_t sibuf[4096]; -+ -+ // read the section -+ if ((size = read(pmt_fd, sibuf, sizeof(sibuf))) < 0) { -+ return; -+ } -+ -+ // parse section -+ struct section *section = section_codec(sibuf, size); -+ if (section == NULL) { -+ return; -+ } -+ -+ // parse section_ext -+ struct section_ext *section_ext = section_ext_decode(section, 0); -+ if (section_ext == NULL) { -+ return; -+ } -+ if ((section_ext->table_id_ext != params->channel.service_id) || -+ (section_ext->version_number == ca_pmt_version)) { -+ return; -+ } -+ -+ // parse PMT -+ struct mpeg_pmt_section *pmt = mpeg_pmt_section_codec(section_ext); -+ if (pmt == NULL) { -+ return; -+ } -+ -+ // do ca handling -+ if (zap_ca_new_pmt(pmt) == 1) -+ ca_pmt_version = pmt->head.version_number; -+} -+ -+static int create_section_filter(int adapter, int demux, uint16_t pid, uint8_t table_id) -+{ -+ int demux_fd = -1; -+ uint8_t filter[18]; -+ uint8_t mask[18]; -+ -+ // open the demuxer -+ if ((demux_fd = dvbdemux_open_demux(adapter, demux, 0)) < 0) { -+ return -1; -+ } -+ -+ // create a section filter -+ memset(filter, 0, sizeof(filter)); -+ memset(mask, 0, sizeof(mask)); -+ filter[0] = table_id; -+ mask[0] = 0xFF; -+ if (dvbdemux_set_section_filter(demux_fd, pid, filter, mask, 1, 1)) { -+ close(demux_fd); -+ return -1; -+ } -+ -+ // done -+ return demux_fd; -+} -diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/zap_dvb.h dvb-apps/util/zap/zap_dvb.h ---- linuxtv-dvb-apps-1.1.1/util/zap/zap_dvb.h 1970-01-01 01:00:00.000000000 +0100 -+++ dvb-apps/util/zap/zap_dvb.h 2009-06-21 13:29:06.000000000 +0200 -@@ -0,0 +1,41 @@ -+/* -+ ZAP utility DVB functions -+ -+ Copyright (C) 2004, 2005 Manu Abraham -+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU Lesser General Public License as -+ published by the Free Software Foundation; either version 2.1 of -+ the License, or (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with this library; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+*/ -+ -+#ifndef ZAP_DVB_H -+#define ZAP_DVB_H 1 -+ -+#include -+#include -+ -+struct zap_dvb_params { -+ int adapter_id; -+ int frontend_id; -+ int demux_id; -+ struct dvbcfg_zapchannel channel; -+ struct dvbsec_config sec; -+ int valid_sec; -+ struct dvbfe_handle *fe; -+}; -+ -+extern int zap_dvb_start(struct zap_dvb_params *params); -+extern void zap_dvb_stop(void); -+ -+#endif diff --git a/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps_1.1.1.bb b/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps_1.1.1.bb deleted file mode 100644 index 4968070..0000000 --- a/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps_1.1.1.bb +++ /dev/null @@ -1,112 +0,0 @@ -HOMEPAGE = "http://www.linuxtv.org" -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe" - -SRC_URI = "http://linuxtv.org/downloads/linuxtv-dvb-apps-${PV}.tar.bz2 \ - file://update-to-trunk.diff \ - file://update-to-tip.diff" - -PR = "r2" - -S = "${WORKDIR}/linuxtv-dvb-apps-${PV}" - -PACKAGES =+ "dvb-evtest dvb-evtest-dbg \ - dvbapp-tests dvbapp-tests-dbg \ - dvbdate dvbdate-dbg \ - dvbtraffic dvbtraffic-dbg \ - dvbnet dvbnet-dbg \ - dvb-scan dvb-scan-dbg dvb-scan-data \ - dvb-azap dvb-azap-dbg \ - dvb-czap dvb-czap-dbg \ - dvb-szap dvb-szap-dbg \ - dvb-tzap dvb-tzap-dbg \ - dvb-femon dvb-femon-dbg \ - dvb-zap-data" - - -TARGET_CC_ARCH += "${LDFLAGS} -static" - -FILES_${PN} = "${bindir} ${datadir}/dvb" -FILES_${PN}-doc = "" -FILES_${PN}-dev = "${includedir}" - -FILES_dvb-evtest = "${bindir}/evtest" -FILES_dvb-evtest-dbg = "${bindir}/.debug/evtest" - -FILES_dvbapp-tests = "${bindir}/*test* " -FILES_dvbapp-tests-dbg = "${bindir}/.debug/*test*" - -FILES_dvbdate = "${bindir}/dvbdate" -FILES_dvbdate-dbg = "${bindir}/.debug/dvbdate" - -FILES_dvbtraffic = "${bindir}/dvbtraffic" -FILES_dvbtraffic-dbg = "${bindir}/.debug/dvbtraffic" - -FILES_dvbnet = "${bindir}/dvbnet" -FILES_dvbnet-dbg = "${bindir}/.debug/dvbnet" - -FILES_dvb-scan = "${bindir}/*scan " -FILES_dvb-scan-dbg = "${bindir}/.debug/*scan" -FILES_dvb-scan-data = "${docdir}/dvb-apps/scan" - -FILES_dvb-azap = "${bindir}/azap" -FILES_dvb-azap-dbg = "${bindir}/.debug/azap" - -FILES_dvb-czap = "${bindir}/czap" -FILES_dvb-czap-dbg = "${bindir}/.debug/czap" - -FILES_dvb-szap = "${bindir}/szap" -FILES_dvb-szap-dbg = "${bindir}/.debug/szap" - -FILES_dvb-tzap = "${bindir}/tzap" -FILES_dvb-tzap-dbg = "${bindir}/.debug/tzap" - -FILES_dvb-femon = "${bindir}/femon" -FILES_dvb-femon-dbg = "${bindir}/.debug/femon" - -FILES_dvb-zap-data = "${docdir}/dvb-apps/szap" - -do_configure() { - sed -i -e s:/usr/include:${STAGING_INCDIR}:g util/av7110_loadkeys/generate-keynames.sh -} - -do_install() { - make DESTDIR=${D} install - install -d ${D}/${bindir} - install -d ${D}/${docdir}/dvb-apps - install -d ${D}/${docdir}/dvb-apps/scan - install -d ${D}/${docdir}/dvb-apps/szap - chmod a+rx ${D}/${libdir}/*.so* - - # Install tests - install -m 0755 ${S}/test/setvoltage ${D}${bindir}/test_setvoltage - install -m 0755 ${S}/test/set22k ${D}${bindir}/test_set22k - install -m 0755 ${S}/test/video ${D}${bindir}/test_video - install -m 0755 ${S}/test/sendburst ${D}${bindir}/test_sendburst - install -m 0755 ${S}/test/diseqc ${D}${bindir}/test_diseqc - install -m 0755 ${S}/test/test_sections ${D}${bindir}/ - install -m 0755 ${S}/test/test_av_play ${D}${bindir}/ - install -m 0755 ${S}/test/test_stillimage ${D}${bindir}/ - install -m 0755 ${S}/test/test_dvr_play ${D}${bindir}/ - install -m 0755 ${S}/test/test_tt ${D}${bindir}/ - install -m 0755 ${S}/test/test_sec_ne ${D}${bindir}/ - install -m 0755 ${S}/test/test_stc ${D}${bindir}/ - install -m 0755 ${S}/test/test_av ${D}${bindir}/ - install -m 0755 ${S}/test/test_vevent ${D}${bindir}/ - install -m 0755 ${S}/test/test_pes ${D}${bindir}/ - install -m 0755 ${S}/test/test_dvr ${D}${bindir}/ - - cp -pPR ${S}/util/szap/channels-conf* ${D}/${docdir}/dvb-apps/szap/ - cp -pPR ${S}/util/szap/README ${D}/${docdir}/dvb-apps/szap/ -} - -python populate_packages_prepend () { - dvb_libdir = bb.data.expand('${libdir}', d) - do_split_packages(d, dvb_libdir, '^lib(.*)\.so$', 'lib%s', 'DVB %s package', extra_depends='', allow_links=True) - do_split_packages(d, dvb_libdir, '^lib(.*)\.la$', 'lib%s-dev', 'DVB %s development package', extra_depends='${PN}-dev') - do_split_packages(d, dvb_libdir, '^lib(.*)\.a$', 'lib%s-dev', 'DVB %s development package', extra_depends='${PN}-dev') - do_split_packages(d, dvb_libdir, '^lib(.*)\.so\.*', 'lib%s', 'DVB %s library', extra_depends='', allow_links=True) -} - -SRC_URI[md5sum] = "de958cdb8d00e74792dd69f3c945b037" -SRC_URI[sha256sum] = "371f8133db705bde6c2f79cccb0b1a1f626a0d94bf41acceba5d76a69155f057" diff --git a/meta-openvuplus/recipes-enigma2/dvbtools/dvbstream_cvs.bb b/meta-openvuplus/recipes-enigma2/dvbtools/dvbstream_cvs.bb deleted file mode 100644 index 652857f..0000000 --- a/meta-openvuplus/recipes-enigma2/dvbtools/dvbstream_cvs.bb +++ /dev/null @@ -1,18 +0,0 @@ -SECTION = "console/multimedia" -PRIORITY = "optional" -LICENSE = "GPLV2" -DEPENDS = "libxml2" -SRCDATE = "20090621" -PV = "0.0+cvs${SRCDATE}" - -PR = "r1" - -SRC_URI = "cvs://anonymous@dvbtools.cvs.sourceforge.net/cvsroot/dvbtools;module=dvbstream" -S = "${WORKDIR}/dvbstream" - -CFLAGS_append = " ${LDFLAGS} -D_GNU_SOURCE" - -do_install() { - mkdir -p ${D}${bindir} - for i in dvbstream dumprtp ts_filter rtpfeed; do install -m 0755 $i ${D}${bindir}/; done -} diff --git a/meta-openvuplus/recipes-enigma2/dvbtools/dvbtune_cvs.bb b/meta-openvuplus/recipes-enigma2/dvbtools/dvbtune_cvs.bb deleted file mode 100644 index 0b0715c..0000000 --- a/meta-openvuplus/recipes-enigma2/dvbtools/dvbtune_cvs.bb +++ /dev/null @@ -1,23 +0,0 @@ -SECTION = "console/multimedia" -PRIORITY = "optional" -LICENSE = "GPLv2" -DEPENDS = "libxml2" -SRCDATE = "20090621" -PV = "0.0+cvs${SRCDATE}" - -SRC_URI = "cvs://anonymous@dvbtools.cvs.sourceforge.net/cvsroot/dvbtools;module=dvbtune" - -S = "${WORKDIR}/dvbtune" - -CFLAGS += "\$(shell xml2-config --cflags)" -LDFLAGS += "\$(shell xml2-config --libs)" - -do_compile() { - oe_runmake dvbtune xml2vdr -} - -do_install() { - mkdir -p ${D}${bindir} - install -m 0755 dvbtune ${D}${bindir}/ - install -m 0755 xml2vdr ${D}${bindir}/ -} diff --git a/meta-openvuplus/recipes-enigma2/dvbtools/wscan_20101204.bb b/meta-openvuplus/recipes-enigma2/dvbtools/wscan_20101204.bb deleted file mode 100644 index 34bc652..0000000 --- a/meta-openvuplus/recipes-enigma2/dvbtools/wscan_20101204.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "Wscan is a dvb channel scanner that doesn't require an initial frequency table" -LICENSE = "GPLv2" -PR = "r1" - -SRC_URI = "http://wirbel.htpc-forum.de/w_scan/w_scan-${PV}.tar.bz2" - -SRC_URI[md5sum] = "93c1a61992cac35d0efcf14a0ef2bd25" -SRC_URI[sha256sum] = "1731a17317a75f9c37732654c10070acf4058b70757f762de8be05d8f5fcf838" - -S = "${WORKDIR}/w_scan-${PV}" - -inherit autotools - -FILES_${PN} += "${datadir}" - diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices.bb b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices.bb deleted file mode 100755 index 45c2557..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices.bb +++ /dev/null @@ -1,20 +0,0 @@ -SUMMARY = "enigma2 default services/transponder" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" - -PR = "r8" - -SRC_URI = "file://*" - -S = "${WORKDIR}" - -INHIBIT_PACKAGE_STRIP = "1" - -do_install() { - install -d ${D}/usr/share/enigma2/dealer - install ${WORKDIR}/*.info ${D}/usr/share/enigma2/dealer - install ${WORKDIR}/lamedb.* ${D}/usr/share/enigma2/dealer -} - -FILES_${PN} = "/" -PACKAGE_ARCH = "all" diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.130 b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.130 deleted file mode 100644 index 6748689..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.130 +++ /dev/null @@ -1,6492 +0,0 @@ -eDVB services /4/ -transponders -00820000:1ce8:0071 - s 12188000:27500000:1:4:130:2:0 -/ -00820000:1e78:0071 - s 12264000:27500000:1:3:130:2:0:1:2:2:2 -/ -00820000:1edc:0071 - s 12284000:27500000:0:4:130:2:0 -/ -00820000:3390:0071 - s 11158000:27500000:1:4:130:2:0 -/ -00820000:2e18:00b0 - s 10873000:27500000:1:3:130:2:0 -/ -00820000:0708:00c8 - s 11541000:22000000:1:4:130:2:0 -/ -00820000:1770:0110 - s 11919000:27500000:1:2:130:2:0 -/ -00820000:00c8:013e - s 11240000:27500000:1:3:130:2:0 -/ -00820000:012c:013e - s 11258000:27500000:0:3:130:2:0:1:2:2:2 -/ -00820000:0190:013e - s 11278000:27500000:1:3:130:2:0:1:2:0:2 -/ -00820000:01f4:013e - s 11296000:27500000:0:3:130:2:0 -/ -00820000:0258:013e - s 11317000:27500000:1:3:130:2:0 -/ -00820000:03e8:013e - s 11393000:27500000:1:4:130:2:0 -/ -00820000:044c:013e - s 11411000:27500000:0:4:130:2:0:1:2:0:2 -/ -00820000:0514:013e - s 11449000:27500000:0:3:130:2:0:1:2:0:2 -/ -00820000:05dc:013e - s 11488000:27500000:0:4:130:2:0 -/ -00820000:0640:013e - s 11508000:27500000:1:4:130:2:0 -/ -00820000:06a4:013e - s 11526000:27500000:0:3:130:2:0 -/ -00820000:1388:013e - s 11727000:27500000:1:3:130:2:0 -/ -00820000:13ef:013e - s 11747000:27500000:0:3:130:2:0 -/ -00820000:1450:013e - s 11766000:27500000:1:2:130:2:0 -/ -00820000:1518:013e - s 11804200:27500000:1:2:130:2:0 -/ -00820000:157c:013e - s 11823000:27500000:0:3:130:2:0 -/ -00820000:17d4:013e - s 11938000:29900000:0:3:130:2:0 -/ -00820000:1964:013e - s 12015000:27500000:0:3:130:2:0 -/ -00820000:1b58:013e - s 12111000:27500000:1:3:130:2:0 -/ -00820000:1bbc:013e - s 12130260:27500000:0:3:130:2:0:1:2:0:2 -/ -00820000:1c20:013e - s 12149000:27500000:1:3:130:2:0 -/ -00820000:1c84:013e - s 12169000:27500000:0:3:130:2:0 -/ -00820000:1e14:013e - s 12245000:27500000:0:3:130:2:0 -/ -00820000:1fa4:013e - s 12322000:27500000:0:3:130:2:0 -/ -00820000:20d0:013e - s 12380000:27500000:1:3:130:2:0 -/ -00820000:2134:013e - s 12399000:27500000:0:3:130:2:0 -/ -00820000:21fc:013e - s 12437000:27500000:0:3:130:2:0 -/ -00820000:2328:013e - s 12520000:27500000:1:3:130:2:0 -/ -00820000:24b8:013e - s 12597000:27500000:1:3:130:2:0 -/ -00820000:2af8:013e - s 10719000:27500000:1:4:130:2:0 -/ -00820000:2b5c:013e - s 10723000:29900000:0:3:130:2:0 -/ -00820000:2bc0:013e - s 10757000:27500000:1:4:130:2:0 -/ -00820000:2c88:013e - s 10796000:27500000:1:4:130:2:0 -/ -00820000:2cec:013e - s 10815000:27500000:0:4:130:2:0 -/ -00820000:2d50:013e - s 10834000:27500000:1:3:130:2:0:1:2:0:2 -/ -00820000:2e7c:013e - s 10892000:27500000:0:3:130:2:0 -/ -00820000:2f44:013e - s 10930160:29900000:0:3:130:2:0 -/ -00820000:2fa8:013e - s 10949000:27500000:1:3:130:2:0 -/ -00820000:300c:013e - s 10971410:29700000:0:2:130:2:0:1:2:0:2 -/ -00820000:3070:013e - s 10992000:27500000:1:2:130:2:0 -/ -00820000:3138:013e - s 11034000:27500000:1:3:130:2:0 -/ -00820000:319c:013e - s 11054000:27500000:0:4:130:2:0 -/ -00820000:3200:013e - s 11075000:27500000:1:3:130:2:0 -/ -00820000:3264:013e - s 11096000:29900000:0:2:130:2:0:1:2:0:2 -/ -00820000:32c8:013e - s 11117000:27500000:1:3:130:2:0 -/ -00820000:332c:013e - s 11137000:27500000:0:3:130:2:0 -/ -00820000:33f4:013e - s 11179000:27500000:0:3:130:2:0 -/ -00820000:3458:013e - s 11200000:27500000:1:4:130:2:0 -/ -00820000:3bc4:013e - s 11566000:27500000:0:3:130:2:0 -/ -00820000:3c28:013e - s 11585000:27500000:1:3:130:2:0 -/ -00820000:3c8c:013e - s 11604000:27500000:0:4:130:2:0 -/ -00820000:3cf0:013e - s 11623000:27500000:1:3:130:2:0 -/ -00820000:3d54:013e - s 11642500:27500000:0:3:130:2:0 -/ -00820000:3db8:013e - s 11662000:27500000:1:3:130:2:0 -/ -00820000:23f0:013f - s 12558000:27500000:1:3:130:2:0 -/ -00820000:26ac:013f - s 12692000:27500000:0:3:130:2:0:1:2:0:2 -/ -00820000:3e1c:013f - s 11681000:27500000:0:3:130:2:0:1:2:0:2 -/ -00820000:25e4:02be - s 12654000:27500000:0:3:130:2:0 -/ -00820000:0064:fbff - s 11219250:29900000:0:4:130:2:0 -/ -00820000:0320:fbff - s 11355080:29900000:1:4:130:2:0 -/ -00820000:14b4:fbff - s 11785000:29900000:0:3:130:2:0:1:2:0:2 -/ -00820000:15e0:fbff - s 11842000:29900000:1:3:130:2:0:1:2:0:2 -/ -00820000:1644:fbff - s 11861000:29900000:0:4:130:2:0 -/ -00820000:16a8:fbff - s 11881000:27500000:1:3:130:2:0 -/ -00820000:170c:fbff - s 11900000:29900000:0:4:130:2:0 -/ -00820000:1838:fbff - s 11958000:27500000:1:3:130:2:0 -/ -00820000:189c:fbff - s 11976000:29900000:0:4:130:2:0 -/ -00820000:1900:fbff - s 11996000:29900000:1:3:130:2:0:1:2:0:2 -/ -00820000:19c8:fbff - s 12034000:29900000:1:4:130:2:0 -/ -00820000:1a2c:fbff - s 12054000:29900000:0:4:130:2:0 -/ -00820000:1a90:fbff - s 12072000:29900000:1:4:130:2:0 -/ -00820000:1af4:fbff - s 12091900:29900000:0:3:130:2:0:1:2:0:2 -/ -00820000:1d4c:fbff - s 12206980:29900000:0:3:130:2:0:1:2:0:2 -/ -00820000:2008:fbff - s 12341000:29900000:1:3:130:2:0:1:2:0:2 -/ -00820000:206c:fbff - s 12360420:29900000:0:3:130:2:0:1:2:0:2 -/ -00820000:2198:fbff - s 12418000:29900000:1:3:130:2:0:1:2:0:2 -/ -00820000:2260:fbff - s 12465910:29900000:1:3:130:2:0:1:2:0:2 -/ -00820000:251c:fbff - s 12616000:29900000:0:4:130:2:0 -/ -00820000:2580:fbff - s 12635000:29900000:1:4:130:2:0 -/ -00820000:2648:fbff - s 12673280:29900000:1:4:130:2:0 -/ -00820000:2710:fbff - s 12713000:29900000:1:4:130:2:0 -/ -00820000:2774:fbff - s 12731000:29900000:0:3:130:2:0:1:2:0:2 -/ -00820000:2c24:fbff - s 10775000:29900000:0:4:130:2:0 -/ -00820000:2db4:fbff - s 10853440:29900000:0:4:130:2:0 -/ -0082accf:0578:013e - s 11471000:27500000:1:4:130:2:0 -/ -0082afc2:0065:0001 - s 12226000:27500000:1:3:130:2:0 -/ -end -services -420e:00820000:3db8:013e:0:0 - -p: -0111:00820000:3070:013e:0:0 - -p: -0112:00820000:3070:013e:0:0 - -p: -0f66:00820000:2198:fbff:0:0 - -p: -0390:00820000:33f4:013e:0:0 - -p: -2df1:00820000:1a2c:fbff:0:0 - -p: -3400:00820000:2710:fbff:1:0 -Primafila 10 -p:SkyItalia -0001:00820000:2e18:00b0:1:0 -AL MAGHRIBIA -p:PRVDR -0001:0082afc2:0065:0001:1:0 -RFE/RL TV 1 (HB1-8) -p: -0001:00820000:1770:0110:1:0 -Italia 1 -p:Mediaset -0001:00820000:1fa4:013e:1:0 -RIT-TV -p:EUTELSAT -0001:00820000:25e4:02be:1:0 -SHARJAH TV -p:ARABSAT -1101:00820000:1644:fbff:1:0 -Doctor's Life -p:SkyItalia -3c01:00820000:0064:fbff:1:0 -DoveTv -p:SkyItalia -0002:00820000:3200:013e:1:0 -MTV Polska -p:MTV Networks Europe -0002:00820000:2e18:00b0:1:0 -AlAoula INTER+L -p:PRVDR -0002:00820000:1770:0110:1:0 -Canale 5 -p:Mediaset -0002:00820000:25e4:02be:1:0 -QATAR TV -p:ARABSAT -1402:00820000:05dc:013e:1:0 -ANIMAL PLANET -p:CYFRA + -3402:00820000:2710:fbff:1:0 -Primafila 12 -p:SkyItalia -3902:00820000:2648:fbff:1:0 -DIVA Universal -p:SkyItalia -0003:00820000:2e18:00b0:1:0 -AL Aoula -p:PRVDR -0003:00820000:3d54:013e:1:0 -Bloomberg European TV -p: -0003:00820000:1770:0110:1:0 -Rete 4 -p:Mediaset -0003:00820000:25e4:02be:1:0 -SAUDI1 -p:ARABSAT -3c03:00820000:0064:fbff:1:0 -LEI -p:SkyItalia -0004:00820000:3200:013e:1:0 -CC Family -p:MTV Networks Europe -0004:00820000:2e18:00b0:1:0 -ARRABIAA -p:PRVDR -0004:00820000:1770:0110:1:0 -Iris -p:Mediaset -0004:00820000:25e4:02be:1:0 -KUWAIT -p:ARABSAT -0104:0082afc2:0065:0001:1:0 -VOA Music Mix 260 -p: -0005:00820000:3200:013e:1:0 -VIVA Polska -p:MTV Networks Europe -0005:00820000:2e18:00b0:1:0 -AL Aoula INTER -p:PRVDR -0005:00820000:1770:0110:1:0 -CANALE 5 -p:Mediaset -0005:0082accf:0578:013e:1:0 -Kahkeshan TV -p:Harmonic -0105:0082afc2:0065:0001:1:0 -VOA Music Mix 261 -p: -3305:00820000:0190:013e:1:0 -ESP HD Intl -p:CYFRA + -3405:00820000:2710:fbff:1:0 -Primafila 14 -p:SkyItalia -0006:00820000:3200:013e:1:0 -Viacom Blink! -p:MTV Networks Europe -0006:00820000:2e18:00b0:1:0 -ASSADISSA -p:PRVDR -0006:00820000:1770:0110:1:0 -Boing -p:Mediaset -0006:00820000:25e4:02be:1:0 -SUDAN TV -p:ARABSAT -0106:0082afc2:0065:0001:1:0 -VOA Music Mix 262 -p: -0e06:00820000:2d50:013e:1:0 -BBC HD -p:ITI -1206:00820000:2b5c:013e:1:0 -NPR -p:Arqiva -1406:00820000:05dc:013e:1:0 -CLUB TV -p:CYFRA + -1f06:00820000:21fc:013e:1:0 -ALKAWTHAR -p:IRIB -2906:00820000:1edc:0071:1:0 -Boomerang -p:Cyfrowy Polsat S.A. -0007:00820000:3200:013e:1:0 -VH1 -p:MTV Networks Europe -0007:00820000:1770:0110:1:0 -La 5 -p:Mediaset -0007:00820000:25e4:02be:1:0 -OMAN -p:ARABSAT -0107:0082afc2:0065:0001:1:0 -VOA Radio 263 (HB59-62) -p: -1307:00820000:2e7c:013e:1:0 -CANAL+ -p:CYFRA + -1407:00820000:05dc:013e:1:0 -ZONE REALITY -p:CYFRA + -1f07:00820000:21fc:013e:1:0 -SAHAR 2 -p:IRIB -3307:00820000:0190:013e:1:0 -ESP HD Turk -p:CYFRA + -3607:00820000:00c8:013e:1:0 -ESP Int'l -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -3c07:00820000:0064:fbff:1:0 -Boomerang -p:SkyItalia -0008:00820000:2e18:00b0:1:0 -Medi1 TV -p:PRVDR -0008:0082afc2:0065:0001:1:0 -IBB OS Download 8 (DCP) -p: -0008:00820000:1770:0110:1:0 -TgCom24 -p:Mediaset -0008:00820000:25e4:02be:1:0 -ESC -p:ARABSAT -0108:0082afc2:0065:0001:1:0 -VOA Radio 264 -p: -0e08:00820000:2d50:013e:1:0 -BBC Knowledge HD -p:ITI -1308:00820000:2e7c:013e:1:0 -CANAL+ FILM -p:CYFRA + -1f08:00820000:21fc:013e:1:0 -PRESS TV -p:IRIB -2908:00820000:1edc:0071:1:0 -Planeta FM -p:Cyfrowy Polsat S.A. -3308:00820000:0190:013e:1:0 -ESP HD Russian -p:CYFRA + -3608:00820000:00c8:013e:1:0 -ESP Romanian -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -0009:0082afc2:0065:0001:1:0 -IBB OS Download 9 (CCP) -p: -0009:00820000:1770:0110:1:0 -Mediaset EXTRA -p:Harmonic -0009:00820000:25e4:02be:1:0 -AL-IRAQIA TV -p:ARABSAT -0109:0082afc2:0065:0001:1:0 -VOA Radio 265 (HB61-64) -p: -0e09:00820000:2d50:013e:1:0 -HBO2 HD -p:ITI -2909:00820000:1edc:0071:1:0 -TVP Sport -p:Cyfrowy Polsat S.A. -3309:00820000:0190:013e:1:0 -ESP HD Dutch -p:CYFRA + -3609:00820000:00c8:013e:1:0 -ESP Dutch -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -4209:00820000:3db8:013e:1:0 -PUNTOSAT -p:Telespazio -000a:00820000:3200:013e:1:0 -Comedy Central Polska -p:MTV Networks Europe -000a:00820000:2e18:00b0:1:0 -ARRIADIA -p:PRVDR -000a:00820000:1770:0110:1:0 -Mediaset ITALIA DUE -p:Mediaset -000a:00820000:1388:013e:1:0 -SCT HD -p:Harmonic -010a:0082afc2:0065:0001:1:0 -VOA Radio 266 (HB63-64) -p: -0e0a:00820000:2d50:013e:1:0 -HBO COMEDY HD -p:ITI -110a:00820000:1644:fbff:1:0 -Sky TG24 -p:SkyItalia -130a:00820000:2e7c:013e:1:0 -DTV CABLE KU -p:CYFRA + -200a:00820000:24b8:013e:1:0 -ARM_1 -p:GlobeCast -290a:00820000:1edc:0071:1:0 -TEST I -p:Cyfrowy Polsat S.A. -330a:00820000:0190:013e:1:0 -ESP HD Czech -p:CYFRA + -360a:00820000:00c8:013e:1:0 -ESP Polish -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -390a:00820000:32c8:013e:1:0 -BBC Entertainment Poland -p:Globecast UK -420a:00820000:3db8:013e:1:0 -Home Tv -p:Harmonic -000b:00820000:3200:013e:1:0 -Nickelodeon Europe -p:MTV Networks Europe -000b:0082accf:0578:013e:1:0 -Somali Channel -p:Harmonic -010b:0082afc2:0065:0001:1:0 -VOA Radio 267 (HB65-68) -p: -0e0b:00820000:2d50:013e:1:0 -nPremium2 -p:ITI -130b:00820000:2e7c:013e:1:0 -DTV CABLE AL -p:CYFRA + -200b:00820000:24b8:013e:1:0 -BET -p:GlobeCast -290b:00820000:1edc:0071:1:0 -Zone Europa -p:Cyfrowy Polsat S.A. -330b:00820000:0190:013e:1:0 -ESP HD German -p:CYFRA + -360b:00820000:00c8:013e:1:0 -ESP Russian -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -390b:00820000:32c8:013e:1:0 -BBC Knowledge Poland -p:Globecast UK -3a0b:00820000:1fa4:013e:1:0 -TG NORBA 24 -p:EUTELSAT -420b:00820000:3db8:013e:1:0 -MC TELEVISION -p:Telespazio -000c:0082accf:0578:013e:1:0 -Royal Somali TV -p:Harmonic -130c:00820000:2e7c:013e:1:0 -DTV CABLE ZI -p:CYFRA + -200c:00820000:24b8:013e:1:0 -BBC World News -p:GlobeCast -290c:00820000:1edc:0071:1:0 -Polsat Jim Jam -p:Cyfrowy Polsat S.A. -360c:00820000:00c8:013e:1:0 -ESP Portuguese -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -390c:00820000:32c8:013e:1:0 -BBC Lifestyle Poland -p:Globecast UK -420c:00820000:3db8:013e:1:0 -STUDIO 100 SAT -p:Telespazio -010d:0082afc2:0065:0001:1:0 -VOA Radio 269 -p: -130d:00820000:2e7c:013e:1:0 -ALE KINO+ -p:CYFRA + -200d:00820000:24b8:013e:1:0 -RD1_Radio_ARMENIA -p:GlobeCast -290d:00820000:1edc:0071:1:0 -Polsat Film -p:Cyfrowy Polsat S.A. -330d:00820000:0190:013e:1:0 -ESP HD Portuguese -p:CYFRA + -340d:00820000:2710:fbff:1:0 -Primafila 8 -p:SkyItalia -360d:00820000:00c8:013e:1:0 -ESP Hungarian -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -390d:00820000:32c8:013e:1:0 -BBC CBeebies Poland -p:Globecast UK -420d:00820000:3db8:013e:1:0 -LOMBARDIA SAT -p:Harmonic -000e:0082accf:0578:013e:1:0 -Dardasha TV -p:Harmonic -000e:00820000:3bc4:013e:1:0 -Wesal Haq -p:RRSat -010e:0082afc2:0065:0001:1:0 -VOA Radio 270 (HB65-68) -p: -030e:00820000:1b58:013e:1:0 -RIKSat -p:Telespazio -120e:00820000:2b5c:013e:1:0 -Thendral -p:Arqiva -130e:00820000:2e7c:013e:1:0 -ALE KINO+ -p:CYFRA + -200e:00820000:24b8:013e:1:0 -Sonshine TV -p:GlobeCast -290e:00820000:1edc:0071:1:0 -TV6 -p:Cyfrowy Polsat S.A. -330e:00820000:0190:013e:1:0 -ESP HD Polish -p:CYFRA + -420e:00820000:00c8:013e:1:0 -ITALIA 7 -p:LINK -000f:0082accf:0578:013e:1:0 -Sawalef - X -p:Harmonic -010f:0082afc2:0065:0001:1:0 -VOA Radio 271 (HB69-72) -p: -030f:00820000:1b58:013e:1:0 -Class News -p:Harmonic -200f:00820000:24b8:013e:1:0 -Sonshine Radio -p:GlobeCast -290f:00820000:1edc:0071:1:0 -ATM Rozrywka TV -p:Cyfrowy Polsat S.A. -330f:00820000:0190:013e:1:0 -ESP HD Hungarian -p:CYFRA + -360f:00820000:00c8:013e:1:0 -ESP Czech -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -390f:00820000:32c8:013e:1:0 -R1 -p:Globecast UK -420f:00820000:3db8:013e:1:0 -Primo Canale -p:Telespazio -0110:0082afc2:0065:0001:1:0 -VOA Radio 272 (HB71-72) -p: -0310:00820000:1b58:013e:1:0 -CLASS HORSE TV -p:Telespazio -0e10:00820000:0708:00c8:1:0 -EMPTY SERVICE -p:M-Three satcom -2010:00820000:24b8:013e:1:0 -1TVRUS Europe -p:Harmonic -3310:00820000:0190:013e:1:0 -ESP HD Bulgaria -p:CYFRA + -3610:00820000:00c8:013e:1:0 -ESP Greek -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -4210:00820000:3db8:013e:1:0 -Challenger -p:Harmonic -0e11:00820000:0708:00c8:1:0 -VIRGIN RADIO TV -p:M-Three satcom -1111:00820000:1644:fbff:1:0 -EasyBaby -p:SkyItalia -2011:00820000:24b8:013e:1:0 -CNNi -p:GlobeCast -2c11:00820000:1a90:fbff:1:0 -12072V SID 0x2c11 -p:DVB-S QPSK 12072V 13.0°E -3311:00820000:0190:013e:1:0 -ESP HD Italy -p:CYFRA + -3611:00820000:00c8:013e:1:0 -ESP Cyprus -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -4211:00820000:3db8:013e:1:0 -Challenger T1 -p:Telespazio -0712:0082accf:0578:013e:1:0 -TELECOLORE -p:Harmonic -0e12:00820000:0708:00c8:1:0 -CUBOVISION -p:TIMB -0e12:00820000:16a8:fbff:1:0 -Caccia e Pesca + -p:SkyItalia -2912:00820000:1edc:0071:1:0 -Polsat Sport News -p:Cyfrowy Polsat S.A. -2c12:00820000:1a90:fbff:1:0 -12072V SID 0x2c12 -p:DVB-S QPSK 12072V 13.0°E -3312:00820000:0190:013e:1:0 -ESP HD Romania -p:CYFRA + -3612:00820000:00c8:013e:1:0 -ESP Bulgarian -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -3912:00820000:32c8:013e:1:0 -CNBC PE Hot -p:Globecast UK -4212:00820000:3db8:013e:1:0 -Challenger T2 -p:Telespazio -0313:00820000:1b58:013e:1:0 -TV Moda -p:Telespazio -2013:00820000:24b8:013e:1:0 -Euronews -p:GlobeCast -2913:00820000:1edc:0071:1:0 -Dla Abonentow -p:Cyfrowy Polsat S.A. -2c13:00820000:1a90:fbff:1:0 -12072V SID 0x2c13 -p:DVB-S QPSK 12072V 13.0°E -3313:00820000:0190:013e:1:0 -ESP HD ECH -p:CYFRA + -3613:00820000:00c8:013e:1:0 -ESP2 Turk -p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604 -4213:00820000:3db8:013e:1:0 -Canale Italia 84 -p:Telespazio -2914:00820000:1edc:0071:1:0 -Blue Hustler -p:Cyfrowy Polsat S.A. -2c14:00820000:1a90:fbff:1:0 -12072V SID 0x2c14 -p:DVB-S QPSK 12072V 13.0°E -3314:00820000:0190:013e:1:0 -ESP HD Spain -p:CYFRA + -3614:00820000:00c8:013e:1:0 -ESP Serbia -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -3914:00820000:32c8:013e:1:0 -Discovery ID Poland -p:Globecast UK -4214:00820000:3db8:013e:1:0 -Canale Italia -p:Telespazio -2015:00820000:24b8:013e:1:0 -JSTV 1 -p:Harmonic -2915:00820000:1edc:0071:1:0 -12284H SID 0x2915 -p:DVB-S QPSK 12284H 13.0°E -3315:00820000:0190:013e:1:0 -ESP HD -p:CYFRA + -3615:00820000:00c8:013e:1:0 -ESP Turk -p:EUROSPORT,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -3915:00820000:32c8:013e:1:0 -TLC Poland -p:Globecast UK -0016:00820000:3200:013e:1:0 -MTV Polska. -p:MTV Networks Europe -1216:00820000:2b5c:013e:1:0 -RDPi Radio -p:Arqiva -2016:00820000:24b8:013e:1:0 -JSTV 2 -p:Harmonic -2916:00820000:1edc:0071:1:0 -Dla Abonentow -p:Cyfrowy Polsat S.A. -3316:00820000:0190:013e:1:0 -ESP HD Serbia -p:CYFRA + -3616:00820000:00c8:013e:1:0 -ESP2 German -p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604 -3916:00820000:32c8:013e:1:0 -KICC TV -p:Globecast UK -4216:00820000:3db8:013e:1:0 -The Green Channel -p:Harmonic -2017:00820000:24b8:013e:1:0 -WRN Russkij -p:GlobeCast -2917:00820000:1edc:0071:1:0 -Zlote Przeboje -p:Cyfrowy Polsat S.A. -3317:00820000:0190:013e:1:0 -ESP HD Greek -p:CYFRA + -3617:00820000:00c8:013e:1:0 -ESP2 Serbia -p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604 -4217:00820000:3db8:013e:1:0 -STARSAT -p:Telespazio -0018:00820000:3200:013e:1:0 -CC Family. -p:MTV Networks Europe -2018:00820000:24b8:013e:1:0 -WRN English -p:GlobeCast -2918:00820000:1edc:0071:1:0 -Travel -p:Cyfrowy Polsat S.A. -3318:00820000:0190:013e:1:0 -EUROSPORT HD PL -p:CYFRA + -3618:00820000:00c8:013e:1:0 -ESP Biava -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -0019:00820000:3200:013e:1:0 -VIVA Polska. -p:MTV Networks Europe -2019:00820000:24b8:013e:1:0 -WRN Deutsch -p:GlobeCast -2919:00820000:1edc:0071:1:0 -Superstacja -p:Cyfrowy Polsat S.A. -3319:00820000:0190:013e:1:0 -EUROSPORT HD -p:CYFRA + -3619:00820000:00c8:013e:1:0 -France 24 (en Francais) -p:Eutelsat -4219:00820000:3db8:013e:1:0 -CANALE D ASTE -p:Harmonic -011a:0082afc2:0065:0001:1:0 -Sawa Levant Radio 282 -p: -0e1a:00820000:16a8:fbff:1:0 -Marcopolo -p:SkyItalia -141a:00820000:05dc:013e:1:0 -11488H SID 0x141a -p:DVB-S QPSK 11488H 13.0°E -201a:00820000:24b8:013e:1:0 -WRN Francais -p:GlobeCast -331a:00820000:0190:013e:1:0 -EUROSPORT HD -p:CYFRA + -361a:00820000:00c8:013e:1:0 -France 24 (in English) -p:Eutelsat -011b:0082afc2:0065:0001:1:0 -Sawa Iraq Radio 283 -p: -0e1b:00820000:0708:00c8:1:0 -Jewels Sorg3 -p:M-Three satcom -0e1b:00820000:16a8:fbff:1:0 -Alice -p:SkyItalia -121b:00820000:2b5c:013e:1:0 -Radio A1 -p:Harmonic -451b:00820000:0258:013e:1:0 -Il Sole -p:Arqiva -071c:0082accf:0578:013e:1:0 -LA NUOVA TV -p:Harmonic -0e1c:00820000:0708:00c8:1:0 -Jewels Sorg2 -p:M-Three satcom -0e1c:00820000:16a8:fbff:1:0 -Leonardo -p:SkyItalia -1d1c:00820000:2fa8:013e:1:0 -ANB -p:Globecast UK -201c:00820000:24b8:013e:1:0 -RCI 3 -p:GlobeCast -231c:00820000:00c8:013e:1:0 -Antenna 3 Nordest -p:LINK -3c1c:00820000:0064:fbff:1:0 -Matchmusic -p:SkyItalia -0c1d:00820000:1e78:0071:1:0 -Polsat Sport HD -p:Cyfrowy Polsat S.A. -0e1d:00820000:0708:00c8:1:0 -Jewels Sorg1 -p:M-Three satcom -201d:00820000:24b8:013e:1:0 -Family Europe -p:GlobeCast -251d:00820000:13ef:013e:1:0 -Dubai TV -p:Du -331d:00820000:0190:013e:1:0 -ESP HD test D -p:CYFRA + -001e:00820000:3200:013e:1:0 -Comedy Central Polska. -p:MTV Networks Europe -001e:0082accf:0578:013e:1:0 -Nick Jr. -p:Harmonic -0c1e:00820000:1e78:0071:1:0 -Polsat Sport HD -p:Cyfrowy Polsat S.A. -0e1e:00820000:0708:00c8:1:0 -LA7 -p:TIMB -201e:00820000:24b8:013e:1:0 -RCI 2 -p:Harmonic -251e:00820000:13ef:013e:1:0 -Dubai Sports 3 -p:Du -341e:00820000:2710:fbff:1:0 -Primafila 27 -p:SkyItalia -001f:0082accf:0578:013e:1:0 -Nickelodeon HD -p:Harmonic -0c1f:00820000:1e78:0071:1:0 -FoxLife HD -p:Cyfrowy Polsat S.A. -0e1f:00820000:0708:00c8:1:0 -NOELLO SAT -p:M-Three satcom -201f:00820000:24b8:013e:1:0 -RCI 1 -p:GlobeCast -251f:00820000:13ef:013e:1:0 -Sama Dubai -p:Du -0e20:00820000:0708:00c8:1:0 -Telelombardia -p:M-Three satcom,C:0919,C:093b,C:09cd -1d20:00820000:2fa8:013e:1:0 -Al Hiwar -p:Globecast UK -0321:00820000:3bc4:013e:1:0 -TBN Europe -p:OVERON -0c21:00820000:1e78:0071:1:0 -HBO HD -p:Cyfrowy Polsat S.A. -1d21:00820000:2fa8:013e:1:0 -CN/TCM -p:Globecast UK -2021:00820000:24b8:013e:1:0 -IBC TAMIL RADIO -p:GlobeCast -3421:00820000:2710:fbff:1:0 -Primafila 23 -p:SkyItalia -0122:0082afc2:0065:0001:1:0 -Yamal 290 -p: -0322:00820000:3bc4:013e:1:0 -TBNEspain -p:GCE -0c22:00820000:1e78:0071:1:0 -TVP 2 HD -p:Cyfrowy Polsat S.A -0e22:00820000:0708:00c8:1:0 -Trentino TV -p:M-Three satcom -1c22:00820000:1c20:013e:1:0 -Tunisie Nationale -p:AH-EDP -3422:00820000:2710:fbff:1:0 -Primafila 25 -p:SkyItalia -4222:00820000:3db8:013e:1:0 -BLU 2 -p:Telespazio -0123:0082afc2:0065:0001:1:0 -Sawa Gulf Radio 291 -p: -0323:00820000:3bc4:013e:1:0 -TBN ITALIA -p:OVERON -0c23:00820000:1e78:0071:1:0 -Polsat HD -p:Cyfrowy Polsat S.A. -0e23:00820000:0708:00c8:1:0 -LA7ondemand -p:TIMB -1123:00820000:1644:fbff:1:0 -Sky TG24 -p:SkyItalia -1d23:00820000:2fa8:013e:1:0 -DMC TV -p:Globecast UK -2023:00820000:24b8:013e:1:0 -Service 8227 -p:GlobeCast -2923:00820000:1edc:0071:1:0 -Radio ZET -p:Cyfrowy Polsat S.A. -3423:00820000:2710:fbff:1:0 -Primafila 26 -p:SkyItalia -4223:00820000:3db8:013e:1:0 -REDLIGHT PROMO -p:Telespazio -0124:0082afc2:0065:0001:1:0 -Sawa N. Africa Radio 292 -p: -0324:00820000:3bc4:013e:1:0 -Church Channel -p:GCE -0c24:00820000:1e78:0071:1:0 -Polsat Sport Extra HD -p:Cyfrowy Polsat S.A. -1d24:00820000:2fa8:013e:1:0 -Miracle TV -p:Globecast UK -2024:00820000:24b8:013e:1:0 -The Voice -p:GlobeCast -2524:00820000:13ef:013e:1:0 -PMC -p:Du -2924:00820000:1edc:0071:1:0 -RMF Classic -p:Cyfrowy Polsat S.A. -2c24:00820000:251c:fbff:1:0 -Cinema 1 HD -p:SkyItalia -4224:00820000:3db8:013e:1:0 -Redlight 3D-HD -p:Telespazio -0325:00820000:3bc4:013e:1:0 -JCTV -p:TandbergTV -0c25:00820000:1e78:0071:1:0 -AXN HD -p:Cyfrowy Polsat SA -0e25:00820000:0708:00c8:1:0 -QVC -p:M-Three satcom -2025:00820000:24b8:013e:1:0 -Radio Jahani -p:GlobeCast -2c25:00820000:251c:fbff:1:0 -Sky Calcio 3 HD -p:SkyItalia -4225:00820000:3db8:013e:1:0 -HUSTLER HD-3D -p:Telespazio -0126:0082afc2:0065:0001:1:0 -VOA and RFA Asia 294 -p: -0326:00820000:3bc4:013e:1:0 -EL SHAFAA -p:OVERON -0726:0082accf:0578:013e:1:0 -LA9 -p:Harmonic -0c26:00820000:1e78:0071:1:0 -Cinemax 2 HD -p:Cyfrowy Polsat S.A. -0e26:00820000:0708:00c8:1:0 -DAS ERSTE -p:M-Three satcom -1d26:00820000:2fa8:013e:1:0 -iLike TV -p:Globecast UK -2026:00820000:24b8:013e:1:0 -WRN Special -p:GlobeCast -2526:00820000:13ef:013e:1:0 -Sharqiya -p:Du -2926:00820000:1edc:0071:1:0 -Test -p:Cyfrowy Polsat S.A. -2c26:00820000:251c:fbff:1:0 -Discovery HD -p:SkyItalia -0127:0082afc2:0065:0001:1:0 -VOA Radio 295 (HB89-92) -p: -0327:00820000:3bc4:013e:1:0 -TBN Russia -p:Overon -0c27:00820000:1e78:0071:1:0 -FOX HD -p:Cyfrowy Polsat S.A. -0e27:00820000:0708:00c8:1:0 -POLO TV -p:M-Three satcom -1327:00820000:33f4:013e:1:0 -Al Malakoot -p:Harmonic -1d27:00820000:2fa8:013e:1:0 -Al Forat -p:Globecast UK -2027:00820000:24b8:013e:1:0 -Thamizhamutham Radio -p:GlobeCast -2527:00820000:13ef:013e:1:0 -AL BAGHDADIA 2 -p:Du -2927:00820000:1edc:0071:1:0 -Trójka - PR -p:Cyfrowy Polsat S.A. -2c27:00820000:251c:fbff:1:0 -Sportitalia -p:SkyItalia -3427:00820000:2710:fbff:1:0 -Primafila 24 -p:SkyItalia -4227:00820000:3db8:013e:1:0 -Roma Sat -p:Harmonic -0028:00820000:25e4:02be:1:0 -JORDAN TV -p:ARABSAT -0128:0082afc2:0065:0001:1:0 -VOA and Sawa Radio 296 -p: -0328:00820000:3bc4:013e:1:0 -Smile of a Child -p:TandbergTV -0c28:00820000:1e78:0071:1:0 -Polsat Sport Extra HD -p:Cyfrowy Polsat S.A -0e28:00820000:0708:00c8:1:0 -PHYSIQUE TV -p:M-Three satcom -1328:00820000:33f4:013e:1:0 -Al Karma TV-ME -p:Telespazio -1d28:00820000:2fa8:013e:1:0 -Al Fady -p:Globecast UK -2928:00820000:1edc:0071:1:0 -Radio PIN 102FM -p:Cyfrowy Polsat S.A. -2c28:00820000:251c:fbff:1:0 -myDeejay -p:SkyItalia -3628:00820000:00c8:013e:1:0 -EUROSPORT2 PL -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -4228:00820000:3db8:013e:1:0 -Roma Sat -p:Harmonic -0029:00820000:25e4:02be:1:0 -ALMUSTAKILLA -p:ARABSAT -0129:0082afc2:0065:0001:1:0 -Sawa Sudan Radio 297 -p: -0329:00820000:3bc4:013e:1:0 -NEJAT TV -p:OVERON -0e29:00820000:0708:00c8:1:0 -HSE24 -p: -1329:00820000:33f4:013e:1:0 -Channel One Tv -p:Harmonic -2029:00820000:24b8:013e:1:0 -Family Int 1 -p:GlobeCast -2529:00820000:13ef:013e:1:0 -Al-Arabiya -p:Du -2929:00820000:1edc:0071:1:0 -Jedynka - PR -p:Cyfrowy Polsat S.A. -2c29:00820000:251c:fbff:1:0 -12616H SID 0x2c29 -p:DVB-S QPSK 12616H 13.0°E -3629:00820000:00c8:013e:1:0 -EUROSPORT PL -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -4229:00820000:3db8:013e:1:0 -Roma Sat -p:Harmonic -002a:00820000:25e4:02be:1:0 -SAUDI-QURAN -p:ARABSAT -0e2a:00820000:0708:00c8:1:0 -DeeJayTV -p:Rete A 1,C:09cd,C:0919,C:093b,C:183d -112a:00820000:1644:fbff:1:0 -11861H SID 0x112a -p:DVB-S QPSK 11861H 13.0°E -1d2a:00820000:2fa8:013e:1:0 -Disney Channel -p:Globecast UK -202a:00820000:24b8:013e:1:0 -Family Int 2 -p:GlobeCast -292a:00820000:1edc:0071:1:0 -RMF FM -p:Cyfrowy Polsat S.A. -2c2a:00820000:251c:fbff:1:0 -Sportitalia2 -p:SkyItalia -342a:00820000:2710:fbff:1:0 -Primafila 23 -p:SkyItalia -422a:00820000:3db8:013e:1:0 -Roma Sat -p:Harmonic -012b:0082afc2:0065:0001:1:0 -Sawa Lebanon Radio 299 -p: -1d2b:00820000:2fa8:013e:1:0 -Cartoon Network -p:Globecast UK -252b:00820000:13ef:013e:1:0 -MBC MAGHREB AL ARABIA -p:Du -2c2b:00820000:251c:fbff:1:0 -NationalGeo HD -p:SkyItalia -422b:00820000:3db8:013e:1:0 -Roma Sat -p:Telespazio -1d2c:00820000:2fa8:013e:1:0 -Turner Classic Movies -p:Globecast UK -2c2c:00820000:251c:fbff:1:0 -12616H SID 0x2c2c -p:DVB-S QPSK 12616H 13.0°E -342c:00820000:2710:fbff:1:0 -Playjam -p:SkyItalia -422c:00820000:3db8:013e:1:0 -Passione Pesca -p:Harmonic -012d:00820000:3e1c:013f:1:0 -TF1 HD -p:Eutelsat -012d:00820000:157c:013e:1:0 -R1 -p:NetMed -032d:00820000:3bc4:013e:1:0 -ChildRussia -p:Overon -1d2d:00820000:2fa8:013e:1:0 -Virgin Radio TV -p:Globecast UK -202d:00820000:24b8:013e:1:0 -WRN Events -p:GlobeCast -2c2d:00820000:251c:fbff:1:0 -Sky Supercalcio HD -p:SkyItalia -332d:00820000:3390:0071:1:0 -Polsat -p:Cyfrowy Polsat S.A. -012e:00820000:3e1c:013f:1:0 -France 2 HD -p:Eutelsat -012e:00820000:157c:013e:1:0 -R2 -p:NetMed -0e2e:00820000:16a8:fbff:1:0 -Alice -p:SkyItalia -132e:00820000:33f4:013e:1:0 -TELEPADREPIO -p:Telespazio -1d2e:00820000:2fa8:013e:1:0 -Sat 7 Pars -p:Globecast UK -2c2e:00820000:251c:fbff:1:0 -Baby TV -p:SkyItalia -332e:00820000:3390:0071:1:0 -Polsat Play -p:Cyfrowy Polsat S.A. -012f:00820000:3e1c:013f:1:0 -France 3 -p:Eutelsat -012f:00820000:157c:013e:1:0 -R3 -p:NetMed -032f:00820000:3bc4:013e:1:0 -NOOR TV -p:Overon -0c2f:00820000:1e78:0071:1:0 -History HD -p:Cyfrowy Polsat S.A. -0e2f:00820000:16a8:fbff:1:0 -Leonardo -p:SkyItalia -1d2f:00820000:2fa8:013e:1:0 -Velayat TV -p:Globecast UK -252f:00820000:13ef:013e:1:0 -CH 33 -p:du -2c2f:00820000:251c:fbff:1:0 -Sky Calcio Info -p:SkyItalia -332f:00820000:3390:0071:1:0 -TV4 -p:Cyfrowy Polsat S.A. -0130:00820000:157c:013e:1:0 -R4 -p:NetMed -0730:0082accf:0578:013e:1:0 -TELENOVA -p:Harmonic -0c30:00820000:1e78:0071:1:0 -12264V SID 0xc30 -p:DVB-S2 8PSK 12264V 13.0°E -1330:00820000:33f4:013e:1:0 -TEF CHANNEL -p:Harmonic -1d30:00820000:2fa8:013e:1:0 -Karbala Satellite Channel -p:Globecast UK -2030:00820000:24b8:013e:1:0 -WRN Sawt Al Alam -p:GlobeCast -2c30:00820000:251c:fbff:1:0 -AXN HD -p:SkyItalia -3330:00820000:3390:0071:1:0 -Polsat Sport -p:Cyfrowy Polsat S.A. -0131:00820000:3e1c:013f:1:0 -France 5 -p:Eutelsat -0331:00820000:3bc4:013e:1:0 -ICC -p:Overon -0e31:00820000:16a8:fbff:1:0 -Marcopolo -p:SkyItalia -2031:00820000:24b8:013e:1:0 -Radio Al Mahabba -p:GlobeCast -2c31:00820000:251c:fbff:1:0 -DeAJunior -p:SkyItalia -3331:00820000:3390:0071:1:0 -Polsat Sport Extra -p:Cyfrowy Polsat S.A. -3431:00820000:2710:fbff:1:0 -Primafila 25 -p:SkyItalia -4231:00820000:3db8:013e:1:0 -PDF_TV -p:Harmonic -0132:00820000:3e1c:013f:1:0 -M6 HD -p:Eutelsat -0132:00820000:157c:013e:1:0 -R5 -p:NetMed -0332:00820000:3bc4:013e:1:0 -El Shadai TV (ETV) -p:RRSat -1132:00820000:2af8:013e:1:0 -Movies24 -p:CYFRA + -1d32:00820000:2fa8:013e:1:0 -Al Maaref -p:Globecast UK -2c32:00820000:251c:fbff:1:0 -Sky Calcio 2 HD -p:SkyItalia -3332:00820000:3390:0071:1:0 -Polsat Cafe -p:Cyfrowy Polsat S.A. -3432:00820000:2710:fbff:1:0 -Primafila 26 -p:SkyItalia -4232:00820000:3db8:013e:1:0 -Studio Europa -p:Harmonic -0133:00820000:3e1c:013f:1:0 -Arte HD -p:Eutelsat -0133:00820000:157c:013e:1:0 -R6 -p:NetMed -2c33:00820000:251c:fbff:1:0 -VideoItalia -p:SkyItalia -3333:00820000:3390:0071:1:0 -TV Biznes -p:Cyfrowy Polsat S.A. -3433:00820000:2710:fbff:1:0 -Primafila 27 -p:SkyItalia -0134:00820000:3e1c:013f:1:0 -Direct 8 -p:Eutelsat -0134:0082afc2:0065:0001:1:0 -Darfur/Egypt Mono 308 -p: -0134:00820000:157c:013e:1:0 -novasports1 Cy -p:NetMed -0834:00820000:3d54:013e:1:0 -ERTSAT Europe -p: -1134:00820000:2af8:013e:1:0 -4fun.TV -p:CYFRA + -1c34:00820000:1c20:013e:1:0 -Khabar TV -p:AH-EDP -2c34:00820000:251c:fbff:1:0 -Sky Sport 1 HD -p:SkyItalia -3334:00820000:3390:0071:1:0 -Test F -p:Cyfrowy Polsat S.A. -3a34:00820000:1fa4:013e:1:0 -Sport Klub -p:Eutelsat -0135:00820000:3e1c:013f:1:0 -W9 -p:Eutelsat -0135:0082afc2:0065:0001:1:0 -Yamal 309 -p: -0335:00820000:3bc4:013e:1:0 -Wesal TV -p:RRSat -1235:00820000:2b5c:013e:1:0 -Wedding TV -p:Arqiva -2935:00820000:1edc:0071:1:0 -RMF MAXXX -p:Cyfrowy Polsat S.A. -2c35:00820000:251c:fbff:1:0 -Eurosport HD -p:SkyItalia -3335:00820000:3390:0071:1:0 -Polsat News -p:Cyfrowy Polsat S.A. -3435:00820000:2710:fbff:1:0 -Primafila 24 -p:SkyItalia -3635:00820000:00c8:013e:1:0 -ESP2 NE Intl -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -3a35:00820000:1fa4:013e:1:0 -UNIVERSAL -p:EUTELSAT -4235:00820000:3db8:013e:1:0 -OITN -p:Harmonic -0136:00820000:3e1c:013f:1:0 -TMC -p:Eutelsat -0336:00820000:3bc4:013e:1:0 -FEED -p:RRSat -1136:00820000:2af8:013e:1:0 -PLANETE+ -p:CYFRA + -1c36:00820000:1c20:013e:1:0 -LIDER TV AZERBAIJAN -p:AH-EDP -2036:00820000:24b8:013e:1:0 -Voice of Russia -p:GlobeCast -2136:00820000:3070:013e:1:0 -Rai Movie -p:RAI -2c36:00820000:251c:fbff:1:0 -Comedy Central -p:SkyItalia -3336:00820000:3390:0071:1:0 -Polsat2 -p:Cyfrowy Polsat S.A. -3636:00820000:00c8:013e:1:0 -ESP2 NE Polish -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -3a36:00820000:1fa4:013e:1:0 -SCI FI -p:EUTELSAT -4236:00820000:3db8:013e:1:0 -20TV -p:Telespazio -0137:00820000:3e1c:013f:1:0 -NT1 -p:Eutelsat -1137:00820000:2af8:013e:1:0 -MINIMINI+ -p:CYFRA + -2c37:00820000:251c:fbff:1:0 -La7 -p:SkyItalia -3637:00820000:00c8:013e:1:0 -ESP2 NE Bulgarian -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -4237:00820000:3db8:013e:1:0 -TV Luna -p:Telespazio -0138:00820000:3e1c:013f:1:0 -NRJ12 -p:Eutelsat -1c38:00820000:1c20:013e:1:0 -CCTV4 -p:AH-EDP -2938:00820000:1edc:0071:1:0 -Disney Junior -p:Cyfrowy Polsat S.A -2c38:00820000:251c:fbff:1:0 -Nickelodeon -p:SkyItalia -3638:00820000:00c8:013e:1:0 -ESP2 NE Serbian -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -0139:00820000:3e1c:013f:1:0 -LCP -p:Eutelsat -0e39:00820000:16a8:fbff:1:0 -NationalGeo -p:SkyItalia -1139:00820000:2af8:013e:1:0 -HISTORY -p:CYFRA + -1339:00820000:33f4:013e:1:0 -GBR -p:Telespazio -2939:00820000:1edc:0071:1:0 -12284H SID 0x2939 -p:DVB-S QPSK 12284H 13.0°E -3639:00820000:00c8:013e:1:0 -ESP2 NE Czech -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -013a:00820000:3e1c:013f:1:0 -France 4 -p:Eutelsat -073a:0082accf:0578:013e:1:0 -VENETOLINK -p:Harmonic -113a:00820000:2af8:013e:1:0 -RODIN TV -p:CYFRA + -133a:00820000:33f4:013e:1:0 -Cancao Nova Interna -p:Harmonic -293a:00820000:1edc:0071:1:0 -12284H SID 0x293a -p:DVB-S QPSK 12284H 13.0°E -2c3a:00820000:251c:fbff:1:0 -Milan Channel -p:SkyItalia -363a:00820000:00c8:013e:1:0 -ESP2 NE Danish -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -113b:00820000:2af8:013e:1:0 -Water Planet -p:CYFRA + -133b:00820000:33f4:013e:1:0 -CTV AP -p:Harmonic -293b:00820000:1edc:0071:1:0 -12284H SID 0x293b -p:DVB-S QPSK 12284H 13.0°E -363b:00820000:00c8:013e:1:0 -ESP2 NE Russian -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -013c:00820000:157c:013e:1:0 -Disney XD -p:NetMed -073c:0082accf:0578:013e:1:0 -EOS NETWORK -p:Harmonic -133c:00820000:33f4:013e:1:0 -Al Anwar -p:Telespazio -293c:00820000:1edc:0071:1:0 -Dla Abonentow -p:Cyfrowy Polsat S.A. -2c3c:00820000:251c:fbff:1:0 -Primafila 1 HD -p:SkyItalia -363c:00820000:00c8:013e:1:0 -ESP2 NE Swedish -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -013d:00820000:157c:013e:1:0 -novacinema1 -p:NetMed -073d:0082accf:0578:013e:1:0 -BLU LIVE -p:Harmonic -113d:00820000:2af8:013e:1:0 -CANAL+ GOL -p:CYFRA + -133d:00820000:33f4:013e:1:0 -TRSP -p:Telespazio -293d:00820000:1edc:0071:1:0 -Dla Abonentow -p:Cyfrowy Polsat -2c3d:00820000:251c:fbff:1:0 -Fox HD -p:SkyItalia -363d:00820000:00c8:013e:1:0 -ESP ECH -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -013e:00820000:157c:013e:1:0 -novasports1 -p:NetMed -113e:00820000:2af8:013e:1:0 -CANAL+ WEEKEND -p:CYFRA + -123e:00820000:2b5c:013e:1:0 -Zagros -p:Arqiva -2c3e:00820000:251c:fbff:1:0 -Fox Crime HD -p:SkyItalia -363e:00820000:00c8:013e:1:0 -ESP2 NE UPC -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -3a3e:00820000:1fa4:013e:1:0 -Sport Klub POL -p:Eutelsat -013f:00820000:157c:013e:1:0 -MEGA -p:NetMed -073f:0082accf:0578:013e:1:0 -Italiamia -p:Harmonic -133f:00820000:33f4:013e:1:0 -Telemarket -p:Telespazio -213f:00820000:3070:013e:1:0 -Rai 1 -p:RAI -2c3f:00820000:251c:fbff:1:0 -Sky Calcio 6 HD -p:SkyItalia -363f:00820000:00c8:013e:1:0 -ESP2 NE Hungary -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -3a3f:00820000:1fa4:013e:1:0 -UNIVERSAL POL -p:EUTELSAT -0140:00820000:157c:013e:1:0 -ANT-1 -p:NetMed -0740:0082accf:0578:013e:1:0 -ARTE OGGI TV -p:Harmonic -1340:00820000:33f4:013e:1:0 -ERDE UND MENSCH -p:Telespazio -2140:00820000:3070:013e:1:0 -Rai 2 -p:RAI -2c40:00820000:251c:fbff:1:0 -Sky Calcio 7 HD -p:SkyItalia -3640:00820000:00c8:013e:1:0 -ESP2 NE Romania -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -3a40:00820000:1fa4:013e:1:0 -SCI FI POL -p:EUTELSAT -0141:00820000:157c:013e:1:0 -STAR -p:NetMed -0741:0082accf:0578:013e:1:0 -ASO SAT -p:Harmonic -1241:00820000:2b5c:013e:1:0 -RTB Virgilio -p:Arqiva -1341:00820000:33f4:013e:1:0 -ITALIA 8 -p:Harmonic -2141:00820000:3070:013e:1:0 -Rai 3 -p:RAI -2c41:00820000:251c:fbff:1:0 -Sky Calcio 8 HD -p:SkyItalia -3641:00820000:00c8:013e:1:0 -ESP UPC -p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861 -0142:00820000:157c:013e:1:0 -nova CLASSICS -p:NetMed -1242:00820000:2b5c:013e:1:0 -Ariana Afghanistan -p:Arqiva -1342:00820000:33f4:013e:1:0 -Kanal Hayat -p:Telespazio -2142:00820000:3070:013e:1:0 -Rai 4 -p:RAI -2c42:00820000:251c:fbff:1:0 -Sky Calcio 4 HD -p:SkyItalia -3342:00820000:3390:0071:1:0 -Polsat Play -p:Cyfrowy Polsat S.A. -3642:00820000:00c8:013e:1:0 -ESP2 NE Norwegian -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -0143:00820000:157c:013e:1:0 -novasports7 -p:NetMed -1243:00820000:2b5c:013e:1:0 -Andisheh TV -p:Arqiva -1343:00820000:33f4:013e:1:0 -Payam-E-Afghan -p:Telespazio -1f43:00820000:319c:013e:1:0 -RTL CH -p:MEDIA BROADCAST,C:0d02 -2c43:00820000:251c:fbff:1:0 -Sky Uno HD -p:SkyItalia -3643:00820000:00c8:013e:1:0 -ESP2 NE Dutch -p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861 -0144:00820000:157c:013e:1:0 -R13 -p:NetMed -0744:0082accf:0578:013e:1:0 -CIAO SKY 899 -p:Harmonic -1244:00820000:2b5c:013e:1:0 -AHL-E-BAIT TV -p:Arqiva -1f44:00820000:319c:013e:1:0 -RTL 2 CH -p:MEDIA BROADCAST -2144:00820000:3070:013e:1:0 -Rai News -p:RAI -2c44:00820000:251c:fbff:1:0 -Sky Calcio 5 HD -p:SkyItalia -0145:00820000:157c:013e:1:0 -ALPHA TV -p:NetMed -1245:00820000:2b5c:013e:1:0 -Hope Channel -p:Arqiva -1345:00820000:33f4:013e:1:0 -RTA -p:Harmonic -2c45:00820000:251c:fbff:1:0 -Cinema +1 HD -p:SkyItalia -0146:00820000:157c:013e:1:0 -novasports4 -p:NetMed -1246:00820000:2b5c:013e:1:0 -Didar Global TV -p:Arqiv -1346:00820000:33f4:013e:1:0 -Armenia TV -p:Telespazio -2c46:00820000:251c:fbff:1:0 -Cinema +24 HD -p:SkyItalia -3346:00820000:3390:0071:1:0 -Polsat Cafe -p:Cyfrowy Polsat S.A. -0147:00820000:157c:013e:1:0 -novasports4 Cy -p:NetMed -1147:00820000:2af8:013e:1:0 - CANAL+ GOL -p:CYFRA + -1347:00820000:33f4:013e:1:0 -ACM Channel -p:Telespazio -2c47:00820000:251c:fbff:1:0 -CinemaFamilyHD -p:SkyItalia -0148:00820000:157c:013e:1:0 -novasports7 Cy -p:NetMed -2c48:00820000:251c:fbff:1:0 -Cinema Classics HD -p:SkyItalia -0149:00820000:157c:013e:1:0 -novacinema1 Cy -p:NetMed -0749:0082accf:0578:013e:1:0 -DF -p:Satlink -1349:00820000:33f4:013e:1:0 -20 TV -p:Telespazio -2c49:00820000:251c:fbff:1:0 -Cinema Passion HD -p:SkyItalia -3349:00820000:3390:0071:1:0 -Polsat News -p:Cyfrowy Polsat S.A. -2c4a:00820000:251c:fbff:1:0 -Cinema Comedy HD -p:SkyItalia -0d4b:00820000:1450:013e:1:0 -Rai 3 TGR FVG -p:Rai -134b:00820000:33f4:013e:1:0 -Kentron Tv -p:Telespazio -144b:00820000:05dc:013e:1:0 - -p:CYFRA + -1f4b:00820000:319c:013e:1:0 -ZDF -p:MEDIA BROADCAST -2c4b:00820000:251c:fbff:1:0 -Cinema Max +1 HD -p:SkyItalia -0d4c:00820000:1450:013e:1:0 -RaiMed -p:RAI -134c:00820000:33f4:013e:1:0 -EUROSPORT 3D -p:Telespazio -2c4c:00820000:251c:fbff:1:0 -Primafila 5 HD -p:SkyItalia -364c:00820000:1fa4:013e:1:0 -Dorcel TV -p:Eutelsat -114d:00820000:2af8:013e:1:0 -HBO -p:CYFRA + -1d4d:00820000:2f44:013e:1:0 -Nickelodeon -p:NetMed -2c4d:00820000:251c:fbff:1:0 -Primafila 7 HD -p:SkyItalia -074e:0082accf:0578:013e:1:0 -CHAT SKY 903 -p:Harmonic -0d4e:00820000:1450:013e:1:0 -Rai Scuola -p:RAI -114e:00820000:2af8:013e:1:0 -13TH STREET -p:CYFRA + -1d4e:00820000:2f44:013e:1:0 -VH1 -p:NetMed -2c4e:00820000:251c:fbff:1:0 -Primafila 9 HD -p:SkyItalia -114f:00820000:2af8:013e:1:0 -HBO2 -p:CYFRA + -1d4f:00820000:2f44:013e:1:0 -MTV -p:NetMed -2c4f:00820000:251c:fbff:1:0 -Cinema Hits HD -p:SkyItalia -0d50:00820000:1450:013e:1:0 -Senato -p:RAI -1150:00820000:2af8:013e:1:0 -HBO COMEDY -p:CYFRA + -2c50:00820000:251c:fbff:1:0 -Primafila 11 HD -p:SkyItalia -3450:00820000:2710:fbff:1:0 -JimJam -p:SkyItalia -1151:00820000:2af8:013e:1:0 -10719V SID 0x1151 -p:DVB-S QPSK 10719V 13.0°E -1251:00820000:2b5c:013e:1:0 -Private Spice -p:Arqiva -1d51:00820000:2f44:013e:1:0 -Kontra Channel -p:NetMed -2c51:00820000:251c:fbff:1:0 -Primafila 13 HD -p:SkyItalia -2d51:00820000:170c:fbff:1:0 -Primafila 17 -p:SkyItalia -0d52:00820000:1450:013e:1:0 -Rai 5 -p:Rai -1d52:00820000:2f44:013e:1:0 -Animal Planet -p:NetMed -2c52:00820000:251c:fbff:1:0 -Sky Sport Extra HD -p:SkyItalia -3452:00820000:2710:fbff:1:0 -MAN-GA -p:SkyItalia -1153:00820000:2af8:013e:1:0 -ESP -p:CYFRA + -1d53:00820000:2f44:013e:1:0 -testServiceM3_1 -p:NetMed -2d53:00820000:170c:fbff:1:0 -Primafila 16 -p:SkyItalia -0154:0082afc2:0065:0001:1:0 -DOS TV 340 -p: -1d54:00820000:2f44:013e:1:0 -National Geographic -p:NetMed -1f54:00820000:319c:013e:1:0 -PMC -p:MEDIA BROADCAST -2d54:00820000:170c:fbff:1:0 -Primafila 18 -p:SkyItalia -0f55:00820000:2198:fbff:1:0 -12418V SID 0xf55 -p:DVB-S2 8PSK 12418V 13.0°E -1c55:00820000:1c20:013e:1:0 -SMtv San Marino -p:EUTELSAT -1d55:00820000:2f44:013e:1:0 -testServiceM3_2 -p:NetMed -1f55:00820000:319c:013e:1:0 -Persian Star 2 -p:MEDIA BROADCAST -2c55:00820000:251c:fbff:1:0 -Cinema Max HD -p:SkyItalia -2d55:00820000:170c:fbff:1:0 -Primafila 19 -p:SkyItalia -3d55:00820000:2c88:013e:1:0 -D. SCIENCE -p:CYFRA + -0f56:00820000:2198:fbff:1:0 -12418V SID 0xf56 -p:DVB-S2 8PSK 12418V 13.0°E -1c56:00820000:1c20:013e:1:0 -Canale Aste -p:M-Three satcom -1d56:00820000:2f44:013e:1:0 -A TEST -p:NetMed -2d56:00820000:170c:fbff:1:0 -Sky Calcio 8 -p:SkyItalia -3656:00820000:1fa4:013e:1:0 -Dorcel T.V. -p:Eutelsat -0f57:00820000:2198:fbff:1:0 -12418V SID 0xf57 -p:DVB-S2 8PSK 12418V 13.0°E -1d57:00820000:2f44:013e:1:0 -Private Spice -p:NetMed -2d57:00820000:170c:fbff:1:0 -Primafila 15 -p:SkyItalia -3d57:00820000:2c88:013e:1:0 -D. WORLD -p:CYFRA + -0758:0082accf:0578:013e:1:0 -CARPE DIEM -p:Harmonic -0f58:00820000:2198:fbff:1:0 -12418V SID 0xf58 -p:DVB-S2 8PSK 12418V 13.0°E -1c58:00820000:1c20:013e:1:0 -People TV-Rete 7 -p:People TV-Rete 7 -2d58:00820000:170c:fbff:1:0 -Sky Sport Extra -p:SkyItalia -3d58:00820000:2c88:013e:1:0 -TVP SPORT -p:CYFRA + -1c59:00820000:1c20:013e:1:0 -CNC-001 -p:Service Provider -1d59:00820000:2f44:013e:1:0 -Playboy TV -p:NetMed -1f59:00820000:319c:013e:1:0 -MI-TV -p:MEDIA BROADCAST -2d59:00820000:170c:fbff:1:0 -Eurosport -p:SkyItalia -3d59:00820000:2c88:013e:1:0 -TELE5 -p:CYFRA + -1c5a:00820000:1c20:013e:1:0 -BIKE SHOW TV -p:M-Three satcom -3d5a:00820000:2c88:013e:1:0 -POLONIA1 -p:CYFRA + -1c5b:00820000:1c20:013e:1:0 -Bahrain International -p:Bahrain TV -1f5b:00820000:319c:013e:1:0 -Al Beladi TV -p:MEDIA BROADCAST -2c5b:00820000:251c:fbff:1:0 -Primafila 3 HD -p:SkyItalia -3d5b:00820000:2c88:013e:1:0 -EDUSAT -p:CYFRA + -1c5c:00820000:1c20:013e:1:0 -GDG CHANNEL -p:LINK -3d5c:00820000:2c88:013e:1:0 -TVP SERIALE -p:CYFRA + -125d:00820000:3458:013e:1:0 -Pro TV International -p:RRSat -1c5d:00820000:1c20:013e:1:0 -3 CHANNEL -p:LINK -2b5d:00820000:19c8:fbff:1:0 -Cinema 1 -p:SkyItalia -2c5d:00820000:251c:fbff:1:0 -Sky Sport 3 HD -p:SkyItalia -2d5d:00820000:170c:fbff:1:0 -Sky Calcio 9 -p:SkyItalia -3d5d:00820000:2c88:013e:1:0 -KP MUZYKA -p:CYFRA + -125e:00820000:3458:013e:1:0 -AL FAYHAA -p:RRSat -1c5e:00820000:1c20:013e:1:0 -SUPERFLUO -p:LINK -1f5e:00820000:319c:013e:1:0 -Iran Beauty -p:MEDIA BROADCAST -2c5e:00820000:251c:fbff:1:0 -Eurosport 2 HD -p:SkyItalia -3d5e:00820000:2c88:013e:1:0 -NATIONAL GEO -p:CYFRA + -015f:00820000:1c84:013e:1:0 -Discovery Channel -p:NetMed -025f:00820000:3c8c:013e:1:0 -DW Europe -p:MEDIA BROADCAST -125f:00820000:3458:013e:1:0 -Mohabat -p:RRSat -1f5f:00820000:319c:013e:1:0 -Persian film 2 -p:MEDIA BROADCAST -2d5f:00820000:170c:fbff:1:0 -Sky Calcio 10 -p:SkyItalia -365f:00820000:1388:013e:1:0 -BBC Arabic -p:BBC World Service -3d5f:00820000:2c88:013e:1:0 -Orange Sport -p:CYFRA + -0160:00820000:1c84:013e:1:0 -R9 -p:NetMed -1260:00820000:3458:013e:1:0 -CGN -p:RRSat -1260:0082accf:0578:013e:1:0 -Tele A -p:Harmonic -1f60:00820000:319c:013e:1:0 -TV Persia one -p:MEDIA BROADCAST -3660:00820000:00c8:013e:1:0 -90 Numeri Sat -p:Eutelsat -3d60:00820000:2c88:013e:1:0 -Filmbox Extra -p:CYFRA + -0161:00820000:1c84:013e:1:0 -novasports2 -p:NetMed -1261:00820000:3458:013e:1:0 -Gali Kurdistan TV -p:RRSat -1c61:00820000:1c20:013e:1:0 -SUPER -p:LINK -2b61:00820000:19c8:fbff:1:0 -Cinema Family -p:SkyItalia -2d61:00820000:170c:fbff:1:0 -Sky Calcio 11 -p:SkyItalia -3b61:00820000:012c:013e:1:0 -nPremium3 -p:ITI -3d61:00820000:2c88:013e:1:0 -Filmbox -p:CYFRA + -0162:00820000:1c84:013e:1:0 -novatest -p:NetMed -0262:00820000:3c8c:013e:1:0 -HB-FEED -p:MEDIA BROADCAST -0762:0082accf:0578:013e:1:0 -RETE ORO -p:Satlink -1262:00820000:3458:013e:1:0 -MTA International -p:RRSat -1c62:00820000:1c20:013e:1:0 -ONE -p:LINK -2462:00820000:23f0:013f:1:0 -Shabakeh7 -p:Telespazio -2d62:00820000:170c:fbff:1:0 -Sky Calcio 12 -p:SkyItalia -3b62:00820000:012c:013e:1:0 -TVP HD -p:ITI -3d62:00820000:2c88:013e:1:0 -Filmbox Family -p:CYFRA + -0163:00820000:1c84:013e:1:0 -novatest Cy -p:NetMed -0263:00820000:3c8c:013e:1:0 -Arab-Girls.TV -p:MEDIA BROADCAST -1163:00820000:2af8:013e:1:0 -PLANETE+ -p:CYFRA + -1263:00820000:3458:013e:1:0 -Dieu TV -p:RRSat -1c63:00820000:1c20:013e:1:0 -NEW ONE -p:LINK -1f63:00820000:319c:013e:1:0 -U -p:MEDIA BROADCAST -2b63:00820000:19c8:fbff:1:0 -Cinema +24 -p:SkyItalia -2d63:00820000:170c:fbff:1:0 -Sky Calcio 13 -p:SkyItalia -3b63:00820000:012c:013e:1:0 -Eurosport 2 HD -p:ITI -0064:0082afc2:0065:0001:1:0 -VOA TV 100 (HB49-52) -p: -0164:00820000:1c84:013e:1:0 -R15 -p:NetMed -0264:00820000:3c8c:013e:1:0 -4play games -p:MEDIA BROADCAST -1164:00820000:2af8:013e:1:0 -MINIMINI+ -p:CYFRA + -1264:00820000:3458:013e:1:0 -ATV International -p:RRSat -1c64:00820000:1c20:013e:1:0 -JUST ONE -p:LINK -1f64:00820000:319c:013e:1:0 -Iran Music -p:MEDIA BROADCAST -2064:00820000:24b8:013e:1:0 -Quadriga -p:GlobeCast -3b64:00820000:012c:013e:1:0 -nPremium -p:ITI -3d64:00820000:2c88:013e:1:0 -DISCOVERY -p:CYFRA + -0065:00820000:1e14:013e:1:0 -STS International -p:GlobeCast -0065:0082afc2:0065:0001:1:0 -VOA Radio 101 (HB51-52) -p: -0165:00820000:1c84:013e:1:0 -R10 -p:NetMed -0265:00820000:3c8c:013e:1:0 -arab-69.tv -p:MEDIA BROADCAST -1265:00820000:3458:013e:1:0 -IN TV -p:RRSat -1c65:00820000:1c20:013e:1:0 -FADAK TV -p:LINK -2b65:00820000:19c8:fbff:1:0 -Cinema Classics -p:SkyItalia -2d65:00820000:170c:fbff:1:0 -Primafila 1 -p:SkyItalia -3b65:00820000:012c:013e:1:0 -Nat Geo Wild HD -p:ITI -0066:0082afc2:0065:0001:1:0 -VOA Radio 102 (HB53-56) -p: -0166:00820000:1c84:013e:1:0 -R8 -p:NetMed -0266:00820000:3c8c:013e:1:0 -' ' Hot Arab Sex -p:MEDIA BROADCAST -0d66:00820000:1450:013e:1:0 -Rai yoyo -p:Rai -1266:00820000:3458:013e:1:0 -DIPRE TV -p:RRSat -1c66:00820000:1c20:013e:1:0 -DIRETTA TV -p:LINK -2b66:00820000:19c8:fbff:1:0 -cielo -p: -3b66:00820000:012c:013e:1:0 -Animal Planet HD -p:ITI -0067:00820000:1e14:013e:1:0 -Saudi Sport 2 -p:GlobeCast -0267:00820000:3c8c:013e:1:0 -121 Chat -p:MEDIA BROADCAST -1167:00820000:2af8:013e:1:0 -HBO -p:CYFRA + -1267:00820000:3458:013e:1:0 -FUEGO TV -p:RRSat -1c67:00820000:1c20:013e:1:0 -+ TV -p:LINK -1f67:00820000:319c:013e:1:0 -EBRU TV -p:MEDIA BROADCAST -3b67:00820000:012c:013e:1:0 -Cinemax HD -p:ITI -0068:00820000:1e14:013e:1:0 -Al sumariah -p:GlobeCast -0168:00820000:1c84:013e:1:0 -Cartoon Network -p:NetMed -0268:00820000:3c8c:013e:1:0 -Arab-Jins -p:MEDIA BROADCAST -0668:0082accf:0578:013e:1:0 -BLU SHOP -p:Harmonic -1168:00820000:2af8:013e:1:0 -HBO2 -p:CYFRA + -1268:00820000:3458:013e:1:0 -PUNTO SAT -p:RRSat -1c68:00820000:1c20:013e:1:0 -SKY 918 -p:LINK -2468:00820000:23f0:013f:1:0 -Saamen TV -p:Telespazio -2c68:00820000:251c:fbff:1:0 -Sky Sport 2 HD -p:SkyItalia -3b68:00820000:012c:013e:1:0 -WiP - Sundance HD -p:iTi -0069:00820000:1e14:013e:1:0 -MEZZO -p:Globecast,C:0500,C:0100,C:1813,C:0604 -0169:00820000:1c84:013e:1:0 -MACEDONIA TV -p:NetMed -0269:00820000:3c8c:013e:1:0 -Love TV -p:MEDIA BROADCAST -0669:0082accf:0578:013e:1:0 -LA 8 -p:Satlink -1169:00820000:2af8:013e:1:0 -HBO COMEDY -p:CYFRA + -1269:00820000:3458:013e:1:0 -TIVU TIVU -p:RRSat -1c69:00820000:1c20:013e:1:0 -SKY 942 -p:LINK -2469:00820000:23f0:013f:1:0 -THAQALLYN TV -p:Telespazio -4269:00820000:2bc0:013e:1:0 -VOD 51 -p:Cyfrowy Polsat S.A. -006a:00820000:1e14:013e:1:0 -Samacom Test -p:GlobeCast -016a:00820000:1c84:013e:1:0 -SKAI TV -p:NetMed -026a:00820000:3c8c:013e:1:0 -Lebnaniat TV. -p:MEDIA BROADCAST -066a:0082accf:0578:013e:1:0 -TV7 LOMBARDIA -p:Harmonic -126a:00820000:3458:013e:1:0 -DIPRE TV 2 -p:RRSat -1c6a:00820000:1c20:013e:1:0 -SKY 843 -p:LINK -296a:00820000:3d54:013e:1:0 -LIVE CHANNEL -p:BSS -2b6a:00820000:19c8:fbff:1:0 -Disney Ch. +2 -p:SkyItalia -2c6a:00820000:251c:fbff:1:0 -MTV LIVE HD -p:SkyItalia -366a:00820000:00c8:013e:1:0 -Bergamosat -p:Eutelsat -426a:00820000:2bc0:013e:1:0 -VOD 52 -p:Cyfrowy Polsat S.A. -016b:00820000:1c84:013e:1:0 -ET-3 -p:NetMed -026b:00820000:3c8c:013e:1:0 -Arab XXX -p:MEDIA BROADCAST -126b:00820000:3458:013e:1:0 -SonLife Broadcasting Network -p:RRSat -1c6b:00820000:1c20:013e:1:0 -BBC PERSIAN -p:BBC -246b:00820000:23f0:013f:1:0 -HODHOD Arabic -p:Telespazio -296b:00820000:3d54:013e:1:0 -KOMALA TV -p:BSS -2b6b:00820000:19c8:fbff:1:0 -Cinema Max -p:SkyItalia -2c6b:00820000:251c:fbff:1:0 -ExtremeSportsHD -p:SkyItalia -426b:00820000:2bc0:013e:1:0 -VOD 53 -p:Cyfrowy Polsat S.A. -006c:0082afc2:0065:0001:1:0 -VOA Radio 108 (HB65-68) -p: -026c:00820000:3c8c:013e:1:0 -AlTeb Alnabawy -p:MEDIA BROADCAST -076c:0082accf:0578:013e:1:0 -LUNA SAT SKY 888 -p:Harmonic -1f6c:00820000:319c:013e:1:0 -4 -p:MEDIA BROADCAST -296c:00820000:3d54:013e:1:0 -ZEE TV -p:BSS -2c6c:00820000:251c:fbff:1:0 -Fox Life HD -p:SkyItalia -426c:00820000:2bc0:013e:1:0 -VOD 54 -p:Cyfrowy Polsat S.A. -006d:0082afc2:0065:0001:1:0 -VOA Radio 109 (HB67-68) -p: -026d:00820000:3c8c:013e:1:0 -India Girls -p:MEDIA BROADCAST -126d:00820000:3458:013e:1:0 -MOONLIGHT TV -p:RRSat -206d:00820000:2328:013e:1:0 -HRT-TV1 -p:OIV Zagreb -296d:00820000:3d54:013e:1:0 -ZEE CINEMA -p:BSS -2c6d:00820000:251c:fbff:1:0 -Real Time HD -p:SkyItalia -426d:00820000:2bc0:013e:1:0 -VOD 55 -p:Cyfrowy Polsat S.A. -006e:0082afc2:0065:0001:1:0 -VOA Radio 110 (HB69-72) -p: -026e:00820000:3c8c:013e:1:0 -+18 Love Girls -p:MEDIA BROADCAST -126e:00820000:3458:013e:1:0 -METRO SAT -p:RRSat -206e:00820000:2328:013e:1:0 -HRT-TV2 -p:OIV Zagreb -296e:00820000:3d54:013e:1:0 -ITN -p:BSS -2b6e:00820000:19c8:fbff:1:0 -Disney Channel -p:SkyItalia -2c6e:00820000:251c:fbff:1:0 -ESPN America HD -p:SkyItalia -426e:00820000:2bc0:013e:1:0 -VOD 56 -p:Cyfrowy Polsat S.A. -446e:00820000:3264:013e:1:0 -EUROSPORT 2 -p:Globecast -006f:0082afc2:0065:0001:1:0 -VOA Radio 111 (HB71-72) -p: -016f:00820000:1c84:013e:1:0 -R7 -p:NetMed -026f:00820000:3c8c:013e:1:0 -Sexy love girls -p:MEDIA BROADCAST -126f:00820000:3458:013e:1:0 -TIVU TIVU 2 -p:RRSat -206f:00820000:2328:013e:1:0 -HRT PLUS -p:OIV Zagreb -296f:00820000:3d54:013e:1:0 -AAA Music -p:BSS -2c6f:00820000:251c:fbff:1:0 -Discovery Sci HD -p:SkyItalia -426f:00820000:2bc0:013e:1:0 -VOD 57 -p:Cyfrowy Polsat S.A. -446f:00820000:3264:013e:1:0 -TV BREIZH -p:Globecast -0070:00820000:1e14:013e:1:0 -Saudi Arabian TV2 -p:GlobeCast -0170:00820000:1c84:013e:1:0 -ServiceTest1 -p:NetMed -0270:00820000:3c8c:013e:1:0 -.arab babes -p:MEDIA BROADCAST -1270:00820000:3458:013e:1:0 -EURSAT -p:RRSat -2970:00820000:3d54:013e:1:0 -Zee Russia -p:BSS -2b70:00820000:19c8:fbff:1:0 -Sky Uno +1 -p:SkyItalia -2c70:00820000:251c:fbff:1:0 -DiscoveryT&L HD -p:SkyItalia -4270:00820000:2bc0:013e:1:0 -VOD 58 -p:Cyfrowy Polsat S.A. -4470:00820000:3264:013e:1:0 -USHUAIA -p:Globecast -0171:00820000:1c84:013e:1:0 -serviceTest2 -p:NetMed -0271:00820000:3c8c:013e:1:0 -Kosmica TV -p:MEDIA BROADCAST -1271:00820000:3458:013e:1:0 -Eurotic TV -p:RRSat -1f71:00820000:319c:013e:1:0 -IRAN.PSTV -p:MEDIA BROADCAST -2b71:00820000:19c8:fbff:1:0 -Discovery -p:SkyItalia -2c71:00820000:251c:fbff:1:0 -History HD -p:SkyItalia -4271:00820000:2bc0:013e:1:0 -VOD 59 -p:Cyfrowy Polsat S.A. -4471:00820000:3264:013e:1:0 -PARIS PREMIERE -p:Globecast -0172:00820000:1c84:013e:1:0 -Mad Music Hits GR Cy -p:NetMed -1272:00820000:3458:013e:1:0 -Belarus TV -p:RRSat -2c72:00820000:251c:fbff:1:0 -NatGeo Wild HD -p:SkyItalia -4272:00820000:2bc0:013e:1:0 -VOD 60 -p:Cyfrowy Polsat S.A. -0073:00820000:1e14:013e:1:0 -AL BAGHDADIA -p:GlobeCast -0173:00820000:1c84:013e:1:0 -nova Mad Music My Rock Cy -p:NetMed -1273:0082accf:0578:013e:1:0 -Gioielli Per Tutti -p:Harmonic -2b73:00820000:19c8:fbff:1:0 -Cinema Passion -p:SkyItalia -2c73:00820000:251c:fbff:1:0 -NatGeo Adv HD -p:SkyItalia -4273:00820000:2bc0:013e:1:0 -VOD 61 -p:Cyfrowy Polsat S.A. -0074:00820000:1e14:013e:1:0 -JSC Sports News -p:GlobeCast,C:0500,C:0603 -0174:00820000:1c84:013e:1:0 -nova Mad Music Greek Cy -p:NetMed -0274:00820000:3c8c:013e:1:0 -ELITE SHOPPING -p:MEDIA BROADCAST -1274:0082accf:0578:013e:1:0 -Napoli Mia -p:Harmonic -2c74:00820000:251c:fbff:1:0 -GamberoRossoHD -p:SkyItalia -3674:00820000:00c8:013e:1:0 -A3 -p:Eutelsat -4274:00820000:2bc0:013e:1:0 -VOD 62 -p:Cyfrowy Polsat S.A. -0075:00820000:1e14:013e:1:0 -HOT TV -p:GlobeCast -0175:00820000:1c84:013e:1:0 -Mad Music Rebetico Cy -p:NetMed -2c75:00820000:251c:fbff:1:0 -Disney Ch. HD -p:SkyItalia -4275:00820000:2bc0:013e:1:0 -VOD 63 -p:Cyfrowy Polsat S.A. -0076:00820000:1e14:013e:1:0 -GEM Movie -p:GlobeCast -0176:00820000:1c84:013e:1:0 -nova Mad Music Seasonal Cy -p:NetMed -1276:00820000:3458:013e:1:0 -Movie1 -p:RRSat -4276:00820000:2bc0:013e:1:0 -VOD 64 -p:Cyfrowy Polsat S.A. -4277:00820000:2bc0:013e:1:0 -VOD 65 -p:Cyfrowy Polsat S.A. -0178:00820000:1c84:013e:1:0 -NEÔ -p:NetMed -0179:00820000:1c84:013e:1:0 -MAD T.V -p:NetMed -0579:00820000:0320:fbff:1:0 -In evidenza -p:SkyItalia -1d79:00820000:2f44:013e:1:0 -Playboy TV Cy -p:NetMed -3779:00820000:044c:013e:1:0 -CANAL+ FILM HD -p:CYFRA+ -017a:00820000:1c84:013e:1:0 -ET-1 -p:NetMed -1d7a:00820000:2f44:013e:1:0 -Private Spice Cy -p:NetMed -447a:00820000:3264:013e:1:0 -DISNEY HD -p:Globecast -447b:00820000:3264:013e:1:0 -EUROSPORT HD -p:Globecast -017c:00820000:1c84:013e:1:0 -MAD TV -p:NetMed -067c:0082accf:0578:013e:1:0 -LAZIO CHANNEL -p:Harmonic -117c:00820000:2af8:013e:1:0 -DTV CABLE PL -p:CYFRA + -127c:0082accf:0578:013e:1:0 -Kurd Channel -p:Harmonic -297c:00820000:3d54:013e:1:0 -KALEMEH FARSI -p:BSS -2b7c:00820000:19c8:fbff:1:0 -Disney Junior -p:SkyItalia -427c:00820000:2bc0:013e:1:0 -VOD 50 -p:Cyfrowy Polsat S.A. -017d:00820000:1c84:013e:1:0 -R14 -p:NetMed -027d:00820000:3c8c:013e:1:0 -TVRUS -p:MEDIA BROADCAST -117d:00820000:2af8:013e:1:0 -DTV CABLE MI -p:CYFRA + -427d:00820000:2bc0:013e:1:0 -xxxVOD1 -p:Cyfrowy Polsat S.A. -007e:00820000:1e14:013e:1:0 -JSC Sports Global -p:GlobeCast -027e:00820000:3c8c:013e:1:0 -Juwelo -p:MEDIA BROADCAST -1c7e:00820000:206c:fbff:1:0 -Test T -p:SkyItalia -1d7e:00820000:2f44:013e:1:0 -OTV Test -p:NetMed -2c7e:00820000:251c:fbff:1:0 -MTV Hits -p:SkyItalia -367e:00820000:00c8:013e:1:0 -Canal Algerie -p:Eutelsat -427e:00820000:2bc0:013e:1:0 -xxxVOD2 -p:Cyfrowy Polsat S.A. -017f:00820000:1c84:013e:1:0 -novasports2 Cy -p:NetMed -027f:00820000:3c8c:013e:1:0 -Persian TV MARKET -p:MEDIA BROADCAST -1d7f:00820000:2f44:013e:1:0 -OTV PVR -p:NetMed -0180:00820000:1c84:013e:1:0 -ÂïõëÞ -p:NetMed -0c81:00820000:2328:013e:1:0 -SLO-TV1 -p:OIV Zagreb -1181:00820000:2af8:013e:1:0 -TV 4 -p:CYFRA + -2481:00820000:23f0:013f:1:0 -HADI TV1 -p:Harmonic -2981:00820000:3d54:013e:1:0 -Al Magharibia -p:BSS -0182:00820000:1c84:013e:1:0 -MAD MUSIC Hits GR -p:NetMed -0282:00820000:3c8c:013e:1:0 -IRAN-MNTV -p:MEDIA BROADCAST -0582:00820000:0320:fbff:1:0 -Discovery Travel -p:SkyItalia -0c82:00820000:2328:013e:1:0 -SLO-TV2 -p:OIV Zagreb -2482:00820000:23f0:013f:1:0 -HADI TV3 -p:Telespazio -2982:00820000:3d54:013e:1:0 -TV DISCO -p:BSS -2d82:00820000:170c:fbff:1:0 -Primafila 20 -p:SkyItalia -0183:00820000:1c84:013e:1:0 -nova MAD MUSIC My Rock -p:NetMed -0283:00820000:3c8c:013e:1:0 -IRAN-FMTV -p:MEDIA BROADCAST -0c83:00820000:2328:013e:1:0 -TV K-C -p:OIV Zagreb -2483:00820000:23f0:013f:1:0 -HADI TV4 -p:Telespazio -2983:00820000:3d54:013e:1:0 -!mwala3a 3lik -p:BSS -2c83:00820000:251c:fbff:1:0 -MTV -p:SkyItalia -0184:00820000:1c84:013e:1:0 -nova MAD MUSIC Greek -p:NetMed -2984:00820000:3d54:013e:1:0 -Anta 7iate -p:BSS -2c84:00820000:251c:fbff:1:0 -Sky Calcio 1 HD -p:SkyItalia -0185:00820000:1c84:013e:1:0 -MAD MUSIC Rebetico -p:NetMed -0385:00820000:2134:013e:1:0 -SF 1 -p:Schweizer Fernsehen -1c85:00820000:332c:013e:1:0 -MotorsTV -p:Arqiva -1c85:00820000:1ce8:0071:1:0 -Zone Romantica -p:Cyfrowy Polsat S.A. -2485:00820000:23f0:013f:1:0 -RU TV -p:Telespazio -2985:00820000:3d54:013e:1:0 -Iran Fun -p:BSS -2c85:00820000:251c:fbff:1:0 -MTV Rocks -p:SkyItalia -3785:00820000:044c:013e:1:0 -Water Planet -p:CYFRA+ -4485:00820000:3264:013e:1:0 -Supertennis HD -p:Globecast -0186:00820000:1c84:013e:1:0 -nova MAD MUSIC Seasonal -p:NetMed -1c86:00820000:332c:013e:1:0 -Bloomberg European TV -p:Arqiva -1c86:00820000:1ce8:0071:1:0 -AXN Crime -p:Cyfrowy Polsat S.A. -1f86:00820000:319c:013e:1:0 -bwtv -p:MEDIA BROADCAST,C:0e00 -2986:00820000:3d54:013e:1:0 -Music Box Russia -p:BSS -3786:00820000:044c:013e:1:0 -Novela TV -p:CYFRA+ -0c87:00820000:2328:013e:1:0 -SLO-TV3 -p:OIV Zagreb -1c87:00820000:1ce8:0071:1:0 -AXN Sci-Fi -p:Cyfrowy Polsat S.A. -2487:00820000:23f0:013f:1:0 -Orient Tv -p:Telespazio -2987:00820000:3d54:013e:1:0 -The Word Network -p:BSS -1288:00820000:3458:013e:1:0 -LAS TELEVENTA -p:RRSat -1c88:00820000:1ce8:0071:1:0 -Fightbox -p:Cyfrowy Polsat S.A. -1d88:00820000:2f44:013e:1:0 -testServiceM3_3 -p:NetMed -2488:00820000:23f0:013f:1:0 -BARAEM -p:Telespazio -2988:00820000:3d54:013e:1:0 -GOD TV -p:BSS -1289:00820000:3458:013e:1:0 -HERCULES -p:RRSat -1c89:00820000:332c:013e:1:0 -MOTO TV -p:Arqiva -1c89:00820000:1ce8:0071:1:0 -Extreme Sports -p:Cyfrowy Polsat S.A. -128a:00820000:3458:013e:1:0 -NEW GENERATION TV -p:RRSat -298a:00820000:3d54:013e:1:0 -nar elhob -p:BSS -028b:00820000:3c8c:013e:1:0 -Chinese Radio International -p:MEDIA BROADCAST -038b:00820000:2134:013e:1:0 -SF zwei -p:Schweizer Fernsehen -128b:00820000:3458:013e:1:0 -Kurd Channel -p:RRSat -1c8b:00820000:1ce8:0071:1:0 -Nat Geo Wild -p:Cyfrowy Polsat S.A -298b:00820000:3d54:013e:1:0 -WNS -p:BSS -2c8b:00820000:2580:fbff:1:0 -Disney Ch. +1 -p:SkyItalia -128c:00820000:3458:013e:1:0 -My Tivi -p:RRSat -1c8c:00820000:1ce8:0071:1:0 -DISCOVERY -p: -298c:00820000:3d54:013e:1:0 -lo3b whob -p:BSS -128d:00820000:3458:013e:1:0 -Kliksat.Farhad -p:RRSat -2c8d:00820000:2580:fbff:1:0 -Disney XD +2 -p:SkyItalia -3c8d:00820000:1bbc:013e:1:0 -novacinema HD Cy -p:Netmed -128e:00820000:3458:013e:1:0 -Altarek - The Way TV -p:RRSat -358e:00820000:1388:013e:1:0 -TVE Internacional -p:Telefonica Spain -3c8e:00820000:1bbc:013e:1:0 -Nat Geo Wild HD -p:Netmed -038f:00820000:2134:013e:1:0 -SF info -p:Schweizer Fernsehen -1d8f:00820000:2f44:013e:1:0 -novacinema4 -p:NetMed -3c8f:00820000:1bbc:013e:1:0 -National Geographic HD -p:Netmed -0590:00820000:0320:fbff:1:0 -Nick Jr -p:SkyItalia -2490:00820000:23f0:013f:1:0 -HODHOD FARSI -p:Harmonic -2990:00820000:3d54:013e:1:0 -NAPOLI TLA -p:BSS -2c90:00820000:2580:fbff:1:0 -Animal Planet -p:SkyItalia -3590:00820000:1388:013e:1:0 -Canal 24 Horas -p:Telefonica Spain -3c90:00820000:1bbc:013e:1:0 -EPT HD -p:Netmed -2991:00820000:3d54:013e:1:0 -ART AscoRadioTv -p:BSS -2c91:00820000:2580:fbff:1:0 -Horror Channel -p:SkyItalia -3c91:00820000:1bbc:013e:1:0 -Discovery HD Showcase -p:Netmed -0592:00820000:0320:fbff:1:0 -ESPN Classic -p:SkyItalia -1292:00820000:3458:013e:1:0 -TVR -p:RRSat -2492:00820000:23f0:013f:1:0 -AL JAZEERA CHILDREN -p:Telespazio -2992:00820000:3d54:013e:1:0 -AB Channel -p:BSS -3c92:00820000:1bbc:013e:1:0 -nova 3D -p:Netmed -0593:00820000:0320:fbff:1:0 -MTV Classic -p:SkyItalia -1293:00820000:3458:013e:1:0 -Somaliland National TV -p:RRsat -1c93:00820000:1ce8:0071:1:0 -Discovery -p:Cyfrowy Polsat S.A. -1d93:00820000:2f44:013e:1:0 -EEPG -p:NetMed -2993:00820000:3d54:013e:1:0 -Betting Channel -p:BSS -3c93:00820000:1bbc:013e:1:0 -novasports HD Cy -p:Netmed -0294:00820000:3c8c:013e:1:0 -Persian Film -p:MEDIA BROADCAST -0594:00820000:0320:fbff:1:0 -MTV Music -p:SkyItalia -1294:00820000:3458:013e:1:0 -HCTV -p:RRsat -2994:00820000:3d54:013e:1:0 -Italiamia -p:BSS -3c94:00820000:1bbc:013e:1:0 -novasports HD -p:Netmed -0295:00820000:3c8c:013e:1:0 -IPN TV -p:MEDIA BROADCAST -0595:00820000:0320:fbff:1:0 -MTV Dance -p:SkyItalia -1295:00820000:3458:013e:1:0 -Somalisat -p:RRsat -1d95:00820000:2f44:013e:1:0 -NOVA SCOPE -p:NetMed -2995:00820000:3d54:013e:1:0 -SRI TV -p:BSS -2a95:00820000:1838:fbff:1:0 -Real Time -p:SkyItalia -3c95:00820000:1bbc:013e:1:0 -novacinema HD -p:NetMed -1c96:00820000:1ce8:0071:1:0 -AXN -p:Cyfrowy Polsat S.A. -2096:00820000:2328:013e:1:0 -RBC-TV -p:OIV Zagreb -2996:00820000:3d54:013e:1:0 -Liguria TV -p:BSS -3c96:00820000:1bbc:013e:1:0 -PDC_Service -p:Syned -1d97:00820000:2f44:013e:1:0 -Travel Channel -p:NetMed -2997:00820000:3d54:013e:1:0 -Hope Channel -p:BSS -3c97:00820000:1bbc:013e:1:0 -Pvod_Service_1 -p:Syned -1298:00820000:3458:013e:1:0 -Suryoyo Sat -p:RRSat -3a98:00820000:1fa4:013e:1:0 -Romauno -p:Eutelsat -3c98:00820000:1bbc:013e:1:0 -nova 3D Cy -p:NETMED -0599:00820000:0320:fbff:1:0 -Class CNBC -p:SkyItalia -1299:00820000:3458:013e:1:0 -FREE XTV -p:RRSat -1c99:00820000:332c:013e:1:0 -TV5MONDE FBS -p:Arqiva -1d99:00820000:2f44:013e:1:0 -nova MAD GREEKZ -p:NetMed -019a:00820000:1964:013e:1:0 -ALHAQIQA -p:ART -019a:00820000:3264:013e:1:0 -beIN Sport1 -p:Globecast -129a:00820000:3458:013e:1:0 -French Lover -p:RRSat -1c9a:00820000:332c:013e:1:0 -TV5MONDE EUROPE -p:Arqiva -1d9a:00820000:2f44:013e:1:0 -novacinema4 Cy -p:NetMed -019b:00820000:3264:013e:1:0 -beIN Sport2 -p:Harmonic -1c9c:00820000:332c:013e:1:0 -Crime and Investigation -p:Arqiva -059d:00820000:0320:fbff:1:0 -Onda Latina -p:SkyItalia -1c9d:00820000:332c:013e:1:0 -Crime + Investigation -p:Arqiva -2c9d:00820000:2580:fbff:1:0 -Super! -p:SkyItalia -439d:00820000:2cec:013e:1:0 -BABY TV -p:RRSat -1c9e:00820000:332c:013e:1:0 -Kurdistan TV -p:Arqiva -439e:00820000:2cec:013e:1:0 -3ABN International -p:RRSat -019f:00820000:26ac:013f:1:0 -BFM TV -p:Eutelsat -059f:00820000:0320:fbff:1:0 -Lady Channel -p:SkyItalia -1c9f:00820000:332c:013e:1:0 -NHK World -p:Arqiva -439f:00820000:2cec:013e:1:0 -BVN -p:RRSat -43a0:00820000:2cec:013e:1:0 -CNL -p:RRSat -00a1:00820000:1e14:013e:1:0 -Al Rasheed TV -p:GlobeCast -01a1:00820000:26ac:013f:1:0 -Direct Star -p:Eutelsat -43a1:00820000:2cec:013e:1:0 -Soyuz TV -p:RRSat -01a2:00820000:26ac:013f:1:0 -Gulli -p:Eutelsat -43a2:00820000:2cec:013e:1:0 -Nash TV -p:RRSat -01a3:00820000:26ac:013f:1:0 -France O -p:Eutelsat -05a3:00820000:0320:fbff:1:0 -AXN -p:SkyItalia -43a3:00820000:2cec:013e:1:0 -Fashion TV -p:RRSat -20a4:00820000:3d54:013e:1:0 -DMTV -p:OIV Zagreb -29a4:00820000:3d54:013e:1:0 -Finest TV -p:BSS -00a5:00820000:1e14:013e:1:0 -KANAL 4 -p:GlobeCast -06a5:00820000:3138:013e:1:0 -TV CORAN -p:GlobeCast -1ca5:00820000:332c:013e:1:0 -GEM TV -p:Arqiva -20a5:00820000:3d54:013e:1:0 -PASSIONE PESCA -p:OiV -29a5:00820000:3d54:013e:1:0 -RVS Italy -p:BSS -06a6:00820000:3138:013e:1:0 -TV TAMAZIGHT -p:GlobeCast -1fa6:00820000:189c:fbff:1:0 -Gambero Rosso -p:SkyItalia -43a6:00820000:2cec:013e:1:0 -KURDsat -p:RRSat -06a7:00820000:3138:013e:1:0 -Jewish News One -p:GlobeCast -1fa7:00820000:189c:fbff:1:0 -Fox News -p:SkyItalia -29a7:00820000:3d54:013e:1:0 -Venere Tv -p:BSS -43a7:00820000:2cec:013e:1:0 -MKTV sat -p:RRSat -06a8:00820000:3138:013e:1:0 -Shanson TV -p:GlobeCast -1fa8:00820000:189c:fbff:1:0 -MGM -p:SkyItalia -29a8:00820000:3d54:013e:1:0 -Swiss Venere Tv -p:BSS -2aa8:00820000:1838:fbff:1:0 -Sky Sport 1 -p:SkyItalia -43a8:00820000:2cec:013e:1:0 -Thai Global Network -p:RRSat -06a9:00820000:3138:013e:1:0 -2M Maroc -p:GlobeCast -29a9:00820000:3d54:013e:1:0 -Venere Tv Espana -p:BSS -2aa9:00820000:1838:fbff:1:0 -Sky Sport 2 -p:SkyItalia -35a9:00820000:1388:013e:1:0 -TELESUR -p:Telefonica Spain -43a9:00820000:2cec:013e:1:0 -VTV4 -p:RRSat -06aa:00820000:3138:013e:1:0 -CCTV9 -p:GlobeCast -1faa:00820000:189c:fbff:1:0 -Roma Channel -p:SkyItalia -29aa:00820000:3d54:013e:1:0 -Venere Tv Romania -p:BSS -2aaa:00820000:1838:fbff:1:0 -Sky Supercalcio -p:SkyItalia -2daa:00820000:170c:fbff:1:0 -Primafila 20 -p:SkyItalia -43aa:00820000:2cec:013e:1:0 -Rojhelat -p:RRSat -06ab:00820000:3138:013e:1:0 -SHANT TV -p:GlobeCast -29ab:00820000:3d54:013e:1:0 -Classic Hits Channel -p:BSS -06ac:00820000:3138:013e:1:0 -RTR -p:GlobeCast -1cac:00820000:1ce8:0071:1:0 -ESPN -p:Cyfrowy Polsat S.A. -1fac:00820000:189c:fbff:1:0 -Sky News -p:SkyItalia -43ac:00820000:2cec:013e:1:0 -ERT World -p:RRSat -06ad:0082accf:0578:013e:1:0 -TVA VICENZA -p:Satlink -0dad:00820000:2d50:013e:1:0 -Disney Junior -p:ITI -06ae:00820000:3138:013e:1:0 -Rossiya 24 -p:GlobeCast -29ae:00820000:3d54:013e:1:0 -SNTV -p:BSS -1faf:00820000:189c:fbff:1:0 -Yacht & Sail -p:SkyItalia -2aaf:00820000:1838:fbff:1:0 -Sky Supercalcio -p:SkyItalia -06b0:00820000:3138:013e:1:0 -TRT Turk -p:GlobeCast -2ab0:00820000:1838:fbff:1:0 -Sky Sport 2 -p:SkyItalia -2ab1:00820000:1838:fbff:1:0 -Sky Sport24 -p:SkyItalia -06b2:00820000:3138:013e:1:0 -Al Jazeera Intl -p:GlobeCast -0db2:00820000:2d50:013e:1:0 -Discovery Historia -p:ITI -36b2:00820000:06a4:013e:1:0 -RTS Un -p:Radio Television Suisse -36b3:00820000:06a4:013e:1:0 -RSI LA 1 -p:Radiotelevisione svizzera -3bb3:00820000:012c:013e:1:0 -Eurosport 2 HD PL-HU-RO -p:ITI -43b3:00820000:2cec:013e:1:0 -Daring!TV -p:RRSat -06b4:00820000:3138:013e:1:0 -AZTV -p:GlobeCast -43b4:00820000:2cec:013e:1:0 -Daring!TV 2 -p:RRSat -06b5:00820000:3138:013e:1:0 -Ganj E Hozour -p:GlobeCast -1cb5:00820000:1ce8:0071:1:0 -Disney XD -p:Cyfrowy Polsat S.A. -3bb5:00820000:012c:013e:1:0 -Nat Geo Wild HD PL -p:ITI -2db6:00820000:1a2c:fbff:1:0 -AXN Sci-Fi -p:SkyItalia -3ab7:00820000:0514:013e:1:0 -MGM HD -p:ITI -01b8:00820000:1964:013e:1:0 -PIK TV -p:JMC -0bb8:00820000:20d0:013e:1:0 -ETV2 -p:GlobeCast -2ab8:00820000:1838:fbff:1:0 -Sky Sport24 -p:SkyItalia -36b8:00820000:06a4:013e:1:0 -RTS Deux -p:Radio Television Suisse -3ab8:00820000:0514:013e:1:0 -Discovery HD -p:ITI -05b9:00820000:0320:fbff:1:0 -Discovery Travel -p:SkyItalia -2ab9:00820000:1838:fbff:1:0 -PPV Bundle -p:SkyItalia -36b9:00820000:06a4:013e:1:0 -RSI LA 2 -p:Radiotelevisione svizzera -3ab9:00820000:0514:013e:1:0 -nSport -p:ITI -43b9:00820000:2cec:013e:1:0 -MRTV / Univ TV -p:RRSat -0dba:00820000:2d50:013e:1:0 -Disney XD -p:ITI -1fba:00820000:189c:fbff:1:0 -Fox -p:SkyItalia -2aba:00820000:1838:fbff:1:0 -Sky Sport24 -p:SkyItalia -2bba:00820000:19c8:fbff:1:0 -Cielo_interact -p:SkyItalia -3aba:00820000:0514:013e:1:0 -nPremium4 -p:ITI -43ba:00820000:2cec:013e:1:0 -TV Verdade -p:RRsat -05bb:00820000:0320:fbff:1:0 -Discovery Sci -p:SkyItalia -0bbb:00820000:20d0:013e:1:0 -Sat7 Plus -p:GlobeCast -2abb:00820000:1838:fbff:1:0 -PPV Bundle2 -p:SkyItalia -3abb:00820000:012c:013e:1:0 -WiP - Sundande HD PL -p:ITI -3dbb:00820000:0640:013e:1:0 -ReligiaTV -p:TVN -0bbc:00820000:20d0:013e:1:0 -AD AlOula -p:GLOBECAST -0fbc:00820000:2db4:fbff:1:0 -Nuvolari -p:SkyItalia -1fbc:00820000:189c:fbff:1:0 -Vetrina Primafila -p:SkyItalia -38bc:00820000:2648:fbff:1:0 -Primafila 22 -p:SkyItalia -0bbd:00820000:20d0:013e:1:0 -Libya Al Ahrar -p:GlobeCast -0fbd:00820000:2db4:fbff:1:0 -Fox +1 -p:SkyItalia -1bbd:00820000:17d4:013e:1:0 -GAMES -p:NetMed -1fbd:00820000:189c:fbff:1:0 -Vetrina Primafila -p:SkyItalia -2cbd:00820000:2580:fbff:1:0 -Disney XD +1 -p:SkyItalia -34bd:00820000:3c28:013e:1:0 -Loveworld TV -p:GlobeCast -38bd:00820000:2648:fbff:1:0 -Primafila 21 -p:SkyItalia -3abd:00820000:0514:013e:1:0 -TVP 1 HD -p:ITI -00be:0082afc2:0065:0001:1:0 -Alhurra TV 190 -p: -1bbe:00820000:17d4:013e:1:0 -E! Entertainment -p:NetMed -1fbe:00820000:189c:fbff:1:0 -NatGeo Wild -p:SkyItalia -2cbe:00820000:2580:fbff:1:0 -DisneyInEnglish -p:SkyItalia -34be:00820000:3c28:013e:1:0 -Fashion One -p:GlobeCast -38be:00820000:2648:fbff:1:0 -Primafila 28 -p:SkyItalia -3abe:00820000:0514:013e:1:0 -Romance TV -p:ITI -0bbf:00820000:20d0:013e:1:0 -Telepace -p:GlobeCast -1bbf:00820000:17d4:013e:1:0 -The History Channel -p:NetMed -1fbf:00820000:189c:fbff:1:0 -Yacht & Sail -p:SkyItalia -2cbf:00820000:2580:fbff:1:0 -Juventus Channel -p:SkyItalia -38bf:00820000:2648:fbff:1:0 -Primafila 2 -p:SkyItalia -0bc0:00820000:20d0:013e:1:0 -KNN Channel -p:GlobeCast -0dc0:00820000:2d50:013e:1:0 -Sport Klub + -p:TVN -1bc0:00820000:17d4:013e:1:0 -novacinema2 -p:NetMed -2cc0:00820000:2580:fbff:1:0 -Inter Channel -p:SkyItalia -34c0:00820000:3c28:013e:1:0 -DAYSTAR TV -p:GlobeCast -35c0:00820000:1388:013e:1:0 -Redlight -p:Telefonica Spain -38c0:00820000:2648:fbff:1:0 -Sky Inside -p:SkyItalia -02c1:00820000:1b58:013e:1:0 -Al Jazeera Documentary -p:Telespazio -0bc1:00820000:20d0:013e:1:0 -ZAHRAA TV -p:GLOBECAST -0fc1:00820000:2db4:fbff:1:0 -Fox Crime +1 -p:SkyItalia -12c1:00820000:2e7c:013e:1:0 -CANAL+ -p:CYFRA + -1bc1:00820000:17d4:013e:1:0 -mottv -p:NetMed -35c1:00820000:1388:013e:1:0 -D-XTV2 -p:Telefonica Spain -44c1:00820000:0258:013e:1:0 -WeddingTV Italia -p:Arqiva -02c2:00820000:1b58:013e:1:0 -Al Jazeera Mubasher -p:Telespazio -06c2:0082accf:0578:013e:1:0 -ROLSAT -p:Harmonic -0bc2:00820000:20d0:013e:1:0 -ERI TV -p:GlobeCast -0fc2:00820000:2db4:fbff:1:0 -Fox Life +1 -p:SkyItalia -12c2:00820000:2e7c:013e:1:0 -CANAL+ FILM -p:CYFRA + -1bc2:00820000:17d4:013e:1:0 -novacinema3 -p:NetMed -2cc2:00820000:2580:fbff:1:0 -La3 -p:SkyItalia -34c2:00820000:3c28:013e:1:0 -Ariana TV -p:GlobeCast -35c2:00820000:1388:013e:1:0 -SCT 3 -p:Telefonica Spain -38c2:00820000:2648:fbff:1:0 -Sky Inside -p:SkyItalia -01c3:00820000:26ac:013f:1:0 -RTL9 -p:AB SAT -0bc3:00820000:20d0:013e:1:0 -HOLY GOD -p:GlobeCast -1bc3:00820000:17d4:013e:1:0 -novasports4 -p:NetMed -2bc3:00820000:1a90:fbff:1:0 -Primafila 13 -p:SkyItalia -2dc3:00820000:1a2c:fbff:1:0 -Cinema Max +1 -p:SkyItalia -35c3:00820000:1388:013e:1:0 -SCT 5 -p:Telefonica Spain -38c3:00820000:2648:fbff:1:0 -Sky Inside -p:SkyItalia -3dc3:00820000:0640:013e:1:0 -Eska TV -p:ITI -01c4:00820000:26ac:013f:1:0 -AB1 -p:AB SAT -02c4:00820000:1b58:013e:1:0 -Al Jazeera -p:Telespazio -0dc4:00820000:2d50:013e:1:0 -TVP Historia -p:TVN -12c4:00820000:2e7c:013e:1:0 -KUCHNIA+ -p:CYFRA + -1bc4:00820000:17d4:013e:1:0 -novasports highlights -p:NetMed -2cc4:00820000:2580:fbff:1:0 -DeAKids -p:SkyItalia -35c4:00820000:1388:013e:1:0 -SCT 4 -p:Harmonic -01c5:00820000:26ac:013f:1:0 -AB MOTEURS -p:AB SAT -12c5:00820000:2e7c:013e:1:0 -ALE KINO+ -p:CYFRA + -1bc5:00820000:17d4:013e:1:0 -novasports6 -p:NetMed -1fc5:00820000:189c:fbff:1:0 -Fox Life -p:SkyItalia -2bc5:00820000:1a90:fbff:1:0 -Primafila 11 -p:SkyItalia -3bc5:00820000:0064:fbff:1:0 -Disney Junior +1 -p:SkyItalia -01c6:00820000:26ac:013f:1:0 -ANIMAUX -p: -12c6:00820000:2e7c:013e:1:0 -teleTOON+ -p:CYFRA + -1bc6:00820000:17d4:013e:1:0 -EPT HD -p:NetMed -1fc6:00820000:189c:fbff:1:0 -TestTS63 -p:SkyItalia -2dc6:00820000:1a2c:fbff:1:0 -Sky Uno -p:SkyItalia -34c6:00820000:3c28:013e:1:0 -TSB -p:GlobeCast -35c6:00820000:1388:013e:1:0 -SCT 6 -p:Telefonica Spain -3bc6:00820000:0064:fbff:1:0 -DoveTv -p:SkyItalia -01c7:00820000:26ac:013f:1:0 -CHASSE & PECHE -p:AB SAT -12c7:00820000:2e7c:013e:1:0 -TVP 1 -p:CYFRA + -1bc7:00820000:17d4:013e:1:0 -Disney Channel -p:NetMed -2bc7:00820000:1a90:fbff:1:0 -Eurosport 2 -p:SkyItalia -2dc7:00820000:1a2c:fbff:1:0 -Sky Calcio 1 -p:SkyItalia -34c7:00820000:3c28:013e:1:0 -Rebel TV -p:GlobeCast -35c7:00820000:1388:013e:1:0 -SCT 7 -p:Telefonica Spain -00c8:0082afc2:0065:0001:1:0 -AzadliqRadiosu TV -p: -01c8:00820000:26ac:013f:1:0 -CINE FX -p: -12c8:00820000:2e7c:013e:1:0 -TVP 2 -p:CYFRA + -1bc8:00820000:17d4:013e:1:0 -novasports3 -p:NetMed -1fc8:00820000:189c:fbff:1:0 -Fox Retro -p:SkyItalia -2cc8:00820000:2580:fbff:1:0 -Classica -p:SkyItalia -2dc8:00820000:1a2c:fbff:1:0 -Sky Calcio 15 -p:SkyItalia -34c8:00820000:3c28:013e:1:0 -INSPIRATIONNAL -p:GlobeCast -35c8:00820000:1388:013e:1:0 -SCT HQ -p:Telefonica Spain -38c8:00820000:2648:fbff:1:0 -Primafila 22 -p:SkyItalia -00c9:0082afc2:0065:0001:1:0 -Radio Svoboda RU 201 -p: -01c9:00820000:26ac:013f:1:0 -CINE POLAR -p:AB SAT -0bc9:00820000:20d0:013e:1:0 -Saudi - Sunnah -p:GlobeCast -12c9:00820000:2e7c:013e:1:0 -CANAL+ SPORT -p:CYFRA + -1bc9:00820000:17d4:013e:1:0 -novasports4 Cy -p:NetMed -1fc9:00820000:189c:fbff:1:0 -Cult -p:SkyItalia -35c9:00820000:1388:013e:1:0 -SCT 3b -p:Telefonica Spain -38c9:00820000:2648:fbff:1:0 -Primafila 28 -p:SkyItalia -00ca:0082afc2:0065:0001:1:0 -Radio Svoboda UA 202 -p: -01ca:00820000:26ac:013f:1:0 -ESCALES -p:AB SAT -12ca:00820000:2e7c:013e:1:0 -MTV ROCKS -p:CYFRA + -1bca:00820000:17d4:013e:1:0 -novacinema3 Cy -p:NetMed -1cca:00820000:1ce8:0071:1:0 -Cinemax2 -p:Cyfrowy Polsat S.A. -2bca:00820000:1a90:fbff:1:0 -Primafila 9 -p:SkyItalia -2dca:00820000:1a2c:fbff:1:0 -Cinema +1 -p:SkyItalia -34ca:00820000:3c28:013e:1:0 -EWTN UK -p:GlobeCast -35ca:00820000:1388:013e:1:0 -SCT 4b -p:Telefonica Spain -38ca:00820000:2648:fbff:1:0 -Sky Inside -p:SkyItalia -3aca:00820000:03e8:013e:1:0 -Upload -p:TVN -00cb:0082afc2:0065:0001:1:0 -Radioi Ozodi 203 -p: -01cb:00820000:26ac:013f:1:0 -Toute l'Histoire -p:AB SAT -12cb:00820000:2e7c:013e:1:0 -DOMO+ -p:CYFRA + -1bcb:00820000:17d4:013e:1:0 -novasports3 Cy -p:NetMed -1fcb:00820000:189c:fbff:1:0 -Fox Crime -p:SkyItalia -2bcb:00820000:1a90:fbff:1:0 -CNN Intl. -p:SkyItalia -38cb:00820000:2648:fbff:1:0 -Sky Inside -p:SkyItalia -3bcb:00820000:0064:fbff:1:0 -Disney XD -p:SkyItalia -01cc:00820000:1964:013e:1:0 -TRT Belgesel -p:JMC -01cc:00820000:26ac:013f:1:0 -AB3 -p:AB SAT -02cc:00820000:1b58:013e:1:0 -Telemarket 2 -p:Telespazio -1bcc:00820000:17d4:013e:1:0 -novasports6 Cy -p:NetMed -1fcc:00820000:189c:fbff:1:0 -Gambero Rosso -p:SkyItalia -2bcc:00820000:1a90:fbff:1:0 -Primafila 7 -p:SkyItalia -2dcc:00820000:1a2c:fbff:1:0 -Cinema Hits -p:SkyItalia -34cc:00820000:3c28:013e:1:0 -.Viva L'Italia Channel -p:GlobeCast -35cc:00820000:1388:013e:1:0 -TELEITALIASPOT -p:Telefonica Spain -38cc:00820000:2648:fbff:1:0 -Sky Radio -p:SkyItalia -3bcc:00820000:0064:fbff:1:0 -Cartoon Network -p:SkyItalia -00cd:0082afc2:0065:0001:1:0 -Radio Svaboda 205 -p: -01cd:00820000:26ac:013f:1:0 -ACTION -p:AB SAT -0bcd:00820000:20d0:013e:1:0 -Speeda TV -p:GlobeCast -1ccd:00820000:1ce8:0071:1:0 -TEST T -p:Cyfrowy Polsat S.A. -29cd:00820000:3cf0:013e:1:0 -Pianeta TV -p:GlobeCast -2bcd:00820000:1a90:fbff:1:0 -GXT -p:SkyItalia -2dcd:00820000:1a2c:fbff:1:0 -Cinema Comedy -p:SkyItalia -34cd:00820000:3c28:013e:1:0 -!FunSpice -p:GlobeCast -35cd:00820000:1388:013e:1:0 -TELEITALIASPOT b -p:Telefonica Spain -3bcd:00820000:0064:fbff:1:0 -Hip Hop TV -p:SkyItalia -3dcd:00820000:0640:013e:1:0 -TVN HD -p:TVN -00ce:0082afc2:0065:0001:1:0 -Radio Tavisupleba 206 -p: -01ce:00820000:26ac:013f:1:0 -MANGAS -p:AB SAT -06ce:0082accf:0578:013e:1:0 -SILVER TV -p:Harmonic -1bce:00820000:17d4:013e:1:0 -novacinema2 Cy -p:NetMed -29ce:00820000:3cf0:013e:1:0 -TELEPIU' Channel -p:GlobeCast -2bce:00820000:1a90:fbff:1:0 -Primafila 5 -p:SkyItalia -34ce:00820000:3c28:013e:1:0 -KICC -p:GlobeCast -35ce:00820000:1388:013e:1:0 -TELEITALIASPOT c -p:Telefonica Spain -3dce:00820000:0640:013e:1:0 -TVN Style HD -p:TVN -00cf:0082afc2:0065:0001:1:0 -Azatutyun 207 -p: -01cf:00820000:26ac:013f:1:0 -ENCYCLO -p:AB SAT -06cf:0082accf:0578:013e:1:0 -RETECONOMY -p:Satlink -0bcf:00820000:20d0:013e:1:0 -Hispan TV -p:GlobeCast -1ccf:00820000:1ce8:0071:1:0 -FoxLife -p:Cyfrowy Polsat S.A. -1fcf:00820000:189c:fbff:1:0 -History -p:SkyItalia -29cf:00820000:3cf0:013e:1:0 -ARTE -p: -2bcf:00820000:1a90:fbff:1:0 -Sky Calcio 2 -p:SkyItalia -2dcf:00820000:1a2c:fbff:1:0 -Sky Calcio 14 -p:SkyItalia -3dcf:00820000:0640:013e:1:0 -TVN STYLE HD -p:ITI -00d0:0082afc2:0065:0001:1:0 -Radio Deewa 208 -p: -01d0:00820000:26ac:013f:1:0 -AB4 -p:AB SAT -06d0:0082accf:0578:013e:1:0 -FISHING TV -p:Harmonic -07d0:0082accf:0578:013e:1:0 -ODEON SAT -p:Satlink -1bd0:00820000:17d4:013e:1:0 -FOXlife -p:NetMed -29d0:00820000:3cf0:013e:1:0 -RTL 102.5 TV -p:GlobeCast -2bd0:00820000:1a90:fbff:1:0 -Primafila 3 -p:SkyItalia -2cd0:00820000:2580:fbff:1:0 -E! -p:SkyItalia -2fd0:00820000:2c24:fbff:1:0 -DeAKids +1 -p:SkyItalia -38d0:00820000:2648:fbff:1:0 -Fox Business -p:SkyItalia -3dd0:00820000:0640:013e:1:0 -TVN Turbo HD -p:TVN -01d1:00820000:26ac:013f:1:0 -LUCKY JACK -p:AB SAT -02d1:00820000:1b58:013e:1:0 -BETHEL TV -p:Telespazio -1bd1:00820000:17d4:013e:1:0 -FX -p:NetMed -2bd1:00820000:1a90:fbff:1:0 -Sky Calcio 3 -p:SkyItalia -2cd1:00820000:2580:fbff:1:0 -ESPN America -p:SkyItalia -2fd1:00820000:2c24:fbff:1:0 -Discovery +1 -p:SkyItalia -3dd1:00820000:0640:013e:1:0 -TVN TURBO HD -p:TVN -00d2:0082afc2:0065:0001:1:0 -Mashaal Radio 210 -p: -01d2:00820000:26ac:013f:1:0 -ORANGE SPORT INFO -p:AB SAT -02d2:00820000:1b58:013e:1:0 -The Truth -p:Telespazio -1bd2:00820000:17d4:013e:1:0 -Boomerang -p:NetMed -29d2:00820000:3cf0:013e:1:0 -ITALIA_CHANNEL -p:GlobeCast -2fd2:00820000:2c24:fbff:1:0 -DMAX -p:SkyItalia -39d2:00820000:1fa4:013e:1:0 -RTVi Europe -p:EUTELSAT -00d3:0082afc2:0065:0001:1:0 -Azattyk Unalgysy 211 -p: -01d3:00820000:26ac:013f:1:0 -BIS promo -p:AB SAT -02d3:00820000:1b58:013e:1:0 -S.NEU JERUSALEM -p:Telespazio -1bd3:00820000:17d4:013e:1:0 -Nat Geo Wild -p:NetMed -29d3:00820000:3cf0:013e:1:0 -TV_ROMANIA -p: -2bd3:00820000:1a90:fbff:1:0 -Sky Calcio 4 -p:SkyItalia -2fd3:00820000:2c24:fbff:1:0 --frisbee- -p:SkyItalia -39d3:00820000:1fa4:013e:1:0 -RTVi Detskii Mir-Teleclub -p:EUTELSAT -00d4:0082afc2:0065:0001:1:0 -Ozodlik Radiosi 212 -p: -01d4:00820000:26ac:013f:1:0 -XXL -p:AB SAT -29d4:00820000:3cf0:013e:1:0 -Carisma_TV -p:GlobeCast -34d4:00820000:3c28:013e:1:0 -TISHK TV -p:GlobeCast -39d4:00820000:1fa4:013e:1:0 -RTVi Nashe Kino -p:EUTELSAT -00d5:0082afc2:0065:0001:1:0 -Azadliq Radiosu 213 -p: -01d5:00820000:26ac:013f:1:0 -XXL PL -p:AB SAT -0fd5:00820000:2db4:fbff:1:0 -Fox +2 -p:SkyItalia -29d5:00820000:3cf0:013e:1:0 -KBS_WORLD -p:GlobeCast -2bd5:00820000:1a90:fbff:1:0 -Sky Calcio 5 -p:SkyItalia -2fd5:00820000:2c24:fbff:1:0 -K2 -p:SkyItalia -44d5:00820000:0258:013e:1:0 -Videolina -p:Arqiva -0fd6:00820000:2db4:fbff:1:0 -Fox Life +2 -p:SkyItalia -29d6:00820000:3cf0:013e:1:0 -El Chourouk -p:GlobeCast -34d6:00820000:3c28:013e:1:0 -TV GLOBO -p:TandbergTV,C:1801,C:0500 -44d6:00820000:0258:013e:1:0 -Sardegna1 -p:Arqiva -00d7:0082afc2:0065:0001:1:0 -Alhurra TV 215 -p: -0fd7:00820000:2db4:fbff:1:0 -Fox Crime +2 -p:SkyItalia -10d7:00820000:03e8:013e:1:0 -TVN -p:TVN -12d7:00820000:2e7c:013e:1:0 -4823 -p:CYFRA + -29d7:00820000:3cf0:013e:1:0 -TELESUD -p:GlobeCast -2bd7:00820000:1a90:fbff:1:0 -Sky Calcio 6 -p:SkyItalia -34d7:00820000:3c28:013e:1:0 -News 7 -p:GlobeCast -39d7:00820000:1fa4:013e:1:0 -TV ARM RU -p:EUTELSAT -00d8:0082afc2:0065:0001:1:0 -Kabul Stream 216 -p: -10d8:00820000:03e8:013e:1:0 -TVN 24 -p:TVN -44d8:00820000:0258:013e:1:0 -20TV -p:Arqiva -00d9:0082afc2:0065:0001:1:0 -Azatlyk Radiosy 217 -p: -0fd9:00820000:2db4:fbff:1:0 -History +1 -p:SkyItalia -10d9:00820000:03e8:013e:1:0 -TVN Siedem -p:TVN -29d9:00820000:3cf0:013e:1:0 -K+ -p:GlobeCast -2bd9:00820000:1a90:fbff:1:0 -Sky Calcio 7 -p:SkyItalia -2dd9:00820000:1a2c:fbff:1:0 -Sky Sport 3 -p:SkyItalia -00da:0082afc2:0065:0001:1:0 -Azatliq Radiosi 218 -p: -01da:00820000:1964:013e:1:0 -IQRAA - ARABESQUE -p:ART -0fda:00820000:2db4:fbff:1:0 -NationalGeo +1 -p:SkyItalia -10da:00820000:03e8:013e:1:0 -nSport -p:TVN -44da:00820000:0258:013e:1:0 -AVA MOVIE -p:Arqiva -01db:00820000:1964:013e:1:0 -Iqraa Africa & Europe -p: -06db:0082accf:0578:013e:1:0 -NOSTRADAMUS -p:Satlink -0fdb:00820000:2648:fbff:1:0 -12673V SID 0xfdb -p:DVB-S QPSK 12673V 13.0°E -29db:00820000:3cf0:013e:1:0 -Arirang World -p: -44db:00820000:0258:013e:1:0 -TVR -p:Arqiva -00dc:0082afc2:0065:0001:1:0 -RL North Caucasus 220 -p: -0fdc:00820000:2db4:fbff:1:0 -Arturo -p:SkyItalia -10dc:00820000:03e8:013e:1:0 -Mango 24 -p:TVN -29dc:00820000:3cf0:013e:1:0 -AD Sport 1 -p:GlobeCast -32dc:00820000:0190:013e:1:0 -CANAL+ HD -p:CYFRA + -00dd:0082afc2:0065:0001:1:0 -Europa Libera 221 -p: -10dd:00820000:03e8:013e:1:0 -TTV -p:ITI -1edd:00820000:21fc:013e:1:0 -IRIB1 -p:IRIB -32dd:00820000:0190:013e:1:0 -CANAL+ FILM HD -p:CYFRA + -44dd:00820000:0258:013e:1:0 -Russia Today -p:Arqiva -00de:0082afc2:0065:0001:1:0 -RSE Balkans 222 -p: -01de:00820000:1964:013e:1:0 -IFILM -p:ART -0fde:00820000:2db4:fbff:1:0 -JimJam +1 -p:SkyItalia -10de:00820000:03e8:013e:1:0 -TVN Meteo -p:TVN -12de:00820000:2e7c:013e:1:0 -H test 1 -p:CYFRA + -29de:00820000:3cf0:013e:1:0 -NESSMA EU -p:GlobeCast -2fde:00820000:2c24:fbff:1:0 -Nick Jr +1 -p:SkyItalia -32de:00820000:0190:013e:1:0 -CANAL+ SPORT HD -p:CYFRA + -00df:0082afc2:0065:0001:1:0 -Radio Farda 223 -p: -02df:00820000:1b58:013e:1:0 -Al Mayadeen Tv -p:Harmonic -10df:00820000:03e8:013e:1:0 -TVN Turbo -p:TVN -12df:00820000:2e7c:013e:1:0 -H test 2 -p:CYFRA + -1edf:00820000:21fc:013e:1:0 -IRIB2 -p:IRIB -32df:00820000:0190:013e:1:0 -NATIONAL GEO HD -p:CYFRA + -38df:00820000:2648:fbff:1:0 -Sky Assist -p:SkyItalia -44df:00820000:0258:013e:1:0 -Persian TV -p:Arqiva -01e0:00820000:1964:013e:1:0 -Press TV -p:JMC -10e0:00820000:03e8:013e:1:0 -TVN Style -p:TVN -12e0:00820000:2e7c:013e:1:0 -H test 3 -p:CYFRA + -2fe0:00820000:2c24:fbff:1:0 -AXN +1 -p:SkyItalia -38e0:00820000:2648:fbff:1:0 -Primafila 4 -p:SkyItalia -44e0:00820000:0258:013e:1:0 -Russia Al-Yaum -p:Arqiva -00e1:0082afc2:0065:0001:1:0 -Persian TV 225 -p: -01e1:00820000:1964:013e:1:0 -Syrian Drama -p:ART -06e1:0082accf:0578:013e:1:0 -SRI LANKA ONE -p:Satlink -10e1:00820000:1644:fbff:1:0 -Sky Meteo24 -p:SkyItalia -10e1:00820000:03e8:013e:1:0 -Test -p:TVN -12e1:00820000:2e7c:013e:1:0 - CANAL+ FILM -p:CYFRA + -1ee1:00820000:21fc:013e:1:0 -IRINN -p:IRIB -32e1:00820000:0190:013e:1:0 -FILMBOX HD -p:CYFRA + -38e1:00820000:2648:fbff:1:0 -Primafila 6 -p:SkyItalia -44e1:00820000:0258:013e:1:0 -Opap TV -p:Arqiva -00e2:0082afc2:0065:0001:1:0 -Radio Free Iraq 226 -p: -0fe2:00820000:2db4:fbff:1:0 -Sky Test -p:SkyItalia -10e2:00820000:03e8:013e:1:0 -TVN CNBC -p:TVN -29e2:00820000:3cf0:013e:1:0 -E'TV Emilia R. -p:GlobeCast -32e2:00820000:0190:013e:1:0 -AXN SPIN HD -p:CYFRA + -44e2:00820000:0258:013e:1:0 -Monitor Games -p:Arqiva -00e3:0082afc2:0065:0001:1:0 -Evropa e Lire 227 -p: -01e3:00820000:1964:013e:1:0 -Ictimai TV -p:ART -0fe3:00820000:2648:fbff:1:0 -12673V SID 0xfe3 -p:DVB-S QPSK 12673V 13.0°E -10e3:00820000:1644:fbff:1:0 -SNAI Sat -p:SkyItalia -12e3:00820000:2e7c:013e:1:0 - CANAL+ -p:CYFRA + -1ee3:00820000:21fc:013e:1:0 -IRIB QURAN -p:IRIB -29e3:00820000:3cf0:013e:1:0 -ARTE -p: -32e3:00820000:0190:013e:1:0 -TVN 7 HD -p:CYFRA + -44e3:00820000:0258:013e:1:0 -World Fashion Channel -p:Arqiva -00e4:0082afc2:0065:0001:1:0 -Ekho Kavkaza 228 -p: -12e4:00820000:2e7c:013e:1:0 - CANAL+ FILM -p:CYFRA + -44e4:00820000:0258:013e:1:0 -PersianToon -p:Arqiva -01e5:00820000:1964:013e:1:0 -Syria TV -p:JMC -0ce5:00820000:1518:013e:1:0 -Rai Sport 2 -p:RAI -12e5:00820000:2e7c:013e:1:0 - CANAL+ SPORT -p:CYFRA + -3be5:00820000:0064:fbff:1:0 -Rock TV -p:SkyItalia -44e5:00820000:0258:013e:1:0 -Imam Hussein TV -p: -0ce6:00820000:1518:013e:1:0 -Camera Deputati -p:RAI -3be6:00820000:0064:fbff:1:0 -Sky Music -p:SkyItalia -44e6:00820000:0258:013e:1:0 -Baqi TV -p:Arqiva -01e7:00820000:1964:013e:1:0 -RT DOC -p:JMC -1ee7:00820000:21fc:013e:1:0 -SAHAR 1 -p:IRIB -29e7:00820000:3cf0:013e:1:0 -Telefoggia -p:GlobeCast -2fe7:00820000:2c24:fbff:1:0 -GXT +1 -p:SkyItalia -44e7:00820000:0258:013e:1:0 -Al-Hayat -p:Arqiva -01e8:00820000:1964:013e:1:0 -Yemen TV -p:JMC -0ce8:00820000:1518:013e:1:0 -Rai Test HD -p:Rai -10e8:00820000:1644:fbff:1:0 -TG24PrimoPiano -p:SkyItalia -2fe8:00820000:2c24:fbff:1:0 -Cartoon +1 -p:SkyItalia -44e8:00820000:0258:013e:1:0 -AHTV -p:Arqiva -0ce9:00820000:1518:013e:1:0 -Rai Sport 1 -p:RAI -2fe9:00820000:2c24:fbff:1:0 -Boomerang +1 -p:SkyItalia -35e9:00820000:00c8:013e:1:0 -ESP2 Int'l -p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604 -0cea:00820000:1518:013e:1:0 -Rai Premium -p:RAI -10ea:00820000:1644:fbff:1:0 -TG24 Rassegne -p:SkyItalia -1cea:00820000:2fa8:013e:1:0 -Noursat -p:Globecast UK -20ea:00820000:3db8:013e:1:0 -BLU -p:Telespazio -34ea:00820000:3c28:013e:1:0 -MADE IN ITALY -p:GlobeCast -35ea:00820000:00c8:013e:1:0 -ESP2 Dutch -p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604 -0beb:00820000:20d0:013e:1:0 -Equidia PRO1 -p:GlobeCast -0ceb:00820000:1518:013e:1:0 -Rai Storia -p:RAI -1eeb:00820000:21fc:013e:1:0 -AL-ALAM -p:IRIB -20eb:00820000:3db8:013e:1:0 -CONTO TV 3 -p:Telespazio -0bec:00820000:20d0:013e:1:0 -Equidia PRO2 -p:GlobeCast -0cec:00820000:1518:013e:1:0 -RaiNettunoSat1 -p:RAI -10ec:00820000:1644:fbff:1:0 -TG24 Eventi -p:SkyItalia -20ec:00820000:3db8:013e:1:0 -CONTO TV 2 -p:Telespazio -2fec:00820000:2c24:fbff:1:0 -Real Time +1 -p:SkyItalia -35ec:00820000:00c8:013e:1:0 -ESP2 Test -p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604 -0ced:00820000:1518:013e:1:0 -TV2000 -p:RAI -13ed:00820000:05dc:013e:1:0 -TV POLONIA -p:CYFRA + -20ed:00820000:3db8:013e:1:0 -CONTO TV 1 -p:Telespazio -35ed:00820000:00c8:013e:1:0 -ESP2 Greek -p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604 -3bed:00820000:0064:fbff:1:0 -Sky Music -p:SkyItalia -0cee:00820000:1518:013e:1:0 -Rai Gulp -p:RAI -13ee:00820000:05dc:013e:1:0 -TVS -p:CYFRA + -20ee:00820000:3db8:013e:1:0 -CONTO TV -p:Telespazio -39ee:00820000:1fa4:013e:1:0 -Youdem -p:Eutelsat -20ef:00820000:3db8:013e:1:0 -CONTO TV 4 -p:Harmonic -29ef:00820000:3cf0:013e:1:0 -RTG TV -p:GlobeCast -00f0:0082afc2:0065:0001:1:0 -VOA TV 240 (HB49-56) -p: -13f0:00820000:05dc:013e:1:0 -KINO POLSKA -p:CYFRA + -20f0:00820000:3db8:013e:1:0 -CONTO TV 5 -p:Telespazio -2ff0:00820000:2c24:fbff:1:0 -Comedy +1 -p:SkyItalia -3bf0:00820000:0064:fbff:1:0 -Caccia e Pesca -p:SkyItalia -00f1:00820000:2e18:00b0:1:0 -Tamazight -p:PRVDR -00f1:0082afc2:0065:0001:1:0 -VOA TV 241 -p: -13f1:00820000:05dc:013e:1:0 -TRACE TV -p:CYFRA + -20f1:00820000:3db8:013e:1:0 -JUSTICE TV -p:Telespazio -29f1:00820000:3cf0:013e:1:0 -METROPOLIS TV SAT -p:GlobeCast -2ff1:00820000:2c24:fbff:1:0 -Nickelodeon +1 -p:SkyItalia -00f2:0082afc2:0065:0001:1:0 -VOA TV 242 -p: -01f2:00820000:1964:013e:1:0 -Saudi Sports 1 -p:JMC -29f2:00820000:3cf0:013e:1:0 -METROSAT -p:GlobeCast -44f2:00820000:0258:013e:1:0 -Manoto 1 -p:Arqiva -00f3:0082afc2:0065:0001:1:0 -VOA Radio 243 (HB51-52) -p: -01f3:00820000:1964:013e:1:0 -Alalam -p:JMC -38f3:00820000:2648:fbff:1:0 -Music Box -p:SkyItalia -00f4:0082afc2:0065:0001:1:0 -VOA Radio 244 (HB53-54) -p: -13f4:00820000:05dc:013e:1:0 -5108 -p:CYFRA + -34f4:00820000:3c28:013e:1:0 -POKERItalia24 -p:GlobeCast -3bf4:00820000:0064:fbff:1:0 -Babel -p:SkyItalia -00f5:0082afc2:0065:0001:1:0 -VOA Radio 245 (HB55-56) -p: -01f5:00820000:26ac:013f:1:0 -Trace Sport SD -p:Eutelsat -13f5:00820000:05dc:013e:1:0 -ITV -p:CYFRA + -20f5:00820000:01f4:013e:1:0 -JSC Sports +1 -p:Al Jazeera -35f5:00820000:00c8:013e:1:0 -ESP2 Rus -p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604 -01f6:00820000:26ac:013f:1:0 -TV8 Mont Blanc -p:Eutelsat -12f6:00820000:2e7c:013e:1:0 -KUCHNIA+ -p:CYFRA + -13f6:00820000:05dc:013e:1:0 -TVP INFO -p:CYFRA + -20f6:00820000:01f4:013e:1:0 -JSC Sports +2 -p:Al Jazeera -01f7:00820000:26ac:013f:1:0 -M6 SD -p:Eutelsat -12f7:00820000:2e7c:013e:1:0 -ALE KINO+ -p:CYFRA + -13f7:00820000:05dc:013e:1:0 -CINEMAX -p:CYFRA + -20f7:00820000:01f4:013e:1:0 -JSC Sports +3 -p:Al Jazeera -01f8:00820000:26ac:013f:1:0 -Game ONE -p:Eutelsat -12f8:00820000:2e7c:013e:1:0 -teleTOON+ -p:CYFRA + -13f8:00820000:05dc:013e:1:0 -PULS -p:CYFRA + -20f8:00820000:01f4:013e:1:0 -JSC Sports +4 -p:Al Jazeera -11f9:00820000:2b5c:013e:1:0 -Islam TV -p:Arqiva -12f9:00820000:2e7c:013e:1:0 -DOMO+ -p:CYFRA + -13f9:00820000:05dc:013e:1:0 -TVP Kultura -p:CYFRA + -20f9:00820000:01f4:013e:1:0 -JSC Sports +5 -p:Al Jazeera -11fa:00820000:2b5c:013e:1:0 -GEM ME -p:Arqiva -20fa:00820000:01f4:013e:1:0 -JSC Sports +6 -p:Al Jazeera -29fa:00820000:3cf0:013e:1:0 -Mediterraneo Sat -p:GlobeCast -38fa:00820000:2648:fbff:1:0 -Primafila 21 -p:SkyItalia -00fb:0082afc2:0065:0001:1:0 -VOA TV 251 -p: -11fb:00820000:2b5c:013e:1:0 -RTPi -p:Arqiva -20fb:00820000:01f4:013e:1:0 -JSC Sports +7 -p:Al Jazeera -29fb:00820000:3cf0:013e:1:0 -QUORE TV -p:GlobeCast -00fc:0082afc2:0065:0001:1:0 -VOA TV 252 -p: -10fc:00820000:1644:fbff:1:0 -Sky TG24 -p:SkyItalia -11fc:00820000:2b5c:013e:1:0 -MTA INTL -p:Arqiva -20fc:00820000:01f4:013e:1:0 -JSC Sports +8 -p:Al Jazeera -29fc:00820000:3cf0:013e:1:0 -Reality TV -p:GlobeCast -44fc:00820000:0258:013e:1:0 -Pars TV -p:Harmonic -00fd:0082afc2:0065:0001:1:0 -VOA Radio 253 (HB53-56) -p: -20fd:00820000:01f4:013e:1:0 -JSC Sports +9 -p:Al Jazeera -35fd:00820000:00c8:013e:1:0 -ESP2 Portuguese -p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604 -11fe:00820000:2b5c:013e:1:0 -Deepam TV -p:Arqiva -20fe:00820000:01f4:013e:1:0 -JSC Sports +10 -p:Al Jazeera -2a00:00820000:3cf0:013e:2:0 -Radio_Romania_International -p:GlobeCast -3c00:00820000:0064:fbff:2:0 -Vibe -p:SkyItalia -2a01:00820000:3cf0:013e:2:0 -RadioClassica -p:GlobeCast -2a02:00820000:3cf0:013e:2:0 -RTL GROOVE -p:GlobeCast_Italia -2a03:00820000:3cf0:013e:2:0 -RTL Italian Style -p:GlobeCast_Italia -2a04:00820000:3cf0:013e:2:0 -Guardia Costiera -p:GlobeCast_Italia -2a05:00820000:3cf0:013e:2:0 -RTL Classic -p:GlobeCast_Italia -0e06:00820000:3c8c:013e:2:0 -DW09 -p:MEDIA BROADCAST -2a06:00820000:3cf0:013e:2:0 -Radio Padania -p: -3c06:00820000:0064:fbff:2:0 -Yesterjay 2000 -p:SkyItalia -2907:00820000:1edc:0071:2:0 -Planeta FM -p:Cyfrowy Polsat S.A. -0c08:00820000:20d0:013e:2:0 -Radio Nawa Arabic -p:GlobeCast -3c0a:00820000:0064:fbff:2:0 -Heart n' song -p:SkyItalia -000b:00820000:2e18:00b0:2:0 -Radio national -p:PRVDR -000b:00820000:1770:0110:2:0 -Radio Mater -p: -000b:00820000:25e4:02be:2:0 -SHARJAH R1 -p:ARABSAT -0c0b:00820000:20d0:013e:2:0 -Emirates FM -p:GlobeCast -000c:00820000:2e18:00b0:2:0 -Radio Dakhla -p:PRVDR -000c:00820000:25e4:02be:2:0 -QATAR R1 -p:ARABSAT -3c0c:00820000:0064:fbff:2:0 -Dance -p:SkyItalia -000d:00820000:25e4:02be:2:0 -SAUDI1 R1 -p:ARABSAT -3c0d:00820000:0064:fbff:2:0 -Ritmo Latino -p:SkyItalia -000e:00820000:2e18:00b0:2:0 -Chaine inter -p:PRVDR -000e:00820000:25e4:02be:2:0 -KUWAIT R1 -p:ARABSAT -3c0e:00820000:0064:fbff:2:0 -Livetime -p:SkyItalia -000f:00820000:2e18:00b0:2:0 -Amazigh -p:PRVDR -0c0f:00820000:20d0:013e:2:0 -RFI Francais -p:GlobeCast -3c0f:00820000:0064:fbff:2:0 -Rock Classic -p:SkyItalia -0010:00820000:2e18:00b0:2:0 -Radio Mohamed VI -p:PRVDR -0010:00820000:25e4:02be:2:0 -SUDAN R1 -p:ARABSAT -3c10:00820000:0064:fbff:2:0 -Rock Shock -p:SkyItalia -0011:00820000:25e4:02be:2:0 -OMAN R1 -p:ARABSAT -3c11:00820000:0064:fbff:2:0 -B-Side -p:SkyItalia -0012:00820000:25e4:02be:2:0 -ESC R1 -p:ARABSAT -3c12:00820000:0064:fbff:2:0 -Jazz & Fusion -p:SkyItalia -0013:00820000:25e4:02be:2:0 -RADIO BAGHDAD -p:ARABSAT -3c13:00820000:0064:fbff:2:0 -Jazz Gold -p:SkyItalia -3c14:00820000:0064:fbff:2:0 -Soul Train -p:SkyItalia -0015:00820000:25e4:02be:2:0 -SHARJAH R2 -p:ARABSAT -3c15:00820000:0064:fbff:2:0 -Extrabeat -p:SkyItalia -3c16:00820000:0064:fbff:2:0 -Sinfonia -p:SkyItalia -0017:00820000:25e4:02be:2:0 -SAUDI1 R2 -p:ARABSAT -3c17:00820000:0064:fbff:2:0 -Opera -p:SkyItalia -0018:00820000:25e4:02be:2:0 -KUWAIT R2 -p:ARABSAT -3c18:00820000:0064:fbff:2:0 -Cinema Deejay -p:SkyItalia -0119:0082afc2:0065:0001:2:0 -VOA Radio 281 (HB75-78) -p: -3c19:00820000:0064:fbff:2:0 -Baby Mix -p:SkyItalia -001a:00820000:25e4:02be:2:0 -SUDAN R2 -p:ARABSAT -0e1a:00820000:3c8c:013e:2:0 -DW-FM01 -p:MEDIA BROADCAST -3c1a:00820000:0064:fbff:2:0 -Disc Joker -p:SkyItalia -001b:00820000:25e4:02be:2:0 -OMAN R2 -p:ARABSAT -291b:00820000:1edc:0071:2:0 -RMF FM -p:Cyfrowy Polsat S.A. -001c:00820000:25e4:02be:2:0 -ESC R2 -p:ARABSAT -291c:00820000:1edc:0071:2:0 -Zlote Przeboje -p:Cyfrowy Polsat S.A. -001d:00820000:25e4:02be:2:0 -AL-IRAQIA QURAN -p:ARABSAT -0c1d:00820000:20d0:013e:2:0 -FMAddis97-1 -p:GlobeCast -291e:00820000:1edc:0071:2:0 -RMF Classic -p:Cyfrowy Polsat S.A. -291f:00820000:1edc:0071:2:0 -Radio PIN 102FM -p:Cyfrowy Polsat S.A. -2920:00820000:1edc:0071:2:0 -Jedynka - PR -p:Cyfrowy Polsat S.A. -2921:00820000:1edc:0071:2:0 -Trójka - PR -p:Cyfrowy Polsat S.A. -2922:00820000:1edc:0071:2:0 -Radio ZET -p:Cyfrowy Polsat S.A. -0025:00820000:25e4:02be:2:0 -OMAN R3 -p:ARABSAT -0026:00820000:25e4:02be:2:0 -ESC R3 -p:ARABSAT -0a28:00820000:3d54:013e:2:0 -Era 1 -p: -1c2d:00820000:1c20:013e:2:0 -R.Citta Futura -p:AH-EDP -0e2e:00820000:0708:00c8:2:0 -RADIO ITALIA s.m.i. -p:M-Three satcom -002f:00820000:25e4:02be:2:0 -OMAN-HOLY QURAN -p:ARABSAT -292f:00820000:1edc:0071:2:0 -RMF MAXXX -p:Cyfrowy Polsat S.A. -0e30:00820000:0708:00c8:2:0 -RMC 2 -p:M-Three satcom -1c30:00820000:1c20:013e:2:0 -Ecoradio -p:AH-EDP -2530:00820000:13ef:013e:2:0 -Noor Dubai Radio -p:Du -0e31:00820000:0708:00c8:2:0 -VIRGIN RADIO -p:M-Three satcom -0032:00820000:25e4:02be:2:0 -JORDAN R1 -p:ARABSAT -1c32:00820000:1c20:013e:2:0 -R Tunisie Culture -p:AH-EDP -0e34:00820000:0708:00c8:2:0 -R.BuonConsiglio -p:M-Three satcom -4234:00820000:3db8:013e:2:0 -TASVIR AFN -p:Telespazio -0135:00820000:157c:013e:2:0 -Love Radio -p:NetMed -0e35:00820000:0708:00c8:2:0 -Radio Sportiva -p:M-Three satcom -0136:0082afc2:0065:0001:2:0 -VOA Urdu Radio 310 -p: -0136:00820000:157c:013e:2:0 -Greek Church -p:NetMed -0e36:00820000:0708:00c8:2:0 -KISS KISS RADIO -p:M-Three satcom -0137:00820000:157c:013e:2:0 -Skai Radio -p:NetMed -0138:00820000:157c:013e:2:0 -Melodi Radio -p:NetMed -0e38:00820000:0708:00c8:2:0 -R.S.F. inBlu -p:M-Three satcom -0e38:00820000:3c8c:013e:2:0 -DW-FM04 -p:MEDIA BROADCAST -0139:00820000:157c:013e:2:0 -RR3 -p:NetMed -0e39:00820000:0708:00c8:2:0 -Radio Sei -p:M-Three satcom -013a:00820000:157c:013e:2:0 -RR1 -p:NetMed -0e3a:00820000:0708:00c8:2:0 -Rete Sport -p:M-Three satcom -0e3c:00820000:0708:00c8:2:0 -Radio 24 -p:M-Three satcom -0e3d:00820000:0708:00c8:2:0 -R.ONDA D'URTO -p:M-Three satcom -0e3e:00820000:0708:00c8:2:0 -R101 -p:M-Three satcom -0e40:00820000:0708:00c8:2:0 -RADIO KOLBE -p:M-Three satcom -0e42:00820000:0708:00c8:2:0 -DISCORADIO -p:M-Three satcom -0e43:00820000:0708:00c8:2:0 -DEEJAY -p:M-Three satcom -2143:00820000:3070:013e:2:0 -Rai radiofd4 -p:RAI -0e44:00820000:0708:00c8:2:0 -CAPITAL -p:M-Three satcom -0e45:00820000:0708:00c8:2:0 -M DUE O -p:M-Three satcom -0e46:00820000:0708:00c8:2:0 -Radio Iglesias -p:M-Three satcom -0e47:00820000:0708:00c8:2:0 -Radio -p:M-Three satcom -1348:00820000:33f4:013e:2:0 -VAB RADIO -p:Telespazio -0e4a:00820000:3c8c:013e:2:0 -DW-FM07 -p:MEDIA BROADCAST -144a:00820000:05dc:013e:2:0 -11488H SID 0x144a -p:DVB-S QPSK 11488H 13.0°E -144c:00820000:05dc:013e:2:0 -11488H SID 0x144c -p:DVB-S QPSK 11488H 13.0°E -0e4e:00820000:3c8c:013e:2:0 -DW-FEED1 -p:MEDIA BROADCAST -144e:00820000:05dc:013e:2:0 -11488H SID 0x144e -p:DVB-S QPSK 11488H 13.0°E -294e:00820000:1edc:0071:2:0 -12284H SID 0x294e -p:DVB-S QPSK 12284H 13.0°E -1c52:00820000:1c20:013e:2:0 -R Tunisie Nationale -p:AH-EDP -1c53:00820000:1c20:013e:2:0 -R Tunisie Internationale -p:AH-EDP -3653:00820000:1388:013e:2:0 -BBC English (Europe) -p:BBC World Service -3654:00820000:1388:013e:2:0 -BBC English Mid-East -p:BBC World Service -3656:00820000:1388:013e:2:0 -BBC English News -p:BBC World Service -365c:00820000:1388:013e:2:0 -BBC Arabic -p:BBC World Service -0960:00820000:3d54:013e:2:0 -Era Sport -p: -0066:0082accf:0578:013e:2:0 -Bahai Radio -p:Harmonic -0067:0082afc2:0065:0001:2:0 -VOA Radio 103 (HB55-56) -p: -0067:00820000:2cec:013e:2:0 -RUSSIAN RADIO -p:RRSat -2167:00820000:3070:013e:2:0 -Multilingue 1 -p:RAI -0068:0082afc2:0065:0001:2:0 -VOA Music Mix 104 (HB57-60) -p: -2168:00820000:3070:013e:2:0 -Multilingue 2 -p:RAI -0069:0082afc2:0065:0001:2:0 -VOA Radio 105 (HB59-60) -p: -2169:00820000:3070:013e:2:0 -SatelRadio -p:RAI -006a:0082afc2:0065:0001:2:0 -VOA Radio 106 (HB61-64) -p: -1d6a:00820000:2f44:013e:2:0 -BHMA FM 99,5 -p:NetMed -216a:00820000:3070:013e:2:0 -Radio OM unica -p:RAI -006b:0082afc2:0065:0001:2:0 -VOA Radio 107 (HB63-64) -p: -216b:00820000:3070:013e:2:0 -Radio2 mono -p:RAI -016c:00820000:1c84:013e:2:0 -NET -p:NetMed -126c:00820000:3458:013e:2:0 -Radio INTESA SANPAOLO -p:RRSat -216c:00820000:3070:013e:2:0 -Radio3 mono -p:RAI -016d:00820000:1c84:013e:2:0 -ERA2 -p:NetMed -016e:00820000:1c84:013e:2:0 -ERA SPORT -p:NetMed -2070:00820000:2328:013e:2:0 -VOICE OF CRO -p:OIV Zagreb -0071:0082afc2:0065:0001:2:0 -VOA Radio 113 (HB75-76) -p: -2071:00820000:2328:013e:2:0 -HRT-HR1 -p:OIV Zagreb -0072:0082afc2:0065:0001:2:0 -Sawa Levant Radio 114 -p: -2072:00820000:2328:013e:2:0 -HRT-HR2 -p:OIV Zagreb -2972:00820000:3d54:013e:2:0 -VRT Radio 1 -p:BSS -0073:0082afc2:0065:0001:2:0 -Sawa Iraq Radio 115 -p: -2073:00820000:2328:013e:2:0 -HRT-HR3 -p:OIV Zagreb -2973:00820000:3d54:013e:2:0 -VRT Radio 2 -p:BSS -0074:0082afc2:0065:0001:2:0 -Yamal 116 -p: -2074:00820000:2328:013e:2:0 -HRT R-Pula -p:OiV Zagreb -2974:00820000:3d54:013e:2:0 -RADIO 74 -p:BSS -0075:0082afc2:0065:0001:2:0 -Sawa Gulf Radio 117 -p: -0076:0082afc2:0065:0001:2:0 -Sawa N. Africa Radio 118 -p: -0077:0082afc2:0065:0001:2:0 -VOA and RFA Asia 119 -p: -1277:00820000:3458:013e:2:0 -New Life Radio Russia -p:RRSat -3677:00820000:1388:013e:2:0 -BBC Afghan -p:BBC World Service -0079:0082afc2:0065:0001:2:0 -VOA Iraq N/S Radio 121 -p: -1279:00820000:3458:013e:2:0 -European Radio for Belarus -p:RRSat -007a:0082afc2:0065:0001:2:0 -Sawa Sudan Radio 122 -p: -127a:00820000:3458:013e:2:0 -Tamil GTBC.fm -p:RRSat -007b:0082afc2:0065:0001:2:0 -Sawa Lebanon Radio 123 -p: -017b:00820000:1c84:013e:2:0 -ERA3 -p:NetMed -127b:00820000:3458:013e:2:0 -Tamil Radio EU -p:RRSat -127c:00820000:3458:013e:2:0 -Radio Mojdeh -p:RRSat -367c:00820000:1388:013e:2:0 -BBC Russian -p:BBC World Service -127d:00820000:3458:013e:2:0 -London TBC -p:RRsat -127e:00820000:3458:013e:2:0 -Persian Radio -p:RRSat -207f:00820000:2328:013e:2:0 -OTVORENI -p:OIV Zagreb -2080:00820000:2328:013e:2:0 -MEDIASERVIS -p:OIV Zagreb -0081:00820000:2e18:00b0:2:0 -Medi1Radio -p:PRVDR -2081:00820000:2328:013e:2:0 -TOTALNI FM -p:OiV Zagreb -2082:00820000:2328:013e:2:0 -R MIR M -p:OiV Zagreb -1d83:00820000:2f44:013e:2:0 -SENTRA FM -p:NetMed -2083:00820000:2328:013e:2:0 -RADIO MARIJA -p:OiV Zagreb -0c84:00820000:2328:013e:2:0 -SLO-RA1-INF -p:OIV Zagreb -1d84:00820000:2f44:013e:2:0 -REAL FM -p:NetMed -0c85:00820000:2328:013e:2:0 -SLO-RA2 -p:OIV Zagreb -0c86:00820000:2328:013e:2:0 -SLO-RA3 -p:OIV Zagreb -0c88:00820000:2328:013e:2:0 -RADIO SI -p:OIV Zagreb -3688:00820000:00c8:013e:2:0 -TDA Chaine 1 -p:Eutelsat -208a:00820000:2328:013e:2:0 -Narodni radio -p:OIV Zagreb -298d:00820000:3d54:013e:2:0 -ILC Tamil -p:BSS -298e:00820000:3d54:013e:2:0 -Nawa Kurdish Radio -p:BSS -0c8f:00820000:2328:013e:2:0 -CAPODISTRIA -p:OIV Zagreb -298f:00820000:3d54:013e:2:0 -Nawa Arabic Radio -p:BSS -3591:00820000:1388:013e:2:0 -Radio 1 -p:Telefonica Spain -3592:00820000:1388:013e:2:0 -Radio 3 -p:Telefonica Spain -3692:00820000:00c8:013e:2:0 -TDA Chaine 2 -p:Eutelsat -3593:00820000:1388:013e:2:0 -Radio 4 -p:Telefonica Spain -3693:00820000:1388:013e:2:0 -BBC Eur Feed 1 -p:BBC World Service -1d94:00820000:2f44:013e:2:0 -novasport FM -p:NetMed -2094:00820000:3d54:013e:2:0 -R MIR M -p:OIV Zagreb -3594:00820000:1388:013e:2:0 -Radio 5 -p:Telefonica Spain -3694:00820000:1388:013e:2:0 -BBC Eur Feed 2 -p:BBC World Service -3595:00820000:1388:013e:2:0 -Radio Clasica -p:Telefonica Spain -3695:00820000:1388:013e:2:0 -BBC Eur Feed 3 -p:BBC World Service -3596:00820000:1388:013e:2:0 -Radio Exterior -p:Telefonica Spain -3696:00820000:1388:013e:2:0 -BBC Eur Feed 4 -p:BBC World Service -1197:00820000:1e14:013e:2:0 -Saudi Radio 2 -p:GlobeCast -3697:00820000:1388:013e:2:0 -BBC Eur Feed 5 -p:BBC World Service -0098:00820000:1e14:013e:2:0 -TRT TAMIL OLLI -p:GlobeCast -0898:00820000:3d54:013e:2:0 -Era 2 -p: -1198:00820000:1e14:013e:2:0 -European Program -p:GlobeCast -2998:00820000:3d54:013e:2:0 -Radioshora -p:BSS -3698:00820000:1388:013e:2:0 -BBC Eur Feed 6 -p:BBC World Service -0399:00820000:2134:013e:2:0 -SRG-DRS 1 -p:Schweizer Radio DRS -2999:00820000:3d54:013e:2:0 -Renew Live -p:BSS -3a99:00820000:1fa4:013e:2:0 -Radio Radio -p:Eutelsat -039a:00820000:2134:013e:2:0 -SRG-DRS 2 -p:Schweizer Radio DRS -039b:00820000:2134:013e:2:0 -SRG-DRS 3 -p:Schweizer Radio DRS -299b:00820000:3d54:013e:2:0 -Rang A Rang -p:BSS -039c:00820000:2134:013e:2:0 -SRG-DRS Virus -p:Schweizer Radio DRS -299c:00820000:3d54:013e:2:0 -RADIO EVIVA -p:BSS_LDK -369c:00820000:00c8:013e:2:0 -TDA Chaine 3 -p:Eutelsat -039d:00820000:2134:013e:2:0 -SRG-DRS Musikwelle -p:Schweizer Radio DRS -039e:00820000:2134:013e:2:0 -SRG-Rumantsch -p:Radio Rumantsch -299e:00820000:3d54:013e:2:0 -RADIO JEANS -p:BSS -299f:00820000:3d54:013e:2:0 -Radio Expert -p:BSS -29a1:00820000:3d54:013e:2:0 -Radio Zamaneh -p:BSS -29a3:00820000:3d54:013e:2:0 -Radio Padania -p:BSS -03a6:00820000:2134:013e:2:0 -SRG-Swiss Classic -p:Swiss Satellite Radio -03a7:00820000:2134:013e:2:0 -SRG-Swiss Pop -p:Swiss Satellite Radio -03a8:00820000:2134:013e:2:0 -SRG-Swiss Jazz -p:Swiss Satellite Radio -03a9:00820000:2134:013e:2:0 -SRG-DRS 4 News -p:Schweizer Radio DRS -3dae:00820000:2c88:013e:2:0 -10796V SID 0x3dae -p:DVB-S QPSK 10796V 13.0°E -00af:00820000:1e14:013e:2:0 -Al Rasheed Radio -p:GlobeCast -00b1:00820000:2e18:00b0:2:0 -Radio Tanger -p:PRVDR -00b2:00820000:2e18:00b0:2:0 -Radio Fes -p:PRVDR -00b3:00820000:2e18:00b0:2:0 -Radio Marrakech -p:PRVDR -00b7:00820000:1e14:013e:2:0 -Radio YAADOUT -p:GlobeCast -00ba:00820000:1e14:013e:2:0 -FRANCE MAGHREB -p:GlobeCast -00bb:00820000:1e14:013e:2:0 -RADIO ORIENT -p:GlobeCast -20bb:00820000:3d54:013e:2:0 -RADIO MARIJA -p:OIV Zagreb -43bc:00820000:2cec:013e:2:0 -3ABN Radio -p:RRSat -43be:00820000:2cec:013e:2:0 -Heimatklang -p:RRSat -43c0:00820000:2cec:013e:2:0 -The Overcomer -p:RRSat -43c1:00820000:2cec:013e:2:0 -RNW-1 -p:RRSat -43c2:00820000:2cec:013e:2:0 -RNW-2 -p:RRSat -43c3:00820000:2cec:013e:2:0 -ROCK NATION -p:RRSat -06c4:00820000:3138:013e:2:0 -AZTV Radio -p:GlobeCast -09c4:00820000:3d54:013e:2:0 -Era 5 -p: -43c4:00820000:2cec:013e:2:0 -TGN Radio -p:RRSat -43c5:00820000:2cec:013e:2:0 -Makedonsko Radio -p:RRSat -43c6:00820000:2cec:013e:2:0 -VOV Radio -p:RRSat -43c7:00820000:2cec:013e:2:0 -RNW-8 -p:RRSat -37c8:00820000:044c:013e:2:0 -11411H SID 0x37c8 -p:DVB-S2 8PSK 11411H 13.0°E -43c8:00820000:2cec:013e:2:0 -RNW-9 -p:RRSat -43c9:00820000:2cec:013e:2:0 -ERA 1 -p:RRSat -43ca:00820000:2cec:013e:2:0 -ERA 2 -p:RRSat -36cb:00820000:06a4:013e:2:0 -SSR-La 1ere -p:Radio Television Suisse -43cb:00820000:2cec:013e:2:0 -ERA 3 -p:RRSat -36cc:00820000:06a4:013e:2:0 -SSR-Espace 2 -p:Radio Television Suisse -43cc:00820000:2cec:013e:2:0 -ERA SPORT -p:RRSat -1bcd:00820000:17d4:013e:2:0 -Mad Radio -p:NetMed -36cd:00820000:06a4:013e:2:0 -SSR-Couleur3 -p:Radio Television Suisse -43cd:00820000:2cec:013e:2:0 -ERA 5 -p:RRSat -36ce:00820000:06a4:013e:2:0 -SSR-Option Musique -p:Radio Television Suisse -43ce:00820000:2cec:013e:2:0 -Azadi FM -p:RRSat -36cf:00820000:06a4:013e:2:0 -SSR-Rete Uno -p:Radiotelevisione svizzera -43cf:00820000:2cec:013e:2:0 -Radio Dijla -p:RRSat -36d0:00820000:06a4:013e:2:0 -SSR-Rete Due -p:Radiotelevisione svizzera -36d1:00820000:06a4:013e:2:0 -SSR-Rete Tre -p:Radiotelevisione svizzera -38d1:00820000:2648:fbff:2:0 -Radio DeeJay -p:SkyItalia -38d2:00820000:2648:fbff:2:0 -M2O -p:SkyItalia -38d3:00820000:2648:fbff:2:0 -Radio 105 -p:SkyItalia -38d4:00820000:2648:fbff:2:0 -Virgin Radio -p:SkyItalia -38d5:00820000:2648:fbff:2:0 -Radio Capital -p:SkyItalia -36d6:00820000:06a4:013e:2:0 -SSR-WRS -p:Radio Television Suisse -38d6:00820000:2648:fbff:2:0 -Radio KissKiss -p:SkyItalia -36d7:00820000:06a4:013e:2:0 -SSR-CH-Classique -p:Swiss Satellite Radio -38d7:00820000:2648:fbff:2:0 -RTL 102.5 -p:SkyItalia -38d8:00820000:2648:fbff:2:0 -R 101 -p:SkyItalia -38d9:00820000:2648:fbff:2:0 -Radio Italia -p:SkyItalia -06da:00820000:3138:013e:2:0 -Chanson -p:GlobeCast -38da:00820000:2648:fbff:2:0 -Radio 24 -p:SkyItalia -06db:00820000:3138:013e:2:0 -Radio 2M -p:GlobeCast -38db:00820000:2648:fbff:2:0 -RDS -p:SkyItalia -02dc:00820000:1b58:013e:2:0 -Radio Maria -p:Telespazio -38dc:00820000:2648:fbff:2:0 -Radio Montecarlo -p:SkyItalia -44dc:00820000:0258:013e:2:0 -Radio KASZEBE -p:Arqiva -02dd:00820000:1b58:013e:2:0 -Rik3 -p:Telespazio -0dde:00820000:3c8c:013e:2:0 -DW05 -p:MEDIA BROADCAST -02e0:00820000:1b58:013e:2:0 -RDS -p:Telespazio -02e1:00820000:1b58:013e:2:0 -DimSuono Roma -p:Telespazio -02e2:00820000:1b58:013e:2:0 -ANNI 60 -p:Telespazio -02e7:00820000:1b58:013e:2:0 -Popolare -p:Telespazio -02e8:00820000:1b58:013e:2:0 -Radio PadrePio -p:Telespazio -12e8:00820000:2e7c:013e:2:0 -CYFRA+ RADIO -p:CYFRA + -3be8:00820000:0064:fbff:2:0 -50 songs -p:SkyItalia -01e9:00820000:1964:013e:2:0 -Sana radio -p:JMC -3be9:00820000:0064:fbff:2:0 -Yesterjay '80 -p:SkyItalia -01ea:00820000:1964:013e:2:0 -Aden Radio -p:JMC -12ea:00820000:2e7c:013e:2:0 -CYFRA+ RMF -p:CYFRA + -3bea:00820000:0064:fbff:2:0 -Yesterjay '90 -p:SkyItalia -01eb:00820000:1964:013e:2:0 -Syria R3 -p:JMC -32eb:00820000:0190:013e:2:0 -EUSP PL AUDIO -p:CYFRA + -35eb:00820000:00c8:013e:2:0 -Prod ESP2 -p:Eutelsat -3beb:00820000:0064:fbff:2:0 -Hit Italia -p:SkyItalia -01ec:00820000:1964:013e:2:0 -Syria R2 -p:JMC -12ec:00820000:2e7c:013e:2:0 -CYFRA+ PR -p:CYFRA + -3bec:00820000:0064:fbff:2:0 -ItalianVintage -p:SkyItalia -01ed:00820000:1964:013e:2:0 -Syria R1 -p: -02ed:00820000:1b58:013e:2:0 -R.Eurospin -p:Telespazio -10ed:00820000:03e8:013e:2:0 -Test_Radio -p:TVN -12ed:00820000:2e7c:013e:2:0 -JASNA GORA -p:CYFRA + -39ed:00820000:1fa4:013e:2:0 -PEIRAIKI EKKLISIA -p:EUTELSAT -01ee:00820000:1964:013e:2:0 -TSR Turkce -p:JMC -1eee:00820000:21fc:013e:2:0 -RADIO QURAN -p:IRIB -01ef:00820000:1964:013e:2:0 -TRT FM -p:JMC -0cef:00820000:1518:013e:2:0 -Rai Radio1 -p:RAI -1eef:00820000:21fc:013e:2:0 -SEDAYE ASHNA1 -p:IRIB -01f0:00820000:1964:013e:2:0 -Voice of Turkey World -p:JMC -0cf0:00820000:1518:013e:2:0 -Rai Radio2 -p:RAI -0cf1:00820000:1518:013e:2:0 -Rai Radio3 -p:RAI -0cf2:00820000:1450:013e:2:0 -Rai radiofd4 -p:RAI -0cf3:00820000:1518:013e:2:0 -Rai radiofd5 -p:RAI -02f4:00820000:1b58:013e:2:0 -Radio ZETA -p:Telespazio -0bf4:00820000:20d0:013e:2:0 -Radio Zara -p:GlobeCast -0cf4:00820000:1518:013e:2:0 -BLUSAT2000 -p:RAI -0bf5:00820000:20d0:013e:2:0 -Dmitsi Hafash -p:GlobeCast -0cf5:00820000:1518:013e:2:0 -GR Parlam. -p:RAI -1ef5:00820000:21fc:013e:2:0 -RADIO IRAN -p:IRIB -0cf6:00820000:1518:013e:2:0 -Rai isoradio -p:RAI -0cf7:00820000:1450:013e:2:0 -Notturno italiano -p:RAI -1ef7:00820000:21fc:013e:2:0 -COI Radio -p:IRIB -0cf8:00820000:1518:013e:2:0 -Radio Vaticana -p:RAI -02f9:00820000:1b58:013e:2:0 -Radio RADICALE -p:Telespazio -1efa:00820000:21fc:013e:2:0 -IRIB1/IRIB2 -p:IRIB -1efb:00820000:21fc:013e:2:0 -IRIB5/IRIB4 -p:IRIB -08fc:00820000:3d54:013e:2:0 -Era 3 -p: -0dfc:00820000:3c8c:013e:2:0 -DW08 -p:MEDIA BROADCAST -1efc:00820000:21fc:013e:2:0 -IRIB3/IRIB6 -p:IRIB -29fe:00820000:3cf0:013e:2:0 -RTL 102.5 -p:GlobeCast_Italia -3bfe:00820000:0064:fbff:2:0 -Capital '70 -p:SkyItalia -12ff:00820000:2e7c:013e:2:0 -tech 2 -p:CYFRA + -29ff:00820000:3cf0:013e:2:0 -Romania_In_direct -p:GlobeCast -3bff:00820000:0064:fbff:2:0 -Vintage '60 -p:SkyItalia -0bb8:00820000:1a2c:fbff:4:0 - -p:SkyItalia -0fa2:00820000:3c28:013e:7:0 -SSU TV GLOBO -p:GlobeCast -126d:00820000:0708:00c8:8:0 -NETINSAT.COM -p:M-Three satcom -0101:00820000:2e18:00b0:12:0 -MAP_SAT -p:PRVDR -0007:00820000:2e18:00b0:12:0 -MAP SAT -p:PRVDR -0110:00820000:3070:013e:12:0 -DVB-SSU DBC -p:Intellibyte Inc -3b24:00820000:012c:013e:12:0 -Invoice -p:ITI -292b:00820000:1edc:0071:12:0 -CP_Download -p:Cyfrowy Polsat S.A. -292c:00820000:1edc:0071:12:0 -CP_Download_CPT -p:Cyfrowy Polsat S.A. -4233:00820000:3db8:013e:12:0 -OTA 6500 -p:telespazio -3b38:00820000:0514:013e:12:0 -pVOD -p:ITI -2960:00820000:1edc:0071:12:0 -CP_download_D4 -p:Cyfrowy Polsat S.A. -2961:00820000:1edc:0071:12:0 -Sagem_Software -p:Cyfrowy Polsat S.A. -1d77:00820000:2f44:013e:12:0 -IPE 3 -p:??? -1f77:00820000:319c:013e:12:0 -Test_1 -p:MEDIA BROADCAST -02ca:00820000:1b58:013e:12:0 -IP DATA -p:Telespazio -3aca:00820000:0514:013e:12:0 -Upload -p:ITI -3ad4:00820000:0514:013e:12:0 -Invoice -p:ITI -0de8:00820000:2d50:013e:12:0 -Invoice -p:ITI -0001:00820000:3200:013e:25:0 -MTV Live HD -p:MTV Networks Europe -2b0f:00820000:1900:fbff:25:0 -Sky Sport 1 HD -p:SkyItalia -1010:00820000:1d4c:fbff:25:0 -Cinema Hits HD -p:SkyItalia -2b10:00820000:1900:fbff:25:0 -Sky Sport 2 HD -p:SkyItalia -1011:00820000:1d4c:fbff:25:0 -Cinema Max HD -p:SkyItalia -2b12:00820000:1900:fbff:25:0 -Sky Sport 2 HD -p:SkyItalia -2b13:00820000:1900:fbff:25:0 -Discovery Sci HD -p:SkyItalia -0015:00820000:3200:013e:25:0 -MTV Live HD -p:MTV Networks Europe -1015:00820000:1d4c:fbff:25:0 -Discovery HD -p:SkyItalia -2b16:00820000:1900:fbff:25:0 -Cinema Comedy HD -p:SkyItalia -2b18:00820000:1900:fbff:25:0 -Cinema Classics HD -p:SkyItalia -2b1b:00820000:1900:fbff:25:0 -Sky Sport24 HD -p:SkyItalia -2b1d:00820000:1900:fbff:25:0 -Sky Sport24 HD -p:SkyItalia -1020:00820000:1d4c:fbff:25:0 -Disney Ch. HD -p:SkyItalia -1e20:00820000:15e0:fbff:25:0 -Primafila 11 HD -p:SkyItalia -2b20:00820000:1900:fbff:25:0 -Sky Sport24 HD -p:SkyItalia -1e21:00820000:15e0:fbff:25:0 -Primafila 13 HD -p:SkyItalia -1e22:00820000:15e0:fbff:25:0 -NatGeo Adv HD -p:SkyItalia -1c28:00820000:206c:fbff:25:0 -Sky Sport 3 HD -p:SkyItalia -1c29:00820000:206c:fbff:25:0 -Sky Supercalcio HD -p:SkyItalia -4331:00820000:300c:013e:25:0 -SF 1 HD -p:Schweizer Fernsehen -1c32:00820000:206c:fbff:25:0 -DiscoveryT&L HD -p:SkyItalia -1e32:00820000:15e0:fbff:25:0 -Cinema Max +1 HD -p:SkyItalia -4332:00820000:300c:013e:25:0 -SF zwei HD -p:Schweizer Fernsehen -1e33:00820000:15e0:fbff:25:0 -Cinema Classics HD -p:SkyItalia -4333:00820000:300c:013e:25:0 -RTS Un HD -p:Radio Television Suisse -1e34:00820000:15e0:fbff:25:0 -Primafila 1 HD -p:SkyItalia -4334:00820000:300c:013e:25:0 -RTS Deux HD -p:Radio Television Suisse -1e35:00820000:15e0:fbff:25:0 -Primafila 3 HD -p:SkyItalia -4335:00820000:300c:013e:25:0 -Test17205 -p:SRG SSR -1e36:00820000:15e0:fbff:25:0 -Primafila 5 HD -p:SkyItalia -1e37:00820000:15e0:fbff:25:0 -Primafila 7 HD -p:SkyItalia -1e38:00820000:15e0:fbff:25:0 -Primafila 9 HD -p:SkyItalia -1e3c:00820000:15e0:fbff:25:0 -Discovery HD -p:SkyItalia -0f3d:00820000:2198:fbff:25:0 -ExtremeSportsHD -p:SkyItalia -1e3d:00820000:15e0:fbff:25:0 -NationalGeo HD -p:SkyItalia -0f3e:00820000:2198:fbff:25:0 -Sky Uno HD -p:SkyItalia -1c3e:00820000:206c:fbff:25:0 -Sky Supercalcio HD -p:SkyItalia -1e3e:00820000:15e0:fbff:25:0 -Discovery Sci HD -p:SkyItalia -0f3f:00820000:2198:fbff:25:0 -Fox HD -p:SkyItalia -1c3f:00820000:206c:fbff:25:0 -Cinema Passion HD -p:SkyItalia -1e3f:00820000:15e0:fbff:25:0 -DiscoveryT&L HD -p:SkyItalia -1e40:00820000:15e0:fbff:25:0 -History HD -p:SkyItalia -0f41:00820000:2198:fbff:25:0 -Sky 3D -p:SkyItalia -1e41:00820000:15e0:fbff:25:0 -NatGeo Wild HD -p:SkyItalia -0f42:00820000:2198:fbff:25:0 -Sky 3D -p:SkyItalia -1e42:00820000:15e0:fbff:25:0 -GamberoRossoHD -p:SkyItalia -0f43:00820000:2198:fbff:25:0 -Sky 3D -p:SkyItalia -1e43:00820000:15e0:fbff:25:0 -Disney Ch. HD -p:SkyItalia -0f44:00820000:2198:fbff:25:0 -Sky 3D -p:SkyItalia -1e44:00820000:15e0:fbff:25:0 -MTV LIVE HD -p:SkyItalia -0f45:00820000:2198:fbff:25:0 -Sky 3D -p:SkyItalia -0f46:00820000:2198:fbff:25:0 -Sky Calcio 5 HD -p:SkyItalia -0f47:00820000:2198:fbff:25:0 -Fox Life HD -p:SkyItalia -0f48:00820000:2198:fbff:25:0 -Sky Calcio 6 HD -p:SkyItalia -1e48:00820000:15e0:fbff:25:0 -Sky Sport Extra HD -p:SkyItalia -0d49:00820000:1450:013e:25:0 -Rai HD -p:Rai -0f49:00820000:2198:fbff:25:0 -Fox Crime HD -p:SkyItalia -0f4a:00820000:2198:fbff:25:0 -AXN HD -p:SkyItalia -0f4b:00820000:2198:fbff:25:0 -Real Time HD -p:SkyItalia -0f4c:00820000:2198:fbff:25:0 -Primafila 7 HD -p:SkyItalia -0f4e:00820000:2198:fbff:25:0 -Sky Sport 2 HD -p:SkyItalia -0f4f:00820000:2198:fbff:25:0 -Sky Supercalcio HD -p:SkyItalia -0f50:00820000:2198:fbff:25:0 -Eurosport HD -p:SkyItalia -0f51:00820000:2198:fbff:25:0 -Eurosport 2 HD -p:SkyItalia -0f52:00820000:2198:fbff:25:0 -ESPN America HD -p:SkyItalia -0f53:00820000:2198:fbff:25:0 -Sky Calcio 1 HD -p:SkyItalia -1c53:00820000:206c:fbff:25:0 -DiscoveryT&L HD -p:SkyItalia -0f54:00820000:2198:fbff:25:0 -Sky Calcio 2 HD -p:SkyItalia -1c57:00820000:206c:fbff:25:0 -CinemaFamilyHD -p:SkyItalia -0f59:00820000:2198:fbff:25:0 -Sky Calcio 7 HD -p:SkyItalia -0f5a:00820000:2198:fbff:25:0 -Sky Calcio 8 HD -p:SkyItalia -0f5b:00820000:2198:fbff:25:0 -Sky Sport 3 HD -p:SkyItalia -1e5b:00820000:15e0:fbff:25:0 -Primafila 1 HD -p:SkyItalia -0f5c:00820000:2198:fbff:25:0 -Sky Sport Extra HD -p:SkyItalia -1e5c:00820000:15e0:fbff:25:0 -Sky Calcio 8 HD -p:SkyItalia -0f5d:00820000:2198:fbff:25:0 -Sky Calcio 3 HD -p:SkyItalia -0f5e:00820000:2198:fbff:25:0 -Sky Calcio 4 HD -p:SkyItalia -0f5f:00820000:2198:fbff:25:0 -Sky Calcio 5 HD -p:SkyItalia -1e5f:00820000:15e0:fbff:25:0 -Sky Calcio 7 HD -p:SkyItalia -0f60:00820000:2198:fbff:25:0 -Sky Calcio 6 HD -p:SkyItalia -1e60:00820000:15e0:fbff:25:0 -Primafila 3 HD -p:SkyItalia -0f61:00820000:2198:fbff:25:0 -Cinema 1 HD -p:SkyItalia -0f62:00820000:2198:fbff:25:0 -Cinema +1 HD -p:SkyItalia -0f63:00820000:2198:fbff:25:0 -Cinema +24 HD -p:SkyItalia -0f64:00820000:2198:fbff:25:0 -Cinema Hits HD -p:SkyItalia -0f65:00820000:2198:fbff:25:0 -CinemaFamilyHD -p:SkyItalia -0f67:00820000:2198:fbff:25:0 -Cinema Passion HD -p:SkyItalia -0f68:00820000:2198:fbff:25:0 -Cinema Comedy HD -p:SkyItalia -0f69:00820000:2198:fbff:25:0 -Cinema Max HD -p:SkyItalia -0f6a:00820000:2198:fbff:25:0 -Sky Sport 1 HD -p:SkyItalia -106a:00820000:2008:fbff:25:0 -Cinema 1 HD -p:SkyItalia -3779:00820000:14b4:fbff:25:0 -AXN HD -p:SkyItalia -377a:00820000:044c:013e:25:0 -CANAL+ GOL HD -p:CYFRA+ -377b:00820000:044c:013e:25:0 -C+ WEEKEND HD -p:CYFRA+ -377c:00820000:044c:013e:25:0 -MINIMINI+ HD -p:CYFRA+ -377d:00820000:044c:013e:25:0 -teleTOON+ HD -p:CYFRA+ -377e:00820000:044c:013e:25:0 -PLANETE+ HD -p:CYFRA+ -377f:00820000:044c:013e:25:0 -KUCHNIA+ HD -p:CYFRA+ -3780:00820000:044c:013e:25:0 -DOMO+ HD -p:CYFRA+ -3781:00820000:044c:013e:25:0 -ALE KINO+ HD -p:CYFRA+ -3782:00820000:044c:013e:25:0 -CANAL+ 3D -p:CYFRA+ -1089:00820000:2008:fbff:25:0 -Sky Calcio 3 HD -p:SkyItalia -108a:00820000:2008:fbff:25:0 -Sky Calcio 4 HD -p:SkyItalia -108b:00820000:2008:fbff:25:0 -Primafila 9 HD -p:SkyItalia -108f:00820000:2008:fbff:25:0 -Primafila 11 HD -p:SkyItalia -379a:00820000:044c:013e:25:0 -MINIMINI+ HD -p:CYFRA+ -379b:00820000:044c:013e:25:0 -teleTOON+ HD -p:CYFRA+ -379c:00820000:044c:013e:25:0 -PLANETE+ HD -p:CYFRA+ -379c:00820000:14b4:fbff:25:0 -NationalGeo HD -p:SkyItalia -379d:00820000:044c:013e:25:0 -KUCHNIA+ HD -p:CYFRA+ -379d:00820000:14b4:fbff:25:0 -Fox HD -p:SkyItalia -379e:00820000:044c:013e:25:0 -DOMO+ HD -p:CYFRA+ -379e:00820000:14b4:fbff:25:0 -Fox Crime HD -p:SkyItalia -379f:00820000:044c:013e:25:0 -ALE KINO+ HD -p:CYFRA+ -37a6:00820000:14b4:fbff:25:0 -Sky Uno HD -p:SkyItalia -37aa:00820000:14b4:fbff:25:0 -Primafila 20 HD -p:SkyItalia -0dae:00820000:1af4:fbff:25:0 -Focus HD -p:SkyItalia -0db0:00820000:1af4:fbff:25:0 -GamberoRossoHD -p:SkyItalia -03b7:00820000:2134:013e:25:0 -RSI LA 2 HD -p:Radiotelevisione svizzera -0db7:00820000:1af4:fbff:25:0 -GamberoRossoHD -p:SkyItalia -0db8:00820000:1af4:fbff:25:0 -Fox Life HD -p:SkyItalia -0db9:00820000:1af4:fbff:25:0 -History HD -p:SkyItalia -0dba:00820000:1af4:fbff:25:0 -NatGeo Adv HD -p:SkyItalia -0dbb:00820000:1af4:fbff:25:0 -NatGeo Wild HD -p:SkyItalia -24be:00820000:2260:fbff:25:0 -Primafila 13 HD -p:SkyItalia -24bf:00820000:2260:fbff:25:0 -Primafila 5 HD -p:SkyItalia -24c3:00820000:2260:fbff:25:0 -Sky Calcio 1 HD -p:SkyItalia -24c4:00820000:2260:fbff:25:0 -Sky Calcio 2 HD -p:SkyItalia -37c9:00820000:044c:013e:25:0 -CYFRA+ PPV test -p:CYFRA+ -37d2:00820000:14b4:fbff:25:0 -Primafila 20 HD -p:SkyItalia -36e3:00820000:06a4:013e:25:0 -RSI LA 1 HD -p:Radiotelevisione svizzera -2cf1:00820000:2774:fbff:25:0 -ESPN America HD -p:SkyItalia -2cf2:00820000:2774:fbff:25:0 -ExtremeSportsHD -p:SkyItalia -2cf3:00820000:2774:fbff:25:0 -Real Time HD -p:SkyItalia -2cf4:00820000:2774:fbff:25:0 -Cinema Max +1 HD -p:SkyItalia -2cf5:00820000:2774:fbff:25:0 -Cinema +24 HD -p:SkyItalia -2cff:00820000:2774:fbff:25:0 -Cinema +1 HD -p:SkyItalia -0bb9:00820000:2198:fbff:27:0 -PUSH REF HD 3001 -p:SkyItalia -1001:00820000:2db4:fbff:100:0 -10853H SID 0x1001 -p:DVB-S QPSK 10853H 13.0°E -1103:00820000:1644:fbff:100:0 -11861H SID 0x1103 -p:DVB-S QPSK 11861H 13.0°E -0016:00820000:1edc:0071:100:0 -12284H SID 0x16 -p:DVB-S QPSK 12284H 13.0°E -1322:00820000:2e7c:013e:100:0 -10892H SID 0x1322 -p:DVB-S QPSK 10892H 13.0°E -2c22:00820000:1a90:fbff:100:0 -12072V SID 0x2c22 -p:DVB-S QPSK 12072V 13.0°E -1323:00820000:2e7c:013e:100:0 -10892H SID 0x1323 -p:DVB-S QPSK 10892H 13.0°E -1144:00820000:2af8:013e:100:0 -10719V SID 0x1144 -p:DVB-S QPSK 10719V 13.0°E -1145:00820000:2af8:013e:100:0 -10719V SID 0x1145 -p:DVB-S QPSK 10719V 13.0°E -344f:00820000:2710:fbff:100:0 -12713V SID 0x344f -p:DVB-S QPSK 12713V 13.0°E -1158:00820000:2af8:013e:100:0 -10719V SID 0x1158 -p:DVB-S QPSK 10719V 13.0°E -1159:00820000:2af8:013e:100:0 -10719V SID 0x1159 -p:DVB-S QPSK 10719V 13.0°E -037a:00820000:3bc4:013e:100:0 -11566H SID 0x37a -p:DVB-S QPSK 11566H 13.0°E -2c80:00820000:251c:fbff:100:0 -12616H SID 0x2c80 -p:DVB-S QPSK 12616H 13.0°E -0187:00820000:1c84:013e:100:0 -12169H SID 0x187 -p:DVB-S QPSK 12169H 13.0°E -118a:00820000:2af8:013e:100:0 -10719V SID 0x118a -p:DVB-S QPSK 10719V 13.0°E -1d9b:00820000:2f44:013e:100:0 -10930H SID 0x1d9b -p:DVB-S QPSK 10930H 13.0°E -1d9c:00820000:2f44:013e:100:0 -10930H SID 0x1d9c -p:DVB-S QPSK 10930H 13.0°E -1d9d:00820000:2f44:013e:100:0 -10930H SID 0x1d9d -p:DVB-S QPSK 10930H 13.0°E -1d9e:00820000:2f44:013e:100:0 -10930H SID 0x1d9e -p:DVB-S QPSK 10930H 13.0°E -2daf:00820000:170c:fbff:100:0 -11900H SID 0x2daf -p:DVB-S QPSK 11900H 13.0°E -3db5:00820000:2c88:013e:100:0 -10796V SID 0x3db5 -p:DVB-S QPSK 10796V 13.0°E -3db6:00820000:2c88:013e:100:0 -10796V SID 0x3db6 -p:DVB-S QPSK 10796V 13.0°E -05d5:00820000:0320:fbff:100:0 -11355V SID 0x5d5 -p:DVB-S QPSK 11355V 13.0°E -2ce7:00820000:2580:fbff:100:0 -12635V SID 0x2ce7 -p:DVB-S QPSK 12635V 13.0°E -1fec:00820000:189c:fbff:100:0 -11976H SID 0x1fec -p:DVB-S QPSK 11976H 13.0°E -3bef:00820000:0064:fbff:100:0 -11219H SID 0x3bef -p:DVB-S QPSK 11219H 13.0°E -1bfa:00820000:17d4:013e:100:0 -11938H SID 0x1bfa -p:DVB-S QPSK 11938H 13.0°E -1162:00820000:2af8:013e:128:0 -EPG -p:CYFRA + -12fe:00820000:2e7c:013e:128:0 -tech -p:CYFRA + -0016:00820000:1e78:0071:129:0 -Consumer Cam -p:Cyfrowy Polsat S.A. -144f:00820000:05dc:013e:129:0 -5199 -p:CYFRA + -00e1:00820000:2e7c:013e:129:0 -PHILIPS DOWNLOAD 1.1 -p:WIZJA 1 -2b11:00820000:1900:fbff:130:0 -Sky Sport 1 HD -p:SkyItalia -2b1c:00820000:1900:fbff:130:0 -Sky Sport 24 HD -p:SkyItalia -3425:00820000:2710:fbff:130:0 -Modalita' d'Acquisto -p:SkyItalia -3428:00820000:2710:fbff:130:0 -PRIMAFILA HCZ -p:SkyItalia -1c34:00820000:206c:fbff:130:0 -Sky Sport 3 HD -p:SkyItalia -1037:00820000:1d4c:fbff:130:0 -FeedScherma HD -p:SkyItalia -0f40:00820000:2198:fbff:130:0 -Zapper3D -p:SkyItalia -1c40:00820000:206c:fbff:130:0 -Sky Supercalcio HD -p:SkyItalia -3454:00820000:2710:fbff:130:0 -goal Alert HD -p:SkyItalia -0e55:00820000:16a8:fbff:130:0 -Gestione Collegam. Telefonico -p:SkyItalia -2aab:00820000:1838:fbff:130:0 -Sport Active 1 -p:SkyItalia -2aac:00820000:1838:fbff:130:0 -Sports Active 2 -p:SkyItalia -2ab4:00820000:1838:fbff:130:0 -Sky Sport 24 -p:SkyItalia -2ab5:00820000:1838:fbff:130:0 -Sky Sport 1 -p:SkyItalia -2ab6:00820000:1838:fbff:130:0 -Sky Supercalcio -p:SkyItalia -2ab7:00820000:1838:fbff:130:0 -Sports Active 3 -p:SkyItalia -2db7:00820000:1a2c:fbff:130:0 -Cinema Active -p:SkyItalia -2db8:00820000:1a2c:fbff:130:0 -Cinema itv -p:SkyItalia -38cd:00820000:2648:fbff:130:0 -Sky Radio -p:SkyItalia -1fd1:00820000:189c:fbff:130:0 -Primafila Sky -p:SkyItalia -2dda:00820000:1a2c:fbff:130:0 -Sky Sport 3 -p:SkyItalia -38e2:00820000:2648:fbff:130:0 -Novita' Sky -p:SkyItalia -10e7:00820000:1644:fbff:130:0 -TG 24 - Mosaico -p:SkyItalia -3be7:00820000:0064:fbff:130:0 -Sky Music -p:SkyItalia -10e9:00820000:1644:fbff:130:0 -TG 24 - Feed 2 -p:SkyItalia -10eb:00820000:1644:fbff:130:0 -Guida Multilingua -p:SkyItalia -1002:00820000:2db4:fbff:131:0 -IEPG Data -p:SkyItalia -3005:00820000:2c24:fbff:131:0 -IEPG Data -p:SkyItalia -2006:00820000:189c:fbff:131:0 -IEPG Data -p:SkyItalia -0e0e:00820000:1af4:fbff:131:0 -IEPG Data -p:SkyItalia -2e17:00820000:1a2c:fbff:131:0 -IEPG Data -p:SkyItalia -251a:00820000:2260:fbff:131:0 -IEPG Data -p:SkyItalia -3c1d:00820000:0064:fbff:131:0 -IEPG Data -p:SkyItalia -2c23:00820000:1a90:fbff:131:0 -IEPG Data -p:SkyItalia -112e:00820000:1644:fbff:131:0 -IEPG Data -p:SkyItalia -294a:00820000:1edc:0071:131:0 -Portal ITV -p:Cyfrowy Polsat S.A. -2d4f:00820000:2774:fbff:131:0 -IEPG Data -p:SkyItalia -3451:00820000:2710:fbff:131:0 -IEPG Data -p:SkyItalia -2b57:00820000:1900:fbff:131:0 -IEPG Data -p:SkyItalia -1063:00820000:1d4c:fbff:131:0 -IEPG Data -p:SkyItalia -0e70:00820000:16a8:fbff:131:0 -IEPG Data -p:SkyItalia -1e76:00820000:15e0:fbff:131:0 -IEPG Data -p:SkyItalia -1c80:00820000:206c:fbff:131:0 -IEPG Data -p:SkyItalia -2c87:00820000:251c:fbff:131:0 -IEPG Data -p:SkyItalia -0f89:00820000:2198:fbff:131:0 -IEPG Data -p:SkyItalia -0dab:00820000:1450:013e:131:0 -download -p:Rai -2db3:00820000:170c:fbff:131:0 -IEPG Data -p:SkyItalia -2bbf:00820000:19c8:fbff:131:0 -IEPG Data -p:SkyItalia -10ca:00820000:2008:fbff:131:0 -IEPG Data -p:SkyItalia -05d7:00820000:0320:fbff:131:0 -IEPG Data -p:SkyItalia -37d7:00820000:14b4:fbff:131:0 -IEPG Data -p:SkyItalia -2ceb:00820000:2580:fbff:131:0 -IEPG Data -p:SkyItalia -2af7:00820000:1838:fbff:131:0 -IEPG Data -p:SkyItalia -38ff:00820000:2648:fbff:131:0 -IEPG Data -p:SkyItalia -2e15:00820000:1a2c:fbff:132:0 -Dl861 -p:SkyItalia -2518:00820000:2260:fbff:132:0 -Dl1011 -p:SkyItalia -2519:00820000:2260:fbff:132:0 -Dl1012 -p:SkyItalia -2c21:00820000:1a90:fbff:132:0 -Dl681 -p:SkyItalia -2d49:00820000:2774:fbff:132:0 -Dl671 -p:SkyItalia -2b55:00820000:1900:fbff:132:0 -Dl641 -p:SkyItalia -0e57:00820000:16a8:fbff:132:0 -FGDL_5800 -p:SkyItalia -0e5a:00820000:16a8:fbff:132:0 -BGDL_5800 -p:SkyItalia -295f:00820000:1edc:0071:132:0 -SAMSUNG370 -p:Cyfrowy Polsat S.A. -0f87:00820000:2198:fbff:132:0 -Dl951 -p:SkyItalia -0f8a:00820000:2198:fbff:132:0 -Dl583 -p:SkyItalia -2dae:00820000:170c:fbff:132:0 -Dl821 -p:SkyItalia -2bbd:00820000:19c8:fbff:132:0 -BGDL_6600 -p:SkyItalia -1cd4:00820000:1ce8:0071:132:0 -Samsung2 -p:Cyfrowy Polsat S.A. -2ce6:00820000:2580:fbff:132:0 -Dl591 -p:SkyItalia -1ce7:00820000:1ce8:0071:132:0 -HD2000 -p: -1fed:00820000:189c:fbff:132:0 -FGDL_6300 -p:SkyItalia -1fee:00820000:189c:fbff:132:0 -BGDL_6300 -p:SkyItalia -1fef:00820000:189c:fbff:132:0 -Downl IKUSI -p:SkyItalia -2af0:00820000:1838:fbff:132:0 -Dl622 -p:SkyItalia -2af5:00820000:1838:fbff:132:0 -Dl621 -p:SkyItalia -38fd:00820000:2648:fbff:132:0 -FGDL_800 -p:SkyItalia -2937:00820000:1edc:0071:143:0 -EDCPH -p:Cyfrowy Polsat S.A. -8fff:00820000:1edc:0071:143:0 -EDCPS -p:Cyfrowy Polsat S.A. -0e56:00820000:16a8:fbff:144:0 -Connessione internet Primafila -p:SkyItalia -2dc9:00820000:1a2c:fbff:144:0 -Cinema Active -p:SkyItalia -38ce:00820000:2648:fbff:144:0 -Sky Radio -p:SkyItalia -1fd2:00820000:189c:fbff:144:0 -Primafila Sky -p:SkyItalia -38e3:00820000:2648:fbff:144:0 -Novita' Sky -p:SkyItalia -3bee:00820000:0064:fbff:144:0 -Sky Music -p:SkyItalia -1d98:00820000:2f44:013e:145:0 -Eepg -p:NetMed -0017:00820000:1edc:0071:171:0 -Strefa Abonenta -p:Cyfrowy Polsat S.A. -0e59:00820000:16a8:fbff:250:0 -DL IKUSI EPG -p:SkyItalia -2c7f:00820000:251c:fbff:250:0 -XDOME -p:SkyItalia -2bbc:00820000:19c8:fbff:250:0 -DL IKUSI MI -p:SkyItalia -38fe:00820000:2648:fbff:250:0 -ikusi -p:SkyItalia -end -Have a lot of bugs! diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.192 b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.192 deleted file mode 100755 index 096a943..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.192 +++ /dev/null @@ -1,4962 +0,0 @@ -eDVB services /4/ -transponders -00c00000:03eb:0001 - s 11243750:22000000:0:4:192:2:0 -/ -00c00000:03ef:0001 - s 11302750:22000000:0:2:192:2:0:1:2:0:2 -/ -00c00000:03f0:0001 - s 11317500:22000000:1:4:192:2:0 -/ -00c00000:03f2:0001 - s 11347000:22000000:1:2:192:2:0:1:2:0:2 -/ -00c00000:03f3:0001 - s 11361750:22000000:0:2:192:2:0:1:2:0:2 -/ -00c00000:03f4:0001 - s 11376500:22000000:1:2:192:2:0:1:2:0:2 -/ -00c00000:03f7:0001 - s 11420750:22000000:0:4:192:2:0 -/ -00c00000:03f8:0001 - s 11435500:22000000:1:2:192:2:0:1:2:0:2 -/ -00c00000:03f9:0001 - s 11464250:22000000:0:2:192:2:0:1:2:0:2 -/ -00c00000:03fa:0001 - s 11479000:22000000:1:4:192:2:0 -/ -00c00000:03fb:0001 - s 11493750:22000000:0:2:192:2:0:1:2:0:2 -/ -00c00000:03fc:0001 - s 11508500:22000000:1:4:192:2:0 -/ -00c00000:03fd:0001 - s 11523250:22000000:0:4:192:2:0 -/ -00c00000:03fe:0001 - s 11538000:22000000:1:4:192:2:0 -/ -00c00000:0400:0001 - s 11567500:22000000:1:4:192:2:0 -/ -00c00000:0401:0001 - s 11582250:22000000:0:2:192:2:0:1:2:0:2 -/ -00c00000:0402:0001 - s 11597000:22000000:1:4:192:2:0 -/ -00c00000:0403:0001 - s 11611750:22000000:0:4:192:2:0 -/ -00c00000:0404:0001 - s 11626500:22000000:1:2:192:2:0:1:2:0:2 -/ -00c00000:0405:0001 - s 11641250:22000000:0:3:192:2:0:1:2:2:2 -/ -00c00000:0407:0001 - s 11670750:22000000:0:2:192:2:0:1:2:0:2 -/ -00c00000:0408:0001 - s 11685500:22000000:1:4:192:2:0 -/ -00c00000:040a:0001 - s 10979000:22000000:1:4:192:2:0 -/ -00c00000:040d:0001 - s 11023250:22000000:0:4:192:2:0 -/ -00c00000:040e:0001 - s 11038000:22000000:1:4:192:2:0 -/ -00c00000:0410:0001 - s 11067500:22000000:1:4:192:2:0 -/ -00c00000:0412:0001 - s 11097000:22000000:1:4:192:2:0 -/ -00c00000:0414:0001 - s 11126500:22000000:1:2:192:2:0:1:2:0:2 -/ -00c00000:0416:0001 - s 11156000:22000000:1:4:192:2:0 -/ -00c00000:0417:0001 - s 11170750:22000000:0:2:192:2:0:1:2:0:2 -/ -00c00000:041a:0001 - s 10729000:22000000:1:2:192:2:0:1:2:0:2 -/ -00c00000:041b:0001 - s 10743750:22000000:0:4:192:2:0 -/ -00c00000:041c:0001 - s 10758500:22000000:1:4:192:2:0 -/ -00c00000:041d:0001 - s 10773250:22000000:0:3:192:2:0:1:2:2:2 -/ -00c00000:041e:0001 - s 10788000:22000000:1:4:192:2:0 -/ -00c00000:0420:0001 - s 10817500:22000000:1:2:192:2:0:1:2:0:2 -/ -00c00000:0421:0001 - s 10832250:22000000:0:2:192:2:0:1:2:0:2 -/ -00c00000:0422:0001 - s 10847000:22000000:1:4:192:2:0 -/ -00c00000:0423:0001 - s 10861750:22000000:0:5:192:2:0 -/ -00c00000:0424:0001 - s 10876500:22000000:1:4:192:2:0 -/ -00c00000:0428:0001 - s 10935500:22000000:1:2:192:2:0:1:2:0:2 -/ -00c00000:042a:0001 - s 11739000:27500000:1:3:192:2:0 -/ -00c00000:042c:0001 - s 11778000:27500000:1:3:192:2:0 -/ -00c00000:042e:0001 - s 11817000:27500000:1:3:192:2:0 -/ -00c00000:0430:0001 - s 11856000:27500000:1:3:192:2:0 -/ -00c00000:0431:0001 - s 12109500:27500000:0:3:192:2:0 -/ -00c00000:0432:0001 - s 11895000:27500000:1:3:192:2:0 -/ -00c00000:0434:0001 - s 11934000:27500000:1:3:192:2:0 -/ -00c00000:0436:0001 - s 11973000:27500000:1:3:192:2:0 -/ -00c00000:0437:0001 - s 11953500:27500000:0:3:192:2:0 -/ -00c00000:0438:0001 - s 12012000:29700000:1:2:192:2:0:1:2:1:2 -/ -00c00000:043a:0001 - s 12051000:27500000:1:3:192:2:0 -/ -00c00000:043c:0001 - s 12090000:27500000:1:3:192:2:0 -/ -00c00000:043e:0001 - s 12129000:27500000:1:3:192:2:0 -/ -00c00000:0440:0001 - s 12168000:29700000:1:2:192:2:0:1:2:1:2 -/ -00c00000:0441:0001 - s 12187500:27500000:0:3:192:2:0 -/ -00c00000:0442:0001 - s 12207000:29700000:1:2:192:2:0:1:2:1:2 -/ -00c00000:0443:0001 - s 12226500:27500000:0:3:192:2:0 -/ -00c00000:0444:0001 - s 12246000:29700000:1:2:192:2:0:1:2:1:2 -/ -00c00000:0445:0001 - s 12265500:27500000:0:3:192:2:0 -/ -00c00000:0446:0001 - s 12285000:27500000:1:3:192:2:0 -/ -00c00000:0448:0001 - s 12324000:27500000:1:3:192:2:0 -/ -00c00000:044a:0001 - s 12363000:27500000:1:3:192:2:0 -/ -00c00000:044c:0001 - s 12402000:27500000:1:3:192:2:0 -/ -00c00000:044d:0001 - s 11836500:27500000:0:3:192:2:0 -/ -00c00000:044e:0001 - s 12441000:29700000:1:2:192:2:0:1:2:1:2 -/ -00c00000:0452:0001 - s 12522000:22000000:1:4:192:2:0 -/ -00c00000:0453:0001 - s 12544750:22000000:0:4:192:2:0 -/ -00c00000:0454:0001 - s 12551500:22000000:1:4:192:2:0 -/ -00c00000:0455:0001 - s 12574250:22000000:0:2:192:2:0:1:2:0:2 -/ -00c00000:0456:0001 - s 12581000:22000000:1:4:192:2:0 -/ -00c00000:0457:0001 - s 12603750:22000000:0:4:192:2:0 -/ -00c00000:0458:0001 - s 12610500:22000000:1:4:192:2:0 -/ -00c00000:0459:0001 - s 12633250:22000000:0:4:192:2:0 -/ -00c00000:045a:0001 - s 12640000:22000000:1:4:192:2:0 -/ -00c00000:045b:0001 - s 12662750:22000000:0:4:192:2:0 -/ -00c00000:045c:0001 - s 12669500:22000000:1:2:192:2:0:1:2:0:2 -/ -00c00000:045d:0001 - s 12692250:22000000:0:4:192:2:0 -/ -00c00000:045e:0001 - s 12699000:22000000:1:4:192:2:0 -/ -00c00000:0460:0001 - s 12728500:22000000:1:4:192:2:0 -/ -00c00000:04b1:0001 - s 12421500:27500000:0:3:192:2:0 -/ -00c00000:0449:0035 - s 12343500:27500000:0:3:192:2:0 -/ -00c00000:0451:0035 - s 12515250:22000000:0:4:192:2:0 -/ -00c00000:045f:0035 - s 12721750:22000000:0:4:192:2:0 -/ -00c00000:0001:0085 - s 12070500:27500000:0:3:192:2:0 -/ -00c00000:0002:0085 - s 11797500:27500000:0:3:192:2:0 -/ -00c00000:0003:0085 - s 11719500:27500000:0:3:192:2:0 -/ -00c00000:0004:0085 - s 12031500:27500000:0:3:192:2:0 -/ -00c00000:0005:0085 - s 12460500:27500000:0:3:192:2:0 -/ -00c00000:0006:0085 - s 11914500:27500000:0:9:192:2:0:1:1:0:2 -/ -00c00000:0007:0085 - s 12148500:27500000:0:3:192:2:0 -/ -00c00000:000b:0085 - s 12382500:27500000:0:9:192:2:0:1:1:0:2 -/ -00c00000:000c:0085 - s 12304500:27500000:0:9:192:2:0:1:1:0:2 -/ -00c00000:000d:0085 - s 11992500:27500000:0:9:192:2:0:1:1:0:2 -/ -00c00000:000e:0085 - s 11875500:27500000:0:9:192:2:0:1:1:0:2 -/ -00c00000:000f:0085 - s 10920750:22000000:0:5:192:2:0 -/ -00c00000:0011:0085 - s 11758500:27500000:0:3:192:2:0 -/ -00c00000:0021:0085 - s 12480000:27500000:1:3:192:2:0 -/ -end -services -2146:00c00000:0400:0001:0:0 - -p: -75e8:00c00000:0422:0001:0:0 - -p: -75e9:00c00000:0422:0001:0:0 - -p: -75ea:00c00000:0422:0001:0:0 - -p: -75eb:00c00000:0422:0001:0:0 - -p: -75ec:00c00000:0422:0001:0:0 - -p: -13f6:00c00000:0403:0001:0:0 -RTB -p: -13f7:00c00000:0403:0001:0:0 -RTI 1 -p: -75fb:00c00000:0408:0001:0:0 - -p: -0300:00c00000:0007:0085:1:0 -RNF -p:BetaDigital -1200:00c00000:03fd:0001:1:0 -Bay TV 3 -p:BetaDigital -1b00:00c00000:03fe:0001:1:0 -CCTV9 Documentary -p:GlobeCast -2b00:00c00000:0417:0001:1:0 -ORANGE SPORT INFO -p:GlobeCast France -0201:00c00000:0004:0085:1:0 -†Blue‡ †M‡ovie -p:SKY,C:1810,C:1861 -0301:00c00000:0007:0085:1:0 -Channel21 -p:BetaDigital -0701:00c00000:0005:0085:1:0 -†D‡AS† VIERTE‡ -p:BetaDigital -1201:00c00000:03fd:0001:1:0 -Bay TV 4 -p:BetaDigital -1901:00c00000:03fa:0001:1:0 -TV5 MONDE -p:CSAT -1b01:00c00000:03fe:0001:1:0 -CCTV F -p:GlobeCast -2201:00c00000:044c:0001:1:0 -DISNEY XD -p:CSAT -2b01:00c00000:0417:0001:1:0 -KidsCo -p:OrangeSAT -7001:00c00000:0436:0001:1:0 -MTV Germany -p:MTV Networks Europe -7601:00c00000:0408:0001:1:0 -R. MADRID TV -p:Digital+ -0202:00c00000:0007:0085:1:0 -JML Shop -p:BetaDigital -0702:00c00000:0005:0085:1:0 -Ojom TV -p:BetaDigital -1902:00c00000:03fa:0001:1:0 -LIBIDO TV -p: -1b02:00c00000:03fe:0001:1:0 -CCTV NEWS -p:GlobeCast -2202:00c00000:044c:0001:1:0 -L'EQUIPE TV -p:CSAT -2b02:00c00000:0417:0001:1:0 -E!Entertainement -p:OrangeSAT -7002:00c00000:0436:0001:1:0 -MTV PULSE -p:MTV Networks Europe -7602:00c00000:0408:0001:1:0 -NICK JR -p:DIGITAL+ -0203:00c00000:0003:0085:1:0 -MGM -p:SKY,C:1861 -1b03:00c00000:03fe:0001:1:0 -TV5MONDE EUROPE -p:GlobeCast -2203:00c00000:044c:0001:1:0 -PLANETE+ NOLIMIT -p:CSAT -7003:00c00000:0436:0001:1:0 -MTV IDOL -p:MTV Networks Europe -0204:00c00000:0003:0085:1:0 -Sky †Nostalgie‡ -p:SKY,C:1861 -0304:00c00000:0005:0085:1:0 -iM1 -p:BetaDigital -1904:00c00000:03fa:0001:1:0 -M6 MUSIC -p: -2204:00c00000:044c:0001:1:0 -NATIONAL GEO -p:CSAT -7004:00c00000:0436:0001:1:0 -VIVA Germany -p:MTV Networks Europe -7604:00c00000:0408:0001:1:0 -ANTENA 3 -p:DIGITAL + -1905:00c00000:03fa:0001:1:0 -OFFRES CANAL READY -p:CSAT -2205:00c00000:044c:0001:1:0 -CINE+ CLASSIC -p:CSAT -2405:00c00000:0452:0001:1:0 -DIRECT STAR -p:CSAT -7005:00c00000:0436:0001:1:0 -Nick Jr France -p:MTV Networks Europe -7605:00c00000:0408:0001:1:0 -C+ DEP 2 HD -p:DIGITAL+ -0206:00c00000:0011:0085:1:0 -†Goldstar‡ TV -p:SKY,C:1861 -0306:00c00000:0007:0085:1:0 -†GOD ‡Channel -p:BetaDigital -1906:00c00000:03fa:0001:1:0 -NRJ HITS -p:CSAT -2206:00c00000:044c:0001:1:0 -TRACE URBAN -p:CSAT -2406:00c00000:0452:0001:1:0 -LCP -p:CSAT -7606:00c00000:0408:0001:1:0 -MTV LIVE HD -p:DIGITAL+ -0307:00c00000:0007:0085:1:0 -MediaShop- Meine Einkaufswelt -p:BetaDigital -1907:00c00000:03fa:0001:1:0 -FRENCH LOVER -p:CSAT -2207:00c00000:044c:0001:1:0 -CINE+ FAMIZ -p:CSAT -2407:00c00000:0452:0001:1:0 -FRANCE 4 -p:CSAT -7007:00c00000:0436:0001:1:0 -MTV NL -p:MTV Networks Europe -7607:00c00000:0408:0001:1:0 -MEZZO LIVEHD -p:DIGITAL+ -0008:00c00000:0002:0085:1:0 -Sky †Comedy‡ -p:SKY,C:1861 -0308:00c00000:0005:0085:1:0 -SIXX -p:ProSiebenSat.1 -1908:00c00000:03fa:0001:1:0 -GIRONDINS TV -p:IMEDIA -2f08:00c00000:0441:0001:1:0 -SUPER RTL -p:RTL World -7008:00c00000:0436:0001:1:0 -NICK/COMEDY -p:MTV Networks Europe -0009:00c00000:0002:0085:1:0 -Sky †Action‡ -p:SKY,C:1861 -1909:00c00000:03fa:0001:1:0 -TELETOON+1 -p:CSAT -2009:00c00000:0430:0001:1:0 -CANAL+ -p:CSAT -2f09:00c00000:0441:0001:1:0 -SUPER RTL CH -p:RTL -000a:00c00000:0002:0085:1:0 -Sky †Cinema‡ -p:SKY,C:1810,C:1861 -190a:00c00000:03fa:0001:1:0 -PINK TV/PINK X -p:CSAT -200a:00c00000:0430:0001:1:0 -CANAL+ DECALE -p:CSAT -240a:00c00000:0452:0001:1:0 -GULLI -p:CSAT -700a:00c00000:0436:0001:1:0 -Nicktoons (S) -p:MTV Networks Europe -760a:00c00000:0408:0001:1:0 -CINEMAGIC HD -p:DIGITAL+ -000b:00c00000:0002:0085:1:0 -Sky †Cinema‡ +†1‡ -p:SKY,C:1861 -200b:00c00000:0430:0001:1:0 -CANAL+ CINEMA -p:CSAT -240b:00c00000:0452:0001:1:0 -FRANCE Ô -p: -000c:00c00000:0004:0085:1:0 -†N‡at†G‡eo† Wild‡ -p:SKY,C:1861 -190c:00c00000:03fa:0001:1:0 -TS2 -p: -200c:00c00000:0430:0001:1:0 -CANAL+ -p:CSAT -760c:00c00000:0408:0001:1:0 -TCM AUTOR -p:CMACLS -000d:00c00000:0004:0085:1:0 -†Nat‡ional †Geo‡graphic -p:SKY,C:1861 -200d:00c00000:0430:0001:1:0 -CANAL+ FAMILY -p:CSAT -000e:00c00000:0004:0085:1:0 -†Discovery‡ Channel -p:SKY,C:1861 -200e:00c00000:0430:0001:1:0 -CINE+ PREMIER -p:CSAT -760e:00c00000:0408:0001:1:0 -LA SIETE -p:DIGITAL+ -000f:00c00000:0004:0085:1:0 -. -p:SKY,C:1861 -200f:00c00000:0430:0001:1:0 -DISNEY CHANNEL -p:CSAT -0010:00c00000:0001:0085:1:0 -†Fox‡ Serie -p:SKY,C:1861 -2010:00c00000:0430:0001:1:0 -CANAL+ SPORT -p:CSAT -0011:00c00000:0003:0085:1:0 -Sky †Sport‡ †News‡ -p:SKY,C:1861 -2011:00c00000:0430:0001:1:0 -INFOSPORT+ -p:CSAT -7611:00c00000:0408:0001:1:0 -C+ LIGA HD -p:DIGITAL+ -0012:00c00000:0004:0085:1:0 -†Sky‡ †Sel‡ect -p:SKY -7612:00c00000:0408:0001:1:0 -CANAL+1 HD -p:DIGITAL+ -0013:00c00000:0011:0085:1:0 -Junior -p:SKY,C:1861 -2013:00c00000:0430:0001:1:0 -CANAL+ -p:IMEDIA -7613:00c00000:0408:0001:1:0 -C+ ACCIÓN HD -p:DIGITAL+ -0014:00c00000:0002:0085:1:0 -Sky †Emotion‡ -p:SKY,C:1861 -7614:00c00000:0408:0001:1:0 -C+COMEDIA HD -p:DIGITAL+ -0015:00c00000:0011:0085:1:0 -†Beate‡-†U‡hse.TV -p:SKY,C:1861 -7615:00c00000:0408:0001:1:0 -C+ DCINE HD -p:DIGITAL+ -0016:00c00000:0011:0085:1:0 -†Heimat‡kanal -p:SKY,C:1861 -2b16:00c00000:0417:0001:1:0 -ORANGE SPORT HD -p:Globecast -7616:00c00000:0408:0001:1:0 -C+XTRA HD -p:DIGITAL+ -0017:00c00000:0001:0085:1:0 -†Sky‡ †Krimi‡ -p:SKY,C:1861 -2417:00c00000:0452:0001:1:0 -GOLF+ -p:CSAT -2b17:00c00000:0417:0001:1:0 -ORANGE CINE MAX HD -p:Globecast -7617:00c00000:0408:0001:1:0 -CINEMAGIC HD -p:DIGITAL+ -0018:00c00000:0011:0085:1:0 -Classica -p:SKY,C:1861 -7618:00c00000:0408:0001:1:0 -C+ FÚTBOL HD -p:DIGITAL+ -0019:00c00000:0003:0085:1:0 -†Disney‡ †Cin‡emagic -p:SKY,C:1861 -7619:00c00000:0408:0001:1:0 -C+ DEPORT HD -p:DIGITAL+ -001a:00c00000:0011:0085:1:0 -†Disney‡ †J‡unio†r‡ -p:SKY,C:1861 -321a:00c00000:045f:0035:1:0 -Informatiekanaal -p:TV Vlaanderen -761a:00c00000:0408:0001:1:0 -EUROSPORT HD -p:DIGITAL+ -001b:00c00000:0001:0085:1:0 -†RTL‡ †Crime‡ -p:SKY,C:1837,C:1861 -761b:00c00000:0408:0001:1:0 -CALLE 13 HD -p:DIGITAL+ -001c:00c00000:0011:0085:1:0 -†Disney‡ †XD‡ -p:SKY,C:1861 -2f1c:00c00000:0441:0001:1:0 -VOX -p:RTL World -761c:00c00000:0408:0001:1:0 -FOX HD -p:DIGITAL+ -001d:00c00000:0001:0085:1:0 -RTL †Passion‡ -p:SKY,C:1837,C:1861 -201d:00c00000:0430:0001:1:0 -CANAL+ -p:CSAT -251d:00c00000:0456:0001:1:0 -TF6 -p:CSAT -2f1d:00c00000:0441:0001:1:0 -RTLNITRO -p:RTL -761d:00c00000:0408:0001:1:0 -AXN HD -p:DIGITAL+ -001e:00c00000:0001:0085:1:0 -Sky †Sport‡ †Au‡s†t‡ria -p:SKY,C:1861 -251e:00c00000:0456:0001:1:0 -USHUAIA TV -p:CSAT -761e:00c00000:0408:0001:1:0 -NAT GEO HD -p:DIGITAL+ -1c1f:00c00000:0451:0035:1:0 -EPG -p:CANALDIGITAAL -251f:00c00000:0456:0001:1:0 -EUROSPORT 2 -p:CSAT -761f:00c00000:0408:0001:1:0 -MTV LIVE HD -p:DIGITAL+ -0020:00c00000:0021:0085:1:0 -†Sonnen‡klar †TV‡ -p:BetaDigital -2520:00c00000:0456:0001:1:0 -A LA DEMANDE -p:CSAT -7620:00c00000:0408:0001:1:0 -MEZZO LIVEHD -p:DIGITAL+ -0021:00c00000:000f:0085:1:0 -†Kinowelt‡ TV -p:SKY,C:1833 -2521:00c00000:0456:0001:1:0 -SEASONS -p:CSAT -4e21:00c00000:043a:0001:1:0 -ProSieben Schweiz -p:ProSiebenSat.1 -7621:00c00000:0408:0001:1:0 -CANAL+ 3D -p:DIGITAL+ -0022:00c00000:0011:0085:1:0 -†Disney‡ Channel -p:SKY,C:1861 -2522:00c00000:0456:0001:1:0 -O.CINE MAX -p: -4e22:00c00000:043a:0001:1:0 -ProSieben Austria -p:ProSiebenSat.1 -7622:00c00000:0408:0001:1:0 -TAQUILLA HD -p:DIGITAL+ -0023:00c00000:000f:0085:1:0 -†TNT Film‡ (TCM) -p:SKY,C:1833 -2523:00c00000:0456:0001:1:0 -PIWI+ -p:CSAT -4e23:00c00000:043a:0001:1:0 -Kabel 1 Schweiz -p:ProSiebenSat.1 -7623:00c00000:0408:0001:1:0 -VIAJAR HD -p:DIGITAL+ -0024:00c00000:0011:0085:1:0 -Syfy -p:SKY,C:1861 -2024:00c00000:0430:0001:1:0 -CANAL+ SPORT -p:CSAT -2524:00c00000:0456:0001:1:0 -EXTREME SPORTS -p:CSAT -4e24:00c00000:043a:0001:1:0 -Kabel 1 Austria -p:ProSiebenSat.1 -7624:00c00000:0408:0001:1:0 -COSMO HD -p:DIGITAL+ -0025:00c00000:000f:0085:1:0 -†AXN‡ Action -p:SKY,C:1830,C:1833 -2525:00c00000:0456:0001:1:0 -MOTORS TV -p:CSAT -4e25:00c00000:043a:0001:1:0 -SAT.1 A -p:ProSiebenSat.1 -7625:00c00000:0408:0001:1:0 -HOLLYWOOD HD -p:DIGITAL+ -0026:00c00000:000f:0085:1:0 -†Romance‡ TV -p:SKY,C:1830,C:1833 -2526:00c00000:0456:0001:1:0 -EQUIDIA LIFE -p:CSAT -4e26:00c00000:043a:0001:1:0 -SAT.1 CH -p:ProSiebenSat.1 -7626:00c00000:0408:0001:1:0 -TNT HD -p:DIGITAL + -0027:00c00000:000f:0085:1:0 -Cartoon Network (S) -p:SKY,C:1833 -4e27:00c00000:043a:0001:1:0 -PULS 4 Austria -p:ProSiebenSat.1,C:1833 -7627:00c00000:0408:0001:1:0 -NG WILD HD -p:DIGITAL+ -0028:00c00000:0021:0085:1:0 -†HSE24‡ -p:BetaDigital -4e28:00c00000:043a:0001:1:0 -SAT.1 HH/SH -p:ProSiebenSat.1 -7628:00c00000:0408:0001:1:0 -SYFY HD -p:DIGITAL+ -0029:00c00000:0003:0085:1:0 -†Sky‡ †Hits‡ -p:SKY,C:1861 -4e29:00c00000:043a:0001:1:0 -SAT.1 NS/Bremen -p:ProSiebenSat.1 -7629:00c00000:0408:0001:1:0 -DISNEY CH HD -p:DIGITAL+ -7729:00c00000:0416:0001:1:0 -CINEMAGIC -p:DIGITAL+ -002a:00c00000:0001:0085:1:0 -†13‡th †Street‡ -p:SKY,C:1861 -4e2a:00c00000:043a:0001:1:0 -SAT.1 RhlPf/Hessen -p:ProSiebenSat.1 -772a:00c00000:0416:0001:1:0 -DISNEY XD -p:DIGITAL+ -002b:00c00000:0002:0085:1:0 -Sky †Cinema‡ +†24‡ -p:SKY,C:1861 -772b:00c00000:0416:0001:1:0 -CAZA Y PESCA -p:CAZPES -332d:00c00000:045b:0001:1:0 -ORF III -p:ORF,C:0d95,C:0648,C:0d05,C:09c4,C:1702,C:1833,C:098c -6e2d:00c00000:0431:0001:1:0 -rbb Brandenburg -p:ARD -772d:00c00000:0416:0001:1:0 -BIO -p:DIGITAL+ -002e:00c00000:0021:0085:1:0 -†mediasparTV‡ Homeshopping -p:BetaDigital -272e:00c00000:0402:0001:1:0 -CNBC Europe -p:CNBC -332e:00c00000:045b:0001:1:0 -GoTV -p:GoTV -6e2e:00c00000:0431:0001:1:0 -rbb Berlin -p:ARD -772e:00c00000:0416:0001:1:0 -C+ YOMVI -p:DIGITAL+ -002f:00c00000:0021:0085:1:0 -†REGIO TV‡ -p:BetaDigital -132f:00c00000:03ef:0001:1:0 -ORF1 HD -p:ORF,C:0d05,C:0d95,C:0648,C:1702,C:1833,C:09c4,C:098c -332f:00c00000:045b:0001:1:0 -. -p:- -772f:00c00000:0416:0001:1:0 -11156V SID 0x772f -p:DVB-S QPSK 11156V 19.2°E -0030:00c00000:0005:0085:1:0 -ERF 1 -p:BetaDigital -1130:00c00000:0404:0001:1:0 -SES 5 launch HD -p:ASTRA -1330:00c00000:03ef:0001:1:0 -ORF2 HD -p:ORF,C:0d05,C:0d95,C:0648,C:1702,C:1833,C:09c4,C:098c -2f30:00c00000:0441:0001:1:0 -Channel 21 -p:RTL World -3330:00c00000:045b:0001:1:0 -LT1-OOE -p:- -7730:00c00000:0416:0001:1:0 -COSMOPOLITAN -p:COSMO -1331:00c00000:03ef:0001:1:0 -ServusTV HD Oesterreich -p:ServusTV -3331:00c00000:045b:0001:1:0 -ESPN America (S) -p:SKY,C:1702,C:1833,C:09c4,C:098c -7031:00c00000:041b:0001:1:0 -tagesschau24 -p:ARD -7731:00c00000:0416:0001:1:0 -HISTORIA -p:HIST -0032:00c00000:0001:0085:1:0 -†TNT‡ †Serie‡ -p:SKY,C:1861 -1332:00c00000:03ef:0001:1:0 -ServusTV HD Deutschland -p:ServusTV -3332:00c00000:045b:0001:1:0 -sixx Austria -p:sevenonemedia,C:1702,C:1833,C:09c4,C:0d05,C:0d95,C:0648,C:098c -7032:00c00000:041b:0001:1:0 -Einsfestival -p:ARD -7732:00c00000:0416:0001:1:0 -EUROSPORT -p:ESP -0033:00c00000:0021:0085:1:0 -TELE 5 -p:BetaDigital -1333:00c00000:03ef:0001:1:0 -PVoD -p:ServusTV -2b33:00c00000:0417:0001:1:0 -KidsCo Bis -p:OrangeSAT -3333:00c00000:045b:0001:1:0 -VISIT-X.tv -p:- -7033:00c00000:041b:0001:1:0 -EinsPlus -p:ARD -0034:00c00000:0004:0085:1:0 -†Spiegel‡ †G‡eschichte -p:SKY,C:1861 -7034:00c00000:041b:0001:1:0 -arte -p:ARD -0035:00c00000:0007:0085:1:0 -SES 01 -p:BetaDigital,C:1833 -2135:00c00000:0400:0001:1:0 -TELE MELODY -p:CSAT -3335:00c00000:045b:0001:1:0 -ESPN America -p:arena -7035:00c00000:041b:0001:1:0 -PHOENIX -p:ARD -7735:00c00000:0416:0001:1:0 -CINEMAGIC -p:DIGITAL+ -0036:00c00000:0007:0085:1:0 -Beauty TV -p:BetaDigital -2136:00c00000:0400:0001:1:0 -CHAINE CHAMPIONS -p: -3336:00c00000:045b:0001:1:0 -ServusTV Deutschland -p:ServusTV -7036:00c00000:041b:0001:1:0 -Test-R -p:ARD -7736:00c00000:0416:0001:1:0 -DCINE ESPAÑOL -p:DCESP -0037:00c00000:000f:0085:1:0 -Eurosport 2 Deutschland -p:SKY,C:1833 -3337:00c00000:045b:0001:1:0 -ServusTV Oesterreich -p:ServusTV -0038:00c00000:000f:0085:1:0 -Boomerang -p:SKY,C:1833 -2138:00c00000:0400:0001:1:0 -PLANETE+THALASSA -p:CSAT -3138:00c00000:0459:0001:1:0 -MagicStar Digitalradio Promo -p:MEDIA BROADCAST -7738:00c00000:0416:0001:1:0 -24 HORAS -p:24H -0039:00c00000:000f:0085:1:0 -†Bio‡graphy Channel -p:SKY,C:1833 -2139:00c00000:0400:0001:1:0 -ESPN CLASSIC -p:CSAT -3139:00c00000:0459:0001:1:0 -K-TV -p:MEDIA BROADCAST -3339:00c00000:045b:0001:1:0 -L-TV/TVM -p:- -003a:00c00000:000f:0085:1:0 -History -p:SKY,C:1833 -213a:00c00000:0400:0001:1:0 -11567V SID 0x213a -p:DVB-S QPSK 11567V 19.2°E -2f3a:00c00000:0441:0001:1:0 -n-tv -p:RTL World -773a:00c00000:0416:0001:1:0 -11156V SID 0x773a -p:DVB-S QPSK 11156V 19.2°E -003b:00c00000:000f:0085:1:0 -sportdigital -p:SKY,C:1830,C:1861 -003c:00c00000:0007:0085:1:0 -VIVA AUT -p:MTV Networks -213c:00c00000:0400:0001:1:0 -MCS BIEN ETRE -p: -313c:00c00000:0459:0001:1:0 -dhd24.tv -p:Media Broadcast -003d:00c00000:0007:0085:1:0 -NICK/CC AUT -p:MTV Networks -6e3d:00c00000:0431:0001:1:0 -ARD-TEST-1 -p:ARD -003e:00c00000:0005:0085:1:0 -†EWTN kath‡olisches TV -p:BetaDigital -313e:00c00000:0459:0001:1:0 -Lustkanal.TV -p:Media Broadcast -003f:00c00000:0021:0085:1:0 -DMAX -p:BetaDigital -2f3f:00c00000:0441:0001:1:0 -Channel 21 ALT -p:CBC -313f:00c00000:0459:0001:1:0 -AEGYPTEN.TV -p:MEDIA BROADCAST -0040:00c00000:0005:0085:1:0 -QVC Beauty -p:BetaDigital -6e40:00c00000:0431:0001:1:0 -NDR FS MV -p:ARD -0041:00c00000:0007:0085:1:0 -†DELUXE‡ MUSIC -p:BetaDigital -1f41:00c00000:042e:0001:1:0 -FRANCE 5 -p:CSAT -6e41:00c00000:0431:0001:1:0 -NDR FS HH -p:ARD -0d42:00c00000:0454:0001:1:0 -QVC PLUS -p:SES ASTRA -1f42:00c00000:042e:0001:1:0 -CINE+ EMOTION -p:CSAT -2742:00c00000:0402:0001:1:0 -BBC World -p:BBC -6e42:00c00000:0431:0001:1:0 -NDR FS NDS -p:ARD -1f43:00c00000:042e:0001:1:0 -CINE+ FRISSON -p:CSAT -6e43:00c00000:0431:0001:1:0 -NDR FS SH -p:ARD -1f44:00c00000:042e:0001:1:0 -NRJ 12 -p:CSAT -2144:00c00000:0400:0001:1:0 -OM TV -p:CSAT -2f44:00c00000:0454:0001:1:0 -QVC Deutschland -p:SES ASTRA -3144:00c00000:0459:0001:1:0 -Erotik 24 -p:MEDIA BROADCAST -6e44:00c00000:0431:0001:1:0 -MDR Sachsen -p:ARD -7a44:00c00000:0410:0001:1:0 -ANDALUCIA TV -p:Telefonica Servicios Audiovisuales -1f45:00c00000:042e:0001:1:0 -PARIS PREMIERE -p:CSAT -2145:00c00000:0400:0001:1:0 -OL TV -p:CSAT -6e45:00c00000:0431:0001:1:0 -MDR S-Anhalt -p:ARD -0046:00c00000:0007:0085:1:0 -SES 02 -p:BetaDigital,C:1702,C:1801,C:1830 -1f46:00c00000:042e:0001:1:0 -13EME RUE -p:CSAT -3146:00c00000:0459:0001:1:0 -rhein main tv -p:MEDIA BROADCAST -6e46:00c00000:0431:0001:1:0 -MDR Thüringen -p:ARD -6f46:00c00000:0445:0001:1:0 -SR Fernsehen -p:ARD -7a46:00c00000:0410:0001:1:0 -Russia Today -p:Harmonic -0047:00c00000:0007:0085:1:0 -†H‡OPE †C‡hannel† deutsch‡ -p:BetaDigital -1f47:00c00000:042e:0001:1:0 -MEZZO -p:CSAT -3147:00c00000:0459:0001:1:0 -Deutsche Girls 2 -p:MEDIA BROADCAST -6e47:00c00000:0431:0001:1:0 -SWR Fernsehen RP -p:ARD -6f47:00c00000:0445:0001:1:0 -BR-alpha -p:ARD -7a47:00c00000:0410:0001:1:0 -TELEMADRID SAT -p:Telefonica Servicios Audiovisuales -1f48:00c00000:042e:0001:1:0 -FRANCE 3 -p:CSAT -3148:00c00000:0459:0001:1:0 -Juwelo TV -p:MEDIA BROADCAST -7a48:00c00000:0410:0001:1:0 -TELESUR -p:Telefonica Servicios Audiovisuales -0049:00c00000:0005:0085:1:0 -. -p:BetaDigital -1f49:00c00000:042e:0001:1:0 -SPORT+ -p:CSAT -2649:00c00000:0460:0001:1:0 -FR3 CAEN -p:CSAT -004a:00c00000:0005:0085:1:0 -Press TV -p:BetaDigital -1f4a:00c00000:042e:0001:1:0 -I>TELE -p:CSAT -264a:00c00000:0460:0001:1:0 -FR3 NANTES -p:CSAT -314a:00c00000:0459:0001:1:0 -Dreamgirls.TV -p:MEDIA BROADCAST -264b:00c00000:0460:0001:1:0 -FR3 NICE -p:CSAT -314b:00c00000:0459:0001:1:0 -Erotik Sat -p:MEDIA BROADCAST -004c:00c00000:0021:0085:1:0 -. -p:BetaDigital -1f4c:00c00000:042e:0001:1:0 -MEZZO. -p:CSAT -264c:00c00000:0460:0001:1:0 -FR3 ORLEANS -p:CSAT -314c:00c00000:0459:0001:1:0 -123Damenwahl -p:MEDIA BROADCAST -004d:00c00000:0021:0085:1:0 -HSE24 TREND -p:BetaDigital -1f4d:00c00000:042e:0001:1:0 -NCMESS -p:CSAT -264d:00c00000:0460:0001:1:0 -FR3 DIJON -p:CSAT -314d:00c00000:0459:0001:1:0 -SexySat -p:MEDIA BROADCAST -264e:00c00000:0460:0001:1:0 -FR3 POITIERS -p:CSAT -274e:00c00000:0402:0001:1:0 -Best of shopping -p:Groupe M6 -314e:00c00000:0459:0001:1:0 -Maennersache TV -p:MEDIA BROADCAST -264f:00c00000:0460:0001:1:0 -FR3 REIMS -p:CSAT -274f:00c00000:0402:0001:1:0 -M6 BOUTIQUE LA CHAINE -p:Groupe M6 -314f:00c00000:0459:0001:1:0 -Date Line -p:MEDIA BROADCAST -2650:00c00000:0460:0001:1:0 -FR3 GRENOBLE -p:CSAT -3150:00c00000:0459:0001:1:0 -Fotohandy -p:MEDIA BROADCAST -2651:00c00000:0460:0001:1:0 -FR3 LILLE -p:CSAT -3151:00c00000:0459:0001:1:0 -Mobile Sex -p:MEDIA BROADCAST -1252:00c00000:03fd:0001:1:0 -†Lokal TV‡ Portal -p:BetaDigital -2652:00c00000:0460:0001:1:0 -FR3 STRASBOURG -p:CSAT -3152:00c00000:0459:0001:1:0 -SEX-Kontakte -p:MEDIA BROADCAST -2653:00c00000:0460:0001:1:0 -FR3 MONTPELLIER -p:CSAT -2753:00c00000:0402:0001:1:0 -Bloomberg Europe TV -p:Arqiva -3153:00c00000:0459:0001:1:0 -Kamasutra TV -p:MEDIA BROADCAST -2654:00c00000:0460:0001:1:0 -FR3 VIA STELLA -p:CSAT -3154:00c00000:0459:0001:1:0 -Teledate TV -p:MEDIA BROADCAST -1f55:00c00000:042e:0001:1:0 -I>TELE -p:CSAT -2755:00c00000:0402:0001:1:0 -TELEMADRID SAT -p:Telefonica Spain -3155:00c00000:0459:0001:1:0 -Traumgirls.TV -p:MEDIA BROADCAST -3355:00c00000:045b:0001:1:0 -Tirol TV -p:- -1f56:00c00000:042e:0001:1:0 -NRJ 12 -p:CSAT -2756:00c00000:0402:0001:1:0 -ANDALUCIA TV -p:Telefonica Spain -3156:00c00000:0459:0001:1:0 -Das Erotische TV -p:MEDIA BROADCAST -1f57:00c00000:042e:0001:1:0 -FRANCE 3 -p:CSAT -1f58:00c00000:042e:0001:1:0 -FRANCE 5 -p:CSAT -2f58:00c00000:0454:0001:1:0 -LibertyTV FR -p:SES ASTRA -1b59:00c00000:03fc:0001:1:0 -Montagne TV -p:GlobeCast -3159:00c00000:0459:0001:1:0 -Shop24Direct -p:Media Broadcast -1b5a:00c00000:03fc:0001:1:0 -ETB Sat -p:GlobeCast -275a:00c00000:0402:0001:1:0 -CANAL SUR RADIO -p:Telefonica Spain -2f5a:00c00000:0454:0001:1:0 -Bibel TV -p:SES ASTRA -315a:00c00000:0459:0001:1:0 -DiaetTV -p:MEDIA BROADCAST -275b:00c00000:0402:0001:1:0 -TELESUR -p:Telefonica Spain -2f5b:00c00000:0454:0001:1:0 -eUrotic -p:SES ASTRA -315b:00c00000:0459:0001:1:0 -Cambabes24 -p:MEDIA BROADCAST -125c:00c00000:03f7:0001:1:0 -SES 03 -p:BetaDigital -315c:00c00000:0459:0001:1:0 -dhd24 plus -p:Media Broadcast -445c:00c00000:0453:0001:1:0 -SAT.1 -p:ProSiebenSat.1 -125d:00c00000:03f7:0001:1:0 -SES 04 -p:BetaDigital -275d:00c00000:0402:0001:1:0 -Russia Today Español -p:OVERON -445d:00c00000:0453:0001:1:0 -ProSieben -p:ProSiebenSat.1 -125e:00c00000:03f7:0001:1:0 -†DAF‡-AnlegerTV -p:BetaDigital -1b5e:00c00000:03fc:0001:1:0 -Renault TV -p:GlobeCast -445e:00c00000:0453:0001:1:0 -kabel eins -p:ProSiebenSat.1 -125f:00c00000:03f7:0001:1:0 -Channel21 Express -p:BetaDigital -315f:00c00000:0459:0001:1:0 -EROTIKA TV - NEU! -p:MEDIA BROADCAST -445f:00c00000:0453:0001:1:0 -N24 -p:ProSiebenSat.1 -1260:00c00000:03f7:0001:1:0 -SES 05 -p:BetaDigital -1b60:00c00000:03fc:0001:1:0 -Cubavision Internacional -p:GlobeCast -3160:00c00000:0459:0001:1:0 -BunnyClub24 -p:MEDIA BROADCAST -4460:00c00000:0453:0001:1:0 -SIXX -p:ProSiebenSat.1 -1261:00c00000:03f7:0001:1:0 -SES 06 -p:BetaDigital -1b61:00c00000:03fc:0001:1:0 -Al Jazeera Channel -p:GlobeCast -3161:00c00000:0459:0001:1:0 -Clipmobile -p:MEDIA BROADCAST -4461:00c00000:0453:0001:1:0 -SAT.1 emotions -p:ProSiebenSat.1,C:1702,C:1801 -1262:00c00000:03f7:0001:1:0 -SES 07 -p:BetaDigital -1b62:00c00000:03fc:0001:1:0 -RedeRecord -p:GlobeCast -1c62:00c00000:0457:0001:1:0 -STB Comag -p:SES ASTRA -3162:00c00000:0459:0001:1:0 -SmartCast Test -p:MEDIA BROADCAST -4462:00c00000:0453:0001:1:0 -kabel eins classics -p:ProSiebenSat.1,C:1702,C:1801 -7562:00c00000:0412:0001:1:0 -C+ MULTI-X -p:DIGITAL+ -1263:00c00000:03f7:0001:1:0 -SES 08 -p:BetaDigital -1b63:00c00000:03fc:0001:1:0 -Arirang TV -p:GlobeCast -3163:00c00000:0459:0001:1:0 -StarParadies D -p:MEDIA BROADCAST -4463:00c00000:0453:0001:1:0 -SAT.1 Bayern -p:ProSiebenSat.1 -7563:00c00000:0412:0001:1:0 -MULTI-X (2) -p:DIGITAL+ -1264:00c00000:03f7:0001:1:0 -SES 09 -p:BetaDigital -1b64:00c00000:03fc:0001:1:0 -Al Jazeera English -p:GlobeCast -3164:00c00000:0459:0001:1:0 -FTL Deutschland -p:MEDIA BROADCAST -4464:00c00000:0453:0001:1:0 -SAT.1 NRW -p:ProSiebenSat.1 -1465:00c00000:040d:0001:1:0 -SES 5 launch -p:ASTRA -7565:00c00000:0412:0001:1:0 -TAQUILLA 5 -p:TQ5 -1266:00c00000:03f7:0001:1:0 -anixe iTV -p:BetaDigital -1b66:00c00000:03fc:0001:1:0 -NHK World TV -p:GlobeCast -6d66:00c00000:0437:0001:1:0 -ZDF -p:ZDFvision -7566:00c00000:0412:0001:1:0 -TAQUILLA 6 -p:TQ6 -1267:00c00000:03f7:0001:1:0 -Volksmusik -p:BetaDigital -2f67:00c00000:0454:0001:1:0 -TV8 Mont Blanc -p:SES ASTRA -6d67:00c00000:0437:0001:1:0 -3sat -p:ZDFvision -7567:00c00000:0412:0001:1:0 -TAQUILLA 7 -p:TQ7 -1268:00c00000:03f7:0001:1:0 -SOPHIA TV -p:BetaDigital -2f68:00c00000:0454:0001:1:0 -Vivolta -p:SES ASTRA -6d68:00c00000:0437:0001:1:0 -KiKA -p:ZDFvision -7468:00c00000:03f0:0001:1:0 -FOX CRIME -p:DIGITAL+ -7568:00c00000:0412:0001:1:0 -TAQUILLA X -p:TQ10 -1269:00c00000:03f7:0001:1:0 -Die Neue Zeit TV -p:BetaDigital -6f69:00c00000:042c:0001:1:0 -Cartoon Network -p:TBS -7469:00c00000:03f0:0001:1:0 -NOVA -p:DIGITAL+ -7569:00c00000:0412:0001:1:0 -TAQUILLA XX -p:TQX -126a:00c00000:03f7:0001:1:0 -. -p:BetaDigital -1b6a:00c00000:03fc:0001:1:0 -TV GALICIA -p:GlobeCast -6f6a:00c00000:042c:0001:1:0 -CNN Int. -p:CNN -746a:00c00000:03f0:0001:1:0 -EL GARAGE TV -p:DIGITAL+ -756a:00c00000:0412:0001:1:0 -TAQ XXHARD -p:TQXX -126b:00c00000:03f7:0001:1:0 -. -p:BetaDigital -6d6b:00c00000:0437:0001:1:0 -ZDFinfo -p:ZDFvision -746b:00c00000:03f0:0001:1:0 -DISNEY JR -p:DIGITAL+ -756b:00c00000:0412:0001:1:0 -C+ LIGA 2 -p:DIGITAL+ -126c:00c00000:03f7:0001:1:0 -. -p:BetaDigital -746c:00c00000:03f0:0001:1:0 -C+ ACCIÓN -p:CPC1 -756c:00c00000:0412:0001:1:0 -11097V SID 0x756c -p:DVB-S QPSK 11097V 19.2°E -126d:00c00000:03f7:0001:1:0 -. -p:BetaDigital -6f6d:00c00000:042c:0001:1:0 -TCM -p:TBS -746d:00c00000:03f0:0001:1:0 -C+ COMEDIA -p:CPC2 -126e:00c00000:03f7:0001:1:0 -.1. -p:BetaDigital,C:1830,C:1837,C:1843,C:1860 -146e:00c00000:040d:0001:1:0 -RTS SAT -p:SES ASTRA -6d6e:00c00000:0437:0001:1:0 -zdf_neo -p:ZDFvision -746e:00c00000:03f0:0001:1:0 -C+ DCINE -p:CPC3 -756e:00c00000:0412:0001:1:0 -C+LIGA2 A -p:DIGITAL+ -126f:00c00000:03f7:0001:1:0 -.2. -p:BetaDigital,C:1830,C:1843,C:1860 -6f6f:00c00000:042c:0001:1:0 -Boomerang -p:TBS -746f:00c00000:03f0:0001:1:0 -FOX -p:FOXGE -756f:00c00000:0412:0001:1:0 -TAQUILLA 8 -p:TQ8 -1270:00c00000:03f7:0001:1:0 -.3. -p:BetaDigital,C:1830,C:1843,C:1860 -6d70:00c00000:0437:0001:1:0 -zdf.kultur -p:ZDFvision -6f70:00c00000:042c:0001:1:0 -Boing -p:Arqiva -7470:00c00000:03f0:0001:1:0 -11317V SID 0x7470 -p:DVB-S QPSK 11317V 19.2°E -7570:00c00000:0412:0001:1:0 -C+ TOROS -p:DIGITAL+ -7471:00c00000:03f0:0001:1:0 -AXN WHITE -p:DIGITAL+ -7571:00c00000:0412:0001:1:0 -MULTI-X (1) -p:DIGITAL+ -7472:00c00000:03f0:0001:1:0 -11317V SID 0x7472 -p:DVB-S QPSK 11317V 19.2°E -7572:00c00000:0412:0001:1:0 -MULTI-X (3) -p:DIGITAL+ -7473:00c00000:03f0:0001:1:0 -11317V SID 0x7473 -p:DVB-S QPSK 11317V 19.2°E -7573:00c00000:0412:0001:1:0 -MULTIDEP.5 -p:DIGITAL+ -7474:00c00000:03f0:0001:1:0 -11317V SID 0x7474 -p:DVB-S QPSK 11317V 19.2°E -7574:00c00000:0412:0001:1:0 -MULTIDEP.6 -p:DIGITAL+ -6f76:00c00000:0457:0001:1:0 -WDR Aachen -p:ARD -7576:00c00000:0412:0001:1:0 -MULTIDEP.7 -p:DIGITAL+ -6f77:00c00000:0457:0001:1:0 -WDR Wuppertal -p:ARD -7477:00c00000:03f0:0001:1:0 -AXN -p:AXN -7577:00c00000:0412:0001:1:0 -C+LIGA2 B -p:DIGITAL+ -6f78:00c00000:0457:0001:1:0 -WDR Bonn -p:ARD -7478:00c00000:03f0:0001:1:0 -11317V SID 0x7478 -p:DVB-S QPSK 11317V 19.2°E -7578:00c00000:0412:0001:1:0 -C+LIGA2 C -p:DIGITAL+ -6f79:00c00000:0457:0001:1:0 -WDR Duisburg -p:ARD -7479:00c00000:03f0:0001:1:0 -CANAL+1 ...30 -p:DIGITAL+ -7579:00c00000:0412:0001:1:0 -C+LIGA2 D -p:DIGITAL+ -1c7a:00c00000:0457:0001:1:0 -Sky News Intl -p:SES ASTRA -427c:00c00000:0446:0001:1:0 -AB MOTEURS -p:ABSAT,C:0100,C:0500 -427d:00c00000:0446:0001:1:0 -AB1 -p:ABSAT,C:0100,C:0000 -427e:00c00000:0446:0001:1:0 -ANIMAUX -p:ABSAT,C:0100,C:0500 -427f:00c00000:0446:0001:1:0 -ENCYCLO -p:ABSAT,C:0100,C:0500 -1c80:00c00000:0457:0001:1:0 -TV TRWAM -p:SES ASTRA -4280:00c00000:0446:0001:1:0 -XXL -p:ABSAT,C:0100,C:0500 -7080:00c00000:0443:0001:1:0 -RTL Austria -p:RTL -0381:00c00000:0021:0085:1:0 -†e8 t‡ele†v‡ision -p:BetaDigital -2581:00c00000:0458:0001:1:0 -HISTOIRE -p:CSAT -4281:00c00000:0446:0001:1:0 -ESCALES -p:ABSAT,C:0100,C:0500 -0382:00c00000:0021:0085:1:0 -MediaShop- Neuheiten -p:BetaDigital -4282:00c00000:0446:0001:1:0 -toute L'HISTOIRE -p:ABSAT,C:0100,C:0500 -0383:00c00000:0021:0085:1:0 -meinTVshop -p:BetaDigital -2583:00c00000:0458:0001:1:0 -MA CHAINE SPORT -p:CSAT -0384:00c00000:0021:0085:1:0 -SPORT1 -p:BetaDigital -2584:00c00000:0458:0001:1:0 -M6 MUSIC BLACK -p:CSAT -4284:00c00000:0446:0001:1:0 -NT1 -p:ABSAT -2585:00c00000:0458:0001:1:0 -M6 MUSIC CLUB -p:CSAT -4285:00c00000:0446:0001:1:0 -DORCEL TV -p:ABSAT,C:0100,C:0500 -7085:00c00000:0443:0001:1:0 -VOX Austria -p:RTL -2e86:00c00000:0405:0001:1:0 -RTL HD Austria -p:CBC -4286:00c00000:0446:0001:1:0 -ACTION -p:ABSAT,C:0100,C:0500 -2587:00c00000:0458:0001:1:0 -CUISINE+ -p:CSAT -4287:00c00000:0446:0001:1:0 -MANGAS -p:ABSAT,C:0100,C:0500 -2588:00c00000:0458:0001:1:0 -PLANETE+ JUSTICE -p:CSAT -7788:00c00000:0424:0001:1:0 -10876V SID 0x7788 -p:DVB-S QPSK 10876V 19.2°E -2589:00c00000:0458:0001:1:0 -CANAL J -p:CSAT -4289:00c00000:0446:0001:1:0 -CINE POLAR -p:ABSAT,C:0100,C:0500 -7789:00c00000:0424:0001:1:0 -CANAL+ GOLF -p:DIGITAL+ -258a:00c00000:0458:0001:1:0 -DISCOVERY -p:CSAT -2f8a:00c00000:0454:0001:1:0 -BFM TV -p:SES ASTRA -428a:00c00000:0446:0001:1:0 -CINE FX -p:ABSAT,C:0100,C:0000 -708a:00c00000:0443:0001:1:0 -RTL2 Austria -p:RTL -778a:00c00000:0424:0001:1:0 -CANAL ODISEA -p:Digital+ -2f8b:00c00000:0454:0001:1:0 -BFM TV -p:SES ASTRA -428b:00c00000:0446:0001:1:0 -RTL9 -p:ABSAT,C:0100,C:0500 -778b:00c00000:0424:0001:1:0 -PLAYBOY TV -p:Playboy TV -428c:00c00000:0446:0001:1:0 -CHASSE et PECHE -p:ABSAT,C:0100,C:0500 -778c:00c00000:0424:0001:1:0 -10876V SID 0x778c -p:DVB-S QPSK 10876V 19.2°E -238d:00c00000:044a:0001:1:0 -GUIDE TV -p:CSAT -428d:00c00000:0446:0001:1:0 -STYLIA -p:ABSAT -778d:00c00000:0424:0001:1:0 -NAT GEOGRAPH -p:NATGEO -128e:00c00000:03f7:0001:1:0 -Date1TV -p:BetaDigital -2f8e:00c00000:0454:0001:1:0 -Direct 8 TV -p:SES ASTRA -768e:00c00000:041e:0001:1:0 -TAQUILLA 1 -p:TQ1 -778e:00c00000:0424:0001:1:0 -C+ FÚTBOL -p:CPD1 -128f:00c00000:03f7:0001:1:0 -Friends TV -p:BetaDigital -2f8f:00c00000:0454:0001:1:0 -Direct 8 TV -p:SES ASTRA -708f:00c00000:0443:0001:1:0 -SUPER RTL A -p:RTL -768f:00c00000:041e:0001:1:0 -TAQUILLA 2 -p:TQ2 -778f:00c00000:0424:0001:1:0 -C+ DEPORTES -p:CPD2 -1290:00c00000:03f7:0001:1:0 -Turbodating TV -p:BetaDigital -2390:00c00000:044a:0001:1:0 -ENREGISTREMENTS -p:CSAT -2e90:00c00000:0405:0001:1:0 -VOX HD Austria -p:CBC -4290:00c00000:0446:0001:1:0 -NT1 -p:ABSAT -7690:00c00000:041e:0001:1:0 -TAQUILLA 3 -p:TQ3 -7790:00c00000:0424:0001:1:0 -CALLE 13 -p:CL13 -1291:00c00000:03f7:0001:1:0 -Love TV -p:BetaDigital -2391:00c00000:044a:0001:1:0 -C+ DEMANDE -p:CSAT -7691:00c00000:041e:0001:1:0 -TAQUILLA 4 -p:TQ4 -0292:00c00000:0005:0085:1:0 -†Daystar Television‡ Network -p:BetaDigital -1292:00c00000:03f7:0001:1:0 -.6live -p:BetaDigital -2392:00c00000:044a:0001:1:0 -12363V SID 0x2392 -p:DVB-S QPSK 12363V 19.2°E -6e92:00c00000:04b1:0001:1:0 -WDR Bielefeld -p:ARD -7692:00c00000:041e:0001:1:0 -C+ MultiDEP -p:DIGITAL+ -7792:00c00000:0424:0001:1:0 -CANAL+ LIGA -p:DIGITAL+ -0293:00c00000:0005:0085:1:0 -collection -p:BetaDigital -1293:00c00000:03f7:0001:1:0 -Amore TV -p:BetaDigital -6e93:00c00000:04b1:0001:1:0 -WDR Dortmund -p:ARD -7693:00c00000:041e:0001:1:0 -TAQUILLA X -p:DIGITAL+ -7793:00c00000:0424:0001:1:0 -CANAL+ LIGA -p:DIGITAL+ -1294:00c00000:03f7:0001:1:0 -Partnersuche TV -p:BetaDigital -2f94:00c00000:0454:0001:1:0 -BFM Business -p:SES ASTRA -6e94:00c00000:04b1:0001:1:0 -WDR Düsseldorf -p:ARD -7094:00c00000:0443:0001:1:0 -VOX CH -p:RTL -7694:00c00000:041e:0001:1:0 -C+ MultiCINE -p:DIGITAL+ -0295:00c00000:0021:0085:1:0 -AstroTV -p:BetaDigital -1295:00c00000:03f7:0001:1:0 -Teleglück TV -p:BetaDigital -6e95:00c00000:04b1:0001:1:0 -WDR Essen -p:ARD -7695:00c00000:041e:0001:1:0 -TAQUILLA XY -p:TXY -7795:00c00000:0424:0001:1:0 -DECASA -p:DIGITAL+ -0296:00c00000:0005:0085:1:0 -1-2-3.tv -p:BetaDigital -1296:00c00000:03f7:0001:1:0 -Kontaktbörse TV -p:BetaDigital -2396:00c00000:044a:0001:1:0 -ESPACE CLIENT -p:CSAT -6e96:00c00000:04b1:0001:1:0 -WDR Münster -p:ARD -7596:00c00000:0422:0001:1:0 -10847V SID 0x7596 -p:DVB-S QPSK 10847V 19.2°E -7696:00c00000:041e:0001:1:0 -CARTOON NET. -p:CTN -7796:00c00000:0424:0001:1:0 -SYFY -p:DIGITAL + -1297:00c00000:03f7:0001:1:0 -Verliebt TV -p:BetaDigital -6e97:00c00000:04b1:0001:1:0 -WDR Siegen -p:ARD -7697:00c00000:041e:0001:1:0 -TAQUILLA X -p:DIGITAL+ -7797:00c00000:0424:0001:1:0 -DISCOVERY -p:DCR -1298:00c00000:03f7:0001:1:0 -Zeit für Gefühle -p:BetaDigital -7798:00c00000:0424:0001:1:0 -10876V SID 0x7798 -p:DVB-S QPSK 10876V 19.2°E -1299:00c00000:03f7:0001:1:0 -Club1 TV -p:BetaDigital -2199:00c00000:0448:0001:1:0 - -p:CSAT -2f99:00c00000:0454:0001:1:0 -CashTV -p:SES ASTRA -7699:00c00000:041e:0001:1:0 -CARTOONITO -p:DIGITAL+ -129a:00c00000:03f7:0001:1:0 -Liebesglück.TV -p:BetaDigital -219a:00c00000:0448:0001:1:0 -ONZEO -p:CSAT -2e9a:00c00000:0405:0001:1:0 -SUPER RTL HD -p:CBC -749a:00c00000:041c:0001:1:0 -DIVINITY -p:DIGITAL+ -769a:00c00000:041e:0001:1:0 -MULTIDEP.1 -p:Digital+ -129b:00c00000:03f7:0001:1:0 -Telefonchat TV -p:BetaDigital -749b:00c00000:041c:0001:1:0 -FOX NEWS -p:FOXNWS -769b:00c00000:041e:0001:1:0 -MULTIDEP.4 -p:Digital+ -129c:00c00000:03f7:0001:1:0 -Dreamdate TV -p:BetaDigital -749c:00c00000:041c:0001:1:0 -BABY TV -p:DIGITAL+ -759c:00c00000:0422:0001:1:0 -C+ PORTADA -p:DIGITAL+ -769c:00c00000:041e:0001:1:0 -MULTIDEP.3 -p:Digital+ -779c:00c00000:0424:0001:1:0 -C+ FÚTBOL -p:CPD1 -129d:00c00000:03f7:0001:1:0 -Chat TV -p:BetaDigital -239d:00c00000:044a:0001:1:0 - -p:CSAT -749d:00c00000:041c:0001:1:0 -CANAL CLUB -p:DIGITAL+ -769d:00c00000:041e:0001:1:0 -MULTIDEP.2 -p:Digital + -779d:00c00000:0424:0001:1:0 -C+ DEPORTES -p:CPD2 -129e:00c00000:03f7:0001:1:0 -Beate Uhse Sexy Sat -p:BetaDigital -219e:00c00000:0448:0001:1:0 -O.CINE GEANTS -p: -429e:00c00000:0446:0001:1:0 -XXL -p:AB -749e:00c00000:041c:0001:1:0 -BOING -p:DIGITAL+ -769e:00c00000:041e:0001:1:0 -C+LIGA2 E -p:DIGITALT+ -129f:00c00000:03f7:0001:1:0 -Flirten TV -p:BetaDigital -209f:00c00000:0432:0001:1:0 -CINE+ CLUB -p:CSAT -219f:00c00000:0448:0001:1:0 -NAUTICAL CHANNEL -p:CSAT -749f:00c00000:041c:0001:1:0 -ENERGY -p:DIGITAL+ -769f:00c00000:041e:0001:1:0 -10788V SID 0x769f -p:DVB-S QPSK 10788V 19.2°E -12a0:00c00000:03f7:0001:1:0 -Singletreff TV -p:BetaDigital -20a0:00c00000:0432:0001:1:0 -MCM -p:CSAT -74a0:00c00000:041c:0001:1:0 -BARÇA TV -p:BARNA -76a0:00c00000:041e:0001:1:0 -10788V SID 0x76a0 -p:DVB-S QPSK 10788V 19.2°E -12a1:00c00000:03f7:0001:1:0 -Achtung Singles TV -p:BetaDigital -20a1:00c00000:0432:0001:1:0 -TV BREIZH -p:CSAT -74a1:00c00000:041c:0001:1:0 -ANIMAX -p:DIGITAL+ -0fa2:00c00000:0451:0035:1:0 -SBS6 -p:CANALDIGITAAL -12a2:00c00000:03f7:0001:1:0 -SAT Flirt TV -p:BetaDigital -20a2:00c00000:0432:0001:1:0 -MCM POP -p:CSAT -23a2:00c00000:044a:0001:1:0 - -p:CSAT -74a2:00c00000:041c:0001:1:0 -MTV ESPAÑA -p:DIGITAL+ -76a2:00c00000:041e:0001:1:0 -C+ MultiCINE -p:DIGITAL+ -0fa3:00c00000:0451:0035:1:0 -NET5 -p:CANALDIGITAAL -12a3:00c00000:03f7:0001:1:0 -GayBoys LIVE -p:BetaDigital -20a3:00c00000:0432:0001:1:0 -A VOIR CE SOIR -p:CSAT -21a3:00c00000:0448:0001:1:0 -12324V SID 0x21a3 -p:DVB-S QPSK 12324V 19.2°E -23a3:00c00000:044a:0001:1:0 -CSAT DEMANDE -p:CSAT -42a3:00c00000:0446:0001:1:0 -DORCEL TV -p:AB -74a3:00c00000:041c:0001:1:0 -C.ESTRELLAS -p:GALAV -76a3:00c00000:041e:0001:1:0 -C+ MultiDEP -p:DIGITAL+ -20a4:00c00000:0432:0001:1:0 -W9 -p:CSAT -23a4:00c00000:044a:0001:1:0 - -p:CSAT -2ea4:00c00000:0405:0001:1:0 -RTL2 HD Austria -p:CBC -74a4:00c00000:041c:0001:1:0 -MOTORS TV -p: -75a4:00c00000:0422:0001:1:0 -10847V SID 0x75a4 -p:DVB-S QPSK 10847V 19.2°E -20a5:00c00000:0432:0001:1:0 -FRANCE 2 -p:CSAT -21a5:00c00000:0448:0001:1:0 -PRIVATE SPICE -p:CSAT -23a5:00c00000:044a:0001:1:0 - -p:CSAT -33a5:00c00000:03eb:0001:1:0 -ORF SPORT+ -p:ORF,C:0d95,C:0648,C:0d05,C:09c4,C:1702,C:1833,C:098c -33a6:00c00000:03eb:0001:1:0 -VOLKS TV -p:- -75a6:00c00000:0422:0001:1:0 -10847V SID 0x75a6 -p:DVB-S QPSK 10847V 19.2°E -21a7:00c00000:0448:0001:1:0 - -p:CSAT -33a7:00c00000:03eb:0001:1:0 -ATV2 -p:ATV,C:0d05,C:0d95,C:0648,C:09c4,C:1702,C:1833,C:098c -00a8:00c00000:0001:0085:1:0 -†Motorvis‡ion TV -p:SKY,C:1861 -20a8:00c00000:0432:0001:1:0 -TEST CDN 8 -p:CSAT -21a8:00c00000:0448:0001:1:0 -CDN12 -p:CSAT -33a8:00c00000:03eb:0001:1:0 -. -p:- -20a9:00c00000:0432:0001:1:0 - -p:CSAT -21a9:00c00000:0448:0001:1:0 -MCS EXTREME -p: -33a9:00c00000:03eb:0001:1:0 -Schau TV -p:- -75a9:00c00000:0422:0001:1:0 -CANAL+ GUÍA -p:DIGITAL+ -33aa:00c00000:03eb:0001:1:0 -Starparadies AT -p:- -75aa:00c00000:0422:0001:1:0 - -p:Digital + -0fab:00c00000:0451:0035:1:0 -NED1 -p:CANALDIGITAAL -20ab:00c00000:0432:0001:1:0 -11895V SID 0x20ab -p:DVB-S QPSK 11895V 19.2°E -33ab:00c00000:03eb:0001:1:0 -RIC -p:- -75ab:00c00000:0422:0001:1:0 - -p:DIGITAL+ -0fac:00c00000:0451:0035:1:0 -NED2 -p:CANALDIGITAAL -33ac:00c00000:03eb:0001:1:0 -TELE 5 Austria -p:ATV -0fad:00c00000:0451:0035:1:0 -NED3 -p:CANALDIGITAAL -20ad:00c00000:0432:0001:1:0 -MCM TOP -p:CSAT -33ad:00c00000:03eb:0001:1:0 -MELODIE Express -p:ORS -0fae:00c00000:0451:0035:1:0 -Nickelodeon -p:CANALDIGITAAL -20ae:00c00000:0432:0001:1:0 -TF1 -p:CSAT -33ae:00c00000:03eb:0001:1:0 -. -p:ORS -75ae:00c00000:0422:0001:1:0 - -p:Digital + -0faf:00c00000:0451:0035:1:0 -NGC -p:CANALDIGITAAL -20af:00c00000:0432:0001:1:0 -M6 -p:IMEDIA -21af:00c00000:0448:0001:1:0 -MOSAIQUE C+ -p:CSAT -75af:00c00000:0422:0001:1:0 - -p:DIGITAL+ -0fb0:00c00000:0451:0035:1:0 -BVN -p:CANALDIGITAAL -21b0:00c00000:0448:0001:1:0 -MOSAIQUE -p:CSAT -75b0:00c00000:0422:0001:1:0 -C+ TAQUILLA -p:DIGITAL+ -21b1:00c00000:0448:0001:1:0 -12324V SID 0x21b1 -p:DVB-S QPSK 12324V 19.2°E -75b1:00c00000:0422:0001:1:0 -CANAL+ GUÍA -p:DIGITAL+ -75b2:00c00000:0422:0001:1:0 -C+ TAQUILLA -p:DIGITAL+ -20b3:00c00000:0432:0001:1:0 -TF1 -p:CSAT -20b4:00c00000:0432:0001:1:0 -M6 -p:CSAT -20b5:00c00000:0432:0001:1:0 -W9 -p:CSAT -20b6:00c00000:0432:0001:1:0 -FRANCE 2 -p:CSAT -12b8:00c00000:03f7:0001:1:0 -Multytext -p:BetaDigital -77bb:00c00000:040a:0001:1:0 -10979V SID 0x77bb -p:DVB-S QPSK 10979V 19.2°E -1bbc:00c00000:0423:0001:1:0 -TVP1 -p:Telewizja Polska SA -77bc:00c00000:040a:0001:1:0 -FDF -p:DIGITAL+ -1bbd:00c00000:0423:0001:1:0 -TVP2 -p:TVP -1bbe:00c00000:0423:0001:1:0 -TVP INFO -p:TVP -77be:00c00000:040a:0001:1:0 -CLAN TVE -p:Digital+ -1bbf:00c00000:0423:0001:1:0 -TVP Sport -p:TVP -77bf:00c00000:040a:0001:1:0 -LA SEXTA -p:Digital+ -1bc0:00c00000:0423:0001:1:0 -TV Polonia -p:TVP -21c0:00c00000:0448:0001:1:0 -MOSAIQUE C+ -p:CSAT -76c0:00c00000:040e:0001:1:0 -CANAL+ 1 -p:DIGITAL+ -77c0:00c00000:040a:0001:1:0 -TVE 1 -p:TVE 1 -1bc1:00c00000:0423:0001:1:0 -TVP Historia -p:TVP -21c1:00c00000:0448:0001:1:0 -MOSAIQUE -p:CSAT -76c1:00c00000:040e:0001:1:0 -11038V SID 0x76c1 -p:DVB-S QPSK 11038V 19.2°E -77c1:00c00000:040a:0001:1:0 -HOLLYWOOD -p:HOLLYW -1bc2:00c00000:0423:0001:1:0 -TVP Kultura -p:TVP -24c2:00c00000:043c:0001:1:0 -O.CINE CHOC -p: -77c2:00c00000:040a:0001:1:0 -LA 2 -p:La2 -1bc3:00c00000:0423:0001:1:0 -BELSAT TV -p:TVP SA -24c3:00c00000:043c:0001:1:0 -O.CINE NOVO -p: -76c3:00c00000:040e:0001:1:0 -DISNEY CH. -p:DCH -77c3:00c00000:040a:0001:1:0 -TELECINCO -p:DIGITAL+ -1bc4:00c00000:0423:0001:1:0 -TVP Seriale -p:TVP -24c4:00c00000:043c:0001:1:0 -O.CINE HAPPY -p: -76c4:00c00000:040e:0001:1:0 -SPORTMANÍA -p:SPM -77c4:00c00000:040a:0001:1:0 - -p:DIGITAL+ -22c5:00c00000:045a:0001:1:0 -TRACE TROPICAL -p:IMEDIA -76c5:00c00000:040e:0001:1:0 -40 TV -p:+MUS -77c5:00c00000:040a:0001:1:0 -CANAL+ XTRA -p:DIGITAL+ -22c6:00c00000:045a:0001:1:0 -LA CHAINE METEO -p:CSAT -75c6:00c00000:0422:0001:1:0 -C+ PORTADA -p:DIGITAL+ -77c6:00c00000:040a:0001:1:0 -10979V SID 0x77c6 -p:DVB-S QPSK 10979V 19.2°E -22c7:00c00000:045a:0001:1:0 -CINE+ STAR -p:CSAT -75c7:00c00000:0422:0001:1:0 - -p:DIGITAL+ -76c7:00c00000:040e:0001:1:0 -TCM -p:TCM -77c7:00c00000:040a:0001:1:0 -CUATRO -p:Digital+ -23c8:00c00000:044a:0001:1:0 -DT11 -p:CSAT -76c8:00c00000:040e:0001:1:0 -PAR. COMEDY -p:NC -22c9:00c00000:045a:0001:1:0 -EQUIDIA LIVE -p:CSAT -32c9:00c00000:045d:0001:1:0 -ORF1 -p:ORF,C:0d05,C:0d95,C:0648,C:1702,C:1833,C:09c4,C:098c -76c9:00c00000:040e:0001:1:0 -VIAJAR -p:VJR -77c9:00c00000:040a:0001:1:0 -TNT -p:CMA30 -22ca:00c00000:045a:0001:1:0 -DISNEY CHANNEL+1 -p:CSAT -23ca:00c00000:044a:0001:1:0 -DT13 -p:CSAT -32ca:00c00000:045d:0001:1:0 -ORF2 -p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c -6dca:00c00000:044d:0001:1:0 -Das Erste -p:ARD -75ca:00c00000:0422:0001:1:0 - -p:DIGITAL+ -76ca:00c00000:040e:0001:1:0 -CANAL+ 2 -p:DIGITAL+ -22cb:00c00000:045a:0001:1:0 -DISNEY JUNIOR -p:CSAT -32cb:00c00000:045d:0001:1:0 -ORF2 W -p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c -6dcb:00c00000:044d:0001:1:0 -Bayerisches FS Süd -p:ARD -22cc:00c00000:045a:0001:1:0 -DISNEY CINEMAGIC -p:CSAT -32cc:00c00000:045d:0001:1:0 -ORF2 N -p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c -6dcc:00c00000:044d:0001:1:0 -hr-fernsehen -p:ARD -75cc:00c00000:0422:0001:1:0 - -p:DIGITAL+ -76cc:00c00000:040e:0001:1:0 -TELEDEPORTE -p:TDEP -22cd:00c00000:045a:0001:1:0 -DISNEY MAGIC+1 -p:CSAT -32cd:00c00000:045d:0001:1:0 -ORF2 B -p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c -32ce:00c00000:045d:0001:1:0 -ORF2 O -p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c -6dce:00c00000:044d:0001:1:0 -Bayerisches FS Nord -p:ARD -75ce:00c00000:0422:0001:1:0 - -p:DIGITAL + -76ce:00c00000:040e:0001:1:0 -CANAL COCINA -p:CACOC -22cf:00c00000:045a:0001:1:0 -E! ENTERTAINMENT -p:CSAT -32cf:00c00000:045d:0001:1:0 -ORF2 S -p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c -6dcf:00c00000:044d:0001:1:0 -WDR Köln -p:ARD -75cf:00c00000:0422:0001:1:0 - -p:Digital + -1bd0:00c00000:0423:0001:1:0 -TVP HD -p:TVP -32d0:00c00000:045d:0001:1:0 -ORF2 T -p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c -32d1:00c00000:045d:0001:1:0 -ORF2 V -p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c -6dd1:00c00000:044d:0001:1:0 -SWR Fernsehen BW -p:ARD -20d2:00c00000:043e:0001:1:0 -A LA CARTE 1 -p:CSAT -32d2:00c00000:045d:0001:1:0 -ORF2 St -p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c -20d3:00c00000:043e:0001:1:0 -A LA CARTE 2 -p:CSAT -32d3:00c00000:045d:0001:1:0 -ORF2 K -p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c -07d4:00c00000:0449:0035:1:0 -RTL4 -p:CANALDIGITAAL -20d4:00c00000:043e:0001:1:0 -A LA CARTE 3 -p:CSAT -32d4:00c00000:045d:0001:1:0 -ATV -p:ATV+,C:0d05,C:0d95,C:0648,C:1702,C:1833,C:09c4,C:098c -07d5:00c00000:0449:0035:1:0 -RTL5 -p:CANALDIGITAAL -20d5:00c00000:043e:0001:1:0 -A LA CARTE 4 -p:CSAT -32d5:00c00000:045d:0001:1:0 -HITRADIO OE3 -p:ORF,C:0d05,C:0d95,C:0648,C:1702,C:1833,C:09c4,C:098c -07d6:00c00000:0449:0035:1:0 -RTL7 -p:CANALDIGITAAL -20d6:00c00000:043e:0001:1:0 -A LA CARTE 5 -p:CSAT -32d6:00c00000:045d:0001:1:0 -ORF2E -p:ORF -1fd7:00c00000:0434:0001:1:0 -EUROSPORT -p:CSAT -20d7:00c00000:043e:0001:1:0 -A LA CARTE 6 -p:CSAT -1fd8:00c00000:0434:0001:1:0 -TMC -p:CSAT -20d8:00c00000:043e:0001:1:0 -A LA CARTE 7 -p:CSAT -77d8:00c00000:040a:0001:1:0 -NAT GEO WILD -p:DIGITAL+ -1fd9:00c00000:0434:0001:1:0 -PLANETE+ -p:CSAT -20d9:00c00000:043e:0001:1:0 -A LA CARTE 8 -p:CSAT -75d9:00c00000:0422:0001:1:0 - -p:Digital + -1fda:00c00000:0434:0001:1:0 -TELETOON+ -p:CSAT -1fdb:00c00000:0434:0001:1:0 -VOYAGE -p:CSAT -20db:00c00000:043e:0001:1:0 -A LA CARTE 10 -p:CSAT -32db:00c00000:045d:0001:1:0 -R IC -p:- -1fdc:00c00000:0434:0001:1:0 -LCI -p:CSAT -20dc:00c00000:043e:0001:1:0 -A LA CARTE 11 -p:CSAT -00dd:00c00000:0004:0085:1:0 -Sky †Sport‡ †1‡ -p:SKY,C:1861 -1fdd:00c00000:0434:0001:1:0 -TEVA -p:CSAT -75dd:00c00000:0422:0001:1:0 -TEST TÉCNICO -p:DIGITAL+ -00de:00c00000:0004:0085:1:0 -Sky †Sport‡ †2‡ -p:SKY,C:1861 -1fde:00c00000:0434:0001:1:0 -COMEDIE+ -p:CSAT -75de:00c00000:0422:0001:1:0 -TEST_CSD1 -p:DIGITAL+ -00df:00c00000:0004:0085:1:0 -†Sky Bu‡ndes†li‡ga -p:SKY,C:1861 -07df:00c00000:0449:0035:1:0 -Discovery -p:CANALDIGITAAL -1fdf:00c00000:0434:0001:1:0 -ARTE -p:CSAT -75df:00c00000:0422:0001:1:0 -TEST_CSD2 -p:DIGITAL+ -1fe0:00c00000:0434:0001:1:0 -SERIE CLUB -p:CSAT -75e0:00c00000:0422:0001:1:0 -TEST_CSD3 -p:DIGITAL+ -79e0:00c00000:0443:0001:1:0 -Eurosport Deutschland -p:SES Astra -1fe1:00c00000:0434:0001:1:0 -JUNE -p:CSAT -6ee1:00c00000:04b1:0001:1:0 -Radio Bremen TV -p:ARD -75e1:00c00000:0422:0001:1:0 -TEST_CSD4 -p:DIGITAL+ -1fe2:00c00000:0434:0001:1:0 -TIJI -p:CSAT -75e2:00c00000:0422:0001:1:0 -TEST_CSD5 -p:DIGITAL+ -2ee3:00c00000:0441:0001:1:0 -†RTL‡ Television -p:RTL World,c:0000a3,c:010068,c:020069,c:0300a3 -31e3:00c00000:045f:0035:1:0 -VTM -p:TV Vlaanderen -75e3:00c00000:0422:0001:1:0 - -p:DIGITAL+ -07e4:00c00000:0449:0035:1:0 -Animal Planet/TLC -p:CANALDIGITAAL -2ee4:00c00000:0441:0001:1:0 -RTL Regional NRW -p:RTL World -31e4:00c00000:045f:0035:1:0 -2BE -p:TV Vlaanderen -25e5:00c00000:045e:0001:1:0 -FR3 AMIENS -p:CSAT -2ee5:00c00000:0441:0001:1:0 -RTL HB NDS -p:RTL World -31e5:00c00000:045f:0035:1:0 -VT4 -p:TV Vlaanderen -25e6:00c00000:045e:0001:1:0 -FR3 BESANCON -p:CSAT -2ee6:00c00000:0441:0001:1:0 -RTL FS -p:RTL World -25e7:00c00000:045e:0001:1:0 -FR3 BORDEAUX -p:CSAT -31e7:00c00000:045f:0035:1:0 -een -p:TV Vlaanderen -25e8:00c00000:045e:0001:1:0 -FR3 NANCY -p:CSAT -31e8:00c00000:045f:0035:1:0 -Canvas -p:TV Vlaanderen -07e9:00c00000:0449:0035:1:0 -EUROSPORT -p:CANALDIGITAAL -25e9:00c00000:045e:0001:1:0 -FR3 CLERMONT FD -p:CSAT -31e9:00c00000:045f:0035:1:0 -Vitaya -p:TV Vlaanderen -07ea:00c00000:0449:0035:1:0 -EUROSPORT CZ -p:CANALDIGITAAL -25ea:00c00000:045e:0001:1:0 -FR3 PARIS -p:CSAT -79ea:00c00000:0443:0001:1:0 -HSE24 EXTRA -p:SES Astra -1feb:00c00000:0434:0001:1:0 -TMC -p:CSAT -25eb:00c00000:045e:0001:1:0 -FR3 RENNES -p:CSAT -6eeb:00c00000:04b1:0001:1:0 -WDR Test A -p:ARD -13ec:00c00000:0403:0001:1:0 -3D Tile Format -p:SES ASTRA -1fec:00c00000:0434:0001:1:0 -ARTE -p:CSAT -23ec:00c00000:044a:0001:1:0 -12363V SID 0x23ec -p:DVB-S QPSK 12363V 19.2°E -25ec:00c00000:045e:0001:1:0 -FR3 ROUEN -p:CSAT -6fec:00c00000:042a:0001:1:0 -MTV FRANCE -p:MTV Networks Europe -13ed:00c00000:0403:0001:1:0 -ASTRA 3D demo -p:SES ASTRA -25ed:00c00000:045e:0001:1:0 -FR3 LIMOGES -p:CSAT -75ed:00c00000:0422:0001:1:0 - -p:Digital+ -25ee:00c00000:045e:0001:1:0 -FR3 LYON -p:CSAT -6fee:00c00000:042a:0001:1:0 -MTV Hits -p:MTV Networks Europe -75ee:00c00000:0422:0001:1:0 - -p:Digital + -07ef:00c00000:0449:0035:1:0 -Veronica/DisneyXD -p:CANALDIGITAAL -25ef:00c00000:045e:0001:1:0 -FR3 MARSEILLE -p:CSAT -6fef:00c00000:042a:0001:1:0 -MTV Dance -p:MTV Networks Europe -75ef:00c00000:0422:0001:1:0 - -p:DIGITAL+ -25f0:00c00000:045e:0001:1:0 -FR3 TOULOUSE -p:CSAT -31f0:00c00000:045f:0035:1:0 -VIJFtv -p:TV Vlaanderen -6ff0:00c00000:042a:0001:1:0 -VH1 -p:MTV Networks Europe -23f1:00c00000:0452:0001:1:0 -DIRECT STAR -p:CSAT -31f1:00c00000:045f:0035:1:0 -vtmKazoom/Kanaal Z -p:TV Vlaanderen -6ff1:00c00000:042a:0001:1:0 -VH1 Classic -p:MTV Networks Europe -75f1:00c00000:0422:0001:1:0 - -p:Digital+ -23f2:00c00000:0452:0001:1:0 -LCP -p:CSAT -6ff2:00c00000:042a:0001:1:0 -NICKELODEON France. -p:MTV Networks Europe -75f2:00c00000:0422:0001:1:0 - -p:Digital+ -07f3:00c00000:0449:0035:1:0 -RTL8 -p:CANALDIGITAAL -23f3:00c00000:0452:0001:1:0 -FRANCE 4 -p:CSAT -6ff3:00c00000:042a:0001:1:0 -MTV ROCKS -p:MTV Networks Europe -75f3:00c00000:0422:0001:1:0 - -p:Contactanos -07f4:00c00000:0449:0035:1:0 -Comedy Central/Kindernet -p:CANALDIGITAAL -23f4:00c00000:0452:0001:1:0 -A LA CARTE 9 -p:CSAT -2ef4:00c00000:0441:0001:1:0 -RTL2 -p:RTL World -31f4:00c00000:045f:0035:1:0 -Man-X -p:TV Vlaanderen -6ff4:00c00000:042a:0001:1:0 -Nick -p:MTV Networks Europe -75f4:00c00000:0422:0001:1:0 -10847V SID 0x75f4 -p:DVB-S QPSK 10847V 19.2°E -79f4:00c00000:0443:0001:1:0 -EuroNews -p:Globecast -23f5:00c00000:0452:0001:1:0 -CANALPLAY -p:CSAT -6ff5:00c00000:042a:0001:1:0 -MTV BASE FRANCE -p:MTV Networks Europe -75f5:00c00000:0422:0001:1:0 - -p:DIGITAL + -1af6:00c00000:03fe:0001:1:0 -beIN SPORT1 -p: -23f6:00c00000:0452:0001:1:0 -GULLI -p:CSAT -31f6:00c00000:045f:0035:1:0 -Acht -p:TV Vlaanderen -23f7:00c00000:0452:0001:1:0 -FRANCE Ô -p:CSAT -6ff7:00c00000:042a:0001:1:0 -GAME ONE -p:MTV Networks Europe -11f8:00c00000:03fd:0001:1:0 -a.tv -p:BetaDigital -13f8:00c00000:0403:0001:1:0 -HOLIDAY -p:SES ASTRA -1af8:00c00000:03fe:0001:1:0 -Russia Today -p:GlobeCast -6ff8:00c00000:042a:0001:1:0 -MTV Hits. -p:MTV Networks Europe -11f9:00c00000:03fd:0001:1:0 -†Franken Fern‡sehen -p:BetaDigital -13f9:00c00000:0403:0001:1:0 -TRT Turk -p:SES ASTRA -1af9:00c00000:03fe:0001:1:0 -France 24 (en Français) -p:GlobeCast -23f9:00c00000:0452:0001:1:0 -GOLF+ -p:CSAT -75f9:00c00000:0408:0001:1:0 -NITRO -p:DIGITAL+ -07fa:00c00000:0449:0035:1:0 -Hustler TV -p:CANALDIGITAAL -11fa:00c00000:03fd:0001:1:0 -Franken SAT -p:BetaDigital -1afa:00c00000:03fe:0001:1:0 -France 24 (in English) -p:GlobeCast -6ffa:00c00000:042a:0001:1:0 -VH1. -p:MTV Networks Europe -75fa:00c00000:0408:0001:1:0 -C+ DEP 2 HD -p:DIGITAL+ -07fb:00c00000:0449:0035:1:0 -Hustler TV CZ -p:CANALDIGITAAL -11fb:00c00000:03fd:0001:1:0 -Lokal SAT -p:BetaDigital -13fb:00c00000:0403:0001:1:0 -REDLIGHT PLATINUM -p:TELESPAZIO -2afb:00c00000:0417:0001:1:0 -ORANGE CINE HAPPY -p:GlobeCast France -6ffb:00c00000:042a:0001:1:0 -VH1 Classic. -p:MTV Networks Europe -02fc:00c00000:0005:0085:1:0 -ANIXE SD -p:BetaDigital -07fc:00c00000:0449:0035:1:0 -Planet -p:Canaldigitaal -11fc:00c00000:03fd:0001:1:0 -mütv/RFO -p:BetaDigital -1afc:00c00000:03fe:0001:1:0 -beIN SPORT2 -p: -2afc:00c00000:0417:0001:1:0 -ORANGE CINE CHOC -p:GlobeCast France -6ffc:00c00000:042a:0001:1:0 -NICKELODEON France -p:MTV Networks Europe -75fc:00c00000:0408:0001:1:0 -C+ RADIOS -p:DIGITAL+ -02fd:00c00000:0007:0085:1:0 -pearl.tv Technik-Shop -p:BetaDigital -07fd:00c00000:0449:0035:1:0 -Dorcel TV -p:Canaaldigitaal -11fd:00c00000:03fd:0001:1:0 -†ONTV‡ Regional -p:BetaDigital -21fd:00c00000:044c:0001:1:0 -MAISON+ -p:CSAT -2afd:00c00000:0417:0001:1:0 -ORANGE CINE NOVO -p:GlobeCast France -6ffd:00c00000:042a:0001:1:0 -MTV ROCKS. -p:MTV Networks Europe -75fd:00c00000:0408:0001:1:0 -C+ infoDEPORTE -p:DIGITAL + -11fe:00c00000:03fd:0001:1:0 -Bay TV 1 -p:BetaDigital -1afe:00c00000:03fe:0001:1:0 -France 24 (in Arabic) -p:GlobeCast -21fe:00c00000:044c:0001:1:0 -JIMMY -p:CSAT -2afe:00c00000:0417:0001:1:0 -ORANGE CINE GEANTS -p:GlobeCast France -2efe:00c00000:0441:0001:1:0 -RTL Living -p:RTL -75fe:00c00000:0408:0001:1:0 -NEOX -p:DIGITAL+ -07ff:00c00000:0449:0035:1:0 -Animax -p:CANALDIGITAAL -11ff:00c00000:03fd:0001:1:0 -Bay TV 2 -p:BetaDigital -1aff:00c00000:03fe:0001:1:0 -FASHION ONE -p:GlobeCast Asia -21ff:00c00000:044c:0001:1:0 -SYFY -p:CSAT -2aff:00c00000:0417:0001:1:0 -Test 1 -p:GlobeCast France -6fff:00c00000:0436:0001:1:0 -MTV Music 24 -p:MTV Networks Europe -75ff:00c00000:0408:0001:1:0 -PANDA -p:DIGITAL+ -0803:00c00000:0449:0035:2:0 -RTL RADIO -p:CANALDIGITAAL -6f03:00c00000:0445:0001:2:0 -hr1 -p:ARD HR -0804:00c00000:0449:0035:2:0 -RTL 1440 -p:CANALDIGITAAL -6f04:00c00000:0445:0001:2:0 -hr2 -p:ARD HR -6f05:00c00000:0445:0001:2:0 -hr3 -p:ARD HR -6f06:00c00000:0445:0001:2:0 -hr4 -p:ARD HR -0807:00c00000:0449:0035:2:0 -NL-Radio 1 -p:CANALDIGITAAL -6f07:00c00000:0445:0001:2:0 -YOU FM -p:ARD HR -0808:00c00000:0449:0035:2:0 -NL-Radio 2 -p:CANALDIGITAAL -6f08:00c00000:0445:0001:2:0 -hr-iNFO -p:ARD HR -0809:00c00000:0449:0035:2:0 -NL-3FM -p:CANALDIGITAAL -080a:00c00000:0449:0035:2:0 -NL-Radio 4 -p:CANALDIGITAAL -080b:00c00000:0449:0035:2:0 -NL-Radio 5 -p:CANALDIGITAAL -080c:00c00000:0449:0035:2:0 -NL-Radio 6 -p:CANALDIGITAAL -6f0c:00c00000:0445:0001:2:0 -MDR1 SACHSEN -p:ARD MDR -6f0d:00c00000:0445:0001:2:0 -MDR1 SA-ANHALT -p:ARD MDR -6f0e:00c00000:0445:0001:2:0 -MDR1 THÜRINGEN -p:ARD MDR -6f0f:00c00000:0445:0001:2:0 -MDR FIGARO -p:ARD MDR -0810:00c00000:0449:0035:2:0 -Sky Radio -p:CANALDIGITAAL -6f10:00c00000:0445:0001:2:0 -MDR JUMP -p:ARD MDR -6f11:00c00000:0445:0001:2:0 -MDR SPUTNIK -p:ARD MDR -0812:00c00000:0449:0035:2:0 -Radio538 -p:CANALDIGITAAL -6f12:00c00000:0445:0001:2:0 -MDR INFO -p:ARD MDR -0813:00c00000:0449:0035:2:0 -Radio10Gold -p:CANALDIGITAAL -6f13:00c00000:0445:0001:2:0 -MDR KLASSIK -p:ARD MDR -0814:00c00000:0449:0035:2:0 -Radio Veronica -p:CANALDIGITAAL -0815:00c00000:0449:0035:2:0 -Classic FM -p:CANALDIGITAAL -6f15:00c00000:0445:0001:2:0 -NDR 2 -p:ARD NDR -6f16:00c00000:0445:0001:2:0 -NDR Kultur -p:ARD NDR -0817:00c00000:0449:0035:2:0 -Slam FM -p:CANALDIGITAAL -6f17:00c00000:0445:0001:2:0 -NDR Info -p:ARD NDR -6f18:00c00000:0445:0001:2:0 -N-JOY -p:ARD NDR -6f19:00c00000:0445:0001:2:0 -NDR 90,3 -p:ARD NDR -6f1a:00c00000:0445:0001:2:0 -NDR1WelleNord -p:ARD NDR -6f1b:00c00000:0445:0001:2:0 -NDR 1 Radio MV -p:ARD NDR -6f1c:00c00000:0445:0001:2:0 -NDR 1 Nieders. -p:ARD NDR -6f1d:00c00000:0445:0001:2:0 -NDR Info Spez. -p:ARD NDR -6f20:00c00000:0445:0001:2:0 -Bremen Eins -p:ARD RB -6f21:00c00000:0445:0001:2:0 -Nordwestradio -p:ARD RB -6f22:00c00000:0445:0001:2:0 -Bremen Vier -p:ARD RB -6f24:00c00000:0445:0001:2:0 -Inforadio -p:ARD rbb -6f25:00c00000:0445:0001:2:0 -Kulturradio -p:ARD rbb -7725:00c00000:0416:0001:2:0 -11156V SID 0x7725 -p:DVB-S QPSK 11156V 19.2°E -6f26:00c00000:0445:0001:2:0 -Antenne Brandenburg -p:ARD rbb -6f27:00c00000:0445:0001:2:0 -radioBERLIN 88,8 -p:ARD rbb -6f28:00c00000:0445:0001:2:0 -radioeins -p:ARD rbb -6f29:00c00000:0445:0001:2:0 -Fritz -p:ARD rbb -6f2d:00c00000:0445:0001:2:0 -SR1 Europawelle -p:ARD SR -6f2e:00c00000:0445:0001:2:0 -SR2 KulturRadio -p:ARD SR -6f2f:00c00000:0445:0001:2:0 -SR3 Saarlandwelle -p:ARD SR -6f31:00c00000:0445:0001:2:0 -SWR1 BW -p:ARD SWR -6f32:00c00000:0445:0001:2:0 -SWR1 RP -p:ARD SWR -6f33:00c00000:0445:0001:2:0 -SWR2 -p:ARD SWR -6f34:00c00000:0445:0001:2:0 -SWR3 -p:ARD SWR -6f35:00c00000:0445:0001:2:0 -SWR4 BW -p:ARD SWR -6f36:00c00000:0445:0001:2:0 -SWR4 RP -p:ARD SWR -6f37:00c00000:0445:0001:2:0 -DASDING -p:ARD SWR -6f38:00c00000:0445:0001:2:0 -SWRinfo -p:ARD SWR -213b:00c00000:0400:0001:2:0 -CANALSAT RADIOS -p:CSAT -6f3b:00c00000:0445:0001:2:0 -1LIVE -p:ARD WDR -6f3c:00c00000:0445:0001:2:0 -WDR 2 -p:ARD WDR -6f3d:00c00000:0445:0001:2:0 -WDR 3 -p:ARD WDR -6f3e:00c00000:0445:0001:2:0 -WDR 4 -p:ARD WDR -6f3f:00c00000:0445:0001:2:0 -WDR 5 -p:ARD WDR -6f40:00c00000:0445:0001:2:0 -WDR Funkhaus Europa -p:ARD WDR -3341:00c00000:045b:0001:2:0 -OE1 -p:ORF -6f41:00c00000:0445:0001:2:0 -1LIVE diggi -p:ARD WDR -3342:00c00000:045b:0001:2:0 -OE1 DD -p:ORF -6f42:00c00000:0445:0001:2:0 -KIRAKA -p:ARD WDR -3343:00c00000:045b:0001:2:0 -OE2 W -p:ORF -6f43:00c00000:0445:0001:2:0 -WDR Event -p:ARD WDR -3344:00c00000:045b:0001:2:0 -OE2 N -p:ORF -3345:00c00000:045b:0001:2:0 -OE2 B -p:ORF -7a45:00c00000:0410:0001:2:0 -CANAL SUR RADIO -p:Telefonica Servicios Audiovisuales -3346:00c00000:045b:0001:2:0 -OE2 O -p:ORF -2147:00c00000:0400:0001:2:0 -FRANCE MUSIQUE -p:CSAT -3347:00c00000:045b:0001:2:0 -OE2 S -p:ORF -2148:00c00000:0400:0001:2:0 -FIP -p:CSAT -3348:00c00000:045b:0001:2:0 -OE2 T -p:ORF -2149:00c00000:0400:0001:2:0 -FRANCE INFO -p:CSAT -3349:00c00000:045b:0001:2:0 -OE2 V -p:ORF -214a:00c00000:0400:0001:2:0 -FRANCE INTER -p:CSAT -334a:00c00000:045b:0001:2:0 -OE2 St -p:ORF -214b:00c00000:0400:0001:2:0 -FRANCE BLEU -p:CSAT -334b:00c00000:045b:0001:2:0 -OE2 K -p:ORF -214c:00c00000:0400:0001:2:0 -RFI INTERNAT -p:CSAT -214d:00c00000:0400:0001:2:0 -RADIO CLASSIQUE -p:CSAT -334d:00c00000:045b:0001:2:0 -OE3 -p:ORF -214e:00c00000:0400:0001:2:0 -EUROPE 1 -p:CSAT -334e:00c00000:045b:0001:2:0 -FM4 -p:ORF -214f:00c00000:0400:0001:2:0 -RMC INFO -p:CSAT -2150:00c00000:0400:0001:2:0 -RTL -p:CSAT -3350:00c00000:045b:0001:2:0 -U1 Tirol -p:U1 Tirol -2151:00c00000:0400:0001:2:0 -RIRE & CHANSONS -p:CSAT -2152:00c00000:0400:0001:2:0 -SUD RADIO -p:CSAT -2153:00c00000:0400:0001:2:0 -MC DOUALIYA -p:CSAT -2154:00c00000:0400:0001:2:0 -TSF JAZZ -p:CSAT -3354:00c00000:045b:0001:2:0 -RADIO MARIA -p:Radio Maria Österreich -2155:00c00000:0400:0001:2:0 -NOSTALGIE -p:CSAT -2156:00c00000:0400:0001:2:0 -BFM BUSINESS -p:CSAT -2157:00c00000:0400:0001:2:0 -JAZZ RADIO -p:CSAT -2158:00c00000:0400:0001:2:0 -NRJ -p:CSAT -2159:00c00000:0400:0001:2:0 -VIRGIN RADIO -p:CSAT -215a:00c00000:0400:0001:2:0 -RTL2 -p:CSAT -215b:00c00000:0400:0001:2:0 -SKYROCK -p:CSAT -215c:00c00000:0400:0001:2:0 -FUN RADIO -p:CSAT -215d:00c00000:0400:0001:2:0 -LE MOUV' -p:CSAT -215e:00c00000:0400:0001:2:0 -NOVA -p:CSAT -215f:00c00000:0400:0001:2:0 -RADIO DJ FG -p:CSAT -2160:00c00000:0400:0001:2:0 -VIBRATION -p:CSAT -2161:00c00000:0400:0001:2:0 -CONTACT FM -p:CSAT -2162:00c00000:0400:0001:2:0 -RADIO LATINA -p:CSAT -2163:00c00000:0400:0001:2:0 -RFM -p:CSAT -2164:00c00000:0400:0001:2:0 -CHERIE FM -p:CSAT -2165:00c00000:0400:0001:2:0 -11567V SID 0x2165 -p:DVB-S QPSK 11567V 19.2°E -2166:00c00000:0400:0001:2:0 -VOLTAGE -p:CSAT -2167:00c00000:0400:0001:2:0 -OUI FM -p:CSAT -2168:00c00000:0400:0001:2:0 -ADO -p:CSAT -2169:00c00000:0400:0001:2:0 -11567V SID 0x2169 -p:DVB-S QPSK 11567V 19.2°E -216a:00c00000:0400:0001:2:0 -11567V SID 0x216a -p:DVB-S QPSK 11567V 19.2°E -216b:00c00000:0400:0001:2:0 -RADIO NOTRE DAME -p:CSAT -316b:00c00000:0459:0001:2:0 -Inselradio -p:MEDIA BROADCAST -216c:00c00000:0400:0001:2:0 -RADIO ALFA -p:CSAT -6d6c:00c00000:0437:0001:2:0 -DKULTUR -p:ZDFvision -216d:00c00000:0400:0001:2:0 -RCJ / SHALOM -p:CSAT -316d:00c00000:0459:0001:2:0 -radio top40 -p:MEDIA BROADCAST -6d6d:00c00000:0437:0001:2:0 -DLF -p:ZDFvision -1b6e:00c00000:03fc:0001:2:0 -ETB Radio 1 -p:GlobeCast -216e:00c00000:0400:0001:2:0 -BEUR FM -p:CSAT -316e:00c00000:0459:0001:2:0 -ffn digital -p:MEDIA BROADCAST -146f:00c00000:040d:0001:2:0 -Radio Beograd -p:SES ASTRA -1b6f:00c00000:03fc:0001:2:0 -ETB Radio 2 -p:GlobeCast -216f:00c00000:0400:0001:2:0 -BBC ARABIC -p:CSAT -316f:00c00000:0459:0001:2:0 -Radio Paloma -p:MEDIA BROADCAST -2170:00c00000:0400:0001:2:0 -RFI MULTILINGUE -p:CSAT -3170:00c00000:0459:0001:2:0 -WRN Deutsch -p:MEDIA BROADCAST -2171:00c00000:0400:0001:2:0 -RCI SAT -p:CSAT -3171:00c00000:0459:0001:2:0 -Antenne 50Plus -p:MEDIA BROADCAST -6d71:00c00000:0437:0001:2:0 -DRadio Wissen -p:ZDFvision -2172:00c00000:0400:0001:2:0 -11567V SID 0x2172 -p:DVB-S QPSK 11567V 19.2°E -3172:00c00000:0459:0001:2:0 -Alternative FM -p:MEDIA BROADCAST -2173:00c00000:0400:0001:2:0 -FRANCE CULTURE -p:CSAT -3173:00c00000:0459:0001:2:0 -Radio Gloria -p:MEDIA BROADCAST -2174:00c00000:0400:0001:2:0 -11567V SID 0x2174 -p:DVB-S QPSK 11567V 19.2°E -3174:00c00000:0459:0001:2:0 -HIT RADIO FFH -p:MEDIA BROADCAST -2175:00c00000:0400:0001:2:0 -BBCW SERVICE -p:CSAT -3175:00c00000:0459:0001:2:0 -planet radio -p:MEDIA BROADCAST -2176:00c00000:0400:0001:2:0 -RADIO COURTOISIE -p:CSAT -3176:00c00000:0459:0001:2:0 -harmony.fm -p:MEDIA BROADCAST -3177:00c00000:0459:0001:2:0 -Radio Regenbogen -p:MEDIA BROADCAST -1c79:00c00000:0457:0001:2:0 -Radio Horeb -p:Eurociel -1c7c:00c00000:0457:0001:2:0 -Radio neue Hoffnung -p:RADIO Neue Hoffnung -1c82:00c00000:0457:0001:2:0 -Radio Maryja -p:SES ASTRA -238e:00c00000:044a:0001:2:0 -12363V SID 0x238e -p:DVB-S QPSK 12363V 19.2°E -1497:00c00000:040d:0001:2:0 -Mint -p:Telesat -1498:00c00000:040d:0001:2:0 -Bel RTL -p:CANALDIGITAAL -7598:00c00000:0422:0001:2:0 -RADIOS ESP -p:DIGITAL+ -1499:00c00000:040d:0001:2:0 -Radio Contact -p:CANALDIGITAAL -7599:00c00000:0422:0001:2:0 -10847V SID 0x7599 -p:DVB-S QPSK 10847V 19.2°E -759a:00c00000:0422:0001:2:0 -10847V SID 0x759a -p:DVB-S QPSK 10847V 19.2°E -759b:00c00000:0422:0001:2:0 -10847V SID 0x759b -p:DVB-S QPSK 10847V 19.2°E -00a0:00c00000:0007:0085:2:0 -†ROCK ANT‡ENNE -p:BetaDigital -00a1:00c00000:0007:0085:2:0 -ERF Plus -p:BetaDigital -14a5:00c00000:040d:0001:2:0 -Pure FM -p:CANALDIGITAAL -14a6:00c00000:040d:0001:2:0 -Classic21 -p:CANALDIGITAAL -14a7:00c00000:040d:0001:2:0 -VivaCite -p:CANALDIGITAAL -14a8:00c00000:040d:0001:2:0 -Musiq 3 -p:CANALDIGITAAL -00a9:00c00000:0007:0085:2:0 -†sunshine‡ live -p:BetaDigital -14a9:00c00000:040d:0001:2:0 -La Premiere -p:CANALDIGITAAL -00aa:00c00000:0007:0085:2:0 -†ANTENNE‡ BAYERN -p:BetaDigital,c:010160,c:030160 -00ab:00c00000:0005:0085:2:0 -domradio -p:BetaDigital -00ac:00c00000:0005:0085:2:0 -egoFM -p:BetaDigital -00ad:00c00000:0005:0085:2:0 -†Klassik‡ Radio -p:BetaDigital -00ae:00c00000:0005:0085:2:0 -. -p:BetaDigital -00af:00c00000:0005:0085:2:0 -†HOPE Ch‡annel Radio -p:BetaDigital -33af:00c00000:03eb:0001:2:0 -. -p:ORS -00b0:00c00000:0007:0085:2:0 -TEDDY -p:BetaDigital -33b0:00c00000:03eb:0001:2:0 -. -p:ORS -00b1:00c00000:0005:0085:2:0 -JAM FM -p:BetaDigital -33b1:00c00000:03eb:0001:2:0 -. -p:ORS -33b2:00c00000:03eb:0001:2:0 -. -p:ORS -33b3:00c00000:03eb:0001:2:0 -. -p:ORS -0fbe:00c00000:0451:0035:2:0 -BNR Nieuwsradio -p:Canaldigitaal -0fc3:00c00000:0451:0035:2:0 -FunX -p:CANALDIGITAAL -31ea:00c00000:045f:0035:2:0 -VRT Radio1 -p:TV Vlaanderen -31eb:00c00000:045f:0035:2:0 -VRT Radio2 -p:TV Vlaanderen -31ec:00c00000:045f:0035:2:0 -MNM -p:TV Vlaanderen -31ed:00c00000:045f:0035:2:0 -Studio Brussel -p:TV Vlaanderen -6eed:00c00000:04b1:0001:2:0 -MEHRKANALTEST -p:ARD -31ee:00c00000:045f:0035:2:0 -Klara -p:TV Vlaanderen -6ef0:00c00000:0445:0001:2:0 -Bayern 1 -p:ARD BR -6ef1:00c00000:0445:0001:2:0 -Bayern 2 -p:ARD BR -31f2:00c00000:045f:0035:2:0 -Q-music -p:TV Vlaanderen -6ef2:00c00000:0445:0001:2:0 -BAYERN 3 -p:ARD BR -31f3:00c00000:045f:0035:2:0 -JOEfm -p:TV Vlaanderen -6ef3:00c00000:0445:0001:2:0 -BR-KLASSIK -p:ARD BR -6ef4:00c00000:0445:0001:2:0 -B5 aktuell -p:ARD BR -31f5:00c00000:045f:0035:2:0 -Nostalgie -p:TV Vlaanderen -6ef5:00c00000:0445:0001:2:0 -BAYERN plus -p:ARD BR -6ef6:00c00000:0445:0001:2:0 -on3-radio -p:ARD BR -6ef8:00c00000:0445:0001:2:0 -B5 plus -p:ARD BR -1000:00c00000:0451:0035:12:0 -Nagra DL DSR7141 -p:Canaldigitaal -1001:00c00000:0451:0035:12:0 -pace DL DSR8141 -p:Canaldigitaal -1002:00c00000:0451:0035:12:0 -Nagra DL DSR 8141 -p:Canaldigitaal -1003:00c00000:0451:0035:12:0 -Hyunda SAT801 -p:Canaldigitaal -1c21:00c00000:0457:0001:12:0 -ROVI Guide -p:ROVI corporation -1c23:00c00000:0457:0001:12:0 -STB Setone -p:SES ASTRA -1c2c:00c00000:0457:0001:12:0 -tvtv premium -p:SES ASTRA -1337:00c00000:03ef:0001:12:0 -SGI_1007 -p:ORS -1c3e:00c00000:0457:0001:12:0 -Triax-Hirschmann -p:SES ASTRA -3145:00c00000:0459:0001:12:0 -RAPS -p:MEDIA BROADCAST -144f:00c00000:0403:0001:12:0 -KaCTFL -p:SES ASTRA -1c50:00c00000:0457:0001:12:0 -tvtv Digital -p:SES ASTRA -2b52:00c00000:0417:0001:12:0 -SSU SAMSUNG -p:Globecast -1c54:00c00000:0457:0001:12:0 -FP URMET -p:SES ASTRA -6e5a:00c00000:0431:0001:12:0 -ARD-Data-1 -p:ARD -1c60:00c00000:0457:0001:12:0 -STB Comag1 -p:SES ASTRA -1c63:00c00000:0457:0001:12:0 -STB Panasonic -p:SES ASTRA -1c64:00c00000:0457:0001:12:0 -STB Ten Haaft -p:SES ASTRA -1c66:00c00000:0457:0001:12:0 -Datendienst T1M -p: -1c69:00c00000:0457:0001:12:0 -tvtv RP -p:SES ASTRA -1c6f:00c00000:0457:0001:12:0 -tvtv DIGITAL -p:SES ASTRA -1c70:00c00000:0457:0001:12:0 -KaCTFL -p: -2773:00c00000:0402:0001:12:0 -Data System -p:SES ASTRA -1c77:00c00000:0457:0001:12:0 -Samsung iDTV EU Upgrade -p:SES ASTRA -1c78:00c00000:0457:0001:12:0 -TDT Data -p:SES ASTRA -1c7d:00c00000:0457:0001:12:0 -STB METZ Werke -p:SES ASTRA -1c7e:00c00000:0457:0001:12:0 -IDS DOWNLOAD SVC -p:SES ASTRA -1c7f:00c00000:0457:0001:12:0 -STB Sony Spain -p:SES ASTRA -0f80:00c00000:0002:0085:12:0 - -p:betaresearch -1c81:00c00000:0457:0001:12:0 -Kathrein DVB SSU -p:SES ASTRA -0f86:00c00000:0001:0085:12:0 -BData3 -p:BetaDigital -1c86:00c00000:0457:0001:12:0 -STB Telestar -p:SES ASTRA -0f8c:00c00000:0011:0085:12:0 -HUMAX PR-HD3000C -p: -0f9a:00c00000:0011:0085:12:0 -Pace TDC 866 NSDX -p: -0f9d:00c00000:000c:0085:12:0 -Pace TDS 866 NSD -p: -0f9e:00c00000:000c:0085:12:0 -Pace TDS 866 NSDX -p: -0fa5:00c00000:0011:0085:12:0 -Samsung CAB IPDL -p: -0fa6:00c00000:0011:0085:12:0 -Philips dic 2221 IPDL -p: -0fa7:00c00000:0011:0085:12:0 -Thomson SAT IPDL -p: -0dac:00c00000:0002:0085:12:0 -CPT_TP69 -p:SKY -0dad:00c00000:0001:0085:12:0 -CPT_TP83 -p:SKY -0dae:00c00000:0003:0085:12:0 -CPT_TP65 -p:SKY -0daf:00c00000:0004:0085:12:0 -CPT_TP81 -p:SKY -0db0:00c00000:0011:0085:12:0 -CPT_TP67 -p:SKY -0fb1:00c00000:000c:0085:12:0 -Pace TDS 865 NSDX -p: -33b4:00c00000:03eb:0001:12:0 -Handan OTA -p:ORS -0fb5:00c00000:0002:0085:12:0 -Thomson DCI12PRE -p: -0fb6:00c00000:0002:0085:12:0 -Philips DIS 2221 -p: -0fb8:00c00000:0002:0085:12:0 -Pace DS 830 NP -p: -0fbc:00c00000:000c:0085:12:0 -Pace TDS 865 NSD -p: -0fc3:00c00000:000c:0085:12:0 -HUMAX PR-HD3000S -p: -33c5:00c00000:045b:0001:12:0 -Opentech OTA1 -p:ORS -33c6:00c00000:045b:0001:12:0 -Opentech OTA2 -p:ORS -33c7:00c00000:045b:0001:12:0 -Opentech OTA3 -p:ORS -33c8:00c00000:045b:0001:12:0 -Opentech OTA4 -p:- -1ee6:00c00000:0457:0001:12:0 -SGI_1111 -p:SES ASTRA -0ff0:00c00000:0451:0035:12:0 -DownloadCDS -p:CANALDIGITAAL -0ff2:00c00000:0451:0035:12:0 -Hyundai SAT901 -p:Canaldigitaal -0ffb:00c00000:0451:0035:12:0 -Philips DL DSR 7121 -p:CANALDIGITAAL -0ffc:00c00000:0451:0035:12:0 -Nagra DL DSR7121 -p:CANALDIGITAAL -0ffd:00c00000:0451:0035:12:0 -Philips DL DSR 8121 -p:CANALDIGITAAL -0ffe:00c00000:0451:0035:12:0 -Nagra DL DSR 8121 -p:CANALDIGITAAL -0fff:00c00000:0451:0035:12:0 -pace DL DSR7141 -p:Canaldigitaal -3208:00c00000:045f:0035:22:0 -KetOp12 -p:TV Vlaanderen -3210:00c00000:045f:0035:22:0 -vtmKazoom/Kanaal Z (MPEG4) -p:TV Vlaanderen -3216:00c00000:045f:0035:22:0 -Acht (MPEG4) -p:TV Vlaanderen -3218:00c00000:045f:0035:22:0 -Man-X (MPEG4) -p:TV Vlaanderen -1523:00c00000:0455:0001:22:0 -Dr.DishTV-Welt der Technik -p:BetaDigital -5277:00c00000:041d:0001:22:0 -ASTRA Portal -p:BetaDigital -1479:00c00000:040d:0001:22:0 -La Une HD -p:SES ASTRA -147a:00c00000:040d:0001:22:0 -La Deux -p:SES ASTRA -147b:00c00000:040d:0001:22:0 -La Trois -p:Telesat -1483:00c00000:040d:0001:22:0 -RTL-TVi HD -p:SES ASTRA -1484:00c00000:040d:0001:22:0 -Club-RTL -p:SES ASTRA -1485:00c00000:040d:0001:22:0 -Plug-RTL -p:SES ASTRA -7500:00c00000:0420:0001:25:0 -C+ ACCIÓN HD -p:DIGITAL+ -7501:00c00000:0420:0001:25:0 -EUROSPORT HD -p:DIGITAL+ -7502:00c00000:0420:0001:25:0 -C+ DCINE HD -p:DIGITAL+ -7504:00c00000:0420:0001:25:0 -FOX HD -p:DIGITAL+ -7508:00c00000:0420:0001:25:0 -COSMO HD -p:DIGITAL+ -7509:00c00000:0420:0001:25:0 -C+ ACCIÓN HD -p:DIGITAL+ -750a:00c00000:0420:0001:25:0 -EUROSPORT HD -p:DIGITAL+ -750b:00c00000:0420:0001:25:0 -C+ DCINE HD -p:DIGITAL+ -ef10:00c00000:0421:0001:25:0 -RTL HD -p:CBC,c:0000ff,c:020020,c:0300ff,c:040103,c:050001,C:1830,C:1843,C:1860 -ef11:00c00000:0421:0001:25:0 -VOX HD -p:CBC,C:1830,C:1843,C:1860 -ef14:00c00000:0421:0001:25:0 -SPORT1 HD -p:BetaDigital,C:1830,C:1843,C:1860 -ef15:00c00000:0421:0001:25:0 -RTL2 HD -p:BetaDigital,C:1830,C:1843,C:1860 -1518:00c00000:0455:0001:25:0 -sonnenklar.TV HD -p:BetaDigital -1519:00c00000:0455:0001:25:0 -TELE 5 HD -p:BetaDigital,C:1830,C:1843,C:1860 -151a:00c00000:0455:0001:25:0 -DMAX HD -p:BetaDigital,C:1830,C:1843,C:1860 -151b:00c00000:0455:0001:25:0 -Juwelo HD -p:BetaDigital -781e:00c00000:0428:0001:25:0 -MEZZO LIVEHD -p:DIGITAL+ -781f:00c00000:0428:0001:25:0 -CALLE 13 HD -p:DIGITAL+ -7820:00c00000:0428:0001:25:0 -CINEMAGIC HD -p:DIGITAL+ -7821:00c00000:0428:0001:25:0 -NAT GEO HD -p:DIGITAl+ -7822:00c00000:0428:0001:25:0 -C+ DEPORT HD -p:DIGITAL+ -7823:00c00000:0428:0001:25:0 -MEZZO LIVE HD -p:DIGITAL+ -7824:00c00000:0428:0001:25:0 -CALLE 13 HD -p:DIGITAL+ -7825:00c00000:0428:0001:25:0 -CINEMAGIC HD -p:DIGITAL+ -7826:00c00000:0428:0001:25:0 -CINEMAGIC HD -p:DIGITAL+ -7827:00c00000:0428:0001:25:0 -CINEMAGIC HD -p:DIGITAL+ -7828:00c00000:0428:0001:25:0 -C+ DEPORT HD -p:DIGITAL+ -2329:00c00000:0442:0001:25:0 -TF1 HD -p:CSAT -7829:00c00000:0428:0001:25:0 -NAT GEO HD -p:DIGITAl+ -782a:00c00000:0428:0001:25:0 -C+ DEPORT HD -p:DIGITAL+ -232b:00c00000:0442:0001:25:0 -NATIONAL GEO HD -p:CSAT -2333:00c00000:0442:0001:25:0 -PARIS PREMIERE HD -p:CSAT -2335:00c00000:0442:0001:25:0 -EUROSPORT HD -p:CSAT -2338:00c00000:0442:0001:25:0 -DISNEY HD -p:CSAT -233d:00c00000:0442:0001:25:0 -TF1 HD -p:CSAT -283d:00c00000:03fb:0001:25:0 -Das Erste HD -p:ARD,c:0013ed,c:0113ee,c:0213f0,c:0313ed,c:050001 -283e:00c00000:03fb:0001:25:0 -arte HD -p:ARD -233f:00c00000:0442:0001:25:0 -NATIONAL GEO HD -p:CSAT -283f:00c00000:03fb:0001:25:0 -SWR BW HD -p:ARD -2840:00c00000:03fb:0001:25:0 -SWR RP HD -p:ARD -2347:00c00000:0442:0001:25:0 -PARIS PREMIERE HD -p:CSAT -2349:00c00000:0442:0001:25:0 -EUROSPORT HD -p:CSAT -234c:00c00000:0442:0001:25:0 -DISNEY HD -p:CSAT -7850:00c00000:041a:0001:25:0 -AXN HD -p:DIGITAL+ -7851:00c00000:041a:0001:25:0 -C+COMEDIA HD -p:DIGITAL+ -7852:00c00000:041a:0001:25:0 -C+ LIGA HD -p:DIGITAL+ -7853:00c00000:041a:0001:25:0 -C+ DEP 2 HD -p:DIGITAL+ -7854:00c00000:041a:0001:25:0 -TAQUILLA HD -p:DIGITAL+ -2855:00c00000:0401:0001:25:0 -BR Süd HD -p:ARD -7855:00c00000:041a:0001:25:0 -CANAL+ 3D -p:DIGITAL+ -2856:00c00000:0401:0001:25:0 -BR Nord HD -p:ARD -7856:00c00000:041a:0001:25:0 -AXN HD -p:DIGITAL+ -2857:00c00000:0401:0001:25:0 -NDR FS NDS HD -p:ARD -7857:00c00000:041a:0001:25:0 -C+COMEDIA HD -p:DIGITAL+ -2458:00c00000:0440:0001:25:0 -ARTE HD -p:CSAT -2858:00c00000:0401:0001:25:0 -NDR FS MV HD -p:ARD -7858:00c00000:041a:0001:25:0 -C+ LIGA HD -p:DIGITAL+ -2859:00c00000:0401:0001:25:0 -NDR FS HH HD -p:ARD -7859:00c00000:041a:0001:25:0 -C+ LIGA HD -p:DIGITAL+ -245a:00c00000:0440:0001:25:0 -PENTHOUSE HD -p:CSAT -285a:00c00000:0401:0001:25:0 -NDR FS SH HD -p:ARD -785a:00c00000:041a:0001:25:0 -C+ DEP 2 HD -p:DIGITAL+ -285b:00c00000:0401:0001:25:0 -PHOENIX HD -p:ARD -2b5c:00c00000:03f3:0001:25:0 -Das Erste HD alt -p:ARD -245e:00c00000:0440:0001:25:0 -M6 HD -p:CSAT -2460:00c00000:0440:0001:25:0 -W9 HD -p:CSAT -2261:00c00000:0438:0001:25:0 -CANAL+ HD -p:CSAT -2461:00c00000:0440:0001:25:0 -USHUAIA TV HD -p:CSAT -2262:00c00000:0438:0001:25:0 -CANAL+ DECALE HD -p: -2462:00c00000:0440:0001:25:0 -FRANCE 2 HD -p:CSAT -2263:00c00000:0438:0001:25:0 -CANAL+ CINEMA HD -p: -2264:00c00000:0438:0001:25:0 -CANAL+ SPORT HD -p:CSAT -1265:00c00000:03f7:0001:25:0 -ASTRA 3D Demo -p:BetaDigital -2265:00c00000:0438:0001:25:0 -CANAL+ FAMILY HD -p: -1966:00c00000:044e:0001:25:0 -MEZZO LIVE HD -p:CSAT -2b66:00c00000:03f3:0001:25:0 -ZDF HD -p:ZDFvision -1967:00c00000:044e:0001:25:0 -M6 MUSIC HD -p:CSAT -1968:00c00000:044e:0001:25:0 -TF6 HD -p: -0069:00c00000:000c:0085:25:0 -Sky †Sport‡ †HD‡ †Extra‡ -p:SKY,C:1861 -1969:00c00000:044e:0001:25:0 -SERIE CLUB HD -p:CSAT -006a:00c00000:000c:0085:25:0 -Sky †Action HD‡ -p:SKY,C:1861 -196a:00c00000:044e:0001:25:0 -O.CINE MAX HD -p:CSAT -006b:00c00000:000c:0085:25:0 -†Sky‡ †Hits‡ †HD‡ -p:SKY,C:1861 -006c:00c00000:000c:0085:25:0 -Sky †Sport‡ †News‡ †HD‡ -p:SKY,C:1861 -246c:00c00000:0440:0001:25:0 -ARTE HD -p:CSAT -526c:00c00000:041d:0001:25:0 -ANIXE HD -p:BetaDigital -006e:00c00000:000d:0085:25:0 -Sky †Atlantic‡ †HD‡ -p:SKY,C:1861 -246e:00c00000:0440:0001:25:0 -PENTHOUSE HD -p:CSAT -006f:00c00000:000d:0085:25:0 -†Disney‡ †Cin‡emagic †HD‡ -p:SKY,C:1861 -526f:00c00000:041d:0001:25:0 -QVC HD -p:BetaDigital -0070:00c00000:000d:0085:25:0 -†NatGeo‡ †HD‡ -p:SKY,C:1861 -2270:00c00000:0438:0001:25:0 -CINE+ PREMIER HD -p:CSAT -2b70:00c00000:03f3:0001:25:0 -arte HD alt -p:ARD -5270:00c00000:041d:0001:25:0 -HSE24 HD -p:BetaDigital -0071:00c00000:000d:0085:25:0 -†Hist‡ory †HD‡ -p:SKY,C:1861 -0072:00c00000:000d:0085:25:0 -Sky †Sport‡ †HD 2‡ -p:SKY,C:1861 -2472:00c00000:0440:0001:25:0 -M6 HD -p:CSAT -1973:00c00000:044e:0001:25:0 -NAT GEO WILD HD -p:CSAT -5273:00c00000:041d:0001:25:0 -NICK/CC HD -p:MTV Networks,C:1830,C:1843,C:1860 -0074:00c00000:000b:0085:25:0 -†Disney‡ Channel †HD‡ -p:SKY,C:1861 -2474:00c00000:0440:0001:25:0 -W9 HD -p:CSAT -5274:00c00000:041d:0001:25:0 -N24 HD -p:BetaDigital,C:1830,C:1843,C:1860 -ef74:00c00000:03f9:0001:25:0 -SAT.1 HD -p:ProSiebenSat.1,C:1830,C:1843,C:1860 -0075:00c00000:000b:0085:25:0 -†Sky‡ †3D‡ -p:SKY,C:1861 -2275:00c00000:0438:0001:25:0 -CANAL+ HD -p:CSAT -2475:00c00000:0440:0001:25:0 -USHUAIA TV HD -p:CSAT -ef75:00c00000:03f9:0001:25:0 -ProSieben HD -p:ProSiebenSat.1,C:1830,C:1843,C:1860 -0076:00c00000:000b:0085:25:0 -†N‡at †G‡eo †Wild‡ †HD‡ -p:SKY,C:1861 -2276:00c00000:0438:0001:25:0 -CANAL+ DECALE HD -p: -2476:00c00000:0440:0001:25:0 -FRANCE 2 HD -p:CSAT -ef76:00c00000:03f9:0001:25:0 -kabel eins HD -p:ProSiebenSat.1,C:1830,C:1843,C:1860 -0077:00c00000:000b:0085:25:0 -†ESPN‡ America †HD‡ -p:SKY,C:1861 -2277:00c00000:0438:0001:25:0 -CANAL+ CINEMA HD -p: -ef77:00c00000:03f9:0001:25:0 -SIXX HD -p:ProSiebenSat.1,C:1830,C:1843,C:1860 -0078:00c00000:000e:0085:25:0 -Sky †Select‡ †HD‡ -p:SKY,C:1861 -2278:00c00000:0438:0001:25:0 -CANAL+ SPORT HD -p:CSAT -2478:00c00000:0440:0001:25:0 -PENTHOUSE HD -p:CSAT -0079:00c00000:000e:0085:25:0 -†B‡LUE †M‡OVIE †HD‡ -p:SKY,C:1861 -2279:00c00000:0438:0001:25:0 -CANAL+ FAMILY HD -p: -007a:00c00000:000e:0085:25:0 -. -p:SKY,C:1861 -197a:00c00000:044e:0001:25:0 -MEZZO LIVE HD -p:CSAT -2b7a:00c00000:03f3:0001:25:0 -zdf_neo HD -p:ZDFvision -007b:00c00000:000e:0085:25:0 -†TNT‡ †Serie‡ †HD‡ -p:SKY,C:1861 -197b:00c00000:044e:0001:25:0 -M6 MUSIC HD -p:CSAT -007c:00c00000:000e:0085:25:0 -Fox HD -p:SKY,C:1861 -197c:00c00000:044e:0001:25:0 -TF6 HD -p:CSAT -197d:00c00000:044e:0001:25:0 -SERIE CLUB HD -p: -197e:00c00000:044e:0001:25:0 -O.CINE MAX HD -p:CSAT -227f:00c00000:0438:0001:25:0 -CANAL+ HD -p:CSAT -6f80:00c00000:0457:0001:25:0 -WDR HD Aachen -p:ARD -0081:00c00000:0006:0085:25:0 -Sky †Sport‡ †HD 1‡ -p:SKY,C:1861 -6f81:00c00000:0457:0001:25:0 -WDR HD Wuppertal -p:ARD -0082:00c00000:0006:0085:25:0 -†Disc‡overy †HD‡ -p:SKY,C:1861 -6f82:00c00000:0457:0001:25:0 -WDR HD Bonn -p:ARD -7882:00c00000:0414:0001:25:0 -HOLLYWOODHD -p:DIGITAL+ -0083:00c00000:0006:0085:25:0 -Sky †Cinema‡ †HD‡ -p:SKY,C:1861 -6f83:00c00000:0457:0001:25:0 -WDR HD Duisburg -p:ARD -7883:00c00000:0414:0001:25:0 -TNT HD -p:DIGITAL+ -0084:00c00000:0006:0085:25:0 -†Eurosp‡ort †HD‡ -p:SKY,C:1861 -2284:00c00000:0438:0001:25:0 -CINE+ PREMIER HD -p:CSAT -2b84:00c00000:03f3:0001:25:0 -zdf.kultur HD -p:ZDFvision -7884:00c00000:0414:0001:25:0 -NG WILD HD -p:DIGITAL+ -7885:00c00000:0414:0001:25:0 -SYFY HD -p:DIGITAL+ -7886:00c00000:0414:0001:25:0 -DISNEY CH HD -p:DIGITAL+ -1987:00c00000:044e:0001:25:0 -NAT GEO WILD HD -p: -7887:00c00000:0414:0001:25:0 -HOLLYWOODHD -p:DIGITAL+ -7888:00c00000:0414:0001:25:0 -TNT HD -p:DIGITAL+ -7889:00c00000:0414:0001:25:0 -NG WILD HD -p:DIGITAL+ -788a:00c00000:0414:0001:25:0 -SYFY HD -p:DIGITAL+ -788b:00c00000:0414:0001:25:0 -DISNEY CH HD -p:DIGITAL+ -2b8e:00c00000:03f2:0001:25:0 -3sat HD -p:ZDFvision -2b98:00c00000:03f2:0001:25:0 -KiKA HD -p:ZDFvision -189d:00c00000:03f4:0001:25:0 -beIN SPORT1 HD -p:GlobeCast -189e:00c00000:03f4:0001:25:0 -beIN SPORT2 HD -p:GlobeCast -2ba2:00c00000:03f2:0001:25:0 -ZDFinfo HD -p:ZDFvision -6ea5:00c00000:04b1:0001:25:0 -WDR HD Köln -p:ARD -6ea6:00c00000:04b1:0001:25:0 -WDR HD Bielefeld -p:ARD -6ea7:00c00000:04b1:0001:25:0 -WDR HD Dortmund -p:ARD -6ea8:00c00000:04b1:0001:25:0 -WDR HD Düsseldorf -p:ARD -6ea9:00c00000:04b1:0001:25:0 -WDR HD Essen -p:ARD -6eaa:00c00000:04b1:0001:25:0 -WDR HD Münster -p:ARD -6eab:00c00000:04b1:0001:25:0 -WDR HD Siegen -p:ARD -21ad:00c00000:0448:0001:25:0 -MOSAIQUE C+ -p:CSAT -21ae:00c00000:0448:0001:25:0 -MOSAIQUE -p:CSAT -26b0:00c00000:045c:0001:25:0 -BRAVA HD -p:CSAT -18b1:00c00000:03f4:0001:25:0 -beIN SPORT1 HD -p:GlobeCast -26b1:00c00000:045c:0001:25:0 -TCM HD -p:CSAT -18b2:00c00000:03f4:0001:25:0 -beIN SPORT2 HD -p:GlobeCast -26b2:00c00000:045c:0001:25:0 -TEVA HD -p:CSAT -14b4:00c00000:0407:0001:25:0 -SAT.1 HD Austria -p:ProSiebenSat.1 -14b5:00c00000:0407:0001:25:0 -ProSieben HD Austria -p:ProSiebenSat.1 -14b6:00c00000:0407:0001:25:0 -kabel eins HD Austria -p:ProSiebenSat.1 -14b7:00c00000:0407:0001:25:0 -PULS 4 HD Austria -p:ProSiebenSat.1 -26b7:00c00000:045c:0001:25:0 -DISCOVERY HD -p:CSAT -6fb8:00c00000:042c:0001:25:0 -MTV Live HD -p:MTV Networks Europe -26b9:00c00000:045c:0001:25:0 -GOLF+ HD -p:CSAT -6fb9:00c00000:042c:0001:25:0 -MTV Live HD -p:MTV Networks Europe -24bb:00c00000:043c:0001:25:0 -MA CHAINE SPORT HD -p:CSAT -26c4:00c00000:045c:0001:25:0 -BRAVA HD -p:CSAT -26c5:00c00000:045c:0001:25:0 -TCM HD -p:CSAT -26c6:00c00000:045c:0001:25:0 -TEVA HD -p:CSAT -19c9:00c00000:0444:0001:25:0 -13EME RUE HD -p:CSAT -19ca:00c00000:0444:0001:25:0 -DISNEY JUNIOR HD -p:CSAT -19cb:00c00000:0444:0001:25:0 -SYFY HD -p:CSAT -26cb:00c00000:045c:0001:25:0 -DISCOVERY HD -p:CSAT -74cc:00c00000:03f8:0001:25:0 -CANAL+1 HD -p:DIGITAL+ -26cd:00c00000:045c:0001:25:0 -GOLF+ HD -p:CSAT -74cd:00c00000:03f8:0001:25:0 -C+ FÚTBOL HD -p:DIGITAL+ -74ce:00c00000:03f8:0001:25:0 -VIAJAR HD -p:DIGITAL+ -24cf:00c00000:043c:0001:25:0 -MA CHAINE SPORT HD -p:CSAT -74cf:00c00000:03f8:0001:25:0 -C+ XTRA HD -p:DIGITAL+ -19d0:00c00000:0444:0001:25:0 -BRAVA HD TEST1 -p:CSAT -19d1:00c00000:0444:0001:25:0 -BRAVA HD TEST2 -p:CSAT -74d1:00c00000:03f8:0001:25:0 -C+ FÚTBOL HD -p:DIGITAL+ -74d2:00c00000:03f8:0001:25:0 -C+ FÚTBOL HD -p:DIGITAL+ -74d3:00c00000:03f8:0001:25:0 -VIAJAR HD -p:DIGITAL+ -74d4:00c00000:03f8:0001:25:0 -C+ XTRA HD -p:DIGITAL+ -74d5:00c00000:03f8:0001:25:0 -CANAL+1 HD -p:DIGITAL+ -26d7:00c00000:045c:0001:25:0 -GOLF+ HD -p:CSAT -19dd:00c00000:0444:0001:25:0 -13EME RUE HD -p:CSAT -19de:00c00000:0444:0001:25:0 -DISNEY JUNIOR HD -p:CSAT -19df:00c00000:0444:0001:25:0 -SYFY HD -p:CSAT -24e1:00c00000:043c:0001:25:0 -DISNEY XD HD -p:CSAT -24e2:00c00000:043c:0001:25:0 -DISNEY MAGIC HD -p:CSAT -6eea:00c00000:04b1:0001:25:0 -WDR Test B -p:ARD -6eec:00c00000:04b1:0001:25:0 -Einsfestival HD -p:ARD -24f5:00c00000:043c:0001:25:0 -DISNEY XD HD -p:CSAT -24f6:00c00000:043c:0001:25:0 -DISNEY MAGIC HD -p:CSAT -13fa:00c00000:0403:0001:25:0 -EUROSPORT 3D -p:,C:0500 -74fe:00c00000:0420:0001:25:0 -FOX HD -p:DIGITAL+ -74ff:00c00000:0420:0001:25:0 -COSMO HD -p:DIGITAL+ -0f03:00c00000:0001:0085:100:0 -12070H SID 0xf03 -p:DVB-S QPSK 12070H 19.2°E -7603:00c00000:0408:0001:100:0 -11685V SID 0x7603 -p:DVB-S QPSK 11685V 19.2°E -0f07:00c00000:0002:0085:100:0 -11797H SID 0xf07 -p:DVB-S QPSK 11797H 19.2°E -7507:00c00000:0420:0001:100:0 -10817V SID 0x7507 -p:DVB-S2 8PSK 10817V 19.2°E -7609:00c00000:0408:0001:100:0 -11685V SID 0x7609 -p:DVB-S QPSK 11685V 19.2°E -7726:00c00000:0416:0001:100:0 -11156V SID 0x7726 -p:DVB-S QPSK 11156V 19.2°E -7727:00c00000:0416:0001:100:0 -11156V SID 0x7727 -p:DVB-S QPSK 11156V 19.2°E -7728:00c00000:0416:0001:100:0 -11156V SID 0x7728 -p:DVB-S QPSK 11156V 19.2°E -7737:00c00000:0416:0001:100:0 -11156V SID 0x7737 -p:DVB-S QPSK 11156V 19.2°E -7564:00c00000:0412:0001:100:0 -11097V SID 0x7564 -p:DVB-S QPSK 11097V 19.2°E -1f68:00c00000:042e:0001:100:0 -11817V SID 0x1f68 -p:DVB-S QPSK 11817V 19.2°E -ef6a:00c00000:0421:0001:100:0 -10832H SID 0xef6a -p:DVB-S2 8PSK 10832H 19.2°E -756d:00c00000:0412:0001:100:0 -11097V SID 0x756d -p:DVB-S QPSK 11097V 19.2°E -7475:00c00000:03f0:0001:100:0 -11317V SID 0x7475 -p:DVB-S QPSK 11317V 19.2°E -7476:00c00000:03f0:0001:100:0 -11317V SID 0x7476 -p:DVB-S QPSK 11317V 19.2°E -0f8d:00c00000:0007:0085:100:0 -12148H SID 0xf8d -p:DVB-S QPSK 12148H 19.2°E -258f:00c00000:0458:0001:100:0 -12610V SID 0x258f -p:DVB-S QPSK 12610V 19.2°E -0f91:00c00000:0007:0085:100:0 -12148H SID 0xf91 -p:DVB-S QPSK 12148H 19.2°E -7791:00c00000:0424:0001:100:0 -10876V SID 0x7791 -p:DVB-S QPSK 10876V 19.2°E -7594:00c00000:0422:0001:100:0 -10847V SID 0x7594 -p:DVB-S QPSK 10847V 19.2°E -7794:00c00000:0424:0001:100:0 -10876V SID 0x7794 -p:DVB-S QPSK 10876V 19.2°E -0f95:00c00000:0007:0085:100:0 -12148H SID 0xf95 -p:DVB-S QPSK 12148H 19.2°E -0f96:00c00000:0007:0085:100:0 -12148H SID 0xf96 -p:DVB-S QPSK 12148H 19.2°E -0f97:00c00000:0007:0085:100:0 -12148H SID 0xf97 -p:DVB-S QPSK 12148H 19.2°E -0f98:00c00000:0007:0085:100:0 -12148H SID 0xf98 -p:DVB-S QPSK 12148H 19.2°E -7698:00c00000:041e:0001:100:0 -10788V SID 0x7698 -p:DVB-S QPSK 10788V 19.2°E -759d:00c00000:0422:0001:100:0 -10847V SID 0x759d -p:DVB-S QPSK 10847V 19.2°E -759e:00c00000:0422:0001:100:0 -10847V SID 0x759e -p:DVB-S QPSK 10847V 19.2°E -0f9f:00c00000:0007:0085:100:0 -12148H SID 0xf9f -p:DVB-S QPSK 12148H 19.2°E -759f:00c00000:0422:0001:100:0 -10847V SID 0x759f -p:DVB-S QPSK 10847V 19.2°E -75a0:00c00000:0422:0001:100:0 -10847V SID 0x75a0 -p:DVB-S QPSK 10847V 19.2°E -0fa1:00c00000:0007:0085:100:0 -12148H SID 0xfa1 -p:DVB-S QPSK 12148H 19.2°E -75a1:00c00000:0422:0001:100:0 -10847V SID 0x75a1 -p:DVB-S QPSK 10847V 19.2°E -76a1:00c00000:041e:0001:100:0 -10788V SID 0x76a1 -p:DVB-S QPSK 10788V 19.2°E -0fa2:00c00000:0001:0085:100:0 -12070H SID 0xfa2 -p:DVB-S QPSK 12070H 19.2°E -75a2:00c00000:0422:0001:100:0 -10847V SID 0x75a2 -p:DVB-S QPSK 10847V 19.2°E -0fa3:00c00000:0007:0085:100:0 -12148H SID 0xfa3 -p:DVB-S QPSK 12148H 19.2°E -75a3:00c00000:0422:0001:100:0 -10847V SID 0x75a3 -p:DVB-S QPSK 10847V 19.2°E -0fa4:00c00000:0005:0085:100:0 -12460H SID 0xfa4 -p:DVB-S QPSK 12460H 19.2°E -74a5:00c00000:041c:0001:100:0 -10758V SID 0x74a5 -p:DVB-S QPSK 10758V 19.2°E -75a7:00c00000:0422:0001:100:0 -10847V SID 0x75a7 -p:DVB-S QPSK 10847V 19.2°E -75a8:00c00000:0422:0001:100:0 -10847V SID 0x75a8 -p:DVB-S QPSK 10847V 19.2°E -0dab:00c00000:0002:0085:100:0 -11797H SID 0xdab -p:DVB-S QPSK 11797H 19.2°E -75ad:00c00000:0422:0001:100:0 -10847V SID 0x75ad -p:DVB-S QPSK 10847V 19.2°E -0fb4:00c00000:0005:0085:100:0 -12460H SID 0xfb4 -p:DVB-S QPSK 12460H 19.2°E -0fb7:00c00000:0007:0085:100:0 -12148H SID 0xfb7 -p:DVB-S QPSK 12148H 19.2°E -12b7:00c00000:03f7:0001:100:0 -11420H SID 0x12b7 -p:DVB-S QPSK 11420H 19.2°E -12b9:00c00000:03f7:0001:100:0 -11420H SID 0x12b9 -p:DVB-S QPSK 11420H 19.2°E -12ba:00c00000:03f7:0001:100:0 -11420H SID 0x12ba -p:DVB-S QPSK 11420H 19.2°E -0fbb:00c00000:0005:0085:100:0 -12460H SID 0xfbb -p:DVB-S QPSK 12460H 19.2°E -12bb:00c00000:03f7:0001:100:0 -11420H SID 0x12bb -p:DVB-S QPSK 11420H 19.2°E -0fbd:00c00000:0007:0085:100:0 -12148H SID 0xfbd -p:DVB-S QPSK 12148H 19.2°E -23bd:00c00000:044a:0001:100:0 -12363V SID 0x23bd -p:DVB-S QPSK 12363V 19.2°E -0fbf:00c00000:0007:0085:100:0 -12148H SID 0xfbf -p:DVB-S QPSK 12148H 19.2°E -12bf:00c00000:03f7:0001:100:0 -11420H SID 0x12bf -p:DVB-S QPSK 11420H 19.2°E -0fc0:00c00000:0005:0085:100:0 -12460H SID 0xfc0 -p:DVB-S QPSK 12460H 19.2°E -0fc1:00c00000:0005:0085:100:0 -12460H SID 0xfc1 -p:DVB-S QPSK 12460H 19.2°E -0fc4:00c00000:0001:0085:100:0 -12070H SID 0xfc4 -p:DVB-S QPSK 12070H 19.2°E -0fc6:00c00000:0005:0085:100:0 -12460H SID 0xfc6 -p:DVB-S QPSK 12460H 19.2°E -76c6:00c00000:040e:0001:100:0 -11038V SID 0x76c6 -p:DVB-S QPSK 11038V 19.2°E -0fc7:00c00000:0005:0085:100:0 -12460H SID 0xfc7 -p:DVB-S QPSK 12460H 19.2°E -77ca:00c00000:040a:0001:100:0 -10979V SID 0x77ca -p:DVB-S QPSK 10979V 19.2°E -77cb:00c00000:040a:0001:100:0 -10979V SID 0x77cb -p:DVB-S QPSK 10979V 19.2°E -76cd:00c00000:040e:0001:100:0 -11038V SID 0x76cd -p:DVB-S QPSK 11038V 19.2°E -74d0:00c00000:03f8:0001:100:0 -11435V SID 0x74d0 -p:DVB-S2 8PSK 11435V 19.2°E -75d6:00c00000:0422:0001:100:0 -10847V SID 0x75d6 -p:DVB-S QPSK 10847V 19.2°E -0de3:00c00000:0001:0085:100:0 -12070H SID 0xde3 -p:DVB-S QPSK 12070H 19.2°E -23e4:00c00000:044a:0001:100:0 -12363V SID 0x23e4 -p:DVB-S QPSK 12363V 19.2°E -23e5:00c00000:044a:0001:100:0 -12363V SID 0x23e5 -p:DVB-S QPSK 12363V 19.2°E -23e6:00c00000:044a:0001:100:0 -12363V SID 0x23e6 -p:DVB-S QPSK 12363V 19.2°E -1c38:00c00000:0457:0001:128:0 -STB Skardin -p:SES ASTRA -1c4b:00c00000:0457:0001:128:0 -STB Inverto -p:SES ASTRA -1c5b:00c00000:0457:0001:128:0 -Opentech -p:SES ASTRA -1c5c:00c00000:0457:0001:128:0 -SKYMASTER1 -p:SES ASTRA -1c5f:00c00000:0457:0001:128:0 -SKYMASTER2 -p:SES ASTRA -1c6d:00c00000:0457:0001:128:0 -STB Sandmartin -p:SES ASTRA -1c71:00c00000:0457:0001:128:0 -Panasonic Viera -p:SES ASTRA -1ee7:00c00000:0457:0001:128:0 -SES-LCN2 -p:SES ASTRA -000c:00c00000:0454:0001:129:0 -ASTRA SDT -p:SES ASTRA -000d:00c00000:0457:0001:129:0 -ASTRA SDT -p:SES ASTRA -1c34:00c00000:0457:0001:129:0 -Samsung2 -p:SES ASTRA -3390:00c00000:045d:0001:129:0 -AlphaCrypt -p:ORF -33a5:00c00000:045d:0001:129:0 -Crenova OTA Service -p:ORS -33ae:00c00000:045d:0001:129:0 -VESTEL DOWNLOAD -p:ORF -33c3:00c00000:045b:0001:129:0 -Arion OTA1 -p:ORS -33c9:00c00000:045b:0001:129:0 -SSU-Test -p:- -0ff1:00c00000:0451:0035:129:0 -Downl CAM new -p:CANALDIGITAAL -1c30:00c00000:0457:0001:130:0 -HUMAX DOWNLOAD SVC -p:SES ASTRA -206a:00c00000:0430:0001:135:0 -CDSA -p:CSAT -2185:00c00000:0400:0001:135:0 -RADIO 1 -p:CSAT -2186:00c00000:0400:0001:135:0 -RADIO 2 -p:CSAT -2187:00c00000:0400:0001:135:0 -RADIO 3 -p:CSAT -2188:00c00000:0400:0001:135:0 -RADIO FRANCE -p:CSAT -239f:00c00000:044a:0001:135:0 -EPG -p:CSAT -21c2:00c00000:0448:0001:135:0 -MOSA 2 -p:CSAT -21c3:00c00000:0448:0001:135:0 -MOSA 3 -p:CSAT -21c4:00c00000:0448:0001:135:0 -MOSA 4 -p:CSAT -21c5:00c00000:0448:0001:135:0 -MOSA 5 -p:CSAT -240c:00c00000:0452:0001:138:0 -A LA CARTE -p:CSAT -240d:00c00000:0452:0001:138:0 -A LA CARTE -p:CSAT -2140:00c00000:0400:0001:138:0 -NOUVEAU DECODEUR -p:CSAT -2142:00c00000:0400:0001:138:0 -CANALSAT RADIOS -p:CSAT -218e:00c00000:0400:0001:138:0 -NOUVEAU DECODEUR -p:CSAT -21ca:00c00000:0448:0001:138:0 -NOUVEAU DECODEUR -p:CSAT -21cb:00c00000:0448:0001:138:0 -NOUVEAU DECODEUR -p:CSAT -1c83:00c00000:0457:0001:170:0 -Kathrein Download -p:SES ASTRA -1c40:00c00000:0457:0001:171:0 -STB SMEL -p:SES ASTRA -1c6c:00c00000:0457:0001:171:0 -HDS Europe -p:SES ASTRA -1c6e:00c00000:0457:0001:171:0 -STB Strong -p:SES ASTRA -1c76:00c00000:0457:0001:171:0 -STB SRADIX -p:SES ASTRA -0a82:00c00000:0004:0085:178:0 -Videotext -p:BetaResearch -23b8:00c00000:044a:0001:192:0 -DOWNLOAD DUALS PHILIPS -p:CSAT -23b9:00c00000:044a:0001:192:0 -DOWNLOAD REN PACE -p:CSAT -23ba:00c00000:044a:0001:192:0 -DOWNLOAD G5 SAMSUNG -p:CSAT -23bb:00c00000:044a:0001:192:0 -DOWNLOAD G5 PACE -p:CSAT -23be:00c00000:044a:0001:192:0 -DOWNLOAD G5+ PACE -p:CSAT -23bf:00c00000:044a:0001:192:0 -DOWNLOAD G5+ SAGEM -p:CSAT -1fcc:00c00000:042e:0001:192:0 -DOWNLOAD TNTSAT TRIAX -p:CSAT -23e7:00c00000:044a:0001:192:0 -DOWNLOAD TNTSAT 9191 -p:CSAT -23e8:00c00000:044a:0001:192:0 -DOWNLOAD TNTSAT 9192 -p:CSAT -23e9:00c00000:044a:0001:192:0 -DOWNLOAD TNTSAT 9193 -p:CSAT -2007:00c00000:0434:0001:193:0 -DATA SYSTEM[76] -p:CSAT -270f:00c00000:045c:0001:193:0 -DATA SYSTEM[116] -p:CSAT -251b:00c00000:043c:0001:193:0 -DATA SYSTEM[84] -p:CSAT -2327:00c00000:045a:0001:193:0 -DATA SYSTEM[114] -p:CSAT -2133:00c00000:043e:0001:193:0 -DATA SYSTEM[86] -p:CSAT -2647:00c00000:045e:0001:193:0 -DATA SYSTEM[118] -p:CSAT -2453:00c00000:0452:0001:193:0 -DATA SYSTEM[106] -p:CSAT -1b58:00c00000:03fc:0001:193:0 -DATA SYSTEM 76 -p:CSAT -1b58:00c00000:03fe:0001:193:0 -DATA SYSTEM[76] -p:CSAT -225f:00c00000:044c:0001:193:0 -DATA SYSTEM[100] -p:CSAT -1963:00c00000:03fa:0001:193:0 -DATA SYSTEM[18] -p:CSAT -206b:00c00000:0430:0001:193:0 -DATA SYSTEM[72] -p:CSAT -6f71:00c00000:042c:0001:193:0 -DATA_SYS_68 -p:DT CSAT -257f:00c00000:0456:0001:193:0 -DATA SYSTEM[88] -p:CSAT -0a83:00c00000:0004:0085:193:0 -NDS Applikation -p:SKY -238b:00c00000:0442:0001:193:0 -DATA SYSTEM[90] -p:CSAT -2197:00c00000:0400:0001:193:0 -DATA SYSTEM[24] -p:CSAT -1fa3:00c00000:042e:0001:193:0 -DATA SYSTEM[70] -p:CSAT -26ab:00c00000:0460:0001:193:0 -DATA SYSTEM[120] -p:CSAT -24b7:00c00000:0440:0001:193:0 -DATA SYSTEM[110] -p:CSAT -22c3:00c00000:0438:0001:193:0 -DATA SYSTEM[80] -p:CSAT -19c7:00c00000:044e:0001:193:0 -DATA SYSTEM[102] -p:CSAT -42cb:00c00000:0446:0001:193:0 -DATA SYSTEM 94 -p:ABSAT -20cf:00c00000:0432:0001:193:0 -DATA SYSTEM[74] -p:CSAT -25e3:00c00000:0458:0001:193:0 -DATA SYSTEM[112] -p:CSAT -6fea:00c00000:042a:0001:193:0 -Data_System_TR_66 -p:MTV Networks Europe -23ef:00c00000:044a:0001:193:0 -DATA SYSTEM[98] -p:CSAT -21fb:00c00000:0448:0001:193:0 -DATA SYSTEM[96] -p:CSAT -6ffe:00c00000:0436:0001:193:0 -DATA SYSTEM TR 78 -p:MTV Networks Europe -2408:00c00000:0452:0001:195:0 -A LA CARTE -p:CSAT -2409:00c00000:0452:0001:195:0 -A LA CARTE -p:CSAT -23bc:00c00000:044a:0001:195:0 -CANALPLAY -p: -219b:00c00000:0448:0001:197:0 -MOSAIQUE -p:CSAT -219c:00c00000:0448:0001:197:0 -MOSA 2 -p:CSAT -219d:00c00000:0448:0001:197:0 -MOSA 3 -p:CSAT -21a2:00c00000:0448:0001:197:0 -MOSA 5 -p:CSAT -21a6:00c00000:0448:0001:197:0 -MOSA 4 -p:CSAT -21ac:00c00000:0448:0001:197:0 -MOSAIQUE C+ -p:CSAT -213d:00c00000:0400:0001:198:0 -CANALSAT RADIOS -p:CSAT -213e:00c00000:0400:0001:198:0 -RADIOS 2 -p:CSAT -213f:00c00000:0400:0001:198:0 -RADIOS 3 -p:CSAT -00c8:00c00000:0003:0085:198:0 -BDL VoD -p:Sky -23aa:00c00000:044a:0001:201:0 -M6 REPLAY -p:CSAT -23ab:00c00000:044a:0001:201:0 -CANALPLAY -p:CSAT -0105:00c00000:0002:0085:211:0 -†Sky‡ †Sel‡ect †2‡ -p:,C:1861 -0106:00c00000:0002:0085:211:0 -†Sky Bu‡ndes†li‡ga† 1‡ -p:,C:1861 -0107:00c00000:0002:0085:211:0 -Sky †Sport‡ †10‡ -p:,C:1861 -0108:00c00000:0002:0085:211:0 -†Sky ‡Select †Event B‡ -p:,C:1861 -010f:00c00000:0003:0085:211:0 -†Sky‡ †Sel‡ect †3‡ -p:,C:1861 -0110:00c00000:0003:0085:211:0 -†Sky Bu‡ndes†li‡ga† 2‡ -p:,C:1861 -0111:00c00000:0003:0085:211:0 -Sky †Sport‡ †11‡ -p:,C:1861 -0119:00c00000:0003:0085:211:0 -†Sky‡ †Sel‡ect †4‡ -p:,C:1861 -011a:00c00000:0003:0085:211:0 -†Sky Bu‡ndes†li‡ga† 3‡ -p:,C:1861 -011b:00c00000:0003:0085:211:0 -Sky †Sport‡ †9‡ -p:,C:1861 -0123:00c00000:0003:0085:211:0 -†Sky‡ †Sel‡ect †5‡ -p:,C:1861 -0124:00c00000:0003:0085:211:0 -†Sky Bu‡ndes†li‡ga† 4‡ -p:,C:1861 -0125:00c00000:0003:0085:211:0 -Sky †Sport‡ †8‡ -p:,C:1861 -012d:00c00000:0003:0085:211:0 -†Sky‡ †Sel‡ect †6‡ -p:,C:1861 -012e:00c00000:0003:0085:211:0 -†Sky Bu‡ndes†li‡ga† 5‡ -p:,C:1861 -012f:00c00000:0003:0085:211:0 -Sky †Sport‡ †7‡ -p:,C:1861 -0137:00c00000:0011:0085:211:0 -†Sky‡ †Sel‡ect †7‡ -p:,C:1861 -0138:00c00000:0011:0085:211:0 -†Sky Bu‡ndes†li‡ga† 6‡ -p:,C:1861 -0139:00c00000:0011:0085:211:0 -Sky †Sport‡ †6‡ -p:,C:1861 -0141:00c00000:0011:0085:211:0 -†Sky‡ †Sel‡ect †8‡ -p:,C:1861 -0142:00c00000:0011:0085:211:0 -†Sky Bu‡ndes†li‡ga† 7‡ -p:,C:1861 -0143:00c00000:0011:0085:211:0 -Sky †Sport‡ †5‡ -p:,C:1861 -014b:00c00000:0011:0085:211:0 -†Sky‡ †Sel‡ect †9‡ -p:,C:1861 -014c:00c00000:0011:0085:211:0 -†Sky Bu‡ndes†li‡ga† 8‡ -p:,C:1861 -014d:00c00000:0011:0085:211:0 -Sky †Sport‡ †4‡ -p:,C:1861 -0156:00c00000:0001:0085:211:0 -†Sky Bu‡ndes†li‡ga† 9‡ -p:,C:1861 -0159:00c00000:0001:0085:211:0 -†Blue‡ †M‡ovie †1‡ -p:,C:1810,C:1861 -0160:00c00000:0001:0085:211:0 -†Sky Bu‡ndes†li‡ga† 10‡ -p:,C:1861 -0163:00c00000:0001:0085:211:0 -†Blue‡ †M‡ovie †2‡ -p:,C:1810,C:1861 -016b:00c00000:0001:0085:211:0 -Sky †Sport‡ †12‡ -p:,C:1861 -016d:00c00000:0001:0085:211:0 -†Blue‡ †M‡ovie †3‡ -p:,C:1810,C:1861 -0175:00c00000:0001:0085:211:0 -Sky †Sport‡ †13‡ -p:,C:1861 -00f1:00c00000:0003:0085:211:0 -Sky †Sport‡ †News‡ -p:SKY,C:1861 -00f2:00c00000:000c:0085:211:0 -Sky †Sport‡ †News‡ †HD‡ -p:SKY,C:1861 -00fb:00c00000:0002:0085:211:0 -†Sky‡ †Sel‡ect †1‡ -p:,C:1861 -00fc:00c00000:0002:0085:211:0 -†Sky Bu‡ndes†li‡ga† 11‡ -p:,C:1861 -00fd:00c00000:0002:0085:211:0 -Sky †Sport‡ †3‡ -p:,C:1861 -00fe:00c00000:0002:0085:211:0 -†Sky ‡Select †Event A‡ -p:,C:1861 -1c1e:00c00000:0451:0035:212:0 -EPG Nagra -p:CANALDIGITAAL -end -Have a lot of bugs! diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.282 b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.282 deleted file mode 100644 index 8d9df67..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.282 +++ /dev/null @@ -1,3414 +0,0 @@ -eDVB services /4/ -transponders -011c0000:07d1:0002 - s 11719500:29500000:0:3:284:2:0:1:1:0:2 -/ -011c0000:07d2:0002 - s 11739000:27500000:1:2:284:2:0 -/ -011c0000:07d3:0002 - s 11758500:29500000:0:3:284:2:0:1:1:0:2 -/ -011c0000:07d4:0002 - s 11778000:27500000:1:2:284:2:0 -/ -011c0000:07d5:0002 - s 11797500:29500000:0:3:284:2:0:1:1:0:2 -/ -011c0000:07d6:0002 - s 11817000:27500000:1:2:284:2:0 -/ -011c0000:07d7:0002 - s 11836500:27500000:0:2:284:2:0 -/ -011c0000:07d8:0002 - s 11856000:29500000:1:3:284:2:0:1:1:0:2 -/ -011c0000:07d9:0002 - s 11875500:27500000:0:2:284:2:0 -/ -011c0000:07da:0002 - s 11895000:27500000:1:2:284:2:0 -/ -011c0000:07db:0002 - s 11914500:27500000:0:2:284:2:0 -/ -011c0000:07dc:0002 - s 11934000:27500000:1:2:284:2:0 -/ -011c0000:07dd:0002 - s 11953500:27500000:0:2:284:2:0 -/ -011c0000:07de:0002 - s 11973000:27500000:1:2:284:2:0 -/ -011c0000:07df:0002 - s 11992500:27500000:0:2:284:2:0 -/ -011c0000:07e0:0002 - s 12012000:29500000:1:3:284:2:0:1:1:0:2 -/ -011c0000:07e1:0002 - s 12031500:27500000:0:2:284:2:0 -/ -011c0000:07e2:0002 - s 12051000:27500000:1:2:284:2:0 -/ -011c0000:07e4:0002 - s 12090000:29500000:1:3:284:2:0:1:1:0:2 -/ -011c0000:07e5:0002 - s 12109500:27500000:0:2:284:2:0 -/ -011c0000:07e6:0002 - s 12129000:27500000:1:2:284:2:0 -/ -011c0000:07e7:0002 - s 12148500:27500000:0:2:284:2:0 -/ -011c0000:07e8:0002 - s 12168000:29500000:1:3:284:2:0:1:1:0:2 -/ -011c0000:07e9:0002 - s 12187500:27500000:0:2:284:2:0 -/ -011c0000:07ea:0002 - s 12207000:27500000:1:2:284:2:0 -/ -011c0000:07eb:0002 - s 12226500:27500000:0:2:284:2:0 -/ -011c0000:07ec:0002 - s 12246000:29500000:1:3:284:2:0:1:1:0:2 -/ -011c0000:07ed:0002 - s 12265500:29500000:0:3:284:2:0:1:1:0:2 -/ -011c0000:07ee:0002 - s 12285000:27500000:1:2:284:2:0 -/ -011c0000:07ef:0002 - s 12304500:27500000:0:2:284:2:0 -/ -011c0000:07f0:0002 - s 12324000:29500000:1:3:284:2:0:1:1:0:2 -/ -011c0000:07f1:0002 - s 12343500:29500000:0:3:284:2:0:1:1:0:2 -/ -011c0000:07f2:0002 - s 12363000:29500000:1:3:284:2:0:1:1:0:2 -/ -011c0000:07f3:0002 - s 12382500:29500000:0:3:284:2:0:1:1:0:2 -/ -011c0000:07f4:0002 - s 12402000:27500000:1:2:284:2:0 -/ -011c0000:07f5:0002 - s 12421000:27500000:0:2:284:2:0 -/ -011c0000:07f6:0002 - s 12441000:27500000:1:2:284:2:0 -/ -011c0000:07f7:0002 - s 12460500:29500000:0:3:284:2:0:1:1:0:2 -/ -011c0000:07f9:0002 - s 10714000:22000000:0:4:284:2:0 -/ -011c0000:07fa:0002 - s 10729000:22000000:1:4:284:2:0 -/ -011c0000:07fb:0002 - s 10743750:22000000:0:4:284:2:0 -/ -011c0000:07fc:0002 - s 10758500:22000000:1:4:284:2:0 -/ -011c0000:07fd:0002 - s 10773250:22000000:0:4:284:2:0 -/ -011c0000:07fe:0002 - s 10788000:22000000:1:4:284:2:0 -/ -011c0000:07ff:0002 - s 10802750:22000000:0:4:284:2:0 -/ -011c0000:0800:0002 - s 10817500:22000000:1:4:284:2:0 -/ -011c0000:0801:0002 - s 10832250:22000000:0:4:284:2:0 -/ -011c0000:0802:0002 - s 10847000:22000000:1:4:284:2:0 -/ -011c0000:0803:0002 - s 10861750:22000000:0:4:284:2:0 -/ -011c0000:0804:0002 - s 10876500:22000000:1:4:284:2:0 -/ -011c0000:0805:0002 - s 10891250:22000000:0:4:284:2:0 -/ -011c0000:0806:0002 - s 10906000:22000000:1:4:284:2:0 -/ -011c0000:0807:0002 - s 10920750:22000000:0:4:284:2:0 -/ -011c0000:0808:0002 - s 10935500:22000000:1:4:284:2:0 -/ -011c0000:08fd:0002 - s 11261170:27500000:0:2:284:2:0 -/ -011c0000:08fe:0002 - s 11259670:27500000:1:2:284:2:0 -/ -011c0000:08ff:0002 - s 11307000:27500000:0:2:284:2:0 -/ -011c0000:0900:0002 - s 11343000:27500000:1:2:284:2:0 -/ -011c0000:0902:0002 - s 11426330:27500000:1:2:284:2:0 -/ -011c0000:0907:0002 - s 11222170:27500000:0:2:284:2:0 -/ -011c0000:0908:0002 - s 11223670:27500000:1:2:284:2:0 -/ -011c0000:0909:0002 - s 11344500:27500000:0:2:284:2:0 -/ -011c0000:090a:0002 - s 11307000:27500000:1:2:284:2:0 -/ -011c0000:090b:0002 - s 11390000:27500000:0:2:284:2:0 -/ -011c0000:090c:0002 - s 11390330:27500000:1:2:284:2:0 -/ -011c0000:0961:0002 - s 11469230:27500000:0:2:284:2:0 -/ -011c0000:0963:0002 - s 11507690:27500000:0:2:284:2:0 -/ -011c0000:0964:0002 - s 11526920:27500000:1:2:284:2:0 -/ -011c0000:0965:0002 - s 11546150:27500000:0:2:284:2:0 -/ -011c0000:0966:0002 - s 11565380:27500000:1:2:284:2:0 -/ -011c0000:0967:0002 - s 11584620:27500000:0:2:284:2:0 -/ -011c0000:0968:0002 - s 11603850:27500000:1:2:284:2:0 -/ -011c0000:0969:0002 - s 11623080:27500000:0:2:284:2:0 -/ -011c0000:096a:0002 - s 11642000:27500000:1:2:284:2:0 -/ -011c0000:096b:0002 - s 11661540:27500000:0:2:284:2:0 -/ -011c0000:096c:0002 - s 11680770:27500000:1:2:284:2:0 -/ -011c0000:0a29:0002 - s 12559670:27500000:0:2:284:2:0 -/ -011c0000:0a2a:0002 - s 12560020:27500000:1:2:284:2:0 -/ -011c0000:0a2b:0002 - s 12643350:27500000:0:2:284:2:0 -/ -011c0000:0a2c:0002 - s 12643350:27500000:1:2:284:2:0 -/ -011c0000:0a33:0002 - s 12523000:27500000:0:2:284:2:0 -/ -011c0000:0a34:0002 - s 12523000:27500000:1:2:284:2:0 -/ -011c0000:0a35:0002 - s 12606650:27500000:0:2:284:2:0 -/ -011c0000:0a36:0002 - s 12606650:27500000:1:2:284:2:0 -/ -011c2f26:07e3:0002 - s 12070500:27500000:0:2:284:2:0 -/ -end -services -1600:011c0000:0807:0002:0:0 - -p: -1601:011c0000:0966:0002:0:0 - -p: -1406:011c0000:0807:0002:0:0 - -p: -1207:011c0000:0963:0002:0:0 - -p: -1407:011c0000:0807:0002:0:0 - -p: -1208:011c0000:0963:0002:0:0 - -p: -1209:011c0000:0963:0002:0:0 - -p: -1212:011c0000:07dc:0002:0:0 - -p: -1213:011c0000:07dc:0002:0:0 - -p: -1214:011c0000:07dc:0002:0:0 - -p: -1215:011c0000:07dc:0002:0:0 - -p: -1216:011c0000:07dc:0002:0:0 - -p: -1017:011c0000:0966:0002:0:0 - -p: -132a:011c0000:0963:0002:0:0 - -p: -232d:011c0000:0963:0002:0:0 - -p: -0f36:011c0000:0968:0002:0:0 - -p: -0f37:011c0000:0968:0002:0:0 - -p: -0f38:011c0000:07e0:0002:0:0 - -p: -0f39:011c0000:07f7:0002:0:0 - -p: -0f3a:011c0000:07f3:0002:0:0 - -p: -133e:011c0000:0961:0002:0:0 - -p: -133f:011c0000:0961:0002:0:0 - -p: -1340:011c0000:0961:0002:0:0 - -p: -1341:011c0000:0961:0002:0:0 - -p: -1342:011c0000:0807:0002:0:0 - -p: -114a:011c0000:07db:0002:0:0 - -p: -114b:011c0000:07db:0002:0:0 - -p: -114c:011c0000:07db:0002:0:0 - -p: -114d:011c0000:07db:0002:0:0 - -p: -114e:011c0000:07db:0002:0:0 - -p: -1276:011c0000:07dc:0002:0:0 - -p: -1277:011c0000:07dc:0002:0:0 - -p: -1278:011c0000:07dc:0002:0:0 - -p: -1279:011c0000:07dc:0002:0:0 - -p: -2479:011c0000:0963:0002:0:0 - -p: -127a:011c0000:07dc:0002:0:0 - -p: -247a:011c0000:0963:0002:0:0 - -p: -247f:011c0000:0963:0002:0:0 - -p: -2489:011c0000:07ef:0002:0:0 - -p: -13a2:011c0000:0807:0002:0:0 - -p: -13a5:011c0000:0807:0002:0:0 - -p: -13a6:011c0000:0807:0002:0:0 - -p: -14ab:011c0000:0966:0002:0:0 - -p: -11ae:011c0000:07db:0002:0:0 - -p: -15ae:011c0000:0966:0002:0:0 - -p: -11af:011c0000:07db:0002:0:0 - -p: -15af:011c0000:0966:0002:0:0 - -p: -11b0:011c0000:07db:0002:0:0 - -p: -15b0:011c0000:0807:0002:0:0 - -p: -11b1:011c0000:07db:0002:0:0 - -p: -15b1:011c0000:0807:0002:0:0 - -p: -11b2:011c0000:07db:0002:0:0 - -p: -15b2:011c0000:0961:0002:0:0 - -p: -15b3:011c0000:0961:0002:0:0 - -p: -15b4:011c0000:0966:0002:0:0 - -p: -15b5:011c0000:0807:0002:0:0 - -p: -d3b9:011c0000:0a2b:0002:0:0 - -p: -d3ba:011c0000:0a35:0002:0:0 - -p: -d3c1:011c0000:0a2b:0002:0:0 - -p: -d7d0:011c0000:0a35:0002:0:0 - -p: -12da:011c0000:0961:0002:0:0 - -p: -12db:011c0000:0961:0002:0:0 - -p: -12dc:011c0000:0961:0002:0:0 - -p: -12dd:011c0000:0961:0002:0:0 - -p: -12de:011c0000:0961:0002:0:0 - -p: -10e6:011c0000:0966:0002:0:0 - -p: -10e7:011c0000:0961:0002:0:0 - -p: -10e8:011c0000:0966:0002:0:0 - -p: -10e9:011c0000:0807:0002:0:0 - -p: -10ea:011c0000:07db:0002:0:0 - -p: -15fa:011c0000:0807:0002:0:0 - -p: -15fc:011c0000:0807:0002:0:0 - -p: -15fd:011c0000:0807:0002:0:0 - -p: -15fe:011c0000:0807:0002:0:0 - -p: -15ff:011c0000:0807:0002:0:0 - -p: -1200:011c0000:07ee:0002:1:0 -Nat Geo+1hr -p:BSkyB -2400:011c0000:07f9:0002:1:0 -Channel 4 -p:BSkyB -0401:011c0000:0804:0002:1:0 -5562 -p:BSKYB -d101:011c0000:090c:0002:1:0 -movies24+ -p:BSkyB -0402:011c0000:0804:0002:1:0 -5563 -p:BSKYB -1202:011c0000:07eb:0002:1:0 -Sky Sports 4 -p:BSkyB -1c02:011c0000:07d4:0002:1:0 - -p: -0403:011c0000:0804:0002:1:0 -5560 -p:BSKYB -1203:011c0000:07eb:0002:1:0 -Sky Sports 1 -p:BSkyB -c503:011c0000:0965:0002:1:0 -Life -p:BSkyB -0404:011c0000:0804:0002:1:0 -5561 -p:BSKYB -2404:011c0000:07f9:0002:1:0 -Film4 -p:BSkyB -d804:011c0000:0a36:0002:1:0 -Zee TV -p:BSkyB -1205:011c0000:07eb:0002:1:0 -Sky Sports 3 -p:BSkyB -cc06:011c0000:08ff:0002:1:0 -LIVINGit+1 -p:BSkyB -d106:011c0000:090c:0002:1:0 -ARY News -p:BSkyB -1907:011c0000:07ff:0002:1:0 -ETV2 -p:BSkyB -d007:011c0000:0909:0002:1:0 -Elite TV 2 -p:BSkyB -cc08:011c0000:08ff:0002:1:0 -Challenge+1 -p:BSkyB -2409:011c0000:07f9:0002:1:0 -Film4 +1 -p:BSkyB -cc09:011c0000:08ff:0002:1:0 -Bravo 2 -p:BSkyB -d809:011c0000:0a36:0002:1:0 -Zee Cinema -p:BSkyB -1e0a:011c0000:07df:0002:1:0 -7360 -p:BSkyB -cc0a:011c0000:08ff:0002:1:0 -LIVING -p:BSkyB -190b:011c0000:07ff:0002:1:0 -BBC 1 Wales -p:BSkyB -270b:011c0000:07dd:0002:1:0 -6780 -p:BSkyB -cc0b:011c0000:08ff:0002:1:0 -Channel One+1 -p:BSkyB -190c:011c0000:07ff:0002:1:0 -BBC 2 Wales -p:BSkyB -270c:011c0000:07dd:0002:1:0 -6781 -p:BSkyB -d00c:011c0000:0909:0002:1:0 -Food Network -p:BSkyB -c50d:011c0000:0965:0002:1:0 -Monte Carlo TV -p:BSkyB -170e:011c0000:0963:0002:1:0 -ISM Test1 v5 -p:BSkyB -240e:011c0000:07f9:0002:1:0 -More4 +1 -p:BSkyB -c50e:011c0000:0965:0002:1:0 -AvaTest -p:BSkyB -d80e:011c0000:0a36:0002:1:0 -Zing -p:BSkyB -120f:011c0000:07ee:0002:1:0 -yd2oe6 -p:BSkyB -270f:011c0000:0805:0002:1:0 -10135 -p:BSkyB -1210:011c0000:07ee:0002:1:0 -yd1oe6 -p:BSkyB -1710:011c0000:07e9:0002:1:0 -ComedyCentral -p:BSkyB -1612:011c0000:07d7:0002:1:0 -Sky Mdn Greats -p:BSkyB -d813:011c0000:0a36:0002:1:0 -Zee Punjabi -p:BSkyB -1e14:011c0000:07f5:0002:1:0 -FIVE -p:BSkyB -2814:011c0000:0806:0002:1:0 -ITV3 -p:BSkyB -cd14:011c0000:0902:0002:1:0 -GEO UK -p:BSkyB -1915:011c0000:07ff:0002:1:0 -BBC 1 Scotland -p:BSkyB -1e15:011c0000:07f5:0002:1:0 -Channel TBC -p:BSkyB -2815:011c0000:0806:0002:1:0 -ITV3+1 -p:BSkyB -1916:011c0000:07ff:0002:1:0 -BBC 2 Scotland -p:BSkyB -1e16:011c0000:07f5:0002:1:0 -FIVE -p:BSkyB -d016:011c0000:0909:0002:1:0 -Food Netwrk+1 -p:BSkyB -1e17:011c0000:07f5:0002:1:0 -FIVE -p:BSkyB -d818:011c0000:0a36:0002:1:0 -Zee Café -p:BSkyB -1519:011c0000:07e7:0002:1:0 -Sky Sports 4 -p:BSkyB -cd19:011c0000:0902:0002:1:0 -AAG -p:BSkyB -151a:011c0000:07e7:0002:1:0 -FX+ -p:BSkyB -1d1a:011c0000:07de:0002:1:0 -ITV1 Central S -p:BSkyB -cc1a:011c0000:08ff:0002:1:0 -propeller -p:BSkyB -1d1b:011c0000:07de:0002:1:0 -ITV1 Central E -p:BSkyB -d01b:011c0000:0909:0002:1:0 -Blue Kiss TV -p:BSkyB -151c:011c0000:07e7:0002:1:0 -Sky Sports 4 -p:BSkyB -c51c:011c0000:0965:0002:1:0 -50460 -p:BSKYB -d41c:011c0000:0a2c:0002:1:0 -MATV National -p:BSkyB -281d:011c0000:0806:0002:1:0 -G54 -p:BSkyB -1e1e:011c0000:07f5:0002:1:0 -FIVE USA -p:BSkyB -cd1e:011c0000:0902:0002:1:0 -price-drop tv -p:BSkyB -1e1f:011c0000:07f5:0002:1:0 -FIVE USA+1 -p:BSkyB -271f:011c0000:0801:0002:1:0 -ITV4+1 -p:BSkyB -1920:011c0000:07ff:0002:1:0 -BBC 2 NI -p:BSkyB -d020:011c0000:0909:0002:1:0 -wedding tv -p:BSkyB -c521:011c0000:0965:0002:1:0 -50465 -p:BSKYB -cb21:011c0000:0907:0002:1:0 -UCB TV -p:BSkyB -d421:011c0000:0a2c:0002:1:0 -Military -p:BSkyB -cb22:011c0000:0907:0002:1:0 -horror ch+1 -p:BSkyB -1e23:011c0000:07f5:0002:1:0 -FIVER -p:BSkyB -cd23:011c0000:0902:0002:1:0 -MAX -p:BSkyB -1e24:011c0000:07f5:0002:1:0 -FIVER+1 -p:BSkyB -2724:011c0000:0801:0002:1:0 -ITV1 Wales -p:BSkyB -cb24:011c0000:0907:0002:1:0 -UMMAH CHNL -p:BSkyB -cb25:011c0000:0907:0002:1:0 -Clubland TV -p:BSkyB -d025:011c0000:0909:0002:1:0 -Nick Jr. 2 -p:BSkyB -d325:011c0000:0a29:0002:1:0 -ATN Bangla UK -p:BSkyB -c526:011c0000:0965:0002:1:0 -50470 -p:BSKYB -cb26:011c0000:0907:0002:1:0 -Jewelry Maker -p:BSkyB -d326:011c0000:0a29:0002:1:0 -IQRA TV -p:BSkyB -d426:011c0000:0a2c:0002:1:0 -Nickelodeon -p:BSkyB -cb27:011c0000:0907:0002:1:0 -Fashion TV -p:BSkyB -cb28:011c0000:0907:0002:1:0 -Get Lucky TV -p:BSkyB -cd28:011c0000:0902:0002:1:0 -COLORS -p:BSkyB -2329:011c0000:0803:0002:1:0 -Disney Chnl -p:BSkyB -232a:011c0000:0803:0002:1:0 -Disney Cine -p:BSkyB -cb2a:011c0000:0907:0002:1:0 -Lava -p:BSkyB -d02a:011c0000:0909:0002:1:0 -Hidayat TV -p:BSkyB -122b:011c0000:0968:0002:1:0 -Sky Thriller -p:BSkyB -132b:011c0000:07e7:0002:1:0 -Sky Spts News -p:BSkyB -232b:011c0000:0803:0002:1:0 -Disney Cine+1 -p:BSkyB -c52b:011c0000:0965:0002:1:0 -50475 -p:BSKYB -d42b:011c0000:0a2c:0002:1:0 -Pitch TV -p:BSkyB -122c:011c0000:0968:0002:1:0 -Sky Prem+1 -p:BSkyB -132c:011c0000:07e7:0002:1:0 -SP News -p:BSkyB -232c:011c0000:0803:0002:1:0 -Play Disney -p:BSkyB -d32c:011c0000:0a29:0002:1:0 -KICC TV -p:BSkyB -122d:011c0000:0968:0002:1:0 -History -p:BSkyB -132d:011c0000:07e7:0002:1:0 -Sky Spts News -p:BSkyB -cb2d:011c0000:0907:0002:1:0 -Chat Box -p:BSkyB -cd2d:011c0000:0902:0002:1:0 -OBE -p:BSkyB -132e:011c0000:07e7:0002:1:0 -Sky Spts News -p:BSkyB -232e:011c0000:07d7:0002:1:0 -9006 -p:BSkyB -272e:011c0000:0801:0002:1:0 -ITV1 West -p:BSkyB -cb2e:011c0000:0907:0002:1:0 -Cinémoi movies -p:BSkyB -d32e:011c0000:0a29:0002:1:0 -Channel 'S' -p:BSkyB -122f:011c0000:0968:0002:1:0 -Bio -p:BSkyB -232f:011c0000:0803:0002:1:0 -Disney Chnl+1 -p:BSkyB -cb2f:011c0000:0907:0002:1:0 -Just4us -p:BSkyB -d02f:011c0000:0909:0002:1:0 -LivexxxBabes -p:BSkyB -d32f:011c0000:0a29:0002:1:0 -Peace TV -p:BSkyB -1a30:011c0000:07dd:0002:1:0 -BBC NEWS -p:BSkyB -c530:011c0000:0965:0002:1:0 -50480 -p:BSKYB -cb30:011c0000:0907:0002:1:0 -The Other Side -p:BSkyB -d330:011c0000:0a29:0002:1:0 -Peace TV Urdu -p:BSkyB -d430:011c0000:0a2c:0002:1:0 -STAR News -p:BSkyB -1a31:011c0000:07dd:0002:1:0 -BBC PARL'MNT -p:BSkyB -2331:011c0000:07ee:0002:1:0 -Sky 1 ETV Slot1 -p:BSkyB -d031:011c0000:0909:0002:1:0 -Essex Babes -p:BSkyB -d331:011c0000:0a29:0002:1:0 -Bangla TV -p:BSkyB -1332:011c0000:07e7:0002:1:0 -Sky Sports 1 -p:BSkyB -2332:011c0000:0803:0002:1:0 -Play Disney+ -p:BSkyB -cd32:011c0000:0902:0002:1:0 -Diva TV -p:BSkyB -d332:011c0000:0a29:0002:1:0 -Info TV +1 -p:BSkyB -1133:011c0000:07d7:0002:1:0 -Sky Family -p:BSkyB -1233:011c0000:0968:0002:1:0 -Sky Premiere -p:BSkyB -2333:011c0000:07d2:0002:1:0 -6008 -p:BSkyB -d333:011c0000:0a29:0002:1:0 -Faith World TV -p:BSkyB -d334:011c0000:0a29:0002:1:0 -Channel i -p:BSkyB -d335:011c0000:0a29:0002:1:0 -Showcase +1 -p:BSkyB -1537:011c0000:07e7:0002:1:0 -ComedyCtralX -p:BSkyB -cd37:011c0000:0902:0002:1:0 -ARY QTV -p:BSkyB -2738:011c0000:0801:0002:1:0 -ITV1 W Country -p:BSkyB -cc38:011c0000:08ff:0002:1:0 -S4C2 -p:BSkyB -1139:011c0000:07ee:0002:1:0 -RealmadridTV -p:BSkyB -1839:011c0000:07d9:0002:1:0 -Discovery -p:BSkyB -c739:011c0000:096b:0002:1:0 -mta-muslim tv -p:BSkyB -d039:011c0000:090a:0002:1:0 -Aastha TV -p:BSkyB -113a:011c0000:07db:0002:1:0 -TV5 -p:BSkyB -153a:011c0000:07e7:0002:1:0 -Sky Sports 4 -p:BSkyB -183a:011c0000:07d9:0002:1:0 -Animal Planet -p:BSkyB -d43a:011c0000:0a2c:0002:1:0 -Elite TV -p:BSkyB -183b:011c0000:07d9:0002:1:0 -Disc.RealTime -p:BSkyB -253b:011c0000:0a34:0002:1:0 -TV SHOP -p:BSkyB -183c:011c0000:07d9:0002:1:0 -Discovery+1 -p:BSkyB -253c:011c0000:0a34:0002:1:0 -CBS Reality -p:BSkyB -183d:011c0000:07d9:0002:1:0 -Travel & Living -p:BSkyB -253d:011c0000:0a34:0002:1:0 -JML Active -p:BSkyB -283d:011c0000:07fe:0002:1:0 -BBC 1 W Mids -p:BSkyB -c73d:011c0000:096b:0002:1:0 -Word Network -p:BSkyB -183e:011c0000:07d9:0002:1:0 -Disc.Science -p:BSkyB -1c3e:011c0000:07e1:0002:1:0 -QVC -p:BSkyB -233e:011c0000:0967:0002:1:0 -Arsenal TV -p:BSkyB -283e:011c0000:07fe:0002:1:0 -BBC 1 N West -p:BSkyB -c73e:011c0000:096b:0002:1:0 -SuperCasino -p:BSkyB -d03e:011c0000:090a:0002:1:0 -Ideal World -p:BSkyB -183f:011c0000:07d9:0002:1:0 -Disc.Knowldge -p:BSkyB -1c3f:011c0000:07e1:0002:1:0 -QVC Test -p:BSkyB -253f:011c0000:0a34:0002:1:0 -Record TV -p:BSkyB -283f:011c0000:07fe:0002:1:0 -BBC 1 Yrks&Lin -p:BSkyB -d43f:011c0000:0a2c:0002:1:0 -The Style Ntwk -p:BSkyB -1840:011c0000:07d9:0002:1:0 -Home & Health -p:BSkyB -2540:011c0000:0a34:0002:1:0 -Sangat -p:BSkyB -2840:011c0000:07fe:0002:1:0 -BBC 1 Yorks -p:BSkyB -d740:011c0000:0a34:0002:1:0 -Gems.tv 2 -p:BSkyB -1841:011c0000:07d9:0002:1:0 -Disc.Turbo -p:BSkyB -2441:011c0000:07f9:0002:1:0 -c4 l -p:BSkyB -2541:011c0000:0a34:0002:1:0 -JML Home&DIY -p:BSkyB -2841:011c0000:07fe:0002:1:0 -BBC 1 E Mids -p:BSkyB -cd41:011c0000:0902:0002:1:0 -Screenshop2 -p:BSkyB -1842:011c0000:07d9:0002:1:0 -Discovery -p:BSkyB -2842:011c0000:07fe:0002:1:0 -BBC 1 East (E) -p:BSkyB -cd42:011c0000:0902:0002:1:0 -speedauctiontv -p:BSkyB -1843:011c0000:07d9:0002:1:0 -QUEST -p:BSkyB -c743:011c0000:096b:0002:1:0 -CCTV News -p:BSkyB -d043:011c0000:090a:0002:1:0 -High Street TV -p:BSkyB -2f44:011c0000:07f4:0002:1:0 -ITV1 Mer SE -p:BSkyB -d444:011c0000:0a2c:0002:1:0 -ComedyCtrl+1 -p:BSkyB -2f45:011c0000:07f4:0002:1:0 -ITV1 Mer N -p:BSkyB -d745:011c0000:0a34:0002:1:0 -Sunrise TV -p:BSkyB -cd46:011c0000:0902:0002:1:0 -Bloomberg -p:BSkyB -d746:011c0000:0a34:0002:1:0 -Gems.tv 1 -p:BSkyB -1647:011c0000:07e9:0002:1:0 -Nat Geo Wild -p:BSkyB -d747:011c0000:0a34:0002:1:0 -DBN -p:BSkyB -cb48:011c0000:0907:0002:1:0 -SportxxxGirls -p:BSkyB -d048:011c0000:090a:0002:1:0 -Ideal Extra -p:BSkyB -d748:011c0000:0a34:0002:1:0 -Stop + Shop -p:BSkyB -d449:011c0000:0a2c:0002:1:0 -OceanFinance -p:BSkyB -d749:011c0000:0a33:0002:1:0 -AIT Int'l -p:BSkyB -1f4a:011c0000:07d4:0002:1:0 -8010 -p:BSkyB -c74b:011c0000:096b:0002:1:0 -Inspiration -p:BSkyB -cd4b:011c0000:0902:0002:1:0 -Glory TV -p:BSkyB -d74b:011c0000:0a2b:0002:1:0 -Body In Balance -p:BSkyB -274c:011c0000:07fc:0002:1:0 -ITV1 London -p:BSkyB -cc4c:011c0000:096a:0002:1:0 -Flava -p:BSkyB -d04d:011c0000:090a:0002:1:0 -Create & Craft -p:BSkyB -164e:011c0000:07e9:0002:1:0 -Eurosport UK -p:BSkyB -2f4e:011c0000:07f4:0002:1:0 -ITV1 Anglia W -p:BSkyB -164f:011c0000:07e9:0002:1:0 -5711 -p:BSkyB -d74f:011c0000:0a33:0002:1:0 -OHTV -p:BSkyB -1a50:011c0000:07dd:0002:1:0 -BBC ALBA -p:BSkyB -2851:011c0000:07fe:0002:1:0 -ETV5 -p:BSkyB -cc51:011c0000:096a:0002:1:0 -Bliss -p:BSkyB -1652:011c0000:07e9:0002:1:0 -TCM -p:BSkyB -1c52:011c0000:07e1:0002:1:0 -bid tv -p:BSkyB -cb52:011c0000:0907:0002:1:0 -Northern Birds -p:BSkyB -d052:011c0000:090a:0002:1:0 -Club Paradiso -p:BSkyB -d453:011c0000:0a2c:0002:1:0 -Nick Jr -p:BSkyB -c355:011c0000:07ef:0002:1:0 -1356 -p:BSkyB -d155:011c0000:090c:0002:1:0 -CelebrityShop -p:BSkyB -d355:011c0000:0a2a:0002:1:0 -wedding tv asia -p:BSkyB -1456:011c0000:07eb:0002:1:0 -Sky Arts 2 -p:BSkyB -2756:011c0000:07fc:0002:1:0 -ITV2 -p:BSkyB -cc56:011c0000:096a:0002:1:0 -Scuzz -p:BSkyB -d156:011c0000:090c:0002:1:0 -ChatGirl TV2 -p:BSkyB -d356:011c0000:0a2a:0002:1:0 -Travel Channel -p:BSkyB -2457:011c0000:07ee:0002:1:0 -Pub Channel -p:BSkyB -2757:011c0000:07fc:0002:1:0 -CITV -p:BSkyB -c757:011c0000:096b:0002:1:0 -SouthForYou -p:BSkyB -d057:011c0000:090a:0002:1:0 -Motors TV -p:BSkyB -d157:011c0000:090c:0002:1:0 -Tease Me TV2 -p:BSkyB -d357:011c0000:0a2a:0002:1:0 -Rocks TV -p:BSkyB -0458:011c0000:0909:0002:1:0 -53205 -p:BSkyB -2758:011c0000:07fc:0002:1:0 -ITV4 -p:BSkyB -2f58:011c0000:07f4:0002:1:0 -ITV1 Yorks E -p:BSkyB -c758:011c0000:096b:0002:1:0 -FRANCE 24 -p:BSkyB -cb58:011c0000:0907:0002:1:0 -Controversial tv -p:BSkyB -d158:011c0000:090c:0002:1:0 -Climax3 - 1 -p:BSkyB -d358:011c0000:0a2a:0002:1:0 -Euronews -p:BSkyB -d458:011c0000:0a2c:0002:1:0 -Pitch World -p:BSkyB -1b59:011c0000:07da:0002:1:0 -MTV -p:BSkyB -c759:011c0000:096b:0002:1:0 -TBN Europe -p:BSkyB -d159:011c0000:090c:0002:1:0 -Climax3 - 2 -p:BSkyB -1b5a:011c0000:07da:0002:1:0 -VH1 -p:BSkyB -d15a:011c0000:090c:0002:1:0 -Climax3 - 3 -p:BSkyB -d35a:011c0000:0a2a:0002:1:0 -JML Cookshop -p:BSkyB -1b5b:011c0000:07da:0002:1:0 -MTV ROCKS -p:BSkyB -c75b:011c0000:096b:0002:1:0 -GOD Channel -p:BSkyB -cc5b:011c0000:096a:0002:1:0 -DanceNationTV -p:BSkyB -d15b:011c0000:090c:0002:1:0 -Adult Channel -p:BSkyB -d35b:011c0000:0a2a:0002:1:0 -SAB TV -p:BSkyB -cb5c:011c0000:0907:0002:1:0 -BET +1 -p:BSkyB -d15c:011c0000:090c:0002:1:0 -Playboy TV -p:BSkyB -125d:011c0000:07ee:0002:1:0 -Sky 1 -p:BSkyB -1b5d:011c0000:07da:0002:1:0 -MTV+1 -p:BSkyB -d15d:011c0000:090c:0002:1:0 -Top Shelf TV -p:BSkyB -d35d:011c0000:0a2a:0002:1:0 -O'seasproperty -p:BSkyB -d45d:011c0000:0a2c:0002:1:0 -54365 -p:BSkyB -1b5e:011c0000:07da:0002:1:0 -MTV HITS -p:BSkyB -d15e:011c0000:090c:0002:1:0 -40 n Naughty -p:BSkyB -d35e:011c0000:0a2a:0002:1:0 -CBS Action -p:BSkyB -125f:011c0000:07ee:0002:1:0 -Sky1 -p:BSkyB -1b5f:011c0000:07da:0002:1:0 -MTV BASE -p:BSkyB -1260:011c0000:07ea:0002:1:0 -Sky News -p:BSkyB -1b60:011c0000:07da:0002:1:0 -MTV CLASSIC -p:BSkyB -2760:011c0000:07fc:0002:1:0 -ITV1 Granada -p:BSkyB -cc60:011c0000:096a:0002:1:0 -True Movies -p:BSkyB -d360:011c0000:0a2a:0002:1:0 -Best Direct -p:BSkyB -1261:011c0000:07eb:0002:1:0 -Sky1 -p:BSkyB -1b61:011c0000:07da:0002:1:0 -VIVA -p:BSkyB -d061:011c0000:090a:0002:1:0 -MUTV -p:BSkyB -d361:011c0000:0a2a:0002:1:0 -Bilberry TV -p:BSkyB -1262:011c0000:07ea:0002:1:0 -Sky News -p:BSkyB -1b62:011c0000:07da:0002:1:0 -MTV -p:BSkyB -2462:011c0000:07ee:0002:1:0 -Sky Sports 2 -p:BSkyB -2f62:011c0000:07f4:0002:1:0 -ITV1 TT S -p:BSkyB -2463:011c0000:07ef:0002:1:0 -At The Races -p:BSkyB -1b64:011c0000:07da:0002:1:0 -MTV SHOWS -p:BSkyB -2464:011c0000:0963:0002:1:0 -ISM Sky1 v6 -p:BSkyB -1965:011c0000:07d6:0002:1:0 -Home -p:BSkyB -2465:011c0000:0963:0002:1:0 -ISM Sports 1 v6 -p:BSkyB -cc65:011c0000:096a:0002:1:0 -True Movies 2 -p:BSkyB -1266:011c0000:07ea:0002:1:0 -Sky News UK (Cable) -p:BSkyB -1966:011c0000:07d6:0002:1:0 -Eden -p:BSkyB -1b66:011c0000:07da:0002:1:0 -MTV DANCE -p:BSkyB -2466:011c0000:0963:0002:1:0 -9318 -p:BSkyB -cb66:011c0000:0907:0002:1:0 -Press TV -p:BSkyB -d066:011c0000:090a:0002:1:0 -Jewellery Ch. -p:BSkyB -1267:011c0000:07ea:0002:1:0 -Sky News Eire (Cable) -p:BSkyB -2467:011c0000:0963:0002:1:0 -9319 -p:BSkyB -1968:011c0000:07d6:0002:1:0 -GOLD -p:BSkyB -bf68:011c0000:0963:0002:1:0 - (sub b +1000) -p:BSkyB -d368:011c0000:0a2a:0002:1:0 -JML Choice -p:BSkyB -1969:011c0000:07d6:0002:1:0 -YeSTERDAY -p:BSkyB -196a:011c0000:07d6:0002:1:0 -Dave -p:BSkyB -1a6a:011c0000:07dd:0002:1:0 -ETV3 -p:BSkyB -246a:011c0000:0963:0002:1:0 -EIA2 Test -p:BSkyB -276a:011c0000:07fc:0002:1:0 -ITV1 Anglia E -p:BSkyB -cc6a:011c0000:096a:0002:1:0 -Tiny Pop -p:BSkyB -196b:011c0000:07d6:0002:1:0 -UKTV Food +1 -p:BSkyB -196c:011c0000:07d6:0002:1:0 -Good Food -p:BSkyB -206c:011c0000:07fa:0002:1:0 -E4+1 -p:BSkyB -2f6c:011c0000:07f4:0002:1:0 -ITV1 Central SW -p:BSkyB -1b6d:011c0000:07da:0002:1:0 -MTV Trax -p:BSkyB -286f:011c0000:0800:0002:1:0 -BBC 1 West -p:BSkyB -cc6f:011c0000:096a:0002:1:0 -NME TV -p:BSkyB -1070:011c0000:07e5:0002:1:0 -Sky Sports 2 -p:BSkyB -1270:011c0000:07ee:0002:1:0 -Sky News+1 -p:BSkyB -1970:011c0000:07d6:0002:1:0 -Uktv Docs~ -p:BSkyB -2470:011c0000:0963:0002:1:0 -9328 -p:BSkyB -2870:011c0000:0800:0002:1:0 -BBC 1 S East -p:BSkyB -d070:011c0000:090a:0002:1:0 -Ideal & More -p:BSkyB -1771:011c0000:07d2:0002:1:0 -LIVING -p:BSkyB -2071:011c0000:07fa:0002:1:0 -E4 -p:BSkyB -2871:011c0000:0800:0002:1:0 -BBC 1 South -p:BSkyB -1772:011c0000:07d2:0002:1:0 -Challenge -p:BSkyB -2872:011c0000:0800:0002:1:0 -BBC 1 S West -p:BSkyB -1773:011c0000:07d2:0002:1:0 -LIVING Loves -p:BSkyB -2473:011c0000:0963:0002:1:0 -SOM Trigger Test -p:BSkyB -2773:011c0000:0801:0002:1:0 -G49 -p:BSkyB -2873:011c0000:0800:0002:1:0 -BBC 1 NE & C -p:BSkyB -1774:011c0000:07d2:0002:1:0 -Bravo -p:BSkyB -2774:011c0000:07fc:0002:1:0 -ITV1 Central W -p:BSkyB -2874:011c0000:0800:0002:1:0 -BBC 1 Oxford -p:BSkyB -cc74:011c0000:096a:0002:1:0 -POP -p:BSkyB -1775:011c0000:07d2:0002:1:0 -LIVING +1 -p:BSkyB -1975:011c0000:07d6:0002:1:0 -7611 -p:BSkyB -cf75:011c0000:0908:0002:1:0 -movies4men -p:BSkyB -1076:011c0000:07e5:0002:1:0 -Sky Sports 1 -p:BSkyB -1776:011c0000:07d2:0002:1:0 -Bravo+1 -p:BSkyB -1976:011c0000:07d6:0002:1:0 -UK Food~ -p:BSkyB -cf76:011c0000:0908:0002:1:0 -movies4men 2 -p:BSkyB -1777:011c0000:07d2:0002:1:0 -LIVINGit -p:BSkyB -2077:011c0000:07fa:0002:1:0 -Channel 4 +1 -p:BSkyB -2477:011c0000:0963:0002:1:0 -8N2 -p:BSkyB -d377:011c0000:0a2a:0002:1:0 -Believe TV -p:BSkyB -1078:011c0000:07e5:0002:1:0 -Sky Sports 1 -p:BSkyB -1778:011c0000:07d2:0002:1:0 -Channel One -p:BSkyB -1978:011c0000:07d6:0002:1:0 -Watch -p:BSkyB -2078:011c0000:07fa:0002:1:0 -Channel 4 +1 -p:BSkyB -2478:011c0000:0963:0002:1:0 -EIA2 Test 5 -p:BSkyB -1979:011c0000:07d6:0002:1:0 -alibi -p:BSkyB -2079:011c0000:07fa:0002:1:0 -Channel 4 +1 -p:BSkyB -cc79:011c0000:096a:0002:1:0 -Tiny Pop +1 -p:BSkyB -cf79:011c0000:0908:0002:1:0 -Sahara One -p:BSkyB -197a:011c0000:07d6:0002:1:0 -Blighty -p:BSkyB -207a:011c0000:07fa:0002:1:0 -Channel 4 +1 -p:BSkyB -107b:011c0000:07e5:0002:1:0 -Sky Sports 3 -p:BSkyB -207b:011c0000:07fa:0002:1:0 -Channel 4 +1 -p:BSkyB -177c:011c0000:07d2:0002:1:0 -Challenge+ -p:BSkyB -1a7c:011c0000:07dd:0002:1:0 -T7 STRM-0 -p:BSkyB -207c:011c0000:07fa:0002:1:0 -Channel 4 +1 -p:BSkyB -247c:011c0000:07ef:0002:1:0 -SkyPoker.com -p:BSkyB -c47c:011c0000:0964:0002:1:0 -ComedyCtrl+1 -p:BSkyB -cf7c:011c0000:0908:0002:1:0 -PTV Global -p:BSkyB -d37c:011c0000:0a2a:0002:1:0 -Horse & Country -p:BSkyB -107d:011c0000:07e5:0002:1:0 -Sky Sports 1 -p:BSkyB -1a7d:011c0000:07dd:0002:1:0 -T7 STRM-1 -p:BSkyB -247d:011c0000:07ef:0002:1:0 -Sky Vegas -p:BSkyB -107e:011c0000:07ea:0002:1:0 -Sky Sports 2 -p:BSkyB -157e:011c0000:07d7:0002:1:0 -Sky DramaRom -p:BSkyB -177e:011c0000:07d2:0002:1:0 -Bravo+ -p:BSkyB -277e:011c0000:07fc:0002:1:0 -10110 -p:BSkyB -cf7e:011c0000:0908:0002:1:0 -jazeerachildren -p:BSkyB -277f:011c0000:07fc:0002:1:0 -10111 -p:BSkyB -cc7f:011c0000:096a:0002:1:0 -Kix! -p:BSkyB -bb80:011c0000:0963:0002:1:0 -___4110 -p:BSkyB -1581:011c0000:07ea:0002:1:0 -Sky Sports 2 -p:BSkyB -1b81:011c0000:07da:0002:1:0 -Mti -p:BSkyB -2481:011c0000:07ef:0002:1:0 -1429 -p:BSkyB -2581:011c0000:07fb:0002:1:0 -RTE One -p:BSkyB -c481:011c0000:0964:0002:1:0 -ComedyCentral -p:BSkyB -2482:011c0000:07e9:0002:1:0 -Chelsea TV -p:BSkyB -2582:011c0000:07fb:0002:1:0 -RTE TWO -p:BSkyB -2583:011c0000:07fb:0002:1:0 -TG4 -p:BSkyB -2883:011c0000:0800:0002:1:0 -ETV6 -p:BSkyB -cc83:011c0000:096a:0002:1:0 -The Vault -p:BSkyB -2484:011c0000:07ef:0002:1:0 -Crime -p:BSkyB -2584:011c0000:07fb:0002:1:0 -9604 -p:BSkyB -cb84:011c0000:08fd:0002:1:0 -Travel Ch +1 -p:BSkyB -1c85:011c0000:07e6:0002:1:0 -S4C -p:BSkyB -2585:011c0000:07fb:0002:1:0 -TV3 -p:BSkyB -1586:011c0000:07ea:0002:1:0 -Disney XD+1 -p:BSkyB -1a86:011c0000:07dd:0002:1:0 -ETV1. -p:BskyB -2486:011c0000:07ef:0002:1:0 -Disney XD -p:BSkyB -c486:011c0000:0964:0002:1:0 -GayDateTV -p:BSkyB -cb86:011c0000:08fd:0002:1:0 -CBS Reality+1 -p:BSkyB -d386:011c0000:0a2a:0002:1:0 -JML Direct -p:BSkyB -cb87:011c0000:08fd:0002:1:0 -3e -p:BSkyB -1788:011c0000:07d2:0002:1:0 -Bravo~ -p:BSkyB -2788:011c0000:0805:0002:1:0 -ITV1 Border -p:BSkyB -cb88:011c0000:08fd:0002:1:0 -Max TV -p:BSkyB -cb89:011c0000:08fd:0002:1:0 -horror channel -p:BSkyB -cc89:011c0000:096a:0002:1:0 -PopGirl -p:BSkyB -168a:011c0000:07e9:0002:1:0 -E! Entertainm -p:BSkyB -cb8a:011c0000:08fd:0002:1:0 -Gay Network -p:BSkyB -138b:011c0000:0968:0002:1:0 -History +1 hour -p:BSkyB -158b:011c0000:07e5:0002:1:0 -FX -p:BSkyB -c48b:011c0000:0964:0002:1:0 -Channel M -p:BSkyB -cb8b:011c0000:08fd:0002:1:0 -Wonderful -p:BSkyB -138c:011c0000:07dc:0002:1:0 -Sky Intro -p:BSkyB -1c8c:011c0000:07e6:0002:1:0 -7308 -p:BSkyB -cb8c:011c0000:08fd:0002:1:0 -STAR Plus -p:BSkyB -cb8d:011c0000:08fd:0002:1:0 -Thane Direct -p:BSkyB -cc8d:011c0000:096a:0002:1:0 -Chart Show TV -p:BSkyB -cb8e:011c0000:08fd:0002:1:0 -DM Digital -p:BSkyB -cb8f:011c0000:08fd:0002:1:0 -CNBC -p:BSkyB -2490:011c0000:07ef:0002:1:0 -At The Races -p:BSkyB -cb90:011c0000:08fd:0002:1:0 -Africa Channel -p:BSkyB -1091:011c0000:07ef:0002:1:0 -ESPN -p:BSkyB -1391:011c0000:07e7:0002:1:0 -Eurosport2 UK -p:BSkyB -1591:011c0000:07e5:0002:1:0 -Cartoonito -p:BSkyB -cb91:011c0000:08fd:0002:1:0 -STAR Gold -p:BSkyB -1592:011c0000:07e5:0002:1:0 -TCM 2 -p:BSkyB -2792:011c0000:0805:0002:1:0 -ITV1 TT N -p:BSkyB -cc92:011c0000:096a:0002:1:0 -PopGirl +1 -p:BSkyB -2094:011c0000:07fa:0002:1:0 -More4 -p:BSkyB -cb94:011c0000:08fe:0002:1:0 -Open Access 3 -p:BSkyB -d395:011c0000:0a2a:0002:1:0 -Fitness TV -p:BSkyB -cb96:011c0000:08fe:0002:1:0 -SmartLive -p:BSkyB -2797:011c0000:0805:0002:1:0 -Men & Motors -p:BSkyB -cc97:011c0000:096a:0002:1:0 -True Ent -p:BSkyB -b798:011c0000:0963:0002:1:0 -___4109 -p:BSkyB -cf98:011c0000:0908:0002:1:0 -Venus TV -p:BSkyB -1199:011c0000:0966:0002:1:0 -Sky Preview -p:BSkyB -cb99:011c0000:08fe:0002:1:0 -mov4men2 +1 -p:BSkyB -cf99:011c0000:0908:0002:1:0 -Vintage TV -p:BSkyB -c49a:011c0000:0964:0002:1:0 -Dating Channel -p:BSkyB -cb9b:011c0000:08fe:0002:1:0 -Rural TV -p:BSkyB -279c:011c0000:0805:0002:1:0 -ITV1 Meridian S -p:BSkyB -139d:011c0000:0807:0002:1:0 -NDTV 24x7 -p:BSkyB -189d:011c0000:07fd:0002:1:0 -BBC 1 London -p:BSkyB -279d:011c0000:0805:0002:1:0 -ITV1 Meridian E -p:BSkyB -cb9d:011c0000:08fe:0002:1:0 -Showcase -p:BSkyB -189e:011c0000:07fd:0002:1:0 -BBC 2 England -p:BSkyB -119f:011c0000:07e5:0002:1:0 -Sky Sports 3 -p:BSkyB -c49f:011c0000:0964:0002:1:0 -Islam Channel -p:BSkyB -c69f:011c0000:0969:0002:1:0 -Russia Today -p:BSkyB -cb9f:011c0000:08fe:0002:1:0 -revelation -p:BSkyB -11a1:011c0000:07e5:0002:1:0 -Sky Sports 3 -p:BSkyB -13a1:011c0000:0807:0002:1:0 -Current TV -p:BSkyB -d7a1:011c0000:0900:0002:1:0 -House Of Fun -p:BSkyB -18a2:011c0000:07fd:0002:1:0 -ETV -p:BSkyB -d7a2:011c0000:0900:0002:1:0 -Starz TV -p:BSkyB -11a3:011c0000:07dc:0002:1:0 -Sky Intro -p:BSkyB -c7a3:011c0000:096c:0002:1:0 -Al Jazeera Eng -p:BSkyB -cba3:011c0000:08fe:0002:1:0 -Sikh TV -p:BSkyB -c7a4:011c0000:096c:0002:1:0 -NHK World TV -p:BSkyB -d7a4:011c0000:0900:0002:1:0 -Lucky Star -p:BSkyB -18a5:011c0000:07fd:0002:1:0 -BBC TES 2 -p:BSkyB -d7a5:011c0000:0900:0002:1:0 -Brit Asia TV -p:BSkyB -27a6:011c0000:0805:0002:1:0 -ITV1 Anglia S -p:BSkyB -c7a6:011c0000:096c:0002:1:0 -Hallmark +1 -p:BSkyB -cba6:011c0000:08fe:0002:1:0 -B4U Movies -p:BSkyB -2fa7:011c0000:07f4:0002:1:0 -12199 -p:BSkyB -c7a7:011c0000:096c:0002:1:0 -Setanta Ireland -p:BSkyB -cba7:011c0000:08fe:0002:1:0 -B4U Music -p:BSkyB -d7a7:011c0000:0900:0002:1:0 -Babestation -p:BSkyB -c5a8:011c0000:0967:0002:1:0 -Racing UK -p:BSkyB -c7a8:011c0000:096c:0002:1:0 -Setanta Sports1 -p:BSkyB -16a9:011c0000:07eb:0002:1:0 -1871 SOM Test -p:BSkyB -c7a9:011c0000:096c:0002:1:0 -Premier Sports -p:BSkyB -d7a9:011c0000:0900:0002:1:0 -NDTV Imagine -p:BSkyB -16aa:011c0000:07eb:0002:1:0 -CommunityChnl -p:BSkyB -d7aa:011c0000:0900:0002:1:0 -STAR One -p:BSkyB -18ab:011c0000:07fd:0002:1:0 -BBC TES 3 -p:BSkyB -c7ab:011c0000:096c:0002:1:0 -Prem Spts Xtra -p:BSkyB -d7ab:011c0000:0900:0002:1:0 -ComedyCtlX+1 -p:BSkyB -16ac:011c0000:07eb:0002:1:0 -FOX News -p:BSkyB -18ac:011c0000:07fd:0002:1:0 -BBC FOUR -p:BSkyB -d7ac:011c0000:0900:0002:1:0 -Babeworld.tv -p:BSkyB -11ad:011c0000:07dc:0002:1:0 -Sky Intro -p:BSkyB -18ad:011c0000:07fd:0002:1:0 -CBBC Channel -p:BSkyB -c5ad:011c0000:0967:0002:1:0 -SupremeMastr -p:BSkyB -d7ad:011c0000:0900:0002:1:0 -Takbeer TV -p:BSkyB -18ae:011c0000:07fd:0002:1:0 -CBeebies -p:BSkyB -c4ae:011c0000:0964:0002:1:0 -Extreme Sports -p:BSkyB -d7ae:011c0000:0900:0002:1:0 -My Channel -p:BSkyB -18af:011c0000:07fd:0002:1:0 -BBC THREE -p:BSkyB -1db0:011c0000:07df:0002:1:0 -Home+1 -p:BSkyB -27b0:011c0000:0805:0002:1:0 -ITV1 Yorks W -p:BSkyB -ccb0:011c0000:090b:0002:1:0 -Investigation -p:BSkyB -1db1:011c0000:07df:0002:1:0 -7601 -p:BSkyB -c6b1:011c0000:0969:0002:1:0 -PTV Prime -p:BSkyB -c5b2:011c0000:0967:0002:1:0 -Sikh Channel -p:BSkyB -c6b2:011c0000:0969:0002:1:0 -Abu Dhabi TV -p:BSkyB -1db5:011c0000:07df:0002:1:0 -GOLD +1 -p:BSkyB -27b5:011c0000:0805:0002:1:0 -ITV2+1 -p:BSkyB -ccb5:011c0000:090b:0002:1:0 -Animal Plnt+1 -p:BSkyB -d7b5:011c0000:0900:0002:1:0 -WatchmeTV.TV -p:BSkyB -1db6:011c0000:07df:0002:1:0 -Uktv Gold+1~ -p:BSkyB -c5b7:011c0000:0967:0002:1:0 -Film24 -p:BSkyB -13b8:011c0000:07ef:0002:1:0 -Sky Active Ads -p:BSkyB -15b8:011c0000:0804:0002:1:0 -Nickelodeon -p:BSkyB -c4b8:011c0000:0964:0002:1:0 -Tease Me -p:BSkyB -15b9:011c0000:0804:0002:1:0 -Nick Replay -p:BSkyB -27b9:011c0000:0805:0002:1:0 -G53 -p:BSkyB -15ba:011c0000:0804:0002:1:0 -Nicktoons -p:BSkyB -1dba:011c0000:07df:0002:1:0 -Eden+1 -p:BSkyB -ccba:011c0000:090b:0002:1:0 -Disc.Sci+1 -p:BSkyB -d7ba:011c0000:0900:0002:1:0 -Psychic TV -p:BSkyB -15bb:011c0000:0804:0002:1:0 -Nick Jr. -p:BSkyB -18bb:011c0000:07fd:0002:1:0 -BBC 1 NI -p:BSkyB -d3bb:011c0000:0a2b:0002:1:0 -Noor TV -p:BSkyB -14bc:011c0000:07e7:0002:1:0 -S1Test -p:BSkyB -1bbc:011c0000:07e2:0002:1:0 -Cartoon Netwrk -p:BSkyB -c5bc:011c0000:0967:0002:1:0 -ESPN America -p:BSkyB -d3bc:011c0000:0a2b:0002:1:0 -Jackpot -p:BSkyB -d7bc:011c0000:0900:0002:1:0 -Ahlulbayt TV -p:BSkyB -1bbd:011c0000:07e2:0002:1:0 -Boomerang +1 -p:BSkyB -d3bd:011c0000:0a2b:0002:1:0 -Luxe TV -p:BSkyB -1bbe:011c0000:07e2:0002:1:0 -Boomerang -p:BSkyB -c6be:011c0000:0969:0002:1:0 -PCNE Chinese -p:BSkyB -cbbe:011c0000:08fe:0002:1:0 -Gospel Channel -p:BSkyB -18bf:011c0000:07fd:0002:1:0 -FIVE -p:BSkyB -1bbf:011c0000:07e2:0002:1:0 -CN Too -p:BSkyB -1dbf:011c0000:07df:0002:1:0 -Watch +1 -p:BSkyB -cbbf:011c0000:08fe:0002:1:0 -AAJ TAK -p:BSkyB -ccbf:011c0000:090b:0002:1:0 -DMAX -p:BSkyB -d7bf:011c0000:0a35:0002:1:0 -Television X -p:BSkyB -1dc0:011c0000:07df:0002:1:0 -7616 -p:BSkyB -c6c0:011c0000:0969:0002:1:0 -Information TV -p:BSkyB -d3c0:011c0000:0a2b:0002:1:0 -HiTV -p:BSkyB -d7c0:011c0000:0a35:0002:1:0 -TVX Amateur -p:BSkyB -c5c1:011c0000:0967:0002:1:0 -LiverpoolFCTV -p:BSkyB -c6c1:011c0000:0969:0002:1:0 -Showcase 2 -p:BSkyB -d7c1:011c0000:0a35:0002:1:0 -Primetime -p:BSkyB -c4c2:011c0000:0964:0002:1:0 -Tease Me 3 -p:BSkyB -cbc2:011c0000:08fe:0002:1:0 -Renault TV -p:BSkyB -d7c2:011c0000:0a35:0002:1:0 -TVX Brits -p:BSkyB -d3c3:011c0000:0a2b:0002:1:0 -LOVEWORLD TV -p:BSkyB -d7c3:011c0000:0a35:0002:1:0 -redhot amateur -p:BSkyB -1bc4:011c0000:07e2:0002:1:0 -Toonami I -p:BSkyB -1dc4:011c0000:07df:0002:1:0 -Really -p:BSkyB -cbc4:011c0000:08fe:0002:1:0 -Audi Channel -p:BSkyB -ccc4:011c0000:090b:0002:1:0 -DMAX+1 -p:BSkyB -d3c4:011c0000:0a2b:0002:1:0 -UCTV -p:BSkyB -d7c4:011c0000:0a35:0002:1:0 -redhot 40+ -p:BSkyB -1bc5:011c0000:07e2:0002:1:0 -Cartoon I -p:BSkyB -1dc5:011c0000:07df:0002:1:0 -UKTV Docs+1~ -p:BSkyB -d3c5:011c0000:0a2b:0002:1:0 -Cream -p:BSkyB -c5c6:011c0000:0967:0002:1:0 -Channel AKA -p:BSkyB -cbc6:011c0000:08fe:0002:1:0 -NTV -p:BSkyB -d7c6:011c0000:0a35:0002:1:0 -redhot fetish -p:BSkyB -d7c7:011c0000:0a35:0002:1:0 -redhot Mums -p:BSkyB -1dc8:011c0000:07df:0002:1:0 -Dave ja vu -p:BSkyB -d7c8:011c0000:0a35:0002:1:0 -redhot TV -p:BSkyB -1dc9:011c0000:07df:0002:1:0 -UKTV G2+1. -p:BSkyB -c7c9:011c0000:0969:0002:1:0 -BabyTV -p:BSkyB -cbc9:011c0000:08fd:0002:1:0 -Crime+1 -p:BSkyB -ccc9:011c0000:090b:0002:1:0 -DMAX+2 -p:BSkyB -1dca:011c0000:07df:0002:1:0 -Good Food +1 -p:BSkyB -cbca:011c0000:08fd:0002:1:0 -Jackpot Games -p:BSkyB -d7ca:011c0000:0a35:0002:1:0 -Filth -p:BSkyB -c5cb:011c0000:0967:0002:1:0 -Entrepreneur -p:BSkyB -d7cb:011c0000:0a35:0002:1:0 -Gay TV -p:BSkyB -12cc:011c0000:0966:0002:1:0 - -p: -10ce:011c0000:07d7:0002:1:0 -Sky Action -p:BSkyB -1dce:011c0000:07df:0002:1:0 -alibi +1 -p:BSkyB -ccce:011c0000:090b:0002:1:0 -QUEST+1 -p:BSkyB -d7ce:011c0000:0a35:0002:1:0 -Dirty Talk -p:BSkyB -10cf:011c0000:07d7:0002:1:0 -Sky Comedy -p:BSkyB -d7cf:011c0000:0a35:0002:1:0 -The Active Ch -p:BSkyB -10d0:011c0000:07d7:0002:1:0 -Sky ScFi/Horror -p:BSkyB -20d0:011c0000:07ea:0002:1:0 -8039 -p:BSkyB -c5d0:011c0000:0967:0002:1:0 -Q -p:BSkyB -cfd0:011c0000:0909:0002:1:0 -E! Entertainm -p:BSkyB -10d1:011c0000:07d7:0002:1:0 -Sky Classics -p:BSkyB -10d2:011c0000:07d7:0002:1:0 -Sky Indie -p:BSkyB -ccd3:011c0000:090b:0002:1:0 -Disc.Know.+1 -p:BSkyB -d7d3:011c0000:0900:0002:1:0 -N'toons Replay -p:BSkyB -c5d5:011c0000:0967:0002:1:0 -Magic -p:BSkyB -cfd5:011c0000:0909:0002:1:0 -ESPN Classic -p:BSkyB -17d7:011c0000:07df:0002:1:0 -6103 -p:BSkyB -c6d7:011c0000:0900:0002:1:0 -CBS Drama -p:BSkyB -27d8:011c0000:0806:0002:1:0 -ITV Channel Is -p:BSkyB -ccd8:011c0000:090b:0002:1:0 -Discovery Shed -p:BSkyB -d6d9:011c0000:0a33:0002:1:0 -DAYSTAR -p:BSkyB -c5da:011c0000:0967:0002:1:0 -ESPN -p:BSkyB -cfda:011c0000:0909:0002:1:0 -Sumo TV -p:BSkyB -d6da:011c0000:0a33:0002:1:0 -BEN -p:BSkyB -d6db:011c0000:0908:0002:1:0 -Nollywood -p:BSkyB -ccdd:011c0000:090b:0002:1:0 -Disc.RT+1 -p:BSkyB -d6dd:011c0000:0a33:0002:1:0 -EWTN -p:BSkyB -c4e0:011c0000:0965:0002:1:0 -Shop on TV -p:BSkyB -1de2:011c0000:07df:0002:1:0 -YeSTERDAY+1 -p:BSkyB -27e2:011c0000:0806:0002:1:0 -STV -p:BSkyB -cce2:011c0000:090b:0002:1:0 -Home&Health+ -p:BSkyB -bbe3:011c0000:0963:0002:1:0 -___99 -p:BSkyB -1be4:011c0000:07e2:0002:1:0 -CNN -p:BSkyB -c4e5:011c0000:0965:0002:1:0 -GEO News -p:BSkyB -d6e5:011c0000:0a33:0002:1:0 -mov4men+1 -p:BSkyB -15e6:011c0000:07ea:0002:1:0 -1869 -p:BSkyB -d7e6:011c0000:0900:0002:1:0 -Hallmark -p:BSkyB -d6e8:011c0000:0a33:0002:1:0 -Live 960 -p:BSkyB -c4ea:011c0000:0965:0002:1:0 -Gala TV -p:BSkyB -d6ea:011c0000:0a33:0002:1:0 -Madani Chnl -p:BSkyB -c4eb:011c0000:0965:0002:1:0 -AVAGO (Cable) -p:BSkyB -d6eb:011c0000:0a33:0002:1:0 -Music India -p:BSkyB -27ec:011c0000:0806:0002:1:0 -STV -p:BSkyB -d6ec:011c0000:0a33:0002:1:0 -55020 -p:BSkyB -27ed:011c0000:0806:0002:1:0 -STV -p:BSkyB -d6ed:011c0000:0a33:0002:1:0 -Vox Africa -p:BSkyB -cfee:011c0000:0909:0002:1:0 -BET -p:BSkyB -d6ee:011c0000:0a33:0002:1:0 -AHLEBAIT TV -p:BSkyB -13ef:011c0000:07eb:0002:1:0 -Sky3 -p:BSkyB -c4ef:011c0000:0965:0002:1:0 -ARY Digital -p:BSkyB -13f0:011c0000:07eb:0002:1:0 -Sky2 -p:BSkyB -13f2:011c0000:07eb:0002:1:0 -1837 -p:BSkyB -cbf2:011c0000:08ff:0002:1:0 -52210 -p:BSkyB -13f3:011c0000:07ea:0002:1:0 -Sky3+1 -p:BSkyB -03f6:011c0000:0909:0002:1:0 -53230 -p:BSkyB -27f6:011c0000:0806:0002:1:0 -UTV -p:BSkyB -03f7:011c0000:0805:0002:1:0 -ITV1 Border -p:BSkyB -1af7:011c0000:0802:0002:1:0 -BBC 1 East (W) -p:BSkyB -1af8:011c0000:0802:0002:1:0 -BBC 1 CI -p:BSkyB -23f8:011c0000:07fa:0002:1:0 -e4 -p:BSkyB -c4f9:011c0000:0965:0002:1:0 -V Channel -p:BSkyB -d2f9:011c0000:0969:0002:1:0 -Diva TV +1 -p:BSkyB -11fa:011c0000:07ee:0002:1:0 -Sky Showcase -p:BSkyB -23fb:011c0000:07f9:0002:1:0 -Channel 4 -p:BSkyB -d2fb:011c0000:0969:0002:1:0 -Syfy +1 -p:BSkyB -11fc:011c0000:07ee:0002:1:0 -Sky Arts 1 -p:BSkyB -12fc:011c0000:07e9:0002:1:0 -ShortsTV -p:BSkyB -1cfc:011c0000:07de:0002:1:0 -Sony TV Asia -p:BSkyB -23fc:011c0000:07f9:0002:1:0 -Channel 4 -p:BSkyB -d0fc:011c0000:090c:0002:1:0 -movies 24 -p:BSkyB -23fd:011c0000:07f9:0002:1:0 -Channel 4 -p:BSkyB -23fe:011c0000:07f9:0002:1:0 -Channel 4 -p:BSkyB -11ff:011c0000:07ee:0002:1:0 -Nat Geo -p:BSkyB -23ff:011c0000:07f9:0002:1:0 -Channel 4 -p:BSkyB -d2ff:011c0000:096c:0002:1:0 -Syfy -p:BSkyB -1901:011c0000:07ff:0002:2:0 -BBC R5L -p:BSkyB -d137:011c0000:090c:0002:2:0 -Raaj Radio -p:BSkyB -1038:011c0000:07d4:0002:2:0 -EPG Background Audio. -p:BSkyB -d139:011c0000:090c:0002:2:0 -Starpoint Radio -p:BSkyB -cb3b:011c0000:0907:0002:2:0 -Sunrise -p:BSkyB -cb3c:011c0000:0907:0002:2:0 -BFBS Radio -p:BSkyB -d13c:011c0000:090c:0002:2:0 -Pulse Rated -p:BSkyB -cb3d:011c0000:0907:0002:2:0 -LBC 97.3 -p:BSkyB -193e:011c0000:07ff:0002:2:0 -ETV3 -p:BSkyB -cb3e:011c0000:0907:0002:2:0 -Heart -p:BSkyB -cb3f:011c0000:0907:0002:2:0 -Galaxy -p:BSkyB -d13f:011c0000:090c:0002:2:0 -The Word -p:BSkyB -1940:011c0000:07ff:0002:2:0 -BBC R5SX -p:BSkyB -d141:011c0000:090c:0002:2:0 -MOS Radio -p:BSkyB -254a:011c0000:0a34:0002:2:0 -Recordbrazil -p:BSkyB -254b:011c0000:0a34:0002:2:0 -Amar Radio -p:BSkyB -cc4b:011c0000:08ff:0002:2:0 -Premier -p:BSkyB -254c:011c0000:0a34:0002:2:0 -Sukh Sagar -p:BSkyB -254d:011c0000:0a34:0002:2:0 -Choice FM -p:BSkyB -254f:011c0000:0a34:0002:2:0 -UCB UK -p:BSkyB -2550:011c0000:0a34:0002:2:0 -UCB Insp -p:BSkyB -2551:011c0000:0a34:0002:2:0 -UCB Bible -p:BSkyB -2552:011c0000:0a34:0002:2:0 -UCB Gospel -p:BSkyB -2555:011c0000:0a34:0002:2:0 -Solar Radio -p:BSkyB -2557:011c0000:0a34:0002:2:0 -XFM -p:BSkyB -2558:011c0000:0a34:0002:2:0 -Capital -p:BSkyB -d758:011c0000:0a34:0002:2:0 -UCB Ireland -p:BSkyB -2559:011c0000:0a34:0002:2:0 -Gold -p:BSkyB -255b:011c0000:0a34:0002:2:0 -Khushkhabri -p:BSkyB -d75c:011c0000:0a34:0002:2:0 -punjabi radio -p:BSkyB -255e:011c0000:0a34:0002:2:0 -Kismat -p:BSkyB -1a5f:011c0000:07dd:0002:2:0 -BBC R1 -p:BSkyB -1a60:011c0000:07dd:0002:2:0 -BBC R2 -p:BSkyB -2560:011c0000:0a34:0002:2:0 -Chill -p:BSkyB -1a61:011c0000:07dd:0002:2:0 -BBC R3 -p:BSkyB -1a62:011c0000:07dd:0002:2:0 -BBC R4 FM -p:BSkyB -2562:011c0000:0a34:0002:2:0 -Classic FM -p:BSkyB -1a63:011c0000:07dd:0002:2:0 -BBC R4 LW -p:BSkyB -1a65:011c0000:07dd:0002:2:0 -BBC R Scot. -p:BSkyB -1a66:011c0000:07dd:0002:2:0 -BBC R Wales -p:BSkyB -1a67:011c0000:07dd:0002:2:0 -BBC R Ulster -p:BSkyB -2567:011c0000:0a34:0002:2:0 -Planet Rock -p:BSkyB -1a68:011c0000:07dd:0002:2:0 -BBC Asian -p:BSkyB -1a69:011c0000:07dd:0002:2:0 -BBC WS -p:BSkyB -1a6b:011c0000:07dd:0002:2:0 -BBC R Cymru -p:BSkyB -1a6e:011c0000:07dd:0002:2:0 -BBC R1X -p:BSkyB -1a6f:011c0000:07dd:0002:2:0 -BBC 6 Music -p:BSkyB -1a70:011c0000:07dd:0002:2:0 -BBC Radio 7 -p:BSkyB -1a71:011c0000:07dd:0002:2:0 -BBC R n Gael -p:BSkyB -1a72:011c0000:07dd:0002:2:0 -BBC London -p:BSkyB -cf80:011c0000:0908:0002:2:0 -Absolute CR -p:BSkyB -cf81:011c0000:0908:0002:2:0 -Absolute -p:BSkyB -cf82:011c0000:0908:0002:2:0 -Absolute80s -p:BSkyB -cf83:011c0000:0908:0002:2:0 -Amrit Bani -p:BSkyB -1284:011c0000:07ea:0002:2:0 -SNR -p:BSkyB -cf84:011c0000:0908:0002:2:0 -InsightRadio -p:BSkyB -cf85:011c0000:0908:0002:2:0 -CC Radio -p:BSkyB -cf86:011c0000:0908:0002:2:0 -Desi Radio -p:BSkyB -cf87:011c0000:0908:0002:2:0 -Abs Rad 90s -p:BSkyB -cf88:011c0000:0908:0002:2:0 -RdioCaroline -p:BSkyB -cf89:011c0000:0908:0002:2:0 -Rainbow -p:BSkyB -258b:011c0000:07fb:0002:2:0 -RTE Radio 1 -p:BSkyB -cf8b:011c0000:0908:0002:2:0 -Liberty -p:BSkyB -258c:011c0000:07fb:0002:2:0 -RTE 2FM -p:BSkyB -cf8c:011c0000:0908:0002:2:0 -Spectrum 1 -p:BSkyB -258d:011c0000:07fb:0002:2:0 -RTE R na G -p:BSkyB -cf8d:011c0000:0908:0002:2:0 -TWR -p:BSkyB -258e:011c0000:07fb:0002:2:0 -RTE Lyric fm -p:BSkyB -cf8e:011c0000:0908:0002:2:0 -FWR -p:BSkyB -138f:011c0000:07dc:0002:2:0 -Chl Line-up -p:BSkyB -cf8f:011c0000:0908:0002:2:0 -WRN Europe -p:BSkyB -cf90:011c0000:0908:0002:2:0 -Yorkshire R -p:BSkyB -cf91:011c0000:0908:0002:2:0 -Gaydarradio -p:BSkyB -cf92:011c0000:0908:0002:2:0 -RTE R1 Extra -p:BSkyB -cf93:011c0000:0908:0002:2:0 -Family Radio -p:BSkyB -cf94:011c0000:0908:0002:2:0 -NME -p:BSkyB -cf95:011c0000:0908:0002:2:0 -VOT Radio -p:BSkyB -cf96:011c0000:0908:0002:2:0 -Jazz FM -p:BSkyB -c6a3:011c0000:0969:0002:2:0 -InTune -p:BSkyB -cba4:011c0000:08fd:0002:2:0 -Panjab Radio -p:BSkyB -c6a8:011c0000:0969:0002:2:0 -Kiss -p:BSkyB -c7aa:011c0000:096c:0002:2:0 -Newstalk -p:BSkyB -c6ac:011c0000:0969:0002:2:0 -Magic -p:BSkyB -d6e0:011c0000:0a33:0002:2:0 -EWTN -p:BSkyB -1be5:011c0000:07e2:0002:2:0 -5606 -p:BSkyB -d6e6:011c0000:0a33:0002:2:0 -Real Radio -p:BSkyB -d6e7:011c0000:0a33:0002:2:0 -Smooth -p:BSkyB -27fe:011c0000:0806:0002:2:0 -talkSPORT -p:BSkyB -1019:011c0000:0807:0002:4:0 -Sky Box Office -p:BSkyB -1019:011c0000:0961:0002:4:0 -Sky Box Office -p:BSkyB -1019:011c0000:0966:0002:4:0 -Sky Box Office -p:BSkyB -1019:011c0000:07db:0002:4:0 -Sky Box Office -p:BSkyB -1019:011c0000:07dc:0002:4:0 -Sky Box Office -p:BSkyB -101a:011c0000:0807:0002:4:0 -Sky Box Office -p:BSkyB -101a:011c0000:0961:0002:4:0 -Sky Box Office -p:BSkyB -101a:011c0000:07dc:0002:4:0 -Sky Box Office -p:BSkyB -101b:011c0000:0807:0002:4:0 -Sky Box Office -p:BSkyB -101b:011c0000:0961:0002:4:0 -Sky Box Office -p:BSkyB -101b:011c0000:0966:0002:4:0 -Sky Box Office -p:BSkyB -101c:011c0000:0807:0002:4:0 -Sky Box Office -p:BSkyB -101c:011c0000:0966:0002:4:0 -Sky Box Office -p:BSkyB -101e:011c0000:0963:0002:4:0 -Hustler TV UK -p:BSkyB -1020:011c0000:0963:0002:4:0 -XXXFirst Timers -p:BSkyB -1021:011c0000:0807:0002:4:0 -Sky Box Office -p:BSkyB -1021:011c0000:0966:0002:4:0 -Sky Box Office -p:BSkyB -1022:011c0000:0963:0002:4:0 -Sky Box Office -p:BSkyB -1023:011c0000:0963:0002:4:0 -Playboy Lovers -p:BSkyB -1024:011c0000:07ef:0002:4:0 -XXX Mums -p:BSkyB -1025:011c0000:0963:0002:4:0 -100% Babes -p:BSkyB -1026:011c0000:0963:0002:4:0 -Girls Gone Wild -p:BSkyB -1027:011c0000:0963:0002:4:0 -Amateur Babes -p:BSkyB -1028:011c0000:0a2b:0002:4:0 -UK Swingers -p:BSkyB -1029:011c0000:0a35:0002:4:0 -Viewers' Wives -p:BSkyB -102b:011c0000:0a35:0002:4:0 -Xplicit Nightly -p:BSkyB -102d:011c0000:07f2:0002:4:0 -Sky Box Office -p:BSkyB -102e:011c0000:0963:0002:4:0 -XXX Gay -p:BSkyB -102f:011c0000:0a2b:0002:4:0 -Blue Tube -p:BSkyB -1034:011c0000:0968:0002:4:0 -Anytime -p:BSkyB -1034:011c0000:07e0:0002:4:0 -Anytime -p:BSkyB -1034:011c0000:07f3:0002:4:0 -Anytime -p:BSkyB -1034:011c0000:07f7:0002:4:0 -Anytime -p:BSkyB -0f01:011c0000:07f0:0002:25:0 -ESPN HD -p:BSkyB -0f02:011c0000:07f0:0002:25:0 -ESPN HD -p:BSkyB -0f09:011c0000:07ed:0002:25:0 -Sky Sp NewsHD -p:BSkyB -0f0a:011c0000:07f7:0002:25:0 -Sky News HD -p:BSkyB -0f0b:011c0000:0808:0002:25:0 -ITV1 HD -p:BSkyB -0f0c:011c0000:0808:0002:25:0 -ITV1 HD -p:BSkyB -0f0f:011c0000:0808:0002:25:0 -3855 -p:BSkyB -0f10:011c0000:07e4:0002:25:0 -Comedy Cen HD -p:BSkyB -2710:011c0000:0801:0002:25:0 -ITV1 HD -p:BSkyB -0f11:011c0000:07ed:0002:25:0 -ESPN AmrcaHD -p:BSkyB -0f12:011c0000:07ed:0002:25:0 -Five HD -p:BSkyB -0f13:011c0000:07ed:0002:25:0 -Sky Sp NewsHD -p:BSkyB -0f15:011c0000:07f1:0002:25:0 -Sky1 HD -p:BSkyB -0516:011c0000:07f7:0002:25:0 -Sky 3D -p:BSkyB -0f16:011c0000:07e0:0002:25:0 -Sky Thriller HD -p:BSkyB -0f17:011c0000:07f7:0002:25:0 -Sky Arts 1 HD -p:BSkyB -0f18:011c0000:07d8:0002:25:0 -Sky Arts 2 HD -p:BSkyB -0f1a:011c0000:07d5:0002:25:0 -LIVING HD -p:BSkyB -0f1b:011c0000:07f1:0002:25:0 -Good Food HD -p:BSkyB -0f1c:011c0000:07e4:0002:25:0 -Eden HD -p:BSkyB -0f1d:011c0000:07e4:0002:25:0 -3869 -p:BSkyB -0f1e:011c0000:07d3:0002:25:0 -3870 -p:BSkyB -0f21:011c0000:07f0:0002:25:0 -Disney Cine HD -p:BSkyB -0f22:011c0000:07f0:0002:25:0 -Syfy HD -p:BSkyB -0f23:011c0000:07d5:0002:25:0 -Channel 4 HD -p:BSkyB -0f24:011c0000:07d8:0002:25:0 -E4 HD -p:BSkyB -0f25:011c0000:07d5:0002:25:0 -Sky Sports HD1 -p:BSkyB -0f26:011c0000:07d1:0002:25:0 -Sky Sports HD2 -p:BSkyB -0f28:011c0000:07f3:0002:25:0 -Hallmark HD -p:BSkyB -0f29:011c0000:07d1:0002:25:0 -Sky Sports HD2 -p:BSkyB -0f2d:011c0000:07ec:0002:25:0 -NatGeoWild HD -p:BSkyB -0f2e:011c0000:07ec:0002:25:0 -History HD -p:BSkyB -0f2f:011c0000:07ec:0002:25:0 -Bio HD -p:BSkyB -0f30:011c0000:07ec:0002:25:0 -Crime HD -p:BSkyB -1d38:011c0000:07de:0002:25:0 -ITV1 HD -p:BSkyB -d83b:011c0000:0a36:0002:25:0 -Rush HD -p:BSkyB -233c:011c0000:07d3:0002:25:0 -9020 -p:BSkyB -0f5c:011c0000:07d3:0002:25:0 -3932 -p:BSkyB -d3be:011c0000:0a2b:0002:25:0 -Luxe TV HD -p:BSkyB -0ed9:011c0000:07f2:0002:25:0 -HD Retail Info -p:BSkyB -0eda:011c0000:07d5:0002:25:0 -Sky Sports HD1 -p:BSkyB -0edb:011c0000:07f0:0002:25:0 -Discovery HD -p:BSkyB -0edc:011c0000:07d8:0002:25:0 -Eurosport HD -p:BSkyB -0ede:011c0000:07d1:0002:25:0 -MTVN HD -p:BSkyB -0edf:011c0000:07e0:0002:25:0 -MGM HD -p:BSkyB -0ee4:011c0000:07f3:0002:25:0 -Sky Classics HD -p:BSkyB -0ee6:011c0000:07ec:0002:25:0 -Sky Action HD -p:BSkyB -0ee7:011c0000:07e8:0002:25:0 -Sky MdnGrtsHD -p:BSkyB -0ee8:011c0000:07e8:0002:25:0 -Sky DraRomHD -p:BSkyB -0ee9:011c0000:07e8:0002:25:0 -Sky ScFi/HorHD -p:BSkyB -0eea:011c0000:07e0:0002:25:0 -Sky Family HD -p:BSkyB -0eeb:011c0000:07e8:0002:25:0 -Sky Comedy HD -p:BSkyB -0eec:011c0000:07f3:0002:25:0 -Sky Indie HD -p:BSkyB -0eed:011c0000:07e0:0002:25:0 -SkyPremiereHD -p:BSkyB -0eee:011c0000:07f2:0002:25:0 -Sky Sports HD3 -p:BSkyB -0eef:011c0000:07d8:0002:25:0 -FX HD -p:BSkyB -0ef0:011c0000:07f2:0002:25:0 -Sky Sports HD3 -p:BSkyB -0ef2:011c0000:07f1:0002:25:0 -Sky Sports HD4 -p:BSkyB -0ef3:011c0000:07f1:0002:25:0 -Sky Sports HD4 -p:BSkyB -0ef8:011c0000:07e4:0002:25:0 -Nat Geo HD -p:BSkyB -0ef9:011c0000:07d1:0002:25:0 -SkyShowcseHD -p:BSkyB -2000:011c0000:07fb:0002:130:0 -Games Slot 1 -p:BSkyB -2003:011c0000:07eb:0002:130:0 -Movie Quiz -p:BSkyB -2005:011c0000:07fb:0002:130:0 -Games Slot 21 -p:BSkyB -2007:011c0000:07fb:0002:130:0 -Portal Video 2 -p:BSkyB -2008:011c0000:07fb:0002:130:0 -Sky Hub Video -p:BSkyB -c508:011c0000:0965:0002:130:0 -cso -p:BSkyB -200f:011c0000:0963:0002:130:0 -Games Slot 16 -p:BSkyB -2715:011c0000:0801:0002:130:0 -ITVi Stream 2 -p:BSkyB -201a:011c0000:07ea:0002:130:0 -Sky Hub Sky News Active -p:BSkyB -1523:011c0000:0804:0002:130:0 -1381 -p:BSkyB -1524:011c0000:0804:0002:130:0 -1382 -p:BSkyB -1525:011c0000:0804:0002:130:0 -1383 -p:BSkyB -1526:011c0000:0804:0002:130:0 -1384 -p:BSkyB -1527:011c0000:0804:0002:130:0 -1385 -p:BSkyB -1528:011c0000:0804:0002:130:0 -1386 -p:BSkyB -152d:011c2f26:07e3:0002:130:0 -1391 -p:BSkyB -d32d:011c0000:0a29:0002:130:0 -PlayJam 2 -p:BSkyB -152e:011c2f26:07e3:0002:130:0 -1392 -p:BSkyB -152f:011c2f26:07e3:0002:130:0 -1393 -p:BSkyB -1530:011c2f26:07e3:0002:130:0 -1394 -p:BSkyB -1531:011c2f26:07e3:0002:130:0 -1395 -p:BSkyB -c531:011c0000:0965:0002:130:0 -Mirada -p:BSkyB -1532:011c2f26:07e3:0002:130:0 -1396 -p:BSkyB -1533:011c2f26:07e3:0002:130:0 -1397 -p:BSkyB -1534:011c2f26:07e3:0002:130:0 -1398 -p:BSkyB -1535:011c2f26:07e3:0002:130:0 -1399 -p:BSkyB -1c40:011c0000:07e1:0002:130:0 -QVC -p:BSkyB -1c41:011c0000:07e1:0002:130:0 -QVC IMM Test -p:BSkyB -1f41:011c0000:0966:0002:130:0 -Sky Text Holidays -p:BSkyB -1f42:011c0000:07dc:0002:130:0 -Personal Organiser -p:BSkyB -1c43:011c0000:07e1:0002:130:0 -QVC Mosaic Test -p:BSkyB -1f43:011c0000:0803:0002:130:0 -Vegas Roulette II -p:BSkyB -1c44:011c0000:07e1:0002:130:0 -QVC MOSAIC -p:BSkyB -1f44:011c0000:07fb:0002:130:0 -Games Slot 13 -p:BSkyB -1f45:011c0000:07fb:0002:130:0 -Cartoon Network Game 4 -p:BSkyB -1f46:011c0000:0966:0002:130:0 -Sky Preview Active -p:BSkyB -1f47:011c0000:07ea:0002:130:0 -Sky Bet Reg -p:BSkyB -1f4b:011c0000:07e5:0002:130:0 -Installation Survey -p:BSkyB -1f4c:011c0000:0961:0002:130:0 -TV Picks 2009 -p:BSkyB -1f4e:011c0000:07ee:0002:130:0 -Sky Upgrade Dal -p:BSkyB -d44e:011c0000:0a2c:0002:130:0 -54350 -p:BSkyB -1f4f:011c0000:0803:0002:130:0 -FAQ Development -p:BSkyB -1f50:011c0000:07ee:0002:130:0 -Movie Finder -p:BSkyB -1f53:011c0000:07eb:0002:130:0 -Ad Showcase -p:BSkyB -1f54:011c0000:07eb:0002:130:0 -Remote Control Look Up App -p:BSkyB -1f55:011c0000:07ef:0002:130:0 -iSales Viewing Upgrade -p:BSkyB -1f57:011c0000:07ee:0002:130:0 -Vegas Wanted DOA -p:BSkyB -1f5a:011c0000:0803:0002:130:0 -Vegas Golden Doubloons -p:BSkyB -1f5b:011c0000:07ea:0002:130:0 -Sky Bingo Test -p:BSkyB -c15c:011c0000:0963:0002:130:0 -49500 -p:BSkyB -1f5e:011c0000:0803:0002:130:0 -Vegas Cleopatra -p:BSkyB -1f5f:011c0000:07fb:0002:130:0 -Games Slot 3 -p:BSkyB -275f:011c0000:07fc:0002:130:0 -ITVi Stream 44 -p:BSkyB -1f60:011c0000:07ea:0002:130:0 -Sky Bingo -p:BSkyB -1263:011c0000:07ea:0002:130:0 -Sky News -p:BSkyB -1f63:011c0000:0963:0002:130:0 -Vegas Elvis -p:BSkyB -1f64:011c0000:07d4:0002:130:0 -Sky Active WML Browser -p:BSkyB -1f67:011c0000:07d7:0002:130:0 -Sprint -p:BSkyB -1f69:011c0000:07ea:0002:130:0 -iSales Hardware -p:BSkyB -2469:011c0000:07dc:0002:130:0 -Sky Intro Active -p:BSkyB -1f6a:011c0000:0803:0002:130:0 -Vegas Blackjack -p:BSkyB -1f6c:011c0000:0966:0002:130:0 -eSales Test -p:BSkyB -1f6d:011c0000:07e7:0002:130:0 -Sky Bet Active -p:BSkyB -1f70:011c0000:07e5:0002:130:0 -Vegas Rainbow Riches -p:BSkyB -1f71:011c0000:07e7:0002:130:0 -Vegas Video Poker -p:BSkyB -2471:011c0000:0963:0002:130:0 -1787 -p:BSkyB -1f72:011c0000:07e9:0002:130:0 -Vegas Bar x5 -p:BSkyB -1f73:011c0000:07fb:0002:130:0 -Cartoon Network Game 1 -p:BSkyB -2f76:011c0000:07f4:0002:130:0 -ITVi Quad -p:BSkyB -1479:011c0000:07ee:0002:130:0 -Directgov -p:BSkyB -1f7a:011c0000:07e5:0002:130:0 -Sports Swiching Browser -p:BSkyB -1f7c:011c0000:0966:0002:130:0 -High Score -p:BSkyB -1f7d:011c0000:07e9:0002:130:0 -SkyBet,Casino,Bingo&Poker -p:BSkyB -1f7e:011c0000:07fb:0002:130:0 -Games Slot 5 -p:BSkyB -1f7f:011c0000:07fb:0002:130:0 -Games Slot 7 -p:BSkyB -1f81:011c0000:07dc:0002:130:0 -Sky Customer Service -p:BSkyB -1b82:011c0000:07da:0002:130:0 -7042 -p:BSkyB -1f82:011c0000:07e7:0002:130:0 -Super 6's -p:BSkyB -1083:011c0000:07e5:0002:130:0 -SBL -p:BSkyB -1f85:011c0000:07ee:0002:130:0 -Vegas Hit It Poker -p:BSkyB -1f88:011c0000:0968:0002:130:0 -Wap Casino One -p:BSkyB -1f8a:011c0000:07fb:0002:130:0 -Games Slot 6 -p:BSkyB -cf8a:011c0000:0908:0002:130:0 -Free & Prize PlayJam Games -p:BSkyB -1f8b:011c0000:07eb:0002:130:0 -SOM Test Bert/Ernie -p:BSkyB -1f90:011c0000:07e9:0002:130:0 -Vegas Cluedo -p:BSkyB -1f95:011c0000:07d4:0002:130:0 -Sky Active -p:BSkyB -c695:011c0000:0969:0002:130:0 -Wired Ocean -p:BSkyB -1f98:011c0000:0961:0002:130:0 -Portal Video 6 -p:BSkyB -1fa0:011c0000:07eb:0002:130:0 -Vegas Monopoly -p:BSkyB -1fa1:011c0000:0803:0002:130:0 -Vegas Diamond Compass -p:BSkyB -1fa2:011c0000:07e9:0002:130:0 -Vegas House of Horror -p:BSkyB -2fa6:011c0000:07f4:0002:130:0 -12198 -p:BSkyB -14a7:011c0000:0966:0002:130:0 -DVD Extras -p:BSkyB -1fa7:011c0000:07e9:0002:130:0 -Vegas DOND -p:BSkyB -14a8:011c0000:0966:0002:130:0 -Movies Active -p:BSkyB -1fab:011c0000:07fb:0002:130:0 -Sky Games -p:BSkyB -1fac:011c0000:07e7:0002:130:0 -Sky Bet At The Races -p:BSkyB -1fad:011c0000:07fb:0002:130:0 -Games Slot 9 -p:BSkyB -1fb3:011c0000:07fb:0002:130:0 -Game Slot 20 -p:BSkyB -1fb6:011c0000:07fb:0002:130:0 -Game Slot 18 -p:BSkyB -1fbc:011c0000:07fb:0002:130:0 -Games Slot 12 -p:BSkyB -1fbf:011c0000:07e5:0002:130:0 -I-Service App -p:BSkyB -1fc0:011c0000:07fb:0002:130:0 -Game Slot 22 -p:BSkyB -1fc5:011c0000:0963:0002:130:0 -Rewards from Sky -p:BSkyB -1fc6:011c0000:07ef:0002:130:0 -iSales Sky Products -p:BSkyB -1fc8:011c0000:07fb:0002:130:0 -Cartoon Network Game 2 -p:BSkyB -1fc9:011c0000:0803:0002:130:0 -Vegas Caribbean Stud -p:BSkyB -1fca:011c0000:07fb:0002:130:0 -Cartoon Network Game 3 -p:BSkyB -1fcb:011c0000:07fb:0002:130:0 -Games Slot 25 -p:BSkyB -1fcc:011c0000:07fb:0002:130:0 -Game Slot 26 -p:BSkyB -1fcd:011c0000:07fb:0002:130:0 -Games Slot 19 -p:BSkyB -1fce:011c0000:07fb:0002:130:0 -Games Slot 4 (catflap) -p:BSkyB -20cf:011c0000:07e9:0002:130:0 -Vegas Monty Python -p:BSkyB -1fd0:011c0000:07eb:0002:130:0 -launchpad -p:BSkyB -1fd1:011c0000:07ea:0002:130:0 -Sky Bingo WML -p:BSkyB -1fd2:011c0000:07fb:0002:130:0 -Game Slot 17 -p:BSkyB -1fd3:011c0000:07d7:0002:130:0 -Carbon Calculator -p:BSkyB -1fd7:011c0000:07fb:0002:130:0 -Games Slot 2 -p:BSkyB -1ae0:011c0000:07f6:0002:130:0 -STREAM-0 -p:BSkyB -1ae1:011c0000:07f6:0002:130:0 -STREAM-1 -p:BSkyB -1ae2:011c0000:07f6:0002:130:0 -STREAM-2 -p:BSkyB -1fe2:011c0000:07ee:0002:130:0 -Vegas Cashino -p:BSkyB -1ae3:011c0000:07f6:0002:130:0 -STREAM-3 -p:BSkyB -1ae4:011c0000:07f6:0002:130:0 -STREAM-4 -p:BSkyB -1ae5:011c0000:07f6:0002:130:0 -STREAM-5 -p:BSkyB -1ae6:011c0000:07f6:0002:130:0 -STREAM-6 -p:BSkyB -1fe6:011c0000:07fb:0002:130:0 -Games Slot 10 -p:BSkyB -1fe9:011c0000:07fb:0002:130:0 -Games Slot 11 -p:BSkyB -1fea:011c0000:07fb:0002:130:0 -Games Slot 14 -p:BSkyB -1fef:011c0000:0803:0002:130:0 -Vegas 3 Card poker -p:BSkyB -13f1:011c0000:07eb:0002:130:0 -1840 -p:BSkyB -1ff7:011c0000:07d4:0002:130:0 -Portal Video 5 -p:BSkyB -1ff8:011c0000:07d7:0002:130:0 -Pin Reminder Service -p:BSkyB -1ffb:011c0000:0963:0002:130:0 -Dummy Eire Service -p:BSkyB -1319:011c0000:0961:0002:131:0 -IEPG data 8 -p:BSkyB -105d:011c0000:07d4:0002:131:0 -IEPG data 1 -p:BSkyB -131a:011c0000:0961:0002:132:0 -DCS8 -p:BSkyB -1252:011c0000:07dc:0002:132:0 -DCS6 -p:BSkyB -105e:011c0000:07d4:0002:132:0 -DCS1 -p:BSkyB -1572:011c2f26:07e3:0002:132:0 -DCS14 -p:BSkyB -10c2:011c0000:07e5:0002:132:0 -DCS2 -p:BSkyB -11ee:011c0000:07db:0002:132:0 -DCS5 -p:BSkyB -155f:011c2f26:07e3:0002:133:0 -1471 -p:BSkyB -1560:011c2f26:07e3:0002:133:0 -1472 -p:BSkyB -1561:011c2f26:07e3:0002:133:0 -1473 -p:BSkyB -1562:011c2f26:07e3:0002:133:0 -1474 -p:BSkyB -1563:011c2f26:07e3:0002:133:0 -1475 -p:BSkyB -1564:011c2f26:07e3:0002:133:0 -1476 -p:BSkyB -1565:011c2f26:07e3:0002:133:0 -1477 -p:BSkyB -1566:011c2f26:07e3:0002:133:0 -1478 -p:BSkyB -1567:011c2f26:07e3:0002:133:0 -1479 -p:BSkyB -1569:011c0000:0804:0002:133:0 -1481 -p:BSkyB -156a:011c0000:0804:0002:133:0 -1482 -p:BSkyB -156b:011c0000:0804:0002:133:0 -1483 -p:BSkyB -156c:011c0000:0804:0002:133:0 -1484 -p:BSkyB -156d:011c0000:0804:0002:133:0 -1485 -p:BSkyB -13b0:011c0000:0966:0002:133:0 -MMS 1 -p:BSkyB -13b1:011c0000:0966:0002:133:0 -MMS 2 -p:BSkyB -13b2:011c0000:0807:0002:133:0 -MMS 3 -p:BSkyB -13b3:011c0000:0807:0002:133:0 -MMS 4 -p:BSkyB -13b4:011c0000:0961:0002:133:0 -MMS 5 -p:BSkyB -13b5:011c0000:0961:0002:133:0 -MMS 6 -p:BSkyB -13b6:011c0000:0966:0002:133:0 -MMS 7 -p:BSkyB -13b7:011c0000:0807:0002:133:0 -MMS 8 -p:BSkyB -1b1c:011c0000:0802:0002:134:0 -BBC HD -p:BSkyB -1b21:011c0000:0802:0002:134:0 -6945 -p:BSkyB -0f27:011c0000:07f2:0002:135:0 -SBO HD1 -p:BSkyB -0ee3:011c0000:07f2:0002:135:0 -SBO HD2 -p:BSkyB -end -Have a lot of bugs! diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat130.info b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat130.info deleted file mode 100644 index f397d74..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat130.info +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - tmbinc@elitedvb.net - Hotbird (13.0E) - - - - - - - diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat192.info b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat192.info deleted file mode 100644 index d4cf2f4..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat192.info +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - tmbinc@elitedvb.net - Astra (19.2E) - - - - - - - diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat282.info b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat282.info deleted file mode 100644 index 7103ed4..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat282.info +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - tmbinc@elitedvb.net - Astra/Eurobird (28.2E) - - - - - - - diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins.bb b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins.bb deleted file mode 100755 index c73fee3..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins.bb +++ /dev/null @@ -1,120 +0,0 @@ -DESCRIPTION = "Additional plugins for Enigma2" -MAINTAINER = "Felix Domke " -LICENSE = "Proprietary" -LIC_FILES_CHKSUM = "file://COPYING;md5=8e37f34d0e40d32ea2bc90ee812c9131" - -PACKAGES_DYNAMIC = "enigma2-plugin-*" - -# if you want experimental, use: -#SRCREV="87fd2f1120962f553ecb1a88bbee46ed821df975" -SRCREV="c8fc96e8e51e1ef71e1709f9dd6f733007f9463e" -SRCDATE="20110215" -BRANCH="master" -PV = "experimental-git${SRCDATE}" -PR = "r5" - -FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}/vuplus:" - -SRC_URI="git://code.vuplus.com/git/dvbapp-plugin.git;protocol=git;branch=${BRANCH};tag=${SRCREV}" - -EXTRA_OECONF = " \ - BUILD_SYS=${BUILD_SYS} \ - HOST_SYS=${HOST_SYS} \ - STAGING_INCDIR=${STAGING_INCDIR} \ - STAGING_LIBDIR=${STAGING_LIBDIR} \ -" - -SRC_URI_append_vuplus = " \ - file://enigma2_plugins_mytube_tpm.patch;patch=1;pnum=1 \ - file://enigma2_plugins_20110810.patch;patch=1;pnum=1 \ - file://enigma2_plugins_webinterface_tpm.patch;patch=1;pnum=1 \ - file://enigma2_plugins_ac3lipsync_dolby.patch;patch=1;pnum=1 \ - file://enigma2_plugins_autoresolution_fix.patch;patch=1;pnum=1 \ - file://enigma2_plugins_dependency.patch;patch=1;pnum=1 \ - file://dreamboxweb.png \ - file://dreamboxwebtv.png \ - file://favicon.ico" - -FILES_${PN} += " /usr/share/enigma2 /usr/share/fonts " -FILES_${PN}-meta = "${datadir}/meta" -PACKAGES += "${PN}-meta" -PACKAGE_ARCH = "${MACHINE_ARCH}" - -inherit autotools - -S = "${WORKDIR}/git" - -DEPENDS = "python-pyopenssl python-gdata streamripper python-mutagen python-daap" -DEPENDS += "enigma2" - -def modify_po(): - import os - try: - os.system("find ./ -name \"*.po\" > ./po_list") - os.system("find ./ -name \"*.pot\" >> ./po_list") - po_list = [] - po_list = open('po_list','r+').readlines() - for x in po_list: - changeword1(x) - changeword1('enigma2-plugins/networkwizard/src/networkwizard.xml ') - changeword2('enigma2-plugins/webinterface/src/web-data/tpl/default/index.html ') - os.system('rm po_list') - except: - print 'word patch error ' - return - -def changeword1(file): - fn = file[:-1] - fnn = file[:-1]+'_n' - cmd = "sed s/Dreambox/STB/g "+fn+" > "+fnn - os.system(cmd) - cmd1 = "mv "+fnn+" "+fn - os.system(cmd1) - -def changeword2(file): - fn = file[:-1] - fnn = file[:-1]+'_n' - cmd = "sed s/Dreambox/Vu+/g "+fn+" > "+fnn - os.system(cmd) - cmd1 = "mv "+fnn+" "+fn - os.system(cmd1) - -do_unpack_append(){ - modify_po() -} - - -do_install_append_vuplus() { - install -m 0644 ${WORKDIR}/dreamboxweb.png ${D}/usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/img/ - install -m 0644 ${WORKDIR}/dreamboxwebtv.png ${D}/usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/tpl/default/streaminterface/img - install -m 0644 ${WORKDIR}/favicon.ico ${D}/usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/img/ -} - -python populate_packages_prepend() { - enigma2_plugindir = bb.data.expand('${libdir}/enigma2/python/Plugins', d) - do_split_packages(d, enigma2_plugindir, '^(\w+/\w+)', 'enigma2-plugin-%s', '%s', recursive=True, match_path=True, prepend=True) - do_split_packages(d, enigma2_plugindir, '^(\w+/\w+).*/.*\.la$', 'enigma2-plugin-%s-dev', '%s (development)', recursive=True, match_path=True, prepend=True) - do_split_packages(d, enigma2_plugindir, '^(\w+/\w+).*/.*\.a$', 'enigma2-plugin-%s-staticdev', '%s (static development)', recursive=True, match_path=True, prepend=True) - do_split_packages(d, enigma2_plugindir, '^(\w+/\w+).*/\.debug/', 'enigma2-plugin-%s-dbg', '%s (debug)', recursive=True, match_path=True, prepend=True) - def parseControlFile(dir, d, package): - import os - #ac3lipsync is renamed since 20091121 to audiosync.. but rename in cvs is not possible without lost of revision history.. - #so the foldername is still ac3lipsync - if package == 'audiosync': - package = 'ac3lipsync' - src = open(dir + "/" + package.split('-')[-1] + "/CONTROL/control").read() - for line in src.splitlines(): - name, value = line.strip().split(': ', 1) - if name == 'Description': - d.setVar('DESCRIPTION_' + package, value) - elif name == 'Depends': - d.setVar('RDEPENDS_' + package, ' '.join(value.split(', '))) - elif name == 'Replaces': - d.setVar('RREPLACES_' + package, ' '.join(value.split(', '))) - elif name == 'Conflicts': - d.setVar('RCONFLICTS_' + package, ' '.join(value.split(', '))) - srcdir = d.getVar('S', True) - for package in d.getVar('PACKAGES', True).split(): - if package.startswith('enigma2-plugin-') and not package.endswith('-dev') and not package.endswith('-dbg') and not package.endswith('-staticdev'): - parseControlFile(srcdir, d, package) -} diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxweb.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxweb.png deleted file mode 100755 index 9a2c570cea0d4250243a5822b8aca2cec9fc23d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2619 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 - - -- -+ -+ - - - -diff --git a/mytube/po/de.po b/mytube/po/de.po -index b487673..c56c84e 100644 ---- a/mytube/po/de.po -+++ b/mytube/po/de.po -@@ -7,9 +7,9 @@ msgid "" - msgstr "" - "Project-Id-Version: tuxbox-enigma 0.0.1\n" - "Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2009-05-29 17:38+0200\n" --"PO-Revision-Date: 2008-05-16 17:15+0100\n" --"Last-Translator: Stefan Pluecken \n" -+"POT-Creation-Date: 2011-06-12 19:07+0100\n" -+"PO-Revision-Date: 2011-06-12 19:22+0100\n" -+"Last-Translator: JuSt611 \n" - "Language-Team: none\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" -@@ -18,448 +18,690 @@ msgstr "" - "X-Poedit-Language: German\n" - "X-Poedit-Country: GERMANY\n" - "X-Poedit-SourceCharset: iso-8859-15\n" -+"X-Poedit-Basepath: .\n" -+"X-Poedit-SearchPath-0: ../src\n" - --msgid " Results" --msgstr " Ergebnisse" -+#: ../src/MyTubeSearch.py:161 -+#: ../src/plugin.py:52 -+msgid "Relevance" -+msgstr "Relevanz" - --msgid "Added: " --msgstr "Hinzugefügt: " -+#: ../src/MyTubeSearch.py:162 -+#: ../src/plugin.py:53 -+msgid "View Count" -+msgstr "Aufrufe" - --msgid "All" --msgstr "Alle" -+#: ../src/MyTubeSearch.py:163 -+#: ../src/plugin.py:54 -+msgid "Published" -+msgstr "Veröffentlicht" -+ -+#: ../src/MyTubeSearch.py:164 -+#: ../src/plugin.py:55 -+msgid "Rating" -+msgstr "Bewertung" - -+#: ../src/MyTubeSearch.py:168 -+#: ../src/plugin.py:59 - msgid "All Time" --msgstr "" -+msgstr "Allzeit" - --msgid "An error occured." --msgstr "Es ist ein Fehler aufgetreten." -+#: ../src/MyTubeSearch.py:169 -+#: ../src/plugin.py:60 -+msgid "This Month" -+msgstr "Diesen Monat" - --msgid "Ascending" --msgstr "aufsteigend" -+#: ../src/MyTubeSearch.py:170 -+#: ../src/plugin.py:61 -+msgid "This Week" -+msgstr "Diese Woche" - --msgid "Ask user" --msgstr "Nutzer fragen" -+#: ../src/MyTubeSearch.py:171 -+#: ../src/plugin.py:62 -+msgid "Today" -+msgstr "Heute" - --msgid "Australia" --msgstr "Australien" -+#: ../src/MyTubeSearch.py:175 -+#: ../src/plugin.py:66 -+#: ../src/plugin.py:619 -+#: ../src/plugin.py:625 -+#: ../src/plugin.py:1743 -+msgid "Yes" -+msgstr "Ja" - --msgid "Author: " --msgstr "Author: " -+#: ../src/MyTubeSearch.py:176 -+#: ../src/plugin.py:67 -+#: ../src/plugin.py:620 -+#: ../src/plugin.py:626 -+msgid "No" -+msgstr "Nein" - -+#: ../src/MyTubeSearch.py:180 -+#: ../src/MyTubeSearch.py:200 -+#: ../src/plugin.py:71 -+#: ../src/plugin.py:91 -+msgid "All" -+msgstr "Alle" -+ -+#: ../src/MyTubeSearch.py:181 -+#: ../src/plugin.py:72 -+msgid "Film & Animation" -+msgstr "Film & Animation" -+ -+#: ../src/MyTubeSearch.py:182 -+#: ../src/plugin.py:73 - msgid "Autos & Vehicles" - msgstr "Autos und Fahrzeuge" - --msgid "Brazil" --msgstr "Brasilien" -+#: ../src/MyTubeSearch.py:183 -+#: ../src/plugin.py:74 -+msgid "Music" -+msgstr "Musik" - --msgid "Canada" --msgstr "Kanada" -+#: ../src/MyTubeSearch.py:184 -+#: ../src/plugin.py:75 -+msgid "Pets & Animals" -+msgstr "Tiere" - --msgid "Choose target folder" --msgstr "Wähle Zielverzeichnis" -+#: ../src/MyTubeSearch.py:185 -+#: ../src/plugin.py:76 -+msgid "Sports" -+msgstr "Sport" - --msgid "Clear history on Exit:" --msgstr "Verlauf beim Verlassen löschen:" -+#: ../src/MyTubeSearch.py:186 -+#: ../src/plugin.py:77 -+msgid "Travel & Events" -+msgstr "Reisen & Events" - --msgid "Close" --msgstr "Schließen" -+#: ../src/MyTubeSearch.py:187 -+#: ../src/plugin.py:78 -+msgid "Short Movies" -+msgstr "Kurzvideos" -+ -+#: ../src/MyTubeSearch.py:188 -+#: ../src/plugin.py:79 -+msgid "Gaming" -+msgstr "Spiele" - -+#: ../src/MyTubeSearch.py:189 -+#: ../src/plugin.py:80 - msgid "Comedy" - msgstr "Komödien" - --msgid "Czech Republic" --msgstr "Tschechien" -- --msgid "Descending" --msgstr "absteigend" -- --msgid "Display search results by:" --msgstr "Suchergebnisse anzeigen:" -- --msgid "Do you want to see more entries?" --msgstr "Weitere Videos?" -- --msgid "Download Video" --msgstr "Video runterladen" -- --msgid "Download location" --msgstr "Download Verzeichnis:" -+#: ../src/MyTubeSearch.py:190 -+#: ../src/plugin.py:81 -+msgid "People & Blogs" -+msgstr "Leute & Blogs" - --msgid "Downloading screenshots. Please wait..." --msgstr "Bilder werden geladen. Bitte warten..." -+#: ../src/MyTubeSearch.py:191 -+#: ../src/plugin.py:82 -+msgid "News & Politics" -+msgstr "Nachrichten & Politik" - --msgid "Duration: " --msgstr "Dauer: " -+#: ../src/MyTubeSearch.py:192 -+#: ../src/plugin.py:83 -+msgid "Entertainment" -+msgstr "Unterhaltung" - -+#: ../src/MyTubeSearch.py:193 -+#: ../src/plugin.py:84 - msgid "Education" - msgstr "Bildung" - --msgid "Enter your search term(s)" --msgstr "Suchbegriff eingeben" -+#: ../src/MyTubeSearch.py:194 -+#: ../src/plugin.py:85 -+msgid "Howto & Style" -+msgstr "Tipps & Tricks" - --msgid "Entertainment" --msgstr "Unterhaltung" -+#: ../src/MyTubeSearch.py:195 -+#: ../src/plugin.py:86 -+msgid "Nonprofits & Activism" -+msgstr "Non-Profit" - --msgid "Fetching feed entries" --msgstr "Lade feeds" -+#: ../src/MyTubeSearch.py:196 -+#: ../src/plugin.py:87 -+msgid "Science & Technology" -+msgstr "Wissenschaft & Technik" - --msgid "Fetching search entries" --msgstr "Lade Suchergebnisse" -+#: ../src/MyTubeSearch.py:201 -+#: ../src/MyTubeSearch.py:208 -+#: ../src/plugin.py:92 -+#: ../src/plugin.py:99 -+msgid "Australia" -+msgstr "Australien" - --msgid "Film & Animation" --msgstr "Film & Animation" -+#: ../src/MyTubeSearch.py:202 -+#: ../src/plugin.py:93 -+msgid "Brazil" -+msgstr "Brasilien" - -+#: ../src/MyTubeSearch.py:203 -+#: ../src/plugin.py:94 -+msgid "Canada" -+msgstr "Kanada" -+ -+#: ../src/MyTubeSearch.py:204 -+#: ../src/plugin.py:95 -+msgid "Czech Republic" -+msgstr "Tschechien" -+ -+#: ../src/MyTubeSearch.py:205 -+#: ../src/plugin.py:96 - msgid "France" - msgstr "Frankreich" - --msgid "Gaming" --msgstr "Spiele" -- -+#: ../src/MyTubeSearch.py:206 -+#: ../src/plugin.py:97 - msgid "Germany" - msgstr "Deutschland" - -+#: ../src/MyTubeSearch.py:207 -+#: ../src/plugin.py:98 - msgid "Great Britain" - msgstr "England" - --msgid "HD videos" --msgstr "HD Videos" -- --msgid "Help" --msgstr "Hilfe" -- --msgid "History" --msgstr "Verlauf" -- -+#: ../src/MyTubeSearch.py:209 -+#: ../src/plugin.py:100 - msgid "Holland" - msgstr "Holland" - -+#: ../src/MyTubeSearch.py:210 -+#: ../src/plugin.py:101 - msgid "Hong Kong" - msgstr "Hong Kong" - --msgid "Howto & Style" --msgstr "Tipps & Tricks" -- -+#: ../src/MyTubeSearch.py:211 -+#: ../src/plugin.py:102 - msgid "India" - msgstr "Indien" - -+#: ../src/MyTubeSearch.py:212 -+#: ../src/plugin.py:103 - msgid "Ireland" - msgstr "Irland" - -+#: ../src/MyTubeSearch.py:213 -+#: ../src/plugin.py:104 - msgid "Israel" - msgstr "Israel" - -+#: ../src/MyTubeSearch.py:214 -+#: ../src/plugin.py:105 - msgid "Italy" - msgstr "Italien" - -+#: ../src/MyTubeSearch.py:215 -+#: ../src/plugin.py:106 - msgid "Japan" - msgstr "Japan" - --msgid "Load feed on startup:" --msgstr "Feed beim Starten laden:" -- -+#: ../src/MyTubeSearch.py:216 -+#: ../src/plugin.py:107 - msgid "Mexico" - msgstr "Mexiko" - --msgid "More video entries." --msgstr "Weitere Video Einträge." -+#: ../src/MyTubeSearch.py:217 -+#: ../src/plugin.py:108 -+msgid "New Zealand" -+msgstr "Neuseeland" - --msgid "Most discussed" --msgstr "Heiß diskutiert" -+#: ../src/MyTubeSearch.py:218 -+#: ../src/plugin.py:109 -+msgid "Poland" -+msgstr "Polen" - --msgid "Most linked" --msgstr "Am meisten verlinkt" -+#: ../src/MyTubeSearch.py:219 -+#: ../src/plugin.py:110 -+msgid "Russia" -+msgstr "Russland" - --msgid "Most popular" --msgstr "Beliebteste Videos" -+#: ../src/MyTubeSearch.py:220 -+#: ../src/plugin.py:111 -+msgid "South Korea" -+msgstr "Süd Korea" - --msgid "Most recent" --msgstr "Neueste Videos" -+#: ../src/MyTubeSearch.py:221 -+#: ../src/plugin.py:112 -+msgid "Spain" -+msgstr "Spanien" - --msgid "Most responded" --msgstr "Meiste Antworten" -+#: ../src/MyTubeSearch.py:222 -+#: ../src/plugin.py:113 -+msgid "Sweden" -+msgstr "Schweden" - --msgid "Most viewed" --msgstr "Meistgesehen" -+#: ../src/MyTubeSearch.py:223 -+#: ../src/plugin.py:114 -+msgid "Taiwan" -+msgstr "Taiwan" - --msgid "Music" --msgstr "Musik" -+#: ../src/MyTubeSearch.py:224 -+#: ../src/plugin.py:115 -+msgid "United States" -+msgstr "USA" - --msgid "My TubePlayer" --msgstr "MyTube Player" -+#: ../src/MyTubeSearch.py:228 -+#: ../src/plugin.py:119 -+msgid "Ascending" -+msgstr "Aufsteigend" - --msgid "MyTube Settings" --msgstr "MyTube Einstellungen" -+#: ../src/MyTubeSearch.py:229 -+#: ../src/plugin.py:120 -+msgid "Descending" -+msgstr "Absteigend" - --msgid "MyTubePlayer" --msgstr "MyTube Player" -+#: ../src/MyTubeSearch.py:237 -+#: ../src/plugin.py:128 -+#: ../src/plugin.py:790 -+msgid "HD videos" -+msgstr "HD Videos" - --msgid "MyTubePlayer Help" --msgstr "MyTube Player Hilfe" -+#: ../src/MyTubeSearch.py:238 -+#: ../src/plugin.py:129 -+#: ../src/plugin.py:794 -+msgid "Most viewed" -+msgstr "Meistgesehen" - --msgid "MyTubePlayer active video downloads" --msgstr "aktive Video downloads" -+#: ../src/MyTubeSearch.py:239 -+#: ../src/plugin.py:130 -+#: ../src/plugin.py:792 -+msgid "Top rated" -+msgstr "Beste Bewertung" - --msgid "MyTubePlayer settings" --msgstr "MyTube Player Einstellungen" -+#: ../src/MyTubeSearch.py:240 -+#: ../src/plugin.py:131 -+#: ../src/plugin.py:799 -+msgid "Recently featured" -+msgstr "Kürzlich featured" - --msgid "MyTubeVideoInfoScreen" --msgstr "MyTubeVideoInfoScreen" -+#: ../src/MyTubeSearch.py:241 -+#: ../src/plugin.py:132 -+#: ../src/plugin.py:797 -+msgid "Most discussed" -+msgstr "Heiß diskutiert" - --msgid "MyTubeVideohelpScreen" --msgstr "MyTubeVideohelpScreen" -+#: ../src/MyTubeSearch.py:242 -+#: ../src/plugin.py:133 -+#: ../src/plugin.py:793 -+msgid "Top favorites" -+msgstr "Top-Favoriten" - --msgid "New Zealand" --msgstr "Neu Seeland" -+#: ../src/MyTubeSearch.py:243 -+#: ../src/plugin.py:134 -+#: ../src/plugin.py:798 -+msgid "Most linked" -+msgstr "Am meisten verlinkt" - --msgid "News & Politics" --msgstr "Nachrichten & Politik" -+#: ../src/MyTubeSearch.py:244 -+#: ../src/plugin.py:135 -+#: ../src/plugin.py:800 -+msgid "Most responded" -+msgstr "Meiste Antworten" - --msgid "No" --msgstr "Nein" -+#: ../src/MyTubeSearch.py:245 -+#: ../src/plugin.py:136 -+#: ../src/plugin.py:796 -+msgid "Most recent" -+msgstr "Neueste Videos" - --msgid "No playable video found! Stop playing this movie?" --msgstr "Kein abspielbares Video gefunden! Wiedergabe beenden?" -+#: ../src/MyTubeSearch.py:249 -+#: ../src/MyTubeSearch.py:252 -+#: ../src/plugin.py:139 -+#: ../src/plugin.py:142 -+msgid "Ask user" -+msgstr "Nutzer fragen" - --msgid "No videos to display" --msgstr "Keine Videos zum anzeigen" -+#: ../src/MyTubeSearch.py:249 -+#: ../src/MyTubeSearch.py:252 -+#: ../src/plugin.py:139 -+#: ../src/plugin.py:142 -+msgid "Return to movie list" -+msgstr "Zurück zur Videoliste" - --msgid "No, but play video again" --msgstr "Nein, aber Video noch mal abspielen" -+#: ../src/MyTubeSearch.py:249 -+#: ../src/plugin.py:139 -+msgid "Play next video" -+msgstr "nächstes Video" - --msgid "No, but switch to video entries." --msgstr "Nein, aber zu den Videos zurück." -+#: ../src/MyTubeSearch.py:249 -+#: ../src/plugin.py:139 -+msgid "Play video again" -+msgstr "Video noch mal abspielen" - --msgid "No, but switch to video search." --msgstr "Nein, aber zur Videosuche zurück" -+#: ../src/MyTubeSearch.py:314 -+msgid " Results" -+msgstr " Ergebnisse" - --msgid "Nonprofits & Activism" --msgstr "Non-Profit" -+#: ../src/MyTubeSearch.py:398 -+#: ../src/MyTubeSearch.py:562 -+#: ../src/plugin.py:281 -+#: ../src/plugin.py:1280 -+#: ../src/plugin.py:1466 -+msgid "Close" -+msgstr "Schließen" - --msgid "Not fetching feed entries" --msgstr "Lade keine feed Einträge" -+#: ../src/MyTubeSearch.py:399 -+msgid "Save" -+msgstr "Speichern" - --msgid "People & Blogs" --msgstr "Leute & Blogs" -+#: ../src/MyTubeSearch.py:412 -+#: ../src/MyTubeSearch.py:415 -+msgid "MyTubePlayer settings" -+msgstr "MyTube Player Einstellungen" - --msgid "Pets & Animals" --msgstr "Tiere" -+#: ../src/MyTubeSearch.py:419 -+msgid "Display search results by:" -+msgstr "Suchergebnisse anzeigen:" - --msgid "Play YouTube movies" --msgstr "YouTube Videos abspielen" -+#: ../src/MyTubeSearch.py:420 -+msgid "Search restricted content:" -+msgstr "Suche ohne Altersbeschränkung:" - --msgid "Play next video" --msgstr "nächstes Video" -+#: ../src/MyTubeSearch.py:421 -+msgid "Search category:" -+msgstr "Such-Kategorie:" - --msgid "Play video again" --msgstr "Video noch mal abspielen" -+#: ../src/MyTubeSearch.py:422 -+msgid "Search region:" -+msgstr "Such-Region:" - --msgid "Please enter your search term." --msgstr "Bitte geben Sie einen Suchbegriff ein." -+#: ../src/MyTubeSearch.py:423 -+msgid "Load feed on startup:" -+msgstr "Feed beim Starten laden:" - --msgid "Please select a standard feed or try searching for videos." --msgstr "Wählen Sie einen Standard Feed oder suchen Sie nach Videos." -+#: ../src/MyTubeSearch.py:426 -+msgid "Start with following feed:" -+msgstr "Beginne mit folgendem feed:" - --msgid "Poland" --msgstr "Polen" -+#: ../src/MyTubeSearch.py:427 -+msgid "Videoplayer stop/exit behavior:" -+msgstr "Verhalten beim Drücken der STOPP/EXIT-Taste:" - --msgid "Published" --msgstr "Veröffentlicht" -+#: ../src/MyTubeSearch.py:428 -+msgid "Videobrowser exit behavior:" -+msgstr "Verhalten nach Verlassen der Videoliste:" - --msgid "Rating" --msgstr "Bewertung" -+#: ../src/MyTubeSearch.py:435 -+msgid "Download location" -+msgstr "Download Verzeichnis:" - --msgid "Ratings: " --msgstr "Bewertungen: " -+#: ../src/MyTubeSearch.py:438 -+msgid "Clear history on Exit:" -+msgstr "Verlauf beim Verlassen löschen:" - --msgid "Really quit MyTube Player?" --msgstr "MyTube Player wirklich beenden?" -+#: ../src/MyTubeSearch.py:459 -+msgid "Choose target folder" -+msgstr "Wähle Zielverzeichnis" - --msgid "Recently featured" --msgstr "Kürzlich featured" -+#: ../src/MyTubeSearch.py:575 -+#: ../src/MyTubeSearch.py:591 -+msgid "MyTubePlayer active video downloads" -+msgstr "aktive Video downloads" - --msgid "Related video entries." --msgstr "Ähnliche Videos" -+#: ../src/plugin.py:271 -+msgid "" -+"Welcome to the MyTube Youtube Player.\n" -+"\n" -+"While entering your search term(s) you will get suggestions displayed matching your search term.\n" -+"\n" -+"To select a suggestion press DOWN on your remote, select the desired result and press OK on your remote to start the search.\n" -+"\n" -+"Press exit to get back to the input field." -+msgstr "" -+"Herzlich Willkommen beim MyTube YouTube Player.\n" -+"\n" -+"Während der Eingabe Ihres Suchwortes erhalten Sie passende Vorschläge zu Ihrer Sucheingabe.\n" -+"\n" -+"Um einen Vorschlag auszuwählen, drücken Sie die NACH UNTEN-Taste, wählen den entsprechenden Eintrag aus und drücken die OK-Taste um die Suche zu starten.\n" -+"\n" -+"Um zur Such-Eingabemaske zurück zu gelangen, drücken Sie die EXIT-Taste." - --msgid "Relevance" --msgstr "Relevanz" -+#: ../src/plugin.py:272 -+msgid "" -+"Welcome to the MyTube Youtube Player.\n" -+"\n" -+"Use the Bouqet+ button to navigate to the search field and the Bouqet- to navigate to the video entries.\n" -+"\n" -+"To play a movie just press OK on your remote control.\n" -+"\n" -+"Press info to see the movie description.\n" -+"\n" -+"Press the Menu button for additional options.\n" -+"\n" -+"The Help button shows this help again." -+msgstr "" -+"Herzlich Willkommen beim MyTube YouTube Player.\n" -+"\n" -+"Nutzen Sie die Bouqet+ Taste um zur Sucheingabe zu gelangen und die Bouqet- Taste für die Video Einträge.\n" -+"\n" -+"Um ein Video abzuspielen drücken Sie die OK-Taste auf Ihrer Fernbedienung.\n" -+"\n" -+"Mit der Info-Taste erhalten Sie die erweiterte Beschreibung zu einem Video.\n" -+"\n" -+"Für weitere Einstellungen drücken Sie die Menü-Taste.\n" -+"\n" -+"Um diese Hilfe erneut anzuzeigen, drücken Sie die Hilfe-Taste." - --msgid "Response video entries." --msgstr "Video Antworten" -+#: ../src/plugin.py:282 -+msgid "Std. Feeds" -+msgstr "Std. Feeds" - --msgid "Return to movie list" --msgstr "Zurück zur Videoliste" -+#: ../src/plugin.py:283 -+msgid "History" -+msgstr "Verlauf" - --msgid "Russia" --msgstr "Russland" -+#: ../src/plugin.py:398 -+#: ../src/plugin.py:422 -+#: ../src/plugin.py:464 -+msgid "Genuine Dreambox validation failed!" -+msgstr "Prüfung auf Original-Dreambox gescheitert!" - --msgid "Save" --msgstr "Speichern" -+#: ../src/plugin.py:398 -+#: ../src/plugin.py:422 -+#: ../src/plugin.py:464 -+msgid "Verify your Dreambox authenticity by running the genuine dreambox plugin!" -+msgstr "Bitte mit dem \"Genuine Dreambox Plugin\" auf Echtheit prüfen!" - --msgid "Science & Technology" --msgstr "Wissenschaft & Technik" -+#: ../src/plugin.py:417 -+#: ../src/plugin.py:476 -+msgid "Fetching feed entries" -+msgstr "Lade feeds" - -+#: ../src/plugin.py:417 -+#: ../src/plugin.py:476 -+msgid "Trying to download the Youtube feed entries. Please wait..." -+msgstr "YouTube feeds werden geladen, bitte warten..." -+ -+#: ../src/plugin.py:434 -+msgid "MyTubePlayer" -+msgstr "MyTube Player" -+ -+#: ../src/plugin.py:438 - msgid "Search Term(s)" - msgstr "Suchwort(e)" - --msgid "Search category:" --msgstr "Such-Kategorie:" -+#: ../src/plugin.py:478 -+msgid "Fetching search entries" -+msgstr "Lade Suchergebnisse" - --msgid "Search region:" --msgstr "Such-Region:" -+#: ../src/plugin.py:478 -+msgid "Trying to download the Youtube search results. Please wait..." -+msgstr "YouTube Suchergebnisse werden geladen, bitte warten..." - --msgid "Search restricted content:" --msgstr "Suche ohne Altersbeschränkung:" -+#: ../src/plugin.py:480 -+msgid "An error occured." -+msgstr "Es ist ein Fehler aufgetreten." - --msgid "Select new feed to view." --msgstr "Neuen feed auswählen" -+#: ../src/plugin.py:480 -+msgid "There was an error getting the feed entries. Please try again." -+msgstr "Fehler beim Laden der Suchergebnisse. Noch mal probieren." - --msgid "Select your choice." --msgstr "Treffen Sie Ihre Wahl." -+#: ../src/plugin.py:483 -+msgid "No videos to display" -+msgstr "Keine Videos zum anzeigen" - --msgid "Short Movies" --msgstr "Kurzvideos" -+#: ../src/plugin.py:483 -+msgid "Please select a standard feed or try searching for videos." -+msgstr "Wählen Sie einen Standard Feed oder suchen Sie nach Videos." - --msgid "Sorry, video is not available!" --msgstr "Video nicht verfügbar!" -+#: ../src/plugin.py:485 -+msgid "Not fetching feed entries" -+msgstr "Lade keine feed Einträge" - --msgid "South Korea" --msgstr "Süd Korea" -+#: ../src/plugin.py:485 -+msgid "Please enter your search term." -+msgstr "Bitte geben Sie einen Suchbegriff ein." - --msgid "Spain" --msgstr "Spanien" -+#: ../src/plugin.py:504 -+#: ../src/plugin.py:506 -+#: ../src/plugin.py:513 -+msgid "MyTubePlayer Help" -+msgstr "MyTube Player Hilfe" - --msgid "Sports" --msgstr "Sport" -+#: ../src/plugin.py:525 -+#: ../src/plugin.py:531 -+msgid "MyTube Settings" -+msgstr "MyTube Einstellungen" - --msgid "Start with following feed:" --msgstr "Beginne mit folgendem feed:" -+#: ../src/plugin.py:528 -+#: ../src/plugin.py:543 -+msgid "Select your choice." -+msgstr "Treffen Sie Ihre Wahl." - --msgid "Std. Feeds" --msgstr "Std. Feeds" -+#: ../src/plugin.py:533 -+msgid "View related videos" -+msgstr "Ähnliche Videos" - --msgid "Stop playing this movie?" --msgstr "Wiedergabe beenden?" -+#: ../src/plugin.py:534 -+msgid "View response videos" -+msgstr "Video Antworten" - --msgid "Sweden" --msgstr "Schweden" -+#: ../src/plugin.py:538 -+msgid "Download Video" -+msgstr "Video runterladen" - --msgid "Tags: " --msgstr "Tags: " -+#: ../src/plugin.py:539 -+msgid "View active downloads" -+msgstr "Aktive Downloads anzeigen" - --msgid "Taiwan" --msgstr "Taiwan" -+#: ../src/plugin.py:577 -+msgid "Enter your search term(s)" -+msgstr "Suchbegriff eingeben" - --msgid "There was an error getting the feed entries. Please try again." --msgstr "Fehler beim Laden der Suchergebnisse. Noch mal probieren." -+#: ../src/plugin.py:621 -+msgid "No, but switch to video entries." -+msgstr "Nein, aber zu den Videos zurück." - --msgid "This Month" --msgstr "Diesen Monat" -+#: ../src/plugin.py:627 -+msgid "No, but switch to video search." -+msgstr "Nein, aber zur Videosuche zurück" - --msgid "This Week" --msgstr "Diese Woche" -+#: ../src/plugin.py:629 -+msgid "Really quit MyTube Player?" -+msgstr "MyTube Player wirklich beenden?" - --msgid "This is the help screen. Feed me with something to display." --msgstr "" -+#: ../src/plugin.py:722 -+msgid "Sorry, video is not available!" -+msgstr "Video nicht verfügbar!" - --msgid "Today" --msgstr "Heute" -+#: ../src/plugin.py:757 -+msgid "Do you want to see more entries?" -+msgstr "Weitere Videos?" - --msgid "Top favorites" --msgstr "Top-Favoriten" -+#: ../src/plugin.py:795 -+msgid "Most popular" -+msgstr "Beliebteste Videos" - --msgid "Top rated" --msgstr "Beste Bewertung" -+#: ../src/plugin.py:802 -+msgid "Select new feed to view." -+msgstr "Neuen feed auswählen" - --msgid "Travel & Events" --msgstr "Reisen & Events" -+#: ../src/plugin.py:968 -+msgid "More video entries." -+msgstr "Weitere Video Einträge." - --msgid "Trying to download the Youtube feed entries. Please wait..." --msgstr "YouTube feeds werden geladen, bitte warten..." -+#: ../src/plugin.py:976 -+msgid "Related video entries." -+msgstr "Ähnliche Videos" - --msgid "Trying to download the Youtube search results. Please wait..." --msgstr "YouTube Suchergebnisse werden geladen, bitte warten..." -+#: ../src/plugin.py:984 -+msgid "Response video entries." -+msgstr "Video Antworten" - --msgid "United States" --msgstr "USA" -+#: ../src/plugin.py:1103 -+#: ../src/plugin.py:1341 -+msgid "Added: " -+msgstr "Hinzugefügt: " - --msgid "Videobrowser exit behavior:" --msgstr "Verhalten nach Verlassen der Videoliste:" -+#: ../src/plugin.py:1103 -+#: ../src/plugin.py:1344 -+msgid "Views: " -+msgstr "Aufrufe: " - --msgid "Videoplayer stop/exit behavior:" --msgstr "Verhalten beim Drücken der STOPP/EXIT-Taste:" -+#: ../src/plugin.py:1103 -+#: ../src/plugin.py:1335 -+msgid "Duration: " -+msgstr "Dauer: " - --msgid "View Count" --msgstr "Aufrufe" -+#: ../src/plugin.py:1103 -+msgid "Ratings: " -+msgstr "Bewertungen: " - --msgid "View active downloads" --msgstr "Aktive Downloads anzeigen" -+#: ../src/plugin.py:1309 -+msgid "Downloading screenshots. Please wait..." -+msgstr "Bilder werden geladen. Bitte warten..." - --msgid "View related videos" --msgstr "Ähnliche Videos" -+#: ../src/plugin.py:1338 -+msgid "Author: " -+msgstr "Autor: " - --msgid "View response videos" --msgstr "Video Antworten" -+#: ../src/plugin.py:1347 -+msgid "Tags: " -+msgstr "Tags: " - --msgid "Views: " --msgstr "Aufrufe: " -+#: ../src/plugin.py:1350 -+msgid "MyTubeVideoInfoScreen" -+msgstr "MyTubeVideoInfoScreen" - --msgid "" --"Welcome to the MyTube Youtube Player.\n" --"\n" --"Use the Bouqet+ button to navigate to the search field and the Bouqet- to " --"navigate to the video entries.\n" --"\n" --"To play a movie just press OK on your remote control.\n" --"\n" --"Press info to see the movie description.\n" --"\n" --"Press the Menu button for additional options.\n" --"\n" --"The Help button shows this help again." --msgstr "" --"Herzlich Willkommen beim MyTube YouTube Player.\n" --"\n" --"Nutzen Sie die Bouqet+ Taste um zur Sucheingabe zu gelangen und die Bouqet- " --"Taste für die Video Einträge.\n" --"\n" --"Um ein Video abzuspielen drücken Sie die OK-Taste auf Ihrer Fernbedienung.\n" --"\n" --"Mit der Info-Taste erhalten Sie die erweiterte Beschreibung zu einem Video.\n" --"\n" --"Für weitere Einstellungen drücken Sie die Menü-Taste.\n" --"\n" --"Um diese Hilfe erneut anzuzeigen, drücken Sie die Hilfe-Taste." -+#: ../src/plugin.py:1484 -+msgid "Help" -+msgstr "Hilfe" - --msgid "" --"Welcome to the MyTube Youtube Player.\n" --"\n" --"While entering your search term(s) you will get suggestions displayed " --"matching your search term.\n" --"\n" --"To select a suggestion press DOWN on your remote, select the desired result " --"and press OK on your remote to start the search.\n" --"\n" --"Press exit to get back to the input field." --msgstr "" --"Herzlich Willkommen beim MyTube YouTube Player.\n" --"\n" --"Während der Eingabe Ihres Suchwortes erhalten Sie passende Vorschläge zu " --"Ihrer Sucheingabe.\n" --"\n" --"Um einen Vorschlag auszuwählen drücken Sie die NACH UNTEN-Taste, wählen den " --"entsprechenden Eintrag aus und drücken die OK-Taste um die Suche zu " --"starten.\n" --"\n" --"Um zur Such-Eingabemaske zurück zu gelangen drücken Sie die EXIT-Taste." -+#: ../src/plugin.py:1488 -+msgid "This is the help screen. Feed me with something to display." -+msgstr "Dies ist die MyTube Hilfe. Bitte ausfüllen." - --msgid "Yes" --msgstr "Ja" -+#: ../src/plugin.py:1493 -+msgid "MyTubeVideohelpScreen" -+msgstr "MyTubeVideohelpScreen" -+ -+#: ../src/plugin.py:1744 -+msgid "No, but play video again" -+msgstr "Nein, aber Video noch mal abspielen" - -+#: ../src/plugin.py:1745 - msgid "Yes, but play next video" - msgstr "Ja, aber nächstes Video abspielen" - -+#: ../src/plugin.py:1746 - msgid "Yes, but play previous video" - msgstr "Ja, aber vorheriges Video abspielen" - -+#: ../src/plugin.py:1749 -+msgid "Stop playing this movie?" -+msgstr "Wiedergabe beenden?" -+ -+#: ../src/plugin.py:1751 -+msgid "No playable video found! Stop playing this movie?" -+msgstr "Kein abspielbares Video gefunden! Wiedergabe beenden?" -+ -+#: ../src/plugin.py:1797 -+msgid "My TubePlayer" -+msgstr "MyTube Player" -+ -+#: ../src/plugin.py:1798 -+msgid "Play YouTube movies" -+msgstr "YouTube Videos abspielen" -+ - #~ msgid "View Downloads" - #~ msgstr "Downloads anzeigen" -diff --git a/mytube/src/MyTubeSearch.py b/mytube/src/MyTubeSearch.py -index be63669..a1a324c 100755 ---- a/mytube/src/MyTubeSearch.py -+++ b/mytube/src/MyTubeSearch.py -@@ -1,33 +1,28 @@ -+from enigma import eListboxPythonMultiContent, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, gFont, eTimer - from MyTubeService import GoogleSuggestions - from Screens.Screen import Screen - from Screens.LocationBox import MovieLocationBox --from Components.config import config, Config, ConfigSelection, ConfigText, getConfigListEntry, ConfigSubsection, ConfigYesNo, ConfigIP, ConfigNumber,ConfigLocations -+from Components.config import config, ConfigText, getConfigListEntry -+from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_ASCII, KEY_TIMEOUT - from Components.ConfigList import ConfigListScreen --from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT - from Components.ActionMap import ActionMap - from Components.Button import Button - from Components.Label import Label --from Components.ScrollLabel import ScrollLabel - from Components.Sources.List import List --from Components.Pixmap import Pixmap --from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest --from Components.Task import Task, Job, job_manager --from enigma import eListboxPythonMultiContent, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, gFont, eListbox,ePoint,eTimer -+from Components.MultiContent import MultiContentEntryText - from Components.Task import job_manager --from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_HDD -+from Tools.Directories import resolveFilename, SCOPE_HDD -+ - from threading import Thread - from threading import Condition - from xml.etree.cElementTree import parse as cet_parse - from StringIO import StringIO -- -- --import urllib -+#import urllib - from urllib import FancyURLopener - - class MyOpener(FancyURLopener): - version = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12' - -- - class ConfigTextWithGoogleSuggestions(ConfigText): - class SuggestionsThread(Thread): - def __init__(self, suggestionsService): -@@ -151,122 +146,14 @@ class ConfigTextWithGoogleSuggestions(ConfigText): - if self.suggestionsWindow is not None: - self.suggestionsWindow.enableSelection(value) - -- --config.plugins.mytube = ConfigSubsection() --config.plugins.mytube.search = ConfigSubsection() -- --config.plugins.mytube.search.searchTerm = ConfigTextWithGoogleSuggestions("", False, threaded = True) --config.plugins.mytube.search.orderBy = ConfigSelection( -- [ -- ("relevance", _("Relevance")), -- ("viewCount", _("View Count")), -- ("published", _("Published")), -- ("rating", _("Rating")) -- ], "relevance") --config.plugins.mytube.search.time = ConfigSelection( -- [ -- ("all_time", _("All Time")), -- ("this_month", _("This Month")), -- ("this_week", _("This Week")), -- ("today", _("Today")) -- ], "all_time") --config.plugins.mytube.search.racy = ConfigSelection( -- [ -- ("include", _("Yes")), -- ("exclude", _("No")) -- ], "include") --config.plugins.mytube.search.categories = ConfigSelection( -- [ -- (None, _("All")), -- ("Film", _("Film & Animation")), -- ("Autos", _("Autos & Vehicles")), -- ("Music", _("Music")), -- ("Animals", _("Pets & Animals")), -- ("Sports", _("Sports")), -- ("Travel", _("Travel & Events")), -- ("Shortmov", _("Short Movies")), -- ("Games", _("Gaming")), -- ("Comedy", _("Comedy")), -- ("People", _("People & Blogs")), -- ("News", _("News & Politics")), -- ("Entertainment", _("Entertainment")), -- ("Education", _("Education")), -- ("Howto", _("Howto & Style")), -- ("Nonprofit", _("Nonprofits & Activism")), -- ("Tech", _("Science & Technology")) -- ], None) --config.plugins.mytube.search.lr = ConfigSelection( -- [ -- (None, _("All")), -- ("au", _("Australia")), -- ("br", _("Brazil")), -- ("ca", _("Canada")), -- ("cz", _("Czech Republic")), -- ("fr", _("France")), -- ("de", _("Germany")), -- ("gb", _("Great Britain")), -- ("au", _("Australia")), -- ("nl", _("Holland")), -- ("hk", _("Hong Kong")), -- ("in", _("India")), -- ("ie", _("Ireland")), -- ("il", _("Israel")), -- ("it", _("Italy")), -- ("jp", _("Japan")), -- ("mx", _("Mexico")), -- ("nz", _("New Zealand")), -- ("pl", _("Poland")), -- ("ru", _("Russia")), -- ("kr", _("South Korea")), -- ("es", _("Spain")), -- ("se", _("Sweden")), -- ("tw", _("Taiwan")), -- ("us", _("United States")) -- ], None) --config.plugins.mytube.search.sortOrder = ConfigSelection( -- [ -- ("ascending", _("Ascending")), -- ("descending", _("Descending")) -- ], "ascending") -- --config.plugins.mytube.general = ConfigSubsection() --config.plugins.mytube.general.showHelpOnOpen = ConfigYesNo(default = True) --config.plugins.mytube.general.loadFeedOnOpen = ConfigYesNo(default = True) --config.plugins.mytube.general.startFeed = ConfigSelection( -- [ -- ("hd", _("HD videos")), -- ("most_viewed", _("Most viewed")), -- ("top_rated", _("Top rated")), -- ("recently_featured", _("Recently featured")), -- ("most_discussed", _("Most discussed")), -- ("top_favorites", _("Top favorites")), -- ("most_linked", _("Most linked")), -- ("most_responded", _("Most responded")), -- ("most_recent", _("Most recent")) -- ], "most_viewed") -- --config.plugins.mytube.general.on_movie_stop = ConfigSelection(default = "ask", choices = [ -- ("ask", _("Ask user")), ("quit", _("Return to movie list")), ("playnext", _("Play next video")), ("playagain", _("Play video again")) ]) -- --config.plugins.mytube.general.on_exit = ConfigSelection(default = "ask", choices = [ -- ("ask", _("Ask user")), ("quit", _("Return to movie list"))]) -- -- - default = resolveFilename(SCOPE_HDD) - tmp = config.movielist.videodirs.value - if default not in tmp: - tmp.append(default) --config.plugins.mytube.general.videodir = ConfigSelection(default = default, choices = tmp) --config.plugins.mytube.general.history = ConfigText(default="") --config.plugins.mytube.general.clearHistoryOnClose = ConfigYesNo(default = False) -- --#config.plugins.mytube.general.useHTTPProxy = ConfigYesNo(default = False) --#config.plugins.mytube.general.ProxyIP = ConfigIP(default=[0,0,0,0]) --#config.plugins.mytube.general.ProxyPort = ConfigNumber(default=8080) - - class MyTubeSuggestionsListScreen(Screen): - skin = """ -- -+ - - - -@@ -366,7 +253,7 @@ class MyTubeSuggestionsListScreen(Screen): - - class MyTubeSettingsScreen(Screen, ConfigListScreen): - skin = """ -- -+ - - - -@@ -524,7 +411,7 @@ class MyTubeSettingsScreen(Screen, ConfigListScreen): - - class MyTubeTasksScreen(Screen): - skin = """ -- -+ - - - -@@ -610,7 +497,7 @@ class MyTubeTasksScreen(Screen): - - class MyTubeHistoryScreen(Screen): - skin = """ -- -+ - - - -diff --git a/mytube/src/MyTubeService.py b/mytube/src/MyTubeService.py -index 246575c..fc3dafd 100755 ---- a/mytube/src/MyTubeService.py -+++ b/mytube/src/MyTubeService.py -@@ -1,23 +1,24 @@ - # -*- coding: iso-8859-1 -*- --from __init__ import bin2long, long2bin, rsa_pub1024, decrypt_block -+from enigma import ePythonMessagePump -+ -+from __init__ import decrypt_block -+from ThreadQueue import ThreadQueue - import gdata.youtube - import gdata.youtube.service - from gdata.service import BadAuthentication --from Tools.LoadPixmap import LoadPixmap --from Components.config import config, Config, ConfigSelection, ConfigText, getConfigListEntry, ConfigSubsection, ConfigYesNo, ConfigIP, ConfigNumber --from Components.ConfigList import ConfigListScreen --from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT - - from twisted.web import client - from twisted.internet import reactor --from urllib2 import Request, URLError, HTTPError, urlopen as urlopen2 --from socket import gaierror,error --import re, os, sys, socket -+from urllib2 import Request, URLError, urlopen as urlopen2 -+from socket import gaierror, error -+import os, socket - from urllib import quote, unquote_plus, unquote --import cookielib --from httplib import HTTPConnection,CannotSendRequest,BadStatusLine,HTTPException --HTTPConnection.debuglevel = 1 -+from httplib import HTTPConnection, CannotSendRequest, BadStatusLine, HTTPException -+ - from urlparse import parse_qs -+from threading import Thread -+ -+HTTPConnection.debuglevel = 1 - - def validate_cert(cert, key): - buf = decrypt_block(cert[8:], key) -@@ -50,7 +51,7 @@ std_headers = { - - class GoogleSuggestions(): - def __init__(self, callback, ds = None, json = None, hl = None): -- self.callback = callback -+ self.gotFeed = callback - self.conn = HTTPConnection("google.com") - #GET /complete/search?output=toolbar&ds=yt&hl=en&jsonp=self.gotSuggestions&q=s - self.prepQuerry = "/complete/search?output=toolbar&" -@@ -63,7 +64,7 @@ class GoogleSuggestions(): - self.prepQuerry = self.prepQuerry + "jsonp=self.gotSuggestions&q=" - - def gotSuggestions(self, suggestslist): -- self.callback(suggestslist) -+ self.gotFeed(suggestslist) - - def getSuggestions(self, querryString): - if querryString is not "": -@@ -72,22 +73,22 @@ class GoogleSuggestions(): - self.conn.request("GET", querry) - except (CannotSendRequest, gaierror, error): - print "[MyTube] Can not send request for suggestions" -- self.callback(None) -+ self.gotFeed(None) - else: - try: - response = self.conn.getresponse() - except BadStatusLine: - print "[MyTube] Can not get a response from google" -- self.callback(None) -+ self.gotFeed(None) - else: - if response.status == 200: - data = response.read() - self.gotSuggestions(data) - else: -- self.callback(None) -+ self.gotFeed(None) - self.conn.close() - else: -- self.callback(None) -+ self.gotFeed(None) - - - class MyTubeFeedEntry(): -@@ -224,16 +225,16 @@ class MyTubeFeedEntry(): - try: - infopage = urlopen2(request).read() - videoinfo = parse_qs(infopage) -- if 'fmt_url_map' in videoinfo: -+ if ('url_encoded_fmt_stream_map' or 'fmt_url_map') in videoinfo: - break - except (URLError, HTTPException, socket.error), err: - print "[MyTube] Error: unable to download video infopage",str(err) - return video_url - -- if 'fmt_url_map' not in videoinfo: -+ if ('url_encoded_fmt_stream_map' or 'fmt_url_map') not in videoinfo: - # Attempt to see if YouTube has issued an error message - if 'reason' not in videoinfo: -- print '[MyTube] Error: unable to extract "fmt_url_map" parameter for unknown reason' -+ print '[MyTube] Error: unable to extract "fmt_url_map" or "url_encoded_fmt_stream_map" parameter for unknown reason' - else: - reason = unquote_plus(videoinfo['reason'][0]) - print '[MyTube] Error: YouTube said: %s' % reason.decode('utf-8') -@@ -241,22 +242,30 @@ class MyTubeFeedEntry(): - - video_fmt_map = {} - fmt_infomap = {} -- tmp_fmtUrlDATA = videoinfo['fmt_url_map'][0].split(',') -+ if videoinfo.has_key('url_encoded_fmt_stream_map'): -+ tmp_fmtUrlDATA = videoinfo['url_encoded_fmt_stream_map'][0].split(',url=') -+ else: -+ tmp_fmtUrlDATA = videoinfo['fmt_url_map'][0].split(',') - for fmtstring in tmp_fmtUrlDATA: -- (fmtid,fmturl) = fmtstring.split('|') -+ if videoinfo.has_key('url_encoded_fmt_stream_map'): -+ (fmturl, fmtid) = fmtstring.split('&itag=') -+ if fmturl.find("url=") !=-1: -+ fmturl = fmturl.replace("url=","") -+ else: -+ (fmtid,fmturl) = fmtstring.split('|') - if VIDEO_FMT_PRIORITY_MAP.has_key(fmtid): - video_fmt_map[VIDEO_FMT_PRIORITY_MAP[fmtid]] = { 'fmtid': fmtid, 'fmturl': unquote_plus(fmturl) } - fmt_infomap[int(fmtid)] = unquote_plus(fmturl) - print "[MyTube] got",sorted(fmt_infomap.iterkeys()) - if video_fmt_map and len(video_fmt_map): - print "[MyTube] found best available video format:",video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmtid'] -- video_url = video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmturl'] -+ video_url = video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmturl'].split(';')[0] - print "[MyTube] found best available video url:",video_url - - return video_url - - def getRelatedVideos(self): -- print "[MyTubeFeedEntry] getResponseVideos()" -+ print "[MyTubeFeedEntry] getRelatedVideos()" - for link in self.entry.link: - #print "Related link: ", link.rel.endswith - if link.rel.endswith("video.related"): -@@ -279,13 +288,14 @@ class MyTubePlayerService(): - print "[MyTube] MyTubePlayerService - init" - self.feedentries = [] - self.feed = None -- -+ - def startService(self): - print "[MyTube] MyTubePlayerService - startService" -- self.yt_service = gdata.youtube.service.YouTubeService() -- self.yt_service.developer_key = 'AI39si4AjyvU8GoJGncYzmqMCwelUnqjEMWTFCcUtK-VUzvWygvwPO-sadNwW5tNj9DDCHju3nnJEPvFy4WZZ6hzFYCx8rJ6Mw' -- self.yt_service.client_id = 'ytapi-dream-MyTubePlayer-i0kqrebg-0' -- self.loggedIn = False -+ self.yt_service = gdata.youtube.service.YouTubeService( -+ developer_key = 'AI39si4AjyvU8GoJGncYzmqMCwelUnqjEMWTFCcUtK-VUzvWygvwPO-sadNwW5tNj9DDCHju3nnJEPvFy4WZZ6hzFYCx8rJ6Mw', -+ client_id = 'ytapi-dream-MyTubePlayer-i0kqrebg-0' -+ ) -+# self.loggedIn = False - #os.environ['http_proxy'] = 'http://169.229.50.12:3128' - #proxy = os.environ.get('http_proxy') - #print "FOUND ENV PROXY-->",proxy -@@ -295,23 +305,18 @@ class MyTubePlayerService(): - def stopService(self): - print "[MyTube] MyTubePlayerService - stopService" - del self.ytService -- self.loggedIn = False -- -- def isLoggedIn(self): -- return self.loggedIn - -- def getFeed(self, url): -+ def getFeed(self, url, callback = None, errorback = None): - print "[MyTube] MyTubePlayerService - getFeed:",url - self.feedentries = [] -- self.feed = self.yt_service.GetYouTubeVideoFeed(url) -- for entry in self.feed.entry: -- MyFeedEntry = MyTubeFeedEntry(self, entry) -- self.feedentries.append(MyFeedEntry) -- return self.feed -+ queryThread = YoutubeQueryThread(self.yt_service.GetYouTubeVideoFeed, url, self.gotFeed, self.gotFeedError, callback, errorback) -+ queryThread.start() -+ return queryThread - - def search(self, searchTerms, startIndex = 1, maxResults = 25, - orderby = "relevance", racy = "include", -- author = "", lr = "", categories = "", sortOrder = "ascending"): -+ author = "", lr = "", categories = "", sortOrder = "ascending", -+ callback = None, errorback = None): - print "[MyTube] MyTubePlayerService - search()" - self.feedentries = [] - query = gdata.youtube.service.YouTubeVideoQuery() -@@ -325,17 +330,24 @@ class MyTubePlayerService(): - query.categories = categories - query.start_index = startIndex - query.max_results = maxResults -- try: -- feed = self.yt_service.YouTubeQuery(query) -- except gaierror: -- feed = None -+ queryThread = YoutubeQueryThread(self.yt_service.YouTubeQuery, query, self.gotFeed, self.gotFeedError, callback, errorback) -+ queryThread.start() -+ return queryThread -+ -+ def gotFeed(self, feed, callback): - if feed is not None: - self.feed = feed - for entry in self.feed.entry: - MyFeedEntry = MyTubeFeedEntry(self, entry) - self.feedentries.append(MyFeedEntry) -- return self.feed -- -+ if callback is not None: -+ callback(self.feed) -+ -+ def gotFeedError(self, exception, errorback): -+ if errorback is not None: -+ errorback(exception) -+ -+ - def getTitle(self): - return self.feed.title.text - -@@ -354,5 +366,38 @@ class MyTubePlayerService(): - return link.href - return None - -- -+class YoutubeQueryThread(Thread): -+ def __init__(self, query, param, gotFeed, gotFeedError, callback, errorback): -+ Thread.__init__(self) -+ self.messagePump = ePythonMessagePump() -+ self.messages = ThreadQueue() -+ self.gotFeed = gotFeed -+ self.gotFeedError = gotFeedError -+ self.callback = callback -+ self.errorback = errorback -+ self.query = query -+ self.param = param -+ self.canceled = False -+ self.messagePump.recv_msg.get().append(self.finished) -+ -+ def cancel(self): -+ self.canceled = True -+ -+ def run(self): -+ try: -+ feed = self.query(self.param) -+ self.messages.push((True, feed, self.callback)) -+ self.messagePump.send(0) -+ except Exception, ex: -+ self.messages.push((False, ex, self.errorback)) -+ self.messagePump.send(0) -+ -+ def finished(self, val): -+ if not self.canceled: -+ message = self.messages.pop() -+ if message[0]: -+ self.gotFeed(message[1], message[2]) -+ else: -+ self.gotFeedError(message[1], message[2]) -+ - myTubeService = MyTubePlayerService() -diff --git a/mytube/src/ThreadQueue.py b/mytube/src/ThreadQueue.py -new file mode 100644 -index 0000000..ddec604 ---- /dev/null -+++ b/mytube/src/ThreadQueue.py -@@ -0,0 +1,20 @@ -+from threading import Lock -+ -+class ThreadQueue: -+ def __init__(self): -+ self.__list = [ ] -+ self.__lock = Lock() -+ -+ def push(self, val): -+ lock = self.__lock -+ lock.acquire() -+ self.__list.append(val) -+ lock.release() -+ -+ def pop(self): -+ lock = self.__lock -+ lock.acquire() -+ ret = self.__list.pop() -+ lock.release() -+ return ret -+ -diff --git a/mytube/src/__init__.py b/mytube/src/__init__.py -index c8c21ef..b7b3a56 100755 ---- a/mytube/src/__init__.py -+++ b/mytube/src/__init__.py -@@ -1,8 +1,7 @@ - # -*- coding: ISO-8859-1 -*- - from Components.Language import language - from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_LANGUAGE --import os,gettext --import sha -+import os, gettext, hashlib - PluginLanguageDomain = "MyTube" - PluginLanguagePath = "Extensions/MyTube/locale" - -@@ -35,7 +34,7 @@ def decrypt_block(src, mod): - if len(src) != 128 and len(src) != 202: - return None - dest = rsa_pub1024(src[:128], mod) -- hash = sha.new(dest[1:107]) -+ hash = hashlib.sha1(dest[1:107]) - if len(src) == 202: - hash.update(src[131:192]) - result = hash.digest() -diff --git a/mytube/src/plugin.py b/mytube/src/plugin.py -index 93b54c1..84b98c4 100755 ---- a/mytube/src/plugin.py -+++ b/mytube/src/plugin.py -@@ -1,51 +1,44 @@ --from Plugins.Plugin import PluginDescriptor --from MyTubeService import GoogleSuggestions, validate_cert, get_rnd --from MyTubeSearch import ConfigTextWithGoogleSuggestions --from Tools.BoundFunction import boundFunction --from Screens.MessageBox import MessageBox --from Screens.Screen import Screen --from Screens.ChoiceBox import ChoiceBox --from Screens.InfoBar import MoviePlayer --from Screens.VirtualKeyBoard import VirtualKeyBoard --from Components.ActionMap import ActionMap, NumberActionMap -+from Components.AVSwitch import AVSwitch -+from Components.ActionMap import ActionMap -+from Components.Button import Button -+from Components.ConfigList import ConfigListScreen - from Components.Label import Label --from Components.ScrollLabel import ScrollLabel --from Components.ProgressBar import ProgressBar -+from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest - from Components.Pixmap import Pixmap --from Components.Button import Button -+from Components.ProgressBar import ProgressBar -+from Components.ScrollLabel import ScrollLabel -+from Components.ServiceEventTracker import ServiceEventTracker - from Components.Sources.List import List --from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest --from Components.AVSwitch import AVSwitch --from Components.ActionMap import HelpableActionMap --from Components.config import config, Config, ConfigSelection, ConfigSubsection, ConfigText, getConfigListEntry, ConfigYesNo, ConfigIP, ConfigNumber,ConfigLocations --from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT --from Components.ConfigList import ConfigListScreen --from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase --from Components.Console import Console --from Components.Sources.Source import Source - from Components.Task import Task, Job, job_manager -+from Components.config import config, ConfigSelection, ConfigSubsection, ConfigText, ConfigYesNo, getConfigListEntry -+#, ConfigIP, ConfigNumber, ConfigLocations -+from MyTubeSearch import ConfigTextWithGoogleSuggestions, MyTubeSettingsScreen, MyTubeTasksScreen, MyTubeHistoryScreen -+from MyTubeService import validate_cert, get_rnd, myTubeService -+from Plugins.Plugin import PluginDescriptor -+from Screens.ChoiceBox import ChoiceBox -+from Screens.InfoBarGenerics import InfoBarNotifications -+from Screens.MessageBox import MessageBox -+from Screens.Screen import Screen -+from Screens.VirtualKeyBoard import VirtualKeyBoard -+from Tools.BoundFunction import boundFunction -+from Tools.Directories import resolveFilename, SCOPE_HDD, SCOPE_CURRENT_PLUGIN -+from Tools.Downloader import downloadWithProgress - --from threading import Thread --from threading import Condition -+from __init__ import decrypt_block - --from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE, SCOPE_HDD, SCOPE_CURRENT_PLUGIN --from Tools.LoadPixmap import LoadPixmap --from Tools.Downloader import HTTPProgressDownloader, downloadWithProgress --from enigma import eTimer, quitMainloop,eListbox,ePoint, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad, eServiceCenter, iServiceInformation, eServiceReference,iSeekableService,iServiceInformation, iPlayableService, iPlayableServicePtr --from os import path as os_path, system as os_system, unlink, stat, mkdir, popen, makedirs, listdir, access, rename, remove, W_OK, R_OK, F_OK -+from enigma import eTPM, eTimer, ePoint, RT_HALIGN_LEFT, RT_VALIGN_CENTER, gFont, ePicLoad, eServiceReference, iPlayableService -+from os import path as os_path, remove as os_remove - from twisted.web import client --from twisted.internet import reactor --from time import time - --from Screens.InfoBarGenerics import InfoBarShowHide, InfoBarSeek, InfoBarNotifications, InfoBarServiceNotifications --from enigma import eTPM --from __init__ import bin2long, long2bin, rsa_pub1024, decrypt_block -+ -+ - etpm = eTPM() - rootkey = ['\x9f', '|', '\xe4', 'G', '\xc9', '\xb4', '\xf4', '#', '&', '\xce', '\xb3', '\xfe', '\xda', '\xc9', 'U', '`', '\xd8', '\x8c', 's', 'o', '\x90', '\x9b', '\\', 'b', '\xc0', '\x89', '\xd1', '\x8c', '\x9e', 'J', 'T', '\xc5', 'X', '\xa1', '\xb8', '\x13', '5', 'E', '\x02', '\xc9', '\xb2', '\xe6', 't', '\x89', '\xde', '\xcd', '\x9d', '\x11', '\xdd', '\xc7', '\xf4', '\xe4', '\xe4', '\xbc', '\xdb', '\x9c', '\xea', '}', '\xad', '\xda', 't', 'r', '\x9b', '\xdc', '\xbc', '\x18', '3', '\xe7', '\xaf', '|', '\xae', '\x0c', '\xe3', '\xb5', '\x84', '\x8d', '\r', '\x8d', '\x9d', '2', '\xd0', '\xce', '\xd5', 'q', '\t', '\x84', 'c', '\xa8', ')', '\x99', '\xdc', '<', '"', 'x', '\xe8', '\x87', '\x8f', '\x02', ';', 'S', 'm', '\xd5', '\xf0', '\xa3', '_', '\xb7', 'T', '\t', '\xde', '\xa7', '\xf1', '\xc9', '\xae', '\x8a', '\xd7', '\xd2', '\xcf', '\xb2', '.', '\x13', '\xfb', '\xac', 'j', '\xdf', '\xb1', '\x1d', ':', '?'] - - config.plugins.mytube = ConfigSubsection() - config.plugins.mytube.search = ConfigSubsection() - -+ - config.plugins.mytube.search.searchTerm = ConfigTextWithGoogleSuggestions("", False, threaded = True) - config.plugins.mytube.search.orderBy = ConfigSelection( - [ -@@ -152,6 +145,7 @@ config.plugins.mytube.general.clearHistoryOnClose = ConfigYesNo(default = False) - #config.plugins.mytube.general.ProxyIP = ConfigIP(default=[0,0,0,0]) - #config.plugins.mytube.general.ProxyPort = ConfigNumber(default=8080) - -+ - class downloadJob(Job): - def __init__(self, url, file, title): - Job.__init__(self, title) -@@ -189,8 +183,6 @@ class downloadTask(Task): - - - --from MyTubeService import myTubeService --from MyTubeSearch import MyTubeSettingsScreen,MyTubeTasksScreen,MyTubeHistoryScreen - - - class MyTubePlayerMainScreen(Screen, ConfigListScreen): -@@ -198,7 +190,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - Details = {} - #(entry, Title, Description, TubeID, thumbnail, PublishedDate,Views,duration,ratings ) - skin = """ -- -+ - - - -@@ -248,6 +240,8 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - self.ytfeed = None - self.currentFeedName = None - self.videolist = [] -+ self.queryThread = None -+ self.queryRunning = False - - self.video_playlist = [] - self.statuslist = [] -@@ -339,6 +333,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - "nextBouquet": self.switchToConfigList, - "green": self.keyStdFeed, - "yellow": self.handleHistory, -+ "menu": self.handleMenu - }, -2) - - self["historyactions"] = ActionMap(["ShortcutActions", "WizardActions", "MediaPlayerActions", "MovieSelectionActions", "HelpActions"], -@@ -385,10 +380,12 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - current = self["config"].getCurrent() - if current[1].help_window.instance is not None: - current[1].help_window.instance.hide() -+ - self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) )) - self["feedlist"].style = "state" - self['feedlist'].setList(self.statuslist) -- self.Timer.start(200) -+ self.Timer.start(200) -+ - def TimerFire(self): - self.Timer.stop() - if config.plugins.mytube.general.loadFeedOnOpen.value: -@@ -473,7 +470,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - self.switchToConfigList() - - def handleMenu(self): -- if self.currList == "configlist": -+ if self.currList == "configlist" or self.currList == "status": - menulist = ( - (_("MyTube Settings"), "settings"), - ) -@@ -644,6 +641,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - config.plugins.mytube.general.history.save() - config.plugins.mytube.general.save() - config.plugins.mytube.save() -+ self.cancelThread() - self.close() - - def keyOK(self): -@@ -901,16 +899,8 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - self.propagateUpDownNormally = True - - def getFeed(self, feedUrl, feedName): -- try: -- feed = myTubeService.getFeed(feedUrl) -- except Exception, e: -- feed = None -- print "Error querying feed :",feedName -- print "E-->",e -- self.setState('Error') -- if feed is not None: -- self.ytfeed = feed -- self.buildEntryList() -+ self.queryStarted() -+ self.queryThread = myTubeService.getFeed(feedUrl, self.gotFeed, self.gotFeedError) - - def getNextEntries(self, result): - if not result: -@@ -943,26 +933,53 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - self.searchFeed(searchContext) - - def searchFeed(self, searchContext): -- print "[MyTubePlayer] searchFeed" -+ print "[MyTubePlayer] searchFeed" -+ self.queryStarted() - self.appendEntries = False -- try: -- feed = myTubeService.search(searchContext, -+ self.queryThread = myTubeService.search(searchContext, - orderby = config.plugins.mytube.search.orderBy.value, - racy = config.plugins.mytube.search.racy.value, - lr = config.plugins.mytube.search.lr.value, - categories = [ config.plugins.mytube.search.categories.value ], -- sortOrder = config.plugins.mytube.search.sortOrder.value) -- except Exception, e: -- feed = None -- print "Error querying search for :",config.plugins.mytube.search.searchTerm.value -- print "E-->",e -- self.setState('Error') -+ sortOrder = config.plugins.mytube.search.sortOrder.value, -+ callback = self.gotSearchFeed, errorback = self.gotSearchFeedError) -+ -+ def queryStarted(self): -+ if self.queryRunning: -+ self.cancelThread() -+ self.queryRunning = True -+ -+ def queryFinished(self): -+ self.queryRunning = False -+ -+ def cancelThread(self): -+ print "[MyTubePlayer] cancelThread" -+ if self.queryThread is not None: -+ self.queryThread.cancel() -+ self.queryFinished() -+ -+ def gotFeed(self, feed): -+ print "[MyTubePlayer] gotFeed" -+ self.queryFinished() - if feed is not None: - self.ytfeed = feed -- if self.FirstRun == True: -- self.FirstRun = False - self.buildEntryList() -- -+ -+ def gotFeedError(self, exception): -+ print "[MyTubePlayer] gotFeedError" -+ self.queryFinished() -+ self.setState('Error') -+ -+ def gotSearchFeed(self, feed): -+ if self.FirstRun: -+ self.FirstRun = False -+ self.gotFeed(feed) -+ -+ def gotSearchFeedError(self, exception): -+ if self.FirstRun: -+ self.FirstRun = False -+ self.gotFeedError(exception) -+ - def buildEntryList(self): - self.mytubeentries = None - self.screenshotList = [] -@@ -989,7 +1006,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - self["feedlist"].setIndex(0) - self["feedlist"].setList(self.videolist) - self["feedlist"].updateList(self.videolist) -- if self.FirstRun == True: -+ if self.FirstRun and not config.plugins.mytube.general.loadFeedOnOpen.value: - self.switchToConfigList() - else: - self.switchToFeedList() -@@ -1157,7 +1174,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - if self.Details.has_key(tubeid): - self.Details[tubeid]["thumbnail"] = ptr - if (os_path.exists(thumbnailFile) == True): -- remove(thumbnailFile) -+ os_remove(thumbnailFile) - del self.picloads[tubeid] - else: - del self.picloads[tubeid] -@@ -1186,7 +1203,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - - class MyTubeVideoInfoScreen(Screen): - skin = """ -- -+ - - - -@@ -1361,7 +1378,7 @@ class MyTubeVideoInfoScreen(Screen): - self.thumbnails[picindex][3] = ptr - if (os_path.exists(self.thumbnails[picindex][2]) == True): - print "removing", self.thumbnails[picindex][2] -- remove(self.thumbnails[picindex][2]) -+ os_remove(self.thumbnails[picindex][2]) - del self.picloads[picindex] - if len(self.picloads) == 0: - self.timer.startLongTimer(3) -@@ -1400,7 +1417,7 @@ class MyTubeVideoInfoScreen(Screen): - - class MyTubeVideoHelpScreen(Screen): - skin = """ -- -+ - - - -@@ -1561,7 +1578,6 @@ class MyTubePlayer(Screen, InfoBarNotifications): - if self.infoCallback is not None: - self.infoCallback() - -- - def playNextFile(self): - print "playNextFile" - nextservice,error = self.nextCallback() diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_ac3lipsync_dolby.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_ac3lipsync_dolby.patch deleted file mode 100644 index 13dc932..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_ac3lipsync_dolby.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/audiosync/src/AC3delay.py b/audiosync/src/AC3delay.py -index a92c859..6bbc86d 100644 ---- a/audiosync/src/AC3delay.py -+++ b/audiosync/src/AC3delay.py -@@ -177,7 +177,7 @@ class AC3delay: - - tlist.append((description, x)) - if x == self.selectedAudioIndex: -- if ((description.find("AC3") != -1 or description.find("AC-3") != -1) and not bDownmixEnabled) or description.find("DTS") != -1: -+ if ((description.find("Dolby") != -1 or description.find("AC3") != -1 or description.find("AC-3") != -1) and not bDownmixEnabled) or description.find("DTS") != -1: - self.whichAudio = AC3 - self.channelAudio = AC3 - else: diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_autoresolution_fix.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_autoresolution_fix.patch deleted file mode 100644 index 481d00d..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_autoresolution_fix.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/autoresolution/src/plugin.py b/autoresolution/src/plugin.py -old mode 100644 -new mode 100755 -index f034c06..0dee6ce ---- a/autoresolution/src/plugin.py -+++ b/autoresolution/src/plugin.py -@@ -302,6 +302,7 @@ class AutoResSetupMenu(Screen, ConfigListScreen): - - def apply(self): - for x in self["config"].list: -+ x[1].onDeselect(self.session) - x[1].save() - self.close() - diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_dependency.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_dependency.patch deleted file mode 100644 index 711e5ce..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_dependency.patch +++ /dev/null @@ -1,10 +0,0 @@ -diff --git a/fancontrol2/CONTROL/control b/fancontrol2/CONTROL/control -index b42c485..356ab02 100644 ---- a/fancontrol2/CONTROL/control -+++ b/fancontrol2/CONTROL/control -@@ -3,4 +3,4 @@ Version: 2.5r1 - Description: Temperature dependent fan control - Maintainer: IHAD joergm6 - Homepage: http://www.i-have-a-dreambox.com --Depends: enigma2 (>> 2.6) -+Depends: enigma2 (>> 2.6), enigma2-plugin-extensions-webinterface diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_entry_vuplus.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_entry_vuplus.patch deleted file mode 100644 index 21f754c..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_entry_vuplus.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/mytube/src/MyTubeService.py b/mytube/src/MyTubeService.py -index 7371026..1794db9 100755 ---- a/mytube/src/MyTubeService.py -+++ b/mytube/src/MyTubeService.py -@@ -115,7 +115,7 @@ class MyTubeFeedEntry(): - if self.entry.media.player: - split = self.entry.media.player.url.split("=") - ret = split.pop() -- if ret == 'youtube_gdata': -+ if ret == 'youtube_gdata' or ret == 'youtube_gdata_player': - tmpval=split.pop() - if tmpval.endswith("&feature"): - tmp = tmpval.split("&") diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_tpm.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_tpm.patch deleted file mode 100644 index 53f3173..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_tpm.patch +++ /dev/null @@ -1,149 +0,0 @@ -diff --git a/mytube/src/plugin.py b/mytube/src/plugin.py -index d6fbe85..93b54c1 100755 ---- a/mytube/src/plugin.py -+++ b/mytube/src/plugin.py -@@ -385,44 +385,10 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - current = self["config"].getCurrent() - if current[1].help_window.instance is not None: - current[1].help_window.instance.hide() -- -- l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT) -- if l3cert is None or l3cert is "": -- self["videoactions"].setEnabled(False) -- self["searchactions"].setEnabled(False) -- self["config_actions"].setEnabled(False) -- self["historyactions"].setEnabled(False) -- self["statusactions"].setEnabled(True) -- self.hideSuggestions() -- self.statuslist = [] -- self.statuslist.append(( _("Genuine Dreambox validation failed!"), _("Verify your Dreambox authenticity by running the genuine dreambox plugin!" ) )) -- self["feedlist"].style = "state" -- self['feedlist'].setList(self.statuslist) -- return -- -- self.l3key = validate_cert(l3cert, self.l2key) -- if self.l3key is None: -- print "l3cert invalid" -- return -- rnd = get_rnd() -- if rnd is None: -- print "random error" -- return -- -- val = etpm.challenge(rnd) -- result = decrypt_block(val, self.l3key) -- -- self.statuslist = [] -- if result[80:88] == rnd: -- self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) )) -- self["feedlist"].style = "state" -- self['feedlist'].setList(self.statuslist) -- self.Timer.start(200) -- else: -- self.statuslist.append(( _("Genuine Dreambox validation failed!"), _("Verify your Dreambox authenticity by running the genuine dreambox plugin!" ) )) -- self["feedlist"].style = "state" -- self['feedlist'].setList(self.statuslist) -- -+ self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) )) -+ self["feedlist"].style = "state" -+ self['feedlist'].setList(self.statuslist) -+ self.Timer.start(200) - def TimerFire(self): - self.Timer.stop() - if config.plugins.mytube.general.loadFeedOnOpen.value: -@@ -453,49 +419,36 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - self.statuslist = [] - self.hideSuggestions() - result = None -- if self.l3key is not None: -- rnd = get_rnd() -- if rnd is None: -- return -- val = etpm.challenge(rnd) -- result = decrypt_block(val, self.l3key) -- if not result or result[80:88] != rnd: -+ print "Genuine Dreambox validation passed" -+ if self.FirstRun == True: -+ self.appendEntries = False -+ myTubeService.startService() -+ if self.HistoryWindow is not None: -+ self.HistoryWindow.deactivate() -+ self.HistoryWindow.instance.hide() -+ if status == 'getFeed': -+ self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) )) -+ elif status == 'getSearchFeed': -+ self.statuslist.append(( _("Fetching search entries"), _("Trying to download the Youtube search results. Please wait..." ) )) -+ elif status == 'Error': -+ self.statuslist.append(( _("An error occured."), _("There was an error getting the feed entries. Please try again." ) )) -+ elif status == 'noVideos': - self["key_green"].show() -- self.statuslist.append(( _("Genuine Dreambox validation failed!"), _("Verify your Dreambox authenticity by running the genuine dreambox plugin!" ) )) -- self["feedlist"].style = "state" -- self['feedlist'].setList(self.statuslist) -- else: -- print "Genuine Dreambox validation passed" -- if self.FirstRun == True: -- self.appendEntries = False -- myTubeService.startService() -- if self.HistoryWindow is not None: -- self.HistoryWindow.deactivate() -- self.HistoryWindow.instance.hide() -- if status == 'getFeed': -- self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) )) -- elif status == 'getSearchFeed': -- self.statuslist.append(( _("Fetching search entries"), _("Trying to download the Youtube search results. Please wait..." ) )) -- elif status == 'Error': -- self.statuslist.append(( _("An error occured."), _("There was an error getting the feed entries. Please try again." ) )) -- elif status == 'noVideos': -- self["key_green"].show() -- self.statuslist.append(( _("No videos to display"), _("Please select a standard feed or try searching for videos." ) )) -- elif status == 'byPass': -- self.statuslist.append(( _("Not fetching feed entries"), _("Please enter your search term." ) )) -- self["feedlist"].style = "state" -- self['feedlist'].setList(self.statuslist) -- self.switchToConfigList() -+ self.statuslist.append(( _("No videos to display"), _("Please select a standard feed or try searching for videos." ) )) -+ elif status == 'byPass': -+ self.statuslist.append(( _("Not fetching feed entries"), _("Please enter your search term." ) )) - self["feedlist"].style = "state" - self['feedlist'].setList(self.statuslist) -- if self.FirstRun == True: -- if config.plugins.mytube.general.loadFeedOnOpen.value: -- if config.plugins.mytube.general.startFeed.value == 'hd': -- self.FeedURL = "http://gdata.youtube.com/feeds/api/videos/-/HD" -- else: -- self.FeedURL = self.BASE_STD_FEEDURL + str(config.plugins.mytube.general.startFeed.value) -- self.getFeed(self.FeedURL, str(config.plugins.mytube.general.startFeed.value)) -- -+ self.switchToConfigList() -+ self["feedlist"].style = "state" -+ self['feedlist'].setList(self.statuslist) -+ if self.FirstRun == True: -+ if config.plugins.mytube.general.loadFeedOnOpen.value: -+ if config.plugins.mytube.general.startFeed.value == 'hd': -+ self.FeedURL = "http://gdata.youtube.com/feeds/api/videos/-/HD" -+ else: -+ self.FeedURL = self.BASE_STD_FEEDURL + str(config.plugins.mytube.general.startFeed.value) -+ self.getFeed(self.FeedURL, str(config.plugins.mytube.general.startFeed.value)) - - def handleHelpWindow(self): - print "[handleHelpWindow]" -@@ -1775,17 +1728,8 @@ class MyTubePlayer(Screen, InfoBarNotifications): - - - def MyTubeMain(session, **kwargs): -- l2 = False -- l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT) -- if l2cert is None: -- print "l2cert not found" -- return -- -- l2key = validate_cert(l2cert, rootkey) -- if l2key is None: -- print "l2cert invalid" -- return - l2 = True -+ l2key = None - if l2: - session.open(MyTubePlayerMainScreen,l2key) - diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_vuplus.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_vuplus.patch deleted file mode 100644 index be02279..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_vuplus.patch +++ /dev/null @@ -1,74 +0,0 @@ -diff --git a/mytube/src/plugin.py b/mytube/src/plugin.py -index 8f9c71d..4420fe2 100755 ---- a/mytube/src/plugin.py -+++ b/mytube/src/plugin.py -@@ -386,8 +386,10 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - if current[1].help_window.instance is not None: - current[1].help_window.instance.hide() - -- l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT) -- if l3cert is None or l3cert is "": -+# l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT) -+# if l3cert is None or l3cert is "": -+ l3cert = 0 -+ if False: - self["videoactions"].setEnabled(False) - self["searchactions"].setEnabled(False) - self["config_actions"].setEnabled(False) -@@ -400,7 +402,8 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - self['feedlist'].setList(self.statuslist) - return - -- self.l3key = validate_cert(l3cert, self.l2key) -+# self.l3key = validate_cert(l3cert, self.l2key) -+ self.l3key = 0 - if self.l3key is None: - print "l3cert invalid" - return -@@ -409,11 +412,12 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - print "random error" - return - -- val = etpm.challenge(rnd) -- result = decrypt_block(val, self.l3key) -+# val = etpm.challenge(rnd) -+# result = decrypt_block(val, self.l3key) - - self.statuslist = [] -- if result[80:88] == rnd: -+# if result[80:88] == rnd: -+ if True: - self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) )) - self["feedlist"].style = "state" - self['feedlist'].setList(self.statuslist) -@@ -457,9 +461,10 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen): - rnd = get_rnd() - if rnd is None: - return -- val = etpm.challenge(rnd) -- result = decrypt_block(val, self.l3key) -- if not result or result[80:88] != rnd: -+# val = etpm.challenge(rnd) -+# result = decrypt_block(val, self.l3key) -+# if not result or result[80:88] != rnd: -+ if False: - self["key_green"].show() - self.statuslist.append(( _("Genuine Dreambox validation failed!"), _("Verify your Dreambox authenticity by running the genuine dreambox plugin!" ) )) - self["feedlist"].style = "state" -@@ -1776,12 +1781,14 @@ class MyTubePlayer(Screen, InfoBarNotifications): - - def MyTubeMain(session, **kwargs): - l2 = False -- l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT) -+# l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT) -+ l2cert = 0 - if l2cert is None: - print "l2cert not found" - return - -- l2key = validate_cert(l2cert, rootkey) -+# l2key = validate_cert(l2cert, rootkey) -+ l2key = 0 - if l2key is None: - print "l2cert invalid" - return diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_webinterface_tpm.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_webinterface_tpm.patch deleted file mode 100644 index 918f74f..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_webinterface_tpm.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff --git a/webinterface/src/plugin.py b/webinterface/src/plugin.py -index cbf42f8..caebbb0 100644 ---- a/webinterface/src/plugin.py -+++ b/webinterface/src/plugin.py -@@ -228,7 +228,7 @@ def stopWebserver(session): - # on given ipaddress, port, w/o auth, w/o ssl - #=============================================================================== - def startServerInstance(session, ipaddress, port, useauth=False, l2k=None, usessl=False): -- if hw.get_device_name().lower() != "dm7025": -+ if 0: - l3k = None - l3c = tpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT) - -@@ -550,7 +550,7 @@ def checkBonjour(): - def networkstart(reason, **kwargs): - l2r = False - l2k = None -- if hw.get_device_name().lower() != "dm7025": -+ if 0: - l2c = tpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT) - - if l2c is None: -@@ -579,7 +579,7 @@ def openconfig(session, **kwargs): - def configCB(result, session): - l2r = False - l2k = None -- if hw.get_device_name().lower() != "dm7025": -+ if 0: - l2c = tpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT) - - if l2c is None: diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/favicon.ico b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/favicon.ico deleted file mode 100755 index 0d6f32576bf058fe2a7aa259de8e2d5c5fbcbc02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmeHJF>4}G5Z=Q-AP84)B`N&}u}N=bt+qD)1cg{xDEI?}Tw@SpW0N#1LIPr;7UmKV zYz|_RQ?asodEbT^W}mypyM&dHOnA=hn{VcunYV9=W&O~9wry##t!C7+eroH)eX^{i z*4nFowP>G@oawzkdZ~~XIKllCGOz6OnB20CZ#(?=@1U96wyl!Mq>4tP2jTH9|4)qH z9Z028ie$N5szf3YSOe;7G#UyxDf9VUWipw-I6q$6L#!0XaeVWjUz1nH!A5PA_Yf_6 zm$|@Y#-lDNqtVFaGwc7CIdnQ5nUd{dvFPDPJyJ{#^i2{pKeHd4r4-p8dXjiKC-g0S zu+92Rzu$AAP+)qTtC<7$f#NU^lA!*`4^46VH2NT^R;zA|oPm6oKAInQObXpOoGS@t zLf?b;@<$>OC0DIhBN{axkJ%TC#XNT`m&>`nQmMrFUa!Y^nUew9ko&OX@wjKL*K3BC z%Vm$R-EOmQFc`SLdcD50XXa#pHcVeSomR9em5PL_Y&Oe2VC1X;%;)o})oO9fbUO9m zDK7)GL3^an&&!I|!^0y(Vbi|UtJR7z{eIsUBk^z97Z<-2RB(fm zxXotciy^G3yWOr@EEeka_HHL`I2>}`?RLB4r(9Q8-tXe|^-Um_Vn_oEK@YS?`uX`U z^WWe9-tiL-8a ./po_list") - os.system("find ./ -name \"*.pot\" >> ./po_list") - po_list = [] - po_list = open('po_list','r+').readlines() - for x in po_list: - changeword(x) - os.system('rm po_list') - except: - print 'word patch error ' - return - -def changeword(file): - fn = file[:-1] - fnn = file[:-1]+'_n' - cmd = "sed s/Dreambox/STB/g "+fn+" > "+fnn - os.system(cmd) - cmd1 = "mv "+fnn+" "+fn - os.system(cmd1) - -do_unpack_append(){ - change_po() -} - -S = "${WORKDIR}/git" - -FILES_${PN} += "${datadir}/fonts ${datadir}/keymaps" -FILES_${PN}-meta = "${datadir}/meta" -PACKAGES += "${PN}-meta" -PACKAGE_ARCH = "${MACHINE_ARCH}" - -inherit autotools pkgconfig - - -do_compile_prepend_vuplus() { - install -m 0755 ${WORKDIR}/MyriadPro-Regular.otf ${S}/data/fonts/ - install -m 0755 ${WORKDIR}/MyriadPro-Semibold.otf ${S}/data/fonts/ - install -m 0755 ${WORKDIR}/MyriadPro-SemiboldIt.otf ${S}/data/fonts/ - install -m 0755 ${WORKDIR}/750S/*.png ${S}/data/750S/ - install -m 0755 ${WORKDIR}/750S/buttons/*.png ${S}/data/750S/buttons/ - install -m 0755 ${WORKDIR}/750S/countries/*.png ${S}/data/750S/countries/ - install -m 0755 ${WORKDIR}/750S/icons/*.png ${S}/data/750S/icons/ - install -m 0755 ${WORKDIR}/750S/menu/*.png ${S}/data/750S/menu/ - install -m 0755 ${WORKDIR}/750S/spinner/*.png ${S}/data/skin_default/spinner/ - install -m 0755 ${WORKDIR}/Vu_HD/*.png ${S}/data/Vu_HD/ - install -m 0755 ${WORKDIR}/Vu_HD/buttons/*.png ${S}/data/Vu_HD/buttons/ - install -m 0755 ${WORKDIR}/Vu_HD/countries/*.png ${S}/data/Vu_HD/countries/ - install -m 0755 ${WORKDIR}/Vu_HD/icons/*.png ${S}/data/Vu_HD/icons/ - install -m 0755 ${WORKDIR}/Vu_HD/menu/*.png ${S}/data/Vu_HD/menu/ - install -m 0755 ${WORKDIR}/number_key/*.png ${S}/data/skin_default/buttons/ -} - -EXTRA_OECONF = " \ - ${@base_contains("MACHINE_FEATURES", "display-text-vfd", "--with-display-text-vfd" , "", d)} \ - ${@base_contains("MACHINE_FEATURES", "display-graphic-vfd", "--with-display-graphic-vfd" , "", d)} \ - ${@base_contains("MACHINE_FEATURES", "right-half-vfd-skin", "--with-set-right-half-vfd-skin" , "", d)} \ - ${@base_contains("MACHINE_FEATURES", "enable-rc-kbd", "--with-remote-keyboard" , "", d)} \ - BUILD_SYS=${BUILD_SYS} \ - HOST_SYS=${HOST_SYS} \ - STAGING_INCDIR=${STAGING_INCDIR} \ - STAGING_LIBDIR=${STAGING_LIBDIR} \ -" - -python populate_packages_prepend() { - enigma2_plugindir = bb.data.expand('${libdir}/enigma2/python/Plugins', d) - do_split_packages(d, enigma2_plugindir, '^(\w+/\w+)/[a-zA-Z0-9_]+.*$', 'enigma2-plugin-%s', '%s', recursive=True, match_path=True, prepend=True) - do_split_packages(d, enigma2_plugindir, '^(\w+/\w+)/.*\.la$', 'enigma2-plugin-%s-dev', '%s (development)', recursive=True, match_path=True, prepend=True) - do_split_packages(d, enigma2_plugindir, '^(\w+/\w+)/.*\.a$', 'enigma2-plugin-%s-staticdev', '%s (static development)', recursive=True, match_path=True, prepend=True) - do_split_packages(d, enigma2_plugindir, '^(\w+/\w+)/(.*/)?\.debug/.*$', 'enigma2-plugin-%s-dbg', '%s (debug)', recursive=True, match_path=True, prepend=True) -} - -RCONFLICTS_${PN} = "dreambox-keymaps" -RREPLACES_${PN} = "dreambox-keymaps tuxbox-tuxtxt-32bpp (<= 0.0+cvs20090130-r1)" - -# workaround for opkg <= 0.1.7+svnr455-r19.1 -#pkg_preinst_${PN} () { -# if [ "x$D" != "x" ]; then -# exit 1 -# fi -# if [ -f ${datadir}/fonts/tuxtxt.ttf ]; then -# cp -a ${datadir}/fonts/tuxtxt.ttf /tmp/tuxtxt.ttf -# fi -#} -#pkg_postinst_${PN} () { -# if [ "x$D" != "x" ]; then -# exit 1 -# fi -# if [ -f /tmp/tuxtxt.ttf -a ! -f ${datadir}/fonts/tuxtxt.ttf ]; then -# mv /tmp/tuxtxt.ttf ${datadir}/fonts/tuxtxt.ttf -# fi -#} diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowdown.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowdown.png deleted file mode 100755 index 436931d42f4fc78e431b70107f8545abf3eaefa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1370 zcmV-g1*Q6lP)`6pHRCwC# zms@WeMHI*XGqY>&I!^2~Y1$;csHGHAfslCR4T(2C0TS>fc;E#IiEq&tDxto%5)!3v z+$vOPXbNd*L+){GC-FVLtoJt4Gn;jBL(-bILPF|DM_%t-em-;lbLN;~z_xnn!^`&6 z8y}dNspz}Ey9K9s@0&9pU3!0z`NjZam>ySO{>6}P8_9`R0nXv>ETNg3*YgvaOQxO| zB*=zx8|&7o&JNtlYQ*-cYuGHele&+r6~mqjWRhib4V5;9gE9AhhNUV{EdAY;&hLv$Hf zG+OYzoRl>7-o0?pcs7k}$^#R7Q?fk3gw&+!iv`(}Gf3EVgidWQrCS+T!(;SxW1#u0 z_b~t2S&9(dMkXP~&pUkdm9_N5 zDK}xIL;YR_F8t;;oWeZ1#Xm33d^&rv-y`wV;Xn+x@5N6;dM`74m@MJnF8T{rBs+)`W zqbTuvQGRmq*WfaB?2>gw-*ufKJ6YI8n=Z6>D=m*1oo&pp6&wjmIL4|t%9}{AfGotA z=wJ+Wx_V0(>1<%Tu#P*c72H^pm@BBIujV3%zT!J%p6I)-_0Kv+wZM^d64Rz&#|^=t zsNy-Da$(To?6E>efh$Q{5unnh#Y+MUC54TKQa`PQSDG%iXi%A~p@F>vs{`33bI5|( zO*vcbD6i0<0)!mTw}lSNKbn5!)64~mQL(A8MYdX%%lU>X#ojo*QcUcdr@=NA9YdV4 z%&5(#^udH7aMYI3fo1&@XhyCjaIeC#Ql+>xmH*?4yhii?qHb;ZxD=E7K`P$HRJo&q z<0I@fQ@~1@48q`;Bp7FZ4{rGkzm?4hLgg3(&k=)J3660~Ax%A+71GG%rh$bDi$D~c#?R~Wn!+P*im?#nVW3A_NC6cjjLCF@ zjoRduVRB5TLR}G~(&e~aG9pNx;&^jIe&6U~KK5ok7D3Qo9O4j|j?NH?B0P~{7fjBC zMX)TDjJBX{suF~<(P~X$u_ANxTk1O+zd*J`wi63MJqgr{mENHQ1vVu(8y-!usf5t- z5g^s$L5*XnqPjQdFU5zKeR8JU=4>6JE=cqIW#ZG&oi~I(~=3B}n3$XwSWbOUl3<`>b zu}i`jPU55&B16(gosRdNg8ZRR0BdBmegO;$>X*CDg+ukOk|clJpqJI`tO4Qyz0q4Me%V{CYO?tgBZd?Y6Tq{8RNq26ch$)@ c?V$hz0OuxJF!6ncpL9=1PTyGLV-jqCnN+YR}P3P;zWoL5<-CBgv5noL_i7$#3n8v zaX=h$VL2cLqBuBFh!Y3w*=)~dchB_f(_O`@c8xPYL=umklHPRpO!up=-v8dK9tC}l z3$F(KqoN0(M@A4x96)ID&~rw7@(gEQ)pZJJTUoR>Q|MII;WZs_uMKeSKX>GV=KuQF zv0H;PJow(S0xVP<^$;$!L z&=K)mXp!N^bt80vtAW#XCH8i7ENbf!ie_}ok0`Klmn6R7FP^ekIG$ecqZ&xu3nM-) z^7D9nApAUo@{XYgKGs4pUv}W!-U6D#`?qrtxUSKM&@E8wa2Unwhqg59D0 zFo*V$#3L_6LXl_Je>nNB!o5=yPrv@3vR1k$nQvY@85qAmL=phn4!9XZ&9TjV`g+W) zrk*sMI?+$+IMWc)x>tVq$#o%9)hhhVf*xD6Xx)54TyBc|Qh zHU6pH7O2faSZ#;F=v?Hi*Q&zxSd|_*{@6#&uXG7G{7aIlNG=ia64=cg-m2PYLX*5j zX>IYKf(hI*%uCP+PDUtGc5n2JN=Dzyj$kBqkbV0FPfQae{yacM)xHBx`Ez;La&HE*qr z%W0c^LdSX8t{MW+?_G4`e6`IJj3d-XQ7gq7hp8!v={OJ8A_`heK~UqQ3Q%q<_|w*~ zP*kx*P>ThQ0^Q$oQKbkj*bRP-d{FEmI(Uh!vR$sfud(mwFh`c?qd)pZcVvnm)rgDa zLc>+anUGV%d_lufiQ`Ja!}6vN?dBZ*=X!-N6Td^x*06P~leNfP0qDsu#HP4T*6eLR zcQ`b^4aO8N8rX8-&@^XrCaw}#SI#DN9jn3DGB&^3_F&U(mYh37mL$uPQ4>W+0Ji1D ziUb|#15o7i@Mu_h!XVT#E%i)M_o0NGr8*aIPTJ;IDovgf5|ZV~R>@KlOk4}-MmK_@ zEH-5%bF!*;Iz;|VtJIGRRgQJ4(m(PHNsGhd=;SISr^A=&o+??9Y)yh?WCS;*%z|nA z^~jZ9wxmS;?9Vabqgdr`igN6#lykGevuTSjy3CK*rVK8u8;g{O1(`;L9@j8s}$PDZjWf9H4Wh1KuJKmNr&rQ>~MAqmn2>&jWZnVfqHsBP6flM`>qV)JD3 zcdN6~m6K9~-_E}}WtXETA~r%cDbJfSV%F`*c{c!c2^NvQ+dW|HPT}?fQ0Zw^Tte*# dtULY|U;x(7l!hWI{?q^f002ovPDHLkV1jCX#+3j7 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowright.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowright.png deleted file mode 100755 index a3af5c832bd3cd0623fcd734cedbdb6b1a169dac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmV-^1%djBP)FDQ-4i z+WXci_Tamd3`$}%n%zz3(y3z)gIg!K5|4+q8F(|lSoFAuB2-d{EdzM*tE2gBCjB0h z@oOS*Ap8~hfBlHXsk141ouP0QA!J(tu=4%KuX3oPGV})`@>%4}p;etkqx3tbYcfrr zoGjLak!AR-PG=mzXl`4#acFrA){AYIn zr@ncAB$Y~OIbW0-n77yl#++%4L=~uL6^p_~e~O`)vB-m=9+PGFJqc#n{~f^j?~YlD zS#NSB-;rS>7d4g<)@BjarZE(ike4ff4B<)(ERliTn?p}pt9z#1KRtd#r=G4QzNwE( z-+uUnZCNKEqXRK*fXE>^m#5Gl%%UKwNGZx)I*llWkkfHf8L?nx7Prke!b^;@7&j) zHf<}zlYQi$1h|T^Gr5X94{iXqZblI^WCc#Ngqd z%Q7=Z6V5pdCC|p;L5V$ifm~A2YAG8_2A|l{%w1Vl%`;_LUDJMp&1oX=TJ3Stwi!s6 z%&#jzgTk)|YR(CiJJQc~ONBj)zOpql6_;agF@Z<73zA)s?^qkCMG*?+5y*39%#8xn z+!Hu;VSOGX*PyOXPiEktT~C3Lva6a)zABIA+5X8D>?pf}B;+W29Q%tF4i@6}09i`Z z!~INL9UM)w=#4Zze~n^U6V_oc(tymhVLs3kjZ^Fl1%`+jufGSwV|jKzc{QsgZ_7St zV>nA5p$$|_Gp)iUiWRfyjRMpd7PQ*-x`)v^sXHK-C>9OS9d1)K&(5o*ku2LSNcN>E zmC&+3FvLO6bY9kdwKQ|uCS4Se$n;eRYiNn#~biF3r7OgtXY^0AyYCOPbSj zL02I2XGsIE7@)yc0_^nV>wqQ=)4l;0Z#BT{fpYV^lOi_7i+>9+0Dcs8Bzs8$xc~qF M07*qoM6N<$f*IwIY5)KL diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowup.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowup.png deleted file mode 100755 index e9a0357671129dde8396c2943fab0108aa0f56f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1251 zcmV<91RVQ`P)Uk3p*MVRbKiOA zyXSo8zH-}tujQJ;gYyR zI*djx;1K_wu)UUs+~ma(+kt5@x;$M7>Qk7gJF9WDoq<&Hu{tuIs(mGn8~uqfNWJ` z73_Kuv)kgCr1B1$Xnrz3E6ug<=Z3yj?E0yVx&!%|geDeQNCk)o84M2qoQzqn;bKjN zd;@S35^C+v%gHcot;F1E01YUHQVt1??nMiB?(oOMZuWq z<&!A}V<`@qc;}_%D!`3`fZqxdvQ-I2TY|1INJr5&$slu#t^Jr4Q}2Ce7bpqc)6DK3 z;-PCfdG=~fEEWwJ#`Np5bJ|%BBNKuLlVPb2Vq^@NN`@p7`-i_p(qLSEEtG|r}wJiS$Ks83T?uII(izDl7qZ6cPg z=783(A#_?-eC;CWIi@vC8rF1YouFb$>=;_;3bk3(0prCra$G{RyIT0>y5~=&jViuE z5Qr9H-De11^~A90or-GA)qw`hha-%fE+VQP0eF5IUSxLHzv2s-9vxq+s zwQZk_j!(<;d6P(bi@UXCGOY1VO16Jixa+LuZEmxl*R6j&j);zkj)?w8L`tuQRa3$W z-ncgEoz_Elh-yprpJ=5bVYw__Lbpxm48P!qK=fBdK+W8Kr;F>X|3u#`3cAryd%n|a zAzAN#--x;`gc@SmYlPs<8{RX~529}OT|F!$q9!TCEQfmrn4yXIqYI#SSZR|dC9UDWEF#_tDnm{ Hr-UW|o^mJ| diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_bl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_bl.png deleted file mode 100755 index c1f7dd6cd82cd093cf99498d584ebdbdf352b081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^5QL70(Y)*O%~mUKs7M+SzC{oH>NS%G}T0G|-oHHnoXA|j$9BI4p=(vlLg z(o%9VQj!wlqN1WeT1-@Q<7N*ZpknTlAirRS6L4U7^KBDQ*u&GsF{I+w(KCiZ4GIFz z7kdR5-`6L&Z!4IvQL70(Y)*O%~mUKs7M+SzC{oH>NS%G}T0G|-oHHnoXA|i4!QnJ!g(vlM5 z;$osAB0yS3N>Wr*R7_Mf%y{<$pknTlAirRS6L4U7^KBDQ*xS>^F{I+w*|Uy(4GIFz z7q2xneYf8*GvSIudj9nPz6`UaJ^%1caXh&|O+Y`=Vv%&lmj&+}pT98P^1F`d=>Em^ k4olzVvrkuKj5x5FyV{W1Wk-FD3eZ>vPgg&ebxsLQ0Lhz8K>z>% diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_l.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_l.png deleted file mode 100755 index caa0f1ffb02f551c98398c6d2746b8485e2fdb9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^5QL70(Y)*O%~mUKs7M+SzC{oH>NS%G|>0G|-oHHnoXA|i4!QZiDK+P=~r zAax}{e!&bUPMp}adD}7|U&hnLF{I*FazaW<${{uhw;e3Tp>GqG%?q63&A^cVo4H-H SDK8PIj=|H_&t;ucLK6Vk!z=>; diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_r.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_r.png deleted file mode 100755 index 5ad324f3efdd91aaae2e4fefca7e6f6c37ddda8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tr.png deleted file mode 100755 index 7902358d5bb46aedf46e7d3f2b7168a6a4a54421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3990 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_snr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_snr.png deleted file mode 100755 index 18050ed17cdcad48247756b971666e687dc288b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2051 zcmV+e2>kbnP)f_1gVt(*jEPo#T>Yo0N8c~7waYa zw;Y240|CblDf%my>m1id1+E?-$f*Ijr2v=61-JSklK=vn0Ro>K9CHH%d;$aMB^(Ud z8aVnY`==b{(-nx-2gIOO z`Ky0t9`#5ZvjG9?xE7ex2f0`Ps(1h=xe6Jz z3u*%c$%g@0xd#Ef4QSR0hsg)2XaE@15X*T1xo7})xdkQaBxtz?x*Hxi$_&vd25#pZ zC)Nz)9UNE63hSp9+4diJr~|mQ0j3!MXsQLvXaP652}rpJ%UJ<8)eE^t007Yss#gFP zs0!u458+7`4M9;r6~{o5RP)(5oF26)*M z7{d(w;~X^VB3IlP>Q@#;>muuS7LgMZ1Smz#z z4Gq$|0P#8;^6eebtN{VB49>CvXzwBb*bkW96o}pxSMMXK+Y`>B0=U@{&YJ3E+?rn+gEpvJus*3ErI#*uenUv;f^P6bso8(G(P!7#Iz( z4AmJH*pmRk%>}9r0N$n#)sYF*&=Ahb0fq($*rWi&4-V`u9I^5mr~m*2iAh93RCwB~ z*NI;hRT#$cDT}3BMxh0U1Z5i*WGe+>EER2{W-diRD~YsPrU;1Hz8Ts|yOp$95otSQ zh}cRdEwo3*A`nzwiV~#fJu_!!&deF^4E6mF?(cK%z0a%k|Kv`;S%_w=F52W+-SLJg zqLPx54dhb@A`{5z%$?*qat+BPv!K4dzPh^lZHTO@s#*=f#OL$vOeVrUt-uzTlKbbJLLk=EAMf8bv74!i}g!yAAKH^LLZGf;))r>M*k{_yBK zQE2EF7GD~^HLTbDZa@Hk`tzg*5)%_k$&=(h@)RtB_V$HPP*6YxrozF@fvUSycat5N zz2FmQyo|g^R>0%rBC>}_+1Hy;iwAUmQIF~;4pF~ z97T?X1IV6aBp3zOeE?d7Nfjh2D(Y}ZPEI}&($dn_#K*^<0LQ>M7!B`a+Gz|Ws= zqBR(-B$HhYf#(Ramk{F7 zSb=0AN%v8S%ucExbu8rxOF{pa?d@%DZXOu;47$6!o0^(_g_@deVA=_(+D<4h zFV9wY!tF2*W&@3c-^gobN=UdH{mvnx-G-PVub?f)Ahwspxg@NmdR}2buh2vhYQzXe z1E&Z%wY9aD2;p8hmGH2ctrdjboJXsfB51pr&E~MM++0MU)vV3tDs?r#%=moTZpLah z2BXnnnbu(5Y^>&-oVvPNGT%%Ik9ET_MTqM!hr|6q5tc0B$HRmG$3t8k%Mb~x_2VH} zKOH8TP6vKF@Y7+X<#ZUOo3F%rBX1GtcS3Ao%CV6k0+f}N1w5f<#WB^a0xJ=Gr7ANs zQ{G?>Z$KVpMp-GbF@d>E5%?Qoi@_pnJRTtH4Fhcde}V^oomV|W6%nVbq2 z!o_e7Tnlqy<#eC~YvEjhy9iD-0zZpr`H8LfX!wgURak6Pm?o{DW#AnkB}Gr**kCR- zm_7s6+AAnA!{GT@h%rn(8UPWlVv5L66)YK8h!o~HjkSRgffCHvN?sKyF*Duy@2^4@ zgCaC+0zE>}gUn6L0_J??Y-YS_S1!dIAqlP^SCgf11KdGwV+sokw@NA~Gd*&fVyKB_ z)Yw8cX%&iW6&Bbl*fOlrBqhlkm?9LaMp$@{5HN(B|5Clg7D)xCry#zC@zw~d#0X36 h5egk5jQCf80RT5nE`?@aiVOe%002ovPDHLkV1lF$cjEv6 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_list.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_list.png deleted file mode 100755 index c1de3f07724bd0a8295aa0bce3fd8314c145d2ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9369 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 TF_I75HJp;1nryYSMd<$rk9G~J diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_600.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_600.png deleted file mode 100755 index 624dade50ae63d325c4e4c8483e86eb2eb8957d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12783 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_650.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_650.png deleted file mode 100755 index fa3262b5ea1dcda8b45db75d917862fc330b7026..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13252 zcmd6NbyQo?zGhk~xKq3ocXy|>6nFPhthl?iMT@%=iWe_|-~=ee8XyIV1PBy&cc0U{ z-g@`GnLB^XnlpCF2nI7h>pGreE{FE5I-4Y5r$7F(;FUzsYgsgkgK5k z;W)-QDY{>-P2B^_vkt1l|V%LZ+m(LVJ*? zR=9-NG);oK!jHj@4-ZKc{ychtzXtzq`?wbbIzaRD4fgydeeE(2*uQum z+N!~%4|3pBu`Ge8U)AOn5VuD8MjrGh|?eu1)dpb8w&&WWPbW6*SY z${Z0P2FL4QD8i@e?MlW(eOQP5LcH ziVqH`Dnh+Wt??-o?${N)_uyd+uECf$NGAB0GnN7?350Jez~^@k0;P0bCdjZq01amp zFM~ks8)PP5Q%P0&&_STrUp}&Zd-)W*o4BeAH@BO*y^Hjr#go@E*bH3~__9w{K2Tv6 zkfpyQ*Xa_Qegyr7M)8FpdlA2(n^y#9{STqZ$8A^ACvVBX-^tn|Fdn@eKqs=G6^kNx z7e7rmf=-$h|A@{)K_K}<@r%tUVokc<0r%pE<+AokrV8{&obJS;aV9cXiL(PQ_@Zy3 z+vRyvKSDIoen0e*Y57V+5#9I2W7Jas&-6ojp~EOe!*j_GjfG{S${SvuprGh@%MYWx zxHhp!3zOJLxwoGUD46=6S*{ug>LmzTQX2?+lTdbnE%wnF9>#ni+Ceu9!~gF1DKSyr zK*iwISH>Os2EtZ!eT>jB-tWwGDPPqa82t$^fB3!=t4lO^Q^mAL`GyrRbnAtH4>TT`V<*ZErQ?tN|UKDL%?9+f2Mn7hMCkGqymIq@RRoVrhD5!D;IiI=UXZ(i46a zSUQ!uc$H>)L8WhW>ou0kF@8U*oG7Q(Z7Ub58PW35O3*-Pnis*$Z$DjG;y@z8-+YNs zDAKWP>LZV%eb&ckeP|#%>8^*i&Eb%#`py_~xufF!_?pt2J3vMIl}Ck5l}(aO-kRI+ z1Khs4KL?`7T%{4(5uA|#PBczw&bmqaYMbidYT+6G8Q9FbUH9E*yW2DSUaomEc^rAC zVoqY`UKp)Ht(vXjt+QT;Eva$KZNE*7)1Rlfo2XIwQ>T-nQ_`*d$^B6pVIBc=p+s^= zUJ=WKp+w6KhfKTX(SxwXuLSV-tw}%L7mX?wF*h^qMcOV4`jSf7RJl;Ss}h*Eo^z0} zcxT5qTl}NAcLl~eoa&Hm(>mHP?m09xz%f@fT{XB9FFKLy0JeZ3+h=d$!b{|GdzE5@ zV*1l((gWd-(^b>Yt1|VZ^!)Tr^`@#6Cr!3Fww)&R9W^NRbFg#7a^Q_$t8=PIzvzoQ4vy4ihGI&x_f#Jc{{qcZx=5L z^pyW7@7dJ1rL-;Z$U7D!Emcm06J~g4kZL=XMVC3}`@_>#DfU{&pyQ`SIc+&})kvq` zs3FPTpvr4it{loi(;mtFmnR4321{;3%XwuvW#5kz*SXES%?!=1JD#i8=Q4pOd7K7j ze;EJifCs!4lajQ)8rejX>XUky@1GwDD}~W5NW$oYCxf$spWcA4#joJE2^XDr?^r%1bj#14tcH~*4mqEm=Y!WPoC%@H`*N5W9hFfmXhJd-d3BE1^= zLRN#DOntS?S(TdTC@d#jT@F?lSEyOn)T|_tyq2ezb|!)n4|;X=K0^JCS06uyx)!@% z5_xh9{jsXv>&f{l1kw%3DVmy_np>oWW0&5*KE>0-(xh&~&Yps^;zQ$z6zRe093P!*A7i{jfF6ps8Jqzqe{HD?Tt$w=M z*YNNUU8h{zGx`{9QXei}Q>|7jU%P{`AozPYB>h%n$v{i@$lh=6C|)actfb@>`zL*Y zwDQzJxO2^kQHv#sMVgiFzJ11ov0expX_|SJYt`49i*Ik5*Ov6v%qId*{hVfI=9QX$ z?rtk=7jHXPof~%6Ds|YuocI-SfKyF*7`IAk?xZyDS>SJf8b91H{Bsyh&_Zz6c&M>z z_NYLp=*&Ma#1yV~TV2@%Lo&@wcA|U&j&Vb&NyO*(Q+L{-?7sRA9dbdZ&SQI@Pze<8 zC|f(%f>F)#KI*;Tgn*KOr)P5e+xDI=j&rr0oe&HsEupyQ3SzFSIUihRa(1(Qpsq%2 zxZhu{b~7)O1_mr^Y!r<2%=HW}WQ8=HqHinsv5$#$dR1{2Ien2V=-A(gEy|-dqn3v? z-3RaUE?au_3nu7;zvQt<9$v0|N?9(mDg)=KNlX6Dn)5qXxyf=c)imv}eT4u^lX~u{ zG?||d9?!2Qm>#sdp3t4Yn`LZLu9mEkln-{jT~w$wcG)rcpdsMD3+%8=!BMfe)53nv{5S=xC<;U*(mF2Z!{q+4b?IV7Yhov{wBeOyK&HJqj z{T(z}EH^TD8poqomi=YF)X$~X1MhCQ&%=(d8OQSZf!*dK+n1^@L7=+$z-!GEp#8#9 zK}!_`@@E8rK7@imm-oPV69n?&0fDyOf|+}wP8eC%v&92}gyyu57e zY=nda{6JoQJ`PS!ULGDcc6M$6m79x~hnJI+gN22agOh`gpO2lLjf#qrfRKQTn~Q*e zke8Q-jg1Wt7nh2Xl9+^qkbnT-M@dD6jfG84PC-IU!U9CHuwY?hNf(pC3Ma z`1tYTr%#_kLqo&D!otJDBO)RqBO{}tqCS8A9334U6B82~8ygoF7at#=kdTm=n3$B5 zl$@NLl9G~|nwplDmY$xTk&%&^nVFT9m7SfPlarI1o12%H2L^-l^Yg!a`BG3&P*_-4 zR8&-4TwGF8Qd(MCR#x`)>(}z~@`{Rz%F4>Bs;cVh>YAFG+S=N0-@et=)j=ST`uh5Y zh6X4U+Su6G)YR16+}zUA(%RbE*4EbE-rmvC0fWIhJ3G6&y1Ki&zkmPU)6?_g$B*9L z-oC!R{{H@ffq}un!Jj{W!r}0tp`qd7;gOLM1OoBv*RRph(Xp|y@$vEBzkg3mOiWHr zPEAcsPfsI}$eEd$+1c5-xj7UHH9tSUu(0sw&!5G`#igaC<>lp-m6g@i)wQ*?_4W0Q zjg8IC&8@Ai?d|QIot@p?-MziN{r&xegM-7v!=t04+9>Ao15F)+q=8F`}_MR4i7ki`3>^aQqu-F|98GX|DE7}vD;iJfOUakQ1SIk z9p9N9)OpD4#>aIxyI5r=43<4pcj0Id+S|tg`yHg;&L3(qFlr}rB9q}mBTRUR`>Q({ zrF2J<3LBUG>tIHHLi9q33;Zya*T@UZgC!wYkRk{?k$}vTrek0HeB-}(jZq6bKjs%V zM|3)J1Ygy($GJ@0Hr(=efP9~wAZDe5ww;#?TcwLcedmwv0!LAO6=Ij`6PC59N~_`} zM;EAo60OTSgUh|VqYj`|r{!0r!$o5pbZORdv)<;j&y}Zkf2rnoX}nr@l&9r)6MQ-s z!jga}GtJt(c;^hnIzu;NyxPTKna8LSRo~9so4X4jQQpy*KTPueqBW#b`#C!|xH_;* z2NvQ}H*=n`CawnyDGR)JZt3V>cy@F*hIx00w;E7#WZ-wRN3(8xj+ii6m|xawyI#(j z58t)*s-pm~4ax(3ZuTy2OGeF|QSSJu_ks7Qs1RY_ef{g;DxK%-3Eb(&YUMh2+T{RF z=gk_5FK*)1y4x*BZR@Oo-uYAiI)j^=#RHf7r+>(Ab`N?GF}eH0ETM9=ua8k3(IzBM|lB$|9w&^Ig>pcsx z&f(1Qp8bh*ZgEhag?!ZNN^g9ugp~PWGBPvA*fg7`mf`f#vsK4Cqit17Y!|m!dC$Eu zb=U^Ar}g5OS6kbjOw$}^3);u3YGd5#xssadoZ(XCJ!es4HZQb2&(_?=$8&p*QY=lViQL(`rLCNjhKZ9LjgjatHga8uDX-M^%c%=~2Z8BF(TQ{HoINySNZY;+f*WU;PCI!>8x zwW2;cwivrVokJ#bCUT{r8XLq-A&=*Tj79SRf*-Y7X1#ps8$Y!D1=@7)O7||SM|yrS z`Ds(Xs>S-&qs{4~%+xcM5)`sQ+{q(jyfL}Wf!%r>RmF*~;Dc&(e_`tFGj7*3yW3de z#Ay5?52sie>D)y0@$rE>|0B)vf=(PssvMs{#fI`4B17HMyJqa1SEBt5$|) zn!|}dP>R;**<`Ht^q~+ifLtvoqXkC?_@DSY!NuivkRo^y>r5e3Sz6vBoty~!?mxU_6(gT$H5EkU>1{nydB}3Xug90&m~ubc zj2o)z;Has8*KpOt`uzI4-B&SrwO4eSJUW%n*9ZQ%3FTmv^}kgRz#0Dj{x=7)1U=$w z_Irxl@X~RO>c8R8L>98_C+goV56E(#BL?2`=;TFI0C+liKz)g1x;Re|1BR+1SZbjK ziDYrvkIVW2)|C@s-6;w>IAB@2MZ0H&x@Gl-r$Ea_P!sT+kextsh~PX{?>2POs~ia{ z6FrK}#(3qSb08ua@m;medv^&tqJnu8@F~)ywcv@x#IPM-R%CcHVq;=(Ln!iRPqOtd@>sku|NnL^L+BUPV(5 zj?L|F^gDP@T1{{)nV$Rj#hKN@w}1L}kn2mBA*@WYB82&e$V}ZV`=(u6VsR`3GY?z0 z=9}wAqbMoemVc#@_wkdvNIDDn$9d`Zy+4^W#j!*g*S0NX#ZKu8Q}DmBMCFj%MASr# zQVRRWW%DHK2PZ9H*-Nz()jbA`lD6_DfnxAQ5$^z zapW$2#t7eK9R0r8D9Yu&H#XB`t?h>v?V7@^OFb5-jnmeptOB^T00rfnT3$06|K(RM zrHj$FONSAo8}2xieSJL6RJf6+&7&eGxRhp=eGURbd~v=KU~(J2xK?&;7vIRft6yXY zf%ZP%Qt)AG1de6VsA~&_S4NYW%Mbq3KAsdeYm*w4J`qQ<<*eqZZ3D@kwUm@z zE`6&`&FwXBP$UUck!F@1i>Lk_v*a9C|?y#ZMX}Xm|5CP z4+v}lm5~5hdMrvc5x*m|nuF>ttkbAF3~m_5HjBgB@f9%#ttwNL-e_H_G3Gl$laq8R zhzP>;%Ek!U6btAZl38iZ2g}4Rb(ErX=mw)S2KA2=U%p?}t`6igRKzT|QU-cK8NSw_9-l6O7@RzXD3F!FR>4=}sTK(|Smi;eOW*z$K)v}Mhr zijQQAQ>qw@)2u4esu;qfH0&7ZS!pMtb%4?st(_!ZJWJ?QVzt8CXWMtT-|o;lgbs&&AhfPr|HRI{v=H%|{VcG>Xw-^g zDjLpw708rQ`+m!=Pcp97h9W_=!-zMd@-h%+R#(cJZJ#|qol3bbPzo-$86);+F;iXU zKMgF+eX~4H9JE}huDxStpItYo&mY%Mp{-d&el1`*EHcG!7oDA5x;FkkP&97v_qLsV zOK!Q|@ny7BT)FUBoQI_Lh=7n?U$4oiz}~5QZ+72GWn4_JNu97z)<|T*G-X0Sc3r6u z*O`E%DpwirX00jn{T-BDy!1Nti1;x}~m9pTk}S zw$wbmJ)vT0USsfkr7yd%R-fNar2|}=!EYA`v@(yg?4`78GPYO!DS*`FtNwD@s@gz6 ziwVFzM};CqUAx_Fs>al$P9H!LO)0e*yHJ4^4hlRcRh7y|=#2;Ie=TZ?{|KMiO$@I$YN3x`j*sVf7IQj4C$*63R z^{(kfLbgsGf88KPvs6>gG=^2V)-H%v+r?%{IM^Ctj}bmoK<}I|yDY->!_5gO4mUi0 zCcvq3_28F1)b$yhw%>3@Px*Sl-}k+phm%9ja(tE3h&>P;U*9+zX|mypXeAYM+z%Jo zUMvV-7Qvdrg>vdSBkWf>CKJ=J!a3w~Cw>|>|1t|msCUm5B(^txMdjl=Ero3;0u=Ar zOgbapV00$JZYzoDR?x_31qJS{3-yP~Qjv;58msjj#H|)Ng!g8kF<5R+BkvY*Uj^j$ z`dih7%>?LiH2_6uuz3E)HEijj-#bXe3daS8iD0VHH8S_q6~L1>8KA&4Q&kx5k_ZW*3hbSYjs1Y z9;Nlf)>om5xC-e?eYi%YVRicL5Twee(i)l%%{M#?i-QVDz7sP zsno3>O_}JaN|&@ivcM~#JL?;)ZN)aojq>aX`=YX{^f<^CVid7co^G8HbCIW8ZYmgo4>i)Ol#&#+FchTJt+!8)ds9@Eu3KLv^b^7Xw^ujRgG0(RtM%aE zZ#$ojs;v!oZ3W@rH%0b(m3LJWU`W~M#{SOW5xM5>CTl>UUL}%9$iG6@+)@6d-UtqX z-)cD+R$sji`VNLT3iww@Sxjg`fs&;iimHsN0e*lgap14e(f2ylQlpSEd%fWb0NxsE zFZ8p*5SndWRL0C~f2LEZmtO&`Ix978^LCq=FbK9W^g2levOwXXl)CazM?eSrbY1z0 znbiY1^}hv~*5v8R1A2ffLTuI5ripfK)2)kk2KVi&g(`IGXTBO$17>ZnRNeX=3^>Hz zOQ%h2Yzxs@ZzM!9QBiAkE)6pKk+yS3+7;8BjJkj1OP~+A#`;Ht=D}YJQ=v#!)ODfZ z9O?Oa?`IaZ*B&8!1idgr;_IcmVDsD^^`YxRKf3I{rmMBjEN9niu)hH*L7D>Ra+-6( z>P&?!XT6NaR`0+nuj@s4&og4ORnC}+GzD_5uZi6FvUXywi8OPgg4{yJNSO-_iJ8}6 zENbak8|TAIRuJy9bLODqV(#d73y#kK_mG7-Qn`9RU}<|jCmeHo3joU1Pm{`dm7s<=h~hCL8XR!%IITfPOzd zg7e|E&q&8-!%MJfQs#H&#Mf(s#oT9z^H%O`fCO-P4QOyOymmVX1M;n{ZtTX~er|R# zt5GJ-xVATQo^nq%B$oTjA8G`CUHsjwxum`iPrGx zRg03GCU2TjZ6QlIcx;<>D|SqqxFl-R(!V1*did1;mb_#P!D_Eo&JwM)$r=tWT&rmL zRLH_sny;;+BDcBzn_N!QAAl<(##Exw?q#vBnbP*3ka(lXD_Nq^OU(AT1c29#1u}Om z#YSs-kdOdQN^--j;cU;ed)Ii=g4H%HF{8&SzmfqQGr`fCR|c`sy(3?z?V-dZ5%lXrk)O&S^Asyl`Gd_dn{NsvgSWwQme0d++we`c?uMsm#0~mX;z@2=^w4d z%96%bI@W(eT#}i;xz78zBw?6!0(o?>Wm(4`9v!WTIdP*>QusCV6CfmsT<-~QTC`Rk z>ssn3u^d3^ss53Z)ZiLvZB2d1?9ANUjEPZD3$&$0bfGmvQCPgF;)NqSE=L1|tnO!4AQ8Yr_*mz#ZFY)!xgD%1w{nwev<|{`?GWZSYOZ{gSJxlcagxcA>27pS?QggXbJFGww7IX&XG&T5mQuLLl+S zhpN_Z3H?c^#D1pQ=brB4rxLWae&3J7*2}E6(8Z$Yn_rba{n1SXe)QSWpC?F_>S>sY zk1v=CfBq%9=yaCYKq_7`HKgZQeC34#y1KXT-G_X_r59oNPZtNbzw~scyujEyfGcXt zehU26P1NroOC^D%jo^EPvQeQviDlLow8}G0_w*j*nq|y0W!|=d zFwA--b0~_nnKBQ1LQIpbkzC3E%mxEWCfzfc0SAB{X2=srd750DvXku0q@3*hVzwm9 zG?@X(H7KT-Y^7KRR4^t3Jaa_JFe`eaWFT;FLuSR+EK}QzlB}T86f4E_-6Ivi5xnV% zX2+9grN|6N%M&0Q@NPqK;W6ZK435b_W}iYF^EVk3lReS$)W(pu5L0Fx8#F`V#FZ=# z1i)P(nPU?`N%j=GR5G)*F#)@ zcFA67c|cYMoE->NF0peC{*vzbEhVE6E}VK3WC@eO4p zVE2UGViVmhE!=+RQOUF*lLma4hIX!QD_Lo77kPSku$Rvx$r+bzgDuIJsLmpL;Edtq zjP;bb`+V5T=662AR5oPyN9M61(2;{9c*0_WN~U48@8yL3^LwuP+@r%~(g>ufWYXn8 zSdaM)e7~nHHs8WK3m!acx<^HH#vhx1$Zt-zw!GIXn`PR!FTIe?9n93eZJWu{b8#CR zBHV5=V}G9Bc9~>xV@?*5d3fE)V__pabdjNq%OBj=**3E@v3KFqV*y;YwQVn0d;5^D z!QI`b_wn}mEc$5XPp>o7FCo`%f)O<2K5Y>VkMJ~$gbJIjHG4EzDkXJ@lbq~>P+D^u(X zFjR2B-D+7S0(OPUnfTGPaN8SpT%JF&?%URJ>kX}HT3EYixLrF+k#_0?o}k@%U5}Rm z&&GsZYB=_;1#d(w0s;cAr*_So7ILLe&a$2SkI!b&@?k-jYqOp6j-9s+9k-jiy}yNB z=7VQHH07s{OLw%8Wi`#Z%-`^UGbV30hjVs!n_M#J54X>1UAUf`JHc~=U21oB{~;b1 z4OqCd2G$xlH-Godu(G71!#|U&c7Ggjt#R(ECA~M`yafuH1>l`sT+9de5FqX)CGXCg zBRDtkv6XReW>zh@`Ji4RIK|BLxT~@ZHLH){4NmZ8Y}5aTtMCoMfN|OUx{C&^bz!H; z>1Sm??M-<5l|IMT1d$7}K4Cj;r{c2Q^*`P7UJtw!nDoCs9=sl5q1@rQqq_(`;8!nhas%M*7R&GSLt2xgM>?6ES zTGt7#MoPv{dZLXz95*8;8_nLIUj?+Dgg!6c??C9Um(d*4HQz5_mAb?(-bHR`d7oIC zAx`jI>KAmC%=zD*+=>};YhB$f`zJ{3*Jquhe-75z^>MlAF{_VZMn=s}9-@%(us!JO z+5k+0(EZMJ+TL^PSu8m}6^x?etds7b%kF=1Smp#6ekQgt5|=j)^; zyNFC!KkKL9i^I~|wy=VIu@nj2-zQ6~W{G$-URQO@wEi9Wmf)=kKUMFOp2omk2lp$C zdHwt?-)c9lj^nXdv--FGaZT7)<^CnLAsFL$5^fSUiJRi}#v!ja+N5#5?B8!S-y^7| z93QGKTo)f$5}aSDd@^%EpS=FE9$Z!keHT1^nH}6EH16QsZ|VX$De`%{ThAM$%yhDB z9^_y?RCT*JKEtei)ri;m{5)OFJY~*u;c!#XoLAbj@eZLeb*u1F`cL$>W=8P|1?ew! zS4Fw;^9zaPGXjHUBHgP|^mP9Kpy55dKC0d^CvO@t4@QO7Qf#pAjyr%gzDRd!OH9Dt^(*PsmMO4FJ_;?k*3b0r+|R{yojE@8)>T>B@Uep_1@LzgKL3Ik zRAiuznzVD*p2X}Zg3tb>^_B~~=hN+D0;&$FFu6~u@EU<2+$W38d7S-kPe-S0a51Cd0(P?Y^no&Q{F~l!JEbWE`DEMICppN(qeK6 z!?`MWBW?9cSXrt!VMZADtbTzsc-zW9F2U~kEoKlz97ak=Yqh*RT-IjWzJLAM<;HBg zaewyg1MK{^EJL@au~1bJY zWkDZ7@ediFc0kDPdmrTD44T>146fxv?)#LTrcLqt+xFlO_iVFu5qQG>NL1VKY5pu{ zS)j(v=KVv77-?3a0iVtiU|S9Oxc0{nKHGXEZYYaR8-)v&Zl7A%lX>ZN@D3Fu(z$>; z(H)b&4^R>FE#HG#H+>xakO7fHzij=OLfyWzIZ}6(ZyVBO&;>^tSeJEabip;NAUy#b z?FV=ylwtU>kJ=fmo(|w9QiC99R!=_wWFNc`m+=Pu?Rp^&`fCHaAZRk)fbDPBf7t%3 z`+wN}C-;9z^-uSIN%c?n{~7ro?gO}J5B^tXA9nsN3&^X#1pluQ|7)%PAo%}A8d^Ze z|3x*c$iF50pD6Ti-2dP3{pYOsm!bT(nh)UqE#ZGNqW`^o|2d2QW$HzK{Ac4o$3({a z-+lp*|905^5%vG&)cfCkRSs%@?x~Yu_=<)Y{pX@E`*(2w7Kun7L*MRmgQvg(%}#5D z75aeNItKs9Ynffm=is}vMy~BS1*#jabMBvp(w9ZQ{IK_jvEo_=oz}e5Iq)|67+7># zoU{I#XpPbFz{0JZkP4s;5$}(9xZ3R@ST^lyqSN%#8A;t$f9)?S?)jA4043+mf@fCI iQi*)fo_bFOau68mE)tF{1pa3SQj}ABT_gMU)BgY}&=w5< diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_epg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_epg.png deleted file mode 100755 index 9f586e94bbcfe5e1b3566da9a2307248afeaed8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1920 zcmeAS@N?(olHy`uVBq!ia0y~yU{YsbV9exT28tAzROA6EmUKs7M+S!VC(K#9UIO`& zC9V-A!TD(=<%vb942~)JNvR5+xryniL8*x;m4zo$ZGeiB1AIbUEfc4z`Zfw$=IVuY zP22a$G#8%S==Oph#ob+ zCe6TBt)Moes6L&L4(sIUOj>c#&D*7%%39Vu$eei8zkD^&9z`pw1`t&equ z=PBmP?wX|S-+%J{^z*;;lmC7FZBkbM|F(Vo-;IB^@BY|l{wn*az0~&N^vZ~TE!TAu zKNmUuT%2%t%RH~s8y{OHezvT9Y51wdH@kJJ`jcY!c@xflY6-HJ{M1sTKkrU?!Tp7+ zkH1nsAzXFCf5lwuPc3KaoYv0gsdP%QKUmwoPj2;m1^*X`_6y72oe(zq&AGMC=n3b< zzbxNne^sriYqD9`{v^Az;^z4Q zuhpIB3EcDtTDE@FvSAU7=Q+2^RqwQ`@VimtH}72XuM*2j5c8dXl}_vLbC;6&kE@^O zjFyvs_a%bsZ;EBN%Ej`pLWQ%i983KJA9KbLInCJI`Hzx-Hp0@%Gcll|H`@ zv!CajZTs!;rDXf_KxXv0<%{R`zWDb2=#@XDw*>R5j{pLW6a-bV)_PaOzeR}Ym+m{N7ee$Lk?|$m|@$Z`o|MS)Jr#pU0 ztlzd-Ft)$H%&e$CcK`p*`TQOqQvd#JC^KsUT3c6V_|h`6zHa0EcE2jWYxCRJ9iKFB z^4%r#1>RoU&pt){h@7_niL^?mm7qMo#ZKuHFl$$loVD+M6F$#br2~Qgj|0u@s9ZEZ z;N@sJKvZ$s^1tZ*Oi-%5z5ef$=l$P5%zAIXOx3sS^yEj6Kfg+s`@G&}r>*Y3n!mrV mOQ|MTu}AN_SNB)-07IzcssmNh@`k|biow&>&t;ucLK6VnvGqy- diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_eventinfo.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_eventinfo.png deleted file mode 100755 index 5108758ada367ab7b76fbf2cfc212ccd45b6349e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 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 M%Bsnfg3SZ|4^dK?)&Kwi diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu.png deleted file mode 100755 index e7f9ede41b1f709228b6b10867cdeacbdab9b26b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4424 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_300.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_300.png deleted file mode 100755 index b81f37f3767c496c62a7f7f6387abedfd7bdc0bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmaKscTiJn8pgA_tam}&duN2pz3L)el1L2%B%pLcCt%>v1B8e)QA#L+^j<<$5D*O@ z5?TOJK&p`@1VU3n06|nb0cj$zNzlEs|LmFh=6TOK-}^k@%=*DohoPmG_0>ayeyUu`R2b8lDQ0L*PHNZrNT340OgiNRq}Sd2@cPY)IW z0-Xez8d_*8W3t4I!hcitltL$Dw`?fb5wtuWQ95baY6JfS#vOu!DO{#=ReXx4uBof5YiMX_ zYHDg}X=!U~>*(m{>gww0=^>FweSLic0|P@tLn9+2V`F0z6BAQYQ!_I&6bfZ-Zf;>= zasB#rG#YJbX=!C;1pt7xwY80njjgS%ot>S%y}g5jgQKG(27_^Oa&mTdc5!jRVzI8S zt~ea-#*G_pZf-Yk-gI|&_wexW^z`)d^78ifzIE%CkB`so+qduBx#R2W>*wd^@9!TF z5P-+y0|Nttf`WpBgF`|>?%ur{8X6iF7IyF6z3}kxh=_>D$jGRusOaeEn3$N@*x0zZ zxcK<^goK2|#Kfeeq~zq}l$4az)YP=JGy;K;o}QkOk&&61nU$55ot>SNlXL(6{Ra;o zftm_%J^|zo4L?u(0saqen$WMUNjpe)8lAkw`2qE-oo4DJ?C1`t)g8S=qB^ z&&tcoNhDH5MMY(0WmQ#Gb#--3O%0h$uC1-DtE;Q8uYdmhc|$|Pix)3mzI@r(*x1z6 z)ZEeZ{3mX_Am*0#2`_V)IUj*iaG&eyMBQz(=-Z{Boub#-@l_w@Ai_V)Jm^}T)j zw!goBU|@hsr49}b4h;>_Xtd$s;gOM%(b3Vdv9a;-@ptduy?_6HVq$_$r%z5!G8l}h zsj2Dd>6w|C4uVK?)bv}5aBJ<7jh^GeD4^86T z`Qr0>kB9<3%w%USi_&BrcPdHMh_=1b*`LrA^!w44vvNz_SgQlmYHhal(2zbmR4-{$ zVY3plWl)@WM0ww!%(uDM>lqZ2SLtaz9=ns}Ub=7DYBWFFFxfTkPyIb$^QZ*Zuy;^( z)!U(z2hLEb5nwc*E=@W(n<$HcSB)8ivz_hBhQXO6QQ%IoHu@~J{sO?1(?XwDC4&{p zHPNIqM(`2damn?Y{A4^obrwJ*;+RlI8cv9<1<}v~O0BOZTRA0b3yqf#ufTJ>kM$Ct z?bThI#!`N&2D`seh^?HGWwj8)-JJWglVxrI{|Iz*LOA}%Imc1#94`C*pPj7m;&U5N z7nV{u{+t{!fEOsn#z9>wY8mQiOj9JO!~YZzy>f=kO~2r>5QF$}Fc&7tj~hYmaAD-9 z@kuOIYod|*ge=O6Pb#U|l}S>1PM0Us1n6-jnA8Cm;Py}ukG7v#`y=FhDT5yXtw%YX8^Zl>F$I%{Kizi((0)-M*JLEL9(Bxc^o&->R)VB^kUaxosTDYcbas2^mz|uJj5Vk zOZcF4(nxJkL00gX%#;Co5fI!rBcrIo#az@04|qCuu{r`rpq&6>G15R8?t)1=U+|d! z&P7&Dphe&q1lnY+o?B7dCP^b)7hTjQ(x(%Yeebt&vij1f3{ zt}hXHup27EKTF?H^r?S9^BeV<@2pfCJJ{xNSZz9tCMjd*HxpuQcOvZv;0Tyfjubxh kgk7*i#4chw^q(>yBO>{}Qj4w>>n8(3Y8z`+YB)yx2W|`gDF6Tf diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_350.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_350.png deleted file mode 100755 index 4f6f49c2fdb0bf1ed5976787691b4da4ce735b56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2754 zcmb_ec{o&iAD@!A<2EhV7RnMKG?KBaEKSx46Js6g82d2RjL?KIw&_|jCEW^TjJm@Z z+az3rL`jG&6_e|Y;-}ian`{#R}=RD_ozTeO9^ZA`~KA-0~Sq_LZyTCGF z5D2u(+RD-i1looMPEAoEpwlX^@fNu3k2&ocgTw{K#QWkgAhQ6RA4b7C+!u>+!uST9 zkLtyk0HAdTyK|@a8ivEX$i)voX`ah8@F_fGn{v!8SIr?!*Rw$1`{&~x`Ko6x>A2_V zp|2c-Cu+Oq82gu$wsR>RYlgl>TFzNe6iLPY;)y_t2J*7HW4e)F@lls-lYpzHn9{=t z;t{6|WxLdCoxH1$R!?HDX}e@YU9t^*3gyob6s(ezY?AjGMHI0*jdT6qe^#yHLlCEd|_1`|jyb4@X>!nUci$MK-vsei? zUs#6yqUB8bQ8y^_!R#gKwAgX%ezVxXypB^r*U!dNjeH7~?NVgS72P(ywUuu@NQ+(bcxY$Xt@?ow1Gh(tJ5&$xpUnp?C4c$-V}ij! zNOx5y8IpIlJ2~cM-u#D;%U0<^Wdx(=gERd;v{ptEC%v;DAIoq%sMj||0rR=NA<2zR zp8Pfs*U&tVH&Gh$`QAx*gDFHDN`LfnxEwS2AhR~_a{PwrM8-;aM@SO{E9;0`YgnnG z&Bczt(mcpam5ZP;+ry9ZyBB$zEmLyxDLj&K#qWzI*K23q>)KTX8}##oDmxfb^Fepo zSQ(F3Oa@R#eq?26&e8hIdp_wRM$t=E_o+g3xt7IYky86nv%3*drnw&sD9u|m?SY~3 zH5lK1Ejl>y;`STxhAN2cCy3x_BSfjA?sp;U*x&gmM+(MZ*s&49h zIj(%|_X~){M@;P+*rcLFt?sRxg^VL=vP8x&@%6pSM(_I;?f+$&9#EdDy*(23tgL-xW4Jt-aUpOx?Vpbue55 zL;3nvM3!niCevbD{WwI~0ybY)njYr2r>I%1_l3?KHU8akKWtkNY(XVQ=knkSgIxP; zN8Mm-{F;SYksPXYr&p}Zj1pp&4av(mQE!9jP13`fs!>Mn((UTd^(rM1kPGk|iDfn_ zb8gwznu%7SAiVRWQ-xJ=NN-5l^f}2v3l(^Fs7+P}1upC4?q8v- zc|o#o!8W|O7vWbs*5z`8=Cm2MKMf!~`!Rb5dakpZSK3P?dv)>`T1g#+(bCNoQFA(( zd^b^5stx`=Ep(VX6J}BKLODYjdOGtUDuvAcOc7ylt`9c{P$*NVs;^F0TqO?>YuZEf zvse6TB4Br0^LuBzDjNHUCv<5~=n0qsLv@+bU(fHgXwsEmbvhj7mZK02dqJv-IvRoh zB4=J`KbBZ|<4(Q0_uH^|v0deFjoy(YD+g8Q;&jrK2nKQR^&|IqUUiC4noOH!VQ>`6 z@@ zq!(;=%&f!M6Z7L#9u%!0{q(+a&eY@|X+_iK+Bdx2M9=4Q-aU_R{3h-Q2hS1{FFw9BB6BEVn(Uw zVm^VJ|1jTKc7?uutnW@QHj9H9^3Lh3&OM9RQ6N(OldHpCP!H?ZsWA*V9Ku|&LVh$OWNYrv3vBEYMvE^`+XrH08$v1y& zEU_PSyM%>=$?S;JkcQ2ihlZ~CF^REm7dh`UpW-xJ(b(F;ec;jF$GSc3&m`KTH003=gt20Y zT1CS8sspgc&#QDmGun|O0n}-LTz@UbnO3h2H8v=Ew{ULICvAa+^-uPJASKDkaq?k~Uskp6ot-M!S*D zl&NdA)NX7qN0e<`LqVJ9pnD{@uC&<7z&-}Od6a`Tk`*SLADS(vwN0TcGqVkLeBKptgC3a=n;?y!#_iNfsQF6zO_FuJnC!p7Hvofadq+YRX*h1NZDPj0aZ3! zGiD`??Dm6EB+*ms+Vw$a4X9Yxz1>jkhMMh&3zXtneB$JO&9aZgowt&5SMSYE7{>>= zwN|XVmBE3@>mR8pV%nf!y*HGeXOZ`TUoDXJX@q61xexJQu7z+< diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_a.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_a.png deleted file mode 100755 index 0a6aa8ec13b36d1a088234be9352a9b576041664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcmeAS@N?(olHy`uVBq!ia0vp^zZe)8bvT%Tth-8aoj{7QILO_JVcj{Imq1Q(fKP~P zAOo*~fq}ify@!WKaBy%)NJwaCXjoWSczAe3L_}0nRCIK7OiWB{Y;0UyTzq_dLPA1f zVq#KKQgU)~N=iyC-oD+H~Z|k<+J7|6t(p z2H9N_l;aer^ng4fQy}D=574g46Kg3S?nmO;h z|I_vTsjqTvw-?9iegAcFcf_`@zOnb>p6~km_ucv9+gHWLt^2>c@aw$zRp;e@l>RGB z{^@b$>d%IL>C+Dj?XC$g-*=^DRi97o+JcoUuWwvA{lS&%k?G6+oh}u%TYF|}&~vNn zJI|G_Tm2zsI)qgm+xmRh6_8l*+}Bz**Ox+AG2st)>Vd_OSkHHHoiAMpR2Ks@CbVLm zH-xow-J#;xS0FKR;8e2YlR+X`AP;mY-P1CQ=^)ZEBmu5aXRv2FbBty)0nN+H;JsCU8Z@OAu$-&rJYxR5|IGOGAF1|4FZ1myp zK#|&<>1kJ%dLGf;?!Ec)(v!1)nLI1YECZTa2ejmwM0M|*vm!vE&f@3qsyh`N|K53j zxZBaR|GC(ox5qxLf7kzdlHTWGHYV-DaV2>8$$iRquf~f#K?lDurzfi3|bIiXU zH@{wQv$v)9`SME7y>q93u)kQ=Id{sgJxli~T(6rozxz$vUH{lv_P*7hAFIDU%wBXq TDk>J3#TYzY{an^LB{Ts5_!2Y& diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_c.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_c.png deleted file mode 100755 index f26e6bf487337ce1f640eb5c4df57c7c15a88ae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcmeAS@N?(olHy`uVBq!ia0vp^zZe)8bvT%Tth-8aoj{7QILO_JVcj{Imq1Q(fKP~P zAOo*~fq}ify@!WKaBy%)NJwaCXjoWSczAe3L_}0nRCIK7OiWB{Y;0UyTzq_dLPA1f zVq#KKQgU)~N=iyC-oD+H~Z|k<+J7|6t(p z2H9N_ljC zW~MuC)$}tkFuQoVIEGZ*dVBY7(Ch#awty`jS0)Hpuq3^{|Jy!QajWs(msg~XZ{^D- zP2x_UVH|(s^#;`l+x`1uDt^C^-BWB6R{XQ>;aer^ng4fQy}D=574g46Kg3S?nmO;h z|I_vTsjqTvw-?9iegAcFcf_`@zOnb>p6~km_ucv9+gHWLt^2>c@aw$zRp;e@l>RGB z{^@b$>d%IL>C+Dj?XC$g-*=^DRi97o+JcoUuWwvA{lS&%k?G6+oh}u%TYF|}&~vNn zJI|G_Tm2zsI)qgm+xmRh6_8l*+}Bz**Ox+AG2st)>Vd_OSkHHHoiAMpR2Ks@CbVLm zH-xow-J#;xS0FKR;8e2YlR+X`AP;mY-P1CQ=^)ZEBmu5aXRv2FbBty)0nN+H;JsCU8Z@OAu$-&rJYxR5|IGOGAF1|4FZ1myp zK#|&<>1kJ%dLGf;?!Ec)(v!1)nLI1YECZTa2ejmwM0M|*vm!vE&f@3qsyh`N|K53j zxZBaR|GC(ox5qxLf7kzdlHTWGHYV-DaV2>8$$iRquf~f#K?lDurzfi3|bIiXU zH@{wQv$v)9`SME7y>q93u)kQ=Id{sgJxli~T(6rozxz$vUH{lv_P*7hAFIDU%wBXq TDk>J3#TYzY{an^LB{Ts5Vc9gg diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_multiepg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_multiepg.png deleted file mode 100755 index c1e3bf2b99b5f3412c4c40ecb758860afe6daabb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1096 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 D7BCF| diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_130x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_130x23px.png deleted file mode 100755 index 9d7fc7282c0c5fac1b932db7eaf0bcdbb68eba47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3688 zcmV-u4wvzXP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0{~D=R7JFsSr`-y#hzZRo`ia0JNo+h^z-n@p@~D=RE4 zEG;c9E-o%FFE21KFflPPGBPqVGcz_~R#sM5S65hASXo(FT3T9LTU%UQTwPsVUS3{bUteHg zU}0flVq#)rV`F4wWMyS#W@ct*XJ=?=XlZF_YHDh0Yin$5Y;A3AZfQ za&mHWb8~cbbai!gc6N4mcXxPrczJnwdU|?$dwYC*e0_a=etv#`e}900fPsO5f`WpB zgM);GgoTBLhK7cRhlhxWh>3}bii(Phi;IkmjE#+rj*gCxkB^X$kdcv*l9G~>larK` zl$Dj0mX?;6mzS8Bn3Cf>sHv%`s;a81tE;T6tgWrBuCA`HudlGMu(7eRva+(Xv$M3cw6(Rhwzjsn zx3{>sxVgExy1Kf%ySu!+yuH1>zP`S{zrVo1z`?=6!otGC!^6bH#KpzM#>U3S$H&OX z$jQmc%F4>i%gfBn%+1Zs&d$!y&(F}%(9zM+($dn?)6>+{)YaA1*4Eb7*VowC*xA|H z+S=ON+uPjS+}+*X-rnBd-{0Wi;Njun;^N}tgww2 z>+9_7?CtIC?(XjI@9*&N@bU5S^78WY^Yird^!4@i_V)Jo_xJet`1$$y`uh6&`}_R- z{Qdp?{{H^||NmLjfv*4n019+cPE-H?|NsC0|Ns90vdk>c0001ENklk<~rOYEB3+GgF6_xD(t(f=Ut! z1QXp7mav2+Ea8_B|A+^k@_}A>pqgH2$9O@100030{{sL)g<2IHu^_Gh0000KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0{~D=R7JFsSr`-y#hzZRo`ia0JNo+h^z-n@p@~D=RE4 zEG;c9E-o%FFE21KFflPPGBPqVGcz_~R#sM5S65hASXo(FT3T9LTU%UQTwPsVUS3{bUteHg zU}0flVq#)rV`F4wWMyS#W@ct*XJ=?=XlZF_YHDh0Yin$5Y;A3AZfQ za&mHWb8~cbbai!gc6N4mcXxPrczJnwdU|?$dwYC*e0_a=etv#`e}900fPsO5f`WpB zgM);GgoTBLhK7cRhlhxWh>3}bii(Phi;IkmjE#+rj*gCxkB^X$kdcv*l9G~>larK` zl$Dj0mX?;6mzS8Bn3Cf>sHv%`s;a81tE;T6tgWrBuCA`HudlGMu(7eRva+(Xv$M3cw6(Rhwzjsn zx3{>sxVgExy1Kf%ySu!+yuH1>zP`S{zrVo1z`?=6!otGC!^6bH#KpzM#>U3S$H&OX z$jQmc%F4>i%gfBn%+1Zs&d$!y&(F}%(9zM+($dn?)6>+{)YaA1*4Eb7*VowC*xA|H z+S=ON+uPjS+}+*X-rnBd-{0Wi;Njun;^N}tgww2 z>+9_7?CtIC?(XjI@9*&N@bU5S^78WY^Yird^!4@i_V)Jo_xJet`1$$y`uh6&`}_R- z{Qdp?{{H^||NmLjfv*4n019+cPE-H?|NsC0|Ns90vdk>c0001FNkl%Gj(W*I{{rJs03<( zU?N)TQkS~ar7ksu8nXd{mQ~PR4SE4d-zw&@J^%m!|NjF3Lj!g-Ussk(00000NkvXX Hu0mjfiANc> diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x23px.png deleted file mode 100755 index 4bd5ec4f637adf536242247127c9f1dc31469d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3699 zcmV-(4vg`MP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0{~D=R7JFsSr`-ydSW}po?iO;`K_LW^z-ntk5{Xlg2@~D=RE4 zEG;c9E-o%FFE21KFflPPGBPqVGcz_~R#sM5S65hASXo(FT3T9LTU%UQTwPsVUS3{bUteHg zU}0flVq#)rV`F4wWMyS#W@ct*XJ=?=XlZF_YHDh0Yin$5Y;A3AZfQ za&mHWb8~cbbai!gc6N4mcXxPrczJnwdU|?$dwYC*e0_a=etv#`e}900fPsO5f`WpB zgM);GgoTBLhK7cRhlhxWh>3}bii(Phi;IkmjE#+rj*gCxkB^X$kdcv*l9G~>larK` zl$Dj0mX?;6mzS8Bn3Cf>sHv%`s;a81tE;T6tgWrBuCA`HudlGMu(7eRva+(Xv$M3cw6(Rhwzjsn zx3{>sxVgExy1Kf%ySu!+yuH1>zP`S{zrVo1z`?=6!otGC!^6bH#KpzM#>U3S$H&OX z$jQmc%F4>i%gfBn%+1Zs&d$!y&(F}%(9zM+($dn?)6>+{)YaA1*4Eb7*VowC*xA|H z+S=ON+uPjS+}+*X-rnBd-{0Wi;Njun;^N}tgww2 z>+9_7?CtIC?(XjI@9*&N@bU5S^78WY^Yird^!4@i_V)Jo_xJet`1$$y`uh6&`}_R- z{Qdp?{{H^||No#g97_NI01R|ePE-H?|NsC0|NsC0{{Rx-&dvY;0BlJ_K~#9!?AXB# z05J#yK@$|^7Wd!p^#N=L^8?HF6^+xiExR=mK(;LMM71qWBI}ZkkyTZZT!~Z7J4g`S znE`@o-!hlE%w;Zfnaf<}VCIOM_D%Rup1ukH<~Lra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%$p!d?xNeygDIvmBm1KQ%UfkMw zEt~qoSI=oWu`mHB|NsAg^WfMAKo(a?kY6y63jqw9&gh&6iWYjhIEGZ*dUNBX-~k05 z=fFxv$N#*?Jw+v>>oXq6);R3=u6DyBMKG}cY<2Hap6!>-K5M8?x+w9}v6=IN|K~YN zmz1VQ%~h|wrM_%NQkN#2_-XvCNs+DF`Wx$nkCe&HoAcc5_Qaop2@EHs WzpU3_-lPF^0fVQjpUXO@geCx=YIWHF diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_290x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_290x23px.png deleted file mode 100755 index a1df44eddc9c49d4f6bc5ddfaaa74cc2a042a1cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3722 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x23px.png deleted file mode 100755 index aba4b0fce02392e38249c13fb7cfae2d6160346c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3716 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_400x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_400x23px.png deleted file mode 100755 index b4b79d88e48c3d0237e224950b5b6c23f03d61fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3718 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_440x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_440x23px.png deleted file mode 100755 index dcb6e2231291991b3c74313e5b006111ab66f5c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3722 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_450x32px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_450x32px.png deleted file mode 100755 index 9f37cbbead296fc22aacd73b7f1e1eda88bdd7e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_500x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_500x23px.png deleted file mode 100755 index 2ad248f2bec79c025d91575adf7f11dd2e40c6a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3723 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x23px.png deleted file mode 100755 index 6de80e7ba2fa49711ee98c91e8afd5eae5bc1139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3721 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 LtDnm{r-UW|t86Sk diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue.png deleted file mode 100755 index b014975b4806c2cb158d5f115d05eed1a7fdaf4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=?1^9%x1|K;EWNJw?zXwuGB|(0{ z{~4ZcH}C@TyggkULn>}z`h&{zgfS3j3^ HP6}-p z?HTs8DNeE7vH#X@ixp?hzkkwt;k^aFo=ZAyuJK;VX~4jCoRP;dacUmWSO!m5KbLh* G2~7Z^w?%pY diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green.png deleted file mode 100755 index 0f37970cd2c5ce98950ca1340d3b1aebb554f31e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=?1^9%x=InC?GH>Q&OaW3%B|(0{ z{~4ZcH}C@TyggkULn>}z`h&{zgfS3j3^ HP6p`9sEjw zr}hkc+7zeQ?%03px5bLH=HEYQz3|?GU(Y3-HrIGB}z`h&{zgfS3j3^ HP6T`n(_Wp1`5=b$X1o;L3 zXL!2ZzzZbk>Eaktacj#&M=k~h4wmEp>#e$kuAlNdn}z`h&{zgfS3j3^ HP62Z<9*{4Q{K2fq^F zsXfDgTe~ HDWM4f@4-Xx diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green-big.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green-big.png deleted file mode 100755 index f92f09f160fe0042f819cf1bce224765ca3945f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 864 zcmeAS@N?(olHy`uVBq!ia0vp^CxBRkgBeKn9CFnIQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%y$bLNab*E&W@JcP>z1#Wl^xJAxzw9PWL$uQ-Y7h&aKjh*krCoO1^Xk?jU%)-pX!ouX!Y@-{X!^+7Tzt~05 zR)tG~PufV1Lx@X2NsLEQAZdlGez2~zvAkKlQS3rzyDU>tEh$bhUI`s(-&R{TUUpFp zNw-QXO>Zq$R%TXiHsfdm1#4xeVvCr$PT|uWwSBc^O%*src}3JE48!%+T-AkD#QfUr z#I&Tcwz`1=ih-f!5=TCe@+%4Q3;s_{z_7;m_c;az#zmekjv*Dd-b7{wA2JZ|ecvpm zwLqhZ>E8F+``;&i`v1Rgwn386K}qXHH~W5fK50Eyz2~kEotGJ7lA+O42o=Lfy zlAQ)>DJ@KOhDIEorlOOcsdT9EtK8zectTJ;Ci>{|=)`L~b!Lhj>Jnz&tbA1M?eQOC ztM&-*l-eB9WylwGc0>#koo#r0|NyM;wh;yLD>jV#{uvrxtSf5cOF54|ZR cyYrcN7|bn|eNGzd`+(Aer>mdKI;Vst0P(GB9smFU diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green.png deleted file mode 100755 index c6dd5a467a9fcd98bbb25cf02d6a38c86dc7e4c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601 zcmeAS@N?(olHy`uVBq!ia0vp^O+c*9!3-q7@FYwEQjEnx?oJHr&dIz4ayAC|gt)Fr z;~m8HFntM=F>nC|e|{Sf;8v6lgjYX*!o_ zyVvS^)a!Y-82Gdq`gIru^cn~Dn*>iZ4Vz&eG0P%yj%Cz*tLTMRv5T$aSJ)=5vP;?M zkha+|eXCQ(cIV7p&e?lha`w3%Ewx?_a&bwJUoeBivm0q3PLj8~3quF1tOt<8S>O>_ z%)r1c48n{Iv*t(u1=&kHeO=javI=pFs|lQwTnW@8;_2cT5^?zLj7Xs-2Oby4fI{)W zJAopuM{CW$+s~L8=@YLOD9$MIsK0{b4?&-@OqSjci#euU z=lxwbkN==ltYcPOs?&z4WasncUoV2^>xj?1*T1IKR$D} h-QV#dasRt2rmH`!?{2#2b`uz644$rjF6*2UngA-N%wYfk diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_0.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_0.png deleted file mode 100755 index a7f24a9e56cad3c585fb0c9c8289e25a2546c6a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1277 zcmY+D4N#J29KfGuAI{D0x?PeV87xRNov1OKL6+c`TYL>_Y{x2 z$JNEd1tH|hj$-oRyBQvLXD4`9JQ3*;dh0YVCV}<(_3OmMq~zq3)YScM|6go2TdB;& zA=9CM3N06m|wVX@zSLpxm?lE@Hv(GA)6fyhwFF84 z!NFl+;jlS>-cndt)YsP!DjW{i-*2VSXs`v*-#-8hz!9>50f9h(L#?(Bk0*3@cMlE@ zf|#3|mzjCs>eZ{&)ioe`dwW~014&8AMx#lmJICY2!Qp=kDg+goOm=to*tBVrm)Ax} zO`%Zic01S<6da3)U}R-wwYQsFTig8nw)*(^*lad3*;gbIS5{Vrhi`9dYvc3d!O>_m z1_cG_^YWW~ktZ8m#vZy&@|tJMPo1KHWq+S=Oc>S~A&K){T_ zV1ia4NQAvwebQhs`1|{d#S+MslcTJu(ZJmg9g=~&LZN`Ny}Z1D1H>eews1HcI(=tn zXD3_`2x~NF^YZe6YEjV%v)SC-+!7KJvSSCmqM{-?dM_+GoqqA+rMkMh;^JcHR6xKR zsuoKpmmB*}g(sme+qO~D($YOWJ>k|;sZ^y>5s5@75~wN^hkbm=KtQk8Lxal8Pebd= z%1#M|nZOE|z@=!kFhHH3e{|oz)Tk(SWaJ*86dW7^NS{5ME-o$sI1LRA4u?Y~lfgJ~ zI9!oP1dW5anxCIfNDx$3R)vPr09{FmYGPsnIH#oSgJuDue}}M7%!`2OEXd_^&KjZyYeY*VP>~v6NR~&Wx<)<`nVjYJW%)8%rb!SQkvm&WL^};3 zg4Kl3!V;n_Ac+(akwb?@tOOEff`4JDUMjE0kOuMVN%bQHWQAl){5MXnp9cPn&Q=%8-(w-8;6s`mJJ7Sjlz~dq1(vwp^-8R-X|#LSUL-v8Qr>;ddSiw(TP%i zY1w*H)f#yZJ213xW=*AxethAE_I4`Qdv-2E*LjUp`}N8s&AIXL-*|sbJ`5H9G^73I z=Fz$6a*9apyRLV72WEZbm;Cb1btj5ow&SvF>PZ>r-tiYM*G_B}b!B|Dk~%wI_t3nS zM;bp8&yDB|%X>0mR$_sS^>cQD;9bGy@t)P$H_j-rs!8jSU&-GJu$LW-yUelhRm$1N zvpB`1HFx8XtuNHQW9Z5!p=+t4{ws{TWeQt4V{~leB#-K1nwrX4_vptE${+h5^i<$F zw%Ei^Q*?$e*WAi0nRHFeF51}>;e3=Z-24tE*PoCs zx&@@q7^a=70$=^fz8y+9KiH?Z|7d1a$^@aStN@#OyGdENXnYU1(3Q6Rv&`i?f~T0A z7t}iueR?-{*VN$m3$nb$TZ#wyg+-5V{P28iHMd#Q7+fKq{%)`KOo_I%sZ?7s+I?+2 hs!MOFt*IG1wgP3vu-1H~GGMzjN<*?)m-Cznaer zcd*CXBZM5d5o`g>?(poh+X3&|$D$5|-mT3v9YnGrDegvAskLvdU^((PM1ie1qFplrIO2yJb2Kn zzP`cD&5b}HY^O3BCwhDP6pG5Uv~(JcHZn4rosGfPzI}Me01Jrgbh^pONjx4O5D+L3 z#3d%4g!s_V(DCD;3gMqvPt-)Kq9F8;8U3`6u8Em&*leD6gdCERjg8tE+?BAkT>t0<+oN)ujV20)YsC zpq0g9fnTPkY~9^GVsSQbwYPt>vho!4gz|toCnr~>y4=^-7Znwil_ds{!os4?&Q3Df z0}6mr2L}hKRH{@eW3i5wm6g}l*2cudfV`l9LZRUCVjCJ%{{H@O3yDMm<(rzCq*5u1 z#RA?#{|&0Mv-7~fpjHZNB+>DIVpcQCRR8(A7cL}@^78cH6 z1cNwWiI^CkNF)MZ35D@NK@2ceZf-6JRZ*chbt(y30LFukLnFX`_aEkSz?UTj0$v=< z&9-&4wPeD`b_@y9+95F+g7av4Q!GLA7}>Ujv}hfvHdWI|Fb(^Nw1u=}lN}N?LwpNK zOg*oA)DqGb5%n;pNk}E`LF!GkgotX)B)|{@y+&wjp0p_-HmlIQm_bzAP*n7s5utZ3 zaoNX&CBJ^2v3D>3c4q%4I!X3WN)ztMpIrxL=FZ%nt{NbyeIJ}VhJF7-+hybI!qLob z_nw?+i_+&~75@5xH-$eM-I&EMUoKw6&8;!d8gvt>kqi2i+MNc4b-G&cw<*kFTVOawXApXywFu2_F^?)HQTV38(6NNnR##?->T`SIEfd(y%BCT zx?Nql-xNwChbLmn>-WBR^q))meSJ#mTTj zsHrLrZ7DbSGk0kjpFV%~%g;|JzUldAo_e(HZjVTJ|9#`pBXP^!K8$Hyn|`H9KNDZBpv;PH4mJ=|m( z&dJG5O-)m&RK>+5y}i8*Mr1?7H9VdW5b!}zP%!*7JUk4NLZM(7mXN>)=l1rF*jS!Y zc@FHIom~tD1C*g5BSxTmT{QSTTlD4(!+}zw;TwHG6Y;|{ccXoCGdtu>e z2o)AaGn>r>0)fko1!HS#D`YpBOd}&BSy`ttGNeMGaA4rp;GiKiGz{LVsw%VD0-m0p zULdvF8*o}%TSq2)L`O&O*|W!DvBbo1X*9a8uWxYhp_-Z+u!}_Ew6yff%1Wp+GgGco zmBq!yg9A9jsa&1~HEXrng9ih;ySwx9@&Qk1%E!kC!a`q6CR3qMP^ll1Nc*4*Z*Om@ zR0<_Q4NsoTu~;nV0#X2~P}0ehGP~VgQgWuhe}G6N0;FQGq@$ywrKJV(;&3=uS62WB zm}0Y|D=I2NLa2Z+0&%>MKg6GBT10EM#ZrbaizfJC^G2?=P3jD=RNI zH8q!)pHE6k24pT=xCppetyUm0KfmC?g9j9fe|Y#&04hCQ0MuYukU~)kI7CD+009<@ z4dWydi5eOjN=uah6pt4N(*>{x24cY7($bPlCQD3A0@i>aKqvNioGf6pfE0x<54lEz``8hl6yDj=~G5w9n8l0{tZTQrQmwB4bo`qV4-a~B4 z+O##rY{7j!Vi?+~4;PK^B9e6bL+zV3i&JUD-W4j6K6{sIRWva>e~6k z{7)AmhP-&J@MmZJvxZVW+OnBLvOYT9K6a-}dg{5e(S?JKDab)s!aZEuKF=>+*yf~x zoYBFBzd9cmUJ!ou8*@_dT7BK7?~%zG3_o!ukw1(5 l`c9OR^m#0ExAR=16UzCXu6*+o2f@D+!=STiJ)!A}e*hze7`p%f diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_3.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_3.png deleted file mode 100755 index d872b50875495e5907e0958f7518fc31f417fb6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1294 zcmZWnYfw{16kcsd5v7hg1p^U@CMIG~9@<>MIHM%O1rtI@K;B6;4Iz@CfP$^YhKGO% zNl-##q{u*!@KAXsAxW)HAuVWUC={iHKPdIlaXJp|bcDv9PJedi-raL|&wlrO-}$O} z+*luPe{Y144<5(j!@3h*g4YKy*Dgw15L&I}9TTwMzki>Sl6w4jT1G~u@BhYu1D}M4 zhhMy?;_;F!7OPB_hvV^()z{Z=Fx-Fu$MK+`AP9M0n_u$}AQW76dTUu^Ga%gBMjkX)m zZr|<%rVfWAIC#&sYuE1Fxx-?yB@#(pU0qI&sHCJ6YKCOU6be%u4kri&AbELmK0jHb z(L_Z>`}z4DIT8a8lX+-l#11%6TS!QVR;vT1XU-H7i9`;E)7sh!5&=^vi9*>$rP5BF z%I9(u0lBlYGdEXOTU!gFDV0hn7+O$XUar$MBqSuXw6yHsf8gG|KHv-glFQ}s@d;|R zIwB(C;6WytOom?2>Ga0N#_sN(;^MO}Uc3YaRH{qO&0hxu1OQFw0_X|)^z`&7l?7Q@ z*-R!A1OW)uzUPy*I&GgaWpQJN-Tumg(TM8e^6^NvBzqKHX=U*gvF{FRD0zrqI zjGnc&O(L{v0B0Q*l+2zGZQUyBef3$cUbESEAAu-Ip;NV^-49(=-S_uJg%zAm9yf$E z3_X4#9C2Y!cai&fhIRPW_WB1)og=+jv!B13o9_Cxj`+>M$w(^=w~y?TYWexrNy?-k}v&2~@l1ZjD%+g7~r;e?Q}aXe2^-$&TtY1bRa#r1?t`{{K*%=YJO zFpvICe6UNyybwCB2<-O0WUi(?DO_bn77i^ zd5;61l)jr#-(c)BzBD@iJhgl*b}jqS)Q)FMTe_4z(?jQfdAcq7u_6Og5iVcp(^l(l zZ`he0HMK_~k%|{YC&bd{6Pr>O_SR2GPPP?hBQ$j@R!n3p)I%!~&gQaukBHR&044z; A6951J diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_4.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_4.png deleted file mode 100755 index de5a3a4963ceddbfbd1bbce5f7c46b4eb9170b55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmY+Cc~Fx_7{(WMD$>DmL<__Ki3AglVgQjq4MQaX!Vw@4Ae;fEA;ctXo;2%9u%045jrD<(6{xk?##FQz3;xe`|NL@>ru>L zOACwzLdcR4LSw<`2%oL_Ug)b|^5h8Zsfr4ZrSIK@aByf_Fl0W)?OHEBXdp0mH zFCWqj27^uyYHj@*hr>gt)sB-$BnBhY*Vk`kWHcrwmP{sVG}^(zA+>r83WkU8!SeL< z3~%q#5SEsf6&GLW>FLGca1auSL<|OFYl|r_FQ-r_kg2b4fcpQ6t(8h8Wb*S1oSj|9 z$H(v7>4sHNQPE1J3i9#s2`w$R`21}67m378P0b!29`Eze(`a<)u~@r-fq}6xje~dAzKyt}YOqoh=}doIxiZkB1%V>+9um zMPy{8wYBxsl+MlV*>PH}*3;7y3Z`IMr*m;}9UWCSHa0>AjsOmm zlao0)p98n@@(Q>w>;TQl>BOm1-mR^z-QC?pA}K5^Od`1n1$}*eKtLc6$mR0f+&n7P zA2h>0XU=fa6}jUb%2V zNTpJN>ak2lmlxa=2n-Dk zySce>x#_^Xvhq4W3knJbVxFE}LZJ|xFflP%Sa=aogoH3|+^7N?6pC+2$+eA*jl{$x z@Dh*516H-QbrBKFnVA`|7C`gyp~S|r;Vr-w0Q}muQVu5(UK2>ZH{s^~wRhmoqI?!J z21aCR(HRXYWbT9{GGs2;+IBKWNJY>g34##uje6;Lity+5nHdl= zQ!;3u#uhz2$F;HHx-2`}9a>Uke70gIwo;v!eZTf_wz3!J<)bQM>>A%CT|PMAKbT(= zcvYm0?8I70FdpAXYJ~gU*PdSd{b7?U@3h17(JbN3X3sI9g;g@6_^0XaidSmvgxTKs z0a=z|V(e6So2`--I{a>Vq$yruv_2WYj%c6eTlxg6MXPUI$&T)GnqsqzUvB+4bJ$HD zI&DdG2u`^7YHRa{s1NI&9ePuCcS$Te;PWDAz2RrFw@-iSul<&6t20Z-lfNrlmAXHe zU(~3nNA8{&-ytn}k7D0SlMp8oaM zeVpGih-P&sqh|`<7CQEft8XhV2TC!KskXioW8 fjfIzu?TXAA-LIl6F1i1i^sieObSAC;EVtwz2mTR{ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_5.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_5.png deleted file mode 100755 index d9029cd0d7bd1bdab38bc5255385ef819a933469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1287 zcmYjPeNfVO82?sxWp!SERA59Z1&N9~Um`(emf;JMh=At1P&q^rC||z_S$zwg^~zt87+KA)$K%ZYX0 zhTDb^a%aUcd9WXVZ;#t1SQ}o6I}qBa;vN@7udlDCq?|}iO~YU?85xp_fLZMMuYYdU{GE`H&hN9mC;pg@r}g**VqK)i&EW zixpp0bp=vZtL@UIGA1(`&hSgm$I#>P`^LtsQBlX>5dx5Xef_$+x|^ERa3zz;RO;b9 zdvI`ugG?q*OiVm+A{DL{%ZNyHvZ$z7r)vW)t+sW1d>r0CW#Mr1X0w-<7o>oc%S{3b zu{aNd!P;y#vw1i-H`in`DV3#UvhR%>H*#`>-QC@G`xFGU04&MLDLfvZ#bN;zg%Z%z z)HE_O3f0=}b{`)fIz4Q1a=yr4(%i)B!EhL_wEJQ z_;@zBU^MnmOiaqi$efjx4P94NRmtTFsZ{FYLk6<~0s=ZZI-q``Py{N0 zZZR>j_4QZN(=%Ky7mY@TWw<$rN=nX)#bTXKmyp1L zA$j!Z5zH0H8yZRj5n#Fmg5-jNg5~99urDnw9sB|pDl4l%@K1BtseCAc0aX_9IDFV$ zXlhOSR*K%j{A!%UHCMaFibzxKZtV`~Dnfb*azm?AG%b=4WfHASw&J#GMNUMdxgpe! zXfy(H=+}^b1rbR+f(ET2f)(*vBx@SLZb68ItPYYxidyt8LW|RhWUEqO^15P)LukVw zi+NO_e0oag;qi>9C$;i%-vt;&P0zIkA=dHYfuq)V{~I!?Z_Hfq;BNAk`GSn#X~s-o zDDCm(t*pj`(<^V?e;dgD<>JchAJg-P_t^)Pk`|-cqV(9A$>K5pUaoX+)XN^+zd5aU z;^~@s>GVeaeuE{iY`xxJ_^b4YVs~f$Q)Z&SmA-*mqsp%KP`uvkcI3yfu|D<;)@`UzgC`H zG~i6*ZxqxmoXl~>v;D_^ejo5Xmx^gK%`!Lp%QGv@|Ge2%-lwK-X_@+R$=c|-KTfQ@t>v;GJ`b5Fxkb-pocgS-RXto&ipL&E51XNg#JR78FNI&^ l&RbG`_jisqh)#DEW+PONiJ>g)@QMX*5i6R*9EcKD{0G~98nplb diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_6.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_6.png deleted file mode 100755 index 63f43aec2d2ff218b8b5d96fa065a99fb3ac5f39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1290 zcmZXSdrZ?;6vwagg*c{}n@FiZwY3EcK`Nslode6GAf=S@5ClPkrTsx$Xhoa@OexP{ zhaK{$%vK_OKzWMLA~eRRlngZ?(@sp?bQ$7sP6@b-G1!^>xtsj%{rzr!=bZ27drl39 z9p&PTb4Cccu%ekFGze|8Gg9vh3{R z_4OBqhRn^)Edqhi>-`E3Kcv&?S*)0dh{&Fvp2S3+mlq*3^O(V4gdG0<{;QcvOUvkV zxPsS#SSCA#$M1A=!|mI*4=(%ruT@r7LO8s8dV0cVN=oW#hSeR1 z!;OrLczgR;EW^FMeH01>er7Tw1_y_Rhlk_i<3Yy2!1Y6in5%(gG8qD)=*5eTX0yd= zwO+qID3KJny1KGhtkKa?xFHY-98LnnS}c}?1TLSSTU>m`!@~nK>vTFQ)wiLcp}xKz zSOC_?XYa9NSx_P=DH)VQT`o5fVwFl|KtRCu?XFNxD8$;^+bI-pNUzmi2?;q692`Tic1o#Y4F)^_~IyN>I8p;50hr>}JRT2vRH|=@L?VO15Q`=xElB8zW#Euoo4bRw}b%W&&Jh)xu=BBwd0Ry(3EHQ7|QRt(J{fu100wFxldq8?f4 zNae&Onr%&JSuY|rVaP04Mk)fAgv^Ue$c*g7_nDT_k{xkXh)Za~^dtgmzNgXEAhhNh ziy6i%o;s1WW5>@~cQDOyijGP;nt9u`$B=n9@3yVliMT* ziMST>xZ>*FVB7H%W4iBOZ1Fr$@^bQJdDQ(s{n9%2KDeWqSeNoV{YSGT_Vkmtm;5Ea zPWCO1p8aQ+xg|TsGW0g+K@Ak)vGH!hJ_I84y;%{-S`HP1Jzw|Skrt95P#7{%Z+@?EbpM0Vf_Mgm9 zcv~bV>^1ID*+Nm~PmL&PTgH&*mFX#CqMd!y%paP9(4AH}XYIi3Z|662UcbI4=LCMK zfA*|!TiXWVJl9Ly=uY~-sbyPjU8IxgMMca+W@ zURjvsKj0m1m32$c5B9~FGBy-0dT*_E78yciqA{hk>XBd1NhysM_~yf{d}eGFZkhVZ rgwMm9UQrkOCqI51t~A!w$?k7PJ${jE4u-AQ{5LwR2sX1jJWKvBgO(xB diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_7.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_7.png deleted file mode 100755 index b9be24e47fc07156bf67288415513bb432a12bff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1256 zcmYjQYfO`86n;fbIx-m1NTGB{InVoi*W=jd ztt@et2q7zG6oUi13q1CiqYxWk@Kp#|)Wm(rjW|3!OiD^lNlCT+-%3x=KE@wzgORw6?ZQOiYfAjX63xIy*a8R8&eNC2*dcoH8^t zTwPr=JF9zBb!KLkP7ewT3%_@797-i5a3SjT20uT)H~5kgDIWhW)X`SY%mxEf`Z!G+K!If0Csl%7XS%^5#i+I1PLr)0x>8k7^1yB zjz**D_4?TVR(bhl3Wd_&uXcC$Fq_Q<1wxHR3yE5-hVEptH;iL4nTv`(PE1TvsXoun z=1ot}m`o;M4%Oo0IY0v#*4AEgb8~~C;E>PH*Jv~_drM18Q&SU%lc3Y-Jw3gkAr^}r z7#Iu>XXNJQ8jW+Ip=XPWCEniNF#GuUL{CpIz|NfU@9gXx92{(JRtSYc2M347#>Td` zHed*RVq#*T7m-MWMo=vzBs4!?0P0m%UL77D>FetQm8z?&6^dJKZtl_10It1ssSrA{ zSS-*`DlKKRW5r^zOeTYS#N+Wm9tf*cDk_x<8j?t^BO@c3nOS5q8RUgwLqkKw;v$%$ zuI{=_Rs}Myudhc%F+qXI$nzjzeSHIumy?#3E|=e=(deb6Wnc^#5blUVp@Nb4d_IfC z2I;^yTy7$WwzIPn7)S$C6&4nP)Tyay;E<}SYVaQD4ED3!rZ0dm%S$-y1lZTj2ivG) zMX(P!M!CWf9ViZTD*_CO2*((qnS_W+q!qRk5uz?;WhsL(+WAhQVmfbI5nBt#?~QNdY3gvA3IX@6ITkQVI=*Ez^II@ycRkxnM#18(`+ zMV_4xS>Uk^LmwEv+vDVt=9t%Ou9Ao?JsE#^Z(cdBsIhnx>+u1dEPYUH(RiDLRW2f*mn_J&5 zSSR$Q>8||zz`y-{h4FM1Vk}R*g`*Tn7+nEQMvUKvrCkQk diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_8.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_8.png deleted file mode 100755 index 2237f09cbc3123d84fbb72a7cd6cd11c26aafe28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1300 zcmY+Cc}&x17{_17GSNwvEeco|(9ufe&{D*fqa*?a3Tr8)rQD~amI|%PQR5;GI}QZ~ z1qBO8AyN)o0kzN~?GP0jlx}k>;mlYRsRs#%OLQE27XI2V`Mt;UKJW8B-_P@uv6!J& zyD_^FLRR#!U^dLo@b9;@fU$gmuR!RtYS#B0+Sb-qObjnJHZCC{(fa@2;NTz_ z9UL4E9&{yCmCF8pt)ru(R;vRCPft&XcIC=d zcXtoiR#jCG3=Du9j~5I6bb9!9khHY)GiP#Htf<`FJh1HFkFmG^7JT5jZ3hB@0E-(p z+H7oW3+1*W;9%O#n<^I<7Z8<|CDiK;;9pr;85kIpl9F0gRTUM*Zfk3UZBS6KM$@O$=^z;{ zH%6go>FDTmb#<$*mi6}Drcwg{#mSS|MMXsbL7`BHL?RCl4;L2#NY2a42T#ywZ*R|F zFj`w%Aru~eptG|RREtDnkO2J4%gdiWead7;f&@rjrBa_heFid5N=mk~vx|s`0KMVi z5l{jzFR!at0i(OWKUF5H0ckiK?)vp+p-@PrQVR<&NTpJMeBy-Q$PsU~S`Enq?fm=# zP(3<2nwpvhWPmVGijPkS3!@hmT`Vmv3keAYr4)+Ky?cWsk{8tR(xuCMJ|9XC5H4Pn zLOU%knxQ}p1{3%I95R_wS@|=E!v)CDX|uDla=CnMZ7n-HJ1#CBss^mKTQP9Ns}p)u zlFMdB!;EGPn=AE3%SNOXAj&2}GD`!JAw13!31%lIkg!pJGqO>mVZ9!;YwOS^66R1g zaqa6lb;uGS{5l2Y7~4N#>xBY*-MUuRxPq_{6$_!XIqef@#rO%;$tG|JvDt`?hcn?U zdRRU44xt?b^x$J0$y7$Ft!?Tp)lCn_Z)y?`EF`&BIlr_WdpBk*RVfGozoo~&mRjB8 zz3=kl^bS!>?(QUpY!|(v{4hUrqvcCpf3rdIe(I4&Nq3*BvFi~3aO3#rJa+w@<|L0X zy_`T4Z%mnA*^xi}GwJ!DHtcP;-vn{hH}>zBy%|LAhEU}`zfijNF5m~N^r2S`WYKjk zipo3nczMsx4w-*bSxL)_M7@vs<#V?>h4qp)GYN4Y=(S&E?PiVtp3r}&>4NUfh{L`P z`ID&{@#xYor;l%qKPJvqP|H}}oqrSzJ-64LH9y>^m9L(owq)(?ODWlv{Kcf^;{umZ zFdabaz^E^aGb-o&caq-PKI>{y-)DL2c1)Xso+oP0nrB|Q@f6`quAgvdIJ8w~p$A(QKrs1(P%(%0u*)eL^81{M)p*@U{(GT-G9slbfI*l28D=@X_ EU*exB?f?J) diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_9.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_9.png deleted file mode 100755 index 19c14677f8d721abb3353cd98674e49f93af2f27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1294 zcmY*XdrZ?;6uxLom>bzc2M9%4X>Db#Ew51+H5s&Oi!Ioemp~~xR!gNIg$jbO)l!vV zfsRKl1S^Aj0qs_>iutnpB8B8olB2Go(62i=Mtn3*6+D(4Hd++(~J@@;*bFRem zj(F_!*@+PHU>{}jVGe+AkNbA`SN$O|BD75#e@w{Q+}un|OiE5pNli`j{QpoW3Ybim z!O�jjGiZ0GdoD8jU8G=Z=in%F4>e#>VJ$dRW+}CX*RZ7VGfD#Kcw(SjWZ1jgF3q zL>VzLOd^puI5@NgvDq959yk!#*Jp*h!^0y|Y4)ByK7iKOH()S+SS&UuD2PNNL8Ps% z-N)xGgvH|ER%YhOq@-ln*3{G%6cp<9*8~C~WR8xG0X`51)ZgD9GIV$Mz!t{dy?X-# zKgr8Go0XL%k(?%x4rFJ``uhiPI9yRt@zBt4dwY9ALgMJ?sHdkFoCn%uG6h(9d3o9G z_KXa%-R?MkoF5ta8F1_9=mZDgIvk6Lh}3Ge@U+9>;PVAWFHIeR15|qH#ZkFf`@9g8rZhBw)Xb+0#9FG-}3UW^79qx=^`SLgu!4yT~rjKv$K;- zChK(Ha=BcnLRD22j~54?gVlIE9y|;Q2?2ptYd=s08^N5Gmg_Q^jKhfq$zpLPC|y`s zIDGiXi4&<{+R>vxpIuq`4QNy<&w*Z*>LQ&UVK5lR$0sgdz5=R)gF~jKroc}wmj}HB zrb#3ct+sl7eI2ZO_U!r0%nURblrKD-E)*u@%=!2hj247YzEh6XJv z;PV79BZo`Bu;z}M%}BR_=JZl}v%3T7rs)KPWQae#;4a%ROYz8oHl!~4T;m(LzS)MF z5gso`bmWfSm=Th%;ihe<5fN}m=RyQN!ton7kV^(Jz8Njdt?3AJcqyctMlNKN;}Aym z2;O!ZVKYA$7R{d$dwXN|QQLZ(Ma#8;a)Tt}j_m2w>d(`cd$6schlWo@zv$Y2p(OET zNA`WHmGbU8LUA%Vio zZOSKq&!>-<{@bh1_x-RPK zV%d7Zy}w>~#ZlAdN;2P^r!wljZ>BA;?^=54=bYI1rQ)hD6=N7^Q~l<=b)Vbq{Q5(R wpU*9;wNKHP-#5_L$%#$g9r;s5NbpPq6(OaFHTAJY$9vm8Y!;7sGg_?r52^(rTmS$7 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_blue.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_blue.png deleted file mode 100755 index 2721ea968a84bf577cb0fa93b2050b682876a569..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI13?%1G+4BcTv7|ftIx;YR|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dcn7T^=&8hqpwkf|ln{2oX#l?3?( z|7Uo*-M|aT3-NSu45_$v<&q&Eg8~QhflvSatvwp1c|^QT+2P2Va9+WGo|}eZlZvMH zRe?k0VMcZ5RVQj#oa~>oYe%hDx4wU`)UDIO4=a6x!=l&qM&4#tIxCpK;J1r$qvf}G R8bI?IJYD@<);T3K0RRz=N^JlD diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_green.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_green.png deleted file mode 100755 index 8e3260d509aa1b6b29e32c3bb2abc1cd240de7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI13?%1G+4BcTv7|ftIx;YR|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dcn7T^=&nzPRp$h?`8F$G95l?3?( z|7Uo*-M|aT3-NSu45_$v<&q&Eg8~QhflvSatvwp1c|^QT+2P2Va9+WGo|}eZlZvMH zRe?k0VMcZ5RVQj#oa~>oYe%hDx4wU`)UDIO4=a6x!=l&qM&4#tIxCpK;J1r$qvf}G R8bI?IJYD@<);T3K0RSE@N{9de diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_info.png deleted file mode 100755 index 903b04aa3b77272df92bd16f55490e84b6e63a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1335 zcmX|94N#J29Dl0Yv|4kQyO~G|iSuJxsga;jTYeIO2!3RSVjm*}!O}|8vLiD~Gei<2 zYUCF|kWq$Uz};Bev0AgdYnFy{JF~7UO}(0D9PPh(+jIB)pXYtw|MR@RuTxA$>ar!6 zB?zHq)U+fPtidq-y%#}k80V=GTG-Cqnwk9J!-wqboNe23zxa3LA6LvZb?i`vfJ%7H7D}(3zW(W>FMdcy=FE$v!H-`^{O6+!}C$&tES5&2>GcK>ML8=IY-k=f(jYWE;CDDyVMS-y;f+)kDTiTG~(piDt<5)cw7Skq87c)klEXmAc9 zg$S9QW;_eI@gXDv@_1G!+vo@_xJOO;CbN8K7k9-9>78)haz9bT<)WR~EMc(I@JrE8 z&N{uCiPKmMT|;LQ#sha4dyDqvwjAARy-oI&VMZRy&vPm@lN&2Mch3amFjOv1^wr?J z`w_XS#n+O;ZN_(_@(GR)cXaN|OtTO6O*3uRiSWhpd?vYja&FOXlu0aZl5Tpcx0`TwadKzg7!v)z3#PM^Z&W?321FzH$n6j8AZ`W2BVc33TeVMjS*tq04w|U8Wy* z7!q*AuiuP%C~9TGq3)Ff$8<(g#Y+A7_xInIGVedJaF***p5I+mr}R2Bk@#rG!rQ!l z?YEpON~`4JAg(A-bzE0b;`O5YWj*`i58OX?kqh4v8%8Ti-v9Y7{-k%SQuad0R*2iR zBzxJw$8mvCTjRw+}q^iX4~y$m?kb(U$Xk zO{r1wv(G>xW7CNLZ?&&)p3SFJ&Axp2jCPpx$%g&Ud?i1wcsOv`^m#%+>{73#u>qBJ k?QCtEA&n3md~s$WTCi&C+tdfvVu%HzCNq+*ZRSe;1{}#f#sB~S diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_menu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_menu.png deleted file mode 100755 index 7986ed84619bb42c56f5e5f335ac1244f5c379cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1370 zcmY*YX;70_6n*NC0uDO19nlyF5olN)1Sw$^Aps+1F@(JYXp0cCunV*xlqD6UA%s? zLY9=HBqp48@a;9*27ArpR4GDR#~8<1#F>Qg5A^8bNTWWwOYM*FD5uR zWME)$_iihNVzQ#5QXt3xht$+GrBVsT>C+{!+uGVXIXO>GPKm{J@C#|-COSGMJ)L{- z;6b5KNFtG;?gz9gmCD!GPbmBzVgYbV%Q@%{qF_m-KdMw}D=RC2bm9aP06_1Nkx{+9 zeSl|bYO1@thd?06WU}PsF9BF)X4c5aC?1c8SO(*SOePNrA=%pEU0vNcoOB9>QczF` zFdQA7CMPGMdUkfsg$ozBTrN06r{Uq@(DKmGkVH}sthTqe69|q00fB%Y;E6=FTCKLC zqQcG14Kg$}H61-lDJd!S_YWv5E9>j)b9HqEQFJ;TREI)59)EOntfQk-um5dkW~RKn zV&A@fz`UoYXGTT_Fk^3T&*uxMR4Ql(2=nqzK^KP(dDYa^1OxdBvMk9~MTUl8F!eQP_ zCX=@}v9z=_Ha70<+qd=g4L~4B03!-Bnr!2q+G<85;mhPWV?NsEAULA};uLS|-W zM%0Fog914q`34ao6Br6Kt1(Fg64cg$?AzKT3Z`0ML~Bernney8GY)r_!xhMp0HJ0L zT9a@Ta{LA&E;Qr0&D>cg2a=nJEgB=TZ?-oPk^22BLdYJEH;(>eSB}t@MGEN%t6=V{ zq&<7Y%iWwk&$@W6;`7*D`%`~$xw)j%oEenf(j3l8_;aK3CqF&^@K|41oW^J5{(wwk9D=);{;`)9H3U?;TkG3FWYMMs$fGG`~o4&whF<=T5xdzw*0x`3E9jEOsWh zPj88kaM+9LB*VXQ4eCwT?->19;p6;CK2B-))O!BstcNujJ6Kgmp7qPF(>vM4uU`Gp z6&Cc!SzP?`^$Yo%C-aYQmiI4lV+_lycjRHXz~byTH|yoLue%7fxWmQ1&wr&@_hPP_ zyL8MKZM?!Tw02T!x*$;4Us&|$>q9Im_zU#CTNtxp#%Uzhu|I4^uxYMRht>!3 z_v-G@`_32rKAmzykf6wXe!rWXx3bZ{v^9%tQIqzRvA_C<%5#nFjpr)0fe)M$?~;fe cb#=PJEhvb_#15=ih~CRiA=5|~gOkes1F%t9^8f$< diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_red.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_red.png deleted file mode 100755 index 3b7a0525b11dee8cbee4ec1ba836b35774c4a241..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI13?%1G+4BcTv7|ftIx;YR|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dcn7T^=&I!{dj$jsTXI}J!Nl?3?( z|7Uo*-M|aT3-NSu45_$v<&q&Eg8~QhflvSatvwp1c|^QT+2P2Va9+WGo|}eZlZvMH zRe?k0VMcZ5RVQj#oa~>oYe%hDx4wU`)UDIO4=a6x!=l&qM&4#tIxCpK;J1r$qvf}G R8bI?IJYD@<);T3K0RY(LN&x@> diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_text.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_text.png deleted file mode 100755 index 8e91a128755045629559cfdcb8246ff961fcf62e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UaY|exN`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%wFLNtxc>kDf9A}YX=!Q3#>Qb`;a9I-UA1a;LqlU|XqcFo zn7X=#wY818xkX4wXi!jaKtQ0Em$!?HYgt)&e0)MwRCIWF#FZ;o_wC!ib?dgJOP4KJ zu&}MIy}rKT%a<>&UcI`1|NgaW*G`=}wSN8jDO0BO^z;-I6y)UO=;-JuDJe-yON)z( z10C>t!>x3ndvr>I{DOg8VgbYPYn(j{42*i7E{-7;xAt5*Sk$Z_z?QIRL&qYG4A-@u z!h*@a{=E;M$eX!+h=eHzFgx{H(q(U*c^ML&mJ|W!Em`w5?k_S2AYaj9(X| zGMPhntvGP%`?~0vQQNPq;`$x3bW>1YznlD-9|~fkEU)rRN*p_{7p@XAzdXZ1SiEMP z)O%jG3GaRwKDn3Ewo!)RY6B;uM8R$86x|8B7n<~s1w38nCX&oFUGH|>ZY~yg*Bvvy zZ~Vfh_#~qH$<-yUduAA}*t1e|YsA;vf3I@X#q{ht^Q8C4hRwFNvo+?Y*-saExmSGS zI~MEodo1>M)AYM+{(iKv5UNT0UhX%^raMgO^kMCf|3%yGPZjn&bK}+h$DQIkPh8UQ zGM*@IW4BTLx3TR|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dcn7T^=&`s9f?kZGauE(u66l?3?( z|7Uo*-M|aT3-NSu45_$v<&q&Eg8~QhflvSatvwp1c|^QT+2P2Va9+WGo|}eZlZvMH zRe?k0VMcZ5RVQj#oa~>oYe%hDx4wU`)UDIO4=a6x!=l&qM&4#tIxCpK;J1r$qvf}G R8bI?IJYD@<);T3K0RRw`N@oB7 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red-big.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red-big.png deleted file mode 100755 index 7436673304e1665f619a9cd29e680365ed199ff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmeAS@N?(olHy`uVBq!ia0vp^CxBRkgBeKn9CFnIQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%Jqhp$ab;m(=vPyoq^8Wt!oteP zD8Rv9siK&yBsW!6Syq5IRY~4UR;ou$xl~2LKun}uRgr_4*-u`&T2;|VOhlZUt4&p@ zTt%@#RVh+IHd;}(NmXgGnsSVytg?_mpuBXbybL!hs}KhVKRa88s#2zsyf7Dsvy7yt ztdy>paEyYi5GO~Us&bKvLbkGen1XDJno^Fke1WopydYnIytINKzmJ@>jik7{jHIKq zM7V-Xmzt6&7iYbSqMn#Yu)MU1xM+!rf|8Jcsf1{Oih{PNu$r)-6fX}O6O$Al&vZ3q zP!KUN>{`&z1f+aQg8YL2Qx7oA>wR*Dfq`+pr;B4q#jQ6pGlQEQc-jv0E@fS^ZQHeL zRrkNwhONDR=>LEFw3iW)Iddm&+?9Any==2VWyNN9hNLYWa~dx^;+Y`L{E4@H@SUb6r6izZbS_yQD7|Ntilq**=+8Z7uIV-8sA#!3?FK=$y+>m>m)mLqV zbGSIp{=O2s!6sl);kIjcy!CWvb(K`S`Fq&$@xDXRdae_etIRg4d?vtRX!y?W*3|=j z%vB1xJhw%j&9rNdUH`;E&mhbHOK5A%Vy33```2{u6Tc%}o29Vp>H2(?MMXW& z)rFSbv-_N#zP*+Aci^Y<+{t^Emj(IdUVZI(_goZzNcOjHsk<)4T1|^?UVkjh{grjw zBes_Pixj%HKWtxie-G!9NlbMiwn1HgnlD7oQRUxe(IxV%KeW(+%TeffJ`)c^htN|F T#bf=SKuN*V)z4*}Q$iB}x|&`x diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red.png deleted file mode 100755 index e80dba26a2abf55ef56be9f858a39f36b869348f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601 zcmeAS@N?(olHy`uVBq!ia0vp^O+c*9!3-q7@FYwEQjEnx?oJHr&dIz4ayAC|gt+cV z<^?jD7#LU>8QB;a*_oKQnVEQ*nFU#xg;`icSXsnaStZz5rPx?y*xBUR*%Ua~G`To* zxjFT?IgNO@OnA91c)6|kc&zz&?D=^e1$bQr`8)*qy@dD!gav{`1VcmwW5tBy#f6h4 zL^32rvm{0Hq{IrO#S5jyOJyX=WhE+QCFReqML{2Vofd1?yZR!GkU`J^PsFPOpM*^M+1C&}C0g`tC0)&t1lEbxdd zW?@YLOD9$MIsK0{b4?&-@OqSjci#euU z=lxwbkN==ltYcPOs?&z4WasncUoV2^>xj?1*T1IKR$D} h-QV#dasRt2rmH`!?{2#2b`uz644$rjF6*2UngBY>y^;U` diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_left_arrow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_left_arrow.png deleted file mode 100755 index 5f18c6a98b42daf4106baa4d81a3f66618ca4527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+S!VC(K#9UVa>QWZRN6Vp?JQWH}u3s0un02Oft_=LD#IJR+eLnM%AxX%n^1#?M| zU-19`4A)Qb0u5wH@N{tuskpV~k|W;%1rC>s@$c(jEZg{Ki@}a>QWZRN6Vp?JQWH}u3s0un02Oft_=LD#IJR+eLnM%AxX%n^1#?M| zU-19`4A)Qb0u5wH@N{tuskpV~k|W;%1rC>s@$c(jEZcZ!i^ZCfc6}|To~`S4Dm~l0 z)}ukj_oBDbq61wkKfK$}=-HpLNaZi9;9l;fN)-=R+$c9P|35!)_S8qOo@L+tvixPH iG5gs!Z=SssOJHEPW&Zla`X(FDE(T9mKbLh*2~7a|3R
  • C)W!-HnweL$_E|Urf3UE*mSY5%Le2po-mN9IVY5t{2~BEze;!^Ak&g? zC35jOsnTmJHoMI=Ju}zT;`Nb^gEyKoWY@f1>v+pbc1iBfgEv1jGF-XKvF^qTyI(*% O89ZJ6T-G@yGywo~BwCyR diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39p.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39p.png deleted file mode 100755 index 184aec2b6296fdd600f944d609dbf50f0a7eee02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!)j61fWRq~K0gz%zcl32+U|4^`oVDvEkS|%{ z8c`CQpH@&>l=yoU{VTpgo?7XLNp zWBtw-yJR=JZ-GL{-y7BIJ^pHhIl9`4=&oxPwLJdyV)FGFOGUNSSMgmxBRa9!W%*7QJBQ7SoB?kiZEh4+??U2b)yEB&+v^gujBPuPwZK(<i6AKdzYyH3)N`m}?862M7NCW9k@^*J&=wOxg0CG4B zJR*x37`TN&n2}-D90{Nxdx@v7EBj4WQ64U95gYRWpisW2i(^Q{;kP#y3N| zIN-=45?ay0(0+7py)%=|bh{@Fk%q#KuP5%Bl(sc?(%e_Yo_{yDMt&}RwIcC)(dspI zYc^`C+h3b-%78~qCt^dw!6sI2DC2AM)1L}H{k<>m8|`ge_WsIell|uocWeKvU(p1# On!(f6&t;ucLK6VvBwjfH diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_43p.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_43p.png deleted file mode 100755 index d59bdcb293fbccfa6a6757aa03f8acb8ffdb2c8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!wON>fq=DiJFCfKO9OUlAu(Rpzv7AClNZSV)_DGBlmW^j0RBMrn!@^*J&=wOxg z0CG4BJR*x37`TN&n2}-D90{Nxdx@v7EBj4WUPdP6pg$*dfkLI8E{-7)hu_{@DA-^i z!g5iV$8HG|TO*&Sf+k~Uk6R!^OT5{X!ldm@%ik|q*A|&OHD&p)*r5MvZ)#33zo=W`cm;Ha+DvK{otlVNc5gS;*WCACMop4YHOg5>4*iEe7VDk0+jW!2zOXVKi zn^*Sz)UIB(UG1fA%+EA*SDlwRdg0~C3nyFF*)FW+Heg_R*SyR`DBuXlGoG$~F6*2U FngGr6fsz0K diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48px.png deleted file mode 100755 index 792a677d33a4aa37d8a7d80cdc1fb071c41af227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3347 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72p.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72p.png deleted file mode 100755 index a89abe0e74aebc8559d97f1a7dadc5924431908f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Jvf+wWc5ai{XmK(-O<;Pfnog#bJnhxK)z&& zYeY$Kep*R+Vo@rCV@iHfs)A>3VtQ&&YGO)d;mK4Rpd#r2pAgs06T&1!cxqCttCFmb z&WqdBA9iA40#FhNB;*b_11ZjuAiv=MP{0uEUm*k(Jm~4-7*cWT%^gENW#c1izc}& zUy~ckx4Jy)_w7}WE^v$KL~KYnC(R6*<}R&OxLJq^SLDu9p?V0Od?7Kj#3WR1Vl zbq?FEJy&o(S7=rEwcMOF)e-4AXL@40Ul}K-D||fZu;}I4Z(p88H!w1si}EnFxWj1& O@~Nk*pUXO@geCx%3x<^d diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72px.png deleted file mode 100755 index f953fd3f29b7db748841014c57370c68860d8d6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 683 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Jvi8aq)+~dULeJi?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|S$-r;B4q#jQ6t_Ipn$lsWM6 zy={3*O!@EpUC)w(M9&M&1kk41t3OH(t<~wUmjQsaYvt zmXpQik`sL#Yu_o${*b>TyeIDR=bHC3?GDdAU(3Ck+gS6A?%J;*?0xn&_1~WKF5Fk7 z$yjpnTVD46ufNY8eYRbGyVT{c^9#c|61FB^wKt8sEu^K;|1c^pQa;Z;d-;VOG4C^v zzp6g+>cNBZs&AiyXVrhwGu{7grpN`+s|USi&6V*LPF7wSamMQ6E8U~_5BRNFcdt?> z#NoPY`@8e|tzzcM+3uLMDDdJcop);G zlu?6CUZm{ILWcj`2boy79X2o=WD?K;5@0q9H<&G;0~9At(qTgn110)lHXr=8+$zG5 zSE0Obo96FLmwyTKZ=SqZjrob+a^H)q-kfbed$eMvg!IN##+|p#J{Hi(lS5+YJn{OQ1M-d;D4Jp;w1|W<^K6 zo-egNm-p*bZ#UK_o=37OQ)_n^#@@HwQ_|o5&GG$ZacS<4iv<}gIYLb|Z;AAFZQjqs a!*J}~;(7ayzBC1{uKbLh*2~7Y>KpqzW diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/yellow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/yellow.png deleted file mode 100755 index 81031c08323de9b80265822ebb7bc36c2efd1f9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601 zcmV-f0;c_mP)Px#u~1A@MXX^B000030{{gD0SE{I3kv}d5CRhu0vH$q8yf>29s?jC10y2@CMELi!L?75SvEI>tGdABShHLQ=Wapw?d7OAVTSD z?y;msSYXfc*E|B;s1YWJ;49C0034_hd_-6)Z-iAyjgS-Z5WFo{3@4X-GzDTXOhrgq z1Nh-MN npf!R<`11>f-?->uzwUYh)%ZKzve8D_00000NkvXXu0mjfGJ@DS diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/Thumbs.db b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/Thumbs.db deleted file mode 100755 index c0439941c50baeab3d970c0b3d76220607feb534..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7680 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/cz.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/cz.png deleted file mode 100755 index 00d0bd2f03a0e174cbdebfbd12f99ec864aaa062..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3855 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 LlSesHhTi`NI0%hk diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/de.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/de.png deleted file mode 100755 index 55f28f073e9bacf9441aa844fc8f55136e805a7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3750 zcmV;X4q5SuP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0{~D=R7LsSAM(~7>CYXimlglwAl$b`gDU5Orq{Xj=_uS`B4c4PR3Xd~FbPW)Ey%4*%v& z|L0TkKMUMB3jab3`9KWmJPXb>3aTs!j3ftj9tQtuKL2e)=_3cu9|o!!1&kB~j1>g` zCJ6Z@2=XKd+#v`5Qab-vK1OFTc`5OoF8wbu82C5SU zj1L6=N;>~gKeDp2t*xz#i;IJUgMWX2d3kwdWo2MsU|U;TR8&+vJUlu&Iy5viF)=YM zEiEZ2DJ3N(85tQB6%`N=5C8xGii(Phi;IkmjE#+rj*gCxkB^X$kdcv*l9G~>larK` zl$Dj0mX?;6mzS8Bn3Cf>sHv%`s;a81tE;T6tgWrBuCA`HudlGMu(7eRva+(Xv$M3cw6(Rhwzjsn zx3{>sxVgExy1Kf%ySu!+yuH1>zP`S{zrVo1z`?=6!otGC!^6bH#KpzM#>U3S$H&OX z$jQmc%F4>i%gfBn%+1Zs&d$!y&(F}%(9zM+($dn?)6>+{)YaA1*4Eb7*VowC*xA|H z+S=ON+uPjS+}+*X-rnBd-{0Wi;Njun;^N}tgww2 z>+9_7?CtIC?(XjI@9*&N@bU5S^78WY^Yird^!4@i_V)Jo_xJet`1$$y`uh6&`}_R- z{Qdp?{{H^||Nm!QjEMjM0Jlj*K~#9!VrXgWBponxHrKb3p{u>RqKOm$(bd^eSw{+h z>gsGH!-b=|DAtu29-k3M3P?&$iDU@!3JCTm1$g`Tr82~ZMyExQ0>UDEM|BM~UD;WA z#kr(_g2JL41_x&+4@Xjfi>sSE11l2)CkrWnjhUT;L7A7^R)G|tA!1}YstZMzx|)ir zCMiJ2P|}7$Q$SEimlPmoC1b`QsI6;YLJE+vF*9cn)|arhAO%=j%9{ZO0Q_@wwAm44 Q^#A|>07*qoM6N<$f)=z+;{X5v diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/dk.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/dk.png deleted file mode 100755 index a1b61d203628e7536666a6b196ba2dd53a46c386..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3862 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 XXAgF1vVZ}e00000NkvXXu0mjfM90x* diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fi.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fi.png deleted file mode 100755 index 3442265f3e11ed5ff7e79de0dba6bbb53f0e4e3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4027 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 KMNUMnLSTaOJ5eeC diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/gr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/gr.png deleted file mode 100755 index f05225642bd9fe3d9bf49fbebb30544b8783c899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4110 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hr.png deleted file mode 100755 index e769a807c5a671be31b0cd08174fc8867dd0d48c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4100 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 SSm4hGsi%EQt6Ib1;r{^Va<0Vy diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hu.png deleted file mode 100755 index 1c59889ec3ce3192be0082ce9082d2f00625deea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3794 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 F{|EO7XEXo+ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/is.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/is.png deleted file mode 100755 index a276109614b72025f37bde15ff1c580c7f6f118e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3912 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 KMNUMnLSTZo6+(aj diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/lt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/lt.png deleted file mode 100755 index 4bb0893cdf2dcb2e8ea6e75ba2978423631396c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4319 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/missing.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/missing.png deleted file mode 100755 index c677460d979b5b6f695f729933622622e3c9e2fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4640 zcmWlbcQ_S}7siiOW@L{}Rg|5*x2~1FuZw%R z*UqY+-}8Ll^FHr$p7ZB<&UvY?tHD6aO$z`Fng}(+6PG!WAT`BFrKtGca$+>z2n$~T zI+p*74AL_>0cdqxR8{r$AA0$D`9AdW=GRnJ<@fgSa&mEZ1PB_>G72hwx zRT(9fq`E%^0YNl%2b0AIrZ-^woQYYfHR1)WDJ$FAOoU0xvte39){FU^%azW`uU_1X zHhCbs&NrD~_Bfchws!dYum+cjJL*IBGlrdI7EW0D;0iYlBW}x$^2O;PS~_dP$k`CH zl>AIf-A&F^tpFqnWDv@)Sn-JLn-`FS_ptay=JvUN;nn)WX272SvjWUGIOJCN4F+q_rCV}LbSp^sX4FNXw>dW z_wPh72_B^@r4=>gh95t&^$hrG7>nzsRFUx9!wLRvk9cw%dj&HuUGhMb?bU|)%SwF# zopxlEVS?I)&g6OKl_!!Ld@08?iGd7&j?`<=Ek9k>?cRV|CnJwOV?Gc7N~kTd*W7do zz~n3~iQEH7tly7Qx=IGUsd)%`!iDiudL?Wy6`> z#90$bL#f2&?!{TV*inH#YL2v6N&#Dh^qa6e{*@Q31_G@eK6&H?Dy|8Z2*FJ; zAJ&^O50nn#Cp!2gUmd-w(U3@b`rUwHh}>VP>N6krtF|0pjGr{4Wmw7wHw<^_dHJyN z5BZq8%l>}w_*JZZ7)IiZ)9W$Y2d|^lZC;vl3%9e|W6fnu<7Di4&HoEv<7vpYB~o7` zj}BuYP+L7`YI1)TAFpAqZLa!Rh#*+XTup686aHMH>5@R=XT4IPVCManAUnB|c=J1G z;q?pWFJuc@T{^>Jort)2rt{6BF6{-Ocu7q>0jCM%>AXMC2OVSF~}(TwrgLblfmk8Syctz>B)Q)v>$(eV?EmKy}Cy za4kgJNY(d?6WS@kDQoFbFWH&4l3CKtu}rPL3w;cIAz~C_iee=ru0>8osG|SIgU9Q} z?bdwO*w^smM1Surr7Y2`9XSuVJ%5_&8`TEY5!Dm^{i_Ot_ITt9%}&?OnUyJw#*W8! z?heN)afFEB`|r9m^^JHgcL`a0Qct}7vfEpiN(|}w+~>31533Ve9_C^+b1zj2uSYpA z$OLgHIHA4H*`cMU9Vgvx+uFHEPUN-ZwJz3O=}mG=cdEve4*K=x*qg(d zZrQeVV>J^;F%citGh4NyZ$!7JjHiTlQ>Eyn?4jS9DwrZocT9hyHAf!cMe!aZX72ht zW*PJuav9y_pNlezS^_dWW?1K0VdMso!pF{8Iwh09z#<-@~w{x4|T*dcsebc<%!DMq&@TbM?DK!`5F05Tk*JS zRsmKPR)@9c^?qauXOCR>=$L4^KU>=!Vk4&@?|9I+LZQ&6K>jZHT~yttI)NGaIziM3 zDh+k|DEsi%LHBXopZYoECi{jil?_=V8J4W}DfiPK6mArJlxdV7Ps>onQ2ji0jb4FG zg`S4Ng3l+>tAS&aXWw3G(pfYe!`4Ne#deS9;Chd+_W6;sv621MGfXJ2Py5;{J>}Fd zW;NVjRPwoSrE%;(X1yXJ`9*xypw!6kk>8%^2zt@t(785tBd*|e)vXEFa-RTaw5z+J zyFDSJGOY4T<x;#gYg z>&_0mZ6RY3A1WL1mO1siA~u{~MgJP79yZ@ohnHpZc}9eudfkVZ4+bR_m0GvoEM=J{ z@5)ZydaQczFjDW1f14DIp5aww0@s@=!7UwAwUKFb|Jb83v71SmNtwBZ3@$09SASox zxLl#g@LXx_z(8p3OGd!G!3VI(*;si3mrsHQF2f z`RkwJJC#fGX1dnHp*u*A@$qS`imo+00-uNXMDJPDf77aURUZBoNn$AC*@(gNSbJzq z`@Ii#-HGij?d|HNkg=6nyWdlep4fbUBX>7A>xpHz>2XnEMctV2_(=U!V93^)a9*}s z)5Ih~P1)5TGq+mx$2*<_>(8d*xb1kV>z7bdl^TJ1t=VxQA45*>suS_9eqQdA-|FkX z(|8!(h&hjt^TuX`d5veRr3aRI-xE30q>OF6H1jDmWI=!VeP8orbMH*rlZqW`JOX)j zK(5{&Etcz%BmcgZxcoXdi`R-*qpso~iYT#Q@82#HXO^9lbymx&CSxlvesF(KUdarY98W(3ts`1_y*t44us<>Mu|5aWC<$XMd z_;%k5@3_~!W_J6l-?k3^7KS+ZbGGR{;F41FYHr$h`&N@Ooq2 zdgtU{1$}K}^^=*dJ-{5Y4If{r!@`e2m_4u|9Tj&Gpnd|zwq<^;LiZxfl8kZNp%^TT z6Qm~AZH?o-`&bAV*ulOc%!MV5|{_YGAfk>UX>Gcom3W z0!9Xy@0OdWfbmio{sA4Ip|i}mzQ}m#Crp;YWC=`shmk_aivTK0SZI`7Y?hlUgef#k zeuIiQnEnjY`7m`t0sQ_5$&cW<0}zT}CKsmjU^EB%(_yvIcs3hma)8)_oXv#UbQn*A zUvc1h7p#XHm5wL`Ukw9p1hZG}tj)2ur zz#(BK2ndN1s{yd;2P?j?901GyFz*ZT2%sbfaxz%+ffX-Uc?64YFy;b2vanT#B)P-7 zC#<@`synQ@z=|8JctD3Glo`QBhB3(n2o8XE1iUjWI|0@nrmVp7G7#*6U;}u2AU+Xa zvw*exux1GaD;P0>b#quZg>_?CGlMw;n9zY%4M>y$l0FbmFoG&Y@V^Ws9U$of=`MVb zhRr*$p$;1wu%QWys$g>tHq~HL1vZsoLlqjOAVLVd_+a}MY@MJ0Tk?>52~ve&M;f+o z!1hhRNkh;%@aBeH31}9AJrURygGVf2%M5=`;w4xShL2p3#tARj0m%aU7oe3J4$c9A z148J*mk#V{;gAEm&q6)}WYWPb12i(gD;fwn1-_KvNDj*1SW-{cNJ3Lh**IuiEm%L2UwF?<)B?Q^0)KNeu$eu77#YWfi#0HBfzH1&r(T(VfyFiB`?|LSr za@p|WBK5+<+q*r-%XW{}pQqgW=(#iDWwKHvQjlhRJ&cRmhQXa|os3~RjBZxP=GNJ_ zu>+p5$|7na=TtO>t^B$F)9sd_(FlHUdLmTD_S2$mo%r=k!E(}?xNeKrzpbcZ=l;Wn z*eO;0;@@^R`w(HbMDgeDacrIkM!gEYOv2Cq2JscFM-87J)~c1g9hwS%x2@Rt?felI z6(ac0!>wk%f75Prb+eizOsk}>j7h(@T#uwDVN>V(4 z4pt@jru0ULp-qGJT}Y0?bwS1-oexVU9w?KY^CL^^{8=Baaqtd@-Sm1go5<&3h^}_V zZ!z^Ia5PwuDWw+C&L}M9jxC{t*7)9S;0B7GZHteI*78hROp}|u7nX4g59!AZdHQeB z&r`2s@~RjT8(%usMJinxb~P@so|)8cR=KNqaaN~kLRuy2KQXF?t|eM-EeVn9R;VAB z#ASnop9?`8*6gAL0_Ma=Te7Z==8abGfKCUHo|| zqYc$*JB-#JkUl7O5~>dE8%+J3Sc)typ0iY!X`QRTf0eT5uKwEq!)C)xEbeH-XU5*4 z+{s1Ku&hO5&JNS2?PWA1?Iu=gadT^f4yDMOyWcvZ8l~erH$K(8lqh0%);qoY2HGMm zdf9$jLG+CW%8%=Vg@c25nK9gpN&obwpx4JVoz&{Pmk_l?pLm@Y6PsXVK^C!7V8M@h zASt7M4|T9ZHMUgs(v>FWwQTuzdIR@kyn5zQw1OmBx9d(hFVC90!+89sH)20NUb9^J zc^O?L`_!-*kG7+)s#DN?&8~pX|Lhd4ttE^eVWl>8i53=BZw<~)8|%WY(_dBfNRo95 zR(E+sL(B5ETww^UEj;qE)A@FmXOoAy8OC+J+0~V~n0((QKw?GAZA-Gyoa5>N@89AZ zd^ckB#qJ&$uH>daG${Y3BG1nZ2NYp=z9&1>HtoHFup3y9g4bck zr#P=J6>>G)VM~a!jUXuiQPld_U1Cp9(K?ghx^Y)+aUt0oRsC0}0^iKC?z(go9EieC zP(BMgGVQ}kvyuI|*%0z?z7`v_cevt5NAYI{80ow+ca<+%o*YonRM%Des$%o(f6rC6 AxBvhE diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/nl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/nl.png deleted file mode 100755 index 57829ae049a6e171163141f496c26b926c6eab68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3790 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pl.png deleted file mode 100755 index 611604a60e2d58df72f466a661f7f024a481eff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3740 zcmWlbXHZj37l4-pln&BD5kZQIhy}%0QIH}MGzdnjh%^Cdf)YwlsZs=i(53eh2vvlD z^bVm2O7AsNLyz?Den0k}xwAXF=RD8u%=x1ERF#F1pAi7SqK15khN28KMCsws7hYb{ z1O)~Mq`o5nOq~B8G$1a47XU_eD`jO(%{TTKd&f8S4#H~6%EAus?JcZq%>i&7Nqp|2 z7eVEbpQM_z=_n1Y7suFo0TEFGeH*)e8hbb}`OMCt(Ciz)sKdp5CIPA4Fn$TGGk56ut)zyQ+gDP?Y`LG+?!{&L0<3iX%nl-qK_PsAVBowNF zY-+FegmELMXocAqNDY>B%>b;!v99izq6ddGh4ugj9Qv<{akNgK_*80M&;`O_U`m98 z%tV7jgSM+$ZCs#@7Zg4J{+ba)0$_{%s3Zb%S-{G+nmipC!bglDz);#*JUs}e0kM}< z#b63Qfw8t1`U}O~Dv=#wuOu1j2VxTPj)fxYgI=C`6)n=2r2` zE8Kw_dS8f|BI>Q!3Ut`R^X*YH9E%>(8$!`X3=u9YfZ(T5_q6Qv50Y)2`x*@_h*hu8 z87R1KNqyyK3Iptxx1_OD03vGlLKP%wKvzu0EC5x1d0*y4B2X>#06a|bx?H4qnz^2f zP{*23FIZKFfSH_nsK6{%cb{G9)STy8##G*DMLw-M*&*5=MR5Ldmu@`fT&CoMC z&8C;X^qib$Sz31QlfOK+e z$<n$4RR(so5Y$ky07YGvxc&trAcd zmT`9N6La(>o&@2TuyPz5P9yxFy>YIbOSU;+2E~vjhR%rOcr0W7V4gNJSz0MJCHGku zKIspAZh&m^3pKkGXU%KR{qdZ)oZ`g0;(3%w8B*!}zv8Sct*CFVEn+Ge#(mDI#Qcis zv-x{^k-X@$?ZV9B$Kun9G`+-U!}ozNo41_rS}ZDy?srUVo7VL~X@OYFZ*1S}we>FV zUjE1(*1-`a8>JKF9!1X8(stB-(2vb!(#q3j%X_8sDeIB;cgmQMO$|!+ zR#47#2LjI5KA@f}JLXytEW#`j7v6Qzu(lLWt=}C^c-(!yo2C1M6kO_oRPlgyzD2%! z{(mEGBQ+zYtM6BNR+mR8P7a9*iB}SLWbI_BP7IZ|E1y;RR*pLLEXn^iTgEOj>~!p~ zE{^xA?$~Xo?;w^a1C(B&|E}Mnzm4Owy>Z8Ey%T5l*XElQv3LFRbj}&lo64}JH|f1< z=@*F?*8DAJWn2;R76kjVri5D)=3_SZO-!w%M>Co-n&)aHx*~1jEGm0Te`7j3+pdfe zh6wE|A$R)|Y?4fBhO0&ogMBkq5}F?e-41Gv9*O=)qKj6KrV_sC$m?Krc60^_Y6CBq zuPoaQ=-O%u=*Bb0%f^$+a`NNzo1EkACb?#~LM8encAmc-xv_G%!nhK*a%%PNuF0fn~|LUOnoW}Qr3rPdl?b=4045q3{AB<(?<;?fH7vb_P@~~vLWdEA1 z8j(r48d3KF_gMGShe-$b_DM&f|7xePn>-s&>5OUWY36CFz4*Pp!)@R~w6V0Ar)B7Z z>3*KN#w^dR#LU2=FZ4dbz7DY|uxEC2%<@WHFLwuhBKHe{{p+0Ak66>SXPH@gyO$e+#9tn zd+%&Xu(n0pnythWJ&CzQFIWG6DjP8z7)~*U)h}~RLrrpDW*uQ<+qjzvb8%YH7_)-; zv9t=r!eTcm$>qMjj6Uw;9p7&pF(nV?eT0=XukmWkXTMb!~2FzZ;gi8<`N9kd9`t ziY}ELyk35(T*E?AGJ<6eyI|KL5aHiJofF-2+#2P!^+oljm!b z7}-6Zz@)la?}T)fc6D^YWlUsN4LZvRqnoL>(|6qxJq$@YNBMc>HNzK125QG$K5Vi2 z2y)+>phT`z{g8CkwW(J5wDY!a&3inQ-&CNocENp|sOqB8oD}*Y^TX*~70R+T#@=?U zu(q~@!47>p_#9H!VLsl|ek6W1&gF;0i_5GHiu3gsC$m0&nAQB7+TA$T*fkmJQNBaJ zjKoUz$<{g%q|)tDt8xj(UESSso;*2eIeVYQ`lPtpSfW(`$tL~Y-iAcq>RS2=8pP)$e0%b(=S709W& zI~+|T3k~d-&8ehS-TMWYZT01Qy_DY``_^^+j)VUOuNo#}t0^rj0_ATnjGrZnSML0C z-d#nwFs`A-4BbLq3lD2Xj+RdEvn_d)9v7R}*-ia3t~2gw)MulxGWaJQN1pulpYBub zRP7giBpMu=C?q7n!e71lx;tVzyCj>lr^8+61iS2*N1i;IIe5~ecQ~}pv=`J|YvGdGg2O!)w&f zTL}JbeJzJAvXN08ZBdSTY7c_8R~Q z`*5S?M^L{CG*MbA@83Bdot#kj_SQEy$%~64V`H7&-54h)d~R;g*RKZ~l-23Ux#7Y6 z)#YvS{1zvloDI0LfPgbF?=vtjb{LwGX6!8Opa5;Z0Bx@T zZ8tw{4KKU`0k7bNmm}cc5%3ZOJeLQa%?(fEhNp1BKd{5FY%pgw7={h@juqy>3bSQ} z*|5T_Sz&KjVD0?0O?;AfW+YwYoRH)mzRdkwf~!uPCyE{8O+uPe48yge~)LXBvtgI|9 zE|SUQg@uLL+1bg-$?@^=;o;%I!NK3Ze|L9xcXoEx*Vot8)z#M478e&66&2;=}0RdmW ze1X;n1wkIZ1_uX+goK2KhT?Fzu&^*_tB8n*$jC@&+vw=%n3$Mv-@e7h#>U0P#mC1d zBqSszCMG2%B_}6CN2jKyrlqB&r>AFRWMpP$W@Tk%XJ0KYvzLRaIA4*VNQNHA0m_ z^)@s#G&VLiH8nLiH@CF3w6?akwY9akw|8`OkVqtmNmo}F1gEE`=hv@ay}iACeSHwF zKY#x8_xBGB3_$dThK3-FBO@cDqoZSEV-VGei3ter)YR1U^z_Wk3`BcwZf<^l9wHC% z|NHkZBw}f4X?b}Wk^-q&TU&!1t*@^`vNkt2x3;z*agaVpB9%&oZ0_yt?eFhHW+A_j zWytl($w`k`(H-dB9``b`$Lxa`&G;h30F{G#b|D`K6O52@6sd8hV~3C zG!XL%C`w5N5(-+V`;m&hS_4LYTqzcKvzxg#T8JpKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0{~D=R7Kn@EC7H2<0dNWDl6qGF5oFG;wvoRDl6YAD|8kY zyDKcTDl4rnFYX{I+aDzDCNJG3ERq-<(?Bi2_Zi#sBYM=*v>J(+lJ%SR}nPCIrtDc3?LyE`POIW3VgDA_Y6%Qh*gFeJ)0 zF`O$XjVL9lJUOy(Zm@=g)+i?8EGyqED^d^;;VdlQEiBzEEYm6~&M7I$C@91yC#NAH zq97oX9UYAv9Eckmc^DXK6%}O^6k!t+TM`mi5fR%gEY>S4(JCs;DJjM%D6%9Zsv;t& zA|jd}AB!9uff^cB5fQs4CVLqfb{H6J78YU@6yZxt<5gAYa&qmEko)iN|NsB{`}_R- z{Qdp?{{H^||Nq`sDaQZ+0w_sDK~#9!Vu+7(b@N09Zne+xf*T)R-eho1N{M$v2F?vn z@q!m0Zr)~akIT$SLI#N)-|&L#FWvAo#DtOALZDwZrOXCF7;e|a*71#*ta>*~WMuaYZKVRPfWZ+->3NN_x@%|%* zfPlcDU=+}J7ccm9|KTHsz@XreFk}$g_!%#F_~_9ihMKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0{~D=R7DOBJQo*X6ckkx6HyTnNDvT24h}mU9CRBSaT^WzZ2=b6MSR}WKjtH)5Ziwcw`vWORSRA=2k@Xj z^RQp`!Gcc;1j`!>l@th+6bOS62XYSva1RD=4+dWi1zrpV)Eo@c91PAI49Ob{#~KU7 z8VkZ23%?l)y%`I<84I--3bGdptrrTb7Yd{n38EDVp%n?B6$zXb35^p7i4q8Y5eIt^ z2WSokXATBh3sxVgExy1Kf%ySu!+yuH1>zP`S{zrVo1z`?=6!otGC!^6bH#KpzM#>U3S$H&OX z$jQmc%F4>i%gfBn%+1Zs&d$!y&(F}%(9zM+($dn?)6>+{)YaA1*4Eb7*VowC*xA|H z+S=ON+uPjS+}+*X-rnBd-{0Wi;Njun;^N}tgww2 z>+9_7?CtIC?(XjI@9*&N@bU5S^78WY^Yird^!4@i_V)Jo_xJet`1$$y`uh6&`}_R- z{Qdp?{{H^||Np}3bmss70Ov_WK~#9!Vo*|G=M+K$CW#IasK70EZ8H*R@964hU{_XG z6SD6g%jf&{EmeWOu+*0MkT3fT6%-V*mgE M07*qoM6N<$f-^-k)c^nh diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ru.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ru.png deleted file mode 100755 index 4dfa9fb1f0e103e4a4fb6d4b386fd5e382f6fdd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3807 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 TZ8C2()jKdTx@lOZk9zt)n9@fs diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/se.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/se.png deleted file mode 100755 index 4966fc57bb16bd0f93ec6ff4b0fa6b2fbcd5601a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3988 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 JPDHLkV1geF01yBG diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/tr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/tr.png deleted file mode 100755 index 19510ee6139b64a8d57881210683defd89c40b4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4098 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 Ag8%>k diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-h.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-h.png deleted file mode 100755 index d6fcc7fbbd5cfeedd9359950dda3512044d14e78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0y~yU@`!*nK+n%WFeE-B_PF;?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP!U^zPl#(kN{zZp0)zOGwLlSZ vPZ!6Kid#tuGOUXmSPmF)xiM-oC>&rgoy=r7sr2C!pb`d8S3j3^P60cJ-PGq*&4&eH|GX)}JtE?Rp91OP07s zlmzFem6RtIr7}3CDSr1<%~X^wgl##FWaylc_d9Q^W&&LR_V#rBzi`rKF_fO-xMU;^HhVE$!^=jE#-;_4Q3nO&uH@Y;0_-tgIXz9lgA~qNAgMwgd(S3JVMS z`1tVg@yW`{Dk&)m2?_D=@YvhiD<~*9J3Di7a;m7PSXfv{N=j;LYlnx2dwYAkxw-N4 z^G8HPh>D6@TU#e2B#4WPb8&IW$jId9=llEn3kV1V1O!M(Ncj5t*45QzW@fs&x_Wwg zrlzLy^70xP85I{7XJlkJIXP8SR0s+RhJ}S07#Qg4>SkqSnVFd-B_-wN=9ZO}H8nL= zR#vL3tBZ(;C@LyyXlS^&xX8=PH#Rov=;(NOc$k};8yXtw>FH@{X^Dx6xx2fosj1o8 z+5)}iI!7oMNX3=}`33){Az*m8e(nTdT-^6`aSW-r_2$OQvP%vk2R?fD8gVKdIeAWQ z+omZ?uUxy86&n@qk!0pH>w7(4^S;J;)%FFysvG~$tbW%%vr*@?MSAtqEgjE7Zf<^~ zzewQu`uZ6Ec*R+9`g)%QWTHe}FEY8zT6E=~jCahW7K{IN=5Mvdjb?E#wU5=|d;HkO z;(C-4_eFz^OXsq;zdZS=x+!2^_4dC@Wfn}D{`YseWPu*rJC&M7tvNgLkLaxPJG7}q z{?Yw?SqGe*8cm0H1^GC0 z=49viCLsC3s!o=ywTxeOEv;}@&?~LpcJa+0kqgd?Zm*b>v13E`pD8W!oMA@!vt+*n z%nWrF3S~QMQtPMWyM34G?CNM?YZ1?s10POEl*Y~#WU-%q;sDQyGv{9YQrqai!PZ-;W8dx^c;}I7^dR?S#m}RuxfQ-|&M_-9r#1GhjP9IhZ@t0#jjE&u2jA3l z9yxH>VWo65EEN5z2tIYD~@#OmNCj0)& j&3E~dSk+R;ZNT8{_AE}};`w91G{xZQ>gTe~DWM4fnV6{N diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_next.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_next.png deleted file mode 100755 index 33db35e463cf3d25ab884a345c20c66b7522bf2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1036 zcmeAS@N?(olHy`uVBq!ia0y~yV6+3WB{`UZDSr1<%~X^wgl##FWaylc_d9QxpPxLR@WaZNfUsHC0trMMOm8Y;0^C9UZN#tfHf%y}Z08O_~%K7$__(?BnC3 zq@*M+F0QSuZEtTcDk`d?q9PFw>!#lu2%d4QEke{EguCC6{&!3f*<>uxlDJj|2)s>W#+7qls~a93?(gp(5fS0)>e|=W7ZVecnwnZsQBhuAK4HQH2?>dejEuUvI$+Q> zH8m9%7l(y~g@%SMTej?2&WGPX(S(v9zu^D01q{WxPn;PTnAkjB978H@y}1!tJS#xt zz{k}(j*4PRod=d4jhf=>a+Ec>>zL}229E3ufg;zrP$O|L%7@2*E5plb46 z_M>KB<&VAkle=+E!2+$*N1vpsn$OPhbk^{?UjFLxB(8NXy~hKO+#78F<=AAY$zcr;g7D zBbf9ioo#gQ(mKDupk#l~q3hq<*G;fsED>DqrII+qmdCGiTBJy-Ry(h`*k`^1p~Fu+ z!(A3-Wh^bg?TS~exE+`>4C*DL1!PV5U(_G-2M6Qj=&Yo?xCLR z8y2q;xoGkBTjGuEkb{e>ZeQMh^X2I$1!pQGc_+*5bNgG#CO1{_kh;vqm5U}?J=`$w z^|1$mOoE>+gx0nk^Nzp!Ji_O|VwXp69&zYtNLkA4D*SbmQSRx4SWid8W$_nQ>}}Gv zIw)bIr66>^`em%XWAHn>#g@`yEh-5jA2izbynRq%bMfMznF_9N1!`yA{gr-1AzJ#z ny8O#uGd=8m{yW#RN-$L1x?uR_!a7}G>SOS9^>bP0l+XkKeKOG% diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_now.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_now.png deleted file mode 100755 index 16264e66fbf8fabdb0a8cba038a051b68d63fd69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 979 zcmeAS@N?(olHy`uVBq!ia0y~yV6+3WB{`UZDSr1<%~X^wgl##FWaylc_d9Q=|fXLR@WaZNH5C;V<>lq|^z@{qrKO~#L_|bXRaG@KH00#u3=IvHm6f%$v`kD) z;^N{=O-=3W>?|!Ujg5_6TwL_^^&K1>Y;0_-tgIXz9iyY8y}Z08O`0SuEG#4>6c`xD z#Rc+>q@*MtAD^hGsE?12ii(P?tSmo2zkq;%l9Cb+50ALGI4>`+goK2QjEuInwt|9! zy}iAlpkP*3mbJAtH#fJpx3`m%6DKF9g@r|Uc(}T{dRJFhb#-+@LV}x{TSP=eVPT=C zr>C#4uYrNVgb5Q$N=p3w{p;)N0|Ek^ot;xtQ;m#_TwPt`B-dQ{IZuG5jiO&W~y}kKabIs$R)#=Qe1ZG@Y;g*y#)pnh|kCNQXB_~r94I+FM0+X{I zl>YXz``OU_{Bw%p1+A1X%?I9!C9%f(h%s&TYFjVAC3an;PQvR+tq#*qxGevAc-!{7 zk2dT~QPg;uGU@%-#|s|synVweW#QSE(eJ+`{*U>WTKb(eZuNDYq{kW<_5jBh4yJf2r5@ljP$`hMYTE>Dhcx<>0?Ui;6srdvjImyo1EVlwaSpV#KD*ZC;@ e|Jim1W`?%+S7apKeX0W{B?eDdKbLh*2~7YEB0(?ST|Ns9FWQHEPTnD6>N`m}? z|1&(@Zr}yvg?qX1hj&|)78&qol`;+08C#`i2wiq diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expanded-plugins.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expanded-plugins.png deleted file mode 100755 index af655834e20874948013ce6be241cc86bd0d4310..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^Hb88|!3-qLH9QP}6id3JuOkD)`V;1?T`z%r$r9Iy zlHmNblJdl&R0hYC{G?O`&)mfH)S%SFl*+=BsUQ>B0(?ST|Ns9FWQHEPTnD6>N`m}? z|1&(@Zr}yvg?PF+hE&{obIp;9L4m{N;{Ct+cgj!Ktv?dk~0WM4lT(9p2&2%zd-&TeH@k_x{X#Z|a;{XV>1fYu8tG&R+Y}mm${0;%Z(r@CVWW zC;%eq6hQrV{bXSKgnuIz0H6mOCo+*lBK@Tk0Kn$I>3>lK2%xVg`J(_6NC`3($R|0c z0ht!$Qy|lU%n0&{-U%~-ZRWqqp!je4UmSt!Kmd5%0nPxrfIs*Q0wTc7{(0g8-m=^5$) zWMpK(E${+JGr(1Vf}H&128j~9sc5OFC@HDvXlSTu8R!@o=;`R`8JXBv7@1g^=;>Lw zSXkLPI5{~Pn7MhlIC$7NI5|#?kWqkhD5*|SQJvyoq-W&#r-}3dV5L2Aih@iSAZI0` zU?n4U0T9rAD$v^#hyO}s}t3J;WXTJi$c< zQ2Yhf@5uguixtF0PDx2YNppgWj64iv3RX%gAsK2mEpr;DKz3o-I9d+v^y2FFQzCNL zcR8JdhUvIO<DGB9}*tbis!fMAB;Qu~*&mo^of z?ktnXXzyhA*U!qnrC<@f$)EI@BYJR*%k-CMa} z8$aqZur3zN_fuTXIn+HjEgOF3#N2gR_!oa%G8-X4o&*pTEMOf`FG#?!;e8T7@mr70 z0w>A~dJje8JhKF4E0jeSF6;QvKa6vAvw}1~Z1RUZKV2!7Or(?8y*;-BJN=>INK<+E z`;WARz1|ITLV6cupMwZmp3HvO*;;%A+Y_&2el+cWUvru!`3?zSwW*pBd%0lK8-%FU z`OuSir@u{kMbXN|kOVNELX&_aY$gey&hsDvVq+xW9*P^!jEPiP=&)V({zT>^bbR5< zjwDiZOT?aVfG5_^7`s1YuX6uLi6sGaTO~8jdvOD5lTKip`<}ef> z4vJ3RjCmBuE3^8(;=$Di2u?9uMc5p4P1-97y7wL9u8Efy2Lri2ZHDLddXCT5|AXu( z7DfW7IB=>NWC6?PM1Kjg(?@NQfLNc=HlEng1$qrBM?35Aux@elQ3PeVB*H^S#bI=DDlgplVhnewe=x25m`Q%Y!`puziADfg3U{r|n9y=E@bOL$OIF zE|{ODn%7}nzE0+Ne|-J4UQmi(f7XuF*Nvcz&avy)lJZQxPuW+avArqkwwjyL%*4mj zRs$%c(vAaccl|~kE~aQ>{Kve{wb_k{;LS^NdTqYf9t`+qyy0Ol$Uqc*xJ-;24bdC+ z*ARggpC3m$hMy-pQ&H$U$4rBW#4lp}KH!p%jqutN6}9T=h9w4Y@sA&pEd|)&i<}cr zEU}sn&%HB9z(}q_@sMiZ9yCJ*#uP1FJ5u4Vu2nkwd1AuV-YBa^;(@`@Jcq1@zx}ef z!ffTe@?W>j)%&`9%hIfr7k}PNYAa-FULIof;x=5Ha*RO?KFDZp&~1$1PhnxEZlzc< z+m2h(WSE)?FZ;mNP`x4T!Z`Rj-*fnaNOi5(}6UA~3B zvU#=`JXihd?lUN@{p&LHrzctHFLtV%X-0mc)n|k$3f>+bRE~U~3czM0FMsbG)Yx0= z-adHf=kG7hsx5+~%VuPu&lRXmMLavga$*#dmgu1@(=FKM__8NLn1Z{^&M~^?gp?4& z=u^iIK9R1{t6GW~Sy3$1JQ+TUB2q&K`|nDf#Z@gOZp`WCOdxpbl@Bzw3FRnHx#P=t z2|vg2kB*yPU&N%JO&+-G>}iSrAgXsLbCHcv z>XC4-gx8hx=m)pl&fvRlF}0f25~nr9U=K8Th>&k#7r)wV9NLcZiCSI(465T>o*%eW zBF5iW-iOiE!5^aP!s78#dflt@xt-wQGac|_`3(|{1f_hPl`EBBXYvY19V5jnfUI~T_a#|gGQn}MY>%8jZ1qEOK~pS^f;kJA*& z8ui=kv3>LBcGnu@&G;s}E4<7CupcYr(YK|>ooC2T>jV}aUoC7)guHB%0JjlDJEM7} zN1Q)iV!hip`L*ta4uRn#xJYx44A0D2>*^kTbWhdfBgtvq&9q7%Q$*A72DB<{2NEQ| zRe6snRGqw|s)KF7B6(fKT@*%Z4UB91GN@O+z2rYwYAeUE4yCpTYHmtu64M>5R(hIC z&%!ZZ(E$&9T`lbjW5+FoSyqlLX439U_FmTHC0uJ5&9@$l6>zNO_Q}u6sRr2W%-&z7 z5jeKWFBrv^Q7MhT(%gTg%MBSBKJCb1UY5wd~9zhSp|!-=<-k0T)2I7?yLL*EkQ%Fw4LT=m%P4>V~^B?t?SUA z7SgQJ9_NFIoA~q}YjME=E*OvY?66vWA1Cga=&jsY(ZDrw?qES`L%?;wuH*Qan_UT2vOMR2-zJa zWF(-1+;~IWKCc#!;9NQb!yWq#bULo@anD-?T%(rB+|b{)D;io}n69;(h|bkbv{i0N zTNROJud}eJph#iro#0UqwC5RDH^)o|Y{T#K`W{YjeZn>(60X@@=QJIM&if9@>O~%I zwD)c(ZBHGm+u|v4Zf=NQ8nRVaTi=ax^TylgGmMmd-n%5!_g z%VIl5rkoy6b9!l5-g3CXpjNu6x-Q&EXgm9MC56{_W@;p1E$FE?NgQm`m>Y`rPUWl8#>K0$Yf1nj4cw`5{F2^GFXhMZ`TlIg)x9NZe&SZ6^s zn+5lf)923UC)zNW70?RZn`=pbCMkkAJ=UY5gf|TF+0hsX?-?lxScPUNXsASA!m)<< z?u9o%$-_gBR?|~Eb)7r{FC=~WXxx`!r#uA9S$`KUhU!?Ddb}yd*DJ`ohg4b^uj>?4 z>E%<6v>GxGXYXoL8C@M$cUe*+*s9(4DcvXB)N8e7$aTMBtF5dS0eE=g6D2gHP9jNtq{ZA2YIPU(?YTP(lBkc4T6aOUgF&0Q^-3$ zVh9{533-~$p_!P2E|-mlP&RRKi@i=PeON=O!*&TaUD@kn2Zi9dnv~|bFp9N-0k@y& zWM!!)OrCRBxfm!!xuhVVviwYPe_=6Thp{+13Kz)q4w2vm3-$_@&!X%Tf0Eum>@nc^ zMe#NQfr)ZQ=DoCHR?#;3MjUO9%oS5Mk&tc|EJ2hES2ak=3;kkz*I9I#g7EeSJlPSz zIlZ&BpAE;(v{$L=h{E$Vpou)WxhVO?%GA z3Xj9!LxdFr63}wvcC${=o=Oi5a&0|TVTdnw*ipO%!@2%IA%?FryQcBJLH4z%Pr+oN zc_MX9cWH8pB(zfRV!m)J>tzYD732-aya_$vM5xqr;zZ^Yn3GVoq86pey@Gr*NTRim zt#d_C6s7t^6P^R-u}j^v*AJz0#4$UJbFkA3ZyZ{kIVvhk5aheZbD9Brzl@YRg>-*_^^r}*M0$Hxs#zX=CO%9B* zm(gH72?#L850+@Zu(}BojqPstx?FC|A??TEGt4$y3c2h3W5*<)$fcA-!D29WG3d&N zp~+u;x-^~P)49r>sW-koJI@5@ue@y(V2_!@j}e%U5!@|ifMt%wd@<0#f+ z&8A_;=f1)e6I5xssVI;yis2qvOMF z-Y6g5L-?KjTd85UtH^r+t}3KGcmf-mi~NG4!KUF-i)LBnoA+Naa}S^t-XbmF-_yp@ zZmzt92QEy10>5o{Tw-G>^vG%@RP&TN^#WhCR|I;Z1@(2Y{^?8RSN2jZIrJh7*_5zP zLSOEPk2fxmg`Xz@J*YYX63}`2K;XJ0y`SB+uUu=>+fq|@ZcpCG@>eXcGWPm2nF526 z(Cxstx<%2hXRLNZn#umWbYjRzv5Rw}z!p~!kdOMTg);V)84F%cbim7Frx1qfRk zp60JNwCWS?!QL77OJ!(OJ&>?Yk!WKQP~=_={@nQl5LFz_(Q`&?#92FU^PcQDo=~*M82ynviJ?G)kXnYfIJ`z76EktB|sZc1f;-9 zu?pBy0bBB5?L zVTHAF1NNAG%f~F~fFZ5Qao;cP}w> z;mS;L35$c5-BGoM-|MB%nW_IcVzoOupZ-?WzsnRjy2|fyxh;2m-;C8uP;IncQh?ge zedO0ozOE>r9Fds@o|ot5UEVO}JX~bG$G?8YcNSOMbr`zWF5TIxwe*w@tf6^LrNm#- zXB*FT2q>NC?qxUi$$OPouhJ(!Gp5{K>|DHq)*X3r=Mk!v^Idi*ygwPrgNy3A*8K`s zb85d;Z%W6CzO1U2unTG7nWq)XPLGSf^5NY>6q+pCjBCW()~25BE%&hjSzJmmYSL;9 z#X$mGH0kmBjd?`o#Gm)l%goe~?2a(M^5d2CPMOI7PQ6%v8i-PTL^Du?dfLhg&X-Z}ol(tZzr@!QO-|zqDqD`9 zVwO-`jyCpoph*XYhJBjbqbCPfY!XyrG)+XCa`JhRfKP9mHi#6`E;oZyUM;&3 zz(nV+YJz975618`6s6yp5x?U6t}HGL%%e{}lT7f)Zvb_{3F#(s`NndCioz~e_L9_9 zv_n@L3uf?MF#_tfS6^dqKTUWxR}4S&{x(!q!<8Ce&5yywzL~^Tc4vj&1Z$_emERZo zQ(fi=CGK)@Da(VELb%prO;1f;#IwULD9r(Vs;$AeP!yphxnAeqFTTbl7N3;Xx6l3j zm8(LKV^h0i1iH6b8L&%JT}GE?9yoD~ApvqriKtzj1j#Zl-^+S05G26kt)LJt7a>*G z3qngdnX3v>$dF4BSO;})bpCtXb%e~qAf|l z3S(ZGp9*YOnFQ?VOC8e_2P5YQzrMs!^iHd_!vaIxLJ<1V*<9I|F1KV#awmIBtBIV6 z{*dBvdVS+K^LetM0OWwP8LTnd<;_=PlpfxhxzW&o3og~C^YA7C-nRU%D|>DS3h)=- z9EHc#V@fuW(+txJ?+OPF{STEc8NOGS?P1mN?`m+Pc}&gO_?c{Z(3=q1z{KMn99=Iw pxA9p*Ozhn%M-#7;)3%VUrJH~=anxb%x%&`l>R)Z&{J-MQe*nifAz}ak diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/clock.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/clock.png deleted file mode 100755 index f3d675ab57f14a17f1741704fc829ef03e495710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl~S^m}qK81OKu|Nmcd@R&|(mB5?^mq&uvm$F50eiBo%n9P#? zo6XQswBBLw)bP0l+XkKO+Z4s diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish.png deleted file mode 100755 index 3bb8fde5cb06022dfc76196871c90a3b9f932c78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20003 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 M07*qoM6N<$f*i*7EdT%j diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dmm_logo.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dmm_logo.png deleted file mode 100755 index 56f296595b2f014bb192722882bb2f8c29c6cc39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^CxDoXgBeI3TlP>GNJ*BsMwA5SrDfq_xg)5S5Q;?|uh zo=JxlcwAMVoxJ!rKe{WJ{X@Ii-K|j%^98D;6n?6^&90v}C&RVeSm~LXR&4)^ip$+o zLpVO8)Lxq1xIE%Uxg3JJ<-abb4I7n>v?ukF|~?)1A9N%eF9Xe4P7^#W0sq zVCsC+;GaxSBhy@`ov_<~CH&3GlXsRpj9d4TuWVglh3lP7Q>U*z8q6K5z}7h9S!SMo zeDR#T>h&G$0+9^?l~(e;-#L4?p70jn^{Z!J^jz|%=!uB^4xG(T_8m(xSKw>e&1C72 zJ$I+pAHEJ(g{}GhmP>21YyCW8np9YimosjX`gVND5?zjxAZML`cdz~j%uf6+xYtix z;GBTVAAuID^aE|Hm&dPOA+h&VAM4(?Gp#2$@2PtI^KbAs#RClC(>y(0bSgp7$l&Sf K=d#Wzp$PzVHqYe% diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock.png deleted file mode 100755 index f3d675ab57f14a17f1741704fc829ef03e495710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl~S^m}qK81OKu|Nmcd@R&|(mB5?^mq&uvm$F50eiBo%n9P#? zo6XQswBBLw)bP0l+XkKO+Z4s diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_add.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_add.png deleted file mode 100755 index 487ac483ab6e35441b58dfcb208bbe4b7dba40b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{3?%2B3|#`G7>k44ofy`glX(f`cm()_xL(*k z0V_IsVEct#v(BB^e_{LN-P_h)IKKPB&S@96PrPt)|AoWrFKnN5VbA;v2UY;}0!_Mb z>L5>u&T)_hB|(0{3=Yq3q=7g|-tI089jvk*Kn`btM`SSr1Gg{;GcwGYBLNg-FY)ws zWxv70DtHl zFm!uJyRNzDom!xKH&fBvz@@ypl~L{KfucFPA3hXWKh@9bcBszt$F;^@I@|l*5B7$# zZv52yRLb#B!psehDT%Hjv)^n{cy68Yb*?GT&L34buUr3P`@dbjHlljkuj&7ueMlGU c-?^9ZcL_Jsl@yOjKvyw%y85}Sb4q9e05{^5D*ylh diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_post.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_post.png deleted file mode 100755 index 5716d99f46376c9a7f438dae2382e4d6a35745be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{3?%2B3|#`G7>k44ofy`glX(f`xCZ!yxL(*k z0TUfPu>HcWS?5mdzp#Ds?rm!?9N&Fm=d=skCtf(Y|H9$*7q(BjuxI{-11o?UfyP`o zbx>6GmVNT|LeDITV}RxcMgl{;o=jF z85LYlHoBc=eK2YE#h6up#SC5@_cfT;UogEg_zth2jh{@(CH+O8W^S)q>2>|E^5cVY zUHTOpVr)3{r*SeWao@h2aN~AUkA8g7_r2LOine{-w6^>k+wI%^mTQc=-=40S{Cjiv b^?PNX4A?gcv~HaZbQFW9tDnm{r-UW|Ky{T( diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_pre.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_pre.png deleted file mode 100755 index ff4246374ec90cc4edd315cf718beb9308aa4cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{3?%2B3|#`G7>k44ofy`glX(f`cm()_xL(*k z0V_IsVEct#v(BB^e_{LN-P_h)IKKPB&S@96PrPt)|AoWrFKnN5VbA;v2UY;}0!_Mb z>L5>u&T)_hB|(0{3=Yq3q=7g|-tI089jvk*Kn`btM`SSr1Gg{;GcwGYBLNg-FY)ws zWxv70D>D@T-LA6 zlVy!f?vssSzB3!=yjrp|;();3sr|1L5=0|!C7a)gT{JK3;iAQzNozNL6<5yRI!BI^ zKTPz;8Gf;w%|DJdZE#FUbPbVyvthx>?WbQ^8_l^}-ZpXi^F6g@XEy)6ad_9}fck44ofy`glX(f`xCZ!yxL(*k z0TUfPu>HcWS?5mdzp#Ds?rm!?9N&Fm=d=skCtf(Y|H9$*7q(BjuxI{-11o?UfyP`o zbxF{@k!)y8FA8 zzfPSBN?+JM&8uPe!e31?d@8B`{C{GtbjSWdpCT2bwA<%x5fO`=aYV4 hy8q<=nMcWa>N&9-T9!}J6M!yb@O1TaS?83{1OShUoCE*> diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/folder.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/folder.png deleted file mode 100755 index bc0facbbdfca7b2e2986566fd69804cb3f2ec4ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 610 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_stop.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_stop.png deleted file mode 100755 index da764ef8f0b3bb7bc45f9c556a73fdc70302c407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmV;J0%!e+P)mizyaidSQN^B0mM(SDPk##Ger^TTXZ@QNVNm8I-1%GK->*fzYJNBaaLO_Od~&# zng+yC3ex-xT1vtUf_xlcxi=raGhDs%hT+M}&mis&APxl@^aXAJP%|5leVBut#mvK6 zkwHmD0IQ#FK6uBl^XPqsKY#!2268=thWurM%GEJ5F`D^1s^ZiP0_qAv4BmFiAf_u2 z=YU-R3`9;K{Yqb5jK|qr9<1=^uRjbApS_1`loaJ-;N@nA^S2zl!*J{2``19G49Epe zK+L1BCI;8M?Z|xwQ3Z22K6U*g!{@I*;Ra|ai!eZA$c6<-7yzBmAR@>Kmi+ePH-o6C zI73-w16)I6T^Ymcx7XmVkd@$rn+0+K8xzm~QUH>APLKglfB*T%@Z;wnq7C@;1@4`v zEYNsmxbyfugN}+Q0~ZG?!|T^i7`oaKUbues5`&p0Kb(K}@dps~7l@BA0ps!!ka6(j zrRNMFm$0+3FnHN0GQ56p5{^NdVgCRA;}65BE6+j9^&q{lbddY;%g^sy58VYN60jj^ z3Ziff(+u+F`hB-R^hY4K5*!{N0%+1@AeDIU$%kLdwq0Ym^XNT_pa1{=4^D+kw_am- z@#gDypil%*&mEM!0L>3JKx!r^dVtBAfu9Fr^M}trfawF|WrnjroDS4{7M>fCZ30Rh y0aDsPgFJxFbOmAwXkdY|^A4c=KJ*v?2rvMHO3*8~Wdf=I0000fJ^}S^gcb&PJlWA?F8utwBi$=$Og@ufbbR|8&D=FXY`LS zhtFy31W_rLEEhMq`}KTxwvWMXw^N7Ij?{s*9=Pjv94g@d{htvH*VOfRAv~5-|3^Ke zUYK8;|9xnrZ{Qnr1gha~9gxZazrffS_}Bw0fFe?KfGM*~{S_Rq!?liPm zIwnhR+w$Q%3v2=FZ2@u%SS75$0zWLbxYY` zPHCiLMtZfStFuE%bE}}r4=bqfmC0&ewcWnQ%oy!w2`DJ{s9PvY-GK*M(Pfq}+l>7^ zgw^Nluo7YJ$x`i^`X~-5x85oL3g)T;Zdz_V3W)5f`mCvW!T$J82k1qEJK-V(wymvM x`{)_+Xes2of`002ovPDHLkV1i|4WQYI& diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_tv.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_tv.png deleted file mode 100755 index 7e4f9df743ded3ef027532f63cc5669f26509c7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 zcmV-60?GY}P)xM6fti485Pl<9ij3_z z$rW9MPdX)WTKCK4w|%~js;Y{HWaDUHcF^>JkEhFH9NytET)=0iSI3H9;t><9}bmD+^X*MSxbUmSMuz43)qlT4M zvxZkJ?GS!rXqON2>bNf-_`!p%KycPhV701k)B?f5azHO!l2|c<{gD)cn7M!_4D+3N zo8)Jw$9>pE%SFcvI90QPYeDG>ESLN*(rK*;wx@OKdvFPS01m(bH~{~*y2KxvP`=Bp zW6r?8(nu`%FQ!@r7fC#Nwy^;=rM2grC2*g}(grRNQdX~_4tkgT=+WEDiHZnJTNv}(A{KMl7a!G9wE*Sy~ zmn80(!InDHSlcDbt@n~iq=hOo2&;xeJ{*7t2>dO;0Qtw3<`9}Qb^rhX07*qoM6N<$ Ef&%~cSpWb4 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt.png deleted file mode 100755 index 774ddac7bf5ff84d230fa5ef1746ab9910dd5ad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^+(69F!3-o>A0K4`QY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%u?6^qxc>kDAIJlF_i@Q z1^;Jwy4}DF$P@K+aSW-rm6ULRT|!clbJI(H1|}W`)>Z~CSA0K4`QY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%u?6^qxaw(Z0-2v*DQf^Jrjj7P z;QtIyw;Ol?d7_>!jv*Ddk`fNEOGrv`ZhFbjz{JDA+RDHs%NY?3RKVcr>gTe~DWM4f DENCc* diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby.png deleted file mode 100755 index fc0dea6fdb4c78d1e006526c2d4a139e9894df58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMQ!3-qTc1*brq*&4&eH|GX)}JtE?Rp7PP~sX< z5}cn_Ql40p%HWuipOmWLnVXoN8kCxtQdxL1)dr}DEx;$l_5c6>KxXKn%XL7CsU*lR z_&>wb?FL>zo`t82V@SoVqyz`19-bWxZ9K{X3MUWj6i`!+X%mcX6Vy7~p?R2NTB3}D nrTm*jhpY}J772#@pA3`kI3MK%n!(`d>gTe~DWM4f*TXqG diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_epg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_epg.png deleted file mode 100755 index 3d38f34fdf8205274e6232ea92fef757447ea19b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 zcmV-C1jGA@P)?D z-gl7Xkney=g>Z$iA&2!Z%j2E@B*`<~lmE9%gbA+*s|1w;*9q?l-DTMAhK_aUT!oFW zE0@4$Dhc5*d`*{G{ETT@W#Uy z<7!S1;TWNga1N-$SP$lKG7Q~a%$%Hra0XFakT?P(33o9SJ|Z*_Ml9)V8_yarH^;bO z5;o#S7RpEn?;}E$EaCGrCYtvMmk9}jgz~$qgiFlJC9r1Ccou|>IoR~!^S(4o48p)D z0)#u&)Pb?UjE9hOKU#DzU@dq0MPV}s4&tL(<;$Cd6yYA@3S)$+GP1-JlNkcAm4fX} zx3$Csf}n$Og?B(C46Ug=UNdW#|b|OzbvPiE=intx~S}u z)=Nq^)mkGnHt%7zm=f9)6XwdjHHS5)2)_wO2&Wz9t_f|5%S-Mj-E~-V1skETT*9sg z%h_R$T$RI`dG3UAA-m-e&bak4_~i-0Q5Dn<=n~o#6JBA)S_HfF6L69XLYrd3X(m^8 z3euHCYM7Lk<%)JUgmX;Ur^r6`fN&r4;?rFH;I?ZXVa6Vy_%2n{+WXA-m=|sSSFL)} zGsTR{_DFA&W|$^m4$Z13S5>`CstV!QZg)Yp9cx02>-Bnhx3*#w*SbHe-TFjmW2(AB z71oA1GnRmjJ7ovyNoV$TZ!Dx*fh@|xC9TY z;iXIXEUmv+(&pu5U_qLV@9GY0h&fn_iJJQw&8V5?Javg0<3jK`;RQYqVfQ;xPSzW1 zHxN*hs55r7fbG-tS4&=AN_bam{nZ`AxN+AuW%PJK?U_yb@iH&9-S;%;Vkl@NrQ?oJ z=QwsgBqiZ@`kzkvH-fDP^IDI;^2cI@@Za)BfB^u1F5itsc}Xn*0000>oePHsJ^Wg@aIk(lWoXzunJN@E|Y;L17TOS(c*2pjW cI^Vy6k%1?kxmEqK8ZXE;Pgg&ebxsLQ05)S;+5i9m diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format.png deleted file mode 100755 index 421b803d9de682d4981dcdddf8c9be6b94c3c86c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^GC<7F!3-o1OpKolq*&4&eH|GX)}JtE?Rp91OP07s zlmzFem6RtIr7}3CmOJalfB8hHS tb>>65Gpr;hM7r#pcE>?Mn1MxtVH+>Qm9C9*7X!^<@O1TaS?83{1OV!^Jt6=A diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format_off.png deleted file mode 100755 index 073ff7441235b8c7b2b632e40e12c013517bc8a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^GC<7F!3-o1OpKolq*&4&eH|GX)}JtE?Rp91OP07s zlmzFem6RtIr7}3C1v s&U{FBhLz-mNSB?{?l>q2Gq6Z7Y~y9P(zS8!VxTz;p00i_>zopr0LlA0X8-^I diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_mainmenu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_mainmenu.png deleted file mode 100755 index e6ddf9ef6d1eeb64185a27290b1aac6f2c5d000d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 514 zcmV+d0{#7oP)SmDExV+N1GN;Zv|fmCoQh_`BqvfIpkG!Z?90 zY`@Z9ir=3n0UiM>Lw$R_=`3J7TX_R^0PF9u78=$Fm;$UeFcnxWV9&4@R=@!&dn3+i z4jixzauqZq+OtQY8Q~jj5SsO1ODazT3A$8OxF9$c6*l6Bk2`zEK&cq3MhW;@(Gpt- z>`G&%Gcx4dBFDV|AF}!=FoM_JRDdLz5Y|4dFE_9Gg-jvfvk_rG@DJ}Z9boxn@H8^~ z1^(!JYQD0Fy`(Va(-ZI!I08rD2>ic*Gwg1uYXFf`dy6;Sns>J9th;!4>$<{Cz<<6m z1{N=u>j1Eo>cuuYA+EVLt~|pkKjJLnhs6l|*M0>U01tD7^QGcOQvd(}07*qoM6N<$ Ef~H~DG5`Po diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_media.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_media.png deleted file mode 100755 index 6c33a88d72287787230c67feb51bafea4bfe9962..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1113 zcmV-f1g86mP)q$gGRCwCd zSr25DQ565SH;?fc*!i0g zEXiW+0qNf4r~eesTy#VfI%OgpVP&H{S{0F^%;)9Rn&{%9(_$i=)R6a>bu;6xPYrQX z^FJ4zT3A|3c#$nhND5_DikCDYQ&mdO#2N3qk0o7nLaO7J9M%?)EJ9M=pT%EYHfsP9 zSQRcehIyM2XKi$NJwC3paEe8SYRTF*r6hmx020GVLWiY}%I|$M-4t6YFF>sz$J=<8 zbA(KpZWz^CrY4Rs-*y>oAT3;?JIgr|Cc-0lNfcz;EDHBHRwjaqD9qeI>k6ejA-O~S#d8`=Q!c3hJcIC zoQ;Ju@i@l1J!yrd?)g|Trg`q7GvIQ}?_&|8jggKUHsh?uZ*6tby1k<#EMoEr$u+_( z#6+b;pc*Bbm};xjuW|=dBjq>Yh^ER4vo?TdD3)Aw7I7kR?)+p@>rqAZCdNa}xvpJ` z<*quy6^{A2j!iRA^wM?_Ua=ym2>pdYoERcFV$~T^xS!4i7%5QqGUFaKNCaJqy4Ce} z2dw|=?gj)d$nra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%u?6^qxITFB0Lb+1P+0|}m`Z~D zg8wr--EQCora@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%83g!*xIRrxyk}%|TS@8r`SULd z3vUVuy`3=O!-55W-oO8}VZ*D2h6j$0Uk@Dk|Ns9rCMKXJo&K9nKuVw_$S)WuhzuAW zD91_y5$i!gK~^29+h^zYV{73j^K4;OXk; Jvd$@?2>=4xjKBZ@ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec_off.png deleted file mode 100755 index f86204dbccdc38b4d3984ceb0c55562d5bf6c3da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^azHG=!3-qLp4dMCQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%83g!*xY}!I_!%08n3zZl3q_in zTdAt(%gd`uN(k`sXvs*MDk*vD=_!bba&vLUSy=%!6-`Mm1X2PeL4LviQ31mPc4LRNSA@6F${LDi-v9cD**CcDdGtZ8E;3RLc^y?>&7XCM%-&~9Ss=D`q)!E;M zvsZUKX4Fd6JrHXb@kr%JzD1#n;`I2p^?Uwbn9jh=pynk0TTUX^59k&KPgg&ebxsLQ E0GG9PO#lD@ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_recorded.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_recorded.png deleted file mode 100755 index 453f39fc17f3e49a8f40f1cece0e4d4f50cda0aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!1|;QLq8Nb`OS+@4BLli~2hsT+x z$ExDW!HfphnZ=ofKNgg(h6!@+I$Wz-0p{HwR> zY-Ugw&}RDRTjSYOIYCq)=kRiwV~qd!C;T|Ea+aj$k;^OB)NlD{{OUmlit;8|pDVmwc2+ms5fBMX}i nFB|sxRri9d{KCq>$i|>;9dcfgss9)-JQ+M){an^LB{Ts5VCj}B diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_timerlist.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_timerlist.png deleted file mode 100755 index 2e88441391759b500ea9acc482690bea46e8fe30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 904 zcmV;319$w1P)q7Wr0GTpz;J!zVa1Ro}lsst|y2+fo?&2iQ}>F50ee%zz_)Mxy;YyoaJa0%K)gQ%3B#3rhI! zxWhryxyB_lFklnWJfZfeWRlSFZrdTh1iP@&!;`W`12i9#p7_|Bj9xe?LB`(n$XK0H zw#muiw1-NTHj*{XCE*+eXXGhzF=vS~97P^0Zg-6>ERNVnho>wxOQ_ouuYLlJ4#JT% z=Q5DBgZMEsD9f>X9(#C`tdU{)NAEu#N^jL+37{&9Ys`4A^Z0%Hl` zWoVh_UBb&YVW;oF@VhYh9`sXz$8Usu8A(D#*}(~ia<_q#4Y51XVLj2ArCx)3#KDn8 zm**DgJGV(5;hc5qbl`ZQ45}f}&&4SgSx(6p3|wu*sB*YklwiPT4oIG<9K+@Fr5^Zq z5ZM@uePeJm#16XPa3Y)`v|K1LjEpQREyKtk{Jantov1`nawJ#PSM^afF&lAMJJ&Z8 z{6O5W!oUUix`5T+1DDsl(hA0I7}sb2*i{+x>JmyEItnH5YH+-5{A+EG^}5*c2y zawHH|X7H^c0Ua)Y&lqMZ#z`T(Y_G%oonVVA%0}Z2d&$?SoIO4O$2?~$;I(JM)JY-k z(Ad+en7EG9MULY$s8JtOd~CU}#4W8=!gWO|YSb4F@6SKuiln#nH*nY(F%uld+p@eW zHNGMZP9^@YD-z4uho-7IODWNpR7MHaLwi*jC00E&c;z&hC2P@>mDV;a& diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt.png deleted file mode 100755 index 4a95661acfcd3e68594b8b411f1a7d5ceb55d3b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&V!3-qtMdT|0DVB6cUq=Rp^(V|(yIunMk|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X*aCb)T>t<74`hZOx?BgOm`Z~D zg8wr--EQCo+g3Lv28RYl1~+Af+IbGmaX?iJp00i_ I>zopr00eg~(*OVf diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_off.png deleted file mode 100755 index 8b4c689616b735f5e4149a417d2470a220ec0c87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&V!3-qtMdT|0DVB6cUq=Rp^(V|(yIunMk|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X*aCb)T=ldyfy~dZlr?}9Q%R6t z@PCG<+YP*cJSk5X$B>F!NeK!<28$T(IGwO!+v=vo;LyOx;HJz_JI|px4ycO3)78&q Iol`;+06>&17ytkO diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_x.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_x.png deleted file mode 100755 index c344c0ad6e041d2b7cafc7f33aa23afaf0e4f935..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&V$P6Sed+-JVDaPU;cPEB*=VV?2IcxzwA+8J+ zjQ{`tzj8cy8%Vk&$S;_|;n|He5GTpo-G!lpRn`N@;VkfoEM{Qf76xHPhFNnYfP(BL zp1!W^H(7ZZIb{nnd3}LGVxBIJAsp9}fBgT?z|3*@!B6{^n*p{A(;MVw&1e*e1gc>0 MboFyt=akR{0Jw)N)c^nh diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_view.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_view.png deleted file mode 100755 index 988b41965878506d7f5dc46624e187c77a3f9f86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)g!3-qr`RC69QjEnx?oJHr&dIz4a*P9fLR^6~ z5Ug%wI6jSGV=Kdjd2F{=@b2tpc)nTW;6#R#(-}VQk-WZ$;qNh-|Hox6&Sm&{NXE6H z*8!-9u_VYZn8D%MjWiG^$=lt9p@UV{1IXbl@Q5sCVBi)8VMc~ob0mO*>?NMQuIx7% znRu<$I$r;O1r*xo>Eak7ak+KE#YwFSJkGZl91U{(_dh$o>SAGeyqU5<(VGB)pYaZ! zp?_FY?|a|Q|GVTU&#DD?7&eQ`u``B0<#}w+Bi7ll?y*u#!3CL*sfLqpY})Kq&~ABh zP4%@Fsg&1ypL<=4lu>>wW_4_f;j!Kfmgh4=mtP9-^^L3?Lh%`R;V zi@c+7qk=O%;`ZImE3Aw8;yPL0@hdv7{Uf)Qz2f1w7v>YbdTpQggjwPptCEe(VmYAW O89ZJ6T-G@yGywogo{gFS diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off.png deleted file mode 100755 index 8cc9d2a4d3d9a6d9855de1f0ab657ca3463550ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^DL~B6!3-o-`DgtHQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%u?6^qxaw(Z0-2v*DQf^Jrjj7P z;QtIyw;Ol?d3ByHjv*Dd?o4^ebwGim<^8??OWDum`I2jhyk>%q)E+jcW`ow4^b&#PZ`M|Gh#GCFwCmJKJ-P1hT?G*id#4Vz z3puQlZnCC_KU67b7Zs4bu!(E;sr>7gtZ#C4#{H4EJK@~G$Z(s9>4)-p#X_J<7(8A5 KT-G@yGywqCv0L{5 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_1.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_1.png deleted file mode 100755 index 8cc9d2a4d3d9a6d9855de1f0ab657ca3463550ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^DL~B6!3-o-`DgtHQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%u?6^qxaw(Z0-2v*DQf^Jrjj7P z;QtIyw;Ol?d3ByHjv*Dd?o4^ebwGim<^8??OWDum`I2jhyk>%q)E+jcW`ow4^b&#PZ`M|Gh#GCFwCmJKJ-P1hT?G*id#4Vz z3puQlZnCC_KU67b7Zs4bu!(E;sr>7gtZ#C4#{H4EJK@~G$Z(s9>4)-p#X_J<7(8A5 KT-G@yGywqCv0L{5 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_X.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_X.png deleted file mode 100755 index cbab99b812f4f545157f3c0cec71c4fa2198c32f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^DL~B6$P6Sk) z^mS#w$;!*fDfWE#m7_qRcuyC{5RU7~KmIR}Yx(zo!vF98nVGfTA8%%9Yhhty_&+#`2M> kT{8=Q|69C+wSP6E){5lkfx49wfmShiy85}Sb4q9e08#TvL;wH) diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_error.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_error.png deleted file mode 100755 index 620c32dccc198d6402903848cc272ceb46946476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2677 zcmV-*3X1iKP)Y9N@PQrRVK2#5pviQ}M`Zq0cfU4{k!ZM$fKGM;z^@wR28-8n){cAj-jT%sRgUgNi>cOh0;(~rkuGoZ+`s~i z2bOWY;KjqSHNt}av@s31F}TkgcCC&7u6RLmz_UA+B{DDHF4$}1LwwDnr3TH8nSMMG z+(29E-7#bqsI(fjrZ7ie{D;q;Bj{DLn@-AN{FAcr3?coXJz&YSa zmy)FjYMy%~bLN%;3#hgTV{0Cags3SNCR0&}$=O06S$P$y(_2WX8b@B=rE~VFzc&bE z9i^nm+CCf$X~b*mNo|=!yu8A4d(K}Jr{1e$&P7ZBr|v+=F)9ap`t~kPH7@#$~0o*CqAn-&z?<8Ju0opbOW|md`n5F(A-v1 znwl+MJHCsV;RUejIg!c2Qq1>yAud&%L~s~`4D}QlEjP8;inv|}v233SjjE1C5a@tn zK^jU+$YYTjde+>u^+$3F_UV%y)`gxwAeQEHxD6H}W!7BclNv3i>s`iU8xGN98|W{k z=I1RT{#?)5q_`hHK^!8E2yP^W`|o)YSDzWxV(|UyT9qpkOr6X;2>EKx$V(;3`N!$3 z{q~Ww`3Wh}@9xRyt2$T0TE|#T9jOZzk=oc~F%3{_pEy()_a|vP@n+6Fe@+JbC$cu* zt9X|g>Aa~cb;g#ALn@aWI;<5y1&x!NwW$A6pK;>-Gr#)N;s=%$;3B(zkTKS*dxV#j zALBK(7MbRkjdf2BLoL)4^MWh7p<7GD2&kaRWR+kcqDZ9j;-rSAQNfUXGpgV=6S3mw zstCYjoXIAa9)qjK)!qxg`0e5aOABz}=U>cdUs%2hakR?#%DUeVLxmI*19g`&TCx!C zs=EG2;fXEhUD6Y^*E86um%E7(L$tF*FZL= z5|6~VmmHEX$&n%P07n8rs;aU4)Zy_Qt|fr(0K}4I5zb|4l#{Cfj)%}^0X*F>lp8FD z86^z~mtR7B_ZQZ?f?K7o)zk(eJF(H?l~rA_-Fx1+UJ93`a>-&wE5|Czv1BApIWs~Q zbS{g(<$TqLD`nLof#fkP3V9)6h6io{+jS*t0j$^e`M>~)B#eMeq+HHFmIBG5F#t^_ zKCTv$5b82Fe|T-`W7s=#8QK916)#>Nt(da0m9_FV|~mW}~X9Vt>06t&CTu<4p4s4~z+Hx}g9 zXF}>)TzW@F#o?S~Cmd(vw;0<8d(5^GpH|+TmV}cV1jL|?jEu*N$Tswoqss-+(Ik9r zxng+f@Kf9Mf|@FovYZdjc7-=>83Dyj+|`X|mrR4wjAiu8EecbsV@mdbQi_WxQd*M8sp|Wqf*~b-E&VSmPRiHsl-C>Y>Q%DdeOF5! z++SI^e}RO8PL%-aVYq7{GP*&KQA_l*HJm+^&nXS*TKt}%qF&rw0FnVegs@FU!qiY# zM|LFg`sWTDa7P7Odo_Cw8F^UN>S9C!NUK@d9Q6$j(NWvmyHiuYwm{*&c$PpC9s<-1 zBuFXlFT*$}<^acDnZ?-R7}2;2#(s>k>fvfiq7C9f*@h7C%9t@!-_Ss|rtQCF*%K9F zcgm%92Q=I-^c){h?gb4T$d^}OV={rUZFsn;8CGf%G7LmevSEzk;2s?^zB@uJ0kc+3 zAi3!kzSw1C!(=?vc8gnDNW|lB&D^!?=qnvUuK(Mrl@46ID;1>^h3F#ZmJ+HA;pK+mWQko#LH(Y9`&=I?$TD9z<;%SQP{PD0$iD1IsBoAX8yjif zqDACIqc6?bx%1?0ZANA!t@Ci(I;g%Y3{x%@&{!o{(_|vZvKSzaOnV9xTv{Uypds0) z(1ImF_JgvA`!dk0mgZ(!vSNjdueY*}^Wq(E-#)4=|0)^beS$O1gUEVAXs(NwdvwWn zU0|WC2$VcCGKNMrSSg1RJ&KrWoi~rBwzZK~Uj9xlonG3yZCmE9HoU!)Cq0N&{|%Ix zr7qyyM1uO$8R`RI8i2VxP$s{M7hnphEEYRRs@mpdvt&cl()|D&9H4&emM#M@RRHmKcPNsu1nIC)MNJKjMUcm* zOd(_J*d)`m7v`*Azvol^sM6EXu^J2QcRYnRSy)4J*t+F18OmW>X2F6MT;`yz@(|o= zc{%CT)nrsuP^hHD0_dx@ZND&oT_40q0X#d-!4pZxu@%$Xmu_ur_W20y-f=xAT+8EIiDkzo`t0J{kqL zQIv=v6qSm7C_+KnQV6uwV2v$WQ)AFbwkB?}o6TP4((jy^WOsCp-K|;v(c=*YcD?2?V}%?ZJOJmndgm?RTb%Vtup6Bks!pDG@IKblT*!I^tU@;BLld4^)I_U)I{~G zA;}(jAd-~ozF0U5!Uqs2QN=)4>eadwNYRNktT@(XW#x}7|)0zwb zE1gR@FmMD&-yqd^o@?GH&iPIAAXlzLs1C>sW^?|B0zPl9 z5*!nJ8Au&3gQbhAVb$b)?DyBVv3)K4^9hh_WcnS6*w=JFKL2DEmMwDcJj1a#y1Tn` z`a5F;i~bs+Y$NC1F*#se4OKE{DM9usr>2ptq_fxQ6)Ngpn0Ci@rL%2dyq`H5K{6ge z>~;jvkuYu!ltRz20_kd~o}f@P@3j|_Zlw$*)2Z#P3A|MJ*BvRxB(ThFWQG$+Bo(C6 z(wk{~MS6h8HxW)^~>&m{2nbsA(IJ&{0vcB7y4mhEM$hp#azXWyMRiEt-)9 zmYZtQ_)tW9UWQ^0Al(5pMv@;kNLO;C@R?Xff^m%E21v7x+G#OuVVT#1kNK}H89;$G7gDXKwn+B7O`BxEMp-Swrh z&;`soMiZt;X9`}|!XigsA)wn1fK;AqfK`STbb<1cnXqPq@t6c-XD$cnV~X@MvAC9Y z#9>eofYP>T^jl>_)&`3??-uD}NjvB^xxC|Un<(vXrkH7X5_TKvVQ|JE#*gpac01oL*;T=f{UjP6A M07*qoM6N<$f)f(e_y7O^ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_question.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_question.png deleted file mode 100755 index fad2b96e49b573508597b73bb6a9665ed58e5da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2422 zcmV-+35oWJP)3mR`{o}jr>tl zqKOexqu5{{rb%trnl`~l(VAFWY6yZ+Fi;+rS1H(GXLe?G=g!=F{mz})rNaz#fs*tl zzd85LJ@=gNe81oK`<;7*Wm)(n9**lB;QpV#h|!T0%whpTC~$hb(CPy42E*`$qws~I zaPwMqx_DnyJ-@kC+!$bQJ@+%&^wK;u7fq)fcl+y-p?C)xx_f9d5b5ZGKN5q(twAWt zM~*8#?8?cywfoj3i`Xoq-An5k|6g^K)@hoiY%;3Dxyz|}hJ2COAKrd`d-7@)d{w}@ z7cCiN^8?x(f3y(|UDFXJ6TWZ^1Yo<8gTN^07^8dB=ikHd=@ZBeCrA0rwz_EJ)<6IB z@zlo#tZU&wJDcsar48LP(J_B9Vu|VS$C{w|>!G^b74c)0!RfgSvdQyEojHLI-hBrn z=if^*)*kuOPrmny>jsv%WnclDSNxI2rm44m7V*9X2sE~mA#crKzVwh|7WFaY2rzl_ z7%rSThQe6xNng0(+b?cjZCn$u#LWXM*u2m4o#uo6vEXT$9eFnHCg7Kz2UD~x54 zK6e_)6GxEGrgwQmvE{$|`d#`}sj~B?fjJUXeDzvrRXtRc2ZlkGjBCk#0*b>& z_jf>1Jp_1aurQjH;ql<48JjY1AjW22Q_uW(@11KAnKAaPiww=xP2|8yIOq~UGnCuznr*MT^_XEz7fHe8PEbT=Cv^NOcL+^`?ZNaC-?py zf%yCyQZ4bKC^n4sv~SjA%q*I#e4%#L7w+bjw|bSd!v_vxESH{m#^2J<8rXySrhbBI zLu0^?ct>x={CXx;bF6W1pg@L9yS&wQrBJmcTA-Z@jPfCsc?VVY-%~mGoBE)I6VO5l zxPx6x10lPA9SLrvP71@PDu9`m6NUs*V?1dVfvEHj7pW7N-YD?yKZY>0eRDzQDmMg+Nr3siZRnv>V@J_A^b3OhrNo)92%LL)+BJ8pk8{a z5>&8t5o_xg;SY9lOlw^AwwdF`AE(rqDm{k!Dquoz11D70G#AzQ(ZyNTZ?Bs%#bgUT zT?MLP+A7x8r3g38g4f?{t9b&HSpsF4B~zWHU?(eT4Pd^EY>T>L$Jdp%W==lk)dW-y zs&T{vdtR%!AM5%Ynx`&DBu=GzLJV$e0+dk(HV(=lU>SaLEQe~Ps#JOSjmJo~=d=W+ zkJeU?G&zVz2C8I$aWTriXU|lsuraY5q3A5QCSxjno*U&5;?OlY^;epo^Wms4? zJJuyE6^)WfRZ2NH_>2?*{kXp-Fw64p&SytfI5nMqcT~7j<7qZWTkD);o-vzz)B0&++b0{ccx2mmRbaoRD`YB48`pvgt0lu}uGH&ce|{ zm0O?Wxx)y>X4%Y)2e<@cvs7+%neDmCFms@fLgMK&SKM8|3j9zX%}@Xab59A3&sAo~ z1||WOfr=6fmmWqwdokDx^B2vz6G5svQ(>~tu& zUlEorOV6n@7WVEpF*0Hjn8m;?854qSazAHNr#Ly^%{C`Oc znM^5@w6g!K849{P71a6h4DWAPw^r4!>l48pEApLwAD(kK#bUYo^awM4ij!t78<=z_ zCoAQ#taPblkcqR7+E*bv6<+x$uD=7xNwMD;Q&K|9z%WJ;cuNlV;DSL{an^LB{Ts5mpwQJ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_error.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_error.png deleted file mode 100755 index 152028a9f2b63a295ce914cbdddcb43874d6a511..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=C2Ka=yUSndCk^q^vE!*f8kYX+g z@(cd|pW*r`UZ8;tA)YRdAr-flT#V*ApuppDG5g#8j7;g$9QMFj@=p~iJvSaSJg&`l znIqL>zkaXc-<>aBpZ+}Ij_tBZimPOt&2OlGRIP39F8uZ3MyR3rkJvZw{Z}*bFz{(G V3D(~DBm^{{!PC{xWt~$(69D|$P5uA? diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_off.png deleted file mode 100755 index 6dd62987a13a58aed5dbf3bc3f59d9446b355b11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=?1^9%xN=bkWQ##>e1f-Zsg8YL2 zGd$gH;05G~d%8G=RNP8RSRj<(!o2v<7SUxA3@j21|9&wt8j6S10F^L!y85}Sb4q9e E0Jc;sDF6Tf diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_on.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_on.png deleted file mode 100755 index 6daf601c970876e8166bb4e688977242b916d7da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=C2Ka=y8s{=dNr23Ym>22*q?k*B z{DS}gXSjZf7ib`ZucwP+NX4xs7ajQ;6nI=NKD__`!Xl9im!x_&XMVnPHAJ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/marker.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/marker.png deleted file mode 100755 index 82c21b543b3431334ce246c935b521fc07790d51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^qChOh!3-oNV%0$sEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=?1^9%x{{R0U$P7JnxeiD%l?3?( z|7Uo*-M|aT3-@$!45_%)bCH|tfB^^V!LR?OuM7FJM{(EEq&nDuVeQ1As;ym7`&ty VqfHEtYyw)r;OXk;vd$@?2>@7nPq_d9 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/mp_buttons.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/mp_buttons.png deleted file mode 100755 index 42ad3209e2dc1bba6d58cbe02462c0f6b8341c31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9981 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 Hu0mjfoY)I; diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/plugin.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/plugin.png deleted file mode 100755 index f75cde0ba2eb20675dedf9dfbc5859df78666599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1778 zcmbu9={FmQ8pab5LX$Qz#$J<>*1m)ywI`^hs9kVqaPvRh_nhbbo#&kA!~1@D^6(zcFj*B@0001Ub#e3( zGh8ff2uQr`8av{|kc_}y#R32wFD$_MLa|p)bP7oHCf`g`>Vyk0GBQ$CRYjpt2!vc^Wu>jHEt}0QE-q%VSadr5Q;)D&YN!DRspVx@UJ-jgga z&J4KG3)~+CZf|c7l>?9Xgu_W-{Bvd-2I6}(eheV-w-@`<+|*wy=_lmg zZKPjRot0I>{=c(PQ|Dfguf@xi4vw5UiCbBfQBr?KFF+?w#G+hxi5H6Vv~7b;N$RuK zvz!F!FrO~tp8s;Qci^yk?HQM35EUX3iH?71QeY*ZMGfia_fG{z7X(3v%#k2?wl5ux z9-}lfQ^Q7PG%Ps%+tGD$S5ytlTY1q?srwf8{4Fd*zmgR9Llsx#LXXenI+)_j#VXPUqI-W;zy+_|4{z zm<{c5+%L9sQVywI0fsgF3NvUMF%37mqca0NYF#uogvb#-<8(X}whOqq^FQzfnQx4_ z<^pvl$_?2v{cCcdgisJqJbN}=MU+}a{;|^4nDBz8R4`A3+>PD!xY^sJ&-PySKt4d zk+BiXs1hv?mVU^@1o3>ls?j7pBLe~IQmtSn&xRJ*bwwwm;(~QAr(dJEmCc8F7Fzeo zFC%qB*43W;Z1PkxThF9Z@qx$nusU=*0=ziE{PQdLnNroe4=nfY@vGnUxo;>vZhHWM z4?lf%#J`ce#2Dl>Bbs*E1orx%WMHgEc1ezP!8~4@lTf1}K{XE5y1Vpw6G?AeAqK+( z{ns3QuEWqL=YP#(pk$KXLTVoCQ%wjjyX3aMyZgE?x*65Suj(@iVqBv&^Kr^qOnaR` zhEpU1f)nCSnVLs*?yXDq?8Wu&h8CW2EGw0bG;P$F&By3u8@prDiX;hZ3a;^PfP;UZ zg;!cC2lo+kG9fkjmhICHJzed$13F?#Afzf3QH}ym(p2wX7gA=ne&Whh&TiXf9Caft zo?O29dr0HQ-ejjZH5ypo0fEB1l|3VL+B_fd?$lda&e;~&P2SvUVBDD)MxOR-4SaQ< z!Uoyes&OdkuHzSBoRCbVGZ@U&j=U5xyCGx4bhU+9HhBx#ota-hI=#1f>k+$tH=wb; zFx_^fgotO6n6#z^%MEAp-k5Wk66-ewPKMv-LrQb7Y@}Ix?q-GJE2F|JBrI58vSi5f`}yeC5JOs+uECc}sdqy<9@wj0BgVzoF-Gr` z<(#Ud2)!4$qKc=d1vHm=5EtM3AEUY33pHbzpQAb!4MS^_umO@0Ml;ssO@<{u`!$Ft z)`Z=d$d#FX2-R@hkCSr60wpmuIC#k?3~{W1FMtm5Bkt;bG)$~)oi zXn`=%zMMyenKgM=^AEa5ScxEq1#rk3VEN7v`+P?3S>*+4jginrZLXm}(LB){0c5tG zOU6cj0K#RYcCgP^cyjhBXUDWYMOi*wDN+OoKf#63=9hw*u$I2jYV&`XMeRwwlJFMI zTns)BO4g#RGhd-(;K`TIu!dz2N=oy8erhj!Z8dB#aqB9Lg*%Wyc0(apNy6y8vs+Qv z*dJZ@j@rx8z6fJE@Rd+70%}c%JFb;tU4Agq%mO)x-t@gsnO{YU?02${Nf3e=JpS>j z#(1qbr*Jb@oyJqT_g3_r Ij{7m|e~=Sc#Q*>R diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_logo.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_logo.png deleted file mode 100755 index c0a16cfb764448c72ef1413e09fd9b9cc15de4d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1121 zcmeAS@N?(olHy`uVBq!ia0vp^MnEje!3-pgJ$!kA6id3JuOkD)`V;1?T`z%r$r9Iy zlHmNblJdl&R0hYC{G?O`&)mfH)S%SFl*+=BsWuD@j3og+A+G=b{|Bn)d-m+pr%!L+zJ2-fF9CFW0YM@8smPdGqGgt5-`&Np0W0{m-922?+@v9v%k{9C+~H zK~+_ixw-j;3l{_g1h~1m<>locKYlDGCZ?dEz{|_a!NFl@XgFuioCOOOoI7{U)YR0{ z((=xoJ9qEi&CJZq%gdWQd2(7>T6uZ7m6g@|_wP$eNv=+1^%3B7*(ddie33l}a_R8%~F{=AHg3@a;ZP*4yX8=Ibpa277)-6L|I(Y5r;uunKYs#c_XK6#8 zw)nYkPp7CT@+vM)opRCWl!or=3ws-SQDeKmDU&9vPY-h36cJaOsy7M~LJdb!%^9`)s}XFhOg3b8b1`mt{m zFSv7O<}cSLbBz0#`%Y|#49i^bbSsZY;1ju;Xr@`;!W$SFE{HKkGrnr!113KPPgg&e IbxsLQ0OadSApigX diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page1.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page1.png deleted file mode 100755 index ca690b2530dd830af6fe559e7f647283b9711f2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)h!3-oX$H;yMQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%X$AO%xC-#|Ff%jpaC6$2X>)P1 zv#>D71UvQArB>vGi3stfM0o%e_BEsd$q*CIb|A%9666>B9~m&X9=LM?DC6kq;uunK zE9t>eP6-aL!o^G~nt3)sYh-K+4xH;zI(o91WrxRvrkl>QuB?bH&{Rv&G`q4QCDDPw iO(}Wi6%kf}1O_1!nOE<6%`1S0F?hQAxvXra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%IR*HHxC-#|q(pgeak7hv2=H)o z+L&n@>#2CVm?eh0_0*+?``IxuF*cRP6=wu>5^Bqv&aejGk@{@nzYek$q1wxL-9}q6n zF_h Nucxb@%Q~loCIEQ3dU*f< diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page3.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page3.png deleted file mode 100755 index 8e6a38f17eb9c9d73dea53375272238be50fb552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)h!3-oX$H;yMQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%IR*HHxC-#|q(pgeak7hv2=H)o z+L&n@>#2CVm?eh0_0*+?``IxuF*cRP6=wu=Q@--;%xD?)ZZN2w@mD*CT(@81&xb)BX z2#cgFWmqHP{Ec~Td!=b9Q*7HxEeC%;$zPMVe%rU-@3PdOZLD diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page4.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page4.png deleted file mode 100755 index 6916b60f945161092e46c5542a063dfb4ac55334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)h!3-oX$H;yMQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%IR*HHxC-#|q(pgeak7hv2=H)o z+L&n@>#2CVm?eh0_0*+?``IxuF*cRP6=wu=Q@*Pm%V12u9{i(m}Z-uRFnz-zo_(>Nz z7m*GPhQo@dYE~p)pSLja)s+?{=e?Gdul%pwY5Q4uI9K&_;Zd{Yyw#DR7E7}yWoWG0 z{p{4GlUXHgtE8?zYBFiNxn5^#@~6T$*9VKAn=ySnHDOXkAZPk%?*>K&ZBczsg)2tv PAoqH@`njxgN@xNAD*b}5 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/record.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/record.png deleted file mode 100755 index f71ca5c9de1498b4a5603603b19786f174a429ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQaEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=?1^9%xUSnbcGB=*QD+Z*PN`m}? z|1&(@Zr}yvd3m}xhE&{IbJ38GL4m{h;`zV&xd{%pOQv-0kyz=`nlxL_ahqO~R@&kn zTlMZ`OHJH)SvhjwBL1rWDnD-d`7^~Qg@>m~UMiPiWMf#ikl~a=WP~-)R0dC1KbLh* G2~7a2YeZ)N diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/redx.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/redx.png deleted file mode 100755 index 2bfbaac434c1a226c74ce48fc951c1f4539cb88c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=?1^9%xUSnbcGB=*Q3o?_bB*-uL zKf}}Q23|m3gr|#RNX4y|iGh3v6gZsazwiGdG&dl^_@}`a)~QU1%{F!{E%^t%y7o8C zm8oM{XcIi^1e5NiY{N>A)6L5!`|01Xf3*J#ZfQbG?AElBlJ5WNMx^;$tMz4TBJv_Q~9 z5wwskMwphEMhS|VT3PBWcR%;^oij_~*66r=!=0IX&b{aS?*Dwtxk5pH7A&Rp5B!?4 zU1ne32ZtwhP)Y^-aWpD9=U$!i3I~zzRD%26fO57 zLp`?J{DPSCW21LVRYiMs7dK=mhq#|pL;RtN+8D6+O}o$6~i#f zN5=xt-P4CxTM5~ zu5&I9R#&&DQrEO{RZ&6H^d-q>imG$fFu-=j!G;C~s|m4T45M$U%(N^X@t7;i<6x?$ z`YmFCj*=#8h5nr6@*Jg7UQT8{2eS!ru^vK5(qM=7)xhBcwcv6&XML|tBZR14x*Uzl z86Cd3C=c?oGZGry<4%E1YfE8Oi68DhY=pMX?nq*FI^anCZZJ&?Zr*AtA7*uUg?< z%a??Jj?~veR%SX^iYXQfYrMUu?*~6OO)@=HEbR&q0Yl$XSYc&lVk#RM3-Kcn3j|eo zjEa0{>zdT}wz=~^b&7H>utAlhq1wkBUlfI;o&Wl+M?9O)x_17np=2}=>gQleINT&j z63DVNFC}I!Cd)EU8MaMXwCG}Vsan{U#v#uS+}yxo^U`+aT^vkNG#xjBH<1?7yq?8} z8n;>&v2Twr;v}qS=do7xGu6DQ?nQ&bt#&*aqo2J*k)DhP!)Q`|%$1Ww zaY3ORm_}JbX4wGe?F@vJV+>{D)|&ht2|UU0rR~QHZ(xLGq+*g}8QO|w>11P;#)_g4 zSw1oP;8-8qO~X8ne|x8W89|fMyzVl5nrjGEYugLAH^Z@eQLGoCuzCSc2bnlCfyKm; z(ASD3Nj!)$*We&teB60hTfV3NiNd`OE9xD#>td;N(q&8i!aJS)6<`2JvmE;j3L$0y O0000sBxGugCW~Gz@y=T{@yaY- zXhL+F5O>Iu|YE&Wi2p%Ps?e0etq9V+Yx9>1)09h>FN2-cfRjA&-c8~ z`;{ro&w>9krhShSw)6D$$Und7hOX-jp3GgHZ&c6B`s)LMz;n8$JGKiz$B(M0I?J*i zj^}RX=H?Av{H|x7VHiD8e}))a4=f7E*4oniv9762k}SK8c1@#u+h&FyrROyqhYm%N zK~>dW-efv|>-OCn8v*hgSmNJ)tLw+yuqIB>Z};bc&_FFUQi5lM!{r2wd?J4uq?FE1-Dj02xK-4Uom2lC;=cTPi9`Tn$@2}dM|ge6>3)rHbI7uQ%v$Eo^AI9wgU4&iVl zomSv!=xdz%#JP#bVM)cR;{}Kn*P+J)XMRB;Q)Hq@> zHsOVDe(1wF5+{?aC`QJkS60(CmziM)v&Hh7BujOI5QI&_8r9sZ^{M6QwKb z%5;8V0JB-G9XMgFfL=w*xiM&>&ez)w)-H7a1ixOp4G*X1;-F%&xEzE5oY-Nv!pz(v z^!1OzJ&zX#Z{3HZM=H=BvS5Be0N?CFLSSaI8E^`!5*K1wnNsj%DYSeGm_4*4TV>hB zOIP6Pz?~=JMq&Rk;xT@gmF90zx&Sm)H?iqtjfv-sb25D-1GqkfplF<9`rM+fGHC%L zpP|UhaiukIqA1w=jB#GZ3#9(u2j zz!YY3avk%=_z27+1Xe2z#+FusL#`~RA#xrMEDecE2WHo$pZj-Zx4}mf3`I6d>N3P4 zis1-u1ivD>$qb)%@EjKhh9#_feGykz#qbAM;iri;r^EKtK;c%~Si-2z`jDi{>w$p~ z5EpPyewK{ZY~~H-IF{X2P*nJ-s*oGtykqEfX9&v1t+l$aBwXI(%6J7keu=`~<3M|$ z;!Zn+^_jE%KP1u3KeM)cZ1lx7T_2St`AsUhN&k$HIcGR+<@h$ABd9jg-EIYrJ%wcT z23JGp@zPJ^qyiQrheNF$L^C~&G{1<0IPrD=g|#*I^m9nuwN)|nE%`TDX~F{ie~iBc Z7ywV;dI#l?0LTCU002ovPDHLkV1m$rfeiov diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-c.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-c.png deleted file mode 100755 index ca0c45d495f1c0e52af0f79438e53fc7c13fdb7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2454 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 Q_y7O^07*qoM6N<$f~%j+6951J diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-t.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-t.png deleted file mode 100755 index 19a80c5b83758b5ec7269341efbbc4aa6ab634be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1471 zcmchW`#aMM0LH&Fx0uSvZDi4n7K=yba@H_s_#S% zV!~NuYXAVD@XiGL{r&yj-CbE(*}c8J<>h546bgYrN=izGhljVfx0jZd+}zwYH#fJo zwsv-Qs8p)HzCNGNXEK@U>guOYpVraQDK9S%4h{|r3qzq$xw*NOm6eN&iw+JB0|Nu5 zrlwp{&CbrQudi2ES5Hk% zak<>g%*@r*)#>T!nwpx8jSV9sBQzQ<5C}LN4vj`5lgT3^Bb}X{LZOgCq1f5krKF_v z_4T#3wt9PecXxM}mX;0<4k8eU`uh4GKYq;5&wu>*(cIj;u&}VVxA)zyZDT+>EoHjWy45Ty2e6i(a`E2e?y5n2F5w^}*^E4Luj(bdNGGRO5Eq9s2*u^xx!#J@bd;;RZQ zednq#Do`A5wsE!aHme=t%N=YO=CfZQNId&xIa^8eEY3F*h*v(;uef+TK^RRzs2?w= zM?-x5<@-rqw5K;s9!4LiKz1lxA9=Yqc3%LENCch)J^LW{=Rb(JO^p9g3qY*`cxlJP za5?;8t~0CI_$wA%p>+da)~TSF?@m?J#pGnqbf-7Q2jIkd&W}M?eTjy)j>U7oco)rc z6Q9zD@4={*O?*$Yf!wPW$Ci`hzXFky&~Iw&f>(W$38U{#o_8h1{$4##za2cyei-2& zvmnY^QruYB$@8dO1Rrj1Z8(*92ktDT(Mv1RhJ8Aik%l#s1y03yITk}JD&h?+RrRIr znlyDz<=tdicc?zjHpGIE;qbP3x)z&Y?orwh;3{=D9AMnKP*67`SPLi@D)+y_V=nPn zl`xrH7*kihIV!1u!_C1^^$%v3oh8vRtLd&h2Sk0DJoJTA=78EmP#H?M#{ErCtS7X& z%}S;wC^b;i|MmqDh#n|8bXI4<>xH9e;!sXvNSC%0Q}Ny$QW%nK!4=@%p2uxmn9>6? zt#D7*c_PqPQ!f6q;E1v%O-^2^X>X_=H99@jK5f?el8|>M!rc((BCs}H`i7wtn~R_b zqCZ-XYR_Hs4N*yb{g<_SzKb3fL^^K+`|M$Nc~DO{k?w~D2raYPN6`%I(5MmXdxVLv z>vc_`SJept(ZK8gm0KEamhomXgnh!t_z^h8_HO|lQI%@7t6Fs|3t|xTk8J1@>rXjq zO5r3V29Dqqe^&{1dv?P10S4VE2x)C*kkIH3OThxxDWpxOc*!a9{HvDwCsr6vEMSJ(cg zxiWPu3vGgDonX?vlx$^qKJ;OXk;vd$@?2>{V*O?3bO diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg.png deleted file mode 100755 index 9818251bb0c5880a5f4431025409986b04d66836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 947 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xemvArxNrR2~5sd>h`a&0HBG|B|(0{3@2~`wnoK3ki|*f?k)@+tg;?J z4rhT!WHAE+w=f7ZGR&F-ax!~~r>`sfO;%BE9*L)Z-xY!0+T!Wr7*cWT?VZh<>aN-ux^e}U>TMcz)cMX%mCm7d%0;^eg0-Ht_{;!n7oBu{OUT&Yeal-k$ zYOR7-=YJ``7s}~lebukTDp$VXxA#o#8m*y`&DC^g{jrh;`={gfmxFI95jp729-2G50-4pj%14hGf^2EheD zW0^!0m|PkZ99TFos1N$gUn0~NUg}S+GMJn2lKt}DSR@_JhS`l(CYdAEz# zH&;5Urp5oCBB#*w_-e7+TNxCkL8f5(9*f;iPP6PV=k&U9o{`VZk@K)jLb}M53uhU3 z9TeGlV77BZJ5%*xh5dD}@}nB9FDq=n`%C1(H9@uSjQ7ql`mvgEspQw6-MGJ!eb=EU zd-mTBu3yi(uG)J-%|8L%pd9X~{#G|Ixd3)vc`!NbBTOu?joWC@mO*8m@{%qzZ UkGbl_hZ%st)78&qol`;+0Q_}F9RL6T diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg_mp.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg_mp.png deleted file mode 100755 index 594afdbad71067cc40d3a75e4ebb035662eb4cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xemvArxNrR2~53VtQ&&YGO)d;mK4RprV8TpAc7PXD4N4WeYPC3v)9i zMFj^32LpXwNl8fqJzWiTH4`I47bhnrB}H*DF(oA>OA9kSJw0h@X?1nA$cP9jDXFN) z2t`H3fPjFYzyM22O9cf5d3kve5fND#X=_W1|NsA6{dvC^XqQ4skYDf#{D9&4X^x*j z-_7=PaSW-r_2#Z;|1AfBhCpF6=ZLn*%_Wci|JPrB`v%XY19xKPdc2=IVaHUv(3|S! zciSVI7&fndA@wzI^FhS}Pk$VDW)}WsJ8jz@z76s9?c1lnuTM<+{O#kF7gjbBO6o?r2Z=mQrP%+Zc*83y956?*2g9)z0bc{zy7Y}fqe(IY-H(- zs(<=d`R}V^4Ch(jm9J%+xo= diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mediaplayer_bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mediaplayer_bg.png deleted file mode 100755 index 7746cc84d002eb771e3ed2aaf19c9aeabbb97c32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1840 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
    vo9{Mb zC$Nun8jhU1cvll?KJbDGJqZPoi&T9Pqpk`y&fCqxaOLJCP<@)S+BRon&ghRj0MY_ZUlbTJBP?t6`Pr(@0MH) z#UNlGX>Z!r>(&-ksv00J&s63ARL>-<%c^;9e#9qRmE0m%=4^$ulhT#H886ml!(O$h zsDloe%PI0VUtgA4ruf!Cz#o2d2w0iDT994R;IeFWdU%xOW6pNv{5i~ZuNM&bWDkLk z2n?35J3{5yv+Ctr1Op|z_z{!n71=QCXtEmyMOv>&&bVW?Rph7s<-L_se%_g>rq1P| z$^B&wuCd{3iZcXGw39(dA~KtQLv!66IFk1u7mTjEW%ZKAHZ{4+%OeSc9s^{5-JTrUrP+F-q)R8=@MX}xvicy@(Y^R z?)`pmN6+@Li{iH-z@Xc+Iv-zJzG)TrHK|rxCa?MZ&V84QNhE{1hnBNZSL2OBWKy|# zgzOAyTm0|PZQ+y^W8_i<)v zy+~d&cS+FwlrcEBydfaj=P_k0UtH38eaE@e|7GhA1U97>%ELd2C35nem-&3C#5EE- zOBkunAR2@sA`Cv@xcm|qu!A)&lvW(}@t4`|>el{!`4xNKx2dp_{rgrOmpL5;o|$Dh zN=K&Hi-e93dK@N|T55bO4znhFR+#k`+KoLo*z4_X)w%4&EEA0^ z_nUNi@&|l2bAu#Y}!mShnd)RS}<`8f}h4J9}P2eq{ zF_CS*&O>^clXlxSbX=llKF7(FT z_a__F73vcintzb(wWdC}t1>p5)=jIcs_5 zPv_br%r+<$ILZUZ?jy}>aSgeC5U`&7wv1&3AV3@ch8+1h^P=0T>gCa#=j=+=iV1wQ zmWljxD`&NhKg{;{haQePKr@ek=C2kQ4D+I^{%+^w+9V}PB;0z?cW!~ zN+Ut|RLzO8ptNk}l76X)Z95oa!*gBW)@|jHvrGG#aDd`jM&ci$@S}r&u9V}<2d=q5MzFr$!iwbUiJ6s%Bb#HCAUB;dnaC;Z9d81m_rPT?V1tPM}Q{%`= z);(gs9pyinRrmG9c!f)_MQXJGeyvqTnw3M}ag*2TrSxQIhgw8FYsnnv!l}3CE`!)e z$HrpZV1y@uRwCGA7iDR~^C^4()oGn7DcM+hrE1J^Cf16Se$ru)4@(&Pa6Ix#Y=!wT z{N*}-Y43}Ehlx}h>7n>5HK8a z*;UlB5yEH?IU1@)Z4O+RS1R$^&bYfIy~gHjsb5}xEj)hCu3TG3-1SRD$h%2mGh>IG zjV+n+1hKS+8y;XDOC3O}p06tF{jf!E5(LstEjG`(=~pZ>Z7CG=vK&w*dF^81a~)p5 zgP0R1C>;hPo)Na`2hmeR!l>6w_Dkc628Mu ze*4Y!OBmF7qZCsz$u@F#K?8JU>7{_f(lm}7R z7vOVa%1xjzLAtW)-8*Z>4N2tb~m(t~Iabka@B7W_ZJ9yjS>`8FJCx*?wu#l}u0aH~zT)qjm3bJ&ySS2*=Kh6U z<^KIBX{|0!?JghqOCXHIR#%cgG$%a!@YUcO&$I!ZA|J%+Sm*>Ctb1PGp_Al}Gl*T^ z3qu(*p0sG)$w>RVSl&#y%@Mo8WRSSSdA(VOreP^8J3-B(2jHnI#U=)sM({f9R6 zdYtPlu13GQmfT+>a#l5_IYj8}g|ZKs@9Dl=-~KeZr#-Nm1+g7C1b;AQ>277&Y#t(n zJfSQt8yj3LDsb7Y;#(tpKnIQ-B=!@PUiziAIyjEKITx^e!|wj>PvR*<5t%{-Ty^i9 z4gij?_JF)}+agXSol{VS9EcY+4~ zNI(3wp46-fHLv?O{r~g;7o6#*u7ThFg}-Ie1}a8p;9RXQ_!S%j@^BLH6gUplffA60 wGsP$1(h0b946Z#2w@SnEaafbuDi4(5iz>^(HK)GG>Tt;qp5br$zvh8|0G~FAi~s-t diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/dvd_player.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/dvd_player.png deleted file mode 100755 index a03c015854653c80ff4fce66f4a714a2ff7ed6d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10165 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/information.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/information.png deleted file mode 100755 index d596493f8eab1dda0c978e7ce7f1f49517659c77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21004 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 TxRZgw4uzJ6o_evWb?83;G-fjH diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/media_player.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/media_player.png deleted file mode 100755 index 0d16cf3763fae34b5c859ee9b65e9865cf301e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24816 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/plugins.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/plugins.png deleted file mode 100755 index 31348a9b6b9b0934026314612e4a605dd2b35ea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23588 zcmX_GWl&pP*S!$jt++eIt+=}t3KT08E$;4w;>F$Fixjuw?otZDU5mTJo9FxSW#-OJ z=4O(!&)IuzSt~;AqZ~R4F$w?x=nC@E>d^ZV0Kl*zAwb_9SfLp~Z^(}Fx-I~Kiu>OM z17u_o0sxANm6Vj4nx%uQgNvnuBc+0r6s4oHgSnOMHvsTl%GU7ENxZ`sUBCN=sU^8^ zUYlwg2vE~hA`N5d7GNa+#=%%P;sYV!C|Y>$u(RYp_kW*5k?7bs#?<@-lEz_9P+H{d9- z_QrZG;0FNU9OUKc?^+}F4D-tYfCU`q*l2NvHs6BU)abPV%6MRd8fPCBCQcm~X44$T z1BMBK8jX506d(xzY`uIXsezy9!11+$C_J!Gp148)EEJHIBLUGcKsuuwEv)!&!02!cjrNlLohXN zT{h)kfF&)!a{a-8dl@-T4`tf>A<~QgS)4p4Uu{^Jj1&bG^@PqOzk_2tQuK{`(_tgh z{}%f6b=mtIaLN!*uj(!gdT}zgcdu5D*&l10ARgRqg)RgxEM{+wFe}0~?8<^T!kj@KyUn7Bt)`M5sjgi$u z*4|A3Ym6W*jz-%pj3tS%113euCrptb((D#ofNQJ)5$9oNY+^O^aPp(?Z{X+$9yt;q z7!l_561ImT!$}My;Tls3hGUz=EKpA(5v0e!Q5(ziB!G)355w_3Q4b6|7r~ZGTE`p6 z(_FGT;|WCTi$BIK4^wjec>d8Y$C(sZ_X+eD)=j*%jDq;bV4lm2D-WgtIHka5hPZ)T z1l&|mI-_*p<_h@zh%p7vaAKH8EgI`bg~=F2=n&Hn;hXO2@M^{Knv&`8xxXXn&M`hi zqJ@nF;~pb@4aVxV{T>%5r=zSRRYrGA(}2^4q>UUD%-PF8omi&YK?rEUPSK`lC3zk+mJ9 zI&dXrYJ77XW}Irm(@5V=GoIi;_?9wq0j+vb5{@G8H?du~;#@At^t_*+CdzaEBK-^( z%+*t{%X3#_*9a@e<#EfPo5;kM8Y^NgoSV+Dvaq_dWIuFmLtYIcmr0#Y{bO^0c({KU zbnStL9*Q0`ByYk z!DOvu|K$Cjnx9=hi_LlcMAfYLj9Kwj%dbTCbG_PjIr3lpin(&K&%et*R8OjVsK=^J zeKIWUG<^B~Xo_AJ8X}t)DqpB++B`@UO@%+m_3c7Oa^6`Bbi`tlregA??%`P39sY^L zo!v)SL(1i+d8K*0dG?;u1PsPt?Z&ylVwU10)g=0)4=adOjJ0;&y2`xDzlv|kd#Q8D zBDfayNF@ zg*OEM&gRc%DEK&dkUqo_*>dumo{z_w9@wN=walCcZRZTNchJ6f(5XpN3g% z^Li49npZlInpEmvXtUG2A`sma#xwAC9376b)yBTRG8O4VmY##*S1w7 z(auE66wDlJDyzz@>UYnyTgThNi)H%5bfaOv#CiODjB=cDjBp}wYkW(0Yj-F}Htufg*nU*B$o&-Ztg6oJ6;G7VN^_;6B|X1ZIko7t$SRPOm6TPej&7CGzzpGNW^7h9 zXJ$@B-|^bB8zo5$8@=11d2qQ}erFq^JX6@9Uaf|KugqS??D>W8i)V{`hrHfj?sfCm ze-AXM-|>Ar;%d}dYU&qSJasQNsJmo-Oq-V-DnRytOeRo~ah zw(M9x)z45YJT3S!qrqxpR?zX})XK!{-Vki0qxv+F8nkEpi^J139ri#Xg9)GG|BDt`4>M9te5!uY^xpQPxh_!O{}K}G~XZ{$$K&X5$tlS zWG%GI6Upy5JBTXGCi_Yz*V+8$f5y3O>Ndn1tDTdV%_ws5u=71}yVR^SC;OwA$lvr8 zuRG=EbQ^t{*Eu3^1r?~ z9DTbRJJA-dcD+_P5}G-i4S2Nfo^yfRL)Z**y*kbYk4c*C=~qcx=-O`X-EU6_JWx)R zR}8#kJ%2rSF1`Fie8l`0(C}LOt=n$n-l*GXs!td53BvjVw)c zY&Hc22|97drP*ZSW@%k1?$oHi)|=OnOU3^B%hr?9l+N?QIqE~?R9CfE`IYloMfoqm zA(|nI_DL_1i<0N6$z{K@mb13?p$>|4#%J+YwX2y&)1lI7)jQFB-`8jMyWp!Qx<9$x z&}tLTLPA9X0BU1=pFSl*KU12@tE&KjHyr?gg8<;+4SGKW05=W*_y?^{1=9e4z#+kK zKo$T#NhnB5XnHOkcX*{0efGM06WQ0b{&iZtmb&O+{w=WwK3PT6Rs2(uwgenD{3o7A znn70CXoqW+s0>T}0&Qg;dde9_oOftHs4GC+96a^6otkbZH^=)cU1I;dtgS27Y{6JS+(woml2KvOr8!lsYmD$%^W5O{)Q%BMvchdb`k2SA-GR1fcV`&f=aou|q*MIeZC^$vF zu;%R3Utt&p047e_5&~Y@p#u;shWpWXv>d*R@WFI_wO@^0>f8@8?79;mbK~FVK-*5o zu|+jKcB$1l9?0Z#82qel0JRky>vwF5yxi2~xMWqD?RmHAfm%FLuhvi~n|M%&m9|)q ziu;)W-LUfX$I;mbUUG}5K%`28j1n*ox*?u}klN#Q*J&Cn=q}=E?a5j2+5bdryOmy> zI=;I=CbGt9TbAWZ6I#0RUd!t^_mnXAkic88F`;&JRFoyeFhHbkkwqU8Vob6nSZzpxV)ZSGve=OdnT4Hk0<^QS}=z<=KFSRmENp>bnKOdbI z4{#8(SJj{R2pm(m=Ktq<8B9V)~Gmex}l_%hjjT-@nQ=(^;F$8grSme7GDE(Rt7dak~%eJ4u?J!OoEXtS_Zbw>&#*g(f|&TPN(pOLje9rEO5G%4jha=#B3fnPyt`7L z^PsijrEFk#N_Q9zWFV@XInW2ACBV!0Jb zWcmRY%FG2)`hP3ZVf`S*35xQ^RGxC|M*(ȗScDJj0yqC{wKRw|`>U zB@VK;94-#yoNgsns0YOuN+HXDah2RQW!ICTa5wE5*j5XUkrqQ^#h?O(bNpO=_1X@} zx?=A)8B9t1D2V*abAVaxeR7S%x~M!;zLlQMq0v;1NXt?6ZzJ7#Di@yhyHDks9NgSN zdQ}KO?&SWJ^}9y_(ivb-9F3BRYB4^9E`d_mrTnRD;Wl#n@!rAfji}X(;qCMs!7GIv zv@Iydl_Tq6jotQ#=0N^Bh#MW58?~Aje)2k^SVL$rv-57w=k-QD)@v`_f^9GBtB$dZD%rIkdO)P^IHdjb!>uUI|7Se87*Y1!E_`Dy^z2WV%` zomwyCfnr3;>T?0ZTOU!-q=5WA(1%S>senY7)l9wSl3pR|Jy;6$!n=XlY2NHU4)h)M zz5`_pDl2y|XUq=~L@Ga|O^I0np6o!U&=~(`5I8_Yxdv|k`6bkNB~F@EaiLQkNBDEov>z z&(0G&9pv=oEcAoWggH1GAfY^kgdk*!)}p}Rd=U%79cEF_!2vR<%Q4VVnZ_(3Pf#H@ zFSvRK3+k?xE8sYo1ao4mDpa@MVDU%jznbfJ-_a%r#CPnp&34|OOs)H|0$F~yi>U`~ zuaFWeHvb;fuVCDd{4lt~Mc@btq7C7^ng3L!#oaJBTz8`8YyRZ1Avz!`j^$W(v95JH1jMZ)Z zIVpb+zE;2YUd-mB@0voy<~ywFIeh{_TJ{l%tim=AMEi${AWZg!*HsXa3w0{TSjpsz zR&Nn69;`3Zk&uOr*!`%(V8v!?nP1tpvg6{@SF^$T`@0n!uRv_XS@alBmOy=PY{5iO zI0+FF3Krj=gAo?kPXMGDOCC|u6D!ULPMJmcyNM|ZG{~cWVnXm2crKl@+K(m2Cnk)c z)eIsAsd%HF-Dfw#P#9{-S{+~g0x2Yzu{sVuzA#@=OzI_!4Uw~lr8c3Qa)F;eEQb)* z&Ie9jtW5pbjJv1#yBnnnlJHe~$8Tung<$LJNutaBu&Ut?TjPwk3PVbQ!m-XsdgxMf z+t%JIS2d$@J1Sjab$W1cBY#hV6T%wi^K~s5e}g-B2k?P2qVeL5KX)A)Q8~NUiDnEY z8Iwl+8H@e;)^H;_1cbmK56eIO=(O};3Z3&}xP3HYD{u*j3rrcfc8s&&Po~w5FuRN7 z8-X}vKhRIZ_OBS2vwoKYAw`yEdeWeGinL$rHkg;aQo8TS6_&ev{LI|+75 zWhSaMwAs?Y0cDKMo8ej+Bg!W18#a9KK6P2@W-{t@0@1xYi1vFBfn39?>^(5s9ZiTN zzCSu~u=Y%C*+vvHIKPduE@kQuTmSZeKCZPg0EEu4Kz_oW=SC1*sX)ZuqFz6{`Urzm z_;~tp=n(|9^0@`zq#`9oftT!x>1^^qb{4olAXD(5*L`W6rM(3uSc!I=M=-(f92PZD z8+@iDPsOpl67)|~tSG5!G=>sM?+?@%-*vfG{XuBV5J!h1ZbSm2IaB-0xzDdequ~8A zOY;HTC}1bR4>ciDi%cL25!wFI6>OEPSCV;>Iv#1j&e z+S(llEH$1TJE{>AAkg$Fur3PQIUWp%I@f!XFD;FyV#pR1Z;{ zI*tv1wLt6V54WPE&*wys!WD<5<;9|Xtc(0qPhd2tgd~i-iEARlTT@Oe&5J=Ti3Jyi zg#Th#rPX(QY^yot$qc^Rx$c8im+9LkD9QZ?(R;(7$;1*p z9)*QfaD=A=u3-of9amxuiT@r) zPOIQJ*c(0$Q{9ZvjV1^OlK{tq6-;}eFQ;k_*I9$@>2fZDj4f}LO7O|k5lNlA(k)3{ zQqgNzSXuD_34FJE_3&kG_f?KZF46Loi3X^%BX?^!VTor^)onlb(YtEsc6iC8wE_}6 z5fq!&JXa4hy;DXE8S2M5lrgyTjq^<3{i(IDB=?4CO9+bFkx~aZU_l@`m($S#}jE)ipb$GW=Z@8=+6Kx3t(EtXv3S1bf*Gg*3I&?KQJ}IL<31l46 zgmNt9rg<)OII{Rhp@vb)?Ie=k6P8dPH8&^?h6|h5=i4DB=IDLe z3y(jnVU$&+T$(9Z$S**ahS^Hrh&~haletrW5U<1Kq$#1w`7^U#OR7+hn~C3rwkXX< z3vU$1x=Uob`4bV5Q#=8It#3UT*OhQ{E!VQ-y*Mppu{8Zmgsm_lpC#qF;<+C(72Kc5 zu?3&z?*4u_(xFzGtS~$6)LV*HOGz9SL+Uu36_+mrL?RzK-23I-i;x%!8D%FlU$JEp zaXOP~e6jHtMMF5A@iI|5HkYa*og)wPH3@KJm8Dq9^M9EVCDgLn>iM!k<1TK8FINE7 z5O%P;H^8wZuxq|oeY5|;_FNrXAA(vY)`m@~ff z2$lT(1le}JCR%K)B^n(0B!n>`4mTLjc+?QIPt1b^=BM3{>j$W>OAytp$9tkuH+^6O zhvH8PJ5kr0c1`&L+@6MV4p9$|>!-+}9X1RlYw-QNUGr+mhj39)!AQZ0U+>@hBj)OL znP6!j^{sQ5)d(pvgXIqxMcc?QgRxl=Xt04JKcX`!vY4V%?T(Nh;`<7X)#{#ofEECj zv~pSyKjCEJTD^%*cVE58RKQlpmA;LehVrsU{5%Lqc78Xfh#s>o0pT^Px4OQ$>*l#G zaa9I|hk#^|V;ohYU9fm8Hz=)NztEs3pdz8<*$_Y0^_{~acJj?CMW%}f;iE)r3A`*f`LIxLXCsw1^4YYP)(?DwCF1323ppicY zeb+iov4S@oA?wSvaOFA}M{-}k=ZtR!xo~kTppz73kw9&rp zHxrDm{YIazTeV;BkT^l@WF9~niT7N_=XmtRT2SIJOwcreAWyVuUCr?w7I2hDq@ zKP>vUyvyxnly$Ydji=2L@1AZ28F3|*;mcOgY=%u4qloV!pWYSG9g!AwEc*YOpD;)1 zYBuGB7Mhh5UdWGvDbPxPJtNaEILXnD;J5qf>wVYTGG^yv0ry7{pY4>!QjSm?L7~}$ z(+S>n1@Vojpy|pBv;N+E8jz<3N3;_bM7+PJoahA!=Vei*#t-%5iZz?bQ}85}*D1V% zh}S^C%hiidY@!hfk*Ohv%GJP^X8VC}sRjsxge+r{T;DCDL5~P zWEko=HvQC3wBsLCpaSvA2LlFoh&HiM(^WqNQx?CA~552miR!Eg|=&2nJ#TYY9vWb zq)M52@cjs~>0|7bLYeZf;0(0j7!?*#6e}68ci)N0MEB>AXa1LA zY(xZdOZ8K$#z%qOQs`VLw-irEv><{b!7JbK8ChCs$aM`cjWdqiDy%ByU2fuJCr$Vm zI`hvmKpG`i4$I$HkJ-kd#k?Z@q||^ch{r5A;l`EcF20J)7ba9tyD>B}-i(D5WpJBb zP^gao=o`E5JMbCMZ7240!|LEU`ylo3-1{5lffOOkyVusNe(%%wz)uVKq!VR>L?8>W z*p@Rd)`Km8r(2dWw9>HGLA4VDp{50hPPZ-y(vu}vJ6hM;0Ge7k+O_Ub&ZYmr@Q zwImfGz2&mpWOsDG!yp#X*(nMwm;PEenkQ1t=qqZ2qd z>{k}@|2syJ-HHso)a4n6DW1cx-YqV{DRK#J7GZHJ*T$dUtaMiDVbmW1xS}{Le_-m0 z3KoW`yiq(`kv?vOHnrmnh~?3U3QK-9Scf8;KvKdTR5?x*jMc8qmstHiTk4Dpx~e zDXc=9zh3|S`fnC#Y;TWItd87dM}q__&r}=m=I{G3W;hrd@NC*rjXLDS!OIK3ez)0X zA7;1AuK9y3H=hQnTXo%iDPF0VP-+1A{0KDAw`crU4?Jj$ePa2$;O*+9l%h7~@@{uD zHs@A;pQ9=YCD>(A!j%@WrqTfw-z^tVActKaIJPCfa)D>T%RpDqD5v#)YWois>(Xhv z`L~>KS39yv)?U`eMA0@13u8}7em~p&^4lm%oTn1&0{8Tga;0m2*+|}0OTzd)(xfdD zs;2rPa8+;^9nZB)+jgL27sE?>o(I8Hfm6;8j`X!60OMV+cG;dEZk<9idJl~ zt;5T?Ro4k=zMJ`Ro>}&Y1j|2Bm`G;^@i-7hj9yjXmL$`=hU1pi{a5(FUlJv-tU37(Voq(jRL6*3 zA=Nek+48jB>@6Fxm3oa(6$5HoZZ0BN>QUl!p%#QGay`9G{6gB~l83RO*m!rs|ARgj zYXF0_yg+O7*OAiB5!?HZ;NWtRPOtaa@2kb)~&z7z)6UTjw;^1j(vmz}>r9ZDk3S zdxS{{A8@-56ur!kHFzNcQd#jvZ^xzrW>lwq22gQABrh^LP4GoJ79CyUEs-Hvze5V* z;dB_Oq@ag&Bn?YTW|l}+10r#6kLgZE@{OrB_BsvG&hfpRF#P@YO7k+=9Pl-ObN|_; zHm&v>lmOtrTXFfsh{qu)_ygLjWjCPpb-%tmU2Ftl7A&$HP0NaX!p*a8L;=>}&i5aD z{k0C=vS^lYWjN=xl=YkZgt@fk`UnV*!})xo8ai`(kl_X+@y*|3=o^wZhr2%*X1QC~ zBWK(8^P4!Kx5oIpmV{1c>IUamzeAD+5ktC%0mQI;7g}7-DABgN`~%L@E{CDpinWVS z0(aLE4qk!CoE(faPLLo3JND4?BE2-rV{fsvgL2>3s3`_v6@6EQ%(n?ffTY2 zn5ZPx#HnWWy88YPyJcDx3#~2|6{cFWI?zFBAEwxIi-v_}-<(B|rD{!fh!cW_!-wJb zJkPnUFdaV^&T%l6H8IF$8a9>clv4O+b7X|Iqz1>{OpZ=O#tz^=(H@Q7=5zB#RsRJL z1XFr3t*3d(q6YHvnWTh`^SDz7<_WSq>A{%=LywE9{x^mdTI_3aQ|#@2zP`j2TD;7% z${Jy3^_`gh*Q0N!8xO#F;+M0>9+KB70g;D?-rwft352?TK?UZVTryHaO=W{=XzTvK zBogTaFYm_*c}6Dj5Aol3i;eq7!v``W7Z&|%ucIOMe)}Gs_n860&{M~S!Y^8%XMixd zs=n)tO!$C_=ly2br;0fYs}^E7n8Cq8=vd{h#VgIa<$(&)=&*&Bro7a}=v%XrV#hY~;D5BHgPUSO*0PKts z5Ht?*Fj+KdVp@0(WpuJ^h4$lJcF&VYL+>Szv-^kDE&%N3!$8me`}w<%s_;W_^VGy1 zCx4ohV4`IXi>Whwc5kSnff52PocDXjSzF zf)Jr3+=dr9p=p(W92EM}GBY*MwPUFQhWoZu01+UiP?unl;D=*~xLSX++ixmp?1`A|lFP;ff&5EO)IFl%IqoaRkhk^?TM%X0!{n8OzJ z*n2K?d6+zneSMtAEgYI~^PpY33vBjn`z7YF`Xjkd$ER2QKoF5|+VZa&OOouA_ss7P zNlJ}IBXxnDHfw%8=mxESZ!5If@%y5vDk2GmLna$M|RZVq1Ex~ZvqVsjj#sv*pI19_>upi z{Z$POul~gT)wW{3n3}W?3KGv)5k@dJ^Se=xqM0&+wdU}>?>A?k8GR3*n*B>Xl6@PE zd6-27xmSma38>6V;$rAF?qw{adK%p{BkAx^Kky&Qm(CKB9uIYkvnNFG;2@(brJ`50 zU0;B}=7%VcnM z4h+qd+dyVf{*snmR>)zOuXXWidse;Z6N!3LE))3##ghDXwb}c3Bbu-mX~=y%)9GVT z`fq`JZ@l0;S+S!OinWJTJ_Gl!XDj-fcB@rph(>8(`{@KIo^3(#>}G;?)FHt0wJ8xd zMDlP|1l8&Ky7&vxa8NS!W!w%DAumBy-+OFucME_EM~#{8N!ob;&Mxb_gOjGjreG=j zkPLR5&~llB`YLO(B9zbY)9?FSJT@Elrtnhdbf%HRiscE%l<5}q-Ph9}zUeoh%A=-N zmZwuz(4hAAeE<5u_cC=yaewL8wfGY0_uJxj&1w0TLZr@R{ny?;N?LkG&^O-h7O)l0 zSC0!_?aK8Q6P4@wCb9DcDO1D}k5t8P$|{rj#&c9fsDnKHCTL$iesz9)SpF!23HUob zO&Y%28>=rid8dKv)l!YF;Q!^e_J#h-B@9j!E)Ngt8}DGBYZu}q{FXUsx+g|$FvjZ6 zv@7NB_JxG^#MDh5JZn(m;r4VjQnt{E8GHlfLi`l#EOe!X@cX7C+1d{79$!fu+Aqos ze{Yc42vzC1Ol2B7-{(k|i-tf4Dl31D9YHz!P`XRF&Gb>*V}F`^-W~yJ!j`zhvDnk+?n^>)#fpxj*bKmE8Gcjb1@KZli{r)P7 zT0^D2b76KuHSL1myF(~3^=bMONQKTapGV@!3-x~rd91cxb-hm>RpI7#DbspSd1;&m z-FZEyN3UNik3SANw@qDKFjt-yvXh(Y7@BFARgepLU8~l7- z?@YN1lNCYr+;lwuKG4EX49{z^!qWE%%30sgL}XNbh>S%hmaC7%7p5I2tc&=X=7etE z?p0%Ku7I47arg)&sf2GAOrhzaLY`?IWR#eo9C7RODdVooY|i)Z82L|Ba%(!w>UZ59 z@TBWuNwBh6apV68b>~}OEn}~)a_!%GB=d!Zat*t$uUUw-(DhNf-QxZ3p4gr}pZpv; zcGuo2=d5#?@J9JLK7iIeu!jX*rGo5@M!r=0&-{Ku6yyTV3*VMr4ThZF%=6U-`aNL+ z&ok$!HdC^sP@`mQ{PE``WS=0OEn!I;)b?CydZZE3II@+xs}APAw2$whb?(s4PLU(& zz7mk~w(BveWe}Zg*(HYgeAbUXC#lvbwFq6j7AyEnVc{#cOX(0H4p9s$+n2X^2JgzZ zhnWsTD;{D#m8tPUHAYG#eL@7|nS_;}6>ASajtZXUY?|6%EHGd5v}~SDjXR@EYEh^u zq(zl+?C#7PucS^;AB@B`0LFP&q=2D**D}AJ0*F3IbPqNAiaL#Z`V-X; z=LRs#=tf>{mL(YWf3~jHTlPTdF)dCFLv1%i>+X)$F<+7W)d&8(BAQi#S8W|~9d!8Xq*`f=)-8Bu_*Akyv5TLl>T{d#e zu`fT$d?+Nam^sOF{Gj7q>%A#Er$r1>JIJ-QLy{_oW}AdYVLlm=nB@w9r%> zrB*;DL>k%j5JNkKU-KRsw-g@>iRS(_feWe1Z+^AR~1UxmT^|^HpA%MPrPj1En4;au3fRC+u)fDIP59$Ep%Ex zG;g+RR|ydSr>}DhAQ$er5%rngYfbo=BeJBbs&4*&+P!*LbwPfz8LL#fI=DpQrk_lT z5Y4xYmV+i?UW>aKpnH5&c9@QHLU_4wyV#+XZhtL;{2M!u+?-NGuKNb|@A3O_9Teq6 z&mONxHiI_7=10p|x2Lz``&8@3*PCZwfsy`Bb?fVKmu=S>tC;73P|EJJ z0hQsvjv2N(999906eQ28;UC$V$cxmBU%>Nv?AlK2>pC7Py0VI9Z*d~WZ$hmLIT2~k zBbuN=m}pMNL72(jue5N~1f1C!yqTP2=9TGz%6nxt?sybe2FMWg0;ZW5&Q2wV8{12R zFL|FXJ~4Yul$s~1HAAd#39ei|YyQNieK3lm!QVbOQblXO>L~3Z0d7T` zI39*4A5N0%q9r>+z57CGu`wu?cMF2zS)PMrrQ}%gV!4rPfC-cj5y9yp=8leQEa^&j zqnI%-DStlFsL3+U#5igCI5ycQ@0LPIp+?xh%%cC2%}x5R=!j$BHB^I+aK<3+qGw+0 zx~_jy0FU+7yC%s_uH>myP9X#7zMnxhIQoel5dF6;se+}dx0iFwBi>RyJxe3!b|kTL zY$TEr>@ef=&%Xk$2AK(14-a6#xzCPwceX=s(oQ|Se?8IFhaHhKmtuTu{YU#$2`%zH z!!Q_NkfB+>_R5m~o4f=TOpga$HwcswP*^3cQ9zd3Km1ZpQExNs6BGRT<`erv&5M97uOrBhn!b4W&DLd|jZfm$)~JPGkw+0u^TiQ&-ukgWye*wQ zjpd#_I2CUCc5)a>aT?0GY?pwIIr>d(``jq_UrYhD_e-Y^{sI@=6`KJ~`VF6|8&ZQm zREQS{5N%IL?d!ILWpmFbL~$Z4qjGep$rRcbe!5U&Z7ah!_^U|%?;C~iUbZPD$x^Xl z8#)YK{<@N>v-@bQX``7zkZr>^MP4EB!Id154`~%tTfA>rcbictGG8cULB8~~@cc4h zf?hvM$HPKm1gl@T2I;Vx6(V3iA&xrrfv{t&2nZPvvE!4ZW&G@R*N5xz1?zC4D|Ag=DfYKZS&E&65MRX(Rwj5 z>GyzV8Iqf;?&iQT5=3u5E_esoeN4!f^I6G#wS+)e#~ucKJHIa;QVXw#7~`05cHaN< z5PORYzfb%^{-io}Bi0r7%hb9K4NN&4XlyynTj_OXnDshx(Ajmrcpr&ZUehmEuRkHdg5=LcR#tFW{rRTJ#&xYT~ zk}Xwbxn_BCqs$0k76t^mBq46LYwbj-2EMGph%H*&oa*d8jx2%Qsb!1!utea)V4Z|t z{;ThfVlz(J$01{P>mp7zjkbOk_SHXRtJ1rt(Klo)Sp9ZWG(wxC?^c_C^S=(qJor?+ zLo9|zy=g;FAV*_G=kBSo*SJ$~Xu0m^`#`hNFA^2Vpe|_kWz$`Af1y2O{}(ogM)l^} z>TFtCMZwowwJawNzWMI)H9_-RKDD$4wJZ-c=BKiEem=%rE$>(RerXAkid~B#^zf)i z31-V08m{9aHxYJ=aSVPfw<0DXCN4lH`B3xv>i-jR^fz0tXY}>!!VS=v5bL=VM6~Vb z7TRVY#kPtrRJPquaAR0w?RS^zF4lg2j=gW)EPP9G*0vd9L5o6cZf-KILYdBycf{ko z`gZrMT3FTgW+ArbGuw8v%E0???WVXO+I2~s(po<4h4Nl$?JXbT=e+tz*R^b z@i&pFkih;v0}gT)lp^8Zj^du4ot1(LeQcpZq=N~TK!}ke8BE1q;V1h^U0B0{&6b*W zgftBB$fjNDuZJ-P@2?(j&c}n^6A#VL`tRm`y!&tsqxEad&ijM}Vu-W)OTXa+ks|H4 z5+su$Q&C{sW-xr6^xG#P`v;8BsSH#X0NB|1rAY|7Dg^OJ?+ z)Bzp}JZkdy$OmN9*(c((HSM7l9S|xv#!nf{k0RhNeJ?o!VK`)-O2YY6$-MCs=?4d# z@yhhMO=dsD>cR&JgQ|~)&A12&3A>>zQ2f|#0Yc8ncRRRq-ob?{9+kejZ)28yq38$y z{uMa4j$@GWgQ3m;Ppyh`KMGw_WZQrM9mGSboOx^|%W2n`P@8=AWlW`{T3>^q`6`R( z_DjBI74i$T8Xte&i!N<_kI~kMqL>g#(!LhSG(VF zn1kmSvOMke{3|z;fzG5qTuF5BCIddJf}P_tN|9@?;w!x*maGNJ0^gTV8^j4q(o^L! zJpI2vCLT&mQQ>le9ZdD^pZ`R3pfEVYJDp+fp@X*psy7 z{&91CZFI3UKuAuG06-_yB+JbXL&d3If1t9pP)bNsm`8QQy4ag@5!o)*!7HV(P*K6H zH#<-a4h@y-u=FeJYztp|p3xDJ7BDzRQ4+VLBsCN^8ruaw$K2yABTj~Cm zo3>EzIQ(4aK^qv8Q(|<;h8vMo9d)lkz^dpDol>G{BnbIVR-l?@3e(3Vs`4#Pnj_A3^pp_NgI=8$bU3WUCW-oO5`M5@@A%eS1qdG!dV%FBaLP0ql9UZ;Li4>}7 z{j;+}%bcvZ)5d0Vlq%7A#y#XzHe;#Qv1Zh3Jngy|1uaw~8eq7qd*(qr|E1ds&XE-cYTQr68k>oSqGd~b1XRObkA=QJ`^!)(NpI3t z*EXdqa*-fub(^Z6c?JnhY6%5}ggCjlz7Iqa(4;GyK((z<<^gMOZ?Ax!n*ek#yx*=m z%ky8-fy%sPS?~+f(}{>lNVZ*ET+DRwgRxjgzEj5K>~oIQsr`baf75j|Nd1mdXjW>L z!={5bw>7dCI+C$XY2Kfo4k&b9e@?A_L;`z|A3lh^jmPtuxzLZdU`W8p6QuA3QZn{% zaBXmGj3K~&3Oa&(Dx2qQRO=g;B#REkoU&po5=sG^^6olU0Wqs9VtY%lIW!xsIDyQ) z3Gb7>xsczkcOBiRn4>vnhgj4w5xwq6M<$R#*`t@27o9d&CT|}fV_p2yt~dYVrAB5! zJ7*$rfLTVPRzwK6`0HLyC$y>;Kf2B_$&3076{foSrf6l(hMq18(5LsSo+O~&wtpD;Ldm=|U)X>&COwBtC=9KyNTSAk6xF z{QTii*?WFP1?sLd5tIhufR3Y3ndpj=NML+}INj??taLhk1)!Y#lyfWTj{#~D5)zx@ z;~+}QSQBVYN%{7vaAqS~78J7`x9>$;+>Y4|?f$rhmU1IC614{s?(fRl#K`Gn(PG+6 zsmzmV7@LU>Pf!06bh-~lbJD;wiNMuiEaNglD5Uxfx+SXueMcnojq*R;VPcO(7wGV# zT}!oQgmr0Xuwl!v-s9DX&@Qq9PpRn_mr~ueR#&C>xVU!EY)42;3=2R(;Xj$NBPpW# zC>-_+o#}B$mP^irxfPW9vV|fk(s#h;_P7VC&|+m_>2_Py!b?d4YD3vh!NArKqHzLdMpphRxKLaS&=;4A6djyS_DsLa<^BZN!0Sbrgkw42 zX@1=E!QXA<{Y(sUBmuiDR1z?mEyO7x0F{x2A7pWS>w-p1rNM7}sKle#RWKT=mIfhW z7(qGdXjz(nG*bn8d7Wo+BN$MD^^nuXlW3y)D`7Y9?Ck7QZW-aC-L%XF-s+Lg_cr-kO&PmJpv=nCJq4Dl0i~k05`a6 zJIf=C$*0MDf|yGM7wTxw-GLw;F)?=5F%!EH4E&tnUfX5aj<0fsGn5dwkvl)O;%5xg zV-e`)Jd|E$`KGct6W1}qa=~^jTF|CU=O3b}WBL9P`1PY7g}Sz2CxkuI1X=#D-YVhv zBlT_L;>D%i&=&90frlZWvTw}5Qi4OK*svarWda2@lc?+}XlYGEln*Vf^SZinKUaKi z^0_-@{DwJo<@u#92wp-wOor1lXDAr!3D6f35qW9QGdNr1G&F22ztb4O@crwNi8`Ry z@=8l5agRsOjzJJ9|L7a~zizHP8p^kSPn#rVl*W)OgRBW5Yof6FwAd;#nkEU!mc~|;z0L3Adw%cly#M^pdH;UTnd3NT=6RlZ?zx}O zeO=dmT_35hl4Iwo2M&v6+YZ9Mpqm`4P`C2RQt2@7h?u(hshOr!FvVNHJH?%dKnyIfa+h~yF?0L_~afgmp} zFVmcq#$mW~a&ryJZSkz!b6D(X%aK}AUQ6e0l(CAbTnHj`aB*=_@5v0Of$?1b+xd&p zEn#-$v#zcK##cHG!#=iuI5#JC@jITE-l z_{3373Oa$G?b4z7DmLEU@Py(m$-*~C%jraE`ns2G5y7~2p9qJSQhMtqs6D=a);KbW zllq#R%C|uU5Qk&dd-t~lIzRu|9H9c`*sYrTxt}8^EN*AdD?gDM#pD(WCamyzjJWUZ z%%V^EQ6B#OZz3F7SC0_5PN+}&#wUnz~I7R6Jzma{Fp>bRzKl2xAgPfm#pXjP4 zvJbwmHwQnvOKolKoxT~QVeHj}-Io2e#&mPFO<7D`S9^-SDWpho+TNbT*q!3Y+O*fhj9iS3h`(-qB{krRg{D*6 zbZ;rq)%7YsUfAZR$r=;R3I>QIs0;6UI}_xoP;?K;DhgmeQPa{|i_l{XUzwTwg4~1H z!+ZQQ**bHyJba!#aAcKwjAcNvOd{cu^yOJhy_FBAG&y|)s&Tw)Rd1;s-A2Cp+c!V? zEZnOFUBlXSv-?W#aQ%Ir>YjPYzXhX1rkai|xl zvK^uevZ!Q5?#gIHJ)t7*xN*D|)`7C?nR&floe7Ff|IPDs|35eq$l>3(;bk4$P!F_`W$iYu^-?oGqGp~!efL5Cyi#`VOw%oVd6S0_l|7gID$0SUpQMb0B-K)pq3vn9A{Q-2~CDN`EW6 z+k3v`U~2==_#ukQ8?{|vu7c%v^ii2!*Ne-;GK2Lm7j(HL?op~q)RHrM$Xg-k2+1%r zc5Df;NBAWT#R~`InsF5r6ij~oYJBmc47>{;Gh=VX^Fl<-PXzKLnK)@hMa7#o^0yqz zTm14T)vfGcJs^^U>r04~0E_MzrybAzXvt~=yUeX|pTo}CRB|JtDrSC2R@;}UJ6+Z| z*`eiA*D?dk1&n%pLITj#zfGl(zbi)H72U|R3Y6T)0YX#>sHvHSh1-=YqP?E#jxB$^ zfnt|V$Wt?y>_Cs_x2{C;B$$^IP^cY}6n8|`dG`HEbUdq5sl%;W|A9N}Z{_JX>HuGW zH$eRrgZp|s2YVIRvq2-87Be9jj4#s_%{BH-6LPX}lkj?1=5P%lI6geQskvisAxEx1 zlVG_Uqpc;7gn$RpA@m#ez=^O23`$F9gd64ewGtu*l`N5Kh7nC$H<0$4yOG~Dp{%P* zfpgFqjP2OixVUYQy>WpX0PwUF-mIs}*i=T0c<@u*{2GyJT5JtG+z>!7*Y@oj42Q|I zSX^FqgLn&=4yqJS86A}#*jpPk^G+>#H$nhsXn?GmADeJh_Bu0>a6+*|Yu$E{xt?%C zQ5X{(6yzEjiawRCWMpZ{7bE_3byaiu%U}ZdB;R_fBdxYa+ilj|@^q&Ver6NoLwV>C z0?i@Y4XT=1gb(>W9G}S9>gVz>LU4liqv$ab(|6?QRnx*vm~egkYK?)7p+d zbhjE#^Gyua$MeR!-j|9fq34zm!O-$z!r%T;sEV<%u?w1O!_WdQr>Uta)2b9i#YKv9 zi&h%w2d_agAp)2$tE^0e=>SuMNbNv-iLwFv-RqUlD=K2ZWkFofIir+anQna!Q~awc z^LsMD;wnww5du3H!u=v zx~QFW0Z9Dr-ELEFiYI4hu@H)pOw)ZceME?-}>c=#8U+>YG3 z$xBW61!rOY(PvbnY-5JmL1OQ{Gxqlh{5KRGT7tiRAhTF33UVyKy0hzcrk!nR@AfOd zXU^l7rh7L&1k+3+_V`^J>sC|gf${j%EZHQZ8b78ai#945cbyU!LpHrHOI7Je{Ta9K z!d^ao;c1qMSUb!k$c-n;nq#Bd(Gh7SL?{d;bzXfn6J6PK;02H8YGG8URH_^B(HbWu zuzk{lLxB*Hv74cclmYgEXWStqK9Iv}^^#Ub@&Xbr26qZa6C$C4b& zMWOqFa8e0Ax&Lb^652?>jmb%~Cnvj?S2X)Z={5qN_DRZ`XY@(E;1lH%F3v1wX z&NH23hfOsFlXq**&d#>Av}_KZea|{(c3C<)Y9#+KOD#o%G|&cy+UHFV!S_f48c?(G zb&HC84)FEX#~L7BEa-+7CV19$!t&8ys23sYbdCP(nL#iZJy}B`!-vSS2V+-nWPWe9 z?yQ7z)Upyup-{v#UShj1oUwuZgFU@pcf^boyH1Nj6h1w6stKY_G;8S+;y{OK72!eg zOt{yf>Co4GeSOnwe29m^Us|s59YY_|SlPU~89%#}AD{t6$~;e_`ucVL?~!8g0XI-0 zLDd1?K`WD2H=$ADYWN3I)ed4-AE!ZCw7%O0z}msb=kSETmSb~x9b`Or-Ojw4`JHXu zsm&i50aPGAATT%>lWSJr`9J`7f0EW@f?IoYr=v%ia-zft0gvk1W3e4U7=CHQd#gh( zs<{+Tv9zv$5BG_CfySXwsClsc)zbha?&)~1@6XhM6_PAdn0Tht_L(v-B`xhAq*qj= zfBS@8&aYd`=VTJPP3Xm`@7y8*`_(z7EYA%e_HWFmJRdjYhQzKRZjC6>7K})P_@0F0 z+54okM(WZ760{-ythC8HJq#KD^K&j??&sguCFIF2O7%LOC=AoP`a%~9Xvm3TYgam*F0ho# z+prd$Xs^b%D<(RQUq)D|mXITY63(cYDI+B+l1&lFI70*F4qD!DnMKB&46RFxlarsn zVW7Vb3zDc-aRotI_&8QynkF>7vK@kWx}q0Hx0zTOrw3R-_2=IFCa7SW0r=m1j86)f zvtP4Vn}%2T>k4&l{F=6V(z3c5Dv))Kcce&*(*>9lLgCdwP2iXVn!X6o3o?5+xuikX zkMlEcsa3WaVTC53R7qe`ZIrj;+x*d=Z5*#g}g( z$C%>WE)J+YWURtHKoekCWY{-c8fv&E9$GZh1T`zrnK3_2g{EQN!SznN<`RR^vKM?9J=!y!K5P6tk(H=fUh-gc! z68_b$1eTAW;V(yS38?MWq2I=ABa02msBdfH+#e^x3WAw@!<)9H2iR-m%7 zloW}g9uWI-GSh)zfhIOs4}w?~X@A8`%gS$4WmCBoq}AJt>zfeCn-=|<=U-^)KMQhx zP;sh|v+bq3wN%DQ&~>(QoHip7P6!P|f{MqcNoiU@9I}B&!evln>|3apOspX}-uYp0 zN~J^XXQ+Npdi+FCmp*ux7r_-%$HlX|ssW2;;YkN+`+-F8#vlOPKRqc^u(efLSxbvN z|N7bRDbQ)_Ct4_D()j_4D=X|0^Ssx?!O{hvO$FXrDy#zYiuAFO8))Lzsm zqC|J>+lO6GPy8eF)KUn4n&lReX+Y8`yYhbJw|<88Ii*#&&nDRyLY@{df)!O9@nx zZT!{Z+~6TMF--gds0AF+_Kp71026^XK&THfSYK2DJ7KFP%rKu&{}iV>&wWRDw}5xh z8>nVClL=Zn&(Y%Ve^n6@LIb5T#c7p$SsWpJ8dm2XecQ_No*IIWBXa9$>&_YSC`9zDVG_H}xWx5z%tRzbrA~kCB)s_~*N!47ve=;Eph)*~se^ zbNrrd6XZp*HnzT6wHUWE`|;z)hRyfu&_ft|DJXxknK6wOr*2%Ro^)xQ|MVA} zkq`4jnR7V}0C!OH8Sco?a*v-@PgpH=b3dWzE|4cH^?D-8D`o%zYakSU5sq{yG8^F+ z*kq5eI7mB>lLK9IAFPJcNw%~DJos4!>&}Mo!jPm34$8dO)Xcrg%Yld4$nS&6P@AP- z=Qj7T8Saw@(-fC@ZvWP2s|6t+cMPvoyS8$b!K^#USD^H0-Y_HacQr=bqX^xCd zM%{DnBOS7PP%(2-&IeKTapkvY&jQ@QuBT)9XA$0V#qC;Ye})gz%CU-DN{B+#z9c!}=IvL{*|K?d#*8 zmp(15z57@NqKL@S#mAr3E2qS13WyI+wdN-ByMRKnfu%awE5CvT#1bZzY<8EGjFP`| zHVhAn**?;wv_k@B1p|#QVg(HyF|X}yQy;h~yd(IwGvMvX2)HjZHbsN{!!Yp)hGxlS z;IhpCX{4f%&*;ax^Iz{qdm+#m+9izRUoZc@czBl2*}TfL_ugRwHP{?;{kVzA_AYl- zcQn^{{^_@JUZJ5m8ygBWilA2~L(`r6y`Rsc@#im4hJ==8R~b=17?L|Q5F?I=KIIN= zGjodU7yemt z;=AFN*4eWUIOxqG0IfPC%I69@A2$-1sNb*VU;n&vx}Bh11$qaqd6e^(52{sk)j#z>%JH zNr271>+(U|rj@Gh^&Xygng*%NvAiN!4?>u~%cR^KX^>NQ< z4u@Y!7s%axo`6IA75&%8~k(?{z7_@)?V^9xSvLI?^(El!=56)K)e>mBm{iD+2}i@lq<;d zZqv;&B`@_rU3mq&3K4NyLZI`U`N0g>^aCfgJJloN*`YvZ6V=??6%|Unyu2<10(WF& zq+(vTF=^6~bGNY~8Bn$1t>d7CdV6@pgFFvqNWfSwR!?e*+lq2h?nyT~f>A=uk~FH8 z{VrO%%)`3ey`Za^x;LoDu^X*(f~|J8FUW+gmJo0$fH~yLJ>}1gWHwe3sa;w{jZ-Cg zHZ1y{FO$%2=$9@+UxW7=K({XVa>dqf>u(N)uW<5BoUh7d;i_%qja*|T5TFX7L?3nm z)2jkMq3_B zn6ueE;Yn)Yjftk6kOrZ>p45=~dDqV9CvE7T3wQ6{?Su-tE^akTSg4!qHs-#?&%$-& zjO1^(5=h4GTq%7yUx%cq__588-sQaw*E?8Xu>~RWeC@{E&$QLY>pq5w>W}AI{X}B( zqyP#zs;67sCaXq`8sSEb2DFtWamukV2Drv8PkTW$4>8hzLZ^@O?P*U%^$z?wlt?)E zN|7r+fZzBif6~E0qtof2*!=CSF(|6{btN(?13AVe(FS;5M&!AxmHDlTneyW3s`S_a zEZ!Oi25j|Tl<+JhON2i%Kj2Rm+{%gI)X)BnjOO{vy6(wu{*02<&S2iOR&FDac4KAH zk#iBlr+@Qi5}xF_tCE*X?$(nc3OSLw+%bo_417t*t#iw|l?qfwT@SodYglVq~v zXu{V`^ZS@<*&ZGq(aK(Mu_qcb)g?7s{}6q0d)p(TR%_AOR&6r zT3;L^^Gjc-6IC~RT9#E9`0m@^;{-ZSNLS74cM0PR1LQBYB%4uRKS}D@U*@q(sUZ5S z=nw7u>5x^;Bkh%;bi8&Y(OYn~Km1YEm_tsGjqD%v=(O}-|1^Nx=n1#c9B!il9Q1_y zr#ak4zqpO&aR1vc?qBcyd%w7Uz4!n1lKWSmxqm;^fB$7zZ%^I)ztQ|phX4luU!(b- nj`Y9(X#drhX|K&&k3#Iu!@X?4WU-*}BI2Zx1-8P_CFXws`{4yq diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/scart.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/scart.png deleted file mode 100755 index cf4c8efa7a490a67f2d1b9eb85c6389f925942a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15022 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/subtitles.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/subtitles.png deleted file mode 100755 index aeba0a7b978f91eedcc69e995fe1700536ddd25f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24511 zcmY(q1yCH%*EPII0we@?_wd6VLU1RzyF0<%T|$7xT^1*}y9QgxA_0P1aCi4_^8c!y zs<&!)XJ)0gd%FAHbIv^-rK~9Z;T_RC5D4@^Rz^YfTJ0V{#ZSwayJwAS%d+glJ-hCSPoFg5W_;Gb}V%(Dm2Qc4ay(5Jdv$FBR7A zd$@R2&@hYoFb-Τ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 Z@vU7to%Lon0y9w|C@llcYIXaV{|8)Vwb%dv diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/timer.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/timer.png deleted file mode 100755 index b69a6fb1b18958c85b19201757f00d4737226b0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22409 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%0DLO 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 akgdxrJ+=n#UV(Hoi0);BOJzvgu>S%TrZ(RI diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mute.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mute.png deleted file mode 100755 index c535f43cc3844f2f7af95a917a32d1bce3e46940..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 974 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!3-q#NBMsOQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrIztFg67Egt*o+FkDqs+`+)`fq{XG ziAjisMTd!LH6vpXFYhG=hX2maK;xD%GA@ynOl4&JFD`B-B2ofmaB|)d6kM*Tn8nC= zor~)_2gfy5)*vP(YkmFG3=D1z45o~Xp*%d#7#Os;xTHBbWto`b7#Uj`8Fl&ijxaF% z16sBe_#QF1*>;DFkN_fx;TbZ+}d;bX*iRk0K*67n~MciT%w!= zUK(xO4Fu8cKd;;NSwE3{|E~Mp^tJbA-@R$>z3_zFUt1Oh1tz8|_htDxo!Z{MUl|uw z*M49g+vVuZClB81k<}LKw*7En@%87n8rl1N--TT_2{qmDJ8p94UR@2pc?(%y{@z)3 zRU;{SPGTz)yMAwY)FGE(k4sx?j`-9R&9=;cG&eD|<5`H0HnZ!YNAk}eW}2*+rlcj! zJypQEXyQk|&ZBem)rGnKb8O7Bob>Kf{vw4Vb4;!Ow;lTM^_S+=&B`1HOVdn$m>hEs zs&ijyloFrvz*m(e{LrG?4(WPjE)^?^Eo%ODd{Qm_A}n_%zGeC(D#JS>^sG+gto)$J;MwB+2~wc1N1BOg!e{8v4*RQT3{iQQUv1Ru!?{}c`T e|FXE2!+_zbY1dE5VxfLeJbSwOxvX9* z;gTS~U?3L_Fl?&519GLgr;B4q#VwsP=0Xe#0!$8H&P4wIA0g|vN|!;!lBZ{L9OIgQ tj88r>@*I6F7=43t>S{6d`gIJ<42e!m1s|%5{{oF*@O1TaS?83{1OVToY|j7y diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/no_coverArt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/no_coverArt.png deleted file mode 100755 index 7ec2eca040dbf6257a931d4fb9dd3e9cb97b4deb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17284 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 Hu0mjfJEjqL diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/pal.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/pal.png deleted file mode 100755 index 1d8339594c23559cc8b91fb6ff2f7766d71bded2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14858 zcmYj&byQo;7i}OEcXudW++Bi8f#Oi4K(Q2xyA#~q-6>w&-6;~<0>$0kio;94-+ODl z{E>AtxpU^+IeX6R*)umnO;sKPl@t{K0AMI8$Y=ln@KD%wGBObM9kX`&3;+NDYRX!& z@04s{B@)ghoEpxr|KCU0!0Z3}^(t-ZYv||FUak1Q!mykM*u~QRA%i=GeP|AaMI8<$ zzNY%es^$?3kND29$?R_}d;5pw<(+;`HKFJGheQ_os&sd}zOt#>_x1JlwoPygn|gTmm-g;%ZEd|% z^0rug&8c2bK6_YweLWGUMe<(FDs2_{lnVI}!J-@!^uZ}6{~=iI3q&o%O5GGO%Q!aNl9f36eH=hM~*#IUBW-9srWtL5r|gJw#>>mFU0?mTRxJv z?J>aiDOpvpNr98R>_OTpFVO92M*5xI_dkLkBQgqFP?&&zX3uO*uSi_*0M+v3=&E@s zre#US197^-?QwqouWhZv08naueZ9VAvVBA&l?TSazyLfNCxxO=(aRHp3>=XiDm#NX zsy+~?20#>oH?|EkwKTyoNAyx&191C!et7XyX(XV=rwhQEo%_?duPyVKv70g%VY5*2TRYuz3a6>wYjZLyy(>Qz2eV3 zRbpqGAJ~XG+~NtorUl-y%GyQ7vFn9_kB0 zBX3CT$7GC=Q87R*jet>K7cv7+O8vJ$HoPu3%7-24FkyYEFo5Nt|NqKHMux+soIzBi2BxXf|J5%|-Gctnla~h{Ls=K>4vzHI{~7Lj z8}6q&Rc9JNSpSV9fZ83ozn7ruUkAci33cL+=Q`XY_;&$)A-v4%+@dJSNAk%D?`{`!Wg z=C+&S#c0EO-8yRRvjgq{Ejbgq{~m%YY=8C~dX_n~r~>b@Pyz5gK0R`$5|YAi$2gIr zsw2N=ZiE>E;;dvkZCpG^w z8nOQ@B;So%tta+F-M~QPUVPp2Z|_&nHCBKxK+B82N3H;7R2s*(<LtNgcK zJ2PmSp~yZOpwis=pZ8`sD=lpE@BL7Hoq9eeon-!;Ro@5t0A?D}4+KF0Q_}yn6uqD3 z9Q)KjJ`XolGGE02B{niD_=xZj!0n#Tvv7|}#NoR`kNbl3ge7|3JO5T3-f@Ic{32r7 z|K+OZX~*90s?zxR5C*|bqSwo`o~ILg*dG!v7r8wzH)sB@>qz#mcaIY1K~zu2RuZo> zwf>h$#-f+U4RK;ugLo3p8%ejTkIMsC5;wo2+*fX{yNl$p*8bkX>{Y+|U5mWl=e=Ip zuRR{>_S{cS`(7GTJ?#7Y{N>4exlZf8E|2r|F9Q0$gdP2ZwvCg(6s3jsUfp&-G|^4x6^O1iY(T{A z>)7^2pZR=b3I+^|I6Yoo%P+NL?#IH!$5D9C zS%EoXvD@TAJ%cgbKxCK4QWcm}%ukxO<$|tCp4`8G{)B7ZGIz^Qo4m5X->U`VSh3ZS zYvuLi+6nqGV(ssy}Myeu(?V5 zaHiF++%xg&#Xg^8OV##EGzpNLoSf9=qEqYxmSze?`Fb>Rg+k=An~duMwy;rMemXqK zQA25RBQ{z!%>|LCZ#5tch@|KvVG$c1yeke*@;@DXJ|YU+80I-|zmSRzIyLrO3^U*# zXy28sDhy?G?HGwdAAMPN?>B2j<75m3(I#7vB`#gZuNZ$~G`7m#UEFF8NO~X+ToA)! zJUr3a3o1mN4`_sLz3u1WBEMa}+Ick3Zy4%;ff%1ulo#&nFS1IsYclT?qXI(Jg4^0; zt3s%LtR)(<%PC1L?*IhxVQfz$G>8-|85%?!8#Wla)%}_XnIg3BzG0wlpE#LpS$*C$ zxCcCUOB&3p3^_rUFTW7i+PBIk@{Gsb2)?c*v=tioi*-*fVnh^4l>G z2b{}PLYY)h*e8+vj$XG$1uG$^O%jM7rG5xuA@p7DnPAw)oyZzZXA%#�EOjc2U)em_$B(^=?0T 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_arrow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_arrow.png deleted file mode 100755 index 267c2da18376ba265c4924483cda8cd9919d1e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer_580.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer_580.png deleted file mode 100755 index aa49953541989d46903f821bd1abc58a0f9b06f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3622 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/prev.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/prev.png deleted file mode 100755 index a36777414c6f97797186d34f17a8199d6caac797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9103 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_medium.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_medium.png deleted file mode 100755 index be0cf11f47ec278c5c7b312c4573264bbc051514..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3670 zcmV-c4yo~pP)otT00009a7bBm000XU z000XU0RWnu7ytkYO=&|zP*7-ZbZ>KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0{~D=R7L1o4Bk`?<5vx>Jrcu55YbK!us#vwSPZs75#m=3 ztUMCoRt@1-49`st!bcFOIuhwx3;+NC5)u*<6B85^6crT}78Vv47Z(^97#SHE8X6iK z8yg%P9334U9v&VaA0HqfAR!?kA|fIqBO@dvBqb#!CMG5)CnqQ@~D=RE4 zEG;c9E-o%FFE21KFflPPGBPqVGcz_~R#sM5S65hASXo(FT3T9LTU%UQTwPsVUS3{bUteHg zU}0flVq#)rV`F4wWMyS#W@ct*XJ=?=XlZF_YHDh0Yin$5Y;A3AZfQ za&mHWb8~cbbai!gc6N4mcXxPrczJnwdU|?$dwYC*e0_a=etv#`e}900fPsO5f`WpB zgM);GgoTBLhK7cRhlhxWh>3}bii(Phi;IkmjE#+rj*gCxkB^X$kdcv*l9G~>larK` zl$Dj0mX?;6mzS8Bn3Cf>sHv%`s;a81tE;T6tgWrBuCA`HudlGMu(7eRva+(Xv$M3cw6(Rhwzjsn zx3{>sxVgExy1Kf%ySu!+yuH1>zP`S{zrVo1z`?=6!otGC!^6bH#KpzM#>U3S$H&OX z$jQmc%F4>i%gfBn%+1Zs&d$!y&(F}%(9zM+($dn?)6>+{)YaA1*4Eb7*VowC*xA|H z+S=ON+uPjS+}+*X-rnBd-{0Wi;Njun;^N}tgww2 z>+9_7?CtIC?(XjI@9*&N@bU5S^78WY^Yird^!4@i_V)Jo_xJet`1$$y`uh6&`}_R- z{Qdp?{{H^||Nj)Pz6t;U01|XkPE-H?|NsC0|NsC0|NsC0|Ns90;=jKV0000op`TYa$&OFaPJI{A#XJ>Y2KA&Jp@}wlRBme+X1&Ayh0Q~stHwh8J^)0p}PIc{w z9U$7y0NlR!-@yZ^=?|_2ik31mFqnnCi@mdjy#u3yj0~fLlf9XxjVS;gQyHr6T5-7h z;`2CDat-N;-O41J0Km+GBI=>g&Y_3}Mjt6CB|C$|NHnOZ@1{f4I|9c@AQ@pxS*s@rA#(q_lx#6;Iac5mJXlm@f+1QN($U-G zk53I*AY`Oi!?c;-=mcPw0O8^5QXz4US8fmRfx{Tr6Uy$ztDpuLn$mZc zaL~i0)Q0+uP~=4rLo+D ztP?;7?*Kr1GVuu}%BtK$R? z-FOwQE!IW4U`hj6%%AAQ+{)ll>li|5UOU`6%Vl@4-$m5(ktKmjJr3&d zJ*`h@7_(wGq8=V2%ha2&M7iO|x5topK^*5!3Q!@+txC1GYA`mfzB_pM5oB7UZa~ua zfb%o$?HE8|F2IMt0T9=65-rJ&2L_VzmH}w|^FXgKo(9@Q1b}Q-z>5m0TX%j?p<2n( zf6zC!(%>82l$E^mq*atc`sRxNBa-X~iBb>MT16%ZYbpq6v+kxYQdIxo6((I@pwtW4 zbfCFu_#m_GL1PFpp;QmiJtHQOu)D@l6U>7|G$~Pp%tjD_SpPi6jW8+|=FT3cJp3YQ zs~CL<%RZ+Q)vHK7$y4NX4C=>q?UNW=KlSX=l-Qcc-Fq)8m~k+-(o<_YC47Psn;>SCmMYSdn}Rw-u}*(-6)))jaW03d?jT+a}Vs zcW#BK${)p;6jO&JM=Hmj^|r6nQHgYhEkTKMp1||sDc=g3N~{v*f8mo($tqSED9Zdr zR2(MqMMuFl%MHe@8d`Kuz%`Y1Anm>kCXX|BY&g}@+!ANOz2VY8JR9^_E@?Pv)cVh@ zjrEP7L-#wRA*4aw5aVYLtsiyA_Uc+Mj$e3F z$MjJqh$Ltv_$I6utEoGyON=3kZ>yE4lb5{L@cH^i{Tpn#i1^q2lCdIs_3uSOWrJ{c zcr*QeaVHIeO%Cg1MPuEnlP##* zjWaqoZZD{+jB~LW$}Gk#W6f~@kF2Y5VfWQ!`rARKLDE4lP6AE|&dPDCQnOOu(w9@7 zQ_WMx+fLi}w>PJ-t_~TJ85|i$BDNwpSKK!27rg?BL)4KW=Sxg!d>Ptj~U zq2|ki9yH=+DEmjoD1kZC8Ea7^V@tm2ypFuimFDLI@z$wk4I|Y*UHbcbIA%~2sNSup zS7YhcnMTc%jnn6m!TECOoo^$ABDxc&61_1u5)~71sALUs4TQ###&49uxZWnmrtP?< z4UA4R?M|9V8m6|eG_AD5EzNeGYKbcP`RMZ_Rl6zPt@ACCt<tNdt)T4y zxz7FG?Y;KOnlN65BI07Er-K^=;$7nSUp&8rHh*nqo)>Fo z@g4U~@x67PdG`7ga}oWoWf8G|e^2R#A>I$XRlKGE+JJ8a)&vZMDTMjA1aCy%_OP_jY8|>$o_;py=fzm?SD)QR+ekdiOf-{tV6#Qja|#o zNH`XreeEN2Y7wIR#Y8k%&RbOo_y+ea4{+J{?VIdMLirnU)&j^tLu%V1>pq1=V+9=Z>7JPb3Nf=E1rHj{&zE5j)D%c4itokPl^yETn@}4id{D<)C5`E7_`RS>FhDt=3d{ag zyg{!mX(}0vc^@Hcr>5rK*7a>~LN@a@?NB)Fmh!hvR#IcbA-kldbbFDjbOyF>=UlQq zt&XAwst5W82n3A;w{`n#QPca`Lb=DD8Gia0jf>Kfy5>o?sqvOscdrAoAbRT8bJ+N; z#u|1HP3tB(pCh}`oxs^>T4TC~mNnm5w7k1=XJ)ilzSpf|IqasDi@nWEc}q(bu`OIE z@-aljVKvR)ekyG{)xE|+=LK1t)as9?^IyHamSKOg2is@b2j)}!>W+vuAqe(Skrr1J zXRd9QSauWk&*$6>`uFtm&2?A4Sl(q5*KWaR&CINfXJUIND}iy#1s@7BGn6F6ex=MH zaM1GSWJz9Ua(czF8XFSbX_pVf|OibR_;bIX|u4}(( ziorvis4BQO)aR>lh1hg1S)adHI(s*ybw06s`y^thr3_JY;DjwHDi`Ty z>1JpgM2PKuJue-c_Q9gD4fEYi3@OjfB`;wIBc~?a1;ffX@pbRZb8g(ngEQ9AFZ|cE zNoX#mCSre-HpCSJ!?609PIW{u%-xk_-TieXK#}8vqCZ z45}t~ol^?HA^?8?C;(s>fHeTF*%bxA3IHPj)B+F+Knwu=090J#?KSfPzyyE_0Av8P z1JDY<5&+jMLI}Vd04xAZ0x$$XApmUvTo=DKW@cs<7M3SZp0KjAvazu}efsp-vuDqr zKY#J!1v@)C2L}fyCnpyd7dJOI4-XG7FE1Y-A3s08fPjFYprDYD(94%Eg@uJ*y?P}g zBJ%q6Yf({AF)=Z5ad8O=2}wywDJdywX=xc58Ch9bIXSsEZ{Enu%R?X#1qFq-Z{NOq z_YMk$Dk>@}DJdx{E5l$g6%`dY9ImRWs-~ueI>6_u5hRaI5r zzJ05%uCA%6sjaQ8tE)q!(e?H94Gj(7zkhFRY;0<3YHn_BX=!O~ZT<1%M_XH4dwY9F zM@MI8XIEEOcXxMBPfu@eZ(m;@27~GE?;jW#7#tiN8X6iN9v&GP866${`Sa(mU%$r2 z#>U6TfB*hHF)=YYIXN{oH9b8&Gcz+gJ3BWwH$OkWu&}VWxVW^mw7k5$va+(ey1KTu zw!Xgp=g*&wjg7y5|88z>Zf$LCZ*TAH>|n9j-QC^2y}kYY{ey#p!^6X)qod>FV;m0m z@87?Zlatfa)3dX)^YinIi;K(4%d4v^Y|Xa&e*@|QS5mzW|Gxp!;daMswV8sfl$yuX z*2Ft9DHT9C(y-4XbzUaxQGH=QD&z?>Cl%aSdz!!mk5-I*knhRiRYsnx7K5Yrc$go4 z2h=i^{4&z>Kj8X6zsw?t{&A3ue6^l#P}J%qT;DuKRIXEVLIA+k6#>W)Ww)@%=AHd- OgB0YHWXq%t1OEpXLNA2? diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_small.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_small.png deleted file mode 100755 index 05e5a149051df3269cc0dcec2a7b76ffeabc6f62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3668 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws_mp.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws_mp.png deleted file mode 100755 index 625e331a96fa026622c9e33bab86c3b7e0c61fb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2481 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�O3l5*{%_p4F_g(AETHIb(<#{7#~@xBPft$6 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 M07*qoM6N<$g6K3K!~g&Q diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/Thumbs.db b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/Thumbs.db deleted file mode 100755 index 5b547ce238abae34d6887928718414c1387dc97e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7168 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait3.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait3.png deleted file mode 100755 index 229a91c743c6212f8aec274b7e7880a45f3af277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1803 zcmV+m2lV)fP)JNRCwC# zTI)-jR~SFhM2$73#!I|6u{VW%S;gJZu4@sb6xxk4#>&{n`f=>r27~<>gMHY_I!a+| zW3*)}^vhVG&<{>0ts5#{s#cBKCMNM3W3u1xdl)szswsj2`8yf(-vz7UjhHRAFKuWUd8Zc+T&{Q zt^x0B_uP$q_IzK6L?V|l_~ge4>E_em@LqyLh*e@}k{-vgu(Y)Fba{EXIe?3ci*+?v zSXfw(?|O7z83g|Zz6*|-0kX5R(}kfM+=V@l=*Uu&uayk}JDpCENF;VVhgP-kNc^76 zO~EhV5&0AFHSiD5fVHT*yZaLMc}qR8*=(YqpkRAc&-7&672pF04v3A7jUCUcs;Y#Z z8*%Q+%8FQCUgpR5z;wZ1q`T)sFN42OAGjBlTvSxFV`4ZQ77Ggt<^XoNTw;BFeaG|a z>S~rN!vzU=adA=L?qm)YQ~yp=CsmA3qlJ^Yi8are^iDS5Z+Rnwpw2 zF524KDn>^~HGx2M%dc{frA~ouZf+Kb4NK4x#*bB;9OpZVP#H`v9C&&SN7)O z$&)9loaIGSzG)U_LeSG5YhS*lfW&uL!y6hJ=(VDOSI(h@US>`?3lI=j+q(fBMb^04u?y|>oUM?rF)xc7RE-pi!ouLhkd3Vxv#I! z5F*hy^St1O0-Mc_ z*q>7GwY0QoyTosfPV8*JRyQBiPvH!K%DlnGI zQe)fE4Z)DG;81OCttO~k`>tH;b*={mz}p9t@B&{hLRVH+YDtwz%QTlZ%783aO7Nvn zs1b?8o58ii6&}wJt-+iiYwh>o>vGB>_#(sP#EBDw4<0;71_A+pHle8`x;3-BX%;rB zaXkF1SPTV&aih)%S$?^pv9S+pBqEWBdi)*ur<7^@%;fWqJaGJV|Ni|VfNsbZ!<2!F zGR?wlF!Z#?{+Jt);z*+_I!yyQsu{%VL-fV*v9U4r_*xoRMc1Vq7rE!DQ>O;*+__^1 zXm6&HNf}fen*x~qa<0Xy?OjTFNgxCNedOrTM=U8*Q&Xz%zLDk1hnA)m&rMHH zCwqE&`fuI3^&*m4tx*M0a_qT<*}uxuk62q>-CU7?;p$OXwcma4U^EyEiiwE{F*i5I zuWsjX7AAemmK*zaAq2M0oH_GHe}8}Tz`#Ho@`NMZ7(9%a+Dj9#p7wZffEConNyPA$ zr?PUiuC8t@5{)M20s(Cf-g36jvqM8eE!fis;M&C&6{!v} zrdgPYMsG3RS22#YRxcJ?C~-O`5v%JXBO}@&Amt!%TVCSjbJE~d@8`S>!2Vs6laowP zad^)Nyk`^uYv4WgaP87!@WHK(EWtxZTmw;THe?)Z&*_;x)+lk|}^Qw47h#1oXfEdf40B%Pbg{o}>}Z z)l~MorU6braHnL`eL;{fmalx-0ACXS{Xu+K#_4_mOj$kyr~c4(HRCOc_1}jrz!qQ& tum#uxYyq|aTYxRV7GMi-F7%H80|2)`iNMvaH6{Q6002ovPDHLkV1kzCeN6xW diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait4.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait4.png deleted file mode 100755 index b96ad21be2dc4962771e01a4ae3b050ec82a1652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2226 zcmV;j2u=5iP)4!r5 zMGz^ap-2p<5QBmXR!Eg7ktAXaM(1T*I?g1MWb(4iWcoiZ_YE`Syjil$8|#5H%X{~| z`+oPHd+s@Bl8itgz}_aw*7^YsA3nUO>(8G*pH%zIG#U8!p+7@Qm%F2kP?K(GXh=D! z&1Tz=w|1xjIt2XyYESg~=g*%9Ki|1?C%tF5sHkW^2K+qKKm!jghhB%4^6zmqSHa$I^G<34h z90sh@=~4;&33P|aWMX-FdGuWz8yh1tPYOEOXAT3#NT&*x_TGw-9m6b7z#S(TB-$kR*$R0j?m=N@v0KA7@tX3;qzkYqx2Fgs| zyLT@x^rC>NlN5;Ts46NdSZ;2vYNPGjx69DCZrzFrjW+gl2DTC_^;1$(61VZLUAsi` z!dI_eRfX>B>l5nh>+K5yHW&=c4O~wz#l^)55AL2ld*m&vv$Inb`u6SH!tUL>?ddwh zEGH+2Wn^R|d=X$odhh7yP=&sB?V6BCmX+!mHY?6C**I7b1d*0d~=g-|wd|azQuPwr!h8gLUP~6;vGcz$UF~2kD^-9%+M!Px?2)yU>`v>5h zh7-Brx^?Sh=(~6CszPI6wm*3Az@Y`ONdX=oAE&+8I6E_w7172Bt>fT>um(rGn9 zDdUPU)1O1X*P;MmQyiAp>y?40)SXujbPIGnO#Sg(ATX?E>TB1oW&8H+6KysdYj1Cl zgeG%7y;LQhI%qAgKT#$y1*He`L7(zA(|l&jpzqLumoHz+z~saL-A}WM86Cst6})W@ zH-8fkR%)Odpij__?mMGAz}Br>S#@>wd{%Pcz%S>{og>G0hMy+u_~6l_M~|eqQQ-FzAD}g;6#*tm>%wNLLqPuZ6bs$#zSq2ii+6AjT;%fuX2vk#13e$asZGQ@OB|?;1MIBClmXa12cF$ zhD|-}XAVUi4oAZ4fo2F%k(?Jt+Y(1cM&uBb_H3$*P|^`0zeC#=oDY+nJb98#;Ya9| z6DLl5#n;ad%6a6bvPmv*%?G8tyqp|O=pkkOlbO9s2WZA4gxUx_5LglG8B zp+oeOWxE1PGCDfiboT675oXte5KUg=X0v%ofXPHD;^I!rtJ2KDmRN$onCYE-G{XcA zpoHqh#l^)vOW83wAWHRUsj?JG5SV`0!rO=3orlSb7cWZ4p}{jQDKyWCCp7`?=;)A| znwna;S-%GT?AbH9>V_@hUznl+4$BMAI*RuNCAJh^@_k<)!=#rFnB>^8W74Tpr&OVb zhlfi5Yr>{a?lXgX>ItmtXYi=Q7=X!Sfcd_ktE7!72c`hw=+UFnnKNfpp|Q^vV7-N9RTe znGg7|5DlqcE@|j78URFAy?`HA!dTv4zGlFYb*6&{4@ws=UW^CrDu6^nM~d6+whRpo zl{GXp^eSZ@-d|?g0F&(9yH~n=`Eo313qfP%;zGlWjY@(-eewQWX$4Fo2!eFu#*LWJ za9%EiqA{Uy&aV{UDSP7m4Wu0~Nn>N9)Ya7$%aK{&d0kkms?fN9HmzIQlBfuv1aoQO zw4#guHK?(SH@i3|wYl6V=0!TW;moYDh&(_s6soPP79ovOQ+KngznQg_7us8(ocK5bT4gy zd1+LFX{tigHU!glA@r1?0c*!VjPU||H`Sn+2J%{HnN-cyW|QEoRG~c{j|Haf((Cn@ zY+YYSN$3)9Vlfw@XB)mYGLuocb0 z#J|JWKbeNIB*1c6Gbcxa39CZGdP<->;i*rj4KOdcELe~pO4w&rp&_4+j*dE!KYy(i z@RA4afRV6fTcDjPf8*S!v;@vr z?tj!mRHozW`ENv7ZliW077!4anKHPM*si-07*qoM6N<$f)RE- AlK=n! diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline-now.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline-now.png deleted file mode 100755 index 12206165543dc42d9d168d26617f5efd1b89e58a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 962 zcmc&z|1Z>G9Di}=$YDpf%GFx6tk!(HLlUX;CEdW7fFP|)m%5e8ud z<<_^2R;Yz=+LF*(nGPu>%AGHTb82-xKlcyx{^j+4KhNuVp4a>JJWui7h%kFwjx7Lt z!Jd#Pg3AF5M;jW+>bS@F1n7x;5yAQ{U#pUDq;^(>#wx_AM-)oQDGGdfs+3wMI4((~ zq9}*Nb6fb5{!8@@l(OxQpVAOsfj^1cA!z+7_j1n?R#SX0n&&lfT*McF2IbZ=O|#RsWFz6d;+F7Z;l22*x0lI z_kjXn4A9f*F~Bom5YTbCdJBv1Lg4^V0rWdKm^7LRsZ>d5mX-!Py8#X-7tlC36am$M zQLUbKb$toE4Gc8c+TI0xfvFWMYJm=*9PlTHZrY?E-R0!WxVbHrmYQzdcu$1+`59O& zgOk%F@FP0fc<4|QNyOssBGG(OlCh|0nk-SNjAdoKlIiBnVj>9`7KvtjeWy5_*}%ZXix-Whr6YtOms7-BCev&- z?@&itlM7HOq9Vkk{GWksR>DN`E&>E0{Qa4OhL`Da+64Al$-Ci=44Gw_xLvE0CfGBZ zo6{K?%AUD?N~Y?1dS;@<959gEx|3$-{vi62OZQZB(*YZJws#E-FG-I6oNi66UN&-j z)rrr+>-8=D+hxU1>bJZ-jXN<e=hVXwRwLy>-=EcIeU?wL%kgw?poFSajK=mP_4n zW^JvOd0jtvq&MY!zyDGXFZrV~{KX(IkyWK>q(-WES2R_8Rlx?D;JHy@$NV?+Z86u* zA7>9~`*vMOPk-d|n>+qn$9DBDT4<=VUtAeGcDwbJ^xTg&!)SZl8(sF*%C6O&Pby-< z+Oi*um3g=O33>QYCgoI diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline.png deleted file mode 100755 index 9fb0823ab4ed10b915b8801198d4dc90bb06978b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^j0_A+1{};lRzcCnSwM;<-O<;Pfnog#bJnhxK)z&& zYeY$Kep*R+Vo@rCV@iHfs)A>3VtQ&&YGO)d;mK4Rpdz*apAgrrTekw4vagwr0x3~X s7srr_TS*BLtcw#wdYEo8G%zqTup}@r&OLI(5U7B`)78&qol`;+0HvWPzyJUM diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/unhandled-key.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/unhandled-key.png deleted file mode 100755 index 8e543498a226c1ae3aa38831b90b7d055a0583e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1335 zcmeAS@N?(olHy`uVBq!ia0vp^NSk zs;UtY5g8d7MMXu7jEu8p&9bnt;N;|NZf?%a&DGb}pFDZ8qN1XxsOaIthj;AQ;p^*r z=FFK*n>Ovra&mJ0{rx&RI+2l)Sy@@7rKLnVDHgNXY8dtN;K14~+Eqj7^e2YDGzqU+_>#1HQ-QmoP9e>Up|2 zhFF|#z5F!nu!8{WgUbKv2j@Q0J9;;^J7hx8f(!Q&Cofac-n_H^nac0EH&3c5avkay zmJiEv_BmVN&UsEoRQbre#?1Uc@cpEtXRgW>RLH*M<#^d&-}B0(?ST|ARqj&DR{D2vbRrU+{m1 zr`rv@fILl47srr_TW?Mq@-i@R9N6&iz6swB%U$J}#i4Vh+Y%)}=;8bdRtbj0x!lTW T)1=*jnixD?{an^LB{Ts58$vlY diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_backspace.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_backspace.png deleted file mode 100755 index ed49159ffbc15996158704e9319c20b9a2a5914a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 783 zcmV+q1MvKbP)oHxVB;5FRxU z9yAagG!Gmz4;(W8|NnG+hzk`c2oE6&5+w>0CkPKB2Mr$y5hDl?A_ff}3KJ#?5hMcz z3B^DGU}W3>Pd77%dGLE)E$l4jM2H8!^w()(aFP2@)VfPGJfYAwy1I z3l$_pP-8zwRtOIqLQGu>5+OrRVFd{lL{DN16e2xCQbSH)?(gsf2^2z1Ua76MtFX8R z3l|9x9z#uEs;#wAT5Du%dj$y>eua=BD?dC!P&`9XJVH@CK~MDb^*%&XJV8zc3Kc&` zS3pTwK1NmJ<>x9iN7&ll0tE{-KvcfK#yLV&1PBr+Ge;5}F)BApJ3vlBN?e$nr5`Im z1`HT>evCj#S_TanK}uVyuC@dS6F*2FhyET?h^v%+AxRueSsU6#4r4tFX5R z4H-K>P44gU1`8IdueS&f9o^sJK1Eas5g#HiMX9Z{7$Y}ze2E7Q8sF^jbpQYXF-b&0 zRCwC7(^XdjQ4|H>ZR@qWXek910|c?VySuwP{=7qsjEFOv2fw$w)_%C_oPE%r%iBU@ z4$p>;Y@Q8WS-d7VGkFfQXYd@br}J82Pvcq9oXWGJC52~219Y&{3o>3vhg;u|#x6^wig~fx`?L_YKL&W*x zE>A6z6>ognlE@1-%pprB;f%LVW=a zJ%&no6BsVyc`%sI^I)Wg=fik4&xhk;-X+${c!#*H;w_`Ek~jY)zyRgihS+^yvNZqz N002ovPDHLkV1nC7CT{=$ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_bg.png deleted file mode 100755 index 5151da4ca63656e9ee2eb9d74df0c921a2ab5274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmV-H0>1r;P)#4;(WQ zA2$#lH4-2=5FIoM5+w>0CkhiL4Hzy54j%>#9SIR60|g8S4h4j>L1 zFb*3r3>GR26(|fBEC~@K3l%8{4g^&jg8azQx1ql}g3Kc<0TpueyJVQ|g2oeYm z8$d}~1`Qbm2oyj`SwTu$1`8HELQy+FPCrOlK1EbKLQp(FP6P-OK15R*BB?+C007BJ zL_t(|+O*S0T7m%#MbWERuoo1&=ntr%6npPt@7?`xM3!(f;EXfK_wvHUxOdBThgV>$ z(<`vjv!yT zVt;uu=^b!0;njH^^Xfbfct^bCyfU9NUYX-5?}5skcS&X1JL9y^d*Z9#+vl&>E3rB3 zHK%92H|`d_Yu-n_8sGC?jq|Km*&FiiX^eP>{{jpE$*Xw368eeq P00000NkvXXu0mjf(U7?+ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_clr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_clr.png deleted file mode 100755 index 0c7734bf47aebba998b627ace8d80cbddefb664e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 955 zcmV;s14R6ZP)GR05hDio8!-+VFb)|n4HzvA7%soV$-cqIzrx516eI8O@z2rL z3KJniPGJcWAWl|h&(YNj6(o=l$=$eBaTr!@n%<$)qCra5@%yPGyq60r`8fxF^vLc6n4Q`uRZl z0F{Xp3rc0_bwxWE?e}*!>)Nbq3zdl!TXZdKSF_*I-N~{|*Pb5B%CXl(z06rwTb56v zyA$0@GVF46P2+CAHy;=8m&+ ze-n-j;+GxB^J%}`-_6^0ny!glrfoaJd^j?Q4^H4)hF;QR#&OcR(T1HQ(~fhG{1J>S z;Z`CvwAD@T!B8SGVm>aJNODBy!@4utv2a+f9rGvUZerq~+$<&z$bH29O1UpsJSKM) z>$P&7ICor5PoI*T!HXku*YK`Nt`9Fy$o1h)jocJoRme@@(;>N^_Jj13;;HTl!cXJsAT{E002ovPDHLkV1jHsbE^OV diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_esc.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_esc.png deleted file mode 100755 index 56c52d301b0195a366571bc1e26ad9b5f5e2b138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1321 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_ok.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_ok.png deleted file mode 100755 index 2c0c7e88623bd76821d25099a1b1887e4397fcc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 990 zcmV<410np0P)5g#@W z95N6dH4q*&|NsAVe24}N9Rmdn2M!+!6D9}`Aqo;D2oE9*7AgxBDGL=S2oNF(5hDr| zCkGB72@xa=7c37PGY}m#4jM2G7%dJPF%B6o4Hz!(@bL>2BfrAP3KJm-5+FlPVL(e= z3l$`elbu9RV?$102Mr$x4;%&y7rw#AkCdJY5+OoNT}@SFzr)E36e1odJqZvV1`QtX z@bXYwY(h+4Z+C@IS!x6c6yM?Ge}8h(V3uClpscZESpTpueyJV8z`I!;bjW}l<10tE{P4H-N_P(e#wpQWxqNm?v6 zNIyqc2o4)OLs33PRept#JVH?h3l?36epCPe0pCePK~#9!wAEL0(?AqJ;ghZlq<2e- zZP{^5AR!?MqyR|>HHF@L@4a_I{oPz?EDlYBBuXnxJ1)U3dVG^9)RNucdMz~5x(m82H2cZdPUy7I>;ykrq18gO72Y>PvxR0W zoa=!e3(aPE*$9mmn$2=($o!u+bdj@D=6dQTkJj5=oHxVB;5FRxU z9yAagG!Gmz|Ns9F95M$EAas0)2Mr$y5hDl>Aqf#A2oE9(5+w=~CI$^21`Hht5F!T- z9|Hvp3KS;`6(|c8DGU}W3>Pd77%dGLE)E(n4jVBJ882^lgwN5{3lt*?6Cp!RVF?l- z3l$_pP-6%W90UmzL{DNrM^*+47eh{8Lr-BsOkJw2wX3kWLr!1?2^Bp62Sw2NnA1gppTWR_F`V=BKeua=gNm@QeRR|6nK}%g_Y z7Sx2wSx^}wXF&zz%Kx<;+`EID2|w?3lX>%h>F&4*_)C6I+%(f=+!KBWKZ&+q4Liv1 z_a+hbw5j{e-_D+|P0K6F?da~ZRMr05rpaUdT|O3T$kh9WRyf6ck;c4Dom#<*r4mh< zs{5}zwWt-mxGUt;`O6EsWCU{s9Dn;mpE%H(&*>++eo_(#cJerV^me5t4{+sjCbrHE z$q`&RoWmDmvWxp{&R0Ovi;GmbZ>*)rRiPnC&eu+mJHu**+&E5>C#5QQ z<|d}62BjvZR2H60wE-$(3-AeX{eK3?V#sw9zX_z6N`m}?|1&(@Zr}yv>3h03hE&{2 zN>E`nn6PSAV}!%BtVc11tExi2u6PxAb@3|qQ2v&zTUQ%QR_|nF;$aYXW7{NHXjuv} N(9_k=Wt~$(69BOAG`;`; diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift.png deleted file mode 100755 index 477f8db2646ec5834d0ef516715e3b3f2f4007e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 767 zcmVGQ|3>^&^E(Z=D3KJ#^6)6i8Bl-IJ3KJm-5+MHm{#0IX zLr!5;UvNZFV+$1|1`8Kzbc17UeMC=U`1tu(VR8it6+=&9`~3VMEkynO{rvp>JwsCW z_xM_6b_59&R9|mHO`?JV8!8LQp_SSp*0YKSx&v3>ZL3T0u%%JU~u7 zLQx43AESs8ZU6uQMM*?KRCwBy)5lr@Q49s(qapjQirxNhZ3;I)}AftNA98$5LJWpOpc zm&MZv-xiXSd!+yRKym#|?ao^78#cm5< x1b5?n5xn*AZQ`ttZy(#Ee2+M7;yeBnU;zISjHO2#_2U2l002ovPDHLkV1h%u6q5h| diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift_sel.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift_sel.png deleted file mode 100755 index 339ddb465f891c2e2474f65344dc8dacbfa6fcba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmV-(1&sQMP)5g#@W z95N6dH4q*&|NsAVe24}N9Rmdn2M!+!6D9}`Aqo;D2oE9*7AgxBDGL=S2oNF(5hDr| zCkGB72@xa=7c37PGY}m#4jM2G7%dJPF%B6o4Hz!(@bL>2BfrAP3KJm-5+FlPVL(e= z3l$`elbu9RV?$102Mr$x4;%&y7rw#AkCdJY5+OoNT}@SFzr)E36e1odJqZvV1`QtX z@bXYwY(h+4Z+C@IS!x6c6yM?Ge}8h(V3uClpscZESpTpueyJV8z`I!;bjW}l<10tE{P4H-N_P(e#wpQWxqNm?v6 zNIyqc2o4)OLs33PRept#JVH?h3l@imhlq%XiHV7dii(Sii;Rqnjg5_tj*gFykC2d% zk&%&-l9H2?la!Q{m6es2mX?>7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Y zv$V9dwY9ajwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI z#l^+O#>U6T$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3 z*4Ee8*Vx$D+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<; z=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku z`T6;M1)2}wjjRCwBqmFr6sQ5c7xxvWa%{qD@V zD~l^x8YF}^fe=B3m;|QXq1qxM3aOATMEC#Hf1od>&USitF1tr|gZKF|XPAfio%5de z%<$ucp0_M@>8WxlKub{NdZ@O;^IYwL9u1<+a<&_~HHbFLTmcFiM7zM83$E*S40mlr zt8m!|-}jq=ySuG$-$t|w*F5k%FVBni_oHUGXCqpLGY&Y8lf^}Uj5&z%aK}cp)483d zMMp+BjI!|m+DTYcH)dzYm^ezq+wE-Ljr&?`>hq2>|JT%OiO@dptS0hoJ2nS38Mw7W z6K^}s>De{O>g_mN#$0@oEX=+2+tjyOOSkHs?WGsRW^Y4Yk<4mi&m2XqvbOdz>l5E3 zq@nq^y-%_pbWK8_|}zU50YG-0_Q0wh?Wa&oeNiL9`d# zn}%r(qAl`#3Z^uOw#b(u7}6lxSJsAMSc7P1r;P)#4;(WQ zA2$#lH4-2=5FIoM5+w>0CkhiL4Hzy54j%>#9SIR60|g8S4h4j>L1 zFb*3r3>GR26(|fBEC~@K3l%8{4g^&jg8azQx1ql}g3Kc<0TpueyJVQ|g2oeYm z8$d}~1`Qbm2oyj`SwTu$1`8HELQy+FPCrOlK1EbKLQp(FP6P-OK15R*BB?+C007BJ zL_t(|+O*S0T7m%#MbWERuoo1&=ntr%6npPt@7?`xM3!(f;EXfK_wvHUxOdBThgV>$ z(<`vjv!yT zVt;uu=^b!0;njH^^Xfbfct^bCyfU9NUYX-5?}5skcS&X1JL9y^d*Z9#+vl&>E3rB3 zHK%92H|`d_Yu-n_8sGC?jq|Km*&FiiX^eP>{{jpE$*Xw368eeq P00000NkvXXu0mjf(U7?+ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_text.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_text.png deleted file mode 100755 index 6bdb8c84bbdf44f1706d5f8667a227274cbd6e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0y~yV3Gr}O*oi=W!8`Xu4J;;nJ-=9SGW#b7xf9Hl3j9wR zZ6>gPVt})t!svXU8k`!|oH@+VQyJ4SC(*EyiHG6#LDN%Ew-NNAM>gTe~DWM4f D01I24 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume.png deleted file mode 100755 index aa60fab961762a78f622f60cf3ac4591723a3707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2075 zcmc&#`y=<^iM!9T~)-Vwr!$e0!H6)qU$)%E8am4FxBxgb# z-gU%W))A4Gp|_fj7;?YI9Q_sV^TYFeK0kb(=ZEKqPdd@lO*vz(6{ko|Kdn6BFa%;o<7)di?ltEEenS?M)()933420FalLx3RG?G&Gcxlar8; zkd%}(Gcz+cH{ajiKXT-VzP>&JfdGTS#>U2n4jqz`k~(_ysJgnkmX?-`jEs(s&f&v{ z)zs8fR8(Lvn5L#C1Oib~Qi4LEdU|>a3JTKF(%RbEy1Ke>I9yp-Syooo#KgqN$Y^P4 z$=cc)jYe;8Z;M2t%F4>OZ{KchZJ|&op-{-<@isR%U0hstc6Q3k%P|;CSy>qlhpVWl z*xlV-UtfR!{(XCUyPuz5et!PO#)h4povp2HU0vPK&`^JWKZQa`NJt0?3F+zSiH?r0 zs;Z(=skynib8~ZhdwZ#=sa!61Wo2byVPScB+1J;%sHlj|W_NUS%*@PaXlN)ZDq31v znwpwgSXdyDNHH-nadB}~RaFB6gM*q5Q1&;o^+4!XNuFK@R{u|cDpy(MAQ1Q=!P&_> zetfx%y=uUAiKfSoZ(_iUO1Gz}K-S9S22IE=G&&>ULY_>9PpvD7OK^@@5ww9IT^2u8u=XG#GkomXWmIO9^vwqeh#zyG%o==@!G*`#&(rMir_9fl3$6f|Bvk09%j<}j@T~H~UyRK!_?`=zy zr^mZvWI<1w_HH{A(_W`5QZd-(IzrjBhIjIiDg9ek4eBV!8blX_gBQBwa&~_c%S$IP zM&dCzxASK(SKzP5!@Y8E4KPYSrq4mOoHg2+wXy^8KC`tm^2Uh^j}4 zYz2cmh?P5__oJga>p)~t7z!B6Hn3l72#{*we1R7%yi8wJz7`dlT5%=v*^7jQb9Zb1 z=@^UWSbae=t+<&6W1TZj^~#Z{J6*_kPQOspGY65Xgzpbb&l;E|~( z-O{#SLZ89L1mM-(`z0mI&BhMLriK;a59aYX09)hTY$q-J#_dta{1QJK*sKro-_HE7 zHZ|1xpG3Gq4>;5cYR*X=9gEVbg%^EuI2fBGcsN8VX7 zu}*yAh-t{q>BSEd3BL;CZ0^v)MU}4aY>=@<@LvpBD0Ch<;D_U74%wOy4Zfk9AGO=? zXIrzgkQFBy)8a2XUJEq8gvD-ZE^w=gn^b!_wl}SR91L}lefZFGK$&o^e&PFIY~tqI z-KmZ@Pe1;(?zq7mS!F(=ovOc?&hDCx%G>BU^Ch~A+P$T}l%tWX__RAYW4-$96BF2E z@^5U!qYT_7*4^d7I zBP!32z2V|!eD^}f$Lg(^v+vC;M7>hMVKs@5Y-S!7G~7zV%h{De+|d53atK!9`uDgN zkD7q*)X~}u`;Px{HODa?H6PJ^lr+E2Y=>(@b@CHukbu+IT3-nqAM9_cggkZ5CTZhi z6V0WeOjY1ccYR!_8m`yYT{>zK=~i|favKzdL`GU{1|}1qkiY%Sn;Z2F*B;zb=B;=I z5aD5h5b&GP_%`&+bI3$CLiZ$(`svd=-r2H7Ztih^U^`l~wja)|idFrl7p677_N!!h zfWpOrF4~%`5plDlfj{+`>NmAiNW|voNwzfRTx^YkhZT_RpOYxya-EiT>4|40uX??Z zW4x|m;c*|B0jF{Z2O0P&F9OeSn6+)fQTlFv)#t)y4dM3-BGO1NvHDuc}K1E3bX9?3Vt=k*0SnQhG%q=Bf5fL`#|i7u77Wor0O|?d!? diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume_box.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume_box.png deleted file mode 100755 index f7c4df2080e6e060862f42d75a17a6d2836d0668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmeAS@N?(olHy`uVBq!ia0y~yU_1h3^KdW&$3VtQ&&YGO)d;mK4Rpdy<9pAgquLA<-11-3W{?sFA5 z=q_-;P2iBb!1G9+6)$DU^cfi3K4sCmRaGJvzTfc4c zEUOt^5B=$JQBm60(DBnv>E8o^tDT~o&hFindZ{z!_qMDZg6mH7OjtKnI_yN*75j_1 g#fsq@;~Ci)oc82(@UMRM0cZ(>r>mdKI;Vst0N)~Zp#T5? diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/wizard.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/wizard.png deleted file mode 100755 index 4a5df40c58640053fc4121f1d80fb7328fe836c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4465 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Semibold.otf b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Semibold.otf deleted file mode 100755 index 1b33d74e224807ad8c2ea7056e904917b62d2484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97332 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-SemiboldIt.otf b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-SemiboldIt.otf deleted file mode 100755 index e92ba39c9164e97d82dd097398c58acc1a213603..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101776 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�QYV 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 WbpF;IEtcl2Y&y4~bY01(lJvg}bhfbo diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_list.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_list.png deleted file mode 100755 index c43abc25824ee739a706cab47aab8e637c6bae10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2191 zcmeAS@N?(olHy`uVBq!ia0y~yU`}LUU@G8X28x*L&uj-$Ea{HEjtmUzPnffIy#(?l zOI#yLg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=u5AX?bUA=C@&b@~Y9Xs*h z(UbERudZ0L{=uV1%U7;CfAR9-Wh=JtK5+5!)vMQUK6>=z(Ua#l@7&w4dCU3BSC1S! zwPyXM-3N{wI(BOJfkQ`5oH}*p;`W`pE?>QV;K+$%r_LNWa%}s~-KWl9ynge}?!AXj zoH>8_`punt4?KDP{KTpAFJHbscH+zfpq0;G9yoMt-NwzQ&YWMhcH_m%*I&PWyM6cG z*KgnMJ#_3Q(7p$c?%cU|=ia^Z7cXwvzVpeG=Z}E+`O7WacU`@HeeZ!I&tJY=uz2Z` zWy`nj+za$mW5t`W*$qu$!-@PdF-;v`@O%@6U{64%<5nDjmN?zy7$>?i~lbZ6YbSkUwrgEQQYFn zhRBe|DtqH2rp26__4;7^fro6@&%QYsS{8mo{`up`@OXhW8{a+p`cr@Rp{hbt5eXKb zH;dld-xvGlY*(jgz%lE_@zZ~{`zGF3`RtY`aOwB6n^zYDd4BHB;*AURR&BqzY=h3a zU3^TArMHdlicCAU_K-qBV*1~E%QnPSE;HbWy>Wf_pO$3t>!w~G|K@3?2G8)r7h#_F3Vdfpog@Fm6YlN#buq|FCRH<*Z2zGJ6wo(+wsUpoHC|Anl2fC_O4&J9 z>Zwh;^iae5B}VuX8%dy$gomakclViN&IJ?EqZv6ag3+THrW=$%keqSgUaM~RF6NdH zabfS51yh!mknL|!+C!wj4@7&#q$)60pxBCD`u z*Nh0S_Qg6&waLx-;Nk;Tge=$5F_Pv#IEZ5!R5Aifjn}!{+M;a#;}SFPXz@6SU%M|h z?dVick(xU*kIQ@6;)Tr)0peG0=LFxdnrY4~-q>)@{QRV^+cwnv2?CbR4<4uP(_SMU z?%e5k;DFw(f1hI$Uw{6%M%$1>ETa75ubSF$a4nGC>o{Q_8@Li!zoB&28n^DW8?1b$ zIbv5WUaoyFzU`k~fB5IXtMeG!Gge=$k$HZ9t-RQ`m(r&vXU0sceeii|s*Ufbd+S#3 zK4e!pajESCfy}aE`&I0%jEyM8baU|U=mtiH)?T4nL4~3yV2#S)>FVdQ&MBb@09pZE A#sB~S diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_view.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_view.png deleted file mode 100755 index 3033e4a8efd6cc98bb000a80d3c1f789b2469485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2235 zcmd5-drVVT7{5>jQXXy*76wT8W1GS-A`!QUFv_Ud4UvcPs<>T8Wg1zdtC5llGFMQ6 zkqi(W=sZz7KJgwfK)#@R>kj;g70-;bO=JNP_ zp-3W?bCDhvYxR0Enat)u0ud}%s)~w=202`bT&Xu0v^t$eqwVVHvsmW%0+CPzb0L0j z-wmV542#9cVGhKI&|YpbcPEiNuLna%a}^$Z3>rB+Mj z^0Klry}?AM(}ltbwMJW2RmI^V3*z3sJtdQkjR^$f_SMtV!{PF7vIfg9Tu>@i27~D) zYpAxaPNh=o^#*}JXfT;fW=l)!^?^Z-&1M@c1(=AGhe>J4>B<+mfITt0vH`%2gG<01 zD4aIWB-U)q_bp33HpLw4{G8SQ*7nlMam`--#h|1qn=SB{@9>&U)YujVoINv-pQjP? z#W^D+v(z;45vuzZ<+qMc>U}Qfo}M0_JV@TXub<{lxfT9l`^n(O=qG2uzy)$-vzMgE zI}6+Bv-$BGCBxRwz`#H&<=x^4qic77ua4xKxj^*9Z_`<_`+h7z(RxSlqDga|`vi3O zLFLihvls?{NVhS1|1>mQ@ii$V!sCh}V` z&|N$c&5qgR6Yh#BxNeweXGG%IZlx_lr!%6c2XQ?S9)}b;+m53v`lF~ABQ%`*nk?Oa zi`Os>lKHuzQB)VCN+AHLIPe@&EfMxgx$@7}A8C;j_VRVJ7upW+*A|7e&w~6r-V#WX z9oiXh2_)1Gy^MDr#w)JL<325S!e7fJ)oeyb$5+Mcza;%U^?vi6do`2~GS|vsQ3wYy zmT$Z)qmz`5eA`z_>3I6NP;~-%K7K5-a}3F1P#oDUrDKtj(>2y&n-j>3;j%LOj+9n4 z%x?8+cCV6>IPfLo;-vNeHSE9aUM(fmXTJHB8C%7drv@sv0K5umbbc9c4nQF!ki$d< zpPyT)XZMY+(C{W7cVq@K?>r`?D~Q%MBYvGLGAgU-JE(s&RVRme#sAbiGdZ`D8e<=^ z+dcg4Blgs_Q1e52bZd6zkypYQ51#NQE0~PY#z=LOA3NZD$l3V{e0j8_?#x>O_c6Rkh&q!B>dw{iY+c>_Rf@Zano-nFs- a6tI~>l3{}Plp()N0EbOZ=#BsQi$4LTZ;%`S diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_List.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_List.png deleted file mode 100755 index 4acf507904ac3e8b049033a3dbbf6ea42f65cd93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52623 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 k 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media.png deleted file mode 100755 index 553bd75078b13ab63004f9ed0308b8f9eb94c414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8652 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 T976uO57AJ)tx|9uc=mq)xO89E diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media_info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media_info.png deleted file mode 100755 index 397f0372202510b251139a92ba9ebdf3101cdf43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2470 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 IV(f$a8^Cz(e*gdg diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Subtitle.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Subtitle.png deleted file mode 100755 index 4b953c432f3fa298f865729d5e9a4e563cfb81a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2149 zcmd^=TTIh;6vzM65=tkmQ6N)L+hyWqIuj@0GDKQw98;jyGGlMjuie%q*B z3d&g=-o&I!qtms^KxzxaJUoKOffnL;R$cWU$#PS?28#cdNvK&439VYS(Yts}I*;Iz8N zW-edA;|tqCWiy?@7fXd=X?;_(T4(6gbV)lpy@2tF$!1!MMsHwpcuY1|*e>hn)XF+k zbVe(a(>69SDUmB#Y_{XU7=yv+>FukouBI_sIb1GJAOz*!DfPzw0WM$Yel}I#(BRc+ z$YQ-;-^drsmX?;bsQ~Y10VPGri7D3qE&$Bd#E${McRD@}ok|*U+YfztoA6$Ri3}t_ zeEe~FxfH?s1vNip9Jp11imlNG-sm@H6s)6%cowAw0%UMSQs&)ByCsPP${cs>mDpcq z-F!&eb@lFlWDbbZ>7u{=0LuT6t@D3^VqM_UU{mh4pAJ`TB-$Xz`Kj*KbeU zay{f)U})9Mykda>do#6|>wfvB<=32($>`K==ee^ByC~6zyRu_-@7{^H7M+nLdUYA{ z#G!mr|I^^1vx{Mv@NnDUK+DV5o@noQPo9iirK6ezfYCTKziNh5dd<$hr>(!!O)D zpIO0<-s6iAA;5)++dIj&ft0F12n1HU?=>7+ibO!mVi7P18VP$VMJ(V0Mf?lUxU>?V zcY2EGJ7OVDcb6~w`TKP8kunQ(2Ml>}xvaDe(ACm#652b#GG(F8BOCU=3J*GZHsNvP z;qIMX+n1?w+D39*o`(V{*i+SG&7pkp?Q$F3iu(UGsF}GL6?`=5-a6s%+mUeBHP5UV z!rVnU##V2uA6=%0aA}yMVHeJ%l+L}hp1is}Z;dPDpSE1`QI_u{yK1aum@Sg@is#^_0pbI!(!Dr!nlYQi_Ru`S+li|-lZ6`sEELp25&wmz zViW41UuabE<*6H}l0T3VJ8^6?N+3Rbt45w)fyhcAo(>L_`j5-}{4P~FrkCakuS1n5 z0%(p_@W+H8We!_xvP8s;&e%U8Q+Y8Fb58wLaMLB_oiZwJvm4xPoeJySSoaRh^zQHb zDmk9+^sm!PQ%Abo#JtOemO2BX?nD0Z>04)4S=aa`N1CdNZyK^HW5|ee^G(fjr?eS~ zrETV!V(?Lq*0dKDXUd1SUS(bIFT(`>?aKLAi$O<#>SB^84RPL|Yrn@tN<1<=uH_=FB-~zIVGjTkDf+6G`if`D~ASERDXco#Wr%f4{GC zExnj-Po>Y_?=7GFA%DF4cz?6{WK~pol~t*u%*v?rN~=^SBP*i9E386Y>scP; zR?D&|^D-+FNTn=A$xBuu02^qqXr@{{r%z;hre&(f5=CTqhGnQ(kn~9RbW2y0qShkK z(=1JJq%{>OPg#noum%j$u!I&l27?VWSTw5zbnG0|J$tk@)A924Il=i?^MlvaUFzRRA3kpIxO%kM-dsIfTA8ek-=2+EdD>Xa tru+AQJU`sHedE^4%kMuuncclJIbPB9^y|$lOJ5GC(PDFFcKYz}&3|h&YKi~= diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Solo_Menu_bg520.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Solo_Menu_bg520.png deleted file mode 100755 index c7037b4963cb43ca242f144fa504e74e768f8e59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2639 zcmeHIYfw}L6uuDE4h@MD1V+V5LWYrlT4@TDB|s@#h=&p;6Uf4V1}O_t&Z0}&hKyNl z){G3%45ke6UgWjFzVBo2bML)-@7*_08X{o=ndUUKzx&PfC(g`y&wO*{%z3or%JznZ zJ`)N6Kv?#^j647c76q6RJranRavGlssE|tOJ5m7Xhm#*Ye=Fc`QDhb=@@p#;CreMr z0cm+{nOvOxVQHm2PhML7@o_|+0suifbN3fy8X;`LU^T(`v;~%cl7|ns0onQr$b>a*U;WW*=QObeYIh_%jFoKlBW#?R^!%1-g z!)@o?jNr9VEKD${-GLB{jbwEu2*T_%@1X?`Lb5PUQw}FWGB80;nqUy4Sf`J1dRdpx z;r2URe$G7uqSTZbvD!!ox7#Skw8b`QhDla1!#L-eLG2vxnVqsA;|8k*A*?9LduIjj zoZy=y7~TY778{|rqDBzIY0d;=I3pN945e5DgkdyqgfTNrm=RJBq81xvfKUjdIJaMK zwHZK^_sj_1S*LGqZEfxTMeInRzj8&MEZ_Mb5YUih*8qS>lAR$fXml;o{DJ(^h;#2Q zg29_N$2=X88(!AAFS#seQ2-=w{r-1{G5>4L%8R9NwC}42-X+~s1>ezixLz@+dL=xh zIbBq!pZ}#>y#4IJ&s*9(Pl`gf7Nm4)emWx#B-6r0!BVj(M717Hut>cApv`GOP{?{$ z`ft$RqS7TPJ^h95(TSlUZHMi~GKTGs=UJ9rU0uD~gCNM>Lj>Q(X@&;}?NR)5e@eQe>t9-W&y&kqd&sKMp{%T|CC83S zpQ+WgmEPD`{g=0E1X3-{k*Sq?B1f)Yua7%cSGQ6%ZLW%4QMN8r-+G(AR;>SYWb|}- zc*EM`>F9i~mRIkLIAPv&Q{A8A^~ctvhV#*<;u4b^lrswd_q_6gQm1RJ`mXwkO_F}z+- zsZIKakt1VcjobVyziPEwXgMh-2@^ de|Yo$4g=5`bv3a~mC*tOC_7V@(U<-~^FPoiPzeA4 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Statusbar_white.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Statusbar_white.png deleted file mode 100755 index 6e716eab472feee40b39320800d8093a79815b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmW-fF>6*~424f^Yinx-6-0$PIk*Ty1nFkwEB!ufOOY-*i7l~+gP?9s;!yhwOmPz& zb@K;wQV2M>^&hx*Ha@v8-20N7=O61j(4xLPhONScRPm{1QX zYC|5f5c2Q?nsj3a`XPZrSOW%WSW*fP27?VWSZe1wP0TTOwUOv!ERmU;@D;hRAn7s} zKH@Y6z>9K>MlDw22Q=x%4mcqgg|G$;(sV)#9t;K>X!VM^nlv#-Yz!mO$51_{!oARKcmp{;I1;Zqu!D368hbBfX9$q@(ntJwd zeWZigg^$rqSg|LYk)RxrLT z2Qrx6S1`RSWqMZ3bgzKV}B~!=Q_@Fc^o^E z*taCG&k1Im6~xx*$=dG0nr_Y#s>>Xx&3rnC<5UjE;S7#V@$9Rj*{21tP4#E%_hGAZ zX032wEw^V)GGXylXYTf5E3sqMm0$|dWjSBKbD>z^W~JDs6rr0{;;Rybt~P33sMEOG zqEN)G3x;4?|?#!UOvqK-P%747N;PINGC+o|fZmfE~z2(lj z`aA0z-=0|X_T=JsXI84pOZ@-;KiXlt1TexHN`m}?Zw@SAaIT5J4@?)~o-U3d6}OUB zv@?tL&XV#qWtq=-@Qj9zw*ILDTB38NOjdr|7^*cz*Wkci?$sd{9$p-)Lv%d6Dnhyz zglMduEv>B{wsOmnB}gXpX17_D7OFw^ldO0|DZt&<q2vA54k)j>-@=`p|TUuHcxu`14Irv8VP11_x+)Pzrii;-w;m}OpufdmHyP;=c_Xd4$S*KNccDJH0 z@GSAYKTG-2d5N3xe;(PyePeU*T_$%g>0_xz+_ULj92+lPHr?>`iO_R*-d-!Q4cE6^DgB{Rt{uw9oL* z4W*@hN9`Tw$YfpywP9YKTXlfZ O&EVji0MHA)BgtMn|aLt8(4nUv3#sz zIhoG#zlr^04ZD*v)5jW)6PfH=17QwbCjBQRZTdy~3rzdNuF7v4z zj*W5b>tfkgMzQz#ur;`_);Y7Ln6h}OGyiDhjy7P?m0;2qXL?`9d%l2YV*=ObCcz8E z0@o@;-?vC!EEBt4DSo9w{8FX#^A?4ttx9*=w68YnTx-?8(P?_U!}LV0>1=%uNl_ZP(8Ul{*jaq|7eDUVkdK3-GwWL@c#_2tjD)IZzSd}d+E^X;uK zcK5v8)AwRe-^;!IkN3}fcY67|Gb{i9|6hIh)qh}wHIxMT1>YQ4z~EdHe;=4GR6SiB zLn>}1txy*-NDw_6t`d}(HF1(sAXnujE-!77j(`)-rYS{6#QC;3J^N5`F-9`7(uvFY zt<#!ALPkry1imGQYbc4NuF930IVUtAt}`HFLCoqVo>y6?HU+czhHT~i`}k6ESL*5n zuA|+eQzte~no|-M)Us~Xs#V(xBbqAWCT1g{bQ%6cUp72 za;tOW5jb#q)#7FA(vM}oJ}%p#UlB7m;)_YI%%0etKP5l3DYvV4H})D|2yX-jW5oa?hs*Okzml+zf6=}!C3?t Oc?_PeelF{r5}E*EsK@jG diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowright.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowright.png deleted file mode 100755 index 92f6164f9a2a179b5572c5a3ba9a4803298fdbba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmeAS@N?(olHy`uVBq!ia0vp^8bBji0MHA)BgtMn|aLt8(4nUv3#sz zIhoG#zlr^04ZD*v)5jW)6PfH=17QwbCjBQRZTdy~3rzdNuF7v4z zj*W5b>tfkgMzQz#ur;`_);Y7Ln6h}OGyiDhjy7P?m0;2qXL?`9d%l2YV*=ObCcz8E z0@o@;-?vC!EEBt4DSo9w{8FX#^A?4ttx9*=w68YnTx-?8(P?_U!}LV0>1=%uNl_ZP(8Ul{*jaq|7eDUVkdK3-GwWL@c#_2tjD)IZzSd}d+E^X;uK zcK5v8)AwRe-^;!IkN3}fcY67|Gb{i9|DU<&Kp!x|8cKrvf^QBiU~sO9zYk0oYMw5R zAr-fhR;UXZByedy6J8n+xKd*(M=O`;Qr1kH7SXWj;$F*kY!nRA(AS=$6=w9 zYiCHB(~QuLSdF;WsZUuWPfmPxYgwR^QiVv^NwMckj{lU-T0M(nS<3XQS5_)CM?Gcg zaMFCa$mU~ds+pEn6lJhR2&Td}~@f~`$EEIUtgMe$5?c_z8Y`1*oi4uJ%QK-XoWy8YGl Qz}RE(boFyt=akR{06hc482|tP diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowup.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowup.png deleted file mode 100755 index 47d8fd59f5fdde8bab4168003ae6f7229ef87dca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T1!3-p?t4T!xDVB6cUq=Rp^(V|(yIunMk|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*9U+7#jk7LR^zgnadqmY!sLdrnB!( zVc(g|zCDS3StQ%SFt+)jY|U=085S%iGE6gr*ro=sP4r`{b!JU8VewFBc2i^S^kR!P zWN}nx){$U3RV;S3Uin(1+RbkB>s{tIdaQ2rSYPk4xzJ&Cv(N5kzr)Q5j<+T{-XvfmnL}Ln;ZUcdFGRil`r>C`d`QJua4nwEyMqM#_!dP|Ld9FS1`RT zXZqj3^0A8Le^~bgztwXd&t%_~%)TRueNhSGr*b$>WOE$O;Mg3`zA=t{O$__0X!aR_Y|{eRruwt>`>^$Rvo*M|CK$8C z8?oq1GIe{g#Tv3Wt1y4A=Q)?p^{JlkR)xU32B8bZg3lYo-?vEKsg=B4Cv&S#?sAR7 z)ke*$OQmo3B=Un3ig^r)c+-SwUrs zLTCBZ8MaMn>+;#PG%#mbl3iQK&Y-Y86ZcgX^%V)unzG9)Z`ICy`zH1-$+4R?rEAWV zwG;R4+vl0IEl9B|MDYTznuBDm^68S9e}q(4PO6z8{pDcM$H*>LkDyPLl48q_wXw0a z9b2}HGjbDGfo7*gSf2x*y|uA%cD(z(1q}05c7$wL-9DpWhj+u)t@}4GFbM9+kWddf z6{-^?!?B3@ZR8vlN1cxz=2r|vxHhFfEIlsusp-ubyEk_tmP-8Hv$yu}2CtnPDl4s8 zlBNnVdbTD^?PBu$*zYAcMW~>tq~y^dEm66L@8k|PgnIR`b0if!O|`i>CqlDra@ocD)2CC~=J_ z3C>R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dax9pDq<`tb3SoqG=+I(G8>rK?+a z?%lb2Z)$4ly!lK1|NkF+R%9Mf8D~k5U+_&RV7T&lVmMIH*we)^q~g|_lRJ4C6nGdm zKIZ-He}=_U)b~T>*xVeczm(M14EtHyd(0B5z)V#A|2@G=>Mb3E}8?FXwXYh3O Kb6Mw<&;$UJM^i!o diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_bl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_bl.png deleted file mode 100755 index a1d9cb99065526be9fc7e2fad6051cd706b3a05d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^l0dA?!3-qBt_98lQY`6?zK#qG>ra@ocD)2CC~=J_ z3C>R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dc15a1Kyx@+H|i&w5~-?eYwfy0N6 z96NUM%-ng4Zr!;zbN0N$$4)(X^!V}9XVYiQy>{c)sk0Zh@7%R{>$a)WW-eR4YW3Dm^B|D(kM9ddnky;@cOdlLVet$QWE zzIi>*o9EBd?3H;-*WKt{a6EE}pkrLmTo$ekrvt9MQIK51z$$gBD$#MuqKfI29c!B^ z`$`o`rWhG3y$N#;T=U41QDf$LZ{?}VwPyO$EQDB?7X;7V;(9F6Z>2zTj<9vGmOJVF)5Cm4FT+2HB`}odM}=Ny^{xjxn8DN4&t;ucLK6T=ddsE& diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_br.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_br.png deleted file mode 100755 index efe9531dc0cf50d1c7b2d4c958894301c330891f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^l0dA?!3-qBt_98lQY`6?zK#qG>ra@ocD)2CC~=J_ z3C>R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dc15a1Ky+S%22{^FJGyY}tccj)1x zC%10jy?FWB$&H07Cm_Q_|UPFM~|O8cJj=^MN1AHJu!X8+|66Ioj!Yh z+45Cauiurd%#R*UG8Z6|JwgjZHJ_uwPU8 z4E3`iQ)>4AP7e*U(toYF$M?_X%{K2-gpQTXK4a+A<(cWsniI5lY1Y}um&X)t3O>JM zpml-CG2=|s(%FTTCqD@;VG&|-=Lq`iCC9|WaJx8kl|h~8W1y26JYD@<);T3K0RW=; B(lP)5 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_l.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_l.png deleted file mode 100755 index 7095bb9fd7dd9b6eb047d4b0b90c570d3885c327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^l0a<3!3-pqggv|hq*&4&eH|GX)}JtE?Rp7PP~sX< z5}cn_Ql40p%HWuipOmWLnVXoN8kCxtQdxL1)dr|2A;2fZb>93X(`U@>?CRUO_u$r@ zd(U6Gdg$26hmW5C<*5Q>xvj#11}T&T`32vE0tOfZjh-MVR|-_C=IP=XQgJKk!Gi}0 r>8Z(SjLd3oY%CH}C1J49h=Gxf;mJvXhe<~!gI((B>gTe~DWM4fo&{UO diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_r.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_r.png deleted file mode 100755 index 5b28fed0ed3f3c050a2a8d1a8af0a8a06d447aba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^l0a<3!3-pqggv|hq*&4&eH|GX)}JtE?Rp7PP~sX< z5}cn_Ql40p%HWuipOmWLnVXoN8kCxtQdxL1)dr|2A;2fZb>93X(`U@>?CLvz@ygD< z2eFS|l zC)3h0JG=TGK7KN9{*tXb_x}I?Uuo5H3!q}|k|4j}n{dGJu=Cy)ps=Z@i(^Q|tv4r6 z@*YrNIN~6zAoEw;hjm)T;<@iP@E#7}JsZGtI>l(_nWH7mzj@~;&bt1L!+>FNiT=uy To&IS+0~kDA{an^LB{Ts5Fk4)Y diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tl.png deleted file mode 100755 index df2ad7cf9e1f4dbc58cb96a6ba0df3e42c8ecab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^l0a<3!3-pqggv|hq*&4&eH|GX)}JtE?Rp7PP~sX< z5}cn_Ql40p%HWuipOmWLnVXoN8kCxtQdxL1)dr|2Ilw2xwVL#{p9KM%U5qKS-$$f;o}>&>{z{i^X~nJckVs7ZP&i7JNKTyboKPP zizm;VKYr@$tvmOw-MIDo&D%rAPF}on?dkIukDfez`1r~H|NpzYyQi3PgPf{Z666h4DHTkwyHSPW1N73B=FZLuyGE8ImvE8}ypHCbU4@2X*B7to4Coh1GX7F_Nb6Mw< G&;$TNuh!Q9 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tr.png deleted file mode 100755 index b3482cfa41c69d184661027b57f6f192d5589d28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^l0a<3!3-pqggv|hq*&4&eH|GX)}JtE?Rp7PP~sX< z5}cn_Ql40p%HWuipOmWLnVXoN8kCxtQdxL1)dr|2A;2fZ_0f~3rDc`7_8mHW?BuK0 zZ!TWG*3{g-_rQ^xx9?7wIx8(bYwo;7GiS{|cJfSb-{j7&zVnx^PMA3D)Y%KuXUsiu z`rMW4HxC>>o?lRsn^!n*{*nie9-qH><Wt(zRnd~M17s{0{+REK{-z@WcM23Dw>}(gskILd-jWy)l1w`bh zPZQ8nQB>A_|I;ZTZu_00)2WjZnJ>Rn;d%XA@v{5HVlUq+f##)|i$#;G3nS)D5I37-v)Ryahoe9lU_cO2EQJuzgaktf5y*|%+#I#30=7;_U<9mJ zky>kEK&9m@P_$^JQ!YgmEh^#xSTWNPszroWK?^qjK)<~AdtctXPp^`nwv7n7g8%>! z+1ptH0KnnxjJi15RkFAHJ-gvGiM&Jr=(xJcscO!i-Au_@ri=o$X|HlO1|+Hqaxn%w zPpQEKm{L{z@d&on-eTr+g~?e+ZW=|Fj~c@veh#uL1WLID>q56IaLi&dy5nVcg=R9i?wHY~wVtq4&D5_q8yUxehUs2VOT6CjFUC@r66WWhP{ zWrwtNHeHWEeDnuP`w7#%BYxxs$!9|6;vz_HRw^j4%JH$m7b=TASwpP z@g;B!G<_;8^(UmNQC&Jko(fBhsNR4YWC#{R68eIiAc!ZWVhQ9dBTa9h8KhK|3{lCb zDld?&qv<%XltYnlDN+F&k&Vub=U!~4Olp;#5go;TKEQ%yh$Y-koz%hf( zN)#47d_KM^&sNf%3u{o{j7Lw-1=xh5s)tZxrS;CtQU0TnV-u6dA9zfz{WJY~$+La` z)QhJjb-zA-dvQMXC1^8Usr9LSX)F47F`)QMC}?n|@R$6u-c8{iUZmmOlehAtxX0Zz zSJ>*vUG!=l^eC=c)^TJsaZe;Q%<3Dfj2Nxv=9;!F|J;0I$JcXnvW^qKUp;kVRK4Uk zV6^h~zD+OO>+WjV2$`Ak+%7UitG(|J+5 zsC7L2#Pz337eBK%{kHhP7*fLtK(-y-eNoa@M;PD**2a%|&L^d;(w!nJhHYhlgY$N? z^GE#t*@*BYPwpvQ&l#>zkYKIpimb#ry1d!k(n)j)8)S_wFmc3$Qul>T+`UFpZ%(aK}Eth3n!y-^SDa@Tu6!PPPa>&?#3Y_@kdl^C|Ch&_Up-`5u2odTsg- zp!AOG?8c_?_!@HBz_X>r7_qegw%)6}ncj7uQsv;udgI?|}*vY4TFLYcn%~9t~Sof~-9402+gXOFZzU-gwuU znJ)3ZbG=>-yfKCYy)VGbZ1Ty$Xl)iR@1esLP-E+4+`o&_zwZUNWng4_3j|P`_nsLD2+5HYlck9ONe+aOX L(^x++6_)=1RKN}Y diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_snr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_snr.png deleted file mode 100755 index 973ae3a7c351f333ebd584806b2021959d05a77e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1262 zcmV!BQ@fIz+JyZ0#{jy+J;xLOrHWGL|(-xesdU3U2TV zZSPeqj!-a^CsoQ`B!X!gbT>z}5oqQpQ^+7%(_AHlZ5D4wHhBY`YX!%Z`o6=dLS7;r^8qas<* zU?P7@HJd3?#ymo=D^bK2WZ*?Rq&P*iZWe7|BY-+XupeC2GE2NRNVh6d#%3LO7h~WZ zUDs|FZfqBCJVCENKdNCNeh+Ht9bVWUThuR2zi1nEWgdA{Eszas>|`H%6lLQ?JEdkG zc`Q-HKR~NuA%0^Yd?H%WBv;O59eF!LuvaRJNI0N9L9IqPp;{-06lUZ{IiN;5q77{9 zAzIQ}D2PQlqC-5TD^bM`YwHkc=xrBnAY9W^Es#hzpKKU!AY0W*IG-R~)F4~aV<3EF zAbTQN&>>mUB3aQrLas(Sq2_k~{Qv+0^hrcPRCwC#)ah1IVHgEq6bW;JFikX&K?D^& ziVG)%P!2*WB!ojA69lJ&GL#LFVz=J=e#1dq{pbR|eF@Lnd+Yp|ge_6W1OmxGpab&; zv$wZ5J}!^Ta^~oBebZ~on+uzr>4Vf+$i|mws0n-G)3 z;n>*N=g@*L%HQ!{p>- zJRVhna$>E_2YF9#A11c(fPyva5$W(+idk@vJMCxEF1wC zWcf4$1UW@fnoZ|18U!Omff@M99HC$z1cq#PmKhKQf-r>$pa2M$zX9O@5c&ZD6+Qt% z@i9*o2m&aW5W&$#FiO&qREbfAAw)n0&%H-|P{+m^-_tWuL;wOnFhBrdExrZ>`-sp< z5Nf--HHvTz1k?Z!{D=@vKoyepBqA^dB%oE0Whg?)c2X|+<}MW9Xaz#L9s4vn9D z4tj!M&=5!!unDM8gY1Gq^}2^tq1^<3I6<0FPkz%7=ot7MPEXk-D2RXrk;t=8D7Qbs zKFATC%z+ny&Ee*X&!L|oOalU(f`+j96hSKjAjF;{;3wR-R8{?g2wP0SYamU4Pl)3s zxcD5b#K2rN!x|`pMMDtBD2`Daqc}!!jN%x@F^Xdp$0&|b9HTf!ag5>^#WDWxG5!%? Y09cn5t)~0G^8f$<07*qoM6N<$f((EKR{#J2 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bg.png deleted file mode 100755 index de085baf91159d987bc5baa6d25b8879b7fb5fda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2650 zcmeIzUrbY190%}QETh&{%aCOg$#4nI(2+jqK%s-uv_L^>OR?3kX0l`v)-1u$DT5g% z6W#1^ZZi@ETqc9Sx)Ge3Ar*oCyY%1f|MvDTv;zhME5Q_;!q_=`+%wt3!pY};?>*dK2)NI$lF4qVguhbuS) z1i3$|9fEX2V>%^-DplwMX#9bCd>GOXYxEBx!-y6zj_8b|kZDY38bytxsA&u}sX&gK zRFGK>VQM{K(daRa0kCKcR;|IJH3C*0U;=EY$%=wB1NLzM0~~t50yqtT6>u4?P9sPg z;5Gqvz+<+%%^)2BjyXISNGEQAycU<&3i+&VpAGWcJbpVAu;T#-6m)olPAKH`gR!6M@cVM0^USYz*^d-`QvDK{ z%H$`jF28%AE;nu8`GL7t&4Iln@}8@VuIsdOX;fk}lS+y!NFxz9q!UL<`*g!6ZDt|_ z;zr-;zb8$7S;ecz{lS{RvfDjVmC{#@}a`QGl>9YKEN zA)3iKD}R3D?%?2+1K(w>q}OD9*n`V_751sADR!VffcD<*-Er#iZ-rf<>EW`*Z?hSU z)f{Pcb#3k9(Gas~-N>S=Zst=OmJTk2KO2Zfqm5M(iR6qt$W=-fM9$Ws{x>9jvO}}> zZt0=(YwPFu*$rz8-bEU%CEO-gpA^zFTPo?gqv%a}#+RLxj%aS|<6A?IpFTb2yJ%2# zxy}|97XHF@2rgduhC^%L&W^2|Y+sJWw6wfZdBP{6ONYOX_K1cko5@ z{;ue$KO-#z7=}I3=H&SNeoHcV_S}?@dX7n*b3X`MczZj0WsF(;wut)Al57TXvk>6b z+}sD7HGrS!|Mxx!&oc2q{yUAzgv36=oz$;uPRvXirZqxJ?~e+$s9I5=;Ep&%m)1%u zv1i`F*N#s-xkk=XFlm|Yd;IFWH`6<^EB%LYnMC+jSx=cW>#wi!;#*r=XQ(C5KZulU e&<|MV+_M^gm7gP?USwQDK;v?F?0(jX=Dz`&PV{~N diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_eventinfo.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_eventinfo.png deleted file mode 100755 index 5108758ada367ab7b76fbf2cfc212ccd45b6349e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 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 M%Bsnfg3SZ|4^dK?)&Kwi diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_menu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_menu.png deleted file mode 100755 index 6a64838e1540eca39f608019adb75958b7867f5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmeAS@N?(olHy`uVBq!ia0y~yUT_Yx&S{^UolgA}H;E0rZ!fpqm~~6-pNjM5*WR!HdpT*V z->>r5S082m|5}?`JJWXlvAdhrY5(24EAHK~%b(vYU9u;#=k)oqx-f^&--<2u%q*Y2 zykXosvuWZTWQ<3Qm@s=A{IZtwdT^UX9BUcm8&BjN9v1jJ0uX> zDyki}CSqgKQ7s_J1!N!U5?#H4R$Pc(qCgu#_9h7IIacyh;ID`s9su(g}8c(hZHG&pAgC<|cB3r{0Otcy`Wie&MDq_nRQn@T-%?w4Y z2|=n5NUw-raE5ITk`NPR40%Q9=y6;8DvS-~x4&Js(q9ag>#My?uDy9z_ABwfWQ zV97IV(-BIt7f-hrQMeEwJ|5LXlmGw$T1iAfRCwC#(+OIVVHk$d7aIIhh6mac>v1p-~42A=^X&d>TlMqd#DaTTI_~(W4{3?yXT^R2%QC>>`|!X zqHh6E);wIYa=ZyZ+1+^F%GDnLl(iCO3)L0?Wlvr71BqV%ls!zk=*bHJlsyOs?RIhx zfU+-M^zbeKXg>~+SA zJ_A76%WT_f*`ENEEx&8qoya8s%AQBsmWo^fplmR7#!^EA0LsSpqhAA{tdZ+jD%Sv@ eY&O^VFTemJ+iKdd#Z%D$00002QLq|8ha^gn7E7oOLZA&mo)JW%3_qMQ zSe_C^q#;zY2QhsfM2ZPKnlNO-EnKlDS+@=yI3rfI2s@cHY|=7n&@EG$FJiw7LaQiT zx)wl;3O$`LR-6$#hbB;)8BD4mNtO^uuopaoFjbfsGF~W7l_pG+4>*JkM6C%xsU}~? z5lXTyXU_>jsvcLrAXvdQZq+Si&LUdF996vzN3Rr2v>G*K3q-6NRJ<{1(KKz;Dq_nG zMXnf8xg%V}2|=ncWyC9F%nwMgFKEygK7|!Kf+bwU7EZMwSHBZSq!dfDFK5muU&j|u zw;n!s7(a$0S-~4qyAw*XEo96pVaYCL%@0SfBU{2OU%eGgv>a5t9aX&!My@MJejZl7 z7*Mz|XwNHAm?mDu88l=ZDnk`3QZj4O6;8DfNwFDIx*b-&4MwgLOS1|?s~1qXC}7D8 zL##7w(-u#*C0)i4AU-Hko{78}rM4Q? zDzW#bw$@gAQ;J*f@1I-vdigomaO~47@D9%HqA>=j&KhI3()%&3ct`M*-EgS1Hg9 zsMZ3_RvG95RP(-|Rr*(o?J^eFRYb z@w-a?M?kgg&v%vn0jjx$d}~>_0#v(RrJPAac9n(!RjaF%SJeloo(k$+r6)jD5wG+Bs5-q$1)YFu mEIea*;W0qK%^N^vrBNbBwD>9SiBKF zkReyPDORZuA3Hr~wl8JI7EG=kN}Ur*tqw${5w=`_jC{msjO|%Y2uMtYJFK5sXNU$+w#2i(<8&tdtM64-c$}DBgBV5E8 zQ@RaBt_(%3CSS)eXwe>5zcFgj7*e@4ZPf`vsuN7J8Z~7@Xsie|h(u|vC0o7_J&!J5 zxL0|%A62+nc(W%_oGoL>C{?FOTYNNX&IvY&6iTZrSgI;t!y;I^3P7VFLxNIwyh3QJ z8c3QbUBDz!q%UH;CR3&iIgAQIt1@fS6;8D_Zq_Yk&Janl5=*ijR=z4@%ROnlCt%15 zL#r21xFlW0AzH!^AU>a(>1hA}0YXVcK~#9!?9qo>0RR*R&?{6_2x(d+q|n}b@2$P1 zwD%s*-qmCL-+x}=Ncfikg@v)8u?H)Jr?XS?ihBr7@tJI04-uTrT`50&BsiWEja?)- zxmZs(!Ew}!&2vw1qWfZV%oCjGjmFLroGOjo8z49u>#TYrIO!{KR*w@LjXh7l5uD2k zaTSaaod4Jlf|E*!D>XxKf(da4zX{H1Ox(2-1Sb@e!q5-F*}jlK=^Vi^RZ770N^q<# zk~9qy9KXg|M+i|ROQ7YL4crCGiRPD5N{y9iEAT-IwI2+nbxtTy%%9Lt8r zE)yJ$&01avja>QWZRN6Vp?JQWH}u3s0un02Mg}_=LDRrERndpJ)-%?UJ?CCVGZ_ z@=C|Fbyg9Rts|#7Brb7CU2Pw~&^~FoZR~8j*m>r`oi5qiEkb&oGq+fV_Bmy2{{R2K z)8BcvK-0uZg8YJkTui{gc=^@--U>u<#~wT66yRAHVc?@&^+R z&Q}RLck{)~-GA8DU~`e-e3se!kItIvd5qP@KXpY*@>AQ+%*LB}JqAk?e9joyE-=nw zyv$$}b)cl7N6bK3VKM6&h7%c#!5nT!be{iYN=_09=5D_cykn8hgUVIkcNl!DtrM%e mY*YA?ee$PQ@8{fPkzlwJrWK^>vP>T6Fa}RoKbLh*2~7Yb36vB7 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_bluekey.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_bluekey.png deleted file mode 100755 index 077bd14f351aa16f29bf25e7bb485114e700efc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1807 zcmV+q2k`ibP)Px%yHHG2MH#m}4NiOwPkjwfehpB54N!j#QGg9mfe%rC5>b5(Qi2UqgA!7J4pV~; zQ-lyxfeuuK4pfE?RfiE(g$`DT4pxZ{SBe}}ehyfR4p@v8SA`B)j1O6j4_S^8S&JB0 zg&kLc4_b~7T8|W3iw|3n4_lEPS%ME-k{4Tw4_%WFU6c}Ck`G>$B3pqEUzQMGmk?l> z5MY@nT!Ii`nGj)`5Mi4VVVDqNn-F505M!MZW1ACXoGf63EntHbWt}Nui6LW=7iF9p zWtkRco)>1G8)lj+V~i(dkvU?2B4?K!Xq_Eto;PHKKxl*~ZJ#P`o+)piL~DjdYlcN^ zh%#`UJa3aPa-d9ahf;2XNpX%^Z+<^_o^Eb#Jb0o;cA0N)Z*XvMadB~0caBYYnR0S+ zU3ZFeb8}jFj%jv(baZrUc7Anrb!&Kmc6N46exO=>lXrJ_XnKZFf1!AIczJnwQh}j* zdU{uZo@joKdwY9pe~xi}hkSf|eSLj-et~O&k!*pGetv#^e}H6!n}2_Qc!7t2fPh_x zrE7(kc7u(9fq`j;n`MWdeu9Q@g_L}Qhk}BFV~L}KgM)*Egms3IdWDUEgok{Ei++WQ zd4`XKgoJR2nP`fkdWVpOg@tB|rF(~vYKx+Kh>?bdhG>kXaEqRYhlhuUh=_=Yeu|QI zjGS|gpoxizhKi1gii&ZMq;HU?i;IhfjF60sjDwDrjg5_tj*fwmoPLs^kB^Uel&6r8 zkc^R(k&%&-l9H2?lZKX|k(8E{l$4B?o|ToAikPC7mX?#3o0pfDl$e{1nxmMQn3L;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_000McNliru+5`d#G8M0caJK*e z1Hef{K~z}7<=Oe4<6<1Z@mj|+!^b?cwudD3o;KjDe@Z~5`_dVOE*^E}@`0AlD2DDo^*+Y(1HqN?eJ=^KWwsUoAd>lj|q?P951@r`n+XzL0;>*aB(S*%oR zbswo!D@9Y~e+PAfY&dSc(P;WeqfvJqLtX@Vl4e(GAn#w#zW9E#fw+3DVrw?Yla11n z$$b8--L_h`^|BpKxp}66_0>*tTosOv$CJrK9E+^pwdb;? zi}2rrD2J+Vs&BM$#!^L)dtlq7>N_{`)6&v>!C3MkKDD%(h-%H8IVUwss=o=e}Wjl zeAATHb$t}aqc6{x8lqH*0(lux$wSA3yd%G~@?B@cywB=J9#M*z0eNXYt3nsXiCE~K zVovS2Z67e4C;n8bUPcITm?aUyZkf~}xR;!-e=m1HP) zE>2*>yI)aI;Mdg$3`COTvEMZdGO8pN=B=ZJ_Vd|>wPZ3fwBoP}uDR->6L#)j6C?2# z7Hk>W=Rkp82l6H;Ui8Sf98AU|!@=I=+x7GfhB1P?cCnfhk;PLJFfYRiZOZLOk%_VJ z9)p9cMj|nSyz$3IK@^b1W#Dj5rWvk{SDreDBof%z7#7FLli&QIrU@Lnm^8c)ag!9= z!DX$dFFu9<$nzfl{_9eXXAwqCE`Yqi#Cn?PV1?ZDhwr@m`UjtXGh5armO&W3e&SE~ zO0A?Qx{Kju4cz~xbX8<&q*1BamiG!Tr2n)1q8XNB85;2wSSGFg-B}S$rTw+t^Xlq< xwYIFlesh^r+DB6C%pa|#3(P>vX9E8V{{Xm#yGnNWd5!=8002ovPDHLkV1jrSU}yjU diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_off.png deleted file mode 100755 index c2561a4607904e8ebbd45c88d459a43c35b67728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+S!VC(K#9UVa>QWZRN6Vp?JQWH}u3s0un02Mg}_=LE|#l@AEmseL;M@B}bq@)xU z7A7Pll$Ms}=H}+-=NA_jXJllgrKM$MWhEsgg@=dN)YMc}RYgTbRa8{O#Kipn|35TS z@fy%Hv63LaU?3M0Ffd*^@C2x$$J50zq~g|;NuEM23IZ$_3nk0br~I$KnkBW=`!L5@ z;n2zkwmJI`+Zt>xGOTPmdp_yxA(hFjHu^`e9NPGK-jOW_WX#=W1R1EM&0xFG6Lp}5 zQBpU7&B2X(2H%8>Ov~6)wlrw6C?`#;bW8B*Nz!^KP|fxI8PmM!v%-(mF7Fi$J!uSKLQ&|M6ku6{1-oD!Ma>QWZRN6Vp?JQWH}u3s0un02Mg}_=LFnRyjsZ_KunE>s4wW(dQ94 z(aXQaF`(W#u+b&7(><))Bck6kxW(1K&MCOf&9m4xc80HanSIPOpXe#xKIIPo|NoaM z6AK2KCRP&U7YyWL0tUuQ2c7^`^mw{BhE&{|GRae@ML~e&VxeSt`jr3mSF@y+dLQOE zD;!$cz&2<9VOxXEMTV74XYVJSJ)|<3)kgp5ltUXo&pT3bK*ro{hLeF>+6=J^Jy8ct z8hXSGlob}U`tYB~VEoLQvZY}qt8&t`O11=_o+Pb@0@YmKpE1pwJ}dm#zVqh~<^S@G k`FC*1o?q7KW{hkM>#k`9y*csC6X-4mPgg&ebxsLQ03ghg*#H0l diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_0.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_0.png deleted file mode 100755 index 64ad8391891b59ef3409855651e0ea01e1c80f58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmV;i15W&jP)X0{{R3jOJ&c00001b5ch_0Itp) z=>Px$eNaqPMXX_YARr(iAt53nA|oRsDJdx|EG#W8EiW%GFfcGQG&DCiH##~xJ3Bi( zJUl%;Jw84@KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJox zPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~cUtnNh zVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O{YHDn3Y;JCDaBy&OadC2Ta&vQYcXxMq zczAkxdVG9*fq{X7f`WsCgM@^Hg@uKPh=_@aiHnPijEszpjg5|uj*yU$l9G~?l$4c~ zm6w;7nVFfMo}QwjqNJpxsHmu^si~@}s;jH3wY9akx3{>sxV*f)y}iA@zP`Y~z`?=6 z#KgqM$H&OX$jQmc%*@Qt(9qJ-(%ISB+S=ON+uPpW-rwKf;^N}tFMg~>g??7?(XjM^Yird^!NAo{{H^||NkE3Lh}Fs00DGTPE!Ct=GbNc0004EOGiWi zhy@);00009a7bBm000XU000XU0RWnu7ytkO2XskIMF-jh0tqTMkNBCK0004?NkllH8lzkZWRqv_P@ozSP~?s<`032fLgu_HXaaOlLY_ znT~!BXMPXg!@2jIX0{{R3jOJ&c00001b5ch_0Itp) z=>Px$Wl&61MXX`hARr(iAt53nA|oRsDJdx|EG#W8EiW%GFfcGQG&DCiH##~xJ3Bi( zJUl%;Jw84@KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJox zPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~cUtnNh zVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O}Y;10BZg6mLadB~Tb8~cbba!`mczAev zdU||(e1U<1gM)*FgoK5Kg@}lViHV7ei;IkmjE;_ukdTm)l9H5^l$Dj0nVFfMo}Q$n zq^PKsxV*f)y}iA_z`()5!NkPG%*@Qt(9qV_*4f$F z+S=ON+uPpW-rwKf;^N}tFMg~>g??7?(XjM^Yird^!NAo{{H^| z|Nk)!(rN$z00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF-jh0tqTGW}7^z0004cNklgTwzc5zmjq{=P{z^o^6kTU*n4-^VE8NjJ>5oQSFfqFF)(QHkb!{L zIn-zFpqT7_ia`i5bYOC1xSfH_ZUze>NtVMwjv=kKHjZ@)@gXG|i^rmh6hxGRZc*sE z5>{f#qiVTs$s!IAEshVf;&f!O3INe)M3H!wl$w+|n&s-f%$ITivaI%mIkw4>c+88T zI&lCsLP0DD8NH(fX_i-s0BFfEoV1~L5+a4LiVUD7rg1#0cTyrrX@~%g!jEQm^v;s( z^=WVbjlzo-5A{wi<@0D@fJQMXEMMxKlNHKEs89e}5}xE%)7vZC3Aa;)gljDcX0zD* z&lfpRSHb{O-NuLf2lO?r$m&FCV|0#;4(5d;tStOLTRly37Co002ov JPDHLkV1k8^jP3vc diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_2.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_2.png deleted file mode 100755 index 0293c8cc234cc2f796b5f48779bff33d1a270009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmV;Y16cftP)X0{{R3jOJ&c00001b5ch_0Itp) z=>Px$j8IHeMF}kxARr(iAt53nA|oRsDJdx|EG#W8EiW%GFfcGQG&DCiH##~xJ3Bi( zJUl%;Jw84@KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJox zPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~cUtnNh zVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O}Y;10BZg6mLadB~Sa&mKXb9Z-lczAeu zd3kzzdVG9*etv#`e}932frEpCgoK2Jg@uQQhlq%XiHV7ei;IkmjE;_ukdTm)l9H5^ zl$Dj0nVFfKoSdGXo}!|nq@<*%sHmx_sj8}~tE;Q7uCA}IueG(cx3{;rxVXH$yuH1> zzrVl0z`()5!NS7A!^6YG#KgtL#mmdf%*@Qt(9qJ-(%9J8+1c6J+S=RO+uq*Z-{0Tj z;^O1uFVn0?Ck9B?(XyR^Yrxe_xJby{{H{}|Li>`!vFvP0d!JM zQvg8b*k%9#00Cl4M??UK1szBL000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igPz z2`VO%Pl@;d00DQEoJrRhmj0HMM38ce|ZPT~%WV#boUyC;$LO zx*ZMm#SGABr)b_QN|MjRQn;nHh-2vhoLBZM0mUzi9zfX00)+CmUlM3H zTHv^7M(FB3gvlg?tKG85F}Rqg^pOm!_A)vxN$c=3+Y`+)d5*}@oZ!td0Pof4p?Q8@ z@5mmK;WQ%fOpPqXinDqrC=h_oAzj0~v=mWluX002ov JPDHLkV1md=t(X7+ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_3.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_3.png deleted file mode 100755 index b18fd0ef692290bb8103f83c15a6542e0f6c7f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 951 zcmV;o14#UdP)X0{{R3jOJ&c00001b5ch_0Itp) z=>Px$l2A-kMPa^WARr(iAt53nA|oRsDJdx|EG#W8EiW%GFfcGQG&DCiH##~xJ3Bi( zJUl%;Jw84@KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJox zPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~cUtnNh zVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O|Yin$5Y;A3AZfFMd}>gw$5?C$RF^Yioc^z`@l_x}F=|NsA^IbrJn z0004WQchCv98^P4N&o->kx4{BR4C7#lUGy1KoEdYv0+7o7!V3-Zn8yh2NEqoma8CVV~*R#sG*L$TN! zNg4n^Q@;9&@@xjEbkU3;$%+#2b2MSA&EnV^057S*P&gD+Wj`PtRE9z!C7_0ukD(SH z2r44u!!sN&!-`GKK}|c;;90XO^DH5!DV-F{>311clvW6P(VZBMO><8fGDmarq|s>;Nx^QbgFF) zeXCd57U<=4We~V9y94*O%X0{{R3jOJ&c00001b5ch_0Itp) z=>Px$dQePMMPVpVARr(iAt53nA|oRsDJdx|EG#W8EiW%GFfcGQG&DCiH##~xJ3Bi( zJUl%;Jw84@KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJox zPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~cUtnNh zVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O}Y;0|9ZEkLEaBy&OadC5Vb9Q!icXxMq zczAkxdVG9*eSLj_fq{dAgM@^Hg@uKPh=_@aiHnPijEszqj*gI!kdl&;larH_l$4c~ zm6@5Do}Qkep`oIpqNJpxsHmu^si~@}s;jH3udlDQwY9gmx45{tySux*yu7`=y}-c0 z!NI}8!otMF#KpzM%*@Qt(9qV_*4f$F+S=ON+uPpW-rwKf;^N}uFMd} z>gw$5?C$RF^Yioc^z`@l_x}F=|NsA&g3T)c0004WQchCv6)m6W?f?J*nMp)JR4C7# zli63=P!NYvX=|}n5di@siQMGgF$(bw3U4bZBaVjtMM~*J^(YNs zH&hZN?X%k%QxGPE?7*}RKpc3I&AXi`g+mC^f=41MW}*9&hF!Q zcFXN7Pq7Tce6uX82w;ud{h+*X=yt64C>p7O0BV(a_oeRbm6fqrxCRG*oDvZh_v-)o zV3`i|KM-Vc1!!2t_9s5n=f5Wqoh+0a_YS*xIqdIo=nV|b{5WYApzG529FB#9p$I#= zx_90@hqsr%f2}Wl__(^ce|pn0(6?6?)#J+9-+zys#(&SVxC52&Q(aJOWqJSr002ov JPDHLkV1iLYs;B?} diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_5.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_5.png deleted file mode 100755 index 9eba495e460268ed9d6eb7e669000c7123c8302c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 zcmV;n14;aeP)X0{{R3jOJ&c00001b5ch_0Itp) z=>Px$l2A-kMPd71ARr(iAt53nA|oRsDJdx|EG#W8EiW%GFfcGQG&DCiH##~xJ3Bi( zJUl%;Jw84@KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJox zPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~cUtnNh zVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O{YHDn3Y;JCDZ*OmKaBy*PadUHXbaZrg zcXxPrczSwze0+R?fq{dAgM@^Hg@uKPh=_@aiHnPijEszqj*gI!kdl&;l$4Z}m6ey5 zmzkNFot>SYo}QndpP`|lq@<*!rKPB-sHv%`s;a81tE;T6tgf!EwY9ajwzjvox45{t zyu7@FMd}>gw$5?C$RF^Yioc^z`@l_x}F=|NsB&Ft&jJ z0004WQchCv4yXDd0ssI3kV!;AR4C7#lUGy1Komx?_ksv9A_9_RH`x>tLs9I#7wiRl zuVBTx*8lCI&N!irqi1I4eh=qi_ujiE(_bmb$QV$ z3RuTfE3*y2nPJRDgnmErYI~?yn5gq6W08i z3_Wy;lr}t4T^5%M0W#op@FI#4AC8PjXZQk*p|#cwYHJf}%KT zbaaX35kg^nvOVV`0STO-4jY}2%m4`C431+Q50L~}7#uS?9kQGGB6xrg614%eOdFkE z&FT8472`y4g6 zYxyGG0zIED^#D6%wb8Do@XlTOJ$!pOUY{Ku7z{^tuU;}P^xM;Y{Ot1f@%5Ll@oxGT YAHTCx+D8!(NB{r;07*qoM6N<$g17dv$N&HU diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_6.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_6.png deleted file mode 100755 index 88ccfae955a3307408671979f0df07def7b4aff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 977 zcmV;?11|iDP)X0{{R3jOJ&c00001b5ch_0Itp) z=>Px$m{3eqMZ{W}ARr(iAt53nA|oRsDJdx|EG#W8EiW%GFfcGQG&DCiH##~xJ3Bi( zJUl%;Jw84@KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJox zPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~cUtnNh zVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O}Y;10BZf|dIaBy&OadC2Ta&vQYcXxMq zczAkxdVG9*etv#|fq{dAgM@^Hg@uKPh=_@aiHeGfi;IhljEs(sj*yU$l9G~?l$4c~ zm6@5Do12@So}QndpQ56oq@<*%sHmx_sj8}~tE;Q5tgNxIv9hwVwY9akx3{>sxV*f) zy}iA^zrVo1z`?=6#KgqK#l^?R$H>UY%gf8m%*@Wt&d|`%(b3V;($dz}*4Nk9+1c6J z+S=RO+uq*Z-{0Ti;o;)q;^gGy=H}+-=jZ9^>FVn0?Ck9B?(XyR^Yrxe_xJby{{H{} z{~HzOTmS$70d!JMQvg8b*k%9#00Cl4M??UK1szBL000SaNLh0L01FcU01FcV0GgZ_ z00007bV*G`2igPz2`U9JDENv100E^*L_t(2&z;lRSJOZgz~QR6fC84%#!!YPbds5@ zZDMH4QYrghP-GRA)uMo)Shj+4Rp8%dSkB?3%i+N9Va|Q{9+J$B$8*=7K6+SI_TX_v zY4NPwi^Om^#65pfRf1Ib8?j6Xk)?2b<%?p1R0U=a(iG9kBS}e7*|V&{R*!vA z)S#-8XDp3sW@G@eiO5w3)%CR7IEJKX+C0oJ=dx28OO;h?$Zc9oOeoz1*!-4*&y*$6 z#Hib(Oc7%YFoAJ9fXU`Y()!+Qy6uo42*03>op5=ENashl8A}NWp=tPpPzM~a5!LIx zU)^T057+TL-iD3U0~qF6=*`=_ci(&06682eoZE&>I~zD&9$Cr%&Z}eEtJ<6VsA~oa zE@Np>3eUqi=--C_&$Z)>)T1UY|z7n;Xcj*9Q$>7VZl zlj;6}@wv?Y|B?%R`uBG(yLWhea?7uA=DAnr@Mc#!@ku`y00000NkvXXu0mjf%%{(E diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_7.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_7.png deleted file mode 100755 index 05e146aa8118f285b7af498fed1895d0eb390055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 900 zcmV-~1AF|5P)X0{{R3jOJ&c00001b5ch_0Itp) z=>Px$cTh}JMeGKwARr(iAt53nA|oRsDJdx|EG#W8EiW%GFfcGQG&DCiH##~xJ3Bi( zJUl%;Jw84@KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJox zPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~cUtnNh zVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O}Y;10BZg6mLadB~Sa&mKXb9Z-lczAev zdU||(e1U<1f`WpBgM);GgoTBLh=_=ZiHVDgi;Rqnj*gCykdTs+l9Q8@l$4Z}m6e&9 znVz1WpP!$iqN1dvq@|^$sHmu^si~@}s;jH3tgNiEva+?cwYRsoxVX5yyu7`=y}-c0 z!NI}A#Kg?Z%+S!#(b3V_+1c9K+S}XP-rnBd-{0Zk;o{=rgww3 z?CkFD?(_5W^z`)i_xJw({{R2~H|)*m00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG z010qNS#tmY3ljhU3ljkVnw%H_000McNliru+5`d#DLFK1*UkU{0eMM8K~yNuozquS z!Y}~9aa7zB8MR=ALffQ+VrvDQxF;@9!HIj}s4LD7ZwcOcEpVRx9+Eu#AJQbX+5W1& zrrK_=s%@%VG&DLWIu!B~&2?=Rk|uYM;Q#;}8|rRtDOZ3t9|xs~qN=@Nfuo(SGL5qb zh!HIsi^rmx5(bQiElF4->D8tYmRDsMB1@V8J<4N0000X0{{R3jOJ&c00001b5ch_0Itp) z=>Px$l~7DnMXX`;ARr(iAt53nA|oRsDJdx|EG#W8EiW%GFfcGQG&DCiH##~xJ3Bi( zJUl%;Jw84@KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJox zPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~cUtnNh zVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O|Yin$5Y;JCDaBy&OadC2Ta&vQYbaZrg zcXxPrczSwzdwY9)e0+g{frEpCgoK2Jg@uTSh>3}bi;IhljEs(sj*yU$l9G~>larK` zl$Dj0nVFfMo}QndpQNOurKP2&rlzQFMg~>g??7?(XjM^Yird^!NAo{{H^||Nj(E z()j=Y00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm000XU000XU0RWnu7ytkO z2XskIMF-jh0tqQGIK=)6uAV` zA))u)Y!Z@?gbtyIxGQdU%0TwG96ncpa{aHCK- z9Q0R}*5*+vy{(*pF&6l6b4_(F1J?!wqG-Bdv_&K#i?S>)g0*2;{WM8}q>nkBq{?AJh_MdpJ%?D3Q-`Z)e1G+z09l!y<*T=A*=C-bK-{IrU-q(eR;gPxZ tU*`{b5Bl-$+WLETdHe5`ukqx17ta6^SMC5~ychrg002ovPDHLkV1in9z6k&T diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_9.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_9.png deleted file mode 100755 index be9b368a93192a4ed25d357c3844e9f534ba5234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 zcmV;h15f;kP)X0{{R3jOJ&c00001b5ch_0Itp) z=>Px$iBL>bMXO;XARr(iAt53nA|oRsDJdx|EG#W8EiW%GFfcGQG&DCiH##~xJ3Bi( zJUl%;Jw84@KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJox zPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~cUtnNh zVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O}Y;0|9ZEkLEaBy&OadC2Ta&vQYc6N4m zcXxPrczSwze0+R=e}932frEpCgoK2Jg@uQQhlq%XiHV7dii(Sii;Rqnj*gCykdTp) zk&=> zz`(%4!NJ7D#K*_S$jHda$;r&j%+1Zs(9qD*($dz}*4f$F+S=ON+uPpW-rwKf;^N}t zFMg~>g??7?(XjM^Yird^!NAo{{H^||No*lceVfk00DGTPE!Ct z=GbNc0004EOGiWihy@);00009a7bBm000XU000XU0RWnu7ytkO2XskIMF-jh0tqQ5 zxnkNo0004#Nkl1;QT~+pP9JQTGm#K4y?J1G6SC~{f>U&qN(k;;Q z>2d_QDW{9}wa)L{rQgH1hvSXK$>EXt)!mzyj0^qtbRWOCzI}ZC2A%|5bjo S=7h2U0000{( zJaZG%Q-e|yQz{EjrrH1%wFLNtxc>kDf9A}YX=!Q3#>Qb`;a9I-UA1a;LqlU|XqcFo zn7X=#wY818xkX4wXi!jaKtQ0Em$!?HYgt)&e0)MwRCIWF#FZ;o_wC!ib?dgJOP4KJ zu&}MIy}rKT%a<>&UcI`1|NgaW*G`=}wSN8jDO0BO^z;-I6y)UO=;-JuDJe-yON)z( z10C>t!>x3ndvr>I{DOg8VgbYPYn(j{42*i7E{-7;xAt5*Sk$Z_z?QIRL&qYG4A-@u z!h*@a{=E;M$eX!+h=eHzFgx{H(q(U*c^ML&mJ|W!Em`w5?k_S2AYaj9(X| zGMPhntvGP%`?~0vQQNPq;`$x3bW>1YznlD-9|~fkEU)rRN*p_{7p@XAzdXZ1SiEMP z)O%jG3GaRwKDn3Ewo!)RY6B;uM8R$86x|8B7n<~s1w38nCX&oFUGH|>ZY~yg*Bvvy zZ~Vfh_#~qH$<-yUduAA}*t1e|YsA;vf3I@X#q{ht^Q8C4hRwFNvo+?Y*-saExmSGS zI~MEodo1>M)AYM+{(iKv5UNT0UhX%^raMgO^kMCf|3%yGPZjn&bK}+h$DQIkPh8UQ zGM*@IW4BTLx3Ta>QWZRN6Vp?JQWH}u3s0un02Mg}_=LDF)>fUMsk}@_wMRpFp0>(F zP35VY$_uqsr)#N9)>NLWtuk9nWtx`qd~KDPS}MzRRJ%2ldNq`n>ZmT!QSH-E{{R2K z{>jiSK-0uZg8YJkTui{gc=^@--U>u<#~wT66yRAHVc?@&^+R z&Q}RLck{)~-GA8DU~-XRWz*UFNoNnKJZ74=+~~@oji2Tn;W?0F?l!~8KrL;C*agY0 z4KEoabraki+_-1xD=cR9;XjeV7|iK*MCW;CgP~!UW~=iX&6q&34>nh;VmrI nsb2V#ee!x%hW{an^LB{Ts5p2Liz diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/yellow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/yellow.png deleted file mode 100755 index e5d8d84a82cfe3894962ed64ac6682d9265e36cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+S!VC(K#9UVa>QWZRN6Vp?JQWH}u3s0un02Mg}_=LD#>NeU|qO~Dk^Ln4jnO1{6 zRXXQ8jCPc2?X1u~SgX6gTIYD9{>f(jBlUV`+YN6_Fj=3cxv5a=YOnF-9^=i$TL1t5 zzqqI~5@?!ONswPKkc$Zz7%v@o0#woK>EaktacjyXPrhaY0T$jwPHWB||Kpb)PyS%S z!TBm-=Wf2Zx%&^>8cZ%SoX;|Q|It~kp2t{i{8Lx7BtNz7lx)12*JIF{;B&^nc7bsg z<7Gypr~^C=Jz@sD3X55NxKCs-26MR`(Ru!pDLF|bn7jQ(@Qy_~4=PuE-(mEvwoa_> nvQ6Pn_RXJOy`OWFMS|g!lU9)Ak6r(P4rB0i^>bP0l+XkK=XRKp diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ad.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ad.png deleted file mode 100755 index c80c0a230304235894bcc1edf13c05bc941d815c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1156 zcmV-~1bh35P)Px%pioRyMU4RklmH2s00fx>1t=x~EGh^uD+0s-052>AEG!qp01qxL5|$7I(EtF~ z007tk0LKLq=>P%92or)GA)FWqwh<7P90t`20O|w+`v3y*03!VW0Q>+0ej+CH037`Q z1^)m5{{R600093027n_X{{RPpBqQqx1bZeX_XYr#B?#>d1%N6f#u*buL?2AfJP;OMkf3x2mL7k{we_WFCwN)4g53-vr7PFV+8&-0RJ}t^f)4eTP0#; zD1TigmQz)iR92H#R+v>+mR|vtSXh!_4S{4LWob#4Sy{$Z57bfsYi}IKRS@t;B-K*@ zYH|sdURIZ1S8i)wmT3xxh~8k36*pobfwh#c{7A&H29#(@%)id4jf6xV|Qn2lGTkt3OtE6<1k zmXTAKngGX)43?B)m!ANWp#hbfQu$#M2YU+zZ#;0M5b%70b)x>L;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_000McNliru z+5`d#GZHBK)Kvfg0bNN%K~y-)W0=6r%0?Vu;mlx&HBT%c3gr6f6*C04t=qC|J7KVE z%e>TT20QPPyzCqzK(?=GA%ljfl{#^Nogth-mP<-gk_ezG$;%kZprh+xte{F5D5#3_ z#4!X-+^}N#O2S~x@+pz64DF}x+`UHxxPR~JlEn-$vv=;>O%zy^*~OqHB zn4=if1mskSRUO8lBVd>8AHwSTSSJ*=~?p`N;hA=cJn%6 zaP#_+o|y~=)`9Mh?u3DdyNOsjCPx%>rhNoMF0T+00IC41px~L0|W;G1qcKO2?Y!f3l0zrGzSGU2MZ7q4@d+BJO~6r z1_?w50#O46MF<2I7!@`U6L16of&c)N00B1}8J_?Ep#TDI5EUpSBc%iYZxR+ICnP5( zDJUi?C?_Fl6%-~YB_}8*DJLr^DJN_f7Qg@mYZn_SDkyFl7b+|%&Hx0@00b*7DxVGt zEG;Xj3@hdmJw4()I_f(< zU}9gARaNCbJ?%X@=RiK@K|}9ALgPnDYi(+7aBZ<(U~h45a&&QWc6oJobi`+7-C<&X zfquobf%Yp&5Mbrn1QC8eW{^{rlY8%rJ|&!qpPK)<)AgEsivx^ ztf;D|t*V==sjc9oMX9T(tgE7|s;=RsMyjl--l#{dudJrBv*xN&)~{aRuSMFjTH>-+ z;Id=hv{vM^P};O<-?dk_xwhc3mAJaM>9^Sz_#YW!sN(|=*WTS!^Gyp%IV62+sDfB#K+~% zitx*ebI=+>m%*VWkC*5%r{>)WsL+@A8=u;|~h+TY^s;HK>0z~JKF z?c}xhapg?(8>*@dOv;6P0@a^*T z@9yvM?(p*O^YZEW^WFFJ@b~Qb_2&2X?eh8V{P^ka`~3R(@A&%n`}*+71HyB@&EtgO`^R z2JrImKo{~)uV&zpvGpJh1SM862ufOeU^>MKijje1dTzrWr)i3u=oONzd_v{Ow zh*16Q*`C&g$5!^wxJZ=h#~Y_DpT1`9)YHVM{_$|{vb9rIZC!Hu9j5Atwg+gc-(T6i zV%^p)C!V2+zq@gmA!-3;Jbb=(=k}AYnBr#`jPsf%^dNzbuJ*pp`nsBi-i{s=@s3IJ z<}t7f$*ZX#162i8Ek$W*WmHiW6*;rGG6oh#qJeQP0~^tb*}Mx#P|Y4#NQ&yJn4002ovPDHLkV1l7YZb<+D diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/cz.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/cz.png deleted file mode 100755 index 27ea03b71d09b242d68719cb444465a7419a4ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1231 zcmWlXe^AnQ7{{M4q45PFmz@X)=?u_SoE~tN)npk?&FCscE&H`B?U(7&Sx#)FtK_=1 zHoXScRSR9Bg*B0C9!raAO)(3(nbu}@wF%uBnkHYw&%V6wc|X7Io`0U_(X3mW%%pSa z0KiO5QEVWinACjQEYg3!Fu$1$Sn-DBL@@U7MgS<*b!#$`Fv=YOCjbF}Fqomh42BVa zAq?{cf(OIUY?z|ML=cR#z)ht(>GTUgonpg(9C#BL_$C})G8i`k0?@~pBZ}HAf@gGk z56*Zbh9`@lf9~808V%w2Bn|iB_%x3DSS$;bF~efrW3jA>V4>4dDi~QT`{!_*!5|`N zgTZqi1O=gNxN;D-=E6BXKP?}$g>bSE&U^`{PhqKS_Wh6$G;bbavjY z40<6ZHa2z$gBK9_H$?se5#%-{63GxmN~C_=0OJ5MnPd!@9{}D1V+vpb7#;wx->4!H z@Q=`?I&YnePt+uWX>Gk@?#>VR{ zEv>DsMk6wrOy;&WGs(@H7K^E)!(_gHzy0@VtJT`kfvi^a@S)RYv%9U!ZL$S>4;K ze;C!p7I*zzRgPD_SpHY+VLUs{_5PZ?%r`tDo$7q1KgYRieX9ubRQ+_})}ar9M~b`y ztP@3!;G{T_$P)kWR?A_68h*HRAA42p*Ohd(RN8uXxT^&}>h*?QmJQdgY|=5WjNbO} z?l^rkNB8h|X>t7WHCOlM<%tJpuFcV8GO3!uZNuq&O;cTb@hj!r4C!F^r>9p2y&AcdAqq`g{Eu()Jkn!PnCbjNL;{LqWDm%2<0|UigwCyS{sJ=hdbpo8FZZyHd9x z)Umj3rcEsFS0!I+4vp(Nu&1+O87SLo({?d#G?g{1$k|k#A+F!Y$xznsJ+Sc#WyRk0 zs&S5RiOCdfsCyXM(r}#SFsy#teN`>;h!u@2SxWk=q1x6MQRA(K=eo}12dZs}gDr*z zBVFETh$-2gl7B{K9{a<#S`!67Zcwk{m+cB2_nDS~@IAkYjpAehC)k!4xNrZdCAAaTyv zs!SMeI$m*^GUuSi{E4XrB8&q4ae$VCLkZWsuF**8Xquv^lQPW3L1>z;m17LUm>Ak*GL@@k zX0zF1*;JzvS*=!=4EdZuItU~!EzLzB#TF*S=M2UpHk+;1taCDyCr$x43PK);xFF&= zQ|Y(1FwQM>R2JK?l@2BGW;EDM6X9Wqpq3ZX@;oWZB|Qeoys#0!XHkYJ{2v3hLgS!| z0UaOod@x`U%CM)nBy1K(DG5+Guu}$eW%C_&Go;{Avlz@cY!*js#>Fh-YL+pQWrXcU z&)y_QW$Nh@7RO1eqbAi^V|CP8LoZ7lZ&(}NG@UuU9S(`%uw>(yN$P5rcd=}dcef~dTjV{h3U`~LuZ?hBk`G-`d9G3(H{kEjAasOEl5T=T zP8eZA1NSuWt2Q#79`V}N?q{w&$c)a=;M0Il2eZ0JAS3FhA)tYP4gz|ZV_;qb^E#N< zLr?=j!+OvJ3wj6{;7+zHT(5s9AL+1}Cd-IW6a z9#pc+uDn4#b_buOc8+{B-MT^`%z;`VYSjvlzphs zBo@h%j)>q|;6~%Ih6k#O$8~WFRAM_0DpS_|*fS~|~ts?i9_ed)s`>6x}~`wRNNd|{?>_;0^& fJ=^)2W6-OufA#0Hx&kk-H$?1tyL0<;4mke<%bbr% diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/dk.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/dk.png deleted file mode 100755 index 8e0c06b5a0749f5c31d55d0458c9bdbb0ab2d2f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1424 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/en.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/en.png deleted file mode 100755 index 77d931d015aa049686076f6ab47618cfc19a54f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1996 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 FV1gJ2kr@C0 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hr.png deleted file mode 100755 index e289da3c07e36ecaac776b9639e6bb80eef32700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1492 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 IM6N<$g7UA-t^fc4 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/it.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/it.png deleted file mode 100755 index 8fd621759c57ad0615c4b86088a7e69f0c7c23c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1244 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lv.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lv.png deleted file mode 100755 index 360b658a1e7a3309e066a5221d84747f0400ed97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819 zcmV-31I+x1P)Px$zfeq6MKucvKMe~&4GTmL3q=kLNDmB45Di!o4`LAxViONv6cAz*5n~h)Y7`N6 z7!-UN6lWqHXd)hq85D*a7l#}ciyIY)92bck7m6GgiyRk?92kxq7KU(A92b)v7nd9tm>d_K92b@!8lD{(mmeCK9~zk-8lfE*ogNvQ9~zw>8lfH; zogf>YAR3+^8=oK=pCB8cAR4G17@;5=s2>`lAsnM29Hb!|q#+!oAsnV59H$~2s3IJx zA|10J8K@&1sUsYEFf6$s8nhxCvLhX@BptaT9I7TEvLqg~Bp#A3D3UHJwIv?8B_Fya zAG;+VS3*IOGcKYuFrzduem*;-G%$ETJ*PA;e?L5YKs|pzJ%2zxe?dN~HZiO=GIB>o zus1WUI5V&~GlE4zu{kq?N=SoCNxVEay*xF+JvhWZIgeLWm0w(zUtE`8T$pEMsAXfe zXJdqaf3kCNqkMXXhK8h|pr)p#r>Lm8rKQWn#LLCS&(F`$(b3S-(%{(G0@ z=k)68^78We@$vfc@cQxb`ttGm^78Za^z-%g_xJbz`T73-{{R2~xTfIb00001VoOIv z0Eh)0NB{r;32;bRa{vGf6951U69E94oEQKA00(qQO+^RV1Of>)72w6@Z~y=R?MXyI zR5;6H2xVYqB@VDKr7$q^Nyy3(17yYc-5A)!jcn|Q0k+0ckqqpbj*c#_E`))Dk#IBv zm$jdljfojyV4^P)$H46v6lkTcMHpxrN+vLHI|TnHbR7SVN9#qCkHW z*d>$tx`+Yo4b=<+sd>4{;ZcM^M2vqH1Bbc0vyQwXVW6NU6gyj2=bb_!kJqAUOa002ovPDHLkV1gK4JAD8E diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/missing.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/missing.png deleted file mode 100755 index 3fbd23c5062ff14310affaa74148de728b42d24e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1600 zcmV-G2EX}Px%{ZLF)MF0T+009I50ssI51_1;B00jvL1PKBN3<(Ad3kMAY3JnDd4h9Vm2@eqv z4iXFz6A%#?6A={?6B`f}7Zem66%`y86(JZFA{!Yc92zGW94H$cBODzr9v&teA1WOl zFdrW$9v?6uAu=H%DIp>>B_b~)BsC}_HY6oBDkL{0CO0G~G$koCCn!25DmEx7J1rzbDlR%KEk7+THYYDXFE2qZF+MOcLoqQ#GBZ0cG(j>mMlCf(Gc-mo zHb*fvOf)q|H8w~#H%T-&MK?G=IyXf)I7>1*OF21AHab!{I!!w}PCPwDIzCH0Jy1P9 zQ940WJV01LK}kJ9SwTTmK0;bTLRCLQTSG)lK1EhQL|i{cSV2WyMMh3QM_EBgT0=)) zM@UdaNMJ=tVM$6-K}=&uOJqn)WlT*~Nlj)*Phm<aam-1TVsJ*Wqn{|ePLyCTV{S@Wq({~fMaHWUuT7B zW_4a^fnaEdWom3-YlC8Hh+S-nVQhq6ZHi=UieGMvV{V3JZHs4aj$v?(WpIdTaFAni zk7{v|WOI>abdqUwjb?R|ZFH1pc9d&&j&F9BX?T`ud6#i`m}`2NZhDe(d6{f`nR9xY zZG4(^dz*WFg>`(KZ+@I`f1P%Io^pYobbzIEf}nbVp>%_xc7msMgrawYsCI>;c!a5U zhNO6hrFw>|d5ETahpc*ur-6v6eTlAoi>i2xuz!oNdX2GwjIn%=vw)ATf{wF&khFf0 zwULjLf|0O=khXu4w}6wlgOLm!F@P8uKwSF>x!~ zt^WJ<^A{w!mlqk99D4KhCj$Kb-YLukRLsQ4$Rxe>?;j+o@9%FhEIIt<>vuT#{dc1@ z6CB8%{rwXm2U0zM_tQ_G;o!$hcaSn6D;*&q#UA_eD?;wm%PR~sHr;&*2d_VGl?AF2 zo%8KwCohnpaODd^^5vtm3{#h1zW)dYUOcJd2P#VX_VV4GSRjLU@7srP$%i)%F-%x+ z_68i>zg{EF&8@TX)zw?K8-c31mp;0QkUg`Tp=jLH_v}4-3<1twzH;TliDSnuED{8&7T$OPNp9athUV4{yZ0c#-d#Yjch8Xp zAm6f@Za#=4wPg-Nef5gXThPGf?TZaT0m;{~eH%h_+v+}s+Jf23R-k~DD_1V`1}WxF zUcVk$VqOPBX=e8>JR4b}zmB0WsiC_c6-;W-0V-zGX_}Wut)HA`76= zoDTW9sN&fvp$w@m(J81PJ>5}MR8%fF9bG)qpCQpYI3gSsM8zclL3AX#aF8oQjEPSW zI`DCGbMx{?7Y+8YVF=T8@j?YYzN&1ToC20U=;HP!3}G79_Nc(oO$y{oU1v0Lduv^W z096x9YgAw(2~w?PgDz~M!QdgIsfz|o#DTePx%wNOk{MI!?NBLo5^1Og@m0w)Cm01RIM4qpQgQ~(cMK?MQ;4_^QfV*n6j01##X z5NrVvVFnUR01<5g5@ZJxO#u>V0TW{Y5rF{|VgM3<026`-7E%BchX50Z3KmWP6N&&7 zfdCYXDHIa|6?_X9PEQI402PP;6^Q{BeGC{*1Q&4x7jj+*0t6UvGZhqD3j_igf&v+X z0vUz_8ioWKg##Lh1R95D3Il5i0%!^Y0~>_|8-!~L0t6h41RRY79FGJYiv%5v1Rah9 z9*+bbkOUr*Y7q&73zH1 ziJ>OL<|V6TO4Y;<^zczJ<# ze3FKGd47L{hJk{HhK7fShlq%Yhlz=ZiHV4ciinGgh>eYojf|3!jINE0oS&-0pq#F; zy|S{hv$M0awzjmpyTie{=e)Vc$H(fwyU57M$jZvd&Cc}6#m>^<_R7cj%E!>u+>s4~Cw&(xzr&KufNl7eiM_ zQffLeATuSc<^)JY=1nS(o)Gi*6_^TE?6M1ZF^_HSj_eDwOAC-;c}Pp|FU$gt_i z)!X;(5&<4w-n)Lts@`zu$}QqlU)r;dVcXfq&xiw$4s2&wv-|Y93+IUd7fPx%{ZLF)MF0Rq0RU0}1{x&*0{{VW00UqO0b~FLTn+$j00nIT2v{ow0s#s|0Sin3 z2y-b20|W_a1qg5s3P?o(0RRhk3JG!w3}gThWGM~@01$K*6d?}~VFVI)1Qcl#7a|f9 zT?iIr2^4u>2m=5bd<_|40~~)Z8XAQK0BsEb7aMsnA|#3p0ErC*f)N0d3<84@2z(R- zbruL{8V^Dw9S0Ms1-n=2u9H80g4060Tx)gKFNJvG)L6`M07IYyF1NMJ`uTRcg8oi!?D zMM0l7D|JCXnmH;yOp-`UfkaG=#xWk&Ef=aeF|s%*y*e+eK{QBJoODu7*f}CoR*cX* zGQC1E**hwSQAwFiLrz+vY*|)QTbEW`jNCpfky1$9J~GflE?QrNQD2~vR8QSNIbC6I zSze*kM>ow$I^0GzU}SyVM>^X_Kv-p`(oHyCWuky%U3q0dYa#1S9E!-e13bsZ)w|WV19#zdxxxyhlZkreY$>j(s^&Aj*I4f zbBd9^i;}>vkcsGocj$$FlbfT{je+cldgh9NkDtqyp39S?shpvsk)h3>qRXYHq|Tp~ zr>Ul+s?49O(#)ipsIIW4uD0%8B*4Wkj)6VeN)!E+R+2ZQ_+tc9T>;B!=`ry~<>-FjG z@aFIM_3h>G@caJm>Fx6M?DhTU`2Oko|Nr*y@%jJs`uzX-`0)My`Tzg^|NOAVGq?Z% z00Cl4M??UK1szBL000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igPz2{bv&2D{P# z00OK@L_t(I%VXH4CBY8?-27@@4pK}^OmYsUKn@nb%+PCGmKPHe6B83364SDARk695 zb@8etF(L6Ws31PxMM;<;!f0Z5c|mDuX?bSp>T8##*xI^Hxwx;gpu7|nl$WRIDlvrV zH#LNUfp_Sp$9LPrr4{<`odI&tfw#Aw21C4EN39(SRY| zcXnrDItW-L?*H*&0jHqkq7U~I6Vfq2qQ5RfTEN22>}Vh-+tc+hP_>|_%(AcdV?8kx zN2lBCFr+yHRfD-Ut_R?%bFr${Mpm5&SA8ef2D|D=%gJ?~HXvYSwHvDX+Z`J#8+71l zW3SGT<-2@BE*QAx9)X$tFyA#769nrpEZ%YB)^#wrdi~kIPfNk7KLa`F;Og~5s~NW3 z{POo76#V`74rKPycmJ?~zb{TR%vg8s{K=!oAmG%VLKzvw!o8=C!9) z;xsjtp+FObLIs+#LJa0yaVCNsoDjgmCj(R{!wKUf0}f7B1_pQe!azkC7*GV8B7+@> z@iG*ZY*^U?15=xwfa;x^XZBzNHQ~T8dH?Izub)8h>*v>BuNMeP$}D*O? z=mf)>E6?A)eFFlo-hPIL_m|&qUcJEpuWs*RsHoq(e%>4)m^W$qn&F+uoyD%v;wA+80T57>7GE4Zsocko(5g5z+%V% zm~xSXW9&k`EudiS)4SD-?CjMKE?8g#dWH;L20FU>AfT(RKke+nWF8^j ioa5W|A!4Y&Fbe?UT2NPAo?%`90000=%;061$;WV#fnhp7!)!i=8T<@0`5AhJnP&p+H07gb2e4QHCaUnUkUnCECg* z+N!5T8IFrHmFlRJ=&GC*XIP`ie^!!djgsI6Nv1nu440%B*Qp4tQxU!`$#@5ZnC?n4 z-Iru~AjNoFhWWM(%N-f!J2EVHWmq0bGu@M6xi7wj%d4c@_^3kNZm850$uUY)!8k%U?B7tnl@^Zl-+GLMb9La)FOaVq#Ke zW@c7)PEKy_mc;Pl;^NZM((>{OAgHXYtgWqWsHp#yQzX5``Z~wh~`W^^AfWW&?pFe&2^zrlOZ{NOs z|Ni~Qj~~B4;Pl*!&%@FS>>PITvVBlqua2hvd!(N z0Be$RvxHL;x7Vo-=GKio4=YW1dyh0MTlPw)?Zu^O-~5ss!o!R0oMS?-Z;?FGFmtn2 zmxNH3+Sxbin;LuXx zQ<6cim+Qwl@kHz@$zpY`NsTV&H(ZdPlx^5t?~+$m#U`j=tgbr4(d&X=lYaw;g36&o z2No=O_miT6|dMUX5O+E zVDnpdYY$IXRpY&DdM*s%{IOsnmeQA7)mVO98p`V R&I1f722WQ%mvv4FO#pT#hmrsQ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pt.png deleted file mode 100755 index 81131ca34c7daa57f8b567f0a6fc03e92260dfbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1490 zcmV;@1ugoCP)Px%{ZLF)MJ5LbF9``N3kVYx1OXcc1{(kX9RUj)2~G+PHyj>i5D^_HA59w?a}^VB z8Xbie7auev&;cZu6dI5h7h)tNiyIYbB`9qtC3Gh!G(HC33n1zUB?nLdlO!7$Nf-lB z2mn(6q9Gy86&`#oDY70Z;1DgeA0F8j7LO_`FGngSOD8}?Cvr72!66vHAs@0LKZY?f za5p%CGc$rV8NebcMn*2UB`2~cB_~lP${{31N)-iP2dOGDBUB~SASl%#94S*M7+E02 zCn7RYGpjEn#V07tcYz0kK z6viVY7cuxMB^(S%|A z)-NpHEh(WtFUT}3qdh=^OB|m-KjAPd);1ZkKPwV)4bC_uF=!c8TQC845>sCh#yTwk zdH~HiDy>2=9B>xFKNuixBp7r8tVAl7Odh959UO8X0Db^iV+$;8F1A5WQeRZWK2N?w zG7)y9k^~^ zdxbH#bsv*{GI5I;v3D_niypLebf1DMkck(Sh!-xRIH>q#d-H zo}jK8xSwpit(CQ~xXr7v#2><|>R(-QCwWV@6|d zXM}fPj$1$)e%0OmjUAgec61yMi&%edik%yN)qVZ>6DAeL)f^913EzIT-Yx*Y*|QEE zS(hbiJk3R=Zo#E%1$b3=m(73q?#?2qz}>n^=WbtlJ=-n7AD`;EFCHyxUw!7(memuh zYVYmEa0+Ue^zPdr)$;St=RaTd1(!d#7>OP%NUFR0r|#IfAY|M3zu*6UP4a#6>}HP} z9@TvfXFuGj+V=VTx9{&Osy5xa-{XeQB^^7j?^193@$dJ)FMdiZUfeImV|IW4oQ`NK z`{|$l{rdB9k@^0IYhCfU8yGpg8<*5>J^b|Tg_w*Ut}bN>KH%%w03h zWnQ@(-neX>arE))!#;ZU35!p^IkvJq(I0Pk_t(t5bbiUI8;jR(KQKEZCJldz1sY$o z@aTnC$7ZJcxCIbO-~HX){be2VSLONm2VhZ*VKy*7ba%)4ODCrJ<5%4c2Ed#K%$JEV zSV3Bv6GU}4RCRZM-{hv$#5AlRAkh-28m)wg^|o}y3Y;v>KqZ8{f{X$JNQw#x;{g18 sh72dY+#TV--BH`fzz8b<3df%S0I5v{J^4j&TmS$707*qoM6N<$f{FTCVgLXD diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ro.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ro.png deleted file mode 100755 index 8f2136362612001987655eaa969005d6871165fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmV;j1Wo&iP)Px%zEDh5MFs^MB>)2p1{VMXQw0hb00e6&1ON{T8Y~3^0|##c3r#5q11bpx1rA9@ z0s{^PfeQ$E6A%;!4@v+GfB+4F3J^>T4P_G#MgS3Q3lc{F5^e+(X%Z1)T?GIX5@QG! zWD*roE*1kB5_1<7U>Fr<5E*C@7kn5SOdb_>5*le97I13|02CW)6&i6B9Ay?7cpw;Z z9351K2LTu!XBixNA0R;*9dsibZXq3GhY12ABPt{tbs`>QAs=3N4*)AA3x5p-9Upcc zA9slh19=evA0cujAz>&bGl~raf)D^EB4RQr0V*JLA|iSxBV#fu11Kb9Gb;pQ9T+z) z046I@GAcPIEl!vd1}G|TvkV5I5(F$RN-ix=s}KP&E=Il!1THX4DlTl(2MD$i05CC5 zzzzj5GEcV?0Id}ZF*8ur3JJFp39S_qE;Lrb5e6|acQiFehanod6#>E%2Q4&zH8f~6 zGJm=k0(U4NYAY)+Hfh5Z2(cOtHZy_E69l^%12#8hvKtR=EhsrTOxF<$FgJrZIA=sS zPS_I+YB4BlF)7d(20}bWKRadG77o!G2uVCr+ZYeh90}bT1>71CNkCB49tuN2Wz`=G zMM7MeGA&U=TT@0|oi#62NMD&bFP1+CnmRCVNGw!NSXx_TabhsXR0DZvDSBxty;%%* zY%HTkL?=K%SV+&(H7k}Qz^YY?Dl3~HpsOp0 zkDiS_I+mj*JtIWs13=Et!gy)=ne(yR0Jbbt@DQU(eFzD#0wJg;+=`9r18{n!Zb(8~D`?dP&n^=Q@lN$fL3oq^=fv1l* zb#zRDfXS2dJQz~EYJK&soxng%c;0yw)lVJ*RYSp)DS4I*F$%`=GIC&`EXLZt@AB~@ z$Kl}g$z_p|>B(S_o*w1GFjG>LSBMu3#JQM5*X`Q61p&5iTVQ1A3Iw6kbwhV%ms&NGQa_j$GXq#mz;BQZgT&*xtgRzp$lmX z2>@I~ae`zl*_b@mIbmMsFTaTePMs`_0fU|P1^|CQDIq1+*Vot2&o3Y#fW>05*=(to zXOV}Kh6)f`QAY(09m=<^si8wH9e6z68BfA#ueIy>$Io~X&Tqw)Gh9l&$yE#j?9hDY z2@tJ;m>T%+8PL29^xNPEAJBh}!zEmiMFgG<=J|^hvPeW8iRd^k@+gEBe@+n< zSRE9Y7QI6m6$nY~R}t4v7U&SyK0oMUflw&C!EydM0Qe$FGeWw~-GC%0e_{hitmKHZ z5V4Y-c*HyL{E4XTl$5KRck5jDTy@=})AEBUdz&Dw6H@!blCrg7A&}N@LvWDZ3F%#< z+kv>xFo4y4mSGND3J-z(_aXg}jR&I~7~nx;M95<E zD-YnH`O=Pv;b5Te>lg_pSotIypEMLouzum}vA+Wj+2|RaaM?X@js#DGwQ{FcqqL-!b;wg;odFI1X8C7MW zsmwH$WwY8Uk>zhF7*Q&f0jd#}dW4n#gmrA}C`L{$r(i^_R_7NKM3oK|9y^XvSXfw8 zR8(ACTvV>BtgJj+Ti4Lgpw((GG?7|nY9kNTU2)|OkhZW#=QrrQ&3ZEfxC z?RW3q?e6aG>FF`{PWSiqnM}W!OeUjg-e_9rc(`!Kyx3{}fTHN|@bI%|&n6~*pTv0m zdUkU9BX6f?-cHTU&MnOTJwHGHVe$Ra($ezsvSZn?vby3}aX3~Tj(;8hYqnx?=HpLG z;)MdJT1$_^igR9Eni_!Y_E9*v*yxT8iTNUNEOC4d-Z{v52O6P>s{K z$2qN$1#e$CNqQd;_bzf;!@vG>mi(%BzLY}U_3~6=)AUoKdr0HG<*7GrjNW#6=mL-R z;@I4~f7F69@@MOFr87APdt_rOMsIaJ&*+{~KmKX=2@QCCvP7fYv8%&LXEh)lx%`T< zkV7sBxKRc3DDDDfH0ON@L6h}l?eoccLD@a#DG?#OF19qdR#4V3n&(HTyyC+PyI%!v z%;tDrD&MZO_&Ac{>C7-BL{{|9%=^IQM` diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/se.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/se.png deleted file mode 100755 index 5d416e8202308b49612a395a1f890684d74408e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1512 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/sk.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/sk.png deleted file mode 100755 index d6d212e53921317be35334ff0fa148bbe7207752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1397 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/yu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/yu.png deleted file mode 100755 index 00c28191f454439b53ef08995caf8a68e430d945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1478 zcmV;%1v&bOP)Px%{ZLF)MGysv01sn42m}EQlLQZq1QcQb6@)ur94HJj}6`ueXkN_Hl2^(Vr z8;wp95Nr(xK@?+B5>^osCs+(9iZ>=CL>+SwD4-H4 zlRP1GAuLy*4+fMJ2xB1}styQCC?}E_5>zQBa3UK}D<;$k07EBy^8g9I4-QZ!dc70` z%n$%PE`=L6lYAy2>j(s}84kG@3o$op;tmMT6$OJSAa5-_GdpP|Jd!;(joKCtH9%+P z7633lk6<`L<`)b+L1e5c4tF*%@D&y27#7|f1~x>GXF)&NBoEmo7lJ%Ai#jyDE+(cm zD3Uo$ZqILLuX|YiWm)`XU(9o8<85u$ zadOUce9d=ytbu=ti-_ZNZMKgp$%SC0j)laEbjFE*(THo}fq%1@FS?Ir|D2h&v9P?fht{dC!m+u%x3=Q0q{6*|xx2Xi zs-(-ke$cqM)V;dL#=XPH%kRCr`Ms;x%ar}Txz5bc_r$fo)6&q>*67Z~$=27>)X~=0 z!Q0!*+1uFM;MV5h-{R!q>Fen1>*C+<=*|EC|MK$n`1Jqx{r~;@{Qvv@|NO=fl(YZ< z00Cl4M??UK1szBL000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igPz2{RneL-|qw z00KfuL_t(I%VS8D(bCX@0}Tx%4l2;#XYyrGOOH;2gM_qfAjSdI1ymSRg3Zifz`)!+ z$K71d96L}I@nFylvVsC_!=TQk3m0{VSvgo?0|v?g3?>;4-e6$q-M{J4hwJa(?dtQh z^u`31RuI*$VBqAi`SP7-_n$qxyu;tr6$`LZ3S_WOv2=m}%aRQT4<0{waC-wx1Qlq5 zR98hLgF%F=Ytyu;^QO;h4RwVIp@67RvuFmFnvi%Ph)as~@+|7gaxLpB^7M*Lii^hp zAvTc=iaz2JARsA}x4d@aw#=1VYnN3ENlIV>QC>#|F=K8PZXn=dU-h!AcF&qEEyYjw zvvYA{02WS03kE4?9zGD@VBi0tLwCXHwO*NTF3EE6VFDgjTLvjR2%AOW)Ti_1eODHj z@BVbjh=q`9qf?(=O|05o+Wh$YO?w7{sxN$hyJYUgDHC4+RTDH@;l{TI^S3?OJsU_9 zbP0#xiQ8+Y%s;YZ%97g`ba1H_wqxT20cQ3!bC;~>S>Ll_#pKnp%n(6jz|F>J3yd9k zFp$&9udIxi@nB_4No9e)oIECw=5=GJIB*mUP9AEj%S}G_<3?y=UHi_HM=`L+{yZw}=DRj_qUE gw{PDuBEgxv0Cg0jQ_G8s!vFvP07*qoM6N<$g1m~W=>Px# diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-h.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-h.png deleted file mode 100755 index d6fcc7fbbd5cfeedd9359950dda3512044d14e78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0y~yU@`!*nK+n%WFeE-B_PF;?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP!U^zPl#(kN{zZp0)zOGwLlSZ vPZ!6Kid#tuGOUXmSPmF)xiM-oC>&rgoy=r7sr2C!pb`d8S3j3^P60cJ-PGq*&4&eH|GX)}JtE?Rp91OP07s zlmzFem6RtIr7}3CP1jTuF&YY8lbCSv}fS#F9$8@Au8``9J^fc(4Eayx*5|$k}0os=g`&K^y3f6gC7Y z41#+jm9-$NtCh}!i()8=MS`Haj}9p1&Op$bu|rIEs)~w=y1KfChK8o5rnZibjxJ1Z z6Jj%B3qoIii@t$AV1U>vXSmf6u??{uwgcFSFhcA?7$ZzfOiU4G2y?`bh}{Sa#2$nt zVlT`Jutw~I?FUc@Gy(&|0tXJ*062uLt?f?;I{UMe2_#YlgJ0jARm;Y9HfAtQ7BXjRgOlbAsi5nbVq>Bpu-rB3@17RMt5Q|oL~$l zjKyL(J3G6$xEump*{-gxY&P4?&CT82{V?F+dDz3t1Mq}-c=>pGd3yog2p>6LZ(li% zF9+f0$MHMj2ON>}hXo)4<&MIFV8OsKxey>UG&F<@3kwT7e*AcNcz8raM0jL$WMpJi zR8(|ybWBW4bSy76Ha0FUj>qH0$HylmBqSy#CIQJOU@80*fS=0e^HWn()6&xTf^>mE zkSaVW6bjSR)6e9d%{lw?*`~ zsA(%e;%l41OXYYvi>fSBT&JqDZz7GrgrK!VI)&uUotzzCaqAC+dgm>T8mm~#H^alr zW=G2#OGiwb;vz5Ro$0e2u8?`vYH4~K=QLDJc~xx8dbMo1)3bDOQ?e94i~gQDh?ayb zEf1!?URZrI_R+3-FfBz}Z$)yX>*dg?8=VuABlQ}|B3RqV?a9?kxx_>87ID6MtQqEnrD%=x4doI{E;i~SOf zp3HjY3>a3$=)U%jxk_J7}9f~HRP>XPHwiAu2HTL z{_WrhCjD1STLynkv;mG_r^V!U_za^eN_XO_l89%# zeX^#HX0(`nz_!+sxNE2u^ubeFy5fc0Ab1I1t9@c<*=D+povOg1O24$7Y#orHpaGkv z&BHuapozHd)h@W7Q<6VAh?6fWvd}rky)q7ROKtLHNQngFX7;P|EU zF#+E{`d+D|@W_dI@TT9}=nt5GrIv>VJFgcT%@AbT$%UH!XC7uXr7v>Kt!Qp}wfUgm z!#B7au?=E}l`MrjnO$UxFYbL(*AZ+igpVIT zgrNm-|GlsnArbHGzF6?76h88oEvJK2XdeY?JYmJ#3mox!iqD*sl_pe5_U+wZp|11n zEjFdSTC&jFnr}_`wlXf`wf~Up%YT=DdO5)E>m=sf3(V~J-PhIv!RmjsU31uuuxhEr bJxQPaCYsHbn&1+9@OwdYsxzgA9B}e~Y}~>~ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_next.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_next.png deleted file mode 100755 index 7b349de95697da769bf77763c36522ee79989b63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1746 zcmXBT4LDPK7y$5t5-Hk4WFpd}Lh3F=Gy7x{^A+Z!?`%GXu~fDpPjw56n_3Jl6n#)n zX{sruB_D;Arw>c%(!Fu3XQghdi@N{w-|u;!_nh^8t{bHpw#0+LIQHvC%*bDmpeUCYBuwu%S4;cy_#A zLVN<0n3#~bIT6^bw*|Eo+NQT1wF9*i*rk^Qa5$VKE-E=WIVB|}H8nLYEiILo!Q=7L z)6+9DGBPtWGx*tjK0hlfD?2+|AQ0@{y*no-XAiJ^qpx|&(@sZ+^;-jUdWyi{opC~^rl~z_uWi=JDstQ@Ptg1$Sx>jD_Ag^yc z4dP7WnX?UN&Ng1S*xY+HRr{TeyZ2Nbo!$33 zdsGiV^xp64?dh0@OKY99G^FlN1wb0cPeDns}g9E9^;o0^<;KDRBh@FifW?;e0 z(g2ZFF9O9m0!9dJj%Jqe+=WK-u56Ydh*1WEN{ZsX{`m4o{6ju6=M$^HLcO4mo1z#` zs53n)8P4)p7DLT?__Q|e(HcvPt&3%(s}6s#Y^q&5HrD@fwWoX_ca*r7=y3VnkXHL{ zCeNQJY8Uz+_^Dg%)H&ueO9|K{-T{AU&QV5BoB^f9r`LNLr~MGVWBK_6jAkK~ z8&ptLU(GRUmZ)*tRy0t$f}0(g?zlsh9bMl~WhcHR%()QQ5vD8slq@Ktp?4Yd&~}|T z>7lwI=ueTg9@kFTsQtYBoiKFrtvFoOK;8albne$@mM3gZSGSByzYt!jp7KA3jT)~S zjm4`qCLx-baMOn2Yc<-T+L%YPJRkS2cf)dd2O1pC`It2f->TA1jBujd7AaCN#l~@V zwaK_f_3=vG3tdT6y=_y%UC=+tPu}?#w`umbFB2Dw$b+lX9EkD?1xA*zleVL0q(}Gl z=yhL1=dZRujtU-Z<44FCYi}phwMeHQjeAR-Zxb1`PaN& ziqF0=ks0m#HpOgPfRj0pOsCrm*><%pUo2`@^bbAI3CzqXgYKCt;cE@f@8lMJjsJd% zSE#I;81<`!vq|1J_1Nm455l5pidyjP?~$p1RA&J*9V1KB^odw8@=&gCu7vX#t&&@9 zC5)E++KHv*^`>PVdAAYC$m0g1Iy7hkJQ_Hn74I@v}{G_3&V|r z7dO~}4Su5a7RcNjv15Y+Pqi`a@;^*!UDKmEs-};+sjC@8;)a_RV?)oEY+9#%*ghi? z&&)0H)Bfr*AJ6rIE9HSEYPvZWW#%aS(Vjo-jPSz#xHzEvLDD@I~ GYvKR;Z_-Qv diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_now.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_now.png deleted file mode 100755 index cec38f63bcf243bbb1fec8063294cafb308cd288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1683 zcmXBT4LDPK90%|tL|iYst;~=zMC69aOO0)|*~W%hUP5nV^D=MqKH}-Adqr|@BF*G2 z8!AN+x+zvzU7>Cf%DwX3UfsAADRKYj?DKq|-#O=h&hMP_d!BPn__4iow6Izb1nDs7 z6b=Nb41s+!O;u2JwQJ|WMvX^eks#>GfU|nR8wgtS%+H5Q)zs9~)z#J0(?g+9>(OZR z2G~Xe1O{P?VM?699L>!`(xP=uRYh5Mdr9 z5)lrW1S;8+L?)BSo@7uxl_;JR5E_L-rBIbH`uh3-{v3aQe-4Ke5D>uSa`ym%L3;v&1A!n|VDR3c;E-S-1hH2sG$d3h zEHn%e9v&9HFC5sXv>$c=aZu?HECLn@99D_~csyPd9~K=Q9TO818yg!J7Z)o?5C{bE z@$m@>35kh`2}#1Fq@?8JWT8-)l9G~|nwplDmJVcO!m>nJfGAre5@ly+=j7ywj^rIV zawI$VXl`z9US3{)LE(wQlZB^>i+?>`a;CK8Oj+4ENtw8^TwGBumWV4VtEy|N>ZDb5 zvTBeEvJ3Un3-z+5i*#9hymh0qtLs)zS9j0N+w$()J$HKLJ@*EB z?=DaHBuNXs>Zn5TCENG`Ff@S5Tv?;K_PMZFJ>n)gH9ea?wh}v-@qSnkFF5& zefL_k6wPrZ=H|7nh1VOSFwy2_4)*mNtx{X-<5rPV>5A>4wV$-^5-Kw^M&EpqIIiXn z2`iUgo^$meufFr854~CMp;Rk=t z%`yFBfmMv_{y7qONqyOa1&(Yor?~tkmNvMIST4HG9Pl!nCMr zB4+7)y%YbTLJM>{r7u$D>8GMZeP!G_R~(^0LThNWF&$Ks(U-n4M?&zWuJD^+cZq5Y zUtK*t+i7=Oi>lZuu;q!GPnXqMKNz60aev-2$URKnS z(hhCVc~~_7-{*F1?7WKgGrq(0V=$@7rCmSjc*RPyhh}W?hDmSWsbUOk?T3T6<*xeN zr{GQy@+7p^VLGb#EV=Jhf}Uk$HL5?1#KwJU7TaM3CFyZPTkWUuI~v!00JjrNU2N2$ zePH)`z!X}|M;j$$Yp%a*I$?>vpg*cdjgwz38yg#&o10r& zT3TCM+uGXN+uJ)jIyyT$ySux4dU|?$d;9wOCQO(xapJ_ulP6D^GG*GdY15}qpE+~p ztXZ?>%$YNH?p(vi6Tg9+UJ~RN%;50sMjD8dvzt)1Qc53>EalYaqsP|aG@p#5toZ$hSmw^xcZdb&iuYV zE4t!y{dujt@U1K?t3t9HVz(|@aW8`@thZ{(wAnt4t2?tb@5QWZxSA@Q9aB@^aCN&x z_LTkh4Ogw@Gat;?Kk(`$`>XV)%p0^e@0;|cjD1aB=Aw$Tc}@rNqK+4>zAU-HYVDk= z)5(kxveRu##oJ{zSn2F~b>^?!hEJdSZf%~+zNT#Rwzg;~2}a&MvPB9`E9}|Zcx?hy SGtUEE&EVg*cdj{TEqSYrg_G=gy6kznt@-OrL{p5#5*+w@>;xMe`FqX9 z)0_qST?8kXOC>spG+9b!SV`tu1CeyLo5)0Wkx9vL>4nJa0`PlBg3pY5H=O_FF8hEV_!=Kf%r45c;C`%Isg&2TslZ zc11>STEo?(8zGCWXEKIO&U2ocRnHLdb+xGIskLSaSGB~SJj*UUuxeWQ)Z#AH1FK#< mDY3cxuHow25*2}m@%9&Z{@3+gt!xCkn8DN4&t;ucLK6Uz4ydvK diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/clock.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/clock.png deleted file mode 100755 index 430bd0499ac4ad40bc698ce00e1552a559e79169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQaEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=?1^9%x{{R2q#>PfP|I{a-2xCc* zUoeBivm0qZj-{uIV@SoVq=W;E5`he6h8-Hp%3^^nD$Gsn#%z9pp#nLaf=wLn16?Nw onjR@&<+!%su-u6m3FVdQ&MBb@09s5quK)l5 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish.png deleted file mode 100755 index cde6be17641023ac0fe00f1dda73e75f3fc15a52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5974 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 Ef*ti-{Qv*} diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish_scan.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish_scan.png deleted file mode 100755 index f9cbeaa1c8ead9bfffbddcc0e492f58b6adc3fa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4574 zcmV<45h3o0P)Px%{ZLF)MWddb3LZM@dFbNk~acNJ&jkPE1ftPD@cuOixix zQczS?P)|`+S6Nh3R8~_}T3lFKS6^FMTU}aNUSM8eU1DEjWME!hVq{=qUt(loVP$A# zW@Kt*WM*h(XliF}X=rL}X=rV4ZEtLHZftCDb8m5Ocyn@db#iicd3Jbpba{Jzd3bkw zetLX)eSds}e|>#|gn)v7h=YQFg@=QMf`*8NjE9AUiHwMfhmVShhm4MjjERnmkdKX# zjgO3!kBy9xlaP{+l9Z8$tf!``r>v)`rlqQ^uc@f1tEj51 zsjaK8u&b)9uB)=GtFx}HuCT4Ou&=YQwYIUauCukVv#_(ZvbMCiy0x>swzamnwY|8v zyScr#yS}-*xWKx(y1co;yt}-!@j)5zrMf0zQ)18zr@DE#KFkJ!OF$M$i>OU z$HdIW#mC9U&dJBg%gD#f&&tfn(96lv%*)Ns%+t=z&(Y4+(9YM<(9zS-*wWF@)z{h6 z($m$_+SSw2*V@(B)Z5n7*4WkA*W29J)!o?E*xJ|L+1T9K-qzgS-P+&a+S%IN+1}gW z;oI8V-P+&W;o{ue+}_*T-{Rxl+~nTf-r(Kk;NRfl-{<1s;pE`yg(p@?dRs_>E`C^?&<63@apO6?CI_6@A2&F>+b69@9XsL?e6gH@A2;U@$m8U z@bdKW_Vf7j_44rc`1SYn`}Xwn`1|+y_W1kv_Wb_({Q3L+`uP6;{Qvv@|NJxhKqmkI z00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-jh1q3k3w#c*44Na7l7fqFhXc)6ecF3Rt-OFf_(Me_rMIuN5BL;zYlUeq%;f3Zh zlgsRL(=6~P1yL4Dgbwr0xi<+(3`hmyesj*bH-EUF`#a}%{{1dA+CP(e`v}~E=>rS> z!Zt8AHaUfpxO+2eaQ!1I>UmGc(q*{2jY8$SilNQv!y)few zkD$ShDPXi?NWNU$I+g6N_Y9~{^?JU;A3T~O!BgO1mn{=l{TVVcjQUVfuL{Q>0OsV> z$QEmIp`l?fH&{isi~dI>XF?l~rbra*c)^}nL!;L0kBu1(;m8;U-D111Qbg5Ymp zF-h>2fm?Zw-85k`EFcWXfZv;R>psd|I#*iE(%tj#$y6O9^z9rb~ddE7))Z#X7liUu+W5g{Qj7pxx{*=xE}V-4H}fO5Dly~n@#xF<1XF*yXw#q zxooCx*uSw<+hS%4YqpsBoz#2x#>WZqlDJ|KCto}4zx%k_mV}yNF*rWv)c9!gv88Y? zNO%Qx!LCpEp*m}sY*w?$X|2U# z?jLh&q;s*u)~ubK$Mhj9WM#t3c9ZvX0Eb4*RmqU;;#w?V_cS^-O3GfHyC^K!`Dg&w z8?02yDk=#a_3gGMFRqJfFFHUV?Za)>Hq>6x^`kx$kjdR|UCs=lFj)sjhQAsf9v=DX zs{!L;`qC_1GR(@EY&P3-ai!NaSJ&A*J<32@2`kxM%g~vDHYsH`S8mKvcv$0;|LtY;jz|KH%?-~f0H+1eKxrVky;24xku zZU#(cj*g=R$33`xcwcX~3bS}|U5#rtn<=gf4Y(Fd|Ih#sB-;tqye-Vi%Rch{L9vRT znMO>3sbo@dlv7wZ_dP-2gtFP{G0B^#WHy^!zD!~*q{X-ex7yvZ>G<>-~c~ zA#?vP4vbEWk5AZng`ATd_YbTDL1?S3nD<=Zaw<31*^gj7!1{ z?&$0{6(yy`2M?r>Z$ZZ!9wS8D(>xa#+;_%Cjp`cq`ElMf4Na zR_Qx_!9=fCrP69!b*{ZVkliZfxw%GT7iv^j^CA3}U2RM;eaTL)Q`X)(&OBXMa`fGF2F_qDu8nhxAhIx$6o@Dn8 zxaMQC3HBy}f_EzN7KQEU?NXIjc!t5Qe15&|`W1e&$qS2lH#FwO?}NRbv>5NIJ@Lj9 zsn_oqyY*KpD!rp`3UzI5tpEX7gQvM3XWn*$4Cb*ukOBIC>iDTo!q)5CJ9P?QEUiLb zU9Cp=jhNR&=*Q?e^||$hR`Sjhuo}JoPP44s7fTagkjdpLUL}f=)3AF5jrrV!$)lU~ z_L@M3YA%282@w>XPS;Rb>giHW3C_!8iZX5ug!yi{DUqigYUNE6_2w^s`EyTC7sU7K zki!dNYqeU?UCxyF`RWwE{0|7i6}FHDW6lLUMj20*kY%b--%yetV1}Nqp6;$5s9wG7 zHwg=1tLy8v$|BAQzh83rQfaxEt#EJiok)!ATvU}Cuxm=Sk~}vU{@m5o-PPRnJ z)|(5&ZLZg85mw$j+g8@`Ga^YTm#Z->D7EsovmO3q1nPoCce|=Ed0wodPSbGy{j7OC zAg_Qg5DM}oH|Gl_xvRlQo*CWhLaVv+a%DAYjo{b&GUmOn>?6mDiqCMEvJMpW6J%++ z3HMKAB;J6Mr=7-5kc^#ojP2FjJ@Z@@QLAfDrKK#?zYiTb#{Hy-dHnMZ)V1lS0Pw6v zE^jipVr%4w9qnKiBh{&&my0Ns)yMWE?^)2@8AsS0&hc!1BV`vE>~}tF=s;S4L!oo( zM4ixfJ;_a(539=G{busQy?fvO92UDE_pr1D?Qqv8e7w@pfvORt(UXh*cW3(@J=7h2 zyIytTEx!>th2nBfQqt}x4Wen8hnY;)2Or690a6DA?;x>g$BicH9jUgCW_gwNj=mLe zL2kWT;P2X%G8u9(F)``MQ&nna_L00JS#0I)HW#3+gGwmc)<%8+GB`uz(n`u+9Y~6g z6a54*5ahyvgv8euF-0b&WE{#q{6QvHeG6W^4Hg~b@ir87XuC~v&sVhSNVV#kk&ogZ zyVm(XR7x{;CL}CsNsy4dk8$YGyYKR9Ah->pC^?z8Z;_?GO(T`mJGnZYw&L(>J{Kx1 zEw2=($Hy-=@Djf}eLsVd!Qg9dkx*#eZMSX#-Gs%h+W^-L1Pfh*BrDeYG6j;-@{*Le zor@1E?RY&kBO~)|#u?4cTY%$aL6HZ5Yk|2%+pKk~mbWk3J8UGDlocg!+wmR3SzERz zq@?frk5tB4bxX_5n;^G%s;LR)CT#;)k%3%a506*a-aWKHD3%oN+7|bn;%G0$#wVwy zrKK>6)s0O~3{)efrpAVb#zsw@hcx9Mc(vovb3zGw*Q?vVV*rmHvm zPasz)6fnC~&Q6Y+TRs#OeR^Q?%P~(Gqzw&=+`MCF{Eo!T6BkLc(j~cEhR9@>WtT2p zx-0`i5PoLdCU+%sPoB(t`Nim`jt+-}ZlZ6A+wtmasfSOO$w}f>5?X~+AuvIaXX4yl zE_1^^=5jcD=}|8&B`zHt8WFu^%a+*JGxJXWz7jG%tEw!osJL*k;vy(3fG$*)mrGbF zn>UbuuqymRPT}!i(f^gcv%fljAyPDsmQa`_^$L?RJ^EdIR+97N}MM}D+5{;yuW<_AH+q0fhfMMS@r_*PoR0Y+99BO^U|XKYk>82rT>4SlsWcWk$Jg)Q%Y zS*!-=wL$AcLO`dEjE;RZZs(4;*qE2YH_$V=m;cyWt5-{rx;uCOmb3i-&+`3MkiB-@ zx}f#JAwLS;5E{I0ZOBg|x9r-RU3i9fLU^gJyMFHrEAbCJwCA2%wd%R&R9I*qV^KKlg-K)}Yw6k+x!j;C1W45W4N>aO3&C)j{F$X^cFM_=+fQ1+kQ}Sf4WA zPL8Km>Z`+cGjh45g)z_5R-F4GS9mNX!8PZGr{#W{{V$=kl~*2zFa9tw&b4HY$jI0b z5&$fXS;#Lb$%y-@d$JA*rUgVN`2rz3A!a)*z$z99OZaxsJ-t8wKeOrdn-Reto&W#<07*qo IM6N<$f*F}SX#fBK diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Chlist_title.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Chlist_title.png deleted file mode 100755 index 8ad2570cc8928fd16743b673c5a687542daa6ed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^YCx>S!3-o>ilVzfRJxFFscDFp=ub#-;g$;s8#)ipIW2?+^3Jw4gk*)cIOZEbCpm6gTC z#YII$<>loS6&0nWrDHr(@Ni-T7T*8{9l*m-;34zb>i2) z`FyMLzPg9aD1PSYduiv-BV12k|5~u*a*kelm{4`WrH`q4>mwTF!>7(TogMaKQT{oJ zZ%fL;y5}r;sFVS!3-o>ilVzfRJx%}q^B9UUEo zg@xVS-PP6A)2C0btE+2hXlQI~tgNhTZ*MOuDypxq&&kQj&(EJZb7o#%USD6|)TvWb zQ&Z>6nUj{5mX(!NTU*=K*4EnET3lTG|Nnmtjb-6Li{wj!{DOg8Jb>Y>WSIa11EZ^_ zi(^Q|tvOe279CdLVGU5+HtVRxxiIAq|LfB}UNY$vp7XLcX@+qGM{nXEjSV+<#_Zz1 z@!f#ucaDYE&i@x5&Pd$9?cs#G|3vStV!tNq@ZNmMqIVI#e>bk$wXwM+qJGV#Z|`Qr zny5KdziC^(X3dwqXBY4q-OD)9pSg5Syo5tjU++N`mW7N zMQ&RPwd9kYgsi-)ZfDA{LoqN>ed3`b7lPiJIG*(BDfBw+H~aH6L#5qDX89+0Hk6*Y zbV}$PSBdb~W05hEddnSM{A)fZ%n{t5&MWR!x%s$T$nwkEOr_1VmLA)#V>n-{_VLNb zhg{a~Z4-0z;ds5M*eXJ9OY=6K^K-VHnf}=6jF0FvDfR~?oz)T+1&v{5L7HCJyV{Mjlphnjn9Th&cL8&VDNPHb6Mw<&;$Vc C5)W4Z diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_folder.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_folder.png deleted file mode 100755 index 82dae56af6bcb88b6a037ada0430e3ddb4327c51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeV{wqX6T`Z5GB1IgT>(BJu8B`K z>gww1>FMd~>l+#x8W|ZG8ylOLn3$THnwgoIo10r&T3T6ISzBA%*x1uIyyNyIXgSMxVX5wy1Kc!xx2f2czAevdU|ODR z$v~tv@hGF;F&DbLWJ;-haz$`Qk16S6mOjTKE0l zl7)E^yUKDVb*c%cq^)M_UB0b%?L@mP3mUx|4L;iRCuH{sNXMKQ4-@(b{BuVbi{QDc65}`tkLeu&a|~>hpxV|A0PV@O1TaS?83{1OQL4xN`si diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_noreplay.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_noreplay.png deleted file mode 100755 index 54ec7c01d1051323894159252f7888ba931a0fa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)i!3-pq%)8qIq!^2X+?^QKos)S9FdgVi-ncNz|dr0EFVxP+SA1`MB{vNf`nbeMBbUlkDOs* zU6YgZCP&7|!7xoNaDs@rzPvpP2L~4?_s7o+Pc3$~I0PkKGTJ1dpuS!~RdL;-a|aYO v7x5SdF*Bx!hMFoQNt_D^x-230kdxu#I(CKyPuCs-TEpP!>gTe~DWM4fv?h7{ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_player.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_player.png deleted file mode 100755 index dac8ff3e2c14901da40d19e8627235d08db7c801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3908 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt_off.png deleted file mode 100755 index 7d429d981f4e18e82e1c4cedbe82ac1254263ff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 820 zcmW-fv1(Ld5QWcXO|m9NK`nyB2e7djSz8k~WEW!$F^!!V7)U21rIl6m4My?|scbFn z23sYSAP7Fi_|5&{-pkyXIdjgL|I^{Y-p1O4HAx$b`Rs`AI?tWSnD_FZ?@N3}XGeQG zy85y8Pg=S-+&|u}K3Nr2US(D4D6=vuz0xYx$;gVR@CvI?*Ls#mxtCkHy4A8Q%Dl|V z1X3wWQSy?N2*3s!ESjlS&*>AHo@trtu|yFWo?#hk79>5=J>AmPq^Pw>^E68n9BEBO z%2SqNDy#v6G%TS-j=^994HnI6K^=2E!XniA7)#_HZsBUVupnt3W?@1-q^J#f$U?}& z4`|Yj9q5My3SkWxq+v-ZJQxf%&|s;Z>ohUP+|@>+kFi8%Zo*gO!h)pBT=T1%&9I-KsL?2^`jO#MohL$@ln2q*6 zhb1+s!S`P8U}bY0-05u(f}8T7p_f0hAS3(wECkey*M`Uhb}5-&h&lpT63k-R9TkVzzxe`FS#V lu9aKU@p!yFef;g~$ymQ1JvrSv{qU3;Ep`uPS37S%{s)G5W_bVr diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby.png deleted file mode 100755 index 403b34a2eafc93b1cc4844a6c7aa506cfb003376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1587 zcmb7@F^J?;7{{}B>OIeQI_L^PB21Cufv-rh#S>D*<1PDE;}X^fMo1B4kboluF2xin zf&`3^B1MoO!1#6rO&yR+V{3hM_iFW>k7 z<@^3G@IE*8cJADM?Y1BYcXk=wZ}vBu^%A(*Jm3EMo9~)!YkcyDWWYFdTVt;KxCj zg~_BY{3M&69z;=AB;#3KX6d9{9ZzfkJU2)@I}H8PWfeG_AjAn-9i<1!F!u+xp%YO| zZ6hW<6~NPzSw1b*t*tD}kIJab+>^pvKFmzew+N*WivR>%uST09l!%DV9#v@?q><|m z?HFMLD$#%$SaBVXLD`r4coR8{5+sI}5r?TmNvQ$c9$az(ltg49jDYA;N`M@2k~nP8 zhcgLK8D~RdWNRLfO-z_bBd3mfnavCYOsEM=wW<-1Z>v0iSC-rn@L5mP9ijl5)lwgD&JwCHlW$H0s-5em|>Z%A3BeYR?<^40Q4;>MR2)1a)=se z8kNXVl}AyG<;Hn0HOPoTgOb$3i!vYQvAc;9Q?KU9{NaKSl~LxX{ZylcD<9WYVymv) zI3OO;(j+bN1ggx|K){%ckf%Twk*Td7R7E)rY->;-FDwy-gI;}7FMK*yu`Y?0$?I$o zZE4(Kmfn}-Ud$z47s%!r}Gff3nT+>%`$<)AtJ4Ja-PQ`1X;*8tRz5d)E_Y1VtIO9?_u+rC4fRBur`e0KmwlUw zYxewQ?cu!sl;5?p3+d8ts|J4H*Ui=U<#>3nM%MBB28r| z5yBcYixGlE2{K|H1{@^RQAP|nNT5q85_FJ7hB6N;jIzQ$RP2L4#hQIM-{G8>@0^FT zt!=C>o;Y=awshaM`k~!*-O%q;nKLUqyWQ!!k?%!*kOpzT%Dp%p z?CpeMn#a9iRisJ3nD6#209?n9T`LH@y;<4+X-bgZ(l|{3LXojuj!SK`CrA z4NH#gGAMdt3pbI?C_#K+YEh8bloSfUhs6a4K!Hal!U*sVr38q+PGXz2TW}}%}nt{z1_&!9cW^tyqHi6??C!;C1m z@9gHjIjsgm6Pkozo)1;Ur353ifBV3arGd*lx!FdVpa8o~ndL^%>vqpl86VatJ`WH$3u#e`BZ8re+3NFbPq zP_nRCmSulfj(scBS%)m=JwIW5KkI8E>FFT#&A1_@0I17Cg5Yd6v5D*}3Khtt%)&6j zVx7E^Xr#-aMoD7gagp`1$Z4Y3P|Hy~x;Z99W|Y}-D^Y0fh`Uu8Te2h835ZLSBu?@y zhBC7h;4>y7W0OZgyHQQ6u}6C{Rt4TP^eSzK%ZjcsQ*8-i zBho2>B+wf=5-`(tLL;}d0KzULBUi6>hW*41H5IgQ1)B8=Pz_>o+|in)*I)eTa2W39 z#(7TpZTjk=cx8Q+a^ZcCv0B{kunU(t?&L#FCD~KX`AEdjdTF?Y*lP_m|GT{r!WT=+isfTU&4a^8U)XN7i4vcOWlay0rbt zpUIWeUmbg6@%m)*(WUh(H=caw=?hK#%$w()`uXKwKmYeC`$GHs;djq}`Pm>oePHsJ^Wg@aIk(lWoXzunJN@E|Y;L17TOS(c*2pjW cI^Vy6k%1?kxmEqK8ZXE;Pgg&ebxsLQ05)S;+5i9m diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format.png deleted file mode 100755 index 5d2c39a7550b263a83625f7ef529aaec538ed6a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmW-fJ!@295QS$=bWLJZk|04MSgMsc*h&l=b{92-n8F3YU}PEz2nqfG(?qd|3c~nN zXlW6!(=J$8$Y5h5!NNjB3;%!?<1_b#doOcm=FB-~-usIS-SN@mqarfi?{${=&hQ*L zIK+GR(Tyj3TI);QIobI<^IK%!*5c*m`K%L}o@tqyDHTOzc!p(YhE&oc-P0{y)1_)H z(mc)5G)<~iBh^zaRZ|6|lt}RuOVJbpuz?1PW~!y;)bR+5&uszoj*UCD?M84>ZZy>L8(O8HnFKUgYzgzw z#Hg_c6MJ<*HrD;whG*DFk2x4HnH*OUkJsKAld5D&2s4Ph#*0fRIwp+%0tU;_;n%~FCY=9s&>OX*`Qk(ryiNy&u; zNi|n>71TqDS{HLs7v$jwH0j0;^g{xLum%j$u%r|o3Mx#V~JEv z1z(X13z8;kf{!?j0q~+6qfv{M_yJA2u>(#BMj@;LgEXDcf(L`a23l%GRZW_hBWw&K z(Z^UK<+?Ptq2x9TW}~&wW=Tb=@x9jDSXmq!cWT>>;G*1UsO2}bNsz=a%+`GL&-Ap|#dGmIbpW~bTo89q)(Zj8o zGY>!fyTq@{{m#{u+3#x;dn2>2ICCb8=_w_2}CBxpVEWPxjkCPCUIk{b}{= o#l085w%+Mc@9sSMJT%9UD5mJbRkOrpMh|A;Q!b2#wfa=7OcR0=m2FBbrA%9!Xx z(S5~TC$Seb%H&}d%^_PBCj;8dp^g<_#k@f$SL>3rS-QfEJPl--+QS+@Wo|~cCQ*}- zS$x8xk&4hvLTs{pN+z2GM#*8)O1>p+q=l>}2Y_ef4d4#>kPHUO$s^=hvW;vINnk&a zMLr@Q17pAtX(VgOH$W9xO7;K=z;&Pt(390<0T~8#kaIv0*-E}76~HZW7qAa#5Mk0x zJ|Qc~M&K22m)r^Tk?%wWJ^=H88hB3b2Aat!po}z$XUodI0H1+RfG{~J2tvrgD`HQ? z>Jn8+V*FnNL)FX>KxbvNEV*dBq(+f95bP>fRt8-@`K@<(V)2KcvrhQ!aICs02ri%0fp4Afjv{0Y-Ia2xGU|Xt(QR9ErDwlY*{#l6ZYy4Snm+W#W zN)lwOQ$^UeM8qrvtck?vXcY-Fw45hK27lEjy-tYdtSo n27Va}YnptPMnira@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%6$SW&xbEJ)d)l;Vmo8nJK7IPc zi4(iKyC+PTP+3{o+uPgO+1cLSURqk(*w{E}(xkSwwz|5y=H}*xhKBzB{+5=O*4Eap zuCC(Z;_~wHzP`TN+S-nej*^m+DO09Qo;-Qx%$c)i&z?1FR&{lCQ&ZE788g0q{rdm^ z|6h-yzXEMnD+%%o2671lhUHa_dw@FbdAc};RNShWbb8xi1rAryD;YtTOlr4R#Vh{* z-_5$&>T?;t&4aRoE}QF)t$F>_a!Y0075?k*w)>XL9x4BRIDYowy~6wFAG?w^=i8(5 zz5Tg0`-Sb7MrRazPyVrZ{#<6UZ4A%19XtC^C(%eyqQxo^#5V}@0w!$CF6t6uilmbSrd3FuK%3|rOwb_M2OB#Z z`@zOWf>;XHKEU{!`@y}JxifR-oHO6s?fKU7(!C`~%d_cZhwlo{&1;u=|K5A~fY0b? zXKO>}-&g-imrk~y?rv6}tcohHvMP0ySs9gHX_e|^WJOeXg;l6)J`o)H0j0;^g{xLum%j$u%r|o3s;_>X+=HkVbh0&c`AJ)J9@~ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt_off.png deleted file mode 100755 index 8267f55674dc17ad3c3acb9165722fed99744d59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 824 zcmW-fziJg>5XH~+PZDE-m^4A6DEb02*lW1q=Awz0m?Bz>~!ljX&0i;|Y7TjO26D?C>g&htLoe|?kB=wNrU zp_3o$|D%B!qO9c5NVrB_;|IvH6J6<%Q#>RQk8DED$JSGQW0MVXgb znLsLKDN0_l5&_sigGDpd>N$NP(=#noJ(egU!!s;H&4Q#yx~E&ZniRDbX`W_jf+MY| zNO{UqOocUIkcK6+$T1jfpuwV9EvRFTM_7bfA7hE!!!2Ab7ZxPV!z@gwhZMCT4_OF# z_yJA2u><{(Kq0IFgETBDg$IMd1{y52bDbvUn7i6Y^f8vm%uV=;Tv(8FnF}9r8Ux@( zIYy%vEAa!GbYlmc5R5`t0|se2p#={HgAKHLMO{srm?JiZk?3PAk#Svy+t6}{1+&rK z=dh$EHTd4^9jt7QgFC(LL2y$ZH1zTZTCHH11TjzsLP*LPWyr$?(RI%{lCBY zte-wg|GB$-^5NH4>NMTl8J}!CfA=5PqH22p diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_view.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_view.png deleted file mode 100755 index 988b41965878506d7f5dc46624e187c77a3f9f86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)g!3-qr`RC69QjEnx?oJHr&dIz4a*P9fLR^6~ z5Ug%wI6jSGV=Kdjd2F{=@b2tpc)nTW;6#R#(-}VQk-WZ$;qNh-|Hox6&Sm&{NXE6H z*8!-9u_VYZn8D%MjWiG^$=lt9p@UV{1IXbl@Q5sCVBi)8VMc~ob0mO*>?NMQuIx7% znRu<$I$r;O1r*xo>Eak7ak+KE#YwFSJkGZl91U{(_dh$o>SAGeyqU5<(VGB)pYaZ! zp?_FY?|a|Q|GVTU&#DD?7&eQ`u``B0<#}w+Bi7ll?y*u#!3CL*sfLqpY})Kq&~ABh zP4%@Fsg&1ypL<=4lu>>wW_4_f;j!Kfmgh4=mtP9-^^L3?Lh%`R;V zi@c+7qk=O%;`ZImE3Aw8;yPL0@hdv7{Uf)Qz2f1w7v>YbdTpQggjwPptCEe(VmYAW O89ZJ6T-G@yGywogo{gFS diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icons_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icons_off.png deleted file mode 100755 index 8cc9d2a4d3d9a6d9855de1f0ab657ca3463550ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^DL~B6!3-o-`DgtHQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%u?6^qxaw(Z0-2v*DQf^Jrjj7P z;QtIyw;Ol?d3ByHjv*Dd?o4^ebwGim<^8??OWDum`I2jhyk>%q)E+jcW`ow4^b&#PZ`M|Gh#GCFwCmJKJ-P1hT?G*id#4Vz z3puQlZnCC_KU67b7Zs4bu!(E;sr>7gtZ#C4#{H4EJK@~G$Z(s9>4)-p#X_J<7(8A5 KT-G@yGywqCv0L{5 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_error.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_error.png deleted file mode 100755 index e1a6defec5b5898342166c40b00c8e700aee894d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1663 zcmV-_27vjAP)Px%{ZLF)MQH#4CjkIE002b+0XhW$N(BI500BM<2TTV7S_1_^3j$;T06Pr@Tm%4X z00Kx02xJ2Wa{vHt0swUY19t!bQ49%R2n&7y0f7JjfB*w|0|0Rb0a^_Si2wqF0tSr$ z0E_?xTn_?j3JhZn2!sRxa|r{J004~w1(g5-V-63P0RW!>0Cfxnp#TD+00V9h2!0C$ zW)Tu-5(SY50Gb5=s{jCp3JPKs3atPEt^fjY5(K3K0Hgy1auWr%004>&1h@bIYZeK) z0043n44nx8uml5a7Z!sO2*UsX!T<%a1^~MQ0eck}cNhu90SL_i1F{JPh!+fy6$zLV z28kF3(gOh800YMc3BC#gsSgmU5DB3Y6Uhhxh#48?005a473cr}=>P$u6bI4Gc2L|c{4&Vs@jUOVH9uL7157rI}pdJmf8V1%56YL2Dn;{C< z5do_n3*inD&J_=TDkh5!x05#~Ta39tG|Y2GJP@iYzJR77MW@ z5U?a2sV5qfEiS?$63ZYC<`@>|84bcC8Q&fU=NcY`Ha6-W1ji^H$te$^GB)fX2HGYN z>>&~1BO{MFJMJR~zb!KDBNOE&4Z1Ke?IauSB^2H(6Wl5&@Fo@LDG;_bHSZ@K-z*%( zGBDUL8ND<(<|-}dD@OVcFcsu7Anh<6?Jy+FIXmw% z9|A&iiTdW1*VNS16^7_5D&kUP zUfMll*``H6uxv(Sd59HORib%Qmu&(oTC`~T^m+4Jih}GhRT;G}MkoS-c@r8_g3(nu zcQ1n~0;`$_#FN`vGNMpbIl@(e6#>EY=H|(5sSzluWZE}x+qC1%<%>HO%>$Y=@8IQ= zE9NyfH@BsRBPrugU%X@6j>|8ac3l1V56qBuss^db?u8i^xcVSa*^ZU{VD4S8Sqv-!PFWyjZ4;r&WRkWYJa};L zj_p%A5x!#Ka7hK**}DNMqFi$Tq-^irl~X#QRzQR}c=b}V z%3@+7oE-AE9D|7IG(uG!zWL@8M99WFEY&~8!`msqGIGIbh?qg+-n|f2AOFHEO|7g9 z_j7WvG_{Ui0~K;_oVQ}diiImKy!ngpLVj&N&?r+qllY@h5&MWXV6>Dhy#E8tWnu+W zmJR`y*1B58xmRF11FAvMvhX&S=T+7vZw~2s<`Ynh*|2EHYy+% zv!sTGtfbGWM{s4SKvi+osg__>P96>>!VCGfr3Cpj*S|(izF}!;$#HQx zIiY@@pup1Al2?%w=HnKd^!77KW=QUB%gV{g@^AvGvIcq(XdfS&%k(uK_PBlrPe!NeqqV>r_b(RQtW35GD}h}cG`6; zMnS-hTh~tPS~YjU@;#Rxe)#ztcbW9y$+H(PUcdeP?dKpUMFHv_O#&{Iz90Yq002ov JPDHLkV1j1gmMj1O diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_info.png deleted file mode 100755 index 96f4d94c13468f58ad364796343245ebfcdeaa17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1409 zcmWktdoY$!W0!mKVoFv`Nr z{BFk*vykE52*WAE!`w`8upw+Ay|?!@4E_CYKM z|DPOIc+tZ=?Lrn$4)JqhFK4p-U4mA4bANU{x?;>xHZ>~Ta}CEQlDl$UbXZ;#b?fh3 z-qu;UJ6v;iEX>~R79YDRE7rX}7INb~bB-^~Ji$#)+}9irjR}x-YHdRzd^iUBILJA@ zw;>gV4ub9o=#Rp{3FtiucpUnY;aR#rkp#`z69!T(&|D@1roiB-QA24kkPf;Gz%;w8af00JQ(4DE(b7++?NM~xqv*1_ACtL0cO(%@u#LUx5@x(J$5kYA+`mte3I41BY9L_VmlkM1dRG+hDZbw=$Ual}=S-DKc3 zvQ_|c!Bl1W__j)C;|&YEM%Uc}EQdiM8E?U-+rD^f>XYh2C<0Xt6|2B_8wP4XeRq`X zp5;h2wAF^AXu7m^5^)Dm7>qSQ+#@Oea>JTggLTkUm#KWRtrmO9sBP#+Gr!yJ^^J zqiz!cKRT zM3}xZ)sk%d>_hxJ9oyGx+HqIv#@(9(G`o` zJMr5-lx`uUyN%NQDBDW(q?x2Vjr0-9a|uO(Nl`MQC`V->p}ee9)}gx8q!yy)3Tkc= zy%nau8bW*5sI4RV>rJ|6sC#YFzs8}Cf~Y&WKVITsMEGi0-Xq@rBW(U9BoNZ6Q`qJ( zdLKJF4#3*>2S`v{LN}MRgP|*fXc7vQ;=w3mF1v2t41@;ya~HkbvWcGkwRL6}*XEk0 zwd~kX1}C1-iZLTr;1MtWvU*AO`c8dZ@0a={Bm#Ju!Ef!EN{^^*lZTeklJ|aj zl=NL^pr+rCpK;?>O^nD7NDE5e(}P6GMYZ0Q&$x%b`p|_F$*#6VR@6kmhv9e6HK`CWUJ45WXQ}yLjPj@l6W1F=j(l zbf;J>{@^`6x~=~_r|L-KI%+8^wlixFQy|!>SewbIu_G6}61a+rU1;3KGDq9|qN1Y0 zHRAa;S7H~^4?651``3=)INnUKo8auy(^F8rGPztqO%21+sw$Z*YF94HYo6%j$y|Y; zT6i{X^n}PuOwKpCOeT}dd;L~B2(m(6zHVq}pXcoCJhQyI%vLD08pY!A+}+(PDk`Rg z{jl=44#F~~^( diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_question.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_question.png deleted file mode 100755 index 9517b861749488802691af4229821d30ca37f498..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1668 zcmV-~27CF5P)Px%{ZLF)MPF|G932}UBPAp#Di|z3BP}>8D?KGGJs>YWDJ?`CGC(9UQY1A$A~i`G zHeV?~ORv$csAv=*EJc}nhcriUwCN|DFKu0Sx z_8L6WD>dgZKx`g5`6@_OGed78LAfVMVLU`tBR%XUNpmerSusgtJ41s(Lw-3r_8dj} zFF^S+O>#6$cP~WTMNLySRAM$$b1_wUI!5;_O8GcdbR1CoEl|lfS8z63Z8A^hMp$Dz zSB^hbnm<{8LrnHfSZ_LAf=gASH(+=>Qu!@b`$k%gL0)|?ThlOD?o3nmC|~3a+(^6Z+Nn*82Wu8rFeN|fbKw`DJPNL3qw#bErvj`%!e^R&o4Kc+gvP-AjRzPJ6~lfu3V>`B`=OMSJ{Ec=}y; z{7r?TNrKF0b^TU^qFR0BXL<5)cKBC*`b~lSV0`*bhstVt`(1(JQ-$7ZhMQM}>Q;s1 zPlobRjih#hr(1*hT8yMmi0yHOsAYlpc76C(jlNNkvTuO-Ta3zZf%;#D{8fqkT#&S4 ziuqcWtZa$;T9Vd%h5B2M{ZW$sRF&Rkjs04jxLupRXp;JfiTPKU{d$i3Tb#^cmi%s) z&|aR$jF0(lnfqg)*Jq-+WS#bRm-}X%{ePAFW1sL|p#Ec|=y{y^W~an*pZbxP`G%pm zYoq;Rrv8MT{EVCYW~%3Gr}}BC?rE*oZL0QXuH zuKaPd@}i~uoTvS3x#4uQ`G>Clb-VJWto(Ak|B|!*biVG1yyBC$`*gwne82s8!tr&+ z=zhfec*y>d!u@^9^MT6ynZ){f&i#4O_>9Z_p2+Zp()*Rp`hV8`sLk-L+WcRptI7ZX z00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-jh1q3b;+mS*U0008>Nklo_8P7 z!MhuKR-&llu-p0c4G{ePcc#$P)N$IYA0I&6r`L9(s8U~a|M~OhZ-4wXWrTp}H*bIf z&+lK{kED#Z;PPW2c>7b15e9r8gTdv?$Kk42EY@DV0|Z}-f%2^8?$#i6OF<%cu3o(g zS0%Q*xHvB?1{n#~|SBIjAab zr>Wb)ppl=0-FWKuv#;HN%8Vgm+Yg_GD&q^Dw*d_1)n#Q>&O7{iKFDoRhff_oe0bNc z!>6FigyUweK!9B@z^cT{_5r~zAUF(FCYCw@0aiSj4OW#gV=EA>U%!6qz7r5-(h03_ zuzc%XkSf)*DL^%=R;^mGV%5HV5M>hKB~Z}TKjBanP?b{p^i?3ReEFRI<%gh_O8MnM zKy_Px|0W-xvdEt0Ah4jnzpZTnOqrx@Y&;0$wY0TO?04p5XUhaCS+JmgVq05vHC!2k zntxzeSXfGRbxX^{BS&^DsHq33nb_7+U7laQ<~&@PgSWSLNM3nuOH2DL4Gj(P-iZ?@ zwzt%l=f|hi9)T+pHLFYQFFcBcr;yTFM(H^(_P%R*@THsjnZh@a8it**+vDz*1RAUf$49 z9!LaqoqmR+sHp%N6X5FV>J?J4?(~CaxXYxzh3nR>+qU=g%?E>^6a@gy&a2+bI@Y`Z O0000+E*bv6<+x$uD=7xNwMD;Q&K|9z%WJ;cuNlV;DSL{an^LB{Ts5mpwQJ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_error.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_error.png deleted file mode 100755 index 4f33190e453c35354de713971873ffa816f4b509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1322 zcmV+_1=aeAP)Px%d{9hOMLq>?asvZ%0|R{n1AYSofdd1A0|SEt1BC+vh64kN0|Sf$1C9d&j{^gc z0|Rsn43Y!{lmrBo1O%4^1epW`odg7)1O%T11fT>2br2Au1O%f51f&E6r33_O6cnZe z1gHcAj|&T_1O%!C1giuDtONvr5D={d1g-=Gei0F`1O$H(5rYsAfDsX~1O$N*5wZjX zvjhaU1O&JQ1c?z5z6Axq1qHzc1;Yge#03R>85zk11)UQUmK7CkAtA976S)x)wG$Jz z6BDZz7PA%>wiXt@6cl+UC$$$Bg(fD-6&0s7HJ&{^cS}orOiYAIO1?Wgeoak(PEN8x zL4r?Dx-dwY9-dU~~NY<_!te0+R;eSLm@et&;|fPjF4f`WsCgM@^Hg@uKNhK7fShlq%X ziHV7dii)3wg^P=ejEszpjg60wkCBm)mX?;7n3$QFnX8qRnwpxMo12`RoSmJWyPBG& zprECpp`xOqqobpwq@=!`oxh%*rlzLBp`pT|p~Iu2s;a8Qq@=5>tHh0d!JMQvg8b*k%9#00Cl4M??UK1szBL z000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igP$1TF=^OO|8+00J6GL_t(2&tqV~ z57N@oGY}v>EpsAFB0VdwsHg-6ii+~G(pw=?nMKu2cD|j>P|#W^ms*m!3@lU9*yYZ| z7&~bK1T;u8@#mBlfTRj)C-}2)a4;uModg7vTQu1@S*>~sP6MS%Tc@q|5fUb~Ic|R)`~^ zLx)#F)n&)VneAYy(&pX?Qx+eI(vlb9RTPv`cipybW?yqDNUEf+y|-`DqC-)7%Cgc* zTCUsHPVZ~4D>(&nVRdtRd*{T32Lp_ajf@?(teM)`-dtS(lFF-WY;A3ApE%pY)WXu- zxN1gwYina=9!M&yw6?LavANtv&)nMD(pV;@y|J;jH0vZdoGNQ;>xxZ84a~fvEsbS) zLz-(Vi!x6Dr80`js%s1N1!N7~_8f~dRu gz}X9zFEfx009fDTcu|Y^bN~PV07*qoM6N<$g4UEcq5uE@ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_off.png deleted file mode 100755 index 8f215c7191560385350f7eeb461ce264d3ae5229..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 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 FV1g<{V@Lo1 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_wb_buttons.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_wb_buttons.png deleted file mode 100755 index bfa1e6102fc6701c6e6ce2f111db551c6ecef8d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534 zcmeAS@N?(olHy`uVBq!ia0vp^iXb)z8<14*VpjrEoCO|{#S9GG!XV7ZFl&wkP>?0v z(btiIVPjv-@4(4GzCyA`kS_y6l_~>6Lo)-z&;LOBB?CjL0RzLU1O^7H84L{K`IF+0 zx-l>?_ISEDhE&{23b8%+;r}*OW@To<2O0soJ-NM0*r!`?R8&^}RZr1#VAxntu+jKM zT*{C7$p7k&?FCF%l@9nfJyJMu@ZiA>rLV*0q*YZ{8#Ay7aI5RH&qyxofBau_X@7<6 zA@{H8>C&aP(X&dI{-l^s4Y zFdjK{>S&YFi%-74{>!af9wB?EciFTF791NkZ#Ler;lXrv4h6BaGBqB~@B26XFE_G3 zR=^=Gw)Mvm$A+0RXEt_n?zeGZFf=q^6xJ7e^DmxFIn!l^1^X=biG7J~o>a&QRs!^boFyt=akR{0H;mJ6951J diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/plugin.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/plugin.png deleted file mode 100755 index f75cde0ba2eb20675dedf9dfbc5859df78666599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1778 zcmbu9={FmQ8pab5LX$Qz#$J<>*1m)ywI`^hs9kVqaPvRh_nhbbo#&kA!~1@D^6(zcFj*B@0001Ub#e3( zGh8ff2uQr`8av{|kc_}y#R32wFD$_MLa|p)bP7oHCf`g`>Vyk0GBQ$CRYjpt2!vc^Wu>jHEt}0QE-q%VSadr5Q;)D&YN!DRspVx@UJ-jgga z&J4KG3)~+CZf|c7l>?9Xgu_W-{Bvd-2I6}(eheV-w-@`<+|*wy=_lmg zZKPjRot0I>{=c(PQ|Dfguf@xi4vw5UiCbBfQBr?KFF+?w#G+hxi5H6Vv~7b;N$RuK zvz!F!FrO~tp8s;Qci^yk?HQM35EUX3iH?71QeY*ZMGfia_fG{z7X(3v%#k2?wl5ux z9-}lfQ^Q7PG%Ps%+tGD$S5ytlTY1q?srwf8{4Fd*zmgR9Llsx#LXXenI+)_j#VXPUqI-W;zy+_|4{z zm<{c5+%L9sQVywI0fsgF3NvUMF%37mqca0NYF#uogvb#-<8(X}whOqq^FQzfnQx4_ z<^pvl$_?2v{cCcdgisJqJbN}=MU+}a{;|^4nDBz8R4`A3+>PD!xY^sJ&-PySKt4d zk+BiXs1hv?mVU^@1o3>ls?j7pBLe~IQmtSn&xRJ*bwwwm;(~QAr(dJEmCc8F7Fzeo zFC%qB*43W;Z1PkxThF9Z@qx$nusU=*0=ziE{PQdLnNroe4=nfY@vGnUxo;>vZhHWM z4?lf%#J`ce#2Dl>Bbs*E1orx%WMHgEc1ezP!8~4@lTf1}K{XE5y1Vpw6G?AeAqK+( z{ns3QuEWqL=YP#(pk$KXLTVoCQ%wjjyX3aMyZgE?x*65Suj(@iVqBv&^Kr^qOnaR` zhEpU1f)nCSnVLs*?yXDq?8Wu&h8CW2EGw0bG;P$F&By3u8@prDiX;hZ3a;^PfP;UZ zg;!cC2lo+kG9fkjmhICHJzed$13F?#Afzf3QH}ym(p2wX7gA=ne&Whh&TiXf9Caft zo?O29dr0HQ-ejjZH5ypo0fEB1l|3VL+B_fd?$lda&e;~&P2SvUVBDD)MxOR-4SaQ< z!Uoyes&OdkuHzSBoRCbVGZ@U&j=U5xyCGx4bhU+9HhBx#ota-hI=#1f>k+$tH=wb; zFx_^fgotO6n6#z^%MEAp-k5Wk66-ewPKMv-LrQb7Y@}Ix?q-GJE2F|JBrI58vSi5f`}yeC5JOs+uECc}sdqy<9@wj0BgVzoF-Gr` z<(#Ud2)!4$qKc=d1vHm=5EtM3AEUY33pHbzpQAb!4MS^_umO@0Ml;ssO@<{u`!$Ft z)`Z=d$d#FX2-R@hkCSr60wpmuIC#k?3~{W1FMtm5Bkt;bG)$~)oi zXn`=%zMMyenKgM=^AEa5ScxEq1#rk3VEN7v`+P?3S>*+4jginrZLXm}(LB){0c5tG zOU6cj0K#RYcCgP^cyjhBXUDWYMOi*wDN+OoKf#63=9hw*u$I2jYV&`XMeRwwlJFMI zTns)BO4g#RGhd-(;K`TIu!dz2N=oy8erhj!Z8dB#aqB9Lg*%Wyc0(apNy6y8vs+Qv z*dJZ@j@rx8z6fJE@Rd+70%}c%JFb;tU4Agq%mO)x-t@gsnO{YU?02${Nf3e=JpS>j z#(1qbr*Jb@oyJqT_g3_r Ij{7m|e~=Sc#Q*>R diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/rass_logo.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/rass_logo.png deleted file mode 100755 index c0a16cfb764448c72ef1413e09fd9b9cc15de4d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1121 zcmeAS@N?(olHy`uVBq!ia0vp^MnEje!3-pgJ$!kA6id3JuOkD)`V;1?T`z%r$r9Iy zlHmNblJdl&R0hYC{G?O`&)mfH)S%SFl*+=BsWuD@j3og+A+G=b{|Bn)d-m+pr%!L+zJ2-fF9CFW0YM@8smPdGqGgt5-`&Np0W0{m-922?+@v9v%k{9C+~H zK~+_ixw-j;3l{_g1h~1m<>locKYlDGCZ?dEz{|_a!NFl@XgFuioCOOOoI7{U)YR0{ z((=xoJ9qEi&CJZq%gdWQd2(7>T6uZ7m6g@|_wP$eNv=+1^%3B7*(ddie33l}a_R8%~F{=AHg3@a;ZP*4yX8=Ibpa277)-6L|I(Y5r;uunKYs#c_XK6#8 zw)nYkPp7CT@+vM)opRCWl!or=3ws-SQDeKmDU&9vPY-h36cJaOsy7M~LJdb!%^9`)s}XFhOg3b8b1`mt{m zFSv7O<}cSLbBz0#`%Y|#49i^bbSsZY;1ju;Xr@`;!W$SFE{HKkGrnr!113KPPgg&e IbxsLQ0OadSApigX diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/record.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/record.png deleted file mode 100755 index f71ca5c9de1498b4a5603603b19786f174a429ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQaEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=?1^9%xUSnbcGB=*QD+Z*PN`m}? z|1&(@Zr}yvd3m}xhE&{IbJ38GL4m{h;`zV&xd{%pOQv-0kyz=`nlxL_ahqO~R@&kn zTlMZ`OHJH)SvhjwBL1rWDnD-d`7^~Qg@>m~UMiPiWMf#ikl~a=WP~-)R0dC1KbLh* G2~7a2YeZ)N diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/redx.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/redx.png deleted file mode 100755 index 246f6bae09530e0a41cb2bae76684a90682b7585..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 710 zcmW+yYe-XZ9KH7cUFN+ujO}XXBQ?#mu3%!QyFxx@PJCcGs!@$?K2n#s(hmkH>U?dK zhGc4(+O)E1lh$xIhGm+T=_2TX1b!%Wz8WEcQfPGT!#U@7&W8iPqsz)n;gjAZhGG0v zi8z~6&t148j(-(*5uCV`Wv3)!ruV+9+?|q@E=``_8N7;68A3%oUL`_R2-R?w$E!t1 zi;$Wm>k(=|NRLoCLEJ#78KD-0ZXr}j5Ul{!1aTXn4M0l})g;*tP(zZnB-sgY51_@> zwHu%Zpcg<-k_Lc2fPR4M?(Po&9s&#iJO(fV3<3-RJOMBP3D3+qegu)q$Y77gj zqiG#Y>uI`$rhCJ~2O}a3QBiFo(L{9g2*Zpq%s9hLGR$mT+$WJ}N+z3-%WW#v8@2kg z(YRnXJ1mxEi^ajRD=fRlvI{ob&(YD%m6a{0^S9Ia$LZYO*yw9+|G#f}c4iJ1@0cst z9b1)_BF361{bZTiW8(>A9ED} z2Q-0Y9m>5yA*cM=P=6s)_s#y!ZvXD);o(?R<}^lV`}68!w#U*>SB1%J6-}CgfjdU8 zBa#c!_=K5Qeu4Z<$Nh#F>q%{0Z)^AY$nnh~O;Uy|;o5PJ$}KAIY<|7Zdf`B^k3qj@ zGHKRspY_Z6FuJHL%2k&fyctrgyj)URsy2C6A2QOHR7)QDYE$4!OYqSkgL192TUcZY znsM^>w|PnsO36c8X3A~>yMuw4xDl!dKB{5i|xVeOKH7tz>jk$9*M;< kh4}c~6+-e?KOGS3?Xp#QxR6}hImW$>r6y;JO^J%ye_bE+LI3~& diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-c.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-c.png deleted file mode 100755 index ca0c45d495f1c0e52af0f79438e53fc7c13fdb7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2454 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-t.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-t.png deleted file mode 100755 index 19a80c5b83758b5ec7269341efbbc4aa6ab634be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1471 zcmchW`#aMM0LH&Fx0uSvZDi4n7K=yba@H_s_#S% zV!~NuYXAVD@XiGL{r&yj-CbE(*}c8J<>h546bgYrN=izGhljVfx0jZd+}zwYH#fJo zwsv-Qs8p)HzCNGNXEK@U>guOYpVraQDK9S%4h{|r3qzq$xw*NOm6eN&iw+JB0|Nu5 zrlwp{&CbrQudi2ES5Hk% zak<>g%*@r*)#>T!nwpx8jSV9sBQzQ<5C}LN4vj`5lgT3^Bb}X{LZOgCq1f5krKF_v z_4T#3wt9PecXxM}mX;0<4k8eU`uh4GKYq;5&wu>*(cIj;u&}VVxA)zyZDT+>EoHjWy45Ty2e6i(a`E2e?y5n2F5w^}*^E4Luj(bdNGGRO5Eq9s2*u^xx!#J@bd;;RZQ zednq#Do`A5wsE!aHme=t%N=YO=CfZQNId&xIa^8eEY3F*h*v(;uef+TK^RRzs2?w= zM?-x5<@-rqw5K;s9!4LiKz1lxA9=Yqc3%LENCch)J^LW{=Rb(JO^p9g3qY*`cxlJP za5?;8t~0CI_$wA%p>+da)~TSF?@m?J#pGnqbf-7Q2jIkd&W}M?eTjy)j>U7oco)rc z6Q9zD@4={*O?*$Yf!wPW$Ci`hzXFky&~Iw&f>(W$38U{#o_8h1{$4##za2cyei-2& zvmnY^QruYB$@8dO1Rrj1Z8(*92ktDT(Mv1RhJ8Aik%l#s1y03yITk}JD&h?+RrRIr znlyDz<=tdicc?zjHpGIE;qbP3x)z&Y?orwh;3{=D9AMnKP*67`SPLi@D)+y_V=nPn zl`xrH7*kihIV!1u!_C1^^$%v3oh8vRtLd&h2Sk0DJoJTA=78EmP#H?M#{ErCtS7X& z%}S;wC^b;i|MmqDh#n|8bXI4<>xH9e;!sXvNSC%0Q}Ny$QW%nK!4=@%p2uxmn9>6? zt#D7*c_PqPQ!f6q;E1v%O-^2^X>X_=H99@jK5f?el8|>M!rc((BCs}H`i7wtn~R_b zqCZ-XYR_Hs4N*yb{g<_SzKb3fL^^K+`|M$Nc~DO{k?w~D2raYPN6`%I(5MmXdxVLv z>vc_`SJept(ZK8gm0KEamhomXgnh!t_z^h8_HO|lQI%@7t6Fs|3t|xTk8J1@>rXjq zO5r3V29Dqqe^&{1dv?P10S4VE2x)C*kkIH3OThxxDWpxONE_=*YASnG z002-k{{>|W0E!^|p7oU?e8*FTM({())5OXI0E(DMluD%^KYpyMtGjXIhFmVk;cx^3fzRg;4Gj$p41gfm z+uPgH(lR(W*wxj=JNx?jI2=w-PtT`MpSWCZcXxM3M@MUGYkPZpTU#5O&6Y?c zVzGE?YU=gt*Xil$larG&nQVG`dUkepW@d&&A|)p$XJ%$*Wo2b#WW0R&^2?VmL?SUI zB_%B_EjBjx#fukladEY^wXa^iN=;2oOiT<94^K!)h>wp?N=llWn+pvMjgF3f{``4F zL_|xEVlM_5mJziS+XNk&6|#|4cHkX9ckg4#vxwVwSc1MD#^T~Tz|dyREIczz{G9z_uB*sP@O z3kcNkG{g%eo-t#+cxMMd{(UB!%hLSs298MMcIH~_z{d=PIS2=HDgm1jrBUWyCepI3`s%J5*MUXquM{m6$rIu6pwBgTf0nNps+d z^Gi$OnBNc$OLOAZ^GhFgC2p@1iGvGltO>|e^aPK}?eA@|Kar7CZ25RmMn&tL)5B3# z08F^Ek>NO-YN&o`lg+a_{sU29Od4IaIf7p-3ujVi?Kr)?k6bks;@qjD5C0nH&VYg}+j^8UIeP4Z8cQgDRRU`{NlwRAp$%v!OzKAB^6BeQ*S=Y~r}} z?jwG^aNFFcu57_Tl!us$5;67BH8<5VF+uR;ifSl<8Q_iY_<2vVUc@8Ar^8q3FzH0( z<<>>ZTdHo$`=v&*8-T@3YE!gHJ~B@3alh{?=>|+QEQvQcaejpPhAJ)dzP53=YX<9+ zXb35%gy69Mo3nq?Ou$p_Tg2GfzZf&152O&sp&vcH;k`8oV4Ovc?=8cldmf+_E&L$n znzLlehpL*_GqDGrC7h3laAt?HHU|q35m2ax*x;!6lU8V`DGF{!{Lw6_>!f4Wmn` z{{(k>UzN8$1nnzDSOm^i{U^95B)NybYkNdl6~@@B%6A>}hfo!B7?e8M@1&Da0@c@_S7XE%WR*W|R~|H{n3nz7?xqcbbXZ%y52KbzRBqdRB%}uXn<( zQfN=f?EbCJH%<*}p9XY~`Dw33t+Tak4rXh9@?=H{PxKG*^9rYlI}WBnvw%fE=J>ke zscqW6cp6LdHb@h>=b6z40+n=qpzL)ndvGUB;nZW1ZTXmuqQnG307;@8m+<7@#CSc0 ziQX9${Ah!&q#IhpP!o_;PUIho*6$e($fOh~uBUUs%Ia`3f}KR89|4HSy)Nh$aAeXD(tb(=0aCOf7$JE@{M z`wsZ#$=l2aZOZP6GPy^Ng;8P1Cugh5f4=)mHCNmux6!}sP1S*<*v0P}rp79t3mXCj zJdtu7N9Sx9eIq;YF{c%A(J?4jZ_d*bibo%6_l)a?zE#>TkX`?dF*U#7Y>vt*T@9*>bMx=e4Ju=12{>DloM;MK)qG-T|lS)^a=ZM%r3WO$~}PW zD&B>;ew9|Z73jRLR;YvmLmbrsa{JkeBT^^Q#3YQxi*5dh1)mD*Y>&bRq17Q27#V46 z0IREhS9<{3AFhe_(hp1HfuIiQF+k>@)4*Ix4F5^u16U6K1l6-eATc}AI#3I5Uh+u2 zpk9ojex_v;Y1{DM3nbYe8(`P-x6|_s2N5;frS}rg3f_teOb>))Yj`%E!;`uE5`)9; zGksQ|=SShD#$V_oH~=185Hkk1)YbpJl;hnlWF3#`2N@|_jqR#)Z=nM#H*aeXlKcn- zS6+OdP!~1XxRj^X)}n=W{)Xf(szcF2AovZkokasWfDVly?hOi a03?kep+oz(;NhPJz}(atRd~VW&wl|qww2}p diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_EPG_title.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_EPG_title.png deleted file mode 100755 index f7a7736cb5a0a4213ea88c413f3362ea774ddf4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 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 A6951J diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Info.png deleted file mode 100755 index 3727f0b60e4f0e00e7d6e26f119053eb1d84912f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2874 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Plugin.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Plugin.png deleted file mode 100755 index e40aec19d949ecde61b731143ae190d2f717080a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3059 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 IM6N<$f_LTwnE(I) diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Subtitles.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Subtitles.png deleted file mode 100755 index a9071bbb5ad40f9f1532e0d0b0018b56c0e1aed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3171 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 Qn*aa+07*qoM6N<$g301`H~;_u diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_MENU.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_MENU.png deleted file mode 100755 index b46b985477f93fef6affa639695b1c2a669c18bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3443 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 VWYXkZYDxeA002ovPDHLkV1g`-o~8f* diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Media.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Media.png deleted file mode 100755 index 2370e1ec06ad374fb2950904afcfcb9c2d173835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1325 zcmV+|1=9M7P)czDFb#Gam>US3{eVq%Jli;RqnT3T9(iHWDDr=+B$ z+1c6Y>FJr7naRn?qN1Xdl$5ixvzwcnx3{;zz`&`gsl2?r%gf7seSN#TyLWeYZ*Xv1 zTU%sgWI#YbSy@?MUter%Yd=3fZ*OmKZ*OU7X>f0FVPRo(b8}~BXLxsbfPjBjSXh02 zetUd;adB~MY-??9ZEkIDi;Ih0U0q#WTyJo1S65eme}8jxb98icUtnN&cXnJ{TWf4< zaBy#9V`EcOQ&dz`R8v!jhla$%!+?K)baZuXZEa|1XKik7dwY9nYHGv7!_UvpgM)*G zg@uNOhKGlT(9qD$&CSfr%x7>4{r~_2Gf6~2RCwBq)ctSTMi{{H=WJiWp(Mc};l(D@ zK(I{;4I^76JX57aos?eNgE|@9q{h;AL(iPwZg-*YSVt zAH2q97WR7Yo;`cVx>1?`YzhC%EZk>$3#H8WSNE1&Ww3!ejAtQ!p_R6mcoNvamrQAH zbZ*(@oh9WIHV|ZDvDnL(vDoOc-bsAAB+S@>u1X7{IcDWhtsJf2#snL zpN1ev)2ZlS1CN=@IoK1ssbY~Th7_2Q422epP7WK0F#X>Epx^IXBB^`5t~AJZm}Jr% zNUqoG*x0}>b9Q#tzhJ&~h&~<@nshX+sc9`INy&Jet6>8hOk%E`$_<*qpggek(2Q;m z?RI;QjiG>ltbj><8&4qC@|KEWj%R%@<;Qn+X{!}K~Dc^ z@8pSP={eF3hto-H;E=IGp<(LBi}zclq3H7w*KUTakY$CMX}9b1Wh>agLuNSC^?3N+ zHn+3QMIwaOeoqaNR-+^m$>ypSjF1b>db2+g)$rRuNh^;VV+c6U1_Hn7Pw z#k4=Nacw|5qOR-Brsh=W&l?++=h(pKjA)x%g&QtSo@y;Iu@>HfS*ar0proyLbDn$)9Hlw;q`<`uz^R++pZ)?{Qa3; zl!eLsgZno+18e}Vg4%Pbp{mY@O}-?nQH9DTDR15&6q|Wy29&6}KBEc-HA#T_j}{&@ z=HV7otGH5QR;sF?1c*$ehV5UV0>uUnm~^L0rK*5OUr;31%nu|%&GVS?RBg!Ez-uO5 ztFY2gs#V1ZxN@>W0@dicYRImlu16IU8^GHwUF-ZH6N;yw5;K{7BU3~8ch5;|;A%zi jVMXxwis1c<{t;jRnl5?1l?z}Y00000NkvXXu0mjfCk=?? diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Plugin.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Plugin.png deleted file mode 100755 index 46d5c37974847efff7f75f5790a8e8f65a079989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1290 zcmV+l1@-!gP)Ssva*4Jfyl_nZEbC+sHm^6ucM=*VPRpVrKNs;e#XYe)6>&xYHHZn*kxs9mX?-| zj*gg^n0$PEl$4Z+h=@&1O-V^fdU|?{jEr`6cHZ9JwY9aYtE)XdJw-)DQc_aO%gd6I zl2%q$)z#Iou&`cUUgYHDa&mGlEi80&bX;6q)YQ~?cz9Y`T7-mzR8&;q;o(9;LW+ut zkdTmASXgjya5XhG(b3Vu!os+?xVyW%#l^*-prD(Zo7~*or>Cd4x3|Q^#JRb-yu7@? zz`%lnf`5O1eSLjzaBy8-UT9}%S65e5Q&VSWXMcZwcXxNr&dzyxd0kyyetms&b946g z_El9?etvy=dU;-5UU71AU|(NjV`II&zE@aSSXWnHUtgD(muP5ceSUsFKR;MlS6f?K znVFeyZ*Pf-iAzgMOiW9AdwYwEi**A9RL6W5J^NqRCwBq)csf5W)#5j3m7HK2q6R^pdcDc zc~L|*P}`z?Sxsyyrlgd;V7I^=AdO_M%S37a_1!0ym>+g__#A$?mwZpo2@fZ5Gbi{w zC-`Sh@MTW0j(DEG_)olTKpI#;zW>LQW){jav-|%22S%3dIk+-&AtUR1qR!(`+z;kqZD*rBy->$59Re?E`--&!GB>XiFx4zxvH0OBy&t9VxQt5KEFt-LFct&yofPNN;a^<7l>}v=yFh ze$(u~CJltp&u@kv|5x2Y`;W9m&(@Q*bfHHYh@ihpR;pDS=5k7nN{!k@DVAEU*}~^m zN$ZgYHjsu_rXF7|cj;lyqxF6zTK>*s3*o9aNCV%a3|`qeJl@-jAIfWHQR}BI{?Ha$ zGy9zeX@I<3^nN;aJJ?C3;)CN+si6Pej`0IqDE6j6H%J3FzyHA)vV z9j$Jb_i|_tpQX@gkOr>j1h;d7$(&$1r+)<)07VXh>Z~9Fc>n+a07*qoM6N<$g7c<{9 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Pluginall.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Pluginall.png deleted file mode 100755 index 6d74bd558a46ae67d19f293f1daee326c62cda7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 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 i6Sj*h~@!hU{!*4EZ_b#;7ve5|ajO-)URh=||c z-$6k^RaI6-Mn=fU$f~NUwY9a{+S<0Zww9KbNJ&VpuC9xVi)m?T=H}*|ot>PVoP>mg zq@<*3YHE;>ka~K0jEs!Hz`&A{l6ZJ{G&D4nl$6ra(kv`3&d$!q$H%(5y4>8{-QC^M z(b3e@)W*ifYiw+PfPi>+cS}r5e}8{dQ&V$ub1*M2iHV6&P*By@)m&U$dwY9RR8&Mn zLwR|5aBy&VcX(@SYhPerY;0_Re}G?KUwC+TTw7dcXlPhiSDBfagoA`nP*A0%rCVEC zS65e9S6G*qmuF{Z$;rumeSLs{e}8~~l97>jcXv2AIB#!n)6>&SOG{5rPlbhrhK7dF z(9q4z&4Yu3hlhvH&(F-v%=j%ZzW@LOOi4sRRCwBq)LmEFSQLQa9Rj9+BoGLnhJZK?pRtgR{w3M0R7-6a+PK)-hcOMj`cRV*q&U)8MvQJjv`;_2zO7LS! z@N-IFLBU|qLq({zhk6!#>3?oEdFJQ$iQq_^G;oG?J=QfznwOtAolYuy(?R@G#eP*Ud1W5yLkyKe-ayngG50Y|fNleV?`tGi- z_kyGW8?x+&dHKyGIhja(Xm@pNb^V$&5JGY`EHB;>?~eg5SF>cgbHp`i;1x30bNs#4 zYW;MZw~4Ql{Z!lXcct5vq!ekujJAhw#e2HlZjZ625uSh35Apq4MUtc;X-sHmPUDAL9 z;Z_dS(m^yj5WM_mU(Y0U>h^Fj%uWV2*SbpK;yXM7IaGC`Dj#QLt|z*en%Rh5YF>^SG&CA z($M)R2*RLiF^}1rT9`EBF!0&njxLKd<5o{jKr}yU(B)D10u>5{wwtbVT)hQNe5u@Q z;ZYO3qyZnodA3zZ<3pwmng+%+Nrg+&0E=**rhgk+v3Q);G=pYL3y-K$lOqkRAe^V^ zYr{yV>s%S{UVH9%bXsDHqyax713eqktyY$I{h$(=z=WZ|q)7v9MCKHsJTx6~L`-Kp z{>TI`Lc|4bY`3A{)l~KG}1s0Q6uIRcgi}Gp?>3yt4xbDu!gL6LX=ci zVc%+H=iF+wM3(*4y_2Rv8pt5uofl?{jn6R^<^9OU#zv1;2A!rs8X!Lxc0yq@aIwCA zf!5cRHG8b|xnYn7ULy84aA8-fu~=2H`{UK9df3oN0|~S;DP>pU(E~v^*z+*4y;6s1 z7^DI6ck@rul`BDYBbFNsO724pNdq@ig8!!k*HePwlzs^?0K4FKA&dO&J^%m!07*qo IM6N<$f+;VMc>n+a diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Timer.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Timer.png deleted file mode 100755 index 31879f8df76905ff22ec2d83f1aaf393ebcd2047..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1194 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 KMNUMnLSTZHM~MRf diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mp_wb_background.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mp_wb_background.png deleted file mode 100755 index 890c118ec8fbcf6b24abb3ae65b5876e8190f197..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3656 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 aL?$r5<((GXf6WxYkMFnsE3bG7W&Z^V)Z%~u diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mute.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mute.png deleted file mode 100755 index a760869909706ec44a6b950f0297557d6638070d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1894 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/position_arrow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/position_arrow.png deleted file mode 100755 index 267c2da18376ba265c4924483cda8cd9919d1e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418 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
    loyr?Zi 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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_medium.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_medium.png deleted file mode 100755 index 0644f8019f22cd3bd31d33ee883dff3971a0ad27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 812 zcmW-fziL!r5XDb4VRd5~Z6s(ZTBVu7Mv#?_*(HAnlEzMqjHLm!w6ThL0AWlz8>_Xo zR6(#9vCk7|;WLcCxgXs7F?VLpoO9;B+uz$-8?TQgt<7iCN8HbN#+NSge*JxQhim!y zWOpKc{&{!hc#VWO#;Us9BKoNcVJ0SCgXFBF)n* zO>m?&6)8_yim9*$4AQWK7C8ok4K!FZs|9t;@d%4h>tigDd$@(G<-&rbd6^^l@A znYjsHkqZlwE_2}{ zPGbPPD932jVkLe+lWy#Q6M|6)Yrr5)C$!+fV6cH!uc)g@6LZAIFcN)?B{Ke);csZU z!-Cmp?{ipElNx;Q^$u1x$HAT6_8_<^4;p&;1FcptOadA#wuE_TV$|x%)pM?;r`uao z9k1M+5nMi+J$^~*T0cwraCV)KqgV6Y&C&VtNVakR^za3r*5}j7!JXfSUmlLW9{s!b h>)WSWAKzbjv;9Z9ak{Zs*pJ&(X}-BPT|9X5_CEkgYIpzu diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_small.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_small.png deleted file mode 100755 index 21862594d51c94ca7819e0c466c854335aa20e3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1438 zcmc&z`BPH|5PlpgCV4qtUbLYI0m9`V1mu!(G$9GO4M{jcNJv6nNb&+vngOF7VW`p~ zDi}~?)M7pA5nGCu+5s&c1(gaaVo}hdQltWLv}x7a(V^*&{R_H3?C!U--|jcFvyDssoP9dlkxwR4K>a+}d!qpLyy zropC1X#5IYIU+-J2FJ!BBm)3^>ZBqCXFW+HAeIzC`V4%5l%&za#yC)lkWG;|k)CWU zhRT?DWg1?w8YcbQcagaqHmSWm zWCZmN#|SkLQVJpK@cBG~DheyEpjdJVDj8Io49X=$H4P&yf^@-HuT)bdY+YPjoVcw! z=sj4ST_%xx;s0qs+7e+o0QkMfXEPO>Cf)ndLMRVz;6#Mx`6mZ)_F zLo#i19&T&v5*(Ms)J1;P>pU=bK|%n(IM7MPc8iN zegDII8{Vk5_CI`bX<^<|Ln_|gJT|v;SEwf8%GG;gO}Zw+wBKO+6q6fL)~NrXYrN1k za`WyiihVRvzx|45LT_#utcsfQIUn82sd=Ax-@bWr^DAm*ru*neXf1ZD&wd59(d3Ty~dhqgxrouG_aK z_T=qD23NN=c7@8OIkPE0ZpHP%%g?IbB!QmBx3BF-T6lEKXHQi-p7xoNdcSKZiyvjB zrv!mM%|8yn@Ddp-mw7Upa$K=GpC_gSow|Ds?HG3N;|tW+A3u;(o`{+GroD|Gbx|a` zFa?ffwmR*9qLTS6r&FBJsahUl4j$cgr!9ycksO~K+HMLpgdE{AV!8uoW>)3EbL{Ss zcLO}9?9&SaElzuHb9j@Rwf=>V%ZB0BFZ<1JtZI_aO7B#eQyJmU)>hBbW0bjf%#);J z$7boYs0zc3&&~{O!ERP=Kx0S1&FxY9_x2}+n(c?_!y;!}pF6HPp7sQEI9hv0TJ}6& zJK%O(vl*|l)6FTDgv}G-)FDA5$$u3yjcP4+R0lVAUJVz=*XAw_Q*Kgzg>N}9(K?_0 zridN9g3zTO^t_s@PB?V)#2@$Pe8(U^YIiM03b}l!M@1t&(Kf+U+l3g1-1Fs(c<6vL nHR8VoPk(B}V*Yi9`7K!s{N<|Z9GAOY-hT!790~htmbU&MF`<2& diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc.png deleted file mode 100755 index 59fdae44ffb6b2b15d6b80b282a425d5383c2405..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14127 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Μ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 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rcold.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rcold.png deleted file mode 100755 index 62d579d9ab3fd2d0c3b53fc5697adb821eae6449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14127 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 ta&JEu=i^DHe_ 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 N002ovPDHLkV1jii!LtAW diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline-now.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline-now.png deleted file mode 100755 index edc022e453d57757c2f96e8a7857836d0c6a2b56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmeAS@N?(olHy`uVBq!ia0vp@3=E7e9Lzx0X;GIrAjOjI=OQOYu8I4KPtc{ z#FZicrKe7cw_duBUWTuJmY;sMpFy_2L2iISUVvdIh+L^k;M!Q+`=Ht$S`Y;1W=H@#M9T6{T2%wm#FDs?$aVb zp$1PE$B>A_Z%;-GH5mxFToi0lvu4cP>xk4NTe)KVkBe$va|Ie$IW$@KaUyp9m{w$P=#%PZ#kx3b4S?m*u$H}{lXE)D}d@q$#<7&O;HS?)8YF%+x`FwzGVeoYIb6Mw<&;$T_HhACw diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline.png deleted file mode 100755 index 9fb0823ab4ed10b915b8801198d4dc90bb06978b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^j0_A+1{};lRzcCnSwM;<-O<;Pfnog#bJnhxK)z&& zYeY$Kep*R+Vo@rCV@iHfs)A>3VtQ&&YGO)d;mK4Rpdz*apAgrrTekw4vagwr0x3~X s7srr_TS*BLtcw#wdYEo8G%zqTup}@r&OLI(5U7B`)78&qol`;+0HvWPzyJUM diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/unhandled-key.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/unhandled-key.png deleted file mode 100755 index 51d6e6c00ada1af1551f15e4a559302f3363dbc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2773 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 b{{jpE5#H<<5y+*t00000NkvXXu0mjfj+~0O diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_backspace.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_backspace.png deleted file mode 100755 index ed49159ffbc15996158704e9319c20b9a2a5914a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 783 zcmV+q1MvKbP)oHxVB;5FRxU z9yAagG!Gmz4;(W8|NnG+hzk`c2oE6&5+w>0CkPKB2Mr$y5hDl?A_ff}3KJ#?5hMcz z3B^DGU}W3>Pd77%dGLE)E$l4jM2H8!^w()(aFP2@)VfPGJfYAwy1I z3l$_pP-8zwRtOIqLQGu>5+OrRVFd{lL{DN16e2xCQbSH)?(gsf2^2z1Ua76MtFX8R z3l|9x9z#uEs;#wAT5Du%dj$y>eua=BD?dC!P&`9XJVH@CK~MDb^*%&XJV8zc3Kc&` zS3pTwK1NmJ<>x9iN7&ll0tE{-KvcfK#yLV&1PBr+Ge;5}F)BApJ3vlBN?e$nr5`Im z1`HT>evCj#S_TanK}uVyuC@dS6F*2FhyET?h^v%+AxRueSsU6#4r4tFX5R z4H-K>P44gU1`8IdueS&f9o^sJK1Eas5g#HiMX9Z{7$Y}ze2E7Q8sF^jbpQYXF-b&0 zRCwC7(^XdjQ4|H>ZR@qWXek910|c?VySuwP{=7qsjEFOv2fw$w)_%C_oPE%r%iBU@ z4$p>;Y@Q8WS-d7VGkFfQXYd@br}J82Pvcq9oXWGJC52~219Y&{3o>3vhg;u|#x6^wig~fx`?L_YKL&W*x zE>A6z6>ognlE@1-%pprB;f%LVW=a zJ%&no6BsVyc`%sI^I)Wg=fik4&xhk;-X+${c!#*H;w_`Ek~jY)zyRgihS+^yvNZqz N002ovPDHLkV1nC7CT{=$ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_bg.png deleted file mode 100755 index 5151da4ca63656e9ee2eb9d74df0c921a2ab5274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmV-H0>1r;P)#4;(WQ zA2$#lH4-2=5FIoM5+w>0CkhiL4Hzy54j%>#9SIR60|g8S4h4j>L1 zFb*3r3>GR26(|fBEC~@K3l%8{4g^&jg8azQx1ql}g3Kc<0TpueyJVQ|g2oeYm z8$d}~1`Qbm2oyj`SwTu$1`8HELQy+FPCrOlK1EbKLQp(FP6P-OK15R*BB?+C007BJ zL_t(|+O*S0T7m%#MbWERuoo1&=ntr%6npPt@7?`xM3!(f;EXfK_wvHUxOdBThgV>$ z(<`vjv!yT zVt;uu=^b!0;njH^^Xfbfct^bCyfU9NUYX-5?}5skcS&X1JL9y^d*Z9#+vl&>E3rB3 zHK%92H|`d_Yu-n_8sGC?jq|Km*&FiiX^eP>{{jpE$*Xw368eeq P00000NkvXXu0mjf(U7?+ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_clr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_clr.png deleted file mode 100755 index 0c7734bf47aebba998b627ace8d80cbddefb664e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 955 zcmV;s14R6ZP)GR05hDio8!-+VFb)|n4HzvA7%soV$-cqIzrx516eI8O@z2rL z3KJniPGJcWAWl|h&(YNj6(o=l$=$eBaTr!@n%<$)qCra5@%yPGyq60r`8fxF^vLc6n4Q`uRZl z0F{Xp3rc0_bwxWE?e}*!>)Nbq3zdl!TXZdKSF_*I-N~{|*Pb5B%CXl(z06rwTb56v zyA$0@GVF46P2+CAHy;=8m&+ ze-n-j;+GxB^J%}`-_6^0ny!glrfoaJd^j?Q4^H4)hF;QR#&OcR(T1HQ(~fhG{1J>S z;Z`CvwAD@T!B8SGVm>aJNODBy!@4utv2a+f9rGvUZerq~+$<&z$bH29O1UpsJSKM) z>$P&7ICor5PoI*T!HXku*YK`Nt`9Fy$o1h)jocJoRme@@(;>N^_Jj13;;HTl!cXJsAT{E002ovPDHLkV1jHsbE^OV diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_esc.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_esc.png deleted file mode 100755 index 56c52d301b0195a366571bc1e26ad9b5f5e2b138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1321 zcmV+^1=jkBP)8>CI}B92oNF+7Agu9CkPKB3l%8|5hDi< z9|;j83KAs@7c37PGY}m#4jM2H87~eSF%1|k4Hz!p;pFe|@xQ{zzr)GC!N-1tkP8$e z-{9kZg^>yqAwf)DLr!6Uhm#2sAb*CEL{MW36(m4QT`xLLPFH6L4;%&!9tjX02Mr$t z2^0kh6$T3zLQGu?6e6#)x}Kw}9w|Nw5+OrQUq44yP+M$7Phvt$UQJbGLr!3ThLb~2 zVJ33U67EF zk&%&-l9H2?la!Q{m6es2mX?>7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Y zv$V9dwY9ajwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI z#l^+O#>U6T$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3 z*4Ee8*Vx$D+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<; z=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku z`T6eQ4~f`4@J^y&vR9! zlI#La6Lis|?Lr$x1l{OHL=Z(3#Q_yT!C|2bZQ7rF{p!7{B($5Gg$M4t->aNOQtv*( z$pt@OIBNLmb0fn`*5`Kaw)3l8n}Hb*(zdwSgr)~+TWlwgc#w95?MayQAg#x(DVXvg zt;h9gnD!v8$HfVl@F4Bdf3?T^-s8QK@!oehORI<>Nd`F?eiY6!&WTw$3RZ_^+}iM& z#W{&HXjYC{xr7vUgIIQpGg!`do|~!iz%bg#lROXeUEZB6GgD;&#bFxh;qDwYpwS3F zq`H0ogxIC^`O}7W+f3Dt*x3-fv}e3&L91n^YDLVf4x?S#9*+ws3bR5~OWYJ^y0ksM zccI%g>k6wY?CMr^X&-ssflkM)BdiKmZNpl3X*)bfA+3)$9W0i{oDRCQ9Ud*gk_Tx& zI9`QS57ItyJPWfPq`l(pGAw(L_Ko}VFz-RyZ+>mUrUz-4xw8Qq9;C@$gEbG*PI&Y+5u12VcmnY1K#hu|I_wA^I_L*@4n#Yc|Ujg fdd|JR3t5qez}e0tZ9l;mGbJC%%al)g0jfLNhE-j$kw$f@8r+ zd`pZI)S3;!GOX|%IFSbsy@*T+i7mBbNhn;IgPYt{9N{U65-SqISFVjp%3g|e z2IE~Y>~J{A6M~~7$XeC-4)?Zxp#cO{7z%nDR{#}+#I#(IQigsd)z z%`A;yUtam!Nx)tTP$Wx9LKBAo6SCNp7HCQfFmntta||?hQkYT1=0-r1En@_O7z#^f z2-rym<%C1op)h6;%vpxuhQiqj1V@Q>3rBI4SodGBuEqf(Q4BwVceJA^$XkDyaC6j>?vn4pV+#AAmr%I6Jra zm5zV{a&O*Xpo)|2twZX)*WJCh;_T6MN6`I2h$&{~)996gnT78k2}4yiyqT|&lUq6p zCN$(C!@7y~g!}c$ua1Z8r;DDOo5Jiw4LqnkH#_Fpo@ahFf=gD?fdgKiP20fa^yj?I zQ{(dee~RjNwRT>~eblr4F3v9L96X3CEGm4|J7Aq0GBZecn%y3E0RiHN^SDFjHuM`N zs=cxbFX!~%xLKXwAkIUZ0i6}aV}R+Tz?T>>y(b~8G4t1{H8brAmo^GF8)ko&P%HL) z5?$Z5bdL*31a_#l_1@L8xp!gP>f@1om$=UNH521L3rD|h8o6;;kTf~GW#Yl)vqOJs)aHha4~O;DM=sZQ z&))8@!#zlTDxCOow~qULvZyoT`>DG8MB&K%%iI0>utv?u^!wf_eO=?HXVYsYdTyTn z)FA6G9D`d=4)JEc>=9KTNgQ2rF73l@vjVTI;eyFqpAHK?H~9MIPc+sEEcN9)CF5$)tXqRcN`t82C%8sjWs|Hdn*TXJp%3V)2$V>)r44lWq%=?! z-xVlPNwkGR_)VIFpts=q^-U~sMa$2$#Dw{Y*7rR-1}9IP=z`4t;Nvch>2~axYdLXZ z@IdSpm$U;HHY@qG`y{=sj0=(y{#MH zTT@^BW&%?+e{J$w?)x5(sZy$a%Z865>jpAAa{p_;R@*~8FnoS)>LX7(9oaKoEIGf> zmaePQ2A!RfD>@Ws6;mAw#grVZoI2B?ozCe{DDMP;gF3WRQ*v#N$;dMz2j~V{%)ZZA?|Ff?5xS?X`xItjdUIL;n z9^(&nHVFzkBQ^#HCu<_}qN0O?H|*1>G&y;p8}ouUG$$yCeP=Uzb8;+tb9R1tbhYz* z)g#5e-Z_d&SMGm2m9n6!z1paYrrfE$s(7!XRHi0=t9+tM)LFf0e`3|xQCq2KYMXfU z>bK>7Wp&D+vTaIf&9=aW`yae$GTHIk6j|yGa%Lu^*RS2W{K#}}WrR?O6shL+iI5FN zb3dkDT@$9-0^MKZ8)H_SAP}<%^XE7{G}b$%`fvTr^v;2<$X&}5WC@4sVi;vrTXj|{{rEg5GB2tHSY2=tQ3HS8%JIwWa z&W8oG5685vyz=5nIrM_21WtMK&&#O)e01pm{EC+Vq3YDVyJToHxVB;5FRxU z9yAagG!Gmz|Ns9F95M$EAas0)2Mr$y5hDl>Aqf#A2oE9(5+w=~CI$^21`Hht5F!T- z9|Hvp3KS;`6(|c8DGU}W3>Pd77%dGLE)E(n4jVBJ882^lgwN5{3lt*?6Cp!RVF?l- z3l$_pP-6%W90UmzL{DNrM^*+47eh{8Lr-BsOkJw2wX3kWLr!1?2^Bp62Sw2NnA1gppTWR_F`V=BKeua=gNm@QeRR|6nK}%g_Y+#u?lpMz9DZ1Pj4}ySux) zyW1ZpgsQFGO{Qvc;Jdy)yqf93ZHn9_YLn!gXiSuIqA5YH8P)M}cGSno+2M$lYk?z1 z&W4(3IU6dYAb$;FEGY`jxgO5hapMT*YwVNwEqER`r0 zr~Y2M%e0h$A9q%jgZPLn&sYM$IUPBP_u*iV=9VK`aN xjlq05HwIGW#xR>BH-zV0xltSx$W8wUFaV4%h@1r)UIqXF002ovPDHLkV1g!BHjw}T diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_ok.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_ok.png deleted file mode 100755 index 2c0c7e88623bd76821d25099a1b1887e4397fcc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 990 zcmV<410np0P)5g#@W z95N6dH4q*&|NsAVe24}N9Rmdn2M!+!6D9}`Aqo;D2oE9*7AgxBDGL=S2oNF(5hDr| zCkGB72@xa=7c37PGY}m#4jM2G7%dJPF%B6o4Hz!(@bL>2BfrAP3KJm-5+FlPVL(e= z3l$`elbu9RV?$102Mr$x4;%&y7rw#AkCdJY5+OoNT}@SFzr)E36e1odJqZvV1`QtX z@bXYwY(h+4Z+C@IS!x6c6yM?Ge}8h(V3uClpscZESpTpueyJV8z`I!;bjW}l<10tE{P4H-N_P(e#wpQWxqNm?v6 zNIyqc2o4)OLs33PRept#JVH?h3l?36epCPe0pCePK~#9!wAEL0(?AqJ;ghZlq<2e- zZP{^5AR!?MqyR|>HHF@L@4a_I{oPz?EDlYBBuXnxJ1)U3dVG^9)RNucdMz~5x(m82H2cZdPUy7I>;ykrq18gO72Y>PvxR0W zoa=!e3(aPE*$9mmn$2=($o!u+bdj@D=6dQTkJj5=oHxVB;5FRxU z9yAagG!Gmz|Ns9F95M$EAas0)2Mr$y5hDl>Aqf#A2oE9(5+w=~CI$^21`Hht5F!T- z9|Hvp3KS;`6(|c8DGU}W3>Pd77%dGLE)E(n4jVBJ882^lgwN5{3lt*?6Cp!RVF?l- z3l$_pP-6%W90UmzL{DNrM^*+47eh{8Lr-BsOkJw2wX3kWLr!1?2^Bp62Sw2NnA1gppTWR_F`V=BKeua=gNm@QeRR|6nK}%g_Y z7Sx2wSx^}wXF&zz%Kx<;+`EID2|w?3lX>%h>F&4*_)C6I+%(f=+!KBWKZ&+q4Liv1 z_a+hbw5j{e-_D+|P0K6F?da~ZRMr05rpaUdT|O3T$kh9WRyf6ck;c4Dom#<*r4mh< zs{5}zwWt-mxGUt;`O6EsWCU{s9Dn;mpE%H(&*>++eo_(#cJerV^me5t4{+sjCbrHE z$q`&RoWmDmvWxp{&R0Ovi;GmbZ>*)rRiPnC&eu+mJHu**+&E5>C#5QQ z<|d}62BjvZR2H60wE-$(3-AeX{eK3?V#sw9zX_z6N`m}?|1&(@Zr}yv>3h03hE&{2 zN>E`nn6PSAV}!%BtVc11tExi2u6PxAb@3|qQ2v&zTUQ%QR_|nF;$aYXW7{NHXjuv} N(9_k=Wt~$(69BOAG`;`; diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift.png deleted file mode 100755 index 477f8db2646ec5834d0ef516715e3b3f2f4007e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 767 zcmVGQ|3>^&^E(Z=D3KJ#^6)6i8Bl-IJ3KJm-5+MHm{#0IX zLr!5;UvNZFV+$1|1`8Kzbc17UeMC=U`1tu(VR8it6+=&9`~3VMEkynO{rvp>JwsCW z_xM_6b_59&R9|mHO`?JV8!8LQp_SSp*0YKSx&v3>ZL3T0u%%JU~u7 zLQx43AESs8ZU6uQMM*?KRCwBy)5lr@Q49s(qapjQirxNhZ3;I)}AftNA98$5LJWpOpc zm&MZv-xiXSd!+yRKym#|?ao^78#cm5< x1b5?n5xn*AZQ`ttZy(#Ee2+M7;yeBnU;zISjHO2#_2U2l002ovPDHLkV1h%u6q5h| diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift_sel.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift_sel.png deleted file mode 100755 index 339ddb465f891c2e2474f65344dc8dacbfa6fcba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmV-(1&sQMP)5g#@W z95N6dH4q*&|NsAVe24}N9Rmdn2M!+!6D9}`Aqo;D2oE9*7AgxBDGL=S2oNF(5hDr| zCkGB72@xa=7c37PGY}m#4jM2G7%dJPF%B6o4Hz!(@bL>2BfrAP3KJm-5+FlPVL(e= z3l$`elbu9RV?$102Mr$x4;%&y7rw#AkCdJY5+OoNT}@SFzr)E36e1odJqZvV1`QtX z@bXYwY(h+4Z+C@IS!x6c6yM?Ge}8h(V3uClpscZESpTpueyJV8z`I!;bjW}l<10tE{P4H-N_P(e#wpQWxqNm?v6 zNIyqc2o4)OLs33PRept#JVH?h3l@imhlq%XiHV7dii(Sii;Rqnjg5_tj*gFykC2d% zk&%&-l9H2?la!Q{m6es2mX?>7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Y zv$V9dwY9ajwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI z#l^+O#>U6T$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3 z*4Ee8*Vx$D+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<; z=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku z`T6;M1)2}wjjRCwBqmFr6sQ5c7xxvWa%{qD@V zD~l^x8YF}^fe=B3m;|QXq1qxM3aOATMEC#Hf1od>&USitF1tr|gZKF|XPAfio%5de z%<$ucp0_M@>8WxlKub{NdZ@O;^IYwL9u1<+a<&_~HHbFLTmcFiM7zM83$E*S40mlr zt8m!|-}jq=ySuG$-$t|w*F5k%FVBni_oHUGXCqpLGY&Y8lf^}Uj5&z%aK}cp)483d zMMp+BjI!|m+DTYcH)dzYm^ezq+wE-Ljr&?`>hq2>|JT%OiO@dptS0hoJ2nS38Mw7W z6K^}s>De{O>g_mN#$0@oEX=+2+tjyOOSkHs?WGsRW^Y4Yk<4mi&m2XqvbOdz>l5E3 zq@nq^y-%_pbWK8_|}zU50YG-0_Q0wh?Wa&oeNiL9`d# zn}%r(qAl`#3Z^uOw#b(u7}6lxSJsAMSc7P1r;P)#4;(WQ zA2$#lH4-2=5FIoM5+w>0CkhiL4Hzy54j%>#9SIR60|g8S4h4j>L1 zFb*3r3>GR26(|fBEC~@K3l%8{4g^&jg8azQx1ql}g3Kc<0TpueyJVQ|g2oeYm z8$d}~1`Qbm2oyj`SwTu$1`8HELQy+FPCrOlK1EbKLQp(FP6P-OK15R*BB?+C007BJ zL_t(|+O*S0T7m%#MbWERuoo1&=ntr%6npPt@7?`xM3!(f;EXfK_wvHUxOdBThgV>$ z(<`vjv!yT zVt;uu=^b!0;njH^^Xfbfct^bCyfU9NUYX-5?}5skcS&X1JL9y^d*Z9#+vl&>E3rB3 zHK%92H|`d_Yu-n_8sGC?jq|Km*&FiiX^eP>{{jpE$*Xw368eeq P00000NkvXXu0mjf(U7?+ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_text.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_text.png deleted file mode 100755 index 6bdb8c84bbdf44f1706d5f8667a227274cbd6e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0y~yV3Gr}O*oi=W!8`Xu4J;;nJ-=9SGW#b7xf9Hl3j9wR zZ6>gPVt})t!svXU8k`!|oH@+VQyJ4SC(*EyiHG6#LDN%Ew-NNAM>gTe~DWM4f D01I24 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_background.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_background.png deleted file mode 100755 index 9bfdbae74361961d6cdbbfeb58795b85bc45f792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1970 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 w-hS&-!8RVnTR&lOk8sDdc}uS-=ayt(uXm6sq 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 F#h>-s`z!ze diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_addlibpythondeps.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_addlibpythondeps.patch deleted file mode 100644 index 71a7c86..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_addlibpythondeps.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff --git a/lib/python/.deps/connections.Po b/lib/python/.deps/connections.Po -new file mode 100644 -index 0000000..9ce06a8 ---- /dev/null -+++ b/lib/python/.deps/connections.Po -@@ -0,0 +1 @@ -+# dummy -diff --git a/lib/python/.deps/enigma_python.Pcpp b/lib/python/.deps/enigma_python.Pcpp -new file mode 100644 -index 0000000..9ce06a8 ---- /dev/null -+++ b/lib/python/.deps/enigma_python.Pcpp -@@ -0,0 +1 @@ -+# dummy -diff --git a/lib/python/.deps/enigma_python.Po b/lib/python/.deps/enigma_python.Po -new file mode 100644 -index 0000000..9ce06a8 ---- /dev/null -+++ b/lib/python/.deps/enigma_python.Po -@@ -0,0 +1 @@ -+# dummy -diff --git a/lib/python/.deps/python.Po b/lib/python/.deps/python.Po -new file mode 100644 -index 0000000..9ce06a8 ---- /dev/null -+++ b/lib/python/.deps/python.Po -@@ -0,0 +1 @@ -+# dummy diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer.patch deleted file mode 100644 index 0c401a7..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer.patch +++ /dev/null @@ -1,218 +0,0 @@ -diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py -index 75fba2d..da5ebd4 100644 ---- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py -+++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py -@@ -7,7 +7,7 @@ from Screens.HelpMenu import HelpableScreen - from Screens.MessageBox import MessageBox - from Screens.InputBox import InputBox - from Screens.ChoiceBox import ChoiceBox --from Screens.InfoBarGenerics import InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport -+from Screens.InfoBarGenerics import InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, InfoBarPVRState - from Components.ActionMap import NumberActionMap, HelpableActionMap - from Components.Label import Label - from Components.Pixmap import Pixmap,MultiPixmap -@@ -87,7 +87,7 @@ class MediaPixmap(Pixmap): - self.coverArtFileName = "/tmp/.id3coverart" - self.picload.startDecode(self.coverArtFileName) - --class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, HelpableScreen): -+class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, InfoBarPVRState, HelpableScreen): - ALLOW_SUSPEND = True - ENABLE_RESUME_SUPPORT = True - -@@ -201,6 +201,10 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB - - InfoBarSeek.__init__(self, actionmap = "MediaPlayerSeekActions") - -+ InfoBarPVRState.__init__(self) -+ self.__hideTimer = eTimer() -+ self.__hideTimer.callback.append(self.__hideMediaPlayerState) -+ - self.onClose.append(self.delMPTimer) - self.onClose.append(self.__onClose) - -@@ -234,6 +238,14 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB - iPlayableService.evUser+13: self["coverArt"].embeddedCoverArt - }) - -+ def _mayShow(self): -+ self.pvrStateDialog.show() -+ if self.seekstate == self.SEEK_STATE_PLAY and not self.shown: -+ self.__hideTimer.start(5*1000, True) -+ -+ def __hideMediaPlayerState(self): -+ self.pvrStateDialog.hide() -+ - def doNothing(self): - pass - -@@ -762,6 +774,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB - self.playlist.updateList() - if len(self.playlist) == 1: - self.changeEntry(0) -+ self.switchToPlayList() - - def addPlaylistParser(self, parser, extension): - self.playlistparsers[extension] = parser -diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py -index 07fbac8..6ca65e3 100755 ---- a/lib/python/Screens/InfoBarGenerics.py -+++ b/lib/python/Screens/InfoBarGenerics.py -@@ -957,14 +957,17 @@ class InfoBarSeek: - def seekFwd(self): - seek = self.getSeek() - if seek and not (seek.isCurrentlySeekable() & 2): -- if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1): -- self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10) -- self.fast_winding_hint_message_showed = True -- return -- return 0 # trade as unhandled action -+ media = 1 -+ else: -+ media = 0 -+# if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1): -+# self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10) -+# self.fast_winding_hint_message_showed = True -+# return -+# return 0 # trade as unhandled action - if self.seekstate == self.SEEK_STATE_PLAY: - self.setSeekState(self.makeStateForward(int(config.seek.enter_forward.value))) -- elif self.seekstate == self.SEEK_STATE_PAUSE: -+ elif self.seekstate == self.SEEK_STATE_PAUSE and media==0: - if len(config.seek.speeds_slowmotion.value): - self.setSeekState(self.makeStateSlowMotion(config.seek.speeds_slowmotion.value[-1])) - else: -@@ -975,7 +978,11 @@ class InfoBarSeek: - speed = self.seekstate[1] - if self.seekstate[2]: - speed /= self.seekstate[2] -- speed = self.getHigher(speed, config.seek.speeds_forward.value) or config.seek.speeds_forward.value[-1] -+ if media==1 and speed == 8: -+ speed = 8 -+ return 0 # trade as unhandled action -+ else: -+ speed = self.getHigher(speed, config.seek.speeds_forward.value) or config.seek.speeds_forward.value[-1] - self.setSeekState(self.makeStateForward(speed)) - elif self.isStateBackward(self.seekstate): - speed = -self.seekstate[1] -@@ -993,18 +1000,27 @@ class InfoBarSeek: - def seekBack(self): - seek = self.getSeek() - if seek and not (seek.isCurrentlySeekable() & 2): -- if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1): -- self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10) -+ media = 1 -+ else: -+ media = 0 -+# if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1): -+# self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10) -+# self.fast_winding_hint_message_showed = True -+# return -+# return 0 # trade as unhandled action -+ seekstate = self.seekstate -+ if seekstate == self.SEEK_STATE_PLAY and media==0: -+ self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value))) -+ elif seekstate == self.SEEK_STATE_PLAY and media ==1: -+ if not self.fast_winding_hint_message_showed: -+ self.session.open(MessageBox, _("No rewinding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10) - self.fast_winding_hint_message_showed = True - return - return 0 # trade as unhandled action -- seekstate = self.seekstate -- if seekstate == self.SEEK_STATE_PLAY: -- self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value))) - elif seekstate == self.SEEK_STATE_EOF: - self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value))) - self.doSeekRelative(-6) -- elif seekstate == self.SEEK_STATE_PAUSE: -+ elif seekstate == self.SEEK_STATE_PAUSE and media==0: - self.doSeekRelative(-1) - elif self.isStateForward(seekstate): - speed = seekstate[1] -diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp -old mode 100644 -new mode 100755 -index be55d0c..7ce34c1 ---- a/lib/service/servicemp3.cpp -+++ b/lib/service/servicemp3.cpp -@@ -235,6 +235,7 @@ eServiceMP3::eServiceMP3(eServiceReference ref) - CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll); - m_aspect = m_width = m_height = m_framerate = m_progressive = -1; - -+ m_cur_rate=1.0; - m_state = stIdle; - eDebug("eServiceMP3::construct!"); - -@@ -517,6 +518,9 @@ RESULT eServiceMP3::unpause() - if (!m_gst_playbin || m_state != stRunning) - return -1; - -+ if(m_cur_rate!=1.0) -+ trickSeek(1); -+ - gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING); - - return 0; -@@ -552,7 +556,7 @@ RESULT eServiceMP3::seekToImpl(pts_t to) - { - /* convert pts to nanoseconds */ - gint64 time_nanoseconds = to * 11111LL; -- if (!gst_element_seek (m_gst_playbin, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, -+ if (!gst_element_seek (m_gst_playbin, m_cur_rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, - GST_SEEK_TYPE_SET, time_nanoseconds, - GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) - { -@@ -589,19 +593,23 @@ RESULT eServiceMP3::trickSeek(gdouble ratio) - if (!ratio) - return seekRelative(0, 0); - -+ eSingleLocker l(m_subs_to_pull_lock); -+ - GstEvent *s_event; - int flags; - flags = GST_SEEK_FLAG_NONE; - flags |= GST_SEEK_FLAG_FLUSH; - // flags |= GstSeekFlags (GST_SEEK_FLAG_ACCURATE); -- flags |= GST_SEEK_FLAG_KEY_UNIT; -+// flags |= GST_SEEK_FLAG_KEY_UNIT; - // flags |= GstSeekFlags (GST_SEEK_FLAG_SEGMENT); - // flags |= GstSeekFlags (GST_SEEK_FLAG_SKIP); - - GstFormat fmt = GST_FORMAT_TIME; -- gint64 pos, len; -+ pts_t pos; -+ gint64 len; - gst_element_query_duration(m_gst_playbin, &fmt, &len); -- gst_element_query_position(m_gst_playbin, &fmt, &pos); -+ getPlayPosition(pos); -+ pos=pos*11111; - - if ( ratio >= 0 ) - { -@@ -619,7 +627,11 @@ RESULT eServiceMP3::trickSeek(gdouble ratio) - eDebug("eServiceMP3::trickSeek failed"); - return -1; - } -- -+ m_subtitle_pages.clear(); -+ m_prev_decoder_time = -1; -+ m_decoder_time_valid_state = 0; -+ m_subs_to_pull = 0; -+ m_cur_rate=ratio; - return 0; - } - -diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h -old mode 100644 -new mode 100755 -index f3cc6dd..07eb321 ---- a/lib/service/servicemp3.h -+++ b/lib/service/servicemp3.h -@@ -265,6 +265,7 @@ private: - gint m_aspect, m_width, m_height, m_framerate, m_progressive; - std::string m_useragent; - RESULT trickSeek(gdouble ratio); -+ double m_cur_rate; - }; - - #endif diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_subtitle.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_subtitle.patch deleted file mode 100644 index 60e8f1a..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_subtitle.patch +++ /dev/null @@ -1,104 +0,0 @@ -diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp -index 7ce34c1..e620225 100755 ---- a/lib/service/servicemp3.cpp -+++ b/lib/service/servicemp3.cpp -@@ -235,6 +235,8 @@ eServiceMP3::eServiceMP3(eServiceReference ref) - CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll); - m_aspect = m_width = m_height = m_framerate = m_progressive = -1; - -+ m_subs_behind_seek = 0; -+ m_block_sub = FALSE; - m_cur_rate=1.0; - m_state = stIdle; - eDebug("eServiceMP3::construct!"); -@@ -572,6 +574,7 @@ RESULT eServiceMP3::seekTo(pts_t to) - RESULT ret = -1; - - if (m_gst_playbin) { -+ m_block_sub = TRUE; - eSingleLocker l(m_subs_to_pull_lock); // this is needed to dont handle incomming subtitles during seek! - if (!(ret = seekToImpl(to))) - { -@@ -580,6 +583,13 @@ RESULT eServiceMP3::seekTo(pts_t to) - m_decoder_time_valid_state = 0; - m_subs_to_pull = 0; - } -+ m_block_sub = FALSE; -+ } -+ m_subs_to_pull+=m_subs_behind_seek; -+ while(m_subs_behind_seek) -+ { -+ m_pump.send(Message(2)); -+ m_subs_behind_seek--; - } - - return ret; -@@ -593,6 +603,7 @@ RESULT eServiceMP3::trickSeek(gdouble ratio) - if (!ratio) - return seekRelative(0, 0); - -+ m_block_sub = TRUE; - eSingleLocker l(m_subs_to_pull_lock); - - GstEvent *s_event; -@@ -632,6 +643,13 @@ RESULT eServiceMP3::trickSeek(gdouble ratio) - m_decoder_time_valid_state = 0; - m_subs_to_pull = 0; - m_cur_rate=ratio; -+ m_block_sub = FALSE; -+ m_subs_to_pull+=m_subs_behind_seek; -+ while(m_subs_behind_seek) -+ { -+ m_pump.send(Message(2)); -+ m_subs_behind_seek--; -+ } - return 0; - } - -@@ -1572,10 +1590,17 @@ eAutoInitPtr init_eServiceFactoryMP3(eAutoInitNumbers::servi - - void eServiceMP3::gstCBsubtitleAvail(GstElement *appsink, gpointer user_data) - { -- eServiceMP3 *_this = (eServiceMP3*)user_data; -- eSingleLocker l(_this->m_subs_to_pull_lock); -- ++_this->m_subs_to_pull; -- _this->m_pump.send(Message(2)); -+ eServiceMP3 *_this = (eServiceMP3*)user_data; -+ if(_this->m_block_sub != TRUE) -+ { -+ eSingleLocker l(_this->m_subs_to_pull_lock); -+ ++_this->m_subs_to_pull; -+ _this->m_pump.send(Message(2)); -+ } -+ else -+ { -+ _this->m_subs_behind_seek++; -+ } - } - - void eServiceMP3::gstTextpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data) -@@ -1651,6 +1676,11 @@ void eServiceMP3::pullSubtitle() - { - GstBuffer *buffer; - { -+ if(m_block_sub == TRUE) -+ { -+ g_signal_emit_by_name (sink, "pull-buffer", &buffer); -+ return; -+ } - eSingleLocker l(m_subs_to_pull_lock); - --m_subs_to_pull; - g_signal_emit_by_name (sink, "pull-buffer", &buffer); -diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h -index 07eb321..f6282bf 100755 ---- a/lib/service/servicemp3.h -+++ b/lib/service/servicemp3.h -@@ -266,6 +266,8 @@ private: - std::string m_useragent; - RESULT trickSeek(gdouble ratio); - double m_cur_rate; -+ bool m_block_sub; -+ int m_subs_behind_seek; - }; - - #endif diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_unpause.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_unpause.patch deleted file mode 100644 index 9c89ee6..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_unpause.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp -index ba21d0c..88eb16e 100644 ---- a/lib/service/servicemp3.cpp -+++ b/lib/service/servicemp3.cpp -@@ -568,9 +568,13 @@ RESULT eServiceMP3::unpause() - return -1; - - if(m_cur_rate!=1.0) -+ { - trickSeek(1); -- -- gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING); -+ gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING); -+ }else if (gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING)==2){ -+ eDebug("eServiceMP3::unpause : the state change will happen asunchronously"); -+ trickSeek(1); -+ } - - return 0; - } diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_misc.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_misc.patch deleted file mode 100644 index 6e5a722..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_misc.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp -index 91f24ba..13dac01 100644 ---- a/lib/base/filepush.cpp -+++ b/lib/base/filepush.cpp -@@ -263,6 +263,7 @@ void eFilePushThread::stop() - - m_stop = 1; - -+ usleep(100000); //Fix problem of blocking I/O read - eDebug("stopping thread."); /* just do it ONCE. it won't help to do this more than once. */ - sendSignal(SIGUSR1); - kill(0); diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_networksetup.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_networksetup.patch deleted file mode 100644 index 54bdfe3..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_networksetup.patch +++ /dev/null @@ -1,45 +0,0 @@ -diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py -index 32b9f54..b31ba3a 100755 ---- a/lib/python/Screens/NetworkSetup.py -+++ b/lib/python/Screens/NetworkSetup.py -@@ -60,7 +60,11 @@ class NetworkAdapterSelection(Screen,HelpableScreen): - "yellow": (self.setDefaultInterface, [_("Set interface as default Interface"),_("* Only available if more than one interface is active.")] ), - }) - -- self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()] -+ self.adapters = [] -+ self.adapterList = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()] -+ for x in self.adapterList: -+ if x[1].startswith('eth'): -+ self.adapters.append(x) - - if not self.adapters: - self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getConfiguredAdapters()] -@@ -98,7 +102,12 @@ class NetworkAdapterSelection(Screen,HelpableScreen): - else: - interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wireless.png")) - -- num_configured_if = len(iNetwork.getConfiguredAdapters()) -+# num_configured_if = len(iNetwork.getConfiguredAdapters()) -+ num_configured_if=0 -+ for x in iNetwork.getConfiguredAdapters(): -+ if x.startswith('eth'): -+ num_configured_if+=1 -+ - if num_configured_if >= 2: - if default is True: - defaultpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue.png")) -@@ -116,7 +125,12 @@ class NetworkAdapterSelection(Screen,HelpableScreen): - def updateList(self): - self.list = [] - default_gw = None -- num_configured_if = len(iNetwork.getConfiguredAdapters()) -+# num_configured_if = len(iNetwork.getConfiguredAdapters()) -+ num_configured_if=0 -+ for x in iNetwork.getConfiguredAdapters(): -+ if x.startswith('eth'): -+ num_configured_if+=1 -+ - if num_configured_if >= 2: - self["key_yellow"].setText(_("Default")) - self["introduction"].setText(self.defaulttext) diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_remove_dreambox_enigma.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_remove_dreambox_enigma.patch deleted file mode 100644 index dd18695..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_remove_dreambox_enigma.patch +++ /dev/null @@ -1,40 +0,0 @@ -diff --git a/lib/gdi/font.cpp b/lib/gdi/font.cpp -index 9e17547..840b1eb 100644 ---- a/lib/gdi/font.cpp -+++ b/lib/gdi/font.cpp -@@ -487,6 +487,35 @@ int eTextPara::renderString(const char *string, int rflags) - { - singleLock s(ftlock); - -+ if(string && string[0]){ -+ char *ptr; -+ ptr = string; -+ while(1) -+ { -+ char *enigma = strcasestr(ptr, "enigma"); -+ if(enigma) -+ { -+ strncpy(enigma,"dvbapp",6); -+ ptr = enigma; -+ } -+ else -+ break; -+ } -+ -+ ptr = string; -+ while(1) -+ { -+ char *dreambox = strcasestr(ptr, "dreambox"); -+ if(dreambox) -+ { -+ strncpy(dreambox,"setopbox",8); -+ ptr = dreambox; -+ } -+ else -+ break; -+ } -+ } -+ - if (!current_font) - return -1; - diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_skin.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_skin.patch deleted file mode 100644 index 78c5f8e..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_skin.patch +++ /dev/null @@ -1,6753 +0,0 @@ -diff --git a/configure.ac b/configure.ac -index f11245a..87be088 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -134,6 +134,16 @@ data/skin_default/menu/Makefile - data/skin_default/icons/Makefile - data/skin_default/buttons/Makefile - data/skin_default/spinner/Makefile -+data/750S/Makefile -+data/750S/menu/Makefile -+data/750S/icons/Makefile -+data/750S/buttons/Makefile -+data/750S/countries/Makefile -+data/Vu_HD/Makefile -+data/Vu_HD/menu/Makefile -+data/Vu_HD/icons/Makefile -+data/Vu_HD/buttons/Makefile -+data/Vu_HD/countries/Makefile - include/Makefile - lib/Makefile - lib/actions/Makefile -diff --git a/data/750S/Makefile.am b/data/750S/Makefile.am -new file mode 100644 -index 0000000..7ac9481 ---- /dev/null -+++ b/data/750S/Makefile.am -@@ -0,0 +1,6 @@ -+SUBDIRS = menu icons buttons countries -+ -+installdir = $(pkgdatadir)/750S -+ -+install_DATA = \ -+ *.xml *.png -diff --git a/data/750S/buttons/Makefile.am b/data/750S/buttons/Makefile.am -new file mode 100644 -index 0000000..db2e817 ---- /dev/null -+++ b/data/750S/buttons/Makefile.am -@@ -0,0 +1,6 @@ -+AUTOMAKE_OPTIONS = gnu -+ -+installdir = $(pkgdatadir)/750S/buttons -+ -+install_DATA = \ -+ *.png -diff --git a/data/750S/countries/Makefile.am b/data/750S/countries/Makefile.am -new file mode 100644 -index 0000000..9c4bf9a ---- /dev/null -+++ b/data/750S/countries/Makefile.am -@@ -0,0 +1,6 @@ -+AUTOMAKE_OPTIONS = gnu -+ -+installdir = $(pkgdatadir)/750S/countries -+ -+install_DATA = \ -+ *.png -diff --git a/data/750S/icons/Makefile.am b/data/750S/icons/Makefile.am -new file mode 100644 -index 0000000..4686688 ---- /dev/null -+++ b/data/750S/icons/Makefile.am -@@ -0,0 +1,6 @@ -+AUTOMAKE_OPTIONS = gnu -+ -+installdir = $(pkgdatadir)/750S/icons -+ -+install_DATA = \ -+ *.png -diff --git a/data/750S/menu/Makefile.am b/data/750S/menu/Makefile.am -new file mode 100644 -index 0000000..20f24d9 ---- /dev/null -+++ b/data/750S/menu/Makefile.am -@@ -0,0 +1,6 @@ -+AUTOMAKE_OPTIONS = gnu -+ -+installdir = $(pkgdatadir)/750S/menu -+ -+install_DATA = \ -+ *.png -diff --git a/data/750S/skin.xml b/data/750S/skin.xml -new file mode 100644 -index 0000000..356191e ---- /dev/null -+++ b/data/750S/skin.xml -@@ -0,0 +1,2841 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <color name="Background" color="#371e1c1a" /> -+ <color name="LabelForeground" color="#ffffff" /> -+ <color name="ListboxBackground" color="#371e1c1a" /> -+ <color name="ListboxForeground" color="#ffffff" /> -+<!-- <color name="ListboxSelectedBackground" color="#11252525" /> --> -+ <color name="ListboxSelectedBackground" color="#336c5f38" /> -+ <color name="ListboxSelectedForeground" color="#ffffff" /> -+ <color name="ListboxMarkedBackground" color="#ff0000" /> -+ <color name="ListboxMarkedForeground" color="#ffffff" /> -+ <color name="ListboxMarkedAndSelectedBackground" color="#800000" /> -+ <color name="ListboxMarkedAndSelectedForeground" color="#ffffff" /> -+ <color name="WindowTitleForeground" color="#ffffff" /> -+ <color name="WindowTitleBackground" color="#25062748" /> -+ <!-- Main screen border png's --> -+ <borderset name="bsWindow"> -+ <pixmap pos="bpTopLeft" filename="750S/b_tl.png" /> -+ <pixmap pos="bpTop" filename="750S/b_t.png" /> -+ <pixmap pos="bpTopRight" filename="750S/b_tr.png" /> -+ <pixmap pos="bpLeft" filename="750S/b_l.png" /> -+ <pixmap pos="bpRight" filename="750S/b_r.png" /> -+ <pixmap pos="bpBottomLeft" filename="750S/b_bl.png" /> -+ <pixmap pos="bpBottom" filename="750S/b_b.png" /> -+ <pixmap pos="bpBottomRight" filename="750S/b_br.png" /> -+ </borderset> -+ </windowstyle> -+ <!-- Main screen colors (id=1 LCD) --> -+ <windowstyle type="skinned" id="1"> -+ <color name="Background" color="#000000" /> -+ <color name="LabelForeground" color="#ffffff" /> -+ <color name="ListboxBackground" color="#000000" /> -+ <color name="ListboxForeground" color="#ffffff" /> -+ <color name="ListboxSelectedBackground" color="#000000" /> -+ <color name="ListboxSelectedForeground" color="#ffffff" /> -+ <color name="ListboxMarkedBackground" color="#000000" /> -+ <color name="ListboxMarkedForeground" color="#ffffff" /> -+ <color name="ListboxMarkedAndSelectedBackground" color="#000000" /> -+ <color name="ListboxMarkedAndSelectedForeground" color="#ffffff" /> -+ <color name="WindowTitleForeground" color="#ffffff" /> -+ <color name="WindowTitleBackground" color="#000000" /> -+ </windowstyle> -+ <!-- Fonts --> -+ <fonts> -+ <font filename="MyriadPro-Regular.otf" name="Regular" scale="90" /> -+ <font filename="lcd.ttf" name="LCD" scale="100" /> -+ <font filename="ae_AlMateen.ttf" name="Replacement" scale="90" replacement="1" /> -+ <font filename="tuxtxt.ttf" name="Console" scale="100" /> -+ <font filename="nmsbd.ttf" name="Subtitlefont" scale="90" /> -+ </fonts> -+ <subtitles> -+ <sub name="Subtitle_TTX" font="Subtitlefont;30" shadowColor="#40101010" shadowOffset="3,3" /> -+ <sub name="Subtitle_Regular" font="Subtitlefont;30" foregroundColor="#DCDCDC" shadowColor="#40101010" shadowOffset="3,3" /> -+ <sub name="Subtitle_Bold" font="Replacement;30" foregroundColor="#DCDCDC" shadowColor="#40101010" shadowOffset="3,3" /> -+ <sub name="Subtitle_Italic" font="Subtitlefont;30" foregroundColor="#DCAAAA" shadowColor="#40101010" shadowOffset="3,3" /> -+ <!-- omitting foregroundColor attribute will enable auto-assignment of color --> -+ </subtitles> -+ <!-- Main infobar --> -+ <screen name="InfoBar" flags="wfNoBorder" position="0,380" size="720,164" title="InfoBar" backgroundColor="transparent"> -+ <!-- Background --> -+ <ePixmap position="40,0" zPosition="-1" size="640,164" pixmap="750S/info-bg.png" /> -+ <!-- Signal Quality --> -+ <eLabel text="SNR" position="320,6" size="40,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#cccccc" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1" /> -+ <widget source="session.FrontendStatus" render="Label" position="360,6" size="80,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#e7e7e7" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1"> -+ <convert type="FrontendInfo">SNRdB</convert> -+ </widget> -+ <!-- Signal Strength --> -+ <eLabel text="AGC" position="440,6" size="40,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#cccccc" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1" /> -+ <widget source="session.FrontendStatus" render="Label" position="485,6" size="40,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#e7e7e7" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1"> -+ <convert type="FrontendInfo">AGC</convert> -+ </widget> -+ <!-- Bit error rate --> -+<!-- <eLabel text="BER" position="595,6" size="40,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#cccccc" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1" /> -+ <widget source="session.FrontendStatus" render="Label" position="640,6" size="35,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#e7e7e7" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1"> -+ <convert type="FrontendInfo">BER</convert> -+ </widget> --> -+ <!-- Service name --> -+ <widget source="session.CurrentService" render="Label" position="130,30" size="360,27" font="Regular;21" valign="center" halign="left" noWrap="1" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <!-- tuners in use? --> -+ <widget source="session.FrontendInfo" render="Pixmap" position="290,9" size="8,9" pixmap="750S/nim_active.png" alphatest="on"> -+ <convert type="FrontendInfo">NUMBER</convert> -+ <convert type="ValueRange">0,0</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.FrontendInfo" render="Pixmap" position="290,9" size="8,9" pixmap="750S/nim_active.png" alphatest="on"> -+ <convert type="FrontendInfo">NUMBER</convert> -+ <convert type="ValueRange">1,1</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.FrontendInfo" render="Pixmap" position="350,32" size="8,9" pixmap="750S/nim_active.png" alphatest="on"> -+ <convert type="FrontendInfo">NUMBER</convert> -+ <convert type="ValueRange">2,2</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.FrontendInfo" render="Pixmap" position="350,45" size="8,9" pixmap="750S/nim_active.png" alphatest="on"> -+ <convert type="FrontendInfo">NUMBER</convert> -+ <convert type="ValueRange">3,3</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.TunerInfo" render="FixedLabel" text="A" position="265,6" size="20,13" font="Regular;18" backgroundColor="#4e5a74" transparent="1"> -+ <convert type="TunerInfo">TunerUseMask</convert> -+ <convert type="ValueBitTest">1</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.TunerInfo" render="FixedLabel" text="B" position="277,6" size="20,13" font="Regular;18" backgroundColor="#4e5a74" transparent="1"> -+ <convert type="TunerInfo">TunerUseMask</convert> -+ <convert type="ValueBitTest">2</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.TunerInfo" render="FixedLabel" text="C" position="265,30" size="20,13" font="Regular;18" backgroundColor="#4e5a74" transparent="1"> -+ <convert type="TunerInfo">TunerUseMask</convert> -+ <convert type="ValueBitTest">4</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.TunerInfo" render="FixedLabel" text="D" position="265,43" size="20,13" font="Regular;18" backgroundColor="#4e5a74" transparent="1"> -+ <convert type="TunerInfo">TunerUseMask</convert> -+ <convert type="ValueBitTest">8</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <ePixmap pixmap="750S/icons/clock.png" position="568,4" zPosition="1" size="16,16" alphatest="on" /> -+ <widget source="global.CurrentTime" render="Label" position="580,5" zPosition="1" size="50,20" font="Regular;19" halign="right"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <!-- -+ <widget source="global.CurrentTime" render="Label" position="633,6" zPosition="1" size="26,18" font="Regular;16" valign="top"> -+ <convert type="ClockToText">Format:%S</convert> -+ </widget> --> -+ <!-- Crypt icon (encrypted service?) --> -+ <ePixmap position="559,36" zPosition="0" size="70,15" pixmap="750S/icons/icons_off.png" alphatest="on" /> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="750S/icons/icon_crypt.png" position="559,36" zPosition="1" size="11,15" alphatest="on"> -+ <convert type="ServiceInfo">IsCrypted</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Teletext icon (is teletext available?) --> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="750S/icons/icon_txt.png" position="576,36" zPosition="1" size="18,15" alphatest="on"> -+ <convert type="ServiceInfo">HasTelext</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Videoformat icon (16:9?) --> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="750S/icons/icon_format.png" position="600,36" zPosition="1" size="28,15" alphatest="on"> -+ <convert type="ServiceInfo">IsWidescreen</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Audio icon (is there multichannel audio?) --> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="750S/icons/icon_dolby.png" position="634,36" zPosition="1" size="25,15" alphatest="on"> -+ <convert type="ServiceInfo">IsMultichannel</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Progressbar (current event duration)--> -+ <ePixmap pixmap="750S/progress_bg.png" position="60,77" size="84,7" transparent="1" alphatest="on" /> -+ <widget source="session.Event_Now" render="Progress" pixmap="750S/progress_small.png" position="62,78" zPosition="1" size="80,5" transparent="1"> -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <!-- Blinking pixmap (recording in progress?) --> -+ <ePixmap pixmap="750S/icons/icon_rec_off.png" position="525,36" size="34,21" alphatest="on" /> -+ <widget source="session.RecordState" render="Pixmap" pixmap="750S/icons/icon_rec.png" position="525,36" zPosition="1" size="34,21" alphatest="on" > -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ <!-- Event (now) --> -+ <ePixmap pixmap="750S/nim_active.png" position="182,78" size="15,10" alphatest="on" /> -+ <widget source="session.Event_Now" render="Label" position="205,73" size="60,24" font="Regular;20" backgroundColor="#34406f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Label" position="265,73" size="310,24" font="Regular;20" noWrap="1" backgroundColor="#34406f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Label" position="575,73" size="85,24" font="Regular;20" backgroundColor="#34406f" shadowColor="#1d354c" shadowOffset="-1,-1" halign="right" transparent="1"> -+ <convert type="EventTime">Remaining</convert> -+ <convert type="RemainingToText">InMinutes</convert> -+ </widget> -+ <!-- Event (next) --> -+ <widget source="session.Event_Next" render="Label" position="205,97" size="60,24" font="Regular;20" backgroundColor="#071f38" foregroundColor="#c3c3c9" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="session.Event_Next" render="Label" position="265,97" size="310,24" font="Regular;20" noWrap="1" backgroundColor="#071f38" foregroundColor="#c3c3c9" transparent="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <widget source="session.Event_Next" render="Label" position="575,97" size="85,24" font="Regular;20" backgroundColor="#071f38" foregroundColor="#c3c3c9" halign="right" transparent="1"> -+ <convert type="EventTime">Duration</convert> -+ <convert type="ClockToText">InMinutes</convert> -+ </widget> -+ <!-- Red button (is recording possible?) --> -+ <ePixmap pixmap="750S/buttons/button_red_off.png" position="60,132" size="22,22" alphatest="on" /> -+ <widget source="RecordingPossible" render="Pixmap" pixmap="750S/buttons/button_red.png" position="60,132" zPosition="1" size="22,22" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="ShowRecordOnRed" render="FixedLabel" text="Record" position="90,132" zPosition="1" size="80,22" font="Regular;20" foregroundColor="#7f848d" backgroundColor="#182946" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="RecordingPossible" render="FixedLabel" text="Record" position="90,132" zPosition="1" size="80,22" font="Regular;20" backgroundColor="#182946" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Green button (is subservices available?) --> -+ <ePixmap pixmap="750S/buttons/button_green_off.png" position="220,132" size="22,22" alphatest="on" /> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="750S/buttons/button_green.png" position="220,132" zPosition="1" size="22,22" alphatest="on"> -+ <convert type="ServiceInfo">SubservicesAvailable</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <eLabel text="Subservices" position="260,132" size="100,22" font="Regular;20" foregroundColor="#7f848d" backgroundColor="#182946" transparent="1" /> -+ <widget source="session.CurrentService" render="FixedLabel" text="Subservices" position="250,132" zPosition="1" size="100,22" font="Regular;20" backgroundColor="#182946" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ServiceInfo">SubservicesAvailable</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Yellow button (is timeshift possible?) --> -+ <ePixmap pixmap="750S/buttons/button_yellow_off.png" position="380,132" size="22,22" alphatest="on" /> -+ <widget source="TimeshiftPossible" render="Pixmap" pixmap="750S/buttons/button_yellow.png" position="380,132" zPosition="1" size="22,22" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="ShowTimeshiftOnYellow" render="FixedLabel" text="Timeshift" position="410,132" zPosition="1" size="85,22" font="Regular;20" foregroundColor="#7f848d" backgroundColor="#182946" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="TimeshiftPossible" render="FixedLabel" text="Timeshift" position="410,132" zPosition="1" size="85,22" font="Regular;20" backgroundColor="#182946" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ -+ <!-- Yellow button (used for audio on boxes with new rc?) --> -+ <widget source="ShowAudioOnYellow" render="Pixmap" pixmap="750S/buttons/button_yellow.png" position="380,132" zPosition="1" size="22,22" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="ShowAudioOnYellow" render="FixedLabel" text="Audio" position="410,132" zPosition="1" size="85,22" font="Regular;20" backgroundColor="#182946" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Blue button (is extensions available?) --> -+ <ePixmap pixmap="750S/buttons/button_blue_off.png" position="540,132" size="22,22" alphatest="on" /> -+ <widget source="ExtensionsAvailable" render="Pixmap" pixmap="750S/buttons/button_blue.png" position="540,132" zPosition="1" size="22,22" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <eLabel text="Extensions" position="570,132" size="110,22" font="Regular;20" foregroundColor="#7f848d" backgroundColor="#182946" transparent="1" /> -+ <widget source="ExtensionsAvailable" render="FixedLabel" text="Extensions" position="570,132" zPosition="1" size="110,22" font="Regular;20" backgroundColor="#182946" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ </screen> -+ <!-- Main menu --> -+ <screen name="menu_mainmenu" position="0,0" size="720,576" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_main.png" zPosition="-1" position="94,85" size="530,415" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="110,100" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel text="Main menu" position="170,113" size="200,30" font="Regular;30" foregroundColor="#e1e1e1" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget source="menu" render="Listbox" selectionPixmap="750S/buttons/Selected_bar_250x32px.png" backgroundColorSelected="#371e1c1a" position="130,176" size="250,315" transparent="1" backgroundColor="#371e1c1a" scrollbarMode="showNever"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ MultiContentEntryText(pos = (20, 5), size = (230, 30), flags = RT_HALIGN_LEFT, text = 0) ], -+ "fonts": [gFont("Regular", 25)], -+ "itemHeight": 39 -+ } -+ </convert> -+ </widget> -+ <eLabel text=" " position="130,210" zPosition="-1" size="250,3" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,249" zPosition="-1" size="250,3" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,288" zPosition="-1" size="250,3" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,327" zPosition="-1" size="250,3" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,366" zPosition="-1" size="250,3" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,405" zPosition="-1" size="250,3" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,444" zPosition="-1" size="250,3" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,483" zPosition="-1" size="250,3" backgroundColor="#021a1816" /> -+ -+ <widget source="menu" render="Pixmap" pixmap="750S/menu/subtitles.png" position="400,190" size="155,140" alphatest="blend"> -+ <convert type="MenuEntryCompare">subtitle_selection</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="750S/menu/setup.png" position="400,190" size="155,140" alphatest="blend"> -+ <convert type="MenuEntryCompare">setup_selection</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="750S/menu/shutdown.png" position="400,190" size="155,140" alphatest="blend"> -+ <convert type="MenuEntryCompare">standby_restart_list</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="750S/menu/plugins.png" position="400,190" size="155,140" alphatest="blend"> -+ <convert type="MenuEntryCompare">plugin_selection</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="750S/menu/information.png" position="400,190" size="155,140" alphatest="blend"> -+ <convert type="MenuEntryCompare">info_screen</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="750S/menu/scart.png" position="400,190" size="155,140" alphatest="blend"> -+ <convert type="MenuEntryCompare">scart_switch</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="750S/menu/timer.png" position="400,190" size="155,140" alphatest="blend"> -+ <convert type="MenuEntryCompare">timer_edit</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="750S/menu/media_player.png" position="400,190" size="155,140" alphatest="blend"> -+ <convert type="MenuEntryCompare">media_player</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="You can view available subtitles from current event." position="410,324" zPosition="1" size="190,130" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">subtitle_selection</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="-Service Searching" position="410,324" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">setup_selection</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="-System" position="410,349" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">setup_selection</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="-Parental control" position="410,374" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">setup_selection</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="-Factory reset" position="410,399" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">setup_selection</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="-Standby" position="410,324" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">standby_restart_list</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="-Restart" position="410,349" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">standby_restart_list</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="-Deep Standby" position="410,374" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">standby_restart_list</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="This show the list of plug-ins you have installed." position="410,324" zPosition="1" size="200,120" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">plugin_selection</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="Your software version, memory usages and other Box information can be found from here." position="410,324" zPosition="1" size="200,120" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">info_screen</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="-Switch to VCR scart" position="410,324" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">scart_switch</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="You can record or schedule to watch an event with this Timer function." position="410,324" zPosition="1" size="200,130" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">timer_edit</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="FixedLabel" text="This box can play various of multimedia file formats." position="410,324" zPosition="1" size="200,130" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="MenuEntryCompare">media_player</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+<!-- -+ <widget source="menu" render="Pixmap" pixmap="750S/menu/dvd_player.png" position="400,190" size="218,202" alphatest="blend"> -+ <convert type="MenuEntryCompare">dvd_player</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+--> -+ </screen> -+ <!-- Movieplayer infobar --> -+ <screen name="MoviePlayer" flags="wfNoBorder" position="0,380" size="720,164" title="InfoBar" backgroundColor="transparent"> -+ <!-- Background --> -+ <ePixmap position="40,0" pixmap="750S/info-bg_mp.png" zPosition="-1" size="640,164" /> -+ <!-- colorbuttons --> -+ <ePixmap position="275,120" pixmap="750S/icons/mp_buttons.png" size="169,30" alphatest="blend" /> -+ <!-- Servicename --> -+ <widget source="session.CurrentService" render="Label" position="65,30" size="475,30" font="Regular;28" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <!-- movie length --> -+ <widget source="session.CurrentService" render="Label" position="565,30" size="90,24" font="Regular;20" halign="right" backgroundColor="#4e5a74" transparent="1"> -+ <convert type="ServicePosition">Length</convert> -+ </widget> -+ <!-- Elapsed time --> -+ <widget source="session.CurrentService" render="Label" position="35,75" size="100,24" font="Regular;20" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ServicePosition">Position</convert> -+ </widget> -+ <!-- Progressbar (movie position)--> -+ <widget source="session.CurrentService" render="PositionGauge" position="130,80" size="460,20" zPosition="2" pointer="750S/position_pointer.png:460,0" transparent="1"> -+ <convert type="ServicePosition">Gauge</convert> -+ </widget> -+ <!-- Remaining time --> -+ <widget source="session.CurrentService" render="Label" position="580,75" size="100,20" font="Regular;20" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ServicePosition">Remaining</convert> -+ </widget> -+ </screen> -+ -+ <!-- 750S skin (750S.xml) --> -+ <!-- About screen --> -+ <screen name="About" position="0,0" size="720,576" title="Serviceinfo" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_main.png" zPosition="-1" position="90,70" size="530,415" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="110,85" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel text="Main menu > Information > " position="160,105" size="230,30" font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" /> -+ <eLabel text="About" position="380,100" size="200,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget source="EnigmaVersion" render="Label" position="110,150" size="380,20" font="Regular;20" /> -+ <widget source="ImageVersion" render="Label" position="110,180" size="380,20" font="Regular;20" /> -+ <widget source="FPVersion" render="Label" position="110,210" size="380,20" font="Regular;20" /> -+ <widget source="TunerHeader" render="Label" position="110,240" size="380,20" font="Regular;20" /> -+ <widget source="Tuner0" render="Label" position="110,265" size="400,20" font="Regular;20" /> -+ <widget source="Tuner1" render="Label" position="110,285" size="400,20" font="Regular;20" /> -+ <widget source="Tuner2" render="Label" position="110,305" size="400,20" font="Regular;20" /> -+ <widget source="Tuner3" render="Label" position="110,325" size="400,20" font="Regular;20" /> -+ <widget source="HDDHeader" render="Label" position="110,355" size="380,20" font="Regular;20" /> -+ <widget source="hddA" render="Label" position="110,380" size="380,40" font="Regular;20" /> -+ </screen> -+ <!-- Adapter setup --> -+ <screen name="AdapterSetup" position="110,115" size="500,415" title="Network Setup" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,375" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="360,375" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,375" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_blue" render="Label" position="380,375" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ -+ <widget name="config" position="10,10" transparent="1" backgroundColor="#371e1c1a" size="480,125" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,140" zPosition="1" size="550,2" /> -+ <widget source="DNS1text" render="Label" position="10,145" size="190,21" zPosition="1" font="Regular;19" /> -+ <widget source="DNS2text" render="Label" position="10,175" size="190,21" zPosition="1" font="Regular;19" /> -+ <widget source="DNS1" render="Label" position="380,145" size="120,21" zPosition="1" font="Regular;17" /> -+ <widget source="DNS2" render="Label" position="380,175" size="120,21" zPosition="1" font="Regular;17" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,200" zPosition="1" size="550,2" /> -+ -+ <widget source="introduction" render="Label" position="10,205" size="440,20" font="Regular;19" halign="center" /> -+ <widget source="IPtext" render="Label" position="100,240" size="190,21" zPosition="1" font="Regular;19" /> -+ <widget source="Netmasktext" render="Label" position="100,265" size="190,21" zPosition="1" font="Regular;19" /> -+ <widget source="Gatewaytext" render="Label" position="100,290" size="190,21" zPosition="1" font="Regular;19" /> -+ <widget source="IP" render="Label" position="300,240" size="440,21" zPosition="1" font="Regular;19" /> -+ <widget source="Mask" render="Label" position="300,265" size="440,21" zPosition="1" font="Regular;19" /> -+ <widget source="Gateway" render="Label" position="300,290" size="440,21" zPosition="1" font="Regular;19" /> -+ -+ <widget source="Adaptertext" render="Label" position="20,325" size="100,21" zPosition="10" font="Regular;19" transparent="1" /> -+ <widget source="Adapter" render="Label" position="110,325" size="300,21" zPosition="10" font="Regular;19" transparent="1" /> -+ <widget source="introduction2" render="Label" position="110,355" size="300,20" zPosition="10" font="Regular;21" halign="center" transparent="1" /> -+ <widget name="VKeyIcon" pixmap="750S/buttons/key_text.png" position="10,380" zPosition="10" size="35,25" transparent="1" alphatest="on" /> -+ <widget name="HelpWindow" pixmap="750S/vkey_icon.png" position="160,315" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen> -+ <screen name="AdapterSetupConfiguration" position="110,120" size="500,400" title="Network Configuration..." > -+ <ePixmap pixmap="750S/buttons/red.png" position="10,360" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="30,360" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,350" zPosition="1" size="560,2" /> -+ <ePixmap pixmap="750S/border_menu_a.png" position="10,10" zPosition="1" size="250,300" transparent="1" alphatest="on" /> -+ <widget name="menulist" position="20,20" size="230,260" selectionPixmap="750S/buttons/Selected_bar_230x23px.png" transparent="1" backgroundColor="#371e1c1a" zPosition="10" scrollbarMode="showOnDemand" /> -+ <widget source="description" render="Label" position="305,10" size="195,300" font="Regular;19" halign="center" valign="center" /> -+ <widget source="IFtext" render="Label" position="20,325" size="100,21" zPosition="10" font="Regular;19" transparent="1" /> -+ <widget source="IF" render="Label" position="110,325" size="300,21" zPosition="10" font="Regular;19" transparent="1" /> -+ <widget source="Statustext" render="Label" position="340,325" size="115,21" zPosition="10" font="Regular;19" transparent="1"/> -+ <widget name="statuspic" pixmaps="750S/buttons/button_green.png,750S/buttons/button_green_off.png" position="460,322" zPosition="10" size="22,22" transparent="1" alphatest="on"/> -+ </screen> -+ <!-- Audio selection --> -+ <screen name="AudioSelection" position="center,center" size="560,330" title="Audio"> -+ <widget name="config" position="50,10" size="500,110" scrollbarMode="showOnDemand" /> -+ -+ <widget source="key_red" render="Pixmap" pixmap="750S/buttons/button_red.png" position="10,10" size="22,22" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="key_green" render="Pixmap" pixmap="750S/buttons/button_green.png" position="10,35" size="22,22" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="key_yellow" render="Pixmap" pixmap="750S/buttons/button_yellow.png" position="10,60" size="22,22" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="key_blue" render="Pixmap" pixmap="750S/buttons/button_blue.png" position="10,85" size="22,22" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ -+ <ePixmap pixmap="skin_default/div-h.png" position="10,112" zPosition="10" size="540,2" /> -+ -+ <widget source="streams" render="Listbox" scrollbarMode="showOnDemand" position="10,120" size="540,200" zPosition="3" transparent="1" > -+ <convert type="TemplatedMultiContent"> -+ {"templates": -+ {"default": (25, [ -+ MultiContentEntryText(pos = (0, 0), size = (35, 25), font = 0, flags = RT_HALIGN_LEFT, text = 1), # key, -+ MultiContentEntryText(pos = (40, 0), size = (60, 25), font = 0, flags = RT_HALIGN_LEFT, text = 2), # number, -+ MultiContentEntryText(pos = (110, 0), size = (120, 25), font = 0, flags = RT_HALIGN_LEFT, text = 3), # description, -+ MultiContentEntryText(pos = (240, 0), size = (200, 25), font = 0, flags = RT_HALIGN_LEFT, text = 4), # language, -+ MultiContentEntryText(pos = (450, 4), size = (90, 25), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # selection, -+ ], True, "showNever"), -+ "notselected": (25, [ -+ MultiContentEntryText(pos = (0, 0), size = (35, 25), font = 0, flags = RT_HALIGN_LEFT, text = 1), # key, -+ MultiContentEntryText(pos = (40, 0), size = (60, 25), font = 0, flags = RT_HALIGN_LEFT, text = 2), # number, -+ MultiContentEntryText(pos = (110, 0), size = (120, 25), font = 0, flags = RT_HALIGN_LEFT, text = 3), # description, -+ MultiContentEntryText(pos = (240, 0), size = (200, 25), font = 0, flags = RT_HALIGN_LEFT, text = 4), # language, -+ MultiContentEntryText(pos = (450, 4), size = (90, 25), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # selection, -+ ], False, "showNever") -+ }, -+ "fonts": [gFont("Regular", 20), gFont("Regular", 16)], -+ "itemHeight": 25 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <!-- Bouquet selector --> -+ <screen name="BouquetSelector" position="210,160" size="300,240" title="Choose bouquet"> -+ <widget name="menu" position="10,10" transparent="1" size="290,225" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Channel context menu --> -+ <screen name="ChannelContextMenu" position="210,163" size="300,255" title="Channellist menu"> -+ <widget name="menu" position="10,10" transparent="1" size="290,230" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Channel selection - TV --> -+ <screen name="ChannelSelection" position="0, 0" size="720,576" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_list.png" position="60,25" size="600,520" zPosition="-1" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_channelselection_tv.png" position="90,35" size="44,44" alphatest="blend" transparent="1" /> -+ <widget name="etitle" position="140,50" size="450,30" font="Regular;30" halign="left" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" /> -+ <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="key_yellow" position="380,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="key_blue" position="520,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="list" position="80,185" size="555,228" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget source="ServiceEvent" render="Label" position="95,422" zPosition="1" size="460,20" font="Regular;19" noWrap="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <ePixmap pixmap="750S/icons/clock.png" position="565,422" zPosition="1" size="16,16" alphatest="on" /> -+ <widget source="global.CurrentTime" render="Label" position="585,422" zPosition="1" size="50,20" font="Regular;19" halign="right"> -+ <convert type="ClockToText"></convert> -+ </widget> -+ <widget source="ServiceEvent" render="Label" position="295,442" zPosition="1" size="340,20" font="Regular;19" halign="right" noWrap="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="ServiceEvent" render="Label" position="95,442" zPosition="1" size="50,22" font="Regular;19"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText"></convert> -+ </widget> -+ <widget source="ServiceEvent" render="Label" position="145,442" zPosition="1" size="70,22" font="Regular;19"> -+ <convert type="EventTime">EndTime</convert> -+ <convert type="ClockToText">Format:- %H:%M</convert> -+ </widget> -+ <widget source="ServiceEvent" render="Progress" position="210,445" zPosition="1" pixmap="750S/progress_medium.png" size="80,11" borderWidth="2" borderColor="#cccccc"> -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="ServiceEvent" render="Label" position="95,463" zPosition="1" size="540,56" font="Regular;18" foregroundColor="#cccccc"> -+ <convert type="EventName">ExtendedDescription</convert> -+ </widget> -+ </screen> -+ <!-- Channel selection - Radio --> -+ <screen name="ChannelSelectionRadio" position="0,0" size="720,576" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_list.png" position="60,25" size="600,520" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="750S/icons/icon_channelselection_radio.png" position="90,35" size="44,44" alphatest="blend" transparent="1" /> -+ <widget name="etitle" position="140,50" size="450,30" font="Regular;30" halign="left" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" /> -+ <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="key_yellow" position="380,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="key_blue" position="520,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="list" position="80,185" size="555,200" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Choice box --> -+ <screen name="ChoiceBox" position="150,120" size="550,400" title="Input"> -+ <widget name="text" position="10,10" size="550,25" font="Regular;20" /> -+ <widget name="list" position="0,50" size="550,335" transparent="1" scrollbarMode="showOnDemand" /> -+ <applet type="onLayoutFinish"> -+# this should be factored out into some helper code, but currently demonstrates applets. -+from enigma import eSize, ePoint -+ -+orgwidth = self.instance.size().width() -+orgpos = self.instance.position() -+textsize = self["text"].getSize() -+ -+# y size still must be fixed in font stuff... -+textsize = (textsize[0] + 50, textsize[1] + 50) -+count = len(self.list) -+if count > 10: -+ count = 10 -+offset = 25 * count -+wsizex = textsize[0] + 60 -+wsizey = textsize[1] + offset -+ -+if (520 > wsizex): -+ wsizex = 520 -+wsize = (wsizex, wsizey) -+ -+# resize -+self.instance.resize(eSize(*wsize)) -+ -+# resize label -+self["text"].instance.resize(eSize(*textsize)) -+ -+# move list -+listsize = (wsizex, 25 * count) -+self["list"].instance.move(ePoint(0, textsize[1])) -+self["list"].instance.resize(eSize(*listsize)) -+ -+# center window -+newwidth = wsize[0] -+self.instance.move(ePoint((720-wsizex)/2, (576-wsizey)/(count > 7 and 2 or 3))) -+ -+ </applet> -+ </screen> -+ <!-- Common interface --> -+ <screen name="MMIDialog" position="135,153" size="450,270"> -+ <widget name="title" position="10,10" size="430,25" font="Regular;23" /> -+ <widget name="subtitle" position="10,35" size="430,25" font="Regular;23" /> -+ <widget name="entries" position="10,70" size="430,150" scrollbarMode="showOnDemand" /> -+ <widget name="bottom" position="10,230" size="430,25" font="Regular;23" /> -+ </screen> -+ <!-- Common interface - selection --> -+ <screen name="CiSelection" position="140,226" size="440,160" title="Common Interface"> -+ <widget name="text" position="10,10" size="430,25" font="Regular;23" /> -+ <widget name="entries" position="10,55" size="420,100" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Console --> -+ <screen name="Console" position="110,120" size="500,400" title="Command execution..."> -+ <widget name="text" position="10,10" size="480,380" font="Console;14" /> -+ </screen> -+ <!-- Clock display --> -+ <screen name="clockDisplay" position="300,120" size="300,300"> -+ <widget name="okbutton" position="10,10" size="280,40" /> -+ <widget name="title" position="10,120" size="280,50" /> -+ <widget name="theClock" position="10,60" size="280,50" /> -+ </screen> -+ <!-- Config OSD --> -+ <screen name="configOSD" position="130,120" size="460,350" title="OSD Settings"> -+ <widget name="okbutton" position="20,270" size="205,40" /> -+ <widget name="txt_alpha" position="20,20" size="110,20" /> -+ <widget name="sld_alpha" position="150,20" size="290,20" /> -+ <widget name="txt_brightness" position="20,60" size="120,20" /> -+ <widget name="sld_brightness" position="150,20" size="290,20" /> -+ <widget name="txt_gamma" position="20,100" size="120,20" /> -+ <widget name="sld_gamma" position="150,100" size="290,20" /> -+ </screen> -+ <!-- Config test --> -+ <screen name="configTest" position="300,100" size="300,300" title="config menu"> -+ <widget name="config" position="10,30" size="420,220" /> -+ </screen> -+ <!-- Default wizard --> -+ <screen name="DefaultWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="153,50" size="340,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" selectionPixmap="750S/buttons/Selected_bar_440x23px.png" backgroundColor="#371e1c1a" position="50,300" size="440,200" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <ePixmap pixmap="750S/buttons/button_red.png" position="40,227" size="22,22" alphatest="on" /> -+ <widget name="languagetext" position="66,230" size="95,30" font="Regular;18" /> -+ <widget name="config" backgroundColor="#371e1c1a" position="50,300" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="rc" pixmap="750S/rc.png" position="520,600" zPosition="10" size="154,471" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-150" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-150" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-150" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <screen name="DefaultSatLists" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="153,50" size="340,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" transparent="1" position="50,300" size="440,200" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <ePixmap pixmap="750S/buttons/button_red.png" position="40,227" size="22,22" alphatest="on" /> -+ <widget name="languagetext" position="66,230" size="95,30" font="Regular;18" /> -+ <widget name="config" position="50,300" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="rc" pixmap="750S/rc.png" position="520,600" zPosition="10" size="154,471" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <screen name="DreamPackageWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="153,50" size="340,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" position="50,300" size="440,200" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <ePixmap pixmap="750S/buttons/button_red.png" position="40,227" size="22,22" alphatest="on" /> -+ <widget name="languagetext" position="66,230" size="95,30" font="Regular;18" /> -+ <widget name="config" position="50,300" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="rc" pixmap="750S/rc.png" position="520,600" zPosition="10" size="154,471" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <!-- Dish --> -+ <screen name="Dish" flags="wfNoBorder" position="300,110" size="130,160" title="Dish" zPosition="-1" backgroundColor="transparent"> -+ <widget name="Dishpixmap" pixmap="750S/icons/dish.png" position="0,0" size="130,160" alphatest="off" /> -+ </screen> -+ <!-- unhandled key pressed --> -+ <screen name="UnhandledKey" flags="wfNoBorder" position="620,50" size="34,45" title="UnhandledKey" zPosition="100" backgroundColor="transparent"> -+ <widget name="UnhandledKeyPixmap" pixmap="750S/unhandled-key.png" position="0,0" size="34,45" alphatest="off" /> -+ </screen> -+ <!-- EPG Selection - Single --> -+ <screen name="EPGSelection" position="0,0" size="720,576" title="EPG Selection" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_list.png" position="60,25" size="600,520" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="750S/icons/icon_epg.png" position="90,35" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel text="EPG Selection" position="140,45" size="220,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" /> -+ <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="key_yellow" position="380,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="key_blue" position="520,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="list" position="80,180" size="555,350" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- EPG Selection - Multi --> -+ <screen name="EPGSelectionMulti" position="0,0" size="720,576" title="EPG Selection" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_list.png" zPosition="-1" position="60,25" size="600,520" alphatest="on" /> -+ <ePixmap pixmap="750S/icons/icon_epg.png" position="90,35" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel text="EPG Selection Multi" position="140,45" size="250,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" /> -+ <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="key_yellow" position="380,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="key_blue" position="520,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="now_button_sel" pixmap="750S/epg_now.png" position="90,175" zPosition="1" size="320,25" alphatest="on" /> -+ <widget name="next_button_sel" pixmap="750S/epg_next.png" position="90,175" zPosition="1" size="320,25" alphatest="on" /> -+ <widget name="more_button_sel" pixmap="750S/epg_more.png" position="90,175" zPosition="1" size="320,25" alphatest="on" /> -+ <widget name="now_text" position="90,175" zPosition="2" size="108,22" text="NOW" font="Regular;16" halign="center" valign="center" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="next_text" position="196,175" zPosition="2" size="108,22" text="NEXT" font="Regular;16" halign="center" valign="center" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="more_text" position="301,175" zPosition="2" size="108,22" text="MORE" font="Regular;16" halign="center" valign="center" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="date" position="495,160" size="110,45" font="Regular;18" valign="center" halign="right" /> -+ <widget name="list" position="96,203" size="520,320" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Eventview --> -+ <screen name="EventView" position="0,0" size="720,576" title="Eventview" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_list.png" zPosition="-1" position="60,25" size="600,520" alphatest="on" /> -+ <ePixmap pixmap="750S/icons/icon_epg.png" position="90,35" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel text="Eventview" position="140,45" size="250,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" /> -+ <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="key_yellow" position="380,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="key_blue" position="520,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="epg_description" position="95,175" size="530,325" font="Regular;22" /> -+ <widget name="datetime" position="95,500" size="120,25" font="Regular;22" /> -+ <widget name="duration" position="215,500" size="90,25" font="Regular;22" /> -+ <widget name="channel" position="335,500" size="280,25" font="Regular;22" halign="right" /> -+ </screen> -+ <!-- Graphical Multi EPG --> -+ <screen name="GraphMultiEPG" position="0,0" size="720,576" title="Electronic Program Guide" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_list.png" zPosition="-1" position="60,25" size="600,520" alphatest="on" /> -+ <ePixmap pixmap="750S/icons/icon_epg.png" position="90,35" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel text="Electronic Program Guide" position="140,45" size="300,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" /> -+ <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="timeline_text" position="85,166" size="520,20" /> -+ <widget name="list" position="80,190" size="550,270" transparent="1" backgroundColor="#371e1c1a" EntryBorderColor="#071930" EntryBackgroundColor="#2f4964" EntryBackgroundColorSelected="#25688caf" scrollbarMode="showOnDemand" /> -+ <widget name="timeline0" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" /> -+ <widget name="timeline1" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" /> -+ <widget name="timeline2" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" /> -+ <widget name="timeline3" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" /> -+ <widget name="timeline4" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" /> -+ <widget name="timeline5" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" /> -+ <widget name="timeline_now" position="80,189" zPosition="2" size="19,273" pixmap="750S/timeline-now.png" alphatest="on" /> -+ <ePixmap pixmap="750S/border_multiepg.png" position="80,167" zPosition="1" size="520,358" transparent="1" alphatest="on" /> -+ <widget source="Event" render="Label" position="90,462" zPosition="1" size="450,20" font="Regular;19" noWrap="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <ePixmap pixmap="750S/icons/clock.png" position="550,462" zPosition="1" size="16,16" alphatest="on" /> -+ <widget source="global.CurrentTime" render="Label" position="566,462" zPosition="1" size="50,20" font="Regular;18" halign="right"> -+ <convert type="ClockToText"></convert> -+ </widget> -+ <widget source="Event" render="Label" position="90,482" zPosition="1" size="50,22" font="Regular;18"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText"></convert> -+ </widget> -+ <widget source="Event" render="Label" position="140,482" zPosition="1" size="70,22" font="Regular;18"> -+ <convert type="EventTime">EndTime</convert> -+ <convert type="ClockToText">Format:- %H:%M</convert> -+ </widget> -+ <widget source="Event" render="Progress" position="200,485" zPosition="1" pixmap="750S/progress_medium.png" size="65,11" borderWidth="2" borderColor="#cccccc"> -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="Event" render="Label" position="280,482" zPosition="1" size="320,20" font="Regular;18" noWrap="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText">Format:(%A)</convert> -+ </widget> -+ <widget source="Event" render="Label" position="90,502" zPosition="1" size="500,40" font="Regular;18" foregroundColor="#cccccc"> -+ <convert type="EventName">ExtendedDescription</convert> -+ </widget> -+ </screen> -+ <!-- Harddisk selection --> -+ <screen name="HarddiskSelection" position="100,150" size="540,285" title="Select HDD"> -+ <widget name="hddlist" position="10,10" size="520,275" /> -+ </screen> -+ <!-- Harddisk setup --> -+ <screen name="HarddiskSetup" position="140,200" size="420,160" title="Harddisk"> -+ <widget name="model" position="20,10" size="380,25" font="Regular;23" /> -+ <widget name="capacity" position="20,40" size="380,25" font="Regular;23" /> -+ <widget name="bus" position="20,70" size="380,25" font="Regular;23" /> -+ <widget name="initialize" pixmap="750S/buttons/red.png" position="140,110" size="136,40" alphatest="on" /> -+ <widget name="initializetext" position="160,110" size="115,40" zPosition="1" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ </screen> -+ <!-- Harddisk wait --> -+ <screen name="HarddiskWait" position="100,150" size="540,60"> -+ <widget name="wait" position="20,10" size="500,25" font="Regular;23" /> -+ </screen> -+ <!-- Help menu --> -+ <screen name="HelpMenu" position="0,0" size="720,576" title="Menu" flags="wfNoBorder"> -+ <eLabel text="help..." position="400,40" size="220,60" font="Regular;40" /> -+ <widget name="list" position="50,100" size="440,380" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="550,40" zPosition="10" size="154,500" alphatest="blend" /> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="long_key" position="320,520" size="350,50" font="Regular;25" halign="right" foregroundColor="yellow" /> -+ </screen> -+ <!-- Image Wizard --> -+ <screen name="ImageWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder"> -+ <widget name="text" position="50,100" size="440,250" font="Regular;22" /> -+ <widget name="list" position="50,350" zPosition="1" size="440,200" /> -+ <widget name="config" position="50,350" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Inputbox --> -+ <screen name="InputBox" position="80,250" size="550,90" title="Input"> -+ <widget name="text" position="10,20" size="550,25" font="Regular;23" /> -+ <widget name="input" position="10,55" size="550,25" font="Regular;20" /> -+ </screen> -+ <!-- IPKG --> -+ <screen name="Ipkg" position="100,120" size="550,200" title="Installing Software..."> -+ <widget name="activityslider" position="0,0" size="550,5" pixmap="750S/progress_small.png" /> -+ <widget name="package" position="10,30" size="550,20" font="Regular;18" /> -+ <widget name="status" position="10,60" size="550,45" font="Regular;18" /> -+ <widget name="slider" position="10,100" size="530,15" pixmap="750S/progress_big.png" borderWidth="2" borderColor="#cccccc" /> -+ </screen> -+ <!-- Language selection --> -+ <screen name="LanguageSelection" position="170,143" size="380,300" title="Language selection"> -+ <widget source="languages" render="Listbox" position="0,0" size="380,300" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (80, 10), size = (200, 50), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the language name, -+# MultiContentEntryPixmap(pos = (10, 5), size = (53, 35), png = 2), # index 2 is the pixmap -+ MultiContentEntryPixmap(pos = (7, 5), size = (60, 40), png = 2), # index 2 is the pixmap -+ ], -+ "fonts": [gFont("Regular", 20)], -+ "itemHeight": 50 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="LanguageWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder"> -+ <widget name="text" position="153,50" size="340,240" font="Regular;23" /> -+ <widget source="languages" render="Listbox" position="50,300" size="440,200" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (80, 10), size = (200, 50), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the language name, -+# MultiContentEntryPixmap(pos = (10, 5), size = (53, 35), png = 2), # index 2 is the pixmap -+ MultiContentEntryPixmap(pos = (7, 5), size = (60, 40), png = 2), # index 2 is the pixmap -+ ], -+ "fonts": [gFont("Regular", 20)], -+ "itemHeight": 50 -+ } -+ </convert> -+ </widget> -+ <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="520,50" zPosition="10" size="154,500" alphatest="blend" /> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ </screen> -+ <!-- Location Box --> -+ <screen name="LocationBox" position="100,120" size="540,460" > -+ <widget name="text" position="0,2" size="540,22" font="Regular;22" /> -+ <widget name="target" position="0,23" size="540,22" valign="center" font="Regular;22" /> -+ <widget name="filelist" position="0,55" zPosition="1" size="540,210" scrollbarMode="showOnDemand" selectionDisabled="1" /> -+ <widget name="textbook" position="0,272" size="540,22" font="Regular;22" /> -+ <widget name="booklist" position="5,302" zPosition="2" size="535,100" scrollbarMode="showOnDemand" /> -+ <widget name="red" position="0,415" zPosition="1" size="136,40" pixmap="750S/buttons/red.png" transparent="1" alphatest="on" /> -+ <widget name="key_red" position="20,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="green" position="135,415" zPosition="1" size="136,40" pixmap="750S/buttons/green.png" transparent="1" alphatest="on" /> -+ <widget name="key_green" position="155,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="yellow" position="270,415" zPosition="1" size="136,40" pixmap="750S/buttons/yellow.png" transparent="1" alphatest="on" /> -+ <widget name="key_yellow" position="290,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="blue" position="405,415" zPosition="1" size="136,40" pixmap="750S/buttons/blue.png" transparent="1" alphatest="on" /> -+ <widget name="key_blue" position="425,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ </screen> -+ <!-- Mediaplayer --> -+ <screen name="MediaPlayer" position="0,0" size="720,576" title="MediaPlayer" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_setup_650.png" zPosition="-1" position="48,20" size="630,525" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_media.png" position="80,35" size="44,44" alphatest="blend" transparent="1" /> -+ <ePixmap pixmap="750S/mediaplayer_bg.png" position="70,100" zPosition="-1" size="594,390" alphatest="on" /> -+ <eLabel name="thistory" position="140,55" size="300,30" text = "Main menu > " font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" /> -+ <eLabel name="title1" position="245,50" size="200,30" text="Media player" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="artisttext" position="85,105" size="74,22" font="Regular;20" valign="top" foregroundColor="#cccccc" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="artist" position="160,105" size="339,22" font="Regular;20" valign="top" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="albumtext" position="85,138" size="74,22" font="Regular;20" valign="top" foregroundColor="#cccccc" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="album" position="160,138" size="339,22" font="Regular;20" valign="top" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="yeartext" position="85,170" size="74,22" font="Regular;20" valign="top" foregroundColor="#cccccc" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="year" position="160,170" size="150,22" font="Regular;20" valign="top" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="genretext" position="315,170" size="74,22" font="Regular;20" valign="top" foregroundColor="#cccccc" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="genre" position="390,170" size="150,22" font="Regular;20" valign="top" backgroundColor="#371e1c1a" transparent="1" /> -+ <eLabel name="nowPlaying" position="84,210" size="130,22" text="Now Playing :" font="Regular;22" foregroundColor="#ffc435" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="title" position="200,210" size="430,24" font="Regular;22" valign="top" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="coverArt" pixmap="750S/no_coverArt.png" position="553,100" size="111,96" transparent="1" alphatest="blend" /> -+ <ePixmap pixmap="750S/icons/mp_buttons.png" position="275,510" size="169,30" alphatest="blend" /> -+<!-- <widget name="PositionGauge" position="120,493" size="500,10" pointer="750S/position_pointer.png:660,0" seek_pointer="750S/position_pointer.png:660,0" transparent="1" />--> -+ <widget name="PositionGauge" position="77,493" size="580,10" pointer="750S/position_pointer_580.png:580,0" seek_pointer="750S/position_pointer_580.png:580,0" transparent="1" /> -+ <widget name="filelist" position="115,245" transparent="1" size="545,117" scrollbarMode="showOnDemand" /> -+ <widget name="playlist" position="115,370" transparent="1" size="545,117" scrollbarMode="showOnDemand" selectionDisabled="1" /> -+ <widget name="currenttext" position="65,80" size="0,0" /> -+ <widget name="titletext" position="65,80" size="0,0" /> -+ </screen> -+ <!-- Menu screens --> -+ <screen name="Menu" position="0,0" size="720,576" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_main.png" zPosition="-1" position="94,85" size="530,415" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="110,100" size="44,44" alphatest="blend" transparent="1" /> -+ <widget source="thistory" render="Label" position="170,120" size="300,30" font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget source="title1" render="Label" position="340,113" size="200,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget source="title2" render="Label" position="410,113" size="200,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget source="title0" render="Label" position="275,113" size="200,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget source="menu" render="Listbox" selectionPixmap="750S/buttons/Selected_bar_450x32px.png" backgroundColorSelected="#371e1c1a" backgroundColor="#371e1c1a" transparent="1" position="125, 176" size="480,315" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ MultiContentEntryText(pos = (20, 5), size = (450, 25), flags = RT_HALIGN_LEFT, text = 0) ], -+ "fonts": [gFont("Regular", 25)], -+ "itemHeight": 35 -+ } -+ </convert> -+ </widget> -+ <eLabel text=" " position="130,207" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,242" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,277" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,312" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,347" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,382" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,417" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,452" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="130,487" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ </screen> -+ <!-- Messagebox --> -+ <screen name="MessageBox" position="110,245" size="500,10" title="Message"> -+ <widget name="text" position="65,8" size="420,0" font="Regular;22" /> -+ <widget name="ErrorPixmap" pixmap="750S/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="QuestionPixmap" pixmap="750S/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="InfoPixmap" pixmap="750S/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="list" position="100,100" size="380,375" transparent="1" backgroundColor="#371e1c1a" /> -+ <applet type="onLayoutFinish"> -+# this should be factored out into some helper code, but currently demonstrates applets. -+from enigma import eSize, ePoint -+ -+orgwidth = self.instance.size().width() -+orgpos = self.instance.position() -+textsize = self["text"].getSize() -+ -+# y size still must be fixed in font stuff... -+textsize = (textsize[0] + 50, textsize[1] + 50) -+offset = 0 -+if self.type == self.TYPE_YESNO: -+ offset = 60 -+wsizex = textsize[0] + 60 -+wsizey = textsize[1] + offset -+if (280 > wsizex): -+ wsizex = 280 -+wsize = (wsizex, wsizey) -+ -+ -+# resize -+self.instance.resize(eSize(*wsize)) -+ -+# resize label -+self["text"].instance.resize(eSize(*textsize)) -+ -+# move list -+listsize = (wsizex, 50) -+self["list"].instance.move(ePoint(0, textsize[1])) -+self["list"].instance.resize(eSize(*listsize)) -+ -+# center window -+newwidth = wsize[0] -+self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) -+ </applet> -+ </screen> -+ <!-- Minute input --> -+ <screen name="MinuteInput" position="200,140" size="280,60" title="Seek"> -+ <widget name="minutes" position="80,15" size="160,25" halign="right" font="Regular;23" /> -+ </screen> -+ <!-- Movie context menu --> -+ <screen name="MovieContextMenu" position="150,160" size="400,260" title="Movielist menu"> -+ <widget name="menu" position="10,10" size="380,250" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Movieselection --> -+ <screen name="MovieSelection" position="0, 0" size="720,576" title="Channel Selection" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_list.png" position="60,25" size="600,520" zPosition="-1" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_recorded.png" position="90,35" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel text="Recorded files..." position="140,45" size="220,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="80,110" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="220,110" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="360,110" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="500,110" size="136,40" alphatest="on" /> -+ <widget name="key_red" position="100,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="240,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="key_yellow" position="380,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="key_blue" position="520,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="waitingtext" position="80,160" size="555,328" zPosition="4" font="Regular;22" halign="center" valign="center" /> -+ <widget name="list" position="80,160" size="555,328" zPosition="2" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget name="DescriptionBorder" pixmap="750S/border_eventinfo.png" position="75,388" zPosition="1" size="560,103" transparent="1" alphatest="on" /> -+ <widget source="Service" render="Label" position="80,390" zPosition="1" size="480,35" font="Regular;17" foregroundColor="#cccccc"> -+ <convert type="MovieInfo">ShortDescription</convert> -+ </widget> -+ <widget source="Service" render="Label" position="570,390" zPosition="1" size="60,22" font="Regular;17" halign="right"> -+ <convert type="ServiceTime">Duration</convert> -+ <convert type="ClockToText">AsLength</convert> -+ </widget> -+ <widget source="Service" render="Label" position="455,410" zPosition="2" size="175,22" font="Regular;17" halign="right"> -+ <convert type="MovieInfo">RecordServiceName</convert> -+ </widget> -+ <widget source="Service" render="Label" position="80,430" zPosition="1" size="550,58" font="Regular;19"> -+ <convert type="EventName">ExtendedDescription</convert> -+ </widget> -+ <widget name="freeDiskSpace" position="75,500" size="540,20" font="Regular;19" valign="center" halign="right" /> -+ </screen> -+ <!-- Mute --> -+ <screen name="Mute" position="50,50" zPosition="10" size="40,24" backgroundColor="transparent" title="Mute" flags="wfNoBorder"> -+ <ePixmap position="0,0" size="40,24" pixmap="750S/mute.png" transparent="1" alphatest="on" /> -+ </screen> -+ <!-- Nameserver --> -+ <screen name="NameserverSetup" position="110,120" size="500,400" title="Nameserver Setup" > -+ <widget name="config" position="10,10" transparent="1" backgroundColor="#371e1c1a" size="480,175" scrollbarMode="showOnDemand" /> -+ <widget source="key_red" render="Label" position="430,330" size="120,21" zPosition="10" font="Regular;21" transparent="1" /> -+ <widget source="key_green" render="Label" position="60,330" size="150,21" zPosition="10" font="Regular;21" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="60,360" size="150,21" zPosition="10" font="Regular;21" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/button_red.png" position="400,328" zPosition="10" size="22,22" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/button_green.png" position="20,328" zPosition="10" size="22,22" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/button_yellow.png" position="20,358" zPosition="10" size="22,22" transparent="1" alphatest="on" /> -+ <widget name="introduction" position="140,360" size="300,20" zPosition="10" font="Regular;21" halign="center" transparent="1" /> -+ </screen> -+ <!-- Network adapter selection --> -+ <screen name="NetworkAdapterSelection" position="110,120" size="500,400" title="Select Network Adapter"> -+ <widget source="key_red" render="Label" position="430,330" size="120,21" zPosition="10" font="Regular;21" transparent="1" /> -+ <widget source="key_green" render="Label" position="60,330" size="150,21" zPosition="10" font="Regular;21" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="60,360" size="150,21" zPosition="10" font="Regular;21" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/button_red.png" position="400,328" zPosition="10" size="22,22" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/button_green.png" position="20,328" zPosition="10" size="22,22" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/button_yellow.png" position="20,358" zPosition="10" size="22,22" transparent="1" alphatest="on" /> -+ <widget source="list" render="Listbox" position="10,10" size="550,280" zPosition="10" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> <!-- iface, name, description, interfacepng, defaultpng, activepng, divpng --> -+ {"template": [ -+ MultiContentEntryText(pos = (85, 6), size = (440, 28), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 1), # index 1 is the interfacename -+ MultiContentEntryText(pos = (85, 43), size = (440, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, text = 2), # index 2 is the description -+ MultiContentEntryPixmapAlphaTest(pos = (2, 8), size = (54, 54), png = 3), # index 3 is the interface pixmap -+ MultiContentEntryPixmapAlphaTest(pos = (63, 46), size = (15, 16), png = 4), # index 4 is the default pixmap -+ ], -+ "fonts": [gFont("Regular", 28),gFont("Regular", 20)], -+ "itemHeight": 70 -+ } -+ </convert> -+ </widget> -+ <widget source="introduction" render="Label" position="140,360" size="300,21" zPosition="10" font="Regular;21" halign="center" transparent="1" /> -+ </screen> -+ <!-- Network adapter test Black = "#000000" Grey = "#8c8c93" Green = "#1cff1c" Red = #f23d21--> -+ <screen name="NetworkAdapterTest" position="110,120" size="520,400" title="Network test..." > -+ <ePixmap pixmap="750S/buttons/button_red.png" position="380,328" zPosition="10" size="22,22" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/button_green.png" position="30,328" zPosition="10" size="22,22" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/button_yellow.png" position="30,358" zPosition="10" size="22,22" transparent="1" alphatest="on" /> -+ <widget source="key_red" render="Label" position="420,330" size="120,21" zPosition="10" font="Regular;21" transparent="1" /> -+ <widget source="key_green" render="Label" position="70,330" size="250,21" zPosition="10" font="Regular;21" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="70,360" size="250,21" zPosition="10" font="Regular;21" transparent="1" /> -+ <widget name="Adaptertext" position="10,20" size="120,21" zPosition="1" font="Regular;19" foregroundColors="#8c8c93,#1cff1c" /> -+ <widget name="Adapter" position="120,20" size="270,21" zPosition="1" font="Regular;19" halign="center" foregroundColors="#8c8c93,#f23d21,#1cff1c" /> -+ <widget name="AdapterInfo" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="370,10" zPosition="1" size="140,40" transparent="1" alphatest="on" /> -+ <widget name="AdapterInfo_Text" position="410,20" size="110,21" zPosition="2" font="Regular;19" transparent="1" foregroundColors="#8c8c93,#7fafaf,#1cff1c" /> -+ <widget name="AdapterInfo_OK" pixmap="750S/icons/lock_on.png" position="345,15" size="38,31" alphatest="on" zPosition="2" /> -+ <widget name="Networktext" position="10,70" size="120,21" zPosition="1" font="Regular;19" foregroundColors="#8c8c93,#1cff1c" /> -+ <widget name="Network" position="150,70" size="240,21" zPosition="1" font="Regular;19" halign="center" foregroundColors="#8c8c93,#f23d21,#1cff1c" /> -+ <widget name="NetworkInfo" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="370,60" zPosition="1" size="140,40" transparent="1" alphatest="on" /> -+ <widget name="NetworkInfo_Text" position="410,70" size="110,21" zPosition="2" font="Regular;19" transparent="1" foregroundColors="#8c8c93,#7fafaf,#1cff1c" /> -+ <widget name="NetworkInfo_Check" pixmaps="750S/icons/lock_on.png,750S/icons/lock_error.png" position="345,65" size="38,31" alphatest="on" zPosition="2" /> -+ <widget name="Dhcptext" position="10,120" size="120,21" zPosition="1" font="Regular;19" foregroundColors="#8c8c93,#1cff1c" /> -+ <widget name="Dhcp" position="150,120" size="240,21" zPosition="1" font="Regular;19" halign="center" foregroundColors="#8c8c93,#f23d21,#1cff1c" /> -+ <widget name="DhcpInfo" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="370,110" zPosition="1" size="140,40" transparent="1" alphatest="on" /> -+ <widget name="DhcpInfo_Text" position="410,120" size="110,21" zPosition="2" font="Regular;19" transparent="1" foregroundColors="#8c8c93,#7fafaf,#1cff1c" /> -+ <widget name="DhcpInfo_Check" pixmaps="750S/icons/lock_on.png,750S/icons/lock_error.png" position="345,115" size="38,31" alphatest="on" zPosition="2" /> -+ <widget name="IPtext" position="10,170" size="120,21" zPosition="1" font="Regular;19" foregroundColors="#8c8c93,#1cff1c" /> -+ <widget name="IP" position="150,170" size="210,21" zPosition="1" font="Regular;19" halign="center" foregroundColors="#8c8c93,#f23d21,#1cff1c" /> -+ <widget name="IPInfo" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="370,160" zPosition="1" size="140,40" transparent="1" alphatest="on" /> -+ <widget name="IPInfo_Text" position="410,170" size="110,21" zPosition="2" font="Regular;19" transparent="1" foregroundColors="#8c8c93,#7fafaf,#1cff1c" /> -+ <widget name="IPInfo_Check" pixmaps="750S/icons/lock_on.png,750S/icons/lock_error.png" position="345,165" size="38,31" alphatest="on" zPosition="2" /> -+ <widget name="DNStext" position="10,220" size="120,21" zPosition="1" font="Regular;19" foregroundColors="#8c8c93,#1cff1c" /> -+ <widget name="DNS" position="150,220" size="210,21" zPosition="1" font="Regular;19" halign="center" foregroundColors="#8c8c93,#f23d21,#1cff1c" /> -+ <widget name="DNSInfo" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="370,210" zPosition="1" size="140,40" transparent="1" alphatest="on" /> -+ <widget name="DNSInfo_Text" position="410,220" size="110,21" zPosition="2" font="Regular;19" transparent="1" foregroundColors="#8c8c93,#7fafaf,#1cff1c" /> -+ <widget name="DNSInfo_Check" pixmaps="750S/icons/lock_on.png,750S/icons/lock_error.png" position="345,215" size="38,31" alphatest="on" zPosition="2" /> -+ <widget name="EditSettingsButton" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="350,260" zPosition="1" size="130,40" transparent="1" alphatest="on" /> -+ <widget name="EditSettings_Text" position="370,270" size="110,21" zPosition="2" font="Regular;17" halign="center" transparent="1" foregroundColors="#7fafaf,#8c8c93,#1cff1c" /> -+ -+ <widget name="InfoText" position="5,5" size="515,290" zPosition="25" font="Regular;21" /> -+ </screen> -+ <!-- Network setup --> -+ <screen name="NetworkSetup" position="130,140" size="510,330" title="Network Setup"> -+ <widget name="menu" position="10,10" selectionPixmap="750S/buttons/Selected_bar_440x23px.png" transparent="1" backgroundColor="#371e1c1a" size="440,310" /> -+ </screen> -+ <!-- Nim selection --> -+ <screen name="NimSelection" position="150,123" size="420,330" title="Choose Tuner"> -+ <widget source="nimlist" render="Listbox" transparent="1" position="0,0" size="420,300" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (10, 5), size = (400, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name, -+ MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings, -+ ], -+ "fonts": [gFont("Regular", 20), gFont("Regular", 15)], -+ "itemHeight": 70 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <!-- Nim setup --> -+ <screen name="NimSetup" position="110,120" size="500,412" title="Reception Settings"> -+ <widget name="config" position="10,10" transparent="1" size="480,402" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Numberzap --> -+ <screen name="NumberZap" position="235,255" size="250,60" title="Channel"> -+ <widget name="channel" position="35,15" size="110,25" font="Regular;23" /> -+ <widget name="number" position="145,15" size="80,25" halign="right" font="Regular;23" /> -+ </screen> -+ <!-- Numerical help dialog --> -+ <screen name="NumericalTextInputHelpDialog" position="170,420" zPosition="2" size="394,124" backgroundColor="#202020" flags="wfNoBorder"> -+ <eLabel position="0,0" size="392,122" backgroundColor="#c0c0c0" zPosition="-1" /> -+ <widget name="key1" position="2,2" size="130,30" font="Console;16" halign="center" valign="center" /> -+ <widget name="key2" position="132,2" size="130,30" font="Console;16" halign="center" valign="center" /> -+ <widget name="key3" position="262,2" size="130,30" font="Console;16" halign="center" valign="center" /> -+ <widget name="key4" position="2,32" size="130,30" font="Console;16" halign="center" valign="center" /> -+ <widget name="key5" position="132,32" size="130,30" font="Console;16" halign="center" valign="center" /> -+ <widget name="key6" position="262,32" size="130,30" font="Console;16" halign="center" valign="center" /> -+ <widget name="key7" position="2,62" size="130,30" font="Console;16" halign="center" valign="center" /> -+ <widget name="key8" position="132,62" size="130,30" font="Console;16" halign="center" valign="center" /> -+ <widget name="key9" position="262,62" size="130,30" font="Console;16" halign="center" valign="center" /> -+ <widget name="help1" position="2,92" size="130,30" font="Regular;16" halign="center" valign="center" /> -+ <widget name="key0" position="132,92" size="130,30" font="Regular;16" halign="center" valign="center" /> -+ <widget name="help2" position="262,92" size="130,30" font="Regular;16" halign="center" valign="center" /> -+ </screen> -+ <!-- Parental control - change pin --> -+ <screen name="ParentalControlChangePin" position="100,200" size="520,160" title="Change pin code"> -+ <widget name="config" position="10,10" size="500,350" transparent="1" backgroundColor="#371e1c1a" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Parental control - editor --> -+ <screen name="ParentalControlEditor" position="100,120" size="520,400" title="Parental control services Editor"> -+ <widget name="servicelist" position="10,10" size="500,350" selectionPixmap="750S/buttons/Selected_bar_500x23px.png" transparent="1" backgroundColorSelected="#371e1c1a" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Parental control - setup --> -+ <screen name="ParentalControlSetup" position="100,120" size="520,400" title="Parental control setup"> -+ <widget name="config" position="10,10" transparent="1" backgroundColor="#371e1c1a" size="500,350" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Picture in picture --> -+ <screen name="PictureInPicture" position="400,60" zPosition="-1" size="240,192" flags="wfNoBorder"> -+ <widget name="video" position="0,0" size="240,192" backgroundColor="transparent" /> -+ </screen> -+ <!-- Pin input --> -+ <screen name="PinInput" position="110,205" size="500,170" title="Pin code needed"> -+ <widget name="service" position="10,10" size="480,25" font="Regular;20" /> -+ <widget name="text" position="10,40" size="480,25" font="Regular;20" halign="center" /> -+ <widget name="tries" position="10,70" size="480,25" font="Regular;20" halign="center" /> -+ <widget name="input" position="10,110" size="480,40" font="Regular;50" halign="center" /> -+ </screen> -+ <!-- Picture in picture setup --> -+ <screen name="PiPSetup" position="70,400" size="600,150" backgroundColor="transparent" flags="wfNoBorder" title="PiPSetup"> -+ <widget name="text" position="0,0" size="600,150" font="Regular;23" /> -+ </screen> -+ <!-- Plugin browser --> -+ <screen name="PluginBrowser" position="150,120" size="410,410" title="Plugin browser"> -+ <ePixmap pixmap="750S/buttons/red-big.png" position="0,0" size="200,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green-big.png" position="210,0" size="200,40" alphatest="on" /> -+ <widget name="red" position="30,0" zPosition="1" size="170,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="green" position="240,0" zPosition="1" size="170,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="list" position="0,45" size="410,355" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Plugin downloads --> -+ <screen name="PluginDownloadBrowser" position="110,120" size="500,420" title="Downloadable plugins"> -+ <widget name="text" position="0,0" zPosition="1" size="500,430" font="Regular;20" halign="center" valign="center" /> -+ <widget name="list" position="10,10" zPosition="2" size="480,405" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- PVR state --> -+ <screen name="PVRState" position="70,70" zPosition="2" size="150,30" backgroundColor="transpBlack" flags="wfNoBorder"> -+ <widget name="state" position="0,0" size="150,30" font="Regular;25" halign="center" backgroundColor="transpBlack" foregroundColor="white" /> -+ </screen> -+ <!-- Radio infobar --> -+ <screen name="RadioInfoBar" position="75,408" size="560,120" zPosition="1" flags="wfNoBorder" title="Radio"> -+ <widget source="session.CurrentService" render="Label" position="5,1" size="325,26" font="Regular;20" noWrap="1" transparent="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="RdsDecoder" render="Pixmap" pixmap="750S/icons/rass_logo.png" position="330,1" size="50,21" alphatest="on"> -+ <convert type="RdsInfo">RasInteractiveAvailable</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.RecordState" render="Pixmap" pixmap="750S/icons/record.png" position="480,3" zPosition="2" size="14,14" alphatest="on" > -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ <ePixmap pixmap="750S/icons/clock.png" position="478,0" zPosition="1" size="16,16" alphatest="on" /> -+ <widget source="session.Event_Now" render="Progress" pixmap="750S/progress_medium.png" position="395,5" zPosition="2" size="71,11" borderWidth="2" borderColor="#cccccc" transparent="1"> -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="500,1" size="55,28" font="Regular;20" halign="right" transparent="1"> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Label" position="5,25" size="60,22" font="Regular;20" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Label" position="73,25" size="390,22" font="Regular;20" valign="top" noWrap="1" transparent="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Label" position="465,25" size="90,22" font="Regular;20" halign="right" transparent="1"> -+ <convert type="EventTime">Remaining</convert> -+ <convert type="RemainingToText">InMinutes</convert> -+ </widget> -+ <widget source="session.Event_Next" render="Label" position="5,47" size="60,22" font="Regular;20" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="session.Event_Next" render="Label" position="73,47" size="390,22" font="Regular;20" valign="top" noWrap="1" transparent="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <widget source="session.Event_Next" render="Label" position="465,47" size="90,22" font="Regular;20" halign="right" transparent="1"> -+ <convert type="EventTime">Duration</convert> -+ <convert type="ClockToText">InMinutes</convert> -+ </widget> -+ <eLabel position="5,68" size="550,1" backgroundColor="#384472" /> -+ <eLabel position="5,69" size="550,1" backgroundColor="#04060a" /> -+ <widget source="RdsDecoder" render="Label" position="5,71" size="550,50" font="LCD;20" foregroundColor="#80ffff"> -+ <convert type="RdsInfo">RadioText</convert> -+ </widget> -+ </screen> -+ <!-- RASS --> -+ <screen name="RassInteractive" position="50,180" size="100,275" backgroundColor="transpWhite" flags="wfNoBorder"> -+ <ePixmap pixmap="750S/icons/rass_logo.png" position="25,0" size="50,21" transparent="1" alphatest="on" /> -+ <eLabel text="Index" position="36,25" size="60,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <eLabel text="0" position="5,25" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="Marker" position="21,25" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <eLabel text="1" position="5,50" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_1" position="35,50" size="36,20" alphatest="on" /> -+ <eLabel text="2" position="5,75" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_2" position="35,75" size="36,20" alphatest="on" /> -+ <eLabel text="3" position="5,100" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_3" position="35,100" size="36,20" alphatest="on" /> -+ <eLabel text="4" position="5,125" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_4" position="35,125" size="36,20" alphatest="on" /> -+ <eLabel text="5" position="5,150" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_5" position="35,150" size="36,20" alphatest="on" /> -+ <eLabel text="6" position="5,175" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_6" position="35,175" size="36,20" alphatest="on" /> -+ <eLabel text="7" position="5,200" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_7" position="35,200" size="36,20" alphatest="on" /> -+ <eLabel text="8" position="5,225" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_8" position="35,225" size="36,20" alphatest="on" /> -+ <eLabel text="9" position="5,250" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_9" position="35,250" size="36,20" alphatest="on" /> -+ </screen> -+ <!-- RDS info --> -+ <screen name="RdsInfoDisplay" position="0,0" zPosition="-2" size="720,576" backgroundColor="transparent" flags="wfNoBorder"> -+ <widget name="RadioText" position="50,481" size="620,29" font="Regular;21" noWrap="1" backgroundColor="#003258" shadowOffset="-2,-2" shadowColor="transpBlack" /> -+ <widget name="RtpText" position="50,510" size="620,29" font="Regular;21" halign="right" noWrap="1" backgroundColor="#003258" shadowOffset="-2,-2" shadowColor="transpBlack" /> -+ <widget name="RassLogo" pixmap="750S/icons/rass_logo.png" position="50,445" size="50,21" /> -+ </screen> -+ <!-- Satfinder --> -+ <screen name="Satfinder" position="90,120" size="520,400" title="Satfinder"> -+ <widget name="introduction" position="0,0" size="0,0" font="Regular;23" /> -+ <ePixmap pixmap="750S/icons/dish_scan.png" position="5,25" zPosition="0" size="119,110" transparent="1" alphatest="on" /> -+ <widget source="Frontend" render="Label" position="190,10" zPosition="2" size="260,20" font="Regular;19" halign="center" valign="center" transparent="1"> -+ <convert type="FrontendInfo">SNRdB</convert> -+ </widget> -+ <eLabel name="snr" text="SNR:" position="120,35" size="60,22" font="Regular;21" halign="right" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="190,35" size="260,20" pixmap="750S/bar_snr.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">SNR</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="460,35" size="60,22" font="Regular;21"> -+ <convert type="FrontendInfo">SNR</convert> -+ </widget> -+ <eLabel name="agc" text="AGC:" position="120,60" size="60,22" font="Regular;21" halign="right" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="190,60" size="260,20" pixmap="750S/bar_snr.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">AGC</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="460,60" size="60,22" font="Regular;21"> -+ <convert type="FrontendInfo">AGC</convert> -+ </widget> -+ <eLabel name="ber" text="BER:" position="120,85" size="60,22" font="Regular;21" halign="right" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="190,85" size="260,20" pixmap="750S/bar_ber.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">BER</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="460,85" size="60,22" font="Regular;21"> -+ <convert type="FrontendInfo">BER</convert> -+ </widget> -+ <eLabel name="lock" text="Lock:" position="120,115" size="60,22" font="Regular;21" halign="right" /> -+ <widget source="Frontend" render="Pixmap" pixmap="750S/icons/lock_on.png" position="190,110" zPosition="1" size="38,31" alphatest="on"> -+ <convert type="FrontendInfo">LOCK</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="Frontend" render="Pixmap" pixmap="750S/icons/lock_off.png" position="190,110" zPosition="1" size="38,31" alphatest="on"> -+ <convert type="FrontendInfo">LOCK</convert> -+ <convert type="ConditionalShowHide">Invert</convert> -+ </widget> -+ <ePixmap pixmap="750S/div-h.png" position="10,152" zPosition="1" size="500,2" /> -+ <widget name="config" position="10,165" transparent="1" backgroundColor="#371e1c1a" size="500,240" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Scan setup --> -+ <screen name="ScanSetup" position="100,120" size="520,405" title="Service scan"> -+ <widget name="config" position="10,10" transparent="1" backgroundColor="#371e1c1a" size="500,350" scrollbarMode="showOnDemand" /> -+ <widget name="introduction" position="10,365" size="500,40" font="Regular;20" halign="center" /> -+ </screen> -+ <!-- Scan simple --> -+ <screen name="ScanSimple" position="150,130" size="420,350" title="Service scan"> -+ <widget name="header" position="10,10" size="400,25" font="Regular;23" /> -+ <widget name="config" position="10,55" transparent="1" backgroundColor="#371e1c1a" size="400,250" scrollbarMode="showOnDemand" /> -+ <widget name="footer" position="10,310" size="400,20" font="Regular;20" halign="center" /> -+ </screen> -+ <!-- Scart --> -+ <screen name="Scart" position="0,0" size="720,576" backgroundColor="transparent" /> -+ <!-- Service info --> -+ <screen name="ServiceInfo" position="0,0" size="720,576" title="Serviceinfo" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_setup_600.png" zPosition="-1" position="65,35" size="600,500" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="95,50" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel text="Main menu > Information > " position="150,70" size="230,30" font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" /> -+ <eLabel text="Serviceinfo" position="370,65" size="200,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="80,130" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="220,130" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="360,130" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="500,130" size="136,40" alphatest="on" /> -+ <widget name="red" position="100,130" zPosition="1" size="115,40" font="Regular;17" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="green" position="240,130" zPosition="1" size="115,40" font="Regular;17" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="yellow" position="380,130" zPosition="1" size="115,40" font="Regular;17" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="blue" position="520,130" zPosition="1" size="115,40" font="Regular;17" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="infolist" position="110,175" size="510,340" selectionDisabled="1" /> -+ </screen> -+ <!-- Service scan --> -+ <screen name="ServiceScan" position="150,120" size="420,390" title="Service Scan"> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-s.png" position="5,5" size="64,64" transparent="1" alphatest="blend"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">0,0</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-c.png" position="5,5" size="64,64" transparent="1" alphatest="on"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">1,1</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-t.png" position="5,5" size="64,64" transparent="1" alphatest="on"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">2,2</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget name="network" position="80,15" size="330,20" font="Regular;20" /> -+ <widget name="transponder" position="80,40" size="330,20" font="Regular;20" /> -+ <widget name="scan_state" position="10,80" zPosition="2" size="400,20" font="Regular;18" /> -+ <widget name="pass" position="10,80" size="400,20" font="Regular;18" /> -+ <widget name="scan_progress" position="10,105" size="400,15" pixmap="750S/progress_big.png" borderWidth="2" borderColor="#cccccc" /> -+ <widget name="servicelist" position="10,135" size="400,265" selectionDisabled="1" /> -+ </screen> -+ <!-- Setup --> -+ <screen name="Setup" position="0,0" size="720,576" title="Setup" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_setup_650.png" zPosition="-1" position="40,25" size="630,525" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="80,40" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel text="Main menu > Setup > System > " position="130,60" size="300,30" font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget source="Title" render="Label" position="380,55" size="220,35" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="70,110" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="210,110" size="136,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="90,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="230,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="350,110" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="490,110" size="136,40" alphatest="on" /> -+ <widget name="config" position="80,165" itemHeight="30" backgroundColor="#371e1c1a" transparent="1" size="520,360" scrollbarMode="showNever" /> -+ <eLabel text=" " position="80,192" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,222" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,252" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,282" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,312" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,342" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,372" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,402" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,432" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,462" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,492" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ <eLabel text=" " position="80,522" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ </screen> -+ <!-- Simple channelselection --> -+ <screen name="SimpleChannelSelection" position="90,120" size="550,430" title="Channel Selection"> -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="136,40" alphatest="on" /> -+ <widget name="key_red" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="key_yellow" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="key_blue" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="list" position="00,45" size="555,364" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Skin Selector --> -+ <screen name="SkinSelector" position="0,0" size="720,576" title="Choose your Skin" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_main.png" zPosition="-1" position="90,70" size="530,415" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="110,80" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel text="Main menu > Setup > System > " position="160,105" size="300,30" font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" /> -+ <eLabel text="Choose your Skin" position="405,100" size="200,35" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="480,435" size="140,40" zPosition="1" alphatest="on" /> -+ <widget source="key_red" render="Label" position="500,435" zPosition="2" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="introduction" render="Label" position="90,435" size="380,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" /> -+ <widget name="SkinList" position="98,160" size="230,250" selectionPixmap="750S/buttons/Selected_bar_230x23px.png" backgroundColor="#371e1c1a" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="Preview" position="332,210" size="280,210" alphatest="on" /> -+ </screen> -+ <!-- Sleeptimer edit --> -+ <screen name="SleepTimerEdit" position="110,215" size="520,200" title="Sleep Timer"> -+ <widget name="current_status" position="40,40" size="400,30" valign="center" font="Regular;20" /> -+ <widget name="red" pixmap="750S/buttons/button_red.png" position="2,84" size="22,22" alphatest="on" /> -+ <widget name="green" pixmap="750S/buttons/button_green.png" position="2,123" size="22,22" alphatest="on" /> -+ <widget name="yellow" pixmap="750S/buttons/button_yellow.png" position="2,163" size="22,22" alphatest="on" /> -+ <widget name="blue" pixmap="750S/buttons/button_blue.png" position="2,163" size="22,22" alphatest="on" /> -+ <widget name="red_text" position="40,80" size="400,30" valign="center" font="Regular;20" /> -+ <widget name="green_text" position="40,120" size="400,30" valign="center" font="Regular;20" /> -+ <widget name="yellow_text" position="40,160" size="400,30" valign="center" font="Regular;20" /> -+ <widget name="blue_text" position="40,200" size="400,30" valign="center" font="Regular;20" /> -+ <widget name="pretext" position="15,10" size="235,25" font="Regular;19" /> -+ <widget name="input" position="260,10" size="40,25" font="Regular;19" /> -+ <widget name="aftertext" position="305,10" size="100,25" font="Regular;19" /> -+ <ePixmap pixmap="750S/sleeptimer.png" position="390,17" size="116,142" alphatest="blend" /> -+ </screen> -+ <!-- Standby mode --> -+ <screen name="Standby" flags="wfNoBorder" position="0,0" size="720,576" title="Standby" /> -+ <!-- Start Wizard --> -+ <screen name="StartWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder"> -+ <widget name="text" position="153,50" size="340,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" transparent="1" position="50,300" size="440,200" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <widget name="config" position="50,300" size="440,200" scrollbarMode="showOnDemand" zPosition="1" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/button_red.png" position="40,227" size="22,22" alphatest="on" /> -+ <widget name="languagetext" position="66,230" size="95,30" font="Regular;18" /> -+ <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="520,50" zPosition="10" size="154,500" alphatest="blend" /> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ </screen> -+ <!-- Network Wizard --> -+ <screen name="NetworkWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="153,40" size="340,300" font="Regular;22" /> -+ <widget source="list" render="Listbox" position="53,340" size="440,180" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <widget name="config" position="53,340" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="750S/buttons/button_red.png" position="40,222" zPosition="0" size="22,22" transparent="1" alphatest="on" /> -+ <widget name="languagetext" position="66,225" size="95,30" font="Regular;18" /> -+ <widget name="rc" pixmaps="750S/rc.png,skin_default/rcold.png" position="530,50" zPosition="10" size="154,500" alphatest="blend" /> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget source="VKeyIcon" render="Pixmap" pixmap="750S/buttons/key_text.png" position="40,260" zPosition="0" size="35,25" transparent="1" alphatest="on" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget name="HelpWindow" pixmap="750S/buttons/key_text.png" position="125,170" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen>""" -+ <!-- Subservice quickzap --> -+ <screen name="SubservicesQuickzap" position="124,470" size="512,200" title="Subservices" backgroundColor="transparent" flags="wfNoBorder"> -+ <widget source="session.RecordState" render="Pixmap" pixmap="750S/icons/record.png" position="450,0" zPosition="2" size="14,14" alphatest="on" > -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ <eLabel text="Subservices" position="0,0" size="470,20" font="Regular;13" backgroundColor="#33294a6b" /> -+ <widget name="CurrentSubserviceNumber" position="0,20" size="50,34" font="Regular;22" backgroundColor="#33294a6b" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget source="session.CurrentService" render="Label" position="50,20" size="420,34" font="Regular;22" backgroundColor="#33294a6b" shadowColor="black" shadowOffset="-1,-1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ </screen> -+ <!-- Subtitle selection --> -+ <screen name="Subtitles" position="170,150" size="380,285" title="Subtitle selection"> -+ <widget name="config" position="10,10" backgroundColor="#371e1c1a" transparent="1" zPosition="1" size="360,275" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Subtitle area --> -+ <screen name="SubtitleDisplay" position="0,0" size="720,576" zPosition="-1" flags="wfNoBorder" backgroundColor="transparent" /> -+ <!-- Time & date input --> -+ <screen name="TimeDateInput" position="160,150" size="400,200" title="Time/Date Input"> -+ <widget name="cancel" pixmap="750S/buttons/red.png" position="10,0" size="136,40" alphatest="on" /> -+ <widget name="ok" pixmap="750S/buttons/green.png" position="260,0" size="136,40" alphatest="on" /> -+ <widget name="canceltext" position="30,0" zPosition="1" size="115,40" font="Regular;19" halign="center" valign="center" transparent="1" /> -+ <widget name="oktext" position="280,0" zPosition="1" size="115,40" font="Regular;19" halign="center" valign="center" transparent="1" /> -+ <widget name="config" position="10,40" transparent="1" size="380,150" /> -+ </screen> -+ <!-- Timer edit --> -+ <screen name="TimerEdit" position="70,130" size="590,335" title="Timer Edit"> -+ <widget name="description" position="10,10" size="580,40" font="Regular;25" /> -+ <widget name="lbegin" position="405,102" size="103,30" font="Regular;25" foregroundColor="red" /> -+ <widget name="lend" position="405,158" size="103,30" font="Regular;25" foregroundColor="green" /> -+ <widget name="begin" position="508,105" size="72,35" font="Regular;25" /> -+ <widget name="end" position="508,150" size="72,35" font="Regular;25" /> -+ <widget name="apply" position="10,240" size="250,35" /> -+ </screen> -+ <!-- Timer edit list --> -+ <screen name="TimerEditList" position="0,0" size="720,576" title="Timer Editor" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_setup_650.png" zPosition="-1" position="48,20" size="630,525" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_timerlist.png" position="80,35" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel name="title1" position="140,45" size="200,30" text="Timer List" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="80,100" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="220,100" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="360,100" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="500,100" size="136,40" alphatest="on" /> -+ <widget name="key_red" position="100,100" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="240,100" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="key_yellow" position="380,100" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="key_blue" position="520,100" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="timerlist" position="80,160" transparent="1" size="555,350" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Timer entry --> -+ <screen name="TimerEntry" position="0,0" size="720,576" title="Timer entry" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="750S/bg_setup_650.png" zPosition="-1" position="48,20" size="630,525" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="750S/icons/icon_timerlist.png" position="80,35" size="44,44" alphatest="blend" transparent="1" /> -+ <eLabel name="title1" position="130,50" size="200,30" text="Timer entry" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" /> -+ <widget name="cancel" pixmap="750S/buttons/red.png" position="80,100" size="136,40" alphatest="on" /> -+ <widget name="ok" pixmap="750S/buttons/green.png" position="220,100" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="360,100" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="500,100" size="136,40" alphatest="on" /> -+ <widget name="canceltext" position="100,100" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;21" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="oktext" position="240,100" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;21" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="config" position="90,145" transparent="1" backgroundColor="#371e1c1a" size="520,385" scrollbarMode="showOnDemand" /> -+ <eLabel text=" " position="80,382" zPosition="-1" size="540,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" /> -+ </screen> -+ <!-- Timer log --> -+ <screen name="TimerLog" position="90,120" size="550,380" title="Timer log"> -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="136,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="136,40" alphatest="on" /> -+ <widget name="key_red" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="key_yellow" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="key_blue" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="loglist" position="0,45" size="555,250" scrollbarMode="showOnDemand" /> -+ <widget name="logentry" position="0,300" size="555,130" font="Regular;20" /> -+ </screen> -+ <!-- Timer sanity conflict --> -+ <screen name="TimerSanityConflict" position="90,120" size="550,430" title="Timer sanity error"> -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" zPosition="0" size="136,40" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" zPosition="0" size="136,40" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="0,120" zPosition="0" size="136,40" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="140,120" zPosition="0" size="136,40" transparent="1" alphatest="on" /> -+ <widget name="key_red" position="20,0" zPosition="1" size="115,40" font="Regular;20" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_green" position="160,0" zPosition="1" size="115,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="key_yellow" position="20,120" zPosition="1" size="115,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="key_blue" position="160,120" zPosition="1" size="115,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="timer1" position="0,45" size="555,75" scrollbarMode="showNever" /> -+ <widget name="timer2" position="0,165" size="555,75" scrollbarMode="showNever" /> -+ <widget name="list" position="0,260" size="555,144" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Timer Selection --> -+ <screen name="TimerSelection" position="90,120" size="550,430" title="Timer selection"> -+ <widget name="timerlist" position="0,45" size="550,350" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Timeshift state --> -+ <screen name="TimeshiftState" position="70,70" zPosition="2" size="150,60" backgroundColor="transpBlack" flags="wfNoBorder"> -+ <widget name="state" position="0,0" size="150,30" font="Regular;25" halign="center" backgroundColor="transpBlack" /> -+ <widget source="session.CurrentService" render="Label" position="0,30" size="150,30" font="Regular;25" halign="center" foregroundColor="white" backgroundColor="transpBlack"> -+ <convert type="ServicePosition">Remaining</convert> -+ </widget> -+ </screen> -+ <!-- Translator Info --> -+ <screen name="TranslationInfo" position="150,130" size="420,350" title="Translation"> -+ <eLabel position="10,20" size="380,23" font="Regular;23" text="Translation:" /> -+ <widget source="TranslatorName" render="Label" position="10,55" size="380,20" font="Regular;20" /> -+ <widget source="TranslationInfo" render="Label" position="10,100" size="380,250" font="Regular;20" /> -+ </screen> -+ <!-- Tutorial Wizard --> -+ <screen name="TutorialWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder"> -+ <widget name="text" position="50,100" size="440,200" font="Regular;23" /> -+ <widget name="list" position="50,300" zPosition="1" size="440,200" /> -+ <widget name="rc" pixmap="750S/rc.png" position="520,600" zPosition="10" size="154,475" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="0,0" zPosition="11" size="37,70" alphatest="blend"/> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend"/> -+ </screen> -+ <!-- Volumebar --> -+ <screen name="Volume" position="92,40" zPosition="1" size="539,44" title="Volume" flags="wfNoBorder" > -+ <ePixmap pixmap="750S/volume.png" position="0,0" size="539,44" /> -+ <widget name="Volume" pixmap="750S/volume_box.png" position="70,16" zPosition="1" size="452,12" transparent="1" /> -+ </screen> -+ <screen name="JobView" position="84,122" size="520,350" title="Job View"> -+ <widget source="job_name" render="Label" position="20,12" size="480,60" font="Regular;28" /> -+ <widget source="job_task" render="Label" position="20,90" size="480,50" font="Regular;23" /> -+ <widget source="job_progress" render="Progress" position="20,162" size="480,36" borderWidth="2" backgroundColor="#254f7497" /> -+ <widget source="job_progress" render="Label" position="120,166" size="280,32" font="Regular;28" foregroundColor="#000000" zPosition="2" halign="center" transparent="1" > -+ <convert type="ProgressToText" /> -+ </widget> -+ <widget source="job_status" render="Label" position="20,212" size="480,26" font="Regular;23" /> -+ <widget name="config" position="20,254" size="480,20" /> -+ <widget source="cancelable" render="Pixmap" pixmap="750S/buttons/red.png" position="20,300" size="136,40" alphatest="on" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="cancelable" render="FixedLabel" text="Cancel" position="40,300" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="finished" render="Pixmap" pixmap="750S/buttons/green.png" position="190,300" size="136,40" alphatest="on" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="finished" render="FixedLabel" text="OK" font="Regular;20" halign="center" valign="center" position="210,300" size="115,40" transparent="1" backgroundColor="#1f771f" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="backgroundable" render="Pixmap" pixmap="750S/buttons/blue.png" position="360,300" size="136,40" alphatest="on" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="backgroundable" render="FixedLabel" text="Continue in background" font="Regular;20" halign="center" valign="center" position="380,300" size="115,40" transparent="1" backgroundColor="#18188b" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ </screen> -+ <!-- VirtualKeyBoard --> -+ <screen name="VirtualKeyBoard" position="center,center" size="560,350" zPosition="99" title="Virtual KeyBoard"> -+ <ePixmap pixmap="skin_default/vkey_text.png" position="9,35" zPosition="-4" size="542,52" alphatest="on" /> -+ <widget name="header" position="10,10" size="500,20" font="Regular;20" transparent="1" noWrap="1" /> -+ <widget name="text" position="12,35" size="536,46" font="Regular;46" transparent="1" noWrap="1" halign="right" /> -+ <widget name="list" position="10,100" size="540,225" selectionDisabled="1" transparent="1" /> -+ </screen> -+ <!-- FileBrowser --> -+ <screen name="FileBrowser" position="center,120" size="520,420" title="DVD File Browser" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="filelist" position="5,50" size="510,370" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="CutListEditor" position="0,0" size="720,576" title="Cutlist editor" flags="wfNoBorder"> -+ <eLabel text="Cutlist editor" position="65,60" size="300,25" font="Regular;20" /> -+ <widget source="global.CurrentTime" render="Label" position="268,60" size="394,20" font="Regular;20" halign="right"> -+ <convert type="ClockToText">Format:%A %B %d, %H:%M</convert> -+ </widget> -+ <eLabel position="268,98" size="394,304" backgroundColor="#505555" /> -+ <widget name="Video" position="270,100" zPosition="1" size="390,300" backgroundColor="transparent" /> -+ <widget source="session.CurrentService" render="Label" position="135,405" size="450,50" font="Regular;22" halign="center" valign="center"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Label" position="320,450" zPosition="1" size="420,25" font="Regular;20" halign="left" valign="center"> -+ <convert type="ServicePosition">Position,Detailed</convert> -+ </widget> -+ <widget name="SeekState" position="210,450" zPosition="1" size="100,25" halign="right" font="Regular;20" valign="center" /> -+ <eLabel position="48,98" size="204,274" backgroundColor="#505555" /> -+ <eLabel position="50,100" size="200,270" backgroundColor="#000000" /> -+ <widget source="cutlist" position="50,100" zPosition="1" size="200,270" scrollbarMode="showOnDemand" transparent="1" render="Listbox" > -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(size=(125, 20), text = 1, backcolor = MultiContentTemplateColor(3)), -+ MultiContentEntryText(pos=(125,0), size=(50, 20), text = 2, flags = RT_HALIGN_RIGHT, backcolor = MultiContentTemplateColor(3)) -+ ], -+ "fonts": [gFont("Regular", 18)], -+ "itemHeight": 20 -+ } -+ </convert> -+ </widget> -+ <widget name="Timeline" position="50,485" size="615,20" backgroundColor="#505555" pointer="750S/position_arrow.png:3,5" foregroundColor="black" /> -+ <ePixmap pixmap="750S/icons/mp_buttons.png" position="275,515" size="169,30" alphatest="blend" /> -+ </screen> -+ <screen name="DVDToolbox" position="center,120" size="560,420" title="DVD media toolbox" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="info" render="Label" position="20,50" size="520,100" font="Regular;20" /> -+ <widget name="details" position="20,180" size="520,200" font="Regular;16" /> -+ <widget source="space_bar" render="Progress" position="10,390" size="540,26" borderWidth="1" backgroundColor="#254f7497" /> -+ <widget source="space_label" render="Label" position="20,394" size="520,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" /> -+ </screen> -+ <screen name="ProjectSettings" position="center,120" size="560,420" title="Collection settings" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="config" position="5,50" size="550,276" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,330" zPosition="1" size="560,2" /> -+ <widget source="info" render="Label" position="10,340" size="550,80" font="Regular;18" halign="center" valign="center" /> -+ </screen> -+ <screen name="TitleList" position="center,120" size="560,425" title="DVD Tool" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="15,0" zPosition="1" size="120,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="155,0" zPosition="1" size="120,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="435,0" zPosition="1" size="120,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget source="title_label" render="Label" position="10,48" size="540,38" font="Regular;18" transparent="1" /> -+ <widget source="error_label" render="Label" position="10,48" size="540,340" zPosition="3" font="Regular;20" transparent="1" /> -+ <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="10,86" size="540,277" zPosition="3" transparent="1" > -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (0, 0), size = (420, 20), font = 0, flags = RT_HALIGN_LEFT, text = 1), # index 1 Title, -+ MultiContentEntryText(pos = (0, 20), size = (328, 17), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 description, -+ MultiContentEntryText(pos = (420, 6), size = (120, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 3), # index 3 begin time, -+ MultiContentEntryText(pos = (328, 20), size = (154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 channel, -+ MultiContentEntryText(pos = (482, 20), size = (58, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # index 4 channel, -+ ], -+ "fonts": [gFont("Regular", 20), gFont("Regular", 14)], -+ "itemHeight": 37 -+ } -+ </convert> -+ </widget> -+ <widget source="space_bar" render="Progress" position="10,390" size="540,26" borderWidth="1" backgroundColor="#254f7497" /> -+ <widget source="space_label" render="Label" position="40,394" size="480,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" /> -+ </screen> -+ <screen name="DVDMovieSelection" position="center,120" size="560,425" title="Select a movie"> -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="waitingtext" position="0,45" size="560,375" zPosition="4" font="Regular;22" halign="center" valign="center" /> -+ <widget name="list" position="5,40" size="550,355" zPosition="2" scrollbarMode="showOnDemand" /> -+ <widget name="DescriptionBorder" pixmap="750S/border_eventinfo.png" position="0,296" zPosition="1" size="560,103" transparent="1" alphatest="on" /> -+ <widget source="Service" render="Label" position="5,298" zPosition="1" size="480,35" font="Regular;17" foregroundColor="#cccccc"> -+ <convert type="MovieInfo">ShortDescription</convert> -+ </widget> -+ <widget source="Service" render="Label" position="495,298" zPosition="1" size="60,22" font="Regular;17" halign="right"> -+ <convert type="ServiceTime">Duration</convert> -+ <convert type="ClockToText">AsLength</convert> -+ </widget> -+ <widget source="Service" render="Label" position="380,317" zPosition="2" size="175,22" font="Regular;17" halign="right"> -+ <convert type="MovieInfo">RecordServiceName</convert> -+ </widget> -+ <widget source="Service" render="Label" position="5,337" zPosition="1" size="550,58" font="Regular;19"> -+ <convert type="EventName">ExtendedDescription</convert> -+ </widget> -+ <widget name="freeDiskSpace" position="10,405" size="540,20" font="Regular;19" valign="center" halign="right" /> -+ </screen> -+ <screen name="TitleProperties" position="center,120" size="560,425" title="Properties of current title" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget source="serviceinfo" render="Label" position="10,46" size="350,144" font="Regular;18" /> -+ <widget name="thumbnail" position="370,46" size="180,144" alphatest="on" /> -+ <widget name="config" position="10,196" size="540,228" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="DVDPlayer" flags="wfNoBorder" position="0,380" size="720,165" title="InfoBar" backgroundColor="transparent" > -+ <!-- Background --> -+ <ePixmap position="40,0" pixmap="750S/info-bg_mp.png" zPosition="-1" size="640,164" /> -+ <!-- colorbuttons --> -+ <ePixmap position="275,125" pixmap="750S/icons/mp_buttons.png" size="169,30" alphatest="blend" /> -+ <!-- Servicename --> -+ <ePixmap pixmap="750S/icons/icon_event.png" position="65,30" zPosition="1" size="15,10" alphatest="on" /> -+ <widget source="session.CurrentService" render="Label" position="95,25" size="300,22" font="Regular;20" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" noWrap="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <!-- Chapter info --> -+ <widget name="chapterLabel" position="95,50" size="360,22" font="Regular;20" foregroundColor="#c3c3c9" backgroundColor="#263c59" transparent="1" /> -+ <!-- Audio track info --> -+ <ePixmap pixmap="750S/icons/icon_dolby.png" position="540,25" zPosition="1" size="26,16" alphatest="on"/> -+ <widget name="audioLabel" position="570,25" size="130,22" font="Regular;18" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" /> -+ <!-- Subtitle track info --> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="750S/icons/icon_txt.png" position="540,45" zPosition="1" size="26,16" alphatest="on" > -+ <convert type="ServiceInfo">HasTelext</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget name="subtitleLabel" position="570,45" size="130,22" font="Regular;18" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" /> -+ <!-- Angle info --> -+ <widget name="anglePix" pixmap="750S/icons/icon_view.png" position="540,70" size="26,16" alphatest="on" /> -+ <widget name="angleLabel" position="570,70" size="130,22" font="Regular;18" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" /> -+ <!-- Elapsed time --> -+ <widget source="session.CurrentService" render="Label" position="40,100" size="90,20" font="Regular;18" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" > -+ <convert type="ServicePosition">Position,ShowHours</convert> -+ </widget> -+ <!-- Progressbar (movie position)--> -+ <widget source="session.CurrentService" render="PositionGauge" position="130,105" size="460,10" zPosition="2" pointer="750S/position_pointer.png:460,0" transparent="1" > -+ <convert type="ServicePosition">Gauge</convert> -+ </widget> -+ <!-- Remaining time --> -+ <widget source="session.CurrentService" render="Label" position="590,100" size="90,20" font="Regular;18" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" > -+ <convert type="ServicePosition">Remaining,Negate,ShowHours</convert> -+ </widget> -+ </screen> -+ <screen name="ModemSetup" position="180,100" size="320,300" title="Modem" > -+ <ePixmap pixmap="750S/buttons/green.png" position="10,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/red.png" position="160,10" size="140,40" alphatest="on" /> -+ <widget name="key_green" position="30,10" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_red" position="180,10" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="list" position="10,60" size="300,120" /> -+ <widget name="state" position="10,210" size="300,80" font="Regular;20" /> -+ </screen> -+ <screen name="picshow" position="center,120" size="560,420" title="PicturePlayer" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget source="label" render="Label" position="5,55" size="350,140" font="Regular;19" backgroundColor="#25062748" transparent="1" /> -+ <widget name="thn" position="360,40" size="180,160" alphatest="on" /> -+ <widget name="filelist" position="5,205" zPosition="2" size="550,210" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="Pic_Exif" position="center,center" size="560,360" title="Info" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="menu" render="Listbox" position="5,50" size="550,310" scrollbarMode="showOnDemand" selectionDisabled="1" > -+ <convert type="TemplatedMultiContent"> -+ { -+ "template": [ MultiContentEntryText(pos = (5, 5), size = (250, 30), flags = RT_HALIGN_LEFT, text = 0), MultiContentEntryText(pos = (260, 5), size = (290, 30), flags = RT_HALIGN_LEFT, text = 1)], -+ "fonts": [gFont("Regular", 20)], -+ "itemHeight": 30 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="CleanupWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="153,40" size="380,330" font="Regular;22" /> -+ <widget source="list" render="Listbox" position="43,300" size="460,220" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <widget name="config" position="53,340" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="750S/buttons/button_red.png" position="40,222" zPosition="0" size="22,22" transparent="1" alphatest="on" /> -+ <widget name="languagetext" position="66,225" size="95,30" font="Regular;18" /> -+ <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="530,50" zPosition="10" size="154,500" alphatest="on" /> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" /> -+ <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" /> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" /> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" /> -+ </screen> -+ <screen name="CleanupWizardConfiguration" position="center,120" size="560,420" title="CleanupWizard settings" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="config" zPosition="2" position="5,50" size="550,300" scrollbarMode="showOnDemand" transparent="1" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="10" size="560,2" transparent="1" alphatest="on" /> -+ <widget source="status" render="Label" position="10,380" size="540,40" zPosition="10" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/> -+ </screen> -+ <screen name="CIselectMainMenu" position="center,center" size="500,250" title="CI assignment" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="CiList" position="5,50" size="490,200" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="CIconfigMenu" position="center,120" size="560,420" title="CI assignment" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget source="CAidList_desc" render="Label" position="5,50" size="550,22" font="Regular;20" backgroundColor="#25062748" transparent="1" /> -+ <widget source="CAidList" render="Label" position="5,80" size="550,45" font="Regular;20" backgroundColor="#25062748" transparent="1" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,125" zPosition="1" size="560,2" /> -+ <widget source="ServiceList_desc" render="Label" position="5,130" size="550,22" font="Regular;20" backgroundColor="#25062748" transparent="1" /> -+ <widget name="ServiceList" position="5,160" size="550,250" zPosition="1" scrollbarMode="showOnDemand" /> -+ <widget source="ServiceList_info" render="Label" position="5,160" size="550,250" zPosition="2" font="Regular;20" backgroundColor="#25062748" transparent="1" /> -+ </screen> -+ <screen name="easyCIconfigMenu" position="center,120" size="560,420" title="CI assignment" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="ServiceList_desc" render="Label" position="5,50" size="550,22" font="Regular;20" backgroundColor="#25062748" transparent="1" /> -+ <widget name="ServiceList" position="5,80" size="550,300" zPosition="1" scrollbarMode="showOnDemand" /> -+ <widget source="ServiceList_info" render="Label" position="5,80" size="550,300" zPosition="2" font="Regular;20" backgroundColor="#25062748" transparent="1" /> -+ </screen> -+ <screen name="CAidSelect" position="center,120" size="450,420" title="select CAId's" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="list" position="5,50" size="440,310" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="1" size="450,2" /> -+ <widget source="introduction" render="Label" position="0,380" size="450,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" /> -+ </screen> -+ <screen name="myProviderSelection" position="center,120" size="560,420" title="Select provider to add..."> -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="list" position="5,50" size="550,310" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="1" size="560,2" /> -+ <widget source="introduction" render="Label" position="0,380" size="560,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" /> -+ </screen> -+ <screen name="myChannelSelection" position="center,120" size="560,420" title="Select service to add..."> -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="list" position="5,50" size="550,310" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="1" size="560,2" /> -+ <widget source="introduction" render="Label" position="0,380" size="560,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" /> -+ </screen> -+ <screen name="CrashlogAutoSubmitConfiguration" position="center,120" size="560,420" title="CrashlogAutoSubmit settings" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="config" zPosition="2" position="5,50" size="550,300" scrollbarMode="showOnDemand" transparent="1" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,360" zPosition="10" size="560,2" transparent="1" alphatest="on" /> -+ <widget source="status" render="Label" position="10,370" size="540,40" zPosition="10" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/> -+ <widget name="VKeyIcon" pixmap="750S/buttons/key_text.png" position="10,390" zPosition="10" size="35,25" transparent="1" alphatest="on" /> -+ <widget name="HelpWindow" pixmap="750S/vkey_icon.png" position="160,300" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen> -+ <screen name="DefaultServiceScan" position="150,115" size="420,390" title="Service Scan"> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-s.png" position="5,5" size="64,64" transparent="1" alphatest="blend"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">0,0</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-c.png" position="5,5" size="64,64" transparent="1" alphatest="on"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">1,1</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-t.png" position="5,5" size="64,64" transparent="1" alphatest="on"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">2,2</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget name="network" position="80,15" size="330,20" font="Regular;20" /> -+ <widget name="transponder" position="80,40" size="330,20" font="Regular;20" /> -+ <widget name="scan_state" position="10,80" zPosition="2" size="400,20" font="Regular;18" /> -+ <widget name="pass" position="10,80" size="400,20" font="Regular;18" /> -+ <widget name="scan_progress" position="10,105" size="400,15" pixmap="750S/progress_big.png" borderWidth="2" borderColor="#cccccc" /> -+ <widget name="servicelist" position="10,135" size="400,265" selectionDisabled="1" /> -+ </screen> -+ <screen name="DiseqcTester" position="90,100" size="520,400" title="DiSEqC Tester" > -+ <!--ePixmap pixmap="750S/icons/dish_scan.png" position="5,25" zPosition="0" size="119,110" transparent="1" alphatest="on" /> -+ <widget source="Frontend" render="Label" position="190,10" zPosition="2" size="260,20" font="Regular;19" halign="center" valign="center" transparent="1"> -+ <convert type="FrontendInfo">SNRdB</convert> -+ </widget> -+ <eLabel name="snr" text="SNR:" position="120,35" size="60,22" font="Regular;21" halign="right" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="190,35" size="260,20" pixmap="750S/bar_snr.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">SNR</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="460,35" size="60,22" font="Regular;21"> -+ <convert type="FrontendInfo">SNR</convert> -+ </widget> -+ <eLabel name="agc" text="AGC:" position="120,60" size="60,22" font="Regular;21" halign="right" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="190,60" size="260,20" pixmap="750S/bar_snr.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">AGC</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="460,60" size="60,22" font="Regular;21"> -+ <convert type="FrontendInfo">AGC</convert> -+ </widget> -+ <eLabel name="ber" text="BER:" position="120,85" size="60,22" font="Regular;21" halign="right" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="190,85" size="260,20" pixmap="750S/bar_ber.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">BER</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="460,85" size="60,22" font="Regular;21"> -+ <convert type="FrontendInfo">BER</convert> -+ </widget> -+ <eLabel name="lock" text="Lock:" position="120,115" size="60,22" font="Regular;21" halign="right" /> -+ <widget source="Frontend" render="Pixmap" pixmap="750S/icons/lock_on.png" position="190,110" zPosition="1" size="38,31" alphatest="on"> -+ <convert type="FrontendInfo">LOCK</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="Frontend" render="Pixmap" pixmap="skin_default/icons/lock_off.png" position="190,110" zPosition="1" size="38,31" alphatest="on"> -+ <convert type="FrontendInfo">LOCK</convert> -+ <convert type="ConditionalShowHide">Invert</convert> -+ </widget--> -+ <widget source="progress_list" render="Listbox" position="0,0" size="510,150" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (10, 0), size = (330, 25), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the index name, -+ MultiContentEntryText(pos = (330, 0), size = (150, 25), flags = RT_HALIGN_RIGHT, text = 2) # index 2 is the status, -+ ], -+ "fonts": [gFont("Regular", 20)], -+ "itemHeight": 25 -+ } -+ </convert> -+ </widget> -+ <eLabel name="overall_progress" text="Overall progress:" position="20,162" size="480,22" font="Regular;21" halign="center" transparent="1" /> -+ <widget source="overall_progress" render="Progress" position="20,192" size="480,20" borderWidth="2" backgroundColor="#254f7497" /> -+ <eLabel name="overall_progress" text="Progress:" position="20,222" size="480,22" font="Regular;21" halign="center" transparent="1" /> -+ <widget source="sub_progress" render="Progress" position="20,252" size="480,20" borderWidth="2" backgroundColor="#254f7497" /> -+ -+ <eLabel name="" text="Failed:" position="20,282" size="140,22" font="Regular;21" halign="left" transparent="1" /> -+ <widget source="failed_counter" render="Label" position="160,282" size="100,20" font="Regular;21" /> -+ -+ <eLabel name="" text="Succeeded:" position="20,312" size="140,22" font="Regular;21" halign="left" transparent="1" /> -+ <widget source="succeeded_counter" render="Label" position="160,312" size="100,20" font="Regular;21" /> -+ -+ <eLabel name="" text="With errors:" position="20,342" size="140,22" font="Regular;21" halign="left" transparent="1" /> -+ <widget source="witherrors_counter" render="Label" position="160,342" size="100,20" font="Regular;21" /> -+ -+ <eLabel name="" text="Not tested:" position="20,372" size="140,22" font="Regular;21" halign="left" transparent="1" /> -+ <widget source="untestable_counter" render="Label" position="160,372" size="100,20" font="Regular;21" /> -+ -+ <widget source="CmdText" render="Label" position="300,282" size="180,200" font="Regular;21" /> -+ </screen> -+ <screen name="DiseqcTesterNimSelection" position="160,123" size="400,330" title="Choose Tuner"> -+ <widget source="nimlist" render="Listbox" position="0,0" size="380,300" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (10, 5), size = (360, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name, -+ MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings, -+ ], -+ "fonts": [gFont("Regular", 20), gFont("Regular", 15)], -+ "itemHeight": 70 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="FPUpgrade" position="150,200" size="450,200" title="FP upgrade required" > -+ <widget name="text" position="0,0" size="550,50" font="Regular;20" /> -+ <widget name="oldversion_label" position="10,100" size="290,25" font="Regular;20" /> -+ <widget name="newversion_label" position="10,125" size="290,25" font="Regular;20" /> -+ <widget name="oldversion" position="300,100" size="50,25" font="Regular;20" /> -+ <widget name="newversion" position="300,125" size="50,25" font="Regular;20" /> -+ </screen> -+ <screen name="SystemMessage" position="150,200" size="450,200" title="System Message" > -+ <widget source="text" position="0,0" size="450,200" font="Regular;20" halign="center" valign="center" render="Label" /> -+ <ePixmap pixmap="750S/icons/input_error.png" position="5,5" size="53,53" alphatest="on" /> -+ </screen> -+ <screen name="NFIDownload" position="90,95" size="560,420" title="Image download utility"> -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#18188b" transparent="1" /> -+ -+ <widget source="label_top" render="Label" position="10,44" size="240,20" font="Regular;16" /> -+ <widget name="feedlist" position="10,66" size="250,222" scrollbarMode="showOnDemand" /> -+ <widget name="destlist" position="0,66" size="260,222" scrollbarMode="showOnDemand" /> -+ -+ <widget source="label_bottom" render="Label" position="10,312" size="240,18" font="Regular;16"/> -+ <widget source="path_bottom" render="Label" position="10,330" size="250,42" font="Regular;18" /> -+ -+ <widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" /> -+ <widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" /> -+ <widget source="job_progresslabel" render="Label" position="130,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="300,22" foregroundColor="#000000" /> -+ <widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" /> -+ </screen> -+ <screen name="NFIFlash" position="90,95" size="560,420" title="Image flash utility"> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> -+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget source="listlabel" render="Label" position="16,44" size="200,21" valign="center" font="Regular;18" /> -+ <widget name="filelist" position="0,68" size="260,260" scrollbarMode="showOnDemand" /> -+ <widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" /> -+ <widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" /> -+ <widget source="job_progresslabel" render="Label" position="180,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="200,22" foregroundColor="#000000" /> -+ <widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" /> -+ </screen> -+ <screen name="BackupSelection" position="center,130" size="560,400" title="Select files/folders to backup"> -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="checkList" position="5,50" size="550,250" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="RestoreMenu" position="center,130" size="560,400" title="Restore backups" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="filelist" position="5,50" size="550,230" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="ImageWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="153,40" size="340,330" font="Regular;22" /> -+ <widget source="list" render="Listbox" position="43,340" size="490,180" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <widget name="config" position="53,340" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="750S/buttons/button_red.png" position="33,222" zPosition="0" size="22,22" transparent="1" alphatest="on" /> -+ <widget name="languagetext" position="55,225" size="95,30" font="Regular;18" /> -+<!-- <widget name="wizard" pixmap="skin_default/wizard.png" position="40,50" zPosition="10" size="110,174" alphatest="on" /> --> -+ <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="530,50" zPosition="10" size="154,500" alphatest="blend" /> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ </screen> -+ <screen name="UpdatePluginMenu" position="center,120" size="610,410" title="Software management" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <ePixmap pixmap="750S/border_menu_350.png" position="5,50" zPosition="1" size="350,300" transparent="1" alphatest="on" /> -+ <widget source="menu" render="Listbox" position="15,60" size="330,290" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (2, 2), size = (330, 24), flags = RT_HALIGN_LEFT, text = 1), # index 0 is the MenuText, -+ ], -+ "fonts": [gFont("Regular", 22)], -+ "itemHeight": 25 -+ } -+ </convert> -+ </widget> -+ <widget source="menu" render="Listbox" position="360,50" size="240,300" scrollbarMode="showNever" selectionDisabled="1"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (2, 2), size = (240, 300), flags = RT_HALIGN_CENTER|RT_VALIGN_CENTER|RT_WRAP, text = 2), # index 2 is the Description, -+ ], -+ "fonts": [gFont("Regular", 22)], -+ "itemHeight": 300 -+ } -+ </convert> -+ </widget> -+ <widget source="status" render="Label" position="5,360" zPosition="10" size="600,50" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ </screen> -+ <screen name="PluginManager" position="center,120" size="560,420" title="Extensions management" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget source="list" render="Listbox" position="5,50" size="550,340" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"templates": -+ {"default": (51,[ -+ MultiContentEntryText(pos = (30, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (30, 25), size = (470, 24), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description -+ MultiContentEntryPixmapAlphaTest(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap -+ MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap -+ ]), -+ "category": (40,[ -+ MultiContentEntryText(pos = (30, 0), size = (500, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (30, 22), size = (500, 16), font=2, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description -+ MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (550, 2), png = 3), # index 3 is the div pixmap -+ ]) -+ }, -+ "fonts": [gFont("Regular", 22),gFont("Regular", 20),gFont("Regular", 16)], -+ "itemHeight": 52 -+ } -+ </convert> -+ </widget> -+ <widget source="status" render="Label" position="5,390" zPosition="10" size="540,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ </screen> -+ <screen name="PluginManagerInfo" position="center,120" size="560,420" title="Plugin manager activity information" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="list" render="Listbox" position="5,60" size="550,300" scrollbarMode="showOnDemand" selectionDisabled="1"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (50, 0), size = (150, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state -+ MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap -+ MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap -+ ], -+ "fonts": [gFont("Regular", 24),gFont("Regular", 22)], -+ "itemHeight": 50 -+ } -+ </convert> -+ </widget> -+ <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="10" size="560,2" transparent="1" alphatest="on" /> -+ <widget source="status" render="Label" position="5,375" zPosition="10" size="550,44" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ </screen> -+ <screen name="PluginManagerHelp" position="center,120" size="560,420" title="Plugin manager help" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="list" render="Listbox" position="5,60" size="550,300" scrollbarMode="showOnDemand" selectionDisabled="1"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (50, 0), size = (540, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state -+ MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap -+ MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap -+ ], -+ "fonts": [gFont("Regular", 24),gFont("Regular", 22)], -+ "itemHeight": 50 -+ } -+ </convert> -+ </widget> -+ <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="10" size="560,2" transparent="1" alphatest="on" /> -+ <widget source="status" render="Label" position="5,375" zPosition="10" size="550,44" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ </screen> -+ <screen name="PluginDetails" position="center,120" size="600,420" title="Plugin details" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="author" render="Label" position="10,50" size="500,25" zPosition="10" font="Regular;21" transparent="1" /> -+ <widget name="statuspic" position="550,40" size="48,48" alphatest="on"/> -+ <widget name="divpic" position="0,80" size="600,2" alphatest="on"/> -+ <widget name="detailtext" position="10,90" size="270,330" zPosition="10" font="Regular;21" transparent="1" halign="left" valign="top"/> -+ <widget name="screenshot" position="290,90" size="300,330" alphatest="on"/> -+ </screen> -+ <screen name="UpdatePlugin" position="center,center" size="550,200" title="Software update" > -+ <widget name="activityslider" position="0,0" size="550,5" /> -+ <widget name="slider" position="0,150" size="550,30" /> -+ <widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" /> -+ <widget source="status" render="Label" position="10,60" size="540,45" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" /> -+ </screen> -+ <screen name="IPKGMenu" position="center,130" size="560,400" title="Select upgrade source to edit." > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="filelist" position="5,50" size="550,340" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="IPKGSource" position="center,center" size="560,80" title="Edit upgrade source url." > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="text" position="5,50" size="550,25" font="Regular;20" backgroundColor="background" foregroundColor="#cccccc" /> -+ </screen> -+ <screen name="PacketManager" position="center,120" size="530,420" title="Packet manager" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="list" render="Listbox" position="5,50" size="520,365" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (5, 1), size = (440, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (5, 26), size = (440, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description -+ MultiContentEntryPixmapAlphaTest(pos = (445, 2), size = (48, 48), png = 4), # index 4 is the status pixmap -+ MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (510, 2), png = 5), # index 4 is the div pixmap -+ ], -+ "fonts": [gFont("Regular", 22),gFont("Regular", 14)], -+ "itemHeight": 52 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="IpkgInstaller" position="center,120" size="550,420" title="Install extensions" > -+ <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="list" position="5,50" size="540,330" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,380" zPosition="10" size="560,2" transparent="1" alphatest="on" /> -+ <widget source="introduction" render="Label" position="5,390" zPosition="10" size="550,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ </screen> -+ <screen name="VideoWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="153,50" size="340,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" position="200,300" size="290,200" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <widget name="config" position="50,300" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" /> -+<!-- <widget name="wizard" pixmap="skin_default/wizard.png" position="40,50" zPosition="10" size="110,174" transparent="1" alphatest="on"/> --> -+ <ePixmap pixmap="750S/buttons/button_red.png" position="33,222" zPosition="0" size="22,22" transparent="1" alphatest="on" /> -+ <widget name="languagetext" position="55,225" size="95,30" font="Regular;18" /> -+ <widget name="portpic" position="50,300" zPosition="10" size="150,150" transparent="1" alphatest="on"/> -+ <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="500,50" zPosition="10" size="154,500" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="750S/arrowdown.png" position="0,0" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="0,0" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <screen name="LocationBox" position="100,75" size="540,460" > -+ <widget name="text" position="0,2" size="540,22" font="Regular;22" /> -+ <widget name="target" position="0,23" size="540,22" valign="center" font="Regular;22" /> -+ <widget name="filelist" position="0,55" zPosition="1" size="540,210" scrollbarMode="showOnDemand" selectionDisabled="1" /> -+ <widget name="textbook" position="0,272" size="540,22" font="Regular;22" /> -+ <widget name="booklist" position="5,302" zPosition="2" size="535,100" scrollbarMode="showOnDemand" /> -+ <widget name="red" position="0,415" zPosition="1" size="135,40" pixmap="750S/buttons/red.png" transparent="1" alphatest="on" /> -+ <widget name="key_red" position="20,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="green" position="135,415" zPosition="1" size="135,40" pixmap="750S/buttons/green.png" transparent="1" alphatest="on" /> -+ <widget name="key_green" position="155,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="yellow" position="270,415" zPosition="1" size="135,40" pixmap="750S/buttons/yellow.png" transparent="1" alphatest="on" /> -+ <widget name="key_yellow" position="290,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="blue" position="405,415" zPosition="1" size="135,40" pixmap="750S/buttons/blue.png" transparent="1" alphatest="on" /> -+ <widget name="key_blue" position="425,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ </screen> -+ <!-- LCD/OLED Screens --> -+ -+ <!-- LCD screen (channelselection) --> -+ <screen name="ChannelSelection_summary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.ServiceEvent" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="parent.ServiceEvent" render="Progress" position="16,27" size="100,5" borderWidth="1"> -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="6,32" size="90,32" font="Regular;32" halign="right" valign="top"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="100,34" zPosition="1" size="26,30" font="Regular;16" valign="top"> -+ <convert type="ClockToText">Format:%S</convert> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (ChannelSelection) --> -+ <screen name="ChannelSelection_summary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.ServiceEvent" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="parent.ServiceEvent" render="Progress" position="0,27" size="96,5" borderWidth="1" > -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" > -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ </screen> -+ <!-- LCD screen (main) --> -+ <screen name="InfoBarSummary" position="0,0" size="132,64" id="1"> -+ <widget source="session.CurrentService" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Progress" position="16,27" size="100,5" borderWidth="1"> -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="6,32" size="90,32" font="Regular;32" halign="right" valign="top"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="100,34" zPosition="1" size="26,30" font="Regular;16" valign="top"> -+ <convert type="ClockToText">Format:%S</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" text=" " position="6,30" zPosition="1" size="120,34"> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (main) --> -+ <screen name="InfoBarSummary" position="0,0" size="96,64" id="2"> -+ <widget source="session.CurrentService" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Progress" position="0,27" size="96,5" borderWidth="1" > -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" > -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" text=" " position="0,32" zPosition="1" size="96,32"> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- LCD screen (movieplayer) --> -+ <screen name="InfoBarMoviePlayerSummary" position="0,0" size="132,64" id="1"> -+ <widget source="session.CurrentService" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Progress" position="16,27" size="100,5" borderWidth="1"> -+ <convert type="ServicePosition">Position</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="6,32" size="120,32" font="Regular;32" halign="center" valign="center"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" text=" " position="6,32" zPosition="1" size="120,32"> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (movieplayer) --> -+ <screen name="InfoBarMoviePlayerSummary" position="0,0" size="96,64" id="2"> -+ <widget source="session.CurrentService" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Progress" position="0,27" size="96,5" borderWidth="1" > -+ <convert type="ServicePosition">Position</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" > -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" text=" " position="0,32" zPosition="1" size="96,32"> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- LCD screen (ChoiceBox) --> -+ <screen name="ChoiceBox_summary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.summary_list" render="Label" position="6,0" size="126,64" font="Regular;11" /> -+ </screen> -+ <!-- Color OLED screen (ChoiceBox) --> -+ <screen name="ChoiceBox_summary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.summary_list" render="Label" position="0,0" size="96,64" font="Regular;10" /> -+ </screen> -+ <!-- LCD screen (MessageBox) --> -+ <screen name="MessageBox_summary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.Text" render="Label" position="0,0" size="132,52" font="Regular;11" halign="center" valign="center" /> -+ <widget source="parent.selectedChoice" render="Label" position="6,50" size="120,14" font="Regular;14" halign="center" valign="center" /> -+ </screen> -+ <!-- Color OLED screen (MessageBox) --> -+ <screen name="MessageBox_summary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.Text" render="Label" position="0,0" size="96,52" font="Regular;10" halign="center" valign="center" /> -+ <widget source="parent.selectedChoice" render="Label" position="0,50" size="96,14" font="Regular;12" halign="center" valign="center" /> -+ </screen> -+ -+ <!-- LCD screen (menus) --> -+ <screen name="MenuSummary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.title" render="Label" position="6,0" size="120,32" font="Regular;14" halign="center" valign="center"/> -+ <widget source="parent.menu" render="Label" position="6,32" size="120,32" font="Regular;16" halign="center" valign="center"> -+ <convert type="StringListSelection" /> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (menus) --> -+ <screen name="MenuSummary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.title" render="Label" position="0,0" size="96,32" font="Regular;14" halign="center" valign="center"/> -+ <widget source="parent.menu" render="Label" position="0,32" size="96,32" font="Regular;14" halign="center" valign="center"> -+ <convert type="StringListSelection" /> -+ </widget> -+ </screen> -+ <!-- LCD screen (ServiceScan) --> -+ <screen name="ServiceScanSummary" position="0,0" size="132,64" id="1"> -+ <widget name="Title" position="6,4" size="120,42" font="Regular;16" transparent="1" /> -+ <widget name="Service" position="6,22" size="120,26" font="Regular;12" transparent="1" /> -+ <widget name="scan_progress" position="6,50" zPosition="1" borderWidth="1" size="56,12" backgroundColor="dark" /> -+ </screen> -+ <!-- Color OLED screen (ServiceScan) --> -+ <screen name="ServiceScanSummary" position="0,0" size="96,64" id="2"> -+ <widget name="Title" position="0,0" size="96,30" font="Regular;14" transparent="1" /> -+ <widget name="Service" position="0,30" size="96,20" font="Regular;10" transparent="1" /> -+ <widget name="scan_progress" position="0,50" zPosition="1" borderWidth="1" size="96,12" backgroundColor="dark" /> -+ </screen> -+ <!-- LCD screen (setup) --> -+ <screen name="SetupSummary" position="0,0" size="132,64" id="1"> -+ <widget source="SetupTitle" render="Label" position="6,0" size="120,16" font="Regular;12" /> -+ <widget source="SetupEntry" render="Label" position="6,16" size="120,32" font="Regular;12" /> -+ <widget source="SetupValue" render="Label" position="6,48" size="120,16" font="Regular;12" /> -+ </screen> -+ <!-- Color OLED screen (setup) --> -+ <screen name="SetupSummary" position="0,0" size="96,64" id="2"> -+ <widget source="SetupTitle" render="Label" position="0,0" size="96,16" font="Regular;10" /> -+ <widget source="SetupEntry" render="Label" position="0,16" size="96,32" font="Regular;10" /> -+ <widget source="SetupValue" render="Label" position="0,48" size="96,16" font="Regular;10" /> -+ </screen> -+ <!-- LCD screen (misc) --> -+ <screen name="SimpleSummary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.Title" render="Label" position="6,0" size="120,64" font="Regular;16" halign="center" valign="center" /> -+ </screen> -+ <!-- Color OLED screen (misc) --> -+ <screen name="SimpleSummary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.Title" render="Label" position="0,0" size="96,64" font="Regular;14" halign="center" valign="center" /> -+ </screen> -+ <!-- LCD screen (standby) --> -+ <screen name="StandbySummary" position="0,0" size="132,64" id="1"> -+ <widget source="global.CurrentTime" render="Label" position="6,0" size="120,64" font="Regular;40" halign="center" valign="center"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" position="6,0" zPosition="1" size="120,64" text=" "> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (standby) --> -+ <screen name="StandbySummary" position="0,0" size="96,64" id="2"> -+ <widget source="global.CurrentTime" render="Label" position="0,0" size="96,64" font="Regular;40" halign="center" valign="center"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" position="0,0" zPosition="1" size="96,64" text=" "> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- LCD screen (JobView) --> -+ <screen name="JobView_summary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.summary_job_name" render="Label" position="6,4" size="120,42" font="Regular;16" /> -+ <widget source="parent.summary_job_task" render="Label" position="6,22" size="120,26" font="Regular;12" /> -+ <widget source="parent.summary_job_progress" render="Progress" position="6,50" size="60,12" borderWidth="1" zPosition="1" /> -+ <widget source="parent.summary_job_progress" render="Label" position="66,50" size="50,12" font="Regular;12" zPosition="2" halign="center" transparent="1" > -+ <convert type="ProgressToText" /> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (JobView) --> -+ <screen name="JobView_summary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.summary_job_name" render="Label" position="0,4" size="96,42" font="Regular;14" /> -+ <widget source="parent.summary_job_task" render="Label" position="0,22" size="96,26" font="Regular;10" /> -+ <widget source="parent.summary_job_progress" render="Progress" position="0,50" size="60,12" borderWidth="1" zPosition="1" /> -+ <widget source="parent.summary_job_progress" render="Label" position="60,50" size="36,12" font="Regular;10" zPosition="2" halign="center" transparent="1" > -+ <convert type="ProgressToText" /> -+ </widget> -+ </screen> -+ <!-- LCD screen (Wizard) --> -+ <screen name="WizardSummary" position="0,0" size="132,64" id="1"> -+ <widget source="text" render="Label" position="6,0" size="120,16" font="Regular;16" transparent="1" /> -+ <widget source="parent.list" render="Label" position="6,18" size="120,46" font="Regular;12"> -+ <convert type="StringListSelection" /> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (Wizard) --> -+ <screen name="WizardSummary" position="0,0" size="96,64" id="2"> -+ <widget source="text" render="Label" position="0,0" size="96,16" font="Regular;14" transparent="1" /> -+ <widget source="parent.list" render="Label" position="0,18" size="96,46" font="Regular;12"> -+ <convert type="StringListSelection" /> -+ </widget> -+ </screen> -+ -+ <!-- Genuine Vuplus Plugin --> -+ <screen name="VuplusAuthenticity" position="center,center" size="600,320" title="Return the Love Event (only for genuine box)"> -+ <ePixmap pixmap="750S/buttons/red.png" position="140,15" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="320,15" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="145,15" zPosition="1" size="135,40" font="Regular;24" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="325,15" zPosition="1" size="135,40" font="Regular;24" halign="center" valign="center" transparent="1" /> -+ <widget name="config" zPosition="2" position="10,70" size="580,80" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget name="text1" position="10,160" size="580,50" font="Regular;32" halign="center" valign="center"/> -+ <widget name="text2" position="10,220" size="580,100" font="Regular;18" halign="center" valign="center"/> -+ </screen> -+ <screen name="MessageBoxGenuine" position="center,center" size="600,10" title="Message"> -+ <widget name="text" position="65,8" size="420,0" font="Regular;22" /> -+ <widget name="ErrorPixmap" pixmap="750S/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="QuestionPixmap" pixmap="750S/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="InfoPixmap" pixmap="750S/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="list" position="100,100" size="380,375" transparent="1" /> -+ <applet type="onLayoutFinish"> -+# this should be factored out into some helper code, but currently demonstrates applets. -+from enigma import eSize, ePoint -+ -+orgwidth = self.instance.size().width() -+orgpos = self.instance.position() -+textsize = self["text"].getSize() -+ -+# y size still must be fixed in font stuff... -+textsize = (textsize[0] + 50, textsize[1] + 50) -+offset = 0 -+if self.type == self.TYPE_YESNO: -+ offset = 60 -+wsizex = textsize[0] + 60 -+wsizey = textsize[1] + offset -+if (280 > wsizex): -+ wsizex = 280 -+wsize = (wsizex, wsizey) -+ -+ -+# resize -+self.instance.resize(eSize(*wsize)) -+ -+# resize label -+self["text"].instance.resize(eSize(*textsize)) -+ -+# move list -+listsize = (wsizex, 50) -+self["list"].instance.move(ePoint(0, textsize[1])) -+self["list"].instance.resize(eSize(*listsize)) -+ -+# center window -+newwidth = wsize[0] -+self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) -+ </applet> -+ </screen> -+ -+ <!-- HDMI CEC Plugin --> -+ <screen name="HdmiCecPlugin" position="center,center" size="590,320" title="HDMI-CEC Plugin" > -+ <ePixmap pixmap="750S/buttons/red.png" position="20,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="160,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="300,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="440,0" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="25,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="165,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="305,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_blue" render="Label" position="445,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="10,50" size="580,270" scrollbarMode="showOnDemand" transparent="1" /> -+ </screen> -+ -+ <!-- LED Brightness Setup Plugin --> -+ <screen name="LEDBrightnessSetup" position="center,center" size="560,300" title="LED Brightness Setup"> -+ <ePixmap pixmap="750S/buttons/red.png" position="40,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="210,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/yellow.png" position="380,10" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="45,10" zPosition="1" size="130,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="215,10" zPosition="1" size="130,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="385,10" zPosition="1" size="130,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1"/> -+ <widget name="current_entry" position="130,240" size="300,30" font="Regular;18" halign="center" valign="center"/> -+ </screen> -+ -+ <!-- Fancontrol Plugin --> -+ <screen name="FancontrolConfiguration" position="center,center" size="560,300" title="Standbymode Fancontrol settings" > -+ <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" /> -+ </screen> -+ -+ <!-- RC Code Plugin --> -+ <screen name="RemoteControlCode" position="center,center" size="560,250" title="Remote Control System Code Setting" > -+ <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" /> -+ </screen> -+ -+ <screen name="MessageBoxConfirmCode" position="center,320" size="620,10" title="Message"> -+ <widget name="text" position="65,8" size="420,0" font="Regular;20" /> -+ <widget name="ErrorPixmap" pixmap="750S/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="QuestionPixmap" pixmap="750S/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="InfoPixmap" pixmap="750S/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="list" position="100,100" size="380,375" transparent="1" /> -+ <applet type="onLayoutFinish"> -+# this should be factored out into some helper code, but currently demonstrates applets. -+from enigma import eSize, ePoint -+ -+orgwidth = self.instance.size().width() -+orgheight = self.instance.size().height() -+orgpos = self.instance.position() -+textsize = self["text"].getSize() -+ -+# y size still must be fixed in font stuff... -+textsize = (textsize[0] + 50, textsize[1] + 50) -+offset = 0 -+if self.type == self.TYPE_YESNO: -+ offset = 60 -+wsizex = textsize[0] + 60 -+wsizey = textsize[1] + offset -+if (280 > wsizex): -+ wsizex = 280 -+wsize = (wsizex, wsizey) -+ -+# resize -+self.instance.resize(eSize(*wsize)) -+ -+# resize label -+self["text"].instance.resize(eSize(*textsize)) -+ -+# move list -+listsize = (wsizex, 50) -+self["list"].instance.move(ePoint(0, textsize[1])) -+self["list"].instance.resize(eSize(*listsize)) -+ -+# center window -+newwidth = wsize[0] -+newheight = wsize[1] -+self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y() + (orgheight - newheight)/2)) -+ </applet> -+ </screen> -+ -+ <!-- Manual Fancontrol Plugin --> -+ <screen name="ManualFancontrol" position="center,center" size="560,300" title="Fancontrol Settings in Standby mode" > -+ <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget source="current" render="Label" position="150,270" zPosition="1" size="280,30" font="Regular;20" halign="center" valign="center" /> -+ </screen> -+ -+ <!-- UI 3D Setup Plugin --> -+ <screen name="UI3DSetupScreen" position="center,center" size="560,300" title="UI 3D setup" > -+ <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" /> -+ </screen> -+ -+ <!-- Blindscan Plugin --> -+ <screen name="Blindscan" position="center,130" size="560,390" title="Blindscan"> -+ <ePixmap pixmap="750S/buttons/red.png" position="40,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="210,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="380,10" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="45,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ <widget source="key_green" render="Label" position="215,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ <widget source="key_blue" render="Label" position="385,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ -+ <widget name="config" position="5,70" size="550,280" scrollbarMode="showOnDemand" /> -+ <widget name="introduction" position="0,365" size="560,20" font="Regular;20" halign="center" /> -+ </screen> -+ -+ <!-- Web Browser Plugin --> -+ <screen name="BrowserLauncher" position="center,center" size="620,310" title="Web Browser"> -+ <ePixmap pixmap="750S/buttons/red.png" position="10,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="158,0" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="15,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="163,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" position="0,50" size="309,100" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="rc_wb_desc.png" position="312,5" size="309,296" alphatest="on" /> -+ <widget name="info" position="0,180" size="309,50" font="Regular;18" halign="center" foregroundColor="#a08500" transparent="1" /> -+ </screen> -+ -+ <!-- Crash Report Plugin --> -+ <screen name="CrashlogReportConfiguration" position="center,120" size="560,420" title="CrashlogReport Settings" > -+ <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,70" size="550,300" scrollbarMode="showOnDemand" transparent="1" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,360" zPosition="10" size="560,2" transparent="1" alphatest="on" /> -+ <widget source="status" render="Label" position="10,370" size="540,40" zPosition="10" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/> -+ <widget name="VKeyIcon" pixmap="750S/buttons/key_text.png" position="10,390" zPosition="10" size="35,25" transparent="1" alphatest="on" /> -+ <widget name="HelpWindow" pixmap="750S/vkey_icon.png" position="160,350" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen> -+ -+ <!-- FPGA Upgrade Plugin --> -+ <screen name="FPGAUpgrade" position="center,120" size="560,420" title="FPGA Upgrade" > -+ <ePixmap pixmap="750S/buttons/red.png" position="40,10" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="210,10" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="380,10" size="140,40" alphatest="blend" /> -+ -+ <widget source="key_red" render="Label" position="45,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ <widget source="key_green" render="Label" position="215,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ <widget source="key_blue" render="Label" position="385,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ -+ <widget source="status" render="Label" position="15,60" zPosition="1" size="540,40" font="Regular;18" halign="left" valign="center" transparent="1" /> -+ <widget name="file_list" position="0,100" size="555,320" scrollbarMode="showOnDemand" /> -+ </screen> -+ -+ <screen name="UpgradeStatus" position="center,center" size="450,130" title=" "> -+ <widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/> -+ <widget name="slider" position="10,25" size="430,30" borderWidth="2" borderColor="#cccccc"/> -+ <widget name="status" position="10,25" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="#9f1313" transparent="1"/> -+ <widget source="info" render="Label" position="10,70" zPosition="1" size="430,60" font="Regular;22" halign="center" valign="center" transparent="1"/> -+ </screen> -+ -+ <!-- Firmware Upgrade Plugin --> -+ <screen name="FirmwareUpgrade" position="center,center" size="560,175" title="Firmware Upgrade" > -+ <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="blend" /> -+ -+ <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="0,70" itemHeight="36" size="540,40" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget source="status" render="Label" position="0,100" zPosition="1" size="540,75" font="Regular;20" halign="center" valign="center" /> -+ </screen> -+ -+ <screen name="FUFilebrowser" position="center,center" size="500,290" title="File Browser" > -+ <ePixmap pixmap="750S/buttons/blue.png" position="5,10" size="140,40" alphatest="blend" /> -+ -+ <widget source="key_blue" render="Label" position="10,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ -+ <widget name="file_list" position="0,70" size="495,160" scrollbarMode="showOnDemand" /> -+ <widget source="status" render="Label" position="0,230" zPosition="1" size="490,60" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ </screen> -+ -+ <!-- WLan Setup Plugin --> -+ <screen name="WlanSelection" position="center,120" size="510,400" title="Wireless Network Adapter Selection..." > -+ <ePixmap pixmap="750S/div-h.png" position="0,350" zPosition="1" size="560,2" /> -+ <ePixmap pixmap="750S/border_menu_a.png" position="10,10" zPosition="1" size="250,300" transparent="1" alphatest="on" /> -+ -+ <ePixmap pixmap="750S/buttons/red.png" position="10,360" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="360,360" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="15,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="365,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="menulist" position="20,20" size="230,260" transparent="1" backgroundColor="#371e1c1a" zPosition="10" scrollbarMode="showOnDemand" /> -+ <widget source="description" render="Label" position="305,10" size="195,300" font="Regular;19" halign="center" valign="center" /> -+ </screen> -+ -+ <screen name="WlanSetup" position="center,120" size="510,400" title="Wireless Network Setup Menu..." > -+ <ePixmap pixmap="750S/div-h.png" position="0,350" zPosition="1" size="560,2" /> -+ <ePixmap pixmap="750S/border_menu_a.png" position="10,10" zPosition="1" size="250,300" transparent="1" alphatest="on" /> -+ -+ <ePixmap pixmap="750S/buttons/red.png" position="10,360" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="360,360" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="15,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="365,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="menulist" position="20,20" size="230,260" transparent="1" backgroundColor="#371e1c1a" zPosition="10" scrollbarMode="showOnDemand" /> -+ <widget source="description" render="Label" position="305,10" size="195,300" font="Regular;19" halign="center" valign="center" /> -+ </screen> -+ -+ <screen name="WlanConfig" position="center,120" size="510,400" title="Wireless Network Configuration..." > -+ <ePixmap pixmap="750S/buttons/red.png" position="10,360" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="360,360" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="15,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="365,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" position="10,10" backgroundColor="#371e1c1a" transparent="1" size="480,210" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="750S/div-h.png" position="0,225" zPosition="1" size="550,2" /> -+ -+ <eLabel text="IP Address : " position="100,250" size="190,21" font="Regular;19" /> -+ <widget source="ipaddress" render="Label" position="300,250" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" /> -+ <eLabel text="NetMask : " position="100,275" size="190,21" font="Regular;19" /> -+ <widget source="netmask" render="Label" position="300,275" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" /> -+ <eLabel text="Gateway : " position="100,300" size="190,21" font="Regular;19" /> -+ <widget source="gateway" render="Label" position="300,300" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" /> -+ <widget name="VKeyIcon" pixmap="750S/buttons/key_text.png" position="460,245" zPosition="10" size="35,25" transparent="1" alphatest="on" /> -+ <widget name="HelpWindow" pixmap="750S/vkey_icon.png" position="160,350" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen> -+ -+ <screen name="WlanScanAp" position="center,120" size="510,400" title="Wireless Network AP Scan..." > -+ <ePixmap pixmap="750S/div-h.png" position="0,350" zPosition="1" size="560,2" /> -+ <ePixmap pixmap="750S/border_menu_a.png" position="10,10" zPosition="1" size="250,300" transparent="1" alphatest="on" /> -+ -+ <ePixmap pixmap="750S/buttons/red.png" position="10,360" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="185,360" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/blue.png" position="360,360" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="15,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="190,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_blue" render="Label" position="365,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="menulist" position="20,20" size="230,260" backgroundColor="#371e1c1a" transparent="1" zPosition="10" scrollbarMode="showOnDemand" /> -+ -+ <widget source="Address" render="Label" position="265,70" zPosition="1" size="240,30" font="Regular;18" halign="center" valign="center" /> -+ <widget source="ESSID" render="Label" position="265,100" zPosition="1" size="240,30" font="Regular;18" halign="center" valign="center" /> -+ <widget source="Protocol" render="Label" position="265,130" zPosition="1" size="240,30" font="Regular;18" halign="center" valign="center" /> -+ <widget source="Frequency" render="Label" position="265,160" zPosition="1" size="240,40" font="Regular;18" halign="center" valign="center" /> -+ <widget source="Encryption key" render="Label" position="265,200" zPosition="1" size="240,30" font="Regular;18" halign="center" valign="center" /> -+ <widget source="BitRate" render="Label" position="265,220" zPosition="1" size="240,60" font="Regular;18" halign="center" valign="center" /> -+ </screen> -+ -+ <screen name="Wlanstatus" position="center,120" size="510,400" title="Wireless Network Status..." > -+ <widget source="status" render="Label" position="5,15" size="500,350" font="Regular;18" zPosition="1" /> -+ -+ <ePixmap pixmap="750S/buttons/red.png" position="190,360" size="135,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="185,360" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ </screen> -+ -+ <!-- Wireless Access Point plugin--> -+ <screen name="WirelessAccessPoint" position="center,center" size="560,450" title="Wireless Access Point Setup" > -+ <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget name="config" zPosition="2" position="5,70" size="550,270" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget source="current_settings" render="Label" position="10,340" size="570,20" font="Regular;19" halign="center" valign="center" transparent="1" /> -+ <widget source="IPAddress_text" render="Label" position="130,370" size="190,21" font="Regular;19" transparent="1" /> -+ <widget source="Netmask_text" render="Label" position="130,395" size="190,21" font="Regular;19" transparent="1" /> -+ <widget source="Gateway_text" render="Label" position="130,420" size="190,21" font="Regular;19" transparent="1" /> -+ <widget source="IPAddress" render="Label" position="340,370" size="240,21" font="Regular;19" transparent="1" /> -+ <widget source="Netmask" render="Label" position="340,395" size="240,21" font="Regular;19" transparent="1" /> -+ <widget source="Gateway" render="Label" position="340,420" size="240,21" font="Regular;19" transparent="1" /> -+ </screen>""" -+</skin> -diff --git a/data/Makefile.am b/data/Makefile.am -index 0eaa082..869a16e 100644 ---- a/data/Makefile.am -+++ b/data/Makefile.am -@@ -1,4 +1,4 @@ --SUBDIRS = countries fonts defaults extensions keymaps skin_default -+SUBDIRS = countries fonts defaults extensions keymaps skin_default 750S Vu_HD - - dist_pkgdata_DATA = \ - defaultsatlists.xml \ -diff --git a/data/Vu_HD/Makefile.am b/data/Vu_HD/Makefile.am -new file mode 100644 -index 0000000..dcdab6d ---- /dev/null -+++ b/data/Vu_HD/Makefile.am -@@ -0,0 +1,6 @@ -+SUBDIRS = menu icons buttons countries -+ -+installdir = $(pkgdatadir)/Vu_HD -+ -+install_DATA = \ -+ *.xml *.png -diff --git a/data/Vu_HD/buttons/Makefile.am b/data/Vu_HD/buttons/Makefile.am -new file mode 100644 -index 0000000..3da6ab8 ---- /dev/null -+++ b/data/Vu_HD/buttons/Makefile.am -@@ -0,0 +1,6 @@ -+AUTOMAKE_OPTIONS = gnu -+ -+installdir = $(pkgdatadir)/Vu_HD/buttons -+ -+install_DATA = \ -+ *.png -diff --git a/data/Vu_HD/countries/Makefile.am b/data/Vu_HD/countries/Makefile.am -new file mode 100644 -index 0000000..68c6dc7 ---- /dev/null -+++ b/data/Vu_HD/countries/Makefile.am -@@ -0,0 +1,6 @@ -+AUTOMAKE_OPTIONS = gnu -+ -+installdir = $(pkgdatadir)/Vu_HD/countries -+ -+install_DATA = \ -+ *.png -diff --git a/data/Vu_HD/icons/Makefile.am b/data/Vu_HD/icons/Makefile.am -new file mode 100644 -index 0000000..650c1e5 ---- /dev/null -+++ b/data/Vu_HD/icons/Makefile.am -@@ -0,0 +1,6 @@ -+AUTOMAKE_OPTIONS = gnu -+ -+installdir = $(pkgdatadir)/Vu_HD/icons -+ -+install_DATA = \ -+ *.png -diff --git a/data/Vu_HD/menu/Makefile.am b/data/Vu_HD/menu/Makefile.am -new file mode 100644 -index 0000000..9d4f458 ---- /dev/null -+++ b/data/Vu_HD/menu/Makefile.am -@@ -0,0 +1,6 @@ -+AUTOMAKE_OPTIONS = gnu -+ -+installdir = $(pkgdatadir)/Vu_HD/menu -+ -+install_DATA = \ -+ *.png -diff --git a/data/Vu_HD/skin.xml b/data/Vu_HD/skin.xml -new file mode 100644 -index 0000000..ccf3ae3 ---- /dev/null -+++ b/data/Vu_HD/skin.xml -@@ -0,0 +1,3377 @@ -+<skin> -+ <!-- VU+ skin (skin.xml) --> -+ <output id="0"> -+ <resolution xres="1280" yres="720" bpp="32" /> -+ </output> -+ <!-- Colors (#AARRGGBB) --> -+ <colors> -+ <color name="white" value="#ffffff" /> -+ <color name="black" value="#000000" /> -+ <color name="dark" value="#25062748" /> -+ <color name="menu" value="#25062748" /> -+ <color name="red" value="#f23d21" /> -+ <color name="green" value="#389416" /> -+ <color name="blue" value="#0064c7" /> -+ <color name="yellow" value="#bab329" /> -+ <color name="transparent" value="#ffffffff" /> -+ <color name="transpBlack" value="#80000000" /> -+ <color name="transpWhite" value="#80ffffff" /> -+ <color name="background" value="#27d8dee2" /> -+ <color name="foreground" value="#1c1c1c" /> -+ <color name="darkgrey" value="#279e9fa4" /> -+ </colors> -+ <!-- Main screen colors (id=0 Framebuffer) --> -+ <windowstyle type="skinned" id="0"> -+ <title offset="33,14" font="Regular;20" /> -+ <color name="Background" color="#279e9fa4" /> -+ <color name="LabelForeground" color="#3c3c3c" /> -+ <color name="ListboxBackground" color="#279e9fa4" /> -+ <color name="ListboxForeground" color="#1c1c1c" /> -+<!-- <color name="ListboxSelectedBackground" color="#11252525" /> --> -+ <color name="ListboxSelectedBackground" color="#1a53bb" /> -+ <color name="ListboxSelectedForeground" color="#ffffff" /> -+ <color name="ListboxMarkedBackground" color="#ff0000" /> -+ <color name="ListboxMarkedForeground" color="#ffffff" /> -+ <color name="ListboxMarkedAndSelectedBackground" color="#800000" /> -+ <color name="ListboxMarkedAndSelectedForeground" color="#ffffff" /> -+ <color name="WindowTitleForeground" color="#1c1c1c" /> -+ <color name="WindowTitleBackground" color="#27dddfe1" /> -+ <!-- Main screen border png's --> -+ <borderset name="bsWindow"> -+ <pixmap pos="bpTopLeft" filename="Vu_HD/b_tl.png" /> -+ <pixmap pos="bpTop" filename="Vu_HD/b_t.png" /> -+ <pixmap pos="bpTopRight" filename="Vu_HD/b_tr.png" /> -+ <pixmap pos="bpLeft" filename="Vu_HD/b_l.png" /> -+ <pixmap pos="bpRight" filename="Vu_HD/b_r.png" /> -+ <pixmap pos="bpBottomLeft" filename="Vu_HD/b_bl.png" /> -+ <pixmap pos="bpBottom" filename="Vu_HD/b_b.png" /> -+ <pixmap pos="bpBottomRight" filename="Vu_HD/b_br.png" /> -+ </borderset> -+ </windowstyle> -+ <!-- Main screen colors (id=1 LCD) --> -+ <windowstyle type="skinned" id="1"> -+ <color name="Background" color="#000000" /> -+ <color name="LabelForeground" color="#ffffff" /> -+ <color name="ListboxBackground" color="#000000" /> -+ <color name="ListboxForeground" color="#ffffff" /> -+ <color name="ListboxSelectedBackground" color="#000000" /> -+ <color name="ListboxSelectedForeground" color="#ffffff" /> -+ <color name="ListboxMarkedBackground" color="#000000" /> -+ <color name="ListboxMarkedForeground" color="#ffffff" /> -+ <color name="ListboxMarkedAndSelectedBackground" color="#000000" /> -+ <color name="ListboxMarkedAndSelectedForeground" color="#ffffff" /> -+ <color name="WindowTitleForeground" color="#ffffff" /> -+ <color name="WindowTitleBackground" color="#000000" /> -+ </windowstyle> -+ <!-- Fonts --> -+ <fonts> -+ <font filename="MyriadPro-Regular.otf" name="Regular" scale="100" /> -+ <font filename="MyriadPro-Semibold.otf" name="Semibold" scale="100" /> -+ <font filename="MyriadPro-SemiboldIt.otf" name="Semiboldit" scale="100" /> -+ <font filename="lcd.ttf" name="LCD" scale="100" /> -+ <font filename="ae_AlMateen.ttf" name="Replacement" scale="90" replacement="1" /> -+ <font filename="tuxtxt.ttf" name="Console" scale="100" /> -+ <font filename="nmsbd.ttf" name="Subtitlefont" scale="90" /> -+ </fonts> -+ <subtitles> -+ <sub name="Subtitle_TTX" font="Subtitlefont;30" shadowColor="#40101010" shadowOffset="3,3" /> -+ <sub name="Subtitle_Regular" font="Subtitlefont;30" foregroundColor="#DCDCDC" shadowColor="#40101010" shadowOffset="3,3" /> -+ <sub name="Subtitle_Bold" font="Replacement;30" foregroundColor="#DCDCDC" shadowColor="#40101010" shadowOffset="3,3" /> -+ <sub name="Subtitle_Italic" font="Subtitlefont;30" foregroundColor="#DCAAAA" shadowColor="#40101010" shadowOffset="3,3" /> -+ <!-- omitting foregroundColor attribute will enable auto-assignment of color --> -+ </subtitles> -+ <!-- Main infobar --> -+ <screen name="InfoBar" flags="wfNoBorder" position="145,498" size="990,162" title="InfoBar" backgroundColor="transparent"> -+ <!-- Background --> -+ <ePixmap position="0,0" zPosition="-1" size="990,162" pixmap="Vu_HD/info-bg.png" /> -+ <!-- Signal Quality --> -+ <eLabel text="SNR" position="850,60" size="40,22" font="Regular;20" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="session.FrontendStatus" render="Label" position="890,60" size="80,22" font="Regular;20" backgroundColor="#aeaeae" foregroundColor="#1e1e1e" transparent="1"> -+ <convert type="FrontendInfo">SNRdB</convert> -+ </widget> -+ <!-- Signal Strength --> -+ <eLabel text="AGC" position="850,90" size="40,22" font="Regular;20" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="session.FrontendStatus" render="Label" position="890,90" size="40,22" font="Regular;20" backgroundColor="#aeaeae" foregroundColor="#1e1e1e" transparent="1"> -+ <convert type="FrontendInfo">AGC</convert> -+ </widget> -+ <!-- Bit error rate --> -+<!-- <eLabel text="BER" position="595,6" size="40,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#cccccc" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1" /> -+ <widget source="session.FrontendStatus" render="Label" position="640,6" size="35,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#e7e7e7" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1"> -+ <convert type="FrontendInfo">BER</convert> -+ </widget> --> -+ <!-- Service name --> -+ <widget source="session.CurrentService" render="Label" position="60,15" size="400,30" font="Semiboldit;28" valign="center" halign="left" noWrap="1" foregroundColor="#07255d" backgroundColor="#d9dee2" transparent="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <!-- -+ <widget source="session.FrontendInfo" render="Pixmap" position="350,32" size="8,9" pixmap="Vu_HD/nim_active.png" alphatest="on"> -+ <convert type="FrontendInfo">NUMBER</convert> -+ <convert type="ValueRange">2,2</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.FrontendInfo" render="Pixmap" position="350,45" size="8,9" pixmap="Vu_HD/nim_active.png" alphatest="on"> -+ <convert type="FrontendInfo">NUMBER</convert> -+ <convert type="ValueRange">3,3</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ --> -+ <eLabel text="Tuner" position="845,125" size="60,20" font="Regular;20" backgroundColor="#d9dee2" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="session.TunerInfo" render="FixedLabel" text="A" position="905,125" size="30,20" font="Semibold;20" foregroundColor="#5c5c5c" backgroundColor="#d9dee2" transparent="1"> -+ <convert type="TunerInfo">TunerUseMask</convert> -+ <convert type="ValueBitTest">1</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.TunerInfo" render="FixedLabel" text="B" position="917,125" size="30,20" font="Semibold;20" foregroundColor="#5c5c5c" backgroundColor="#d9dee2" transparent="1"> -+ <convert type="TunerInfo">TunerUseMask</convert> -+ <convert type="ValueBitTest">2</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.TunerInfo" render="FixedLabel" text="C" position="929,125" size="30,20" font="Semibold;20" foregroundColor="#1c1c1c" backgroundColor="#d9dee2" transparent="1"> -+ <convert type="TunerInfo">TunerUseMask</convert> -+ <convert type="ValueBitTest">4</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.TunerInfo" render="FixedLabel" text="D" position="941,125" size="30,20" font="Semibold;20" foregroundColor="#1c1c1c" backgroundColor="#d9dee2" transparent="1"> -+ <convert type="TunerInfo">TunerUseMask</convert> -+ <convert type="ValueBitTest">8</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="862,18" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="882,20" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#acacac" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <!-- tuners in use? --> -+ <widget source="session.FrontendInfo" render="FixedLabel" position="905,125" size="30,20" text="A" font="Semibold;20" foregroundColor="#1c1c1c" backgroundColor="#d9dee2" transparent="1"> -+ <convert type="FrontendInfo">NUMBER</convert> -+ <convert type="ValueRange">0,0</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.FrontendInfo" render="FixedLabel" position="917,125" size="30,20" text="B" font="Semibold;20" foregroundColor="#1c1c1c" backgroundColor="#d9dee2" transparent="1"> -+ <convert type="FrontendInfo">NUMBER</convert> -+ <convert type="ValueRange">1,1</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- -+ <widget source="global.CurrentTime" render="Label" position="633,6" zPosition="1" size="26,18" font="Regular;16" valign="top"> -+ <convert type="ClockToText">Format:%S</convert> -+ </widget> --> -+ <ePixmap position="720,20" zPosition="0" size="70,20" pixmap="Vu_HD/icons/icon_crypt_off.png" alphatest="blend" /> -+ <ePixmap position="740,20" zPosition="0" size="70,20" pixmap="Vu_HD/icons/icon_txt_off.png" alphatest="blend" /> -+ <ePixmap position="770,20" zPosition="0" size="70,20" pixmap="Vu_HD/icons/icon_format_off.png" alphatest="blend" /> -+ <ePixmap position="804,20" zPosition="0" size="70,20" pixmap="Vu_HD/icons/icon_dolby_off.png" alphatest="blend" /> -+ <!-- Blinking pixmap (recording in progress?) --> -+ <ePixmap pixmap="Vu_HD/icons/icon_rec_off.png" position="680,18" size="31,20" alphatest="blend" /> -+ <widget source="session.RecordState" render="Pixmap" pixmap="Vu_HD/icons/icon_rec.png" position="680,18" zPosition="1" size="31,20" alphatest="blend" > -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ <!-- Crypt icon (encrypted service?) --> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/icons/icon_crypt.png" position="720,20" zPosition="1" size="11,15" alphatest="blend"> -+ <convert type="ServiceInfo">IsCrypted</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Teletext icon (is teletext available?) --> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/icons/icon_txt.png" position="740,20" zPosition="1" size="18,15" alphatest="blend"> -+ <convert type="ServiceInfo">HasTelext</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Videoformat icon (16:9?) --> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/icons/icon_format.png" position="770,20" zPosition="1" size="28,15" alphatest="blend"> -+ <convert type="ServiceInfo">IsWidescreen</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Audio icon (is there multichannel audio?) --> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/icons/icon_dolby.png" position="804,20" zPosition="1" size="43,15" alphatest="blend"> -+ <convert type="ServiceInfo">IsMultichannel</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Progressbar (current event duration)--> -+ <ePixmap pixmap="Vu_HD/Statusbar_white.png" position="60,65" size="100,10" transparent="1" alphatest="on" /> -+ <widget source="session.Event_Now" render="Progress" pixmap="Vu_HD/progress_medium.png" position="60,65" zPosition="1" size="100,10" backgroundColor="#ffffff" transparent="1"> -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <!-- Event (now) --> -+<!-- -+ <ePixmap pixmap="Vu_HD/nim_active.png" position="182,78" size="15,10" alphatest="on" /> -+--> -+ <widget source="session.Event_Now" render="Label" position="190,60" size="70,24" font="Semibold;22" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Label" position="260,60" size="420,24" font="Semibold;22" noWrap="1" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Label" position="690,60" size="100,24" font="Semibold;22" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" halign="right" transparent="1"> -+ <convert type="EventTime">Remaining</convert> -+ <convert type="RemainingToText">InMinutes</convert> -+ </widget> -+ <!-- Event (next) --> -+ <widget source="session.Event_Next" render="Label" position="190,87" size="70,24" font="Regular;22" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="session.Event_Next" render="Label" position="260,87" size="420,24" font="Regular;22" noWrap="1" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <widget source="session.Event_Next" render="Label" position="690,87" size="100,24" font="Regular;22" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" halign="right" transparent="1"> -+ <convert type="EventTime">Duration</convert> -+ <convert type="ClockToText">InMinutes</convert> -+ </widget> -+ <!-- Red button (is recording possible?) --> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="60,122" size="25,25" alphatest="blend" /> -+ <widget source="RecordingPossible" render="Pixmap" pixmap="Vu_HD/buttons/red.png" position="60,122" zPosition="1" size="25,25" alphatest="blend"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="ShowRecordOnRed" render="FixedLabel" text="Record" position="100,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d9dee2" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="RecordingPossible" render="FixedLabel" text="Record" position="100,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Green button (is subservices available?) --> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="250,122" size="25,25" alphatest="blend" /> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/buttons/green.png" position="250,122" zPosition="1" size="25,25" alphatest="blend"> -+ <convert type="ServiceInfo">SubservicesAvailable</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <eLabel text="Subservices" position="290,125" size="130,22" font="Regular;20" backgroundColor="#d2dee2" transparent="1" /> -+ <widget source="session.CurrentService" render="FixedLabel" text="Subservices" position="290,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1"> -+ <convert type="ServiceInfo">SubservicesAvailable</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Yellow button (is timeshift possible?) --> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="440,122" size="25,25" alphatest="blend" /> -+ <widget source="TimeshiftPossible" render="Pixmap" pixmap="Vu_HD/buttons/yellow.png" position="440,122" zPosition="1" size="25,25" alphatest="blend"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="ShowTimeshiftOnYellow" render="FixedLabel" text="Timeshift" position="480,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="TimeshiftPossible" render="FixedLabel" text="Timeshift" position="480,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ -+ <!-- Yellow button (used for audio on boxes with new rc?) --> -+ <widget source="ShowAudioOnYellow" render="Pixmap" pixmap="Vu_HD/buttons/yellow.png" position="440,122" zPosition="1" size="25,25" alphatest="blend"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="ShowAudioOnYellow" render="FixedLabel" text="Audio" position="480,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <!-- Blue button (is extensions available?) --> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,122" size="25,25" alphatest="blend" /> -+ <widget source="ExtensionsAvailable" render="Pixmap" pixmap="Vu_HD/buttons/blue.png" position="630,122" zPosition="1" size="25,25" alphatest="blend"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <eLabel text="Extensions" position="670,125" size="130,22" font="Regular;20" backgroundColor="#d2dee2" transparent="1" /> -+ <widget source="ExtensionsAvailable" render="FixedLabel" text="Extensions" position="670,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ </screen> -+ <!-- Main menu --> -+ <!-- Menu screens --> -+ <screen name="menu_mainmenu" position="0,0" size="580,720" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/bg.png" zPosition="-1" position="60,0" size="520,720" alphatest="blend" transparent="1" /> -+<!-- -+ <eLabel text=" " position="60,0" size="520,170" zPosition="-1" backgroundColor="#27cbd0d2" /> -+ <eLabel text=" " position="60,170" size="520,500" zPosition="-1" backgroundColor="#27b9bdc1" /> -+ <eLabel text=" " position="60,670" size="520,50" zPosition="-1" backgroundColor="#27cbd0d2" /> -+--> -+ <eLabel text="Main menu" position="110,120" size="350,38" font="Regular;38" foregroundColor="#5c5c5c" backgroundColor="#27d8dee2" transparent="1" /> -+ <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H45.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#271a53bb" backgroundColor="#27b9bdc1" transparent="1" position="84, 175" size="472,495" scrollbarMode="showOnDemand"> -+<!-- <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/FocusBar_menu01.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#acacac" position="84,190" size="370,480" transparent="1" backgroundColor="#ececec" scrollbarMode="showNever"> --> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ MultiContentEntryText(pos = (30, 8), size = (410, 28), flags = RT_HALIGN_LEFT, text = 0 ) ], -+ "fonts": [gFont("Regular", 28)], -+ "itemHeight": 45 -+ } -+ </convert> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_Plugin_All_title.png" position="475,70" size="88,88" alphatest="blend"> -+ <convert type="MenuEntryCompare">dvd_player</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_Plugin_All_title.png" position="475,70" size="88,88" alphatest="blend"> -+ <convert type="MenuEntryCompare">filecommand</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Subtitles.png" position="475,70" size="88,88" alphatest="blend"> -+ <convert type="MenuEntryCompare">subtitle_selection</convert> -+ <convert type="ConditionalShowHide"/> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Setup.png" position="475,70" size="88,88" alphatest="blend"> -+ <convert type="MenuEntryCompare">setup_selection</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Standby.png" position="475,70" size="88,88" alphatest="blend"> -+ <convert type="MenuEntryCompare">standby_restart_list</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Plugin.png" position="475,70" size="88,88" alphatest="blend"> -+ <convert type="MenuEntryCompare">plugin_selection</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Info.png" position="475,70" size="88,88" alphatest="blend"> -+ <convert type="MenuEntryCompare">info_screen</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_Plugin_All_title.png" position="475,70" size="88,88" alphatest="blend"> -+ <convert type="MenuEntryCompare">scart_switch</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Timer.png" position="475,70" size="88,88" alphatest="blend"> -+ <convert type="MenuEntryCompare">timer_edit</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Media.png" position="475,70" size="88,88" alphatest="blend"> -+ <convert type="MenuEntryCompare">media_player</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ </screen> -+ <!-- Movieplayer infobar --> -+ <screen name="MoviePlayer" flags="wfNoBorder" position="200,516" size="880,162" title="InfoBar" backgroundColor="transparent"> -+ <!-- Background --> -+ <ePixmap position="0,0" zPosition="-1" size="880,144" pixmap="Vu_HD/Bg_Media_info.png" /> -+ <ePixmap position="35,18" size="37,28" pixmap="Vu_HD/menu/ico_title_media-info.png" alphatest="blend" /> -+ <!-- colorbuttons --> -+ <ePixmap position="50,75" pixmap="Vu_HD/icons/ico_player.png" size="152,18" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="770,15" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="790,17" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <!-- Servicename --> -+ <widget source="session.CurrentService" render="Label" position="85,18" size="475,30" font="Semiboldit;30" foregroundColor="#240256" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <!-- movie length --> -+ <widget source="session.CurrentService" render="Label" position="700,55" size="95,24" font="Regular;18" halign="right" backgroundColor="#27aeaeae" transparent="1"> -+ <convert type="ServicePosition">Length</convert> -+ </widget> -+ <!-- Elapsed time --> -+ <widget source="session.CurrentService" render="Label" position="240,95" size="100,24" font="Semiboldit;18" halign="left" valign="center" foregroundColor="#3d0e82" backgroundColor="#27aeaeae" transparent="1"> -+ <convert type="ServicePosition">Position</convert> -+ </widget> -+ <!-- Progressbar (movie position)--> -+ <ePixmap position="240,75" size="563,18" pixmap="Vu_HD/icons/Mediaplayerbar_gray.png" alphatest="blend" /> -+ <ePixmap position="235,75" size="5,18" pixmap="Vu_HD/icons/Mediaplayerbar_purple.png" alphatest="blend" /> -+ <widget source="session.CurrentService" render="PositionGauge" position="239,68" size="563,25" zPosition="2" pointer="Vu_HD/icons/Mediaplayerbar_purple.png:563,0" transparent="1"> -+ <convert type="ServicePosition">Gauge</convert> -+ </widget> -+ <!-- Remaining time --> -+ <widget source="session.CurrentService" render="Label" position="700,95" size="95,20" font="Regular;18" halign="right" valign="center" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1"> -+ <convert type="ServicePosition">Remaining</convert> -+ </widget> -+ </screen> -+ -+ <!-- Vu_HD skin (Vu_HD.xml) --> -+ <!-- About screen --> -+ <screen name="About" position="209,48" size="865,623" title="Serviceinfo" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Info.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="About" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget source="EnigmaVersion" render="Label" position="110,140" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" /> -+ <widget source="ImageVersion" render="Label" position="110,176" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" /> -+ <widget source="FPVersion" render="Label" position="110,212" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" /> -+ <widget source="TunerHeader" render="Label" position="110,248" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" /> -+ <widget source="Tuner0" render="Label" position="110,284" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" /> -+ <widget source="Tuner1" render="Label" position="110,320" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" /> -+ <widget source="Tuner2" render="Label" position="110,356" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" /> -+ <widget source="Tuner3" render="Label" position="110,392" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" /> -+ <widget source="HDDHeader" render="Label" position="110,428" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" /> -+ <widget source="hddA" render="Label" position="110,467" size="600,72" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" /> -+ </screen> -+ <!-- Adapter setup --> -+ <screen name="AdapterSetup" position="209,48" size="865,623" title="Network Setup" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Network Setup" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="config" position="160,140" transparent="1" backgroundColor="#27d9dee2" size="500,125" scrollbarMode="showOnDemand" /> -+ <eLabel text=" " position="150,270" zPosition="1" size="550,2" backgroundColor="#8c8c8c"/> -+ <widget source="DNS1text" render="Label" position="160,275" size="190,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/> -+ <widget source="DNS2text" render="Label" position="160,305" size="190,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/> -+ <widget source="DNS1" render="Label" position="530,275" size="120,21" zPosition="1" font="Regular;17" transparent="1" backgroundColor="#27d9dee2"/> -+ <widget source="DNS2" render="Label" position="530,305" size="120,21" zPosition="1" font="Regular;17" transparent="1" backgroundColor="#27d9dee2"/> -+ <eLabel text=" " position="150,330" zPosition="1" size="550,2" backgroundColor="#8c8c8c"/> -+ -+ <widget source="introduction" render="Label" position="160,335" size="440,20" font="Regular;19" halign="center" transparent="1" backgroundColor="#27d9dee2"/> -+ <widget source="IPtext" render="Label" position="250,370" size="190,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/> -+ <widget source="Netmasktext" render="Label" position="250,395" size="190,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/> -+ <widget source="Gatewaytext" render="Label" position="250,420" size="190,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/> -+ <widget source="IP" render="Label" position="450,370" size="240,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/> -+ <widget source="Mask" render="Label" position="450,395" size="240,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/> -+ <widget source="Gateway" render="Label" position="450,420" size="240,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/> -+ -+ <widget source="Adaptertext" render="Label" position="200,460" size="100,21" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" font="Regular;19" transparent="1" /> -+ <widget source="Adapter" render="Label" position="290,460" size="300,21" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" font="Regular;19" transparent="1" /> -+ <widget source="introduction2" render="Label" position="260,500" size="300,20" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" font="Regular;21" halign="center" transparent="1" /> -+ <widget name="VKeyIcon" pixmap="Vu_HD/buttons/key_text.png" position="160,510" zPosition="10" size="35,25" transparent="1" alphatest="on" /> -+ <widget name="HelpWindow" pixmap="Vu_HD/vkey_icon.png" position="310,445" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen> -+ <screen name="AdapterSetupConfiguration" position="209,48" size="865,623" title="Network Configuration..." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Network Configuration..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/border_menu.png" position="120,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" /> -+ <widget name="menulist" position="130,150" size="322,338" transparent="1" backgroundColor="#27d9dee2" zPosition="10" scrollbarMode="showOnDemand" /> -+ <widget source="description" render="Label" position="500,140" size="280,360" font="Regular;19" halign="center" valign="center" backgroundColor="#c5c9cc" transparent="1"/> -+ <widget source="IFtext" render="Label" position="170,520" size="100,22" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;20" transparent="1" /> -+ <widget source="IF" render="Label" position="280,520" size="300,22" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;20" transparent="1" /> -+ <widget source="Statustext" render="Label" position="500,100" size="150,25" zPosition="10" font="Regular;20" halign="center" valign="right" backgroundColor="#c5c9cc" foregroundColor="#1c1c1c" transparent="1"/> -+ <widget name="statuspic" pixmaps="Vu_HD/buttons/green.png,Vu_HD/buttons/button_off.png" position="630,98" zPosition="10" size="25,25" transparent="1" alphatest="blend"/> -+ </screen> -+ <!-- Audio selection --> -+ <screen name="AudioSelection" position="center,center" size="560,330" title="Audio"> -+ <widget name="config" position="50,10" size="500,110" scrollbarMode="showOnDemand" /> -+ -+ <widget source="key_red" render="Pixmap" pixmap="Vu_HD/buttons/red.png" position="10,10" size="25,25" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="key_green" render="Pixmap" pixmap="Vu_HD/buttons/green.png" position="10,35" size="25,25" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="key_yellow" render="Pixmap" pixmap="Vu_HD/buttons/yellow.png" position="10,60" size="25,25" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="key_blue" render="Pixmap" pixmap="Vu_HD/buttons/blue.png" position="10,85" size="25,25" alphatest="on"> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ -+ <widget source="streams" render="Listbox" scrollbarMode="showOnDemand" position="10,120" size="540,200" zPosition="3" transparent="1" > -+ <convert type="TemplatedMultiContent"> -+ {"templates": -+ {"default": (25, [ -+ MultiContentEntryText(pos = (0, 0), size = (35, 25), font = 0, flags = RT_HALIGN_LEFT, text = 1), # key, -+ MultiContentEntryText(pos = (40, 0), size = (60, 25), font = 0, flags = RT_HALIGN_LEFT, text = 2), # number, -+ MultiContentEntryText(pos = (110, 0), size = (120, 25), font = 0, flags = RT_HALIGN_LEFT, text = 3), # description, -+ MultiContentEntryText(pos = (240, 0), size = (200, 25), font = 0, flags = RT_HALIGN_LEFT, text = 4), # language, -+ MultiContentEntryText(pos = (450, 4), size = (90, 25), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # selection, -+ ], True, "showNever"), -+ "notselected": (25, [ -+ MultiContentEntryText(pos = (0, 0), size = (35, 25), font = 0, flags = RT_HALIGN_LEFT, text = 1), # key, -+ MultiContentEntryText(pos = (40, 0), size = (60, 25), font = 0, flags = RT_HALIGN_LEFT, text = 2), # number, -+ MultiContentEntryText(pos = (110, 0), size = (120, 25), font = 0, flags = RT_HALIGN_LEFT, text = 3), # description, -+ MultiContentEntryText(pos = (240, 0), size = (200, 25), font = 0, flags = RT_HALIGN_LEFT, text = 4), # language, -+ MultiContentEntryText(pos = (450, 4), size = (90, 25), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # selection, -+ ], False, "showNever") -+ }, -+ "fonts": [gFont("Regular", 20), gFont("Regular", 16)], -+ "itemHeight": 25 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <!-- Bouquet selector --> -+ <screen name="BouquetSelector" position="center,center" size="300,240" title="Choose bouquet"> -+ <widget name="menu" position="10,10" transparent="1" size="290,225" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Channel context menu --> -+ <screen name="ChannelContextMenu" position="0,0" size="1280,720" zPosition="2" title="Channellist menu" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="280,90" size="520,538" zPosition="-1" alphatest="on" /> -+ <eLabel text="Channellist menu" position="349,135" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget name="menu" position="295,173" itemHeight="42" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" transparent="1" zPosition="1" size="490,420" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Channel selection - TV --> -+ <screen name="ChannelSelection" position="145, 55" size="990,610" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_List.png" position="0,0" size="990,610" zPosition="-1" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/ico_Chlist_title.png" position="44,37" size="38,34" alphatest="blend" transparent="1" /> -+ <widget source="Title" render="Label" position="95,40" size="700,32" zPosition="3" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" /> -+<!-- <widget name="etitle" position="95,43" size="450,32" font="Semiboldit;32" halign="left" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" />--> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="44,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="271,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="498,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="725,82" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="89,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_green" position="316,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_yellow" position="543,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_blue" position="770,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="list" position="30,127" size="615,462" zPosition="3" scrollbarMode="showOnDemand" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" foregroundColorServiceNotAvail="#6c6c6c" serviceItemHeight="42" serviceNumberFont="Regular;24" serviceNameFont="Regular;24" serviceInfoFont="Semibold;21" transparent="1" /> -+ <eLabel text=" " backgroundColor="#9c9c9c" position="655,127" size="2,450" /> -+ <widget source="ServiceEvent" render="Label" position="670,130" zPosition="1" size="300,24" foregroundColor="#07255d" backgroundColor="#27d8dee2" font="Semibold;24" noWrap="1" transparent="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="880,50" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="900,52" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d8dee2" halign="right" transparent="1"> -+ <convert type="ClockToText"></convert> -+ </widget> -+ <widget source="ServiceEvent" render="Label" position="670,160" zPosition="1" size="300,24" font="Regular;24" foregroundColor="#07255d" backgroundColor="#27d8dee2" halign="left" noWrap="1" transparent="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="ServiceEvent" render="Label" position="670,190" zPosition="1" size="50,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27d8dee2" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText"></convert> -+ </widget> -+ <widget source="ServiceEvent" render="Label" position="725,190" zPosition="1" size="70,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27d8dee2" transparent="1"> -+ <convert type="EventTime">EndTime</convert> -+ <convert type="ClockToText">Format:- %H:%M</convert> -+ </widget> -+ <widget source="ServiceEvent" render="Progress" position="835,195" zPosition="1" pixmap="Vu_HD/progress_medium.png" size="124,10" backgroundColor="#ffffff" > -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="ServiceEvent" render="Label" position="670,220" zPosition="1" size="300,360" font="Regular;20" foregroundColor="#273c3c3c" backgroundColor="#27d8dee2" transparent="1"> -+ <convert type="EventName">ExtendedDescription</convert> -+ </widget> -+ </screen> -+ <!-- Channel selection - Radio --> -+ <screen name="ChannelSelectionRadio" position="145, 55" size="990,610" zPosition="-10" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_List.png" position="0,0" size="990,610" zPosition="-10" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/ico_Radio_title.png" position="44,37" size="38,34" alphatest="blend" transparent="1" /> -+ <widget source="Title" render="Label" position="95,40" size="700,32" zPosition="3" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" /> -+<!-- <widget name="etitle" position="95,43" size="450,32" font="Semiboldit;32" halign="left" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" />--> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="44,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="271,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="498,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="725,82" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="89,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_green" position="316,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_yellow" position="543,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_blue" position="770,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="list" position="30,127" size="615,462" zPosition="3" scrollbarMode="showOnDemand" foregroundColor="#271c1c1c" backgroundColor="#27ebebeb" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" foregroundColorServiceNotAvail="#6c6c6c" serviceItemHeight="42" serviceNumberFont="Semibold;24" serviceNameFont="Semibold;24" serviceInfoFont="Semibold;21" transparent="1" /> -+ <eLabel text=" " backgroundColor="#9c9c9c" position="655,127" size="2,450" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="880,50" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="900,52" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d8dee2" halign="right" transparent="1"> -+ <convert type="ClockToText"></convert> -+ </widget> -+ </screen> -+ <!-- Choice box --> -+ <screen name="ChoiceBox" position="130,100" size="550,400" title="Input"> -+ <widget name="text" position="10,10" size="550,25" font="Regular;22" transparent="1" /> -+ <widget name="list" position="0,30" size="550,335" scrollbarMode="showOnDemand" transparent="1" /> -+ <applet type="onLayoutFinish"> -+# this should be factored out into some helper code, but currently demonstrates applets. -+from enigma import eSize, ePoint -+ -+orgwidth = self.instance.size().width() -+orgpos = self.instance.position() -+textsize = self["text"].getSize() -+ -+# y size still must be fixed in font stuff... -+textsize = (textsize[0] + 80, textsize[1] + 80) -+count = len(self.list) -+if count > 10: -+ count = 10 -+offset = 25 * count -+wsizex = textsize[0] + 80 -+wsizey = textsize[1] + offset + 10 -+ -+if (640 > wsizex): -+ wsizex = 640 -+wsize = (wsizex, wsizey) -+ -+# resize -+self.instance.resize(eSize(*wsize)) -+ -+# resize label -+self["text"].instance.resize(eSize(*textsize)) -+ -+# move list -+listsize = (wsizex - 20, 25 * count) -+self["list"].instance.move(ePoint(10, textsize[1])) -+self["list"].instance.resize(eSize(*listsize)) -+ -+# center window -+newwidth = wsize[0] -+self.instance.move(ePoint((1280-wsizex)/2, (720-wsizey)/(count > 7 and 2 or 3))) -+ -+ </applet> -+ </screen> -+ -+ <!-- Common interface --> -+ <screen name="MMIDialog" position="center,center" size="450,270"> -+ <widget name="title" position="10,10" size="430,25" font="Regular;23" /> -+ <widget name="subtitle" position="10,35" size="430,25" font="Regular;23" /> -+ <widget name="entries" position="10,70" size="430,150" scrollbarMode="showOnDemand" /> -+ <widget name="bottom" position="10,230" size="430,25" font="Regular;23" /> -+ </screen> -+ <!-- Common interface - selection --> -+ <screen name="CiSelection" position="center,center" size="440,160" title="Common Interface"> -+ <widget name="text" position="10,10" size="430,25" font="Regular;23" /> -+ <widget name="entries" position="10,55" size="420,100" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Console --> -+ <screen name="Console" position="center,center" size="900,500" title="Command execution..."> -+ <widget name="text" position="10,10" size="880,480" foregroundColor="#3c3c3c" font="Console;14" /> -+ </screen> -+ <!-- Clock display --> -+ <screen name="clockDisplay" position="300,120" size="300,300"> -+ <widget name="okbutton" position="10,10" size="280,40" /> -+ <widget name="title" position="10,120" size="280,50" /> -+ <widget name="theClock" position="10,60" size="280,50" /> -+ </screen> -+ <!-- Config OSD --> -+ <screen name="configOSD" position="130,120" size="460,350" title="OSD Settings"> -+ <widget name="okbutton" position="20,270" size="205,40" /> -+ <widget name="txt_alpha" position="20,20" size="110,20" /> -+ <widget name="sld_alpha" position="150,20" size="290,20" /> -+ <widget name="txt_brightness" position="20,60" size="120,20" /> -+ <widget name="sld_brightness" position="150,20" size="290,20" /> -+ <widget name="txt_gamma" position="20,100" size="120,20" /> -+ <widget name="sld_gamma" position="150,100" size="290,20" /> -+ </screen> -+ <!-- Config test --> -+ <screen name="configTest" position="center,center" size="300,300" title="config menu"> -+ <widget name="config" position="10,30" size="420,220" /> -+ </screen> -+ <!-- Default wizard --> -+ <screen name="DefaultWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="400,100" size="550,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" transparent="1" position="150,300" size="600,300" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" /> -+ <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" /> -+ <widget name="config" position="300,300" zPosition="1" size="400,300" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <screen name="DefaultSatLists" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="300,100" size="650,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" transparent="1" position="150,300" size="600,300" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" /> -+ <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" /> -+ <widget name="config" position="150,300" zPosition="1" size="600,300" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <screen name="DreamPackageWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="300,100" size="650,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" transparent="1" position="150,300" size="600,300" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" /> -+ <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" /> -+ <widget name="config" position="150,300" zPosition="1" size="600,300" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <!-- Dish --> -+ <screen name="Dish" flags="wfNoBorder" position="300,110" size="130,160" title="Dish" zPosition="-1" backgroundColor="transparent"> -+ <widget name="Dishpixmap" pixmap="Vu_HD/icons/dish.png" position="0,0" size="130,160" alphatest="off" /> -+ </screen> -+ <!-- unhandled key pressed --> -+ <screen name="UnhandledKey" flags="wfNoBorder" position="1110,50" size="90,80" title="UnhandledKey" zPosition="100" backgroundColor="transparent"> -+ <widget name="UnhandledKeyPixmap" pixmap="Vu_HD/unhandled-key.png" position="0,0" size="90,80" alphatest="off" /> -+ </screen> -+ <!-- EPG Selection - Single --> -+ <screen name="EPGSelection" position="209,48" size="865,624" title="EPG Selection" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" position="0,0" size="865,624" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_EPG_title.png" position="34,45" size="45,36" alphatest="blend" transparent="1" /> -+ <eLabel text="EPG Selection" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#27b5b9bd" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="list" position="40,130" size="800,468" itemHeight="36" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- EPG Selection - Multi --> -+ <screen name="EPGSelectionMulti" position="209,48" size="865,624" title="EPG Selection" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" position="0,0" size="865,624" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_EPG_title.png" position="34,45" size="45,36" alphatest="blend" transparent="1" /> -+ <eLabel text="EPG Selection Multi" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27b5b9bd" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="now_button_sel" pixmap="Vu_HD/epg_now.png" position="50,132" zPosition="1" size="463,34" alphatest="on" /> -+ <widget name="next_button_sel" pixmap="Vu_HD/epg_next.png" position="50,132" zPosition="1" size="463,34" alphatest="on" /> -+ <widget name="more_button_sel" pixmap="Vu_HD/epg_more.png" position="50,132" zPosition="1" size="463,34" alphatest="on" /> -+ <widget name="now_text" position="50,132" zPosition="2" size="140,34" text="NOW" font="Regular;20" halign="center" valign="center" foregroundColor="#efefef" backgroundColor="#3c3c3c" transparent="1" /> -+ <widget name="next_text" position="211,132" zPosition="2" size="140,34" text="NEXT" font="Regular;20" halign="center" valign="center" foregroundColor="#efefef" backgroundColor="#3c3c3c" transparent="1" /> -+ <widget name="more_text" position="370,132" zPosition="2" size="140,34" text="MORE" font="Regular;20" halign="center" valign="center" foregroundColor="#efefef" backgroundColor="#3c3c3c" transparent="1" /> -+ <widget name="date" position="600,130" size="110,35" font="Regular;18" foregroundColor="#3d3d3d" backgroundColor="#27d9dee2" valign="center" halign="right" transparent="1"/> -+ <widget name="list" position="46,166" size="779,396" itemHeight="36" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Eventview --> -+ <screen name="EventView" position="209,48" size="865,623" title="Eventview" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_EPG_title.png" position="34,45" size="45,36" alphatest="blend" transparent="1" /> -+ <eLabel text="Eventview" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#27b5b9bd" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="epg_description" position="40,190" size="800,418" font="Regular;22" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="datetime" position="600,150" size="130,25" font="Regular;22" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="duration" position="740,150" size="100,25" font="Regular;22" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="channel" position="40,150" size="300,25" font="Semiboldit;24" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="left" transparent="1"/> -+ </screen> -+ <!-- Graphical Multi EPG --> -+ <screen name="GraphMultiEPG" position="209,48" size="865,624" title="Electronic Program Guide" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" position="0,0" size="865,624" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_EPG_title.png" position="34,45" size="45,36" alphatest="blend" transparent="1" /> -+ <eLabel text="Electronic Program Guide" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ -+ <eLabel position="30,160" zPosition="-1" size="152,324" backgroundColor="#278c8c8c" /> -+ <widget name="timeline_text" position="0,135" size="830,25" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="list" position="30,160" size="800,324" transparent="1" backgroundColor="#27d9dee2" backgroundColorSelected="#279c9c9c" EntryBorderColor="#27727f98" EntryBackgroundColor="#27727f98" EntryBackgroundColorSelected="#27366ee0" scrollbarMode="showOnDemand" /> -+ <eLabel position="30,160" size="773,1" backgroundColor="#6c6c6c" /> -+ <eLabel position="30,214" size="773,1" backgroundColor="#6c6c6c" /> -+ <eLabel position="30,268" size="773,1" backgroundColor="#6c6c6c" /> -+ <eLabel position="30,322" size="773,1" backgroundColor="#6c6c6c" /> -+ <eLabel position="30,376" size="773,1" backgroundColor="#6c6c6c" /> -+ <eLabel position="30,430" size="773,1" backgroundColor="#6c6c6c" /> -+ <eLabel position="30,484" size="773,1" backgroundColor="#6c6c6c" /> -+ <widget name="timeline0" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" /> -+ <widget name="timeline1" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" /> -+ <widget name="timeline2" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" /> -+ <widget name="timeline3" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" /> -+ <widget name="timeline4" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" /> -+ <widget name="timeline5" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" /> -+ <widget name="timeline_now" position="80,160" zPosition="2" size="19,324" pixmap="Vu_HD/timeline-now.png" alphatest="on" /> -+<!-- -+ <ePixmap pixmap="Vu_HD/border_multiepg.png" position="80,167" zPosition="1" size="560,393" transparent="1" alphatest="on" /> -+--> -+ <widget source="Event" render="Label" position="40,495" zPosition="1" size="500,24" font="Semibold;24" backgroundColor="#27d9dee2" foregroundColor="#07255d" noWrap="1" transparent="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <widget source="Event" render="Label" position="700,490" zPosition="1" size="50,18" font="Regular;18" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText"></convert> -+ </widget> -+ <widget source="Event" render="Label" position="750,490" zPosition="1" size="70,18" font="Regular;18" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="EventTime">EndTime</convert> -+ <convert type="ClockToText">Format:- %H:%M</convert> -+ </widget> -+ <widget source="Event" render="Progress" position="680,510" zPosition="1" pixmap="Vu_HD/progress_medium.png" size="120,11" borderWidth="2" backgroundColor="#ffffff" borderColor="#cccccc" > -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="Event" render="Label" position="540,490" zPosition="1" size="150,20" halign="right" font="Regular;18" noWrap="1" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText">Format:(%A)</convert> -+ </widget> -+ <widget source="Event" render="Label" position="40,525" zPosition="1" size="780,72" font="Regular;20" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="EventName">ExtendedDescription</convert> -+ </widget> -+ </screen> -+ <!-- Harddisk selection --> -+ <screen name="HarddiskSelection" position="100,80" size="520,538" title="Select HDD" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="16,36" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Select HDD" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#b5b9bd" transparent="1" /> -+ <widget name="hddlist" position="10,83" itemHeight="42" size="500,275" transparent="1" /> -+ </screen> -+ <!-- Harddisk setup --> -+ <screen name="HarddiskSetup" position="center,center" size="420,160" title="Harddisk"> -+ <widget name="model" position="20,10" size="380,25" font="Regular;23" /> -+ <widget name="capacity" position="20,40" size="380,25" font="Regular;23" /> -+ <widget name="bus" position="20,70" size="380,25" font="Regular;23" /> -+ <widget name="initialize" pixmap="Vu_HD/buttons/red.png" position="140,110" size="25,25" alphatest="blend" /> -+ <widget name="initializetext" position="165,112" size="120,20" zPosition="1" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ </screen> -+ <!-- Harddisk wait --> -+ <screen name="HarddiskWait" position="center,center" size="540,60"> -+ <widget name="wait" position="20,10" size="500,25" font="Regular;23" /> -+ </screen> -+ <!-- Help menu --> -+ <screen name="HelpMenu" position="0,0" size="1280,720" title="Menu" flags="wfNoBorder"> -+ <eLabel text="help..." position="500,60" size="280,60" font="Regular;40" /> -+ <widget name="list" position="100,150" size="700,456" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="rc" pixmaps="Vu_HD/rc.png,Vu_HD/rcold.png" position="950,150" zPosition="10" size="154,500" alphatest="blend" /> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowdown2" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="long_key" position="760,660" size="250,50" font="Regular;25" halign="right" foregroundColor="yellow" /> -+ </screen> -+ <!-- Image Wizard --> -+ <screen name="ImageWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="400,100" size="550,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" transparent="1" position="150,300" size="600,300" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" /> -+ <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" /> -+ <widget name="config" position="300,300" zPosition="1" size="400,300" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <!-- Inputbox --> -+ <screen name="InputBox" position="center,center" size="550,90" title="Input"> -+ <widget name="text" position="10,20" size="550,25" font="Regular;23" /> -+ <widget name="input" position="10,55" size="550,25" font="Regular;20" /> -+ </screen> -+ <!-- IPKG --> -+ <screen name="Ipkg" position="center,center" size="550,200" title="Installing Software..."> -+ <widget name="activityslider" position="0,0" size="550,5" pixmap="Vu_HD/progress_small.png" /> -+ <widget name="package" position="10,30" size="550,20" font="Regular;18" /> -+ <widget name="status" position="10,60" size="550,45" font="Regular;18" /> -+ <widget name="slider" position="10,100" size="530,15" pixmap="Vu_HD/progress_big.png" borderWidth="2" borderColor="#cccccc" /> -+ </screen> -+ <!-- Language selection --> -+ <screen name="LanguageSelection" position="center,80" size="520,538" title="Language selection" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="16,36" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Language selection" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget source="languages" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" position="22,84" size="475,420" scrollbarMode="showOnDemand" transparent="1"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (80, 11), size = (360, 20), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the language name, -+ MultiContentEntryPixmap(pos = (10, 6), size = (45, 30), png = 2), # index 2 is the pixmap -+ ], -+ "fonts": [gFont("Regular", 20)], -+ "itemHeight": 42 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="LanguageWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="300,100" size="650,270" font="Regular;23" /> -+ <widget source="languages" render="Listbox" position="150,400" size="440,210" scrollbarMode="showOnDemand" transparent="1" > -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (80, 11), size = (200, 20), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the language name, -+ MultiContentEntryPixmap(pos = (10, 6), size = (45, 30), png = 2), # index 2 is the pixmap -+ ], -+ "fonts": [gFont("Regular", 20)], -+ "itemHeight": 42 -+ } -+ </convert> -+ </widget> -+ <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <!-- Location Box --> -+ <screen name="LocationBox" position="100,120" size="540,460" > -+ <widget name="text" position="0,2" size="540,22" font="Regular;22" /> -+ <widget name="target" position="0,23" size="540,22" valign="center" font="Regular;22" /> -+ <widget name="filelist" position="0,55" zPosition="1" size="540,210" scrollbarMode="showOnDemand" selectionDisabled="1" /> -+ <widget name="textbook" position="0,272" size="540,22" font="Regular;22" /> -+ <widget name="booklist" position="5,302" zPosition="2" size="535,100" scrollbarMode="showOnDemand" /> -+ <widget name="red" position="0,415" zPosition="1" size="136,40" pixmap="Vu_HD/buttons/red.png" transparent="1" alphatest="blend" /> -+ <widget name="key_red" position="20,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="green" position="135,415" zPosition="1" size="136,40" pixmap="Vu_HD/buttons/green.png" transparent="1" alphatest="blend" /> -+ <widget name="key_green" position="155,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="yellow" position="270,415" zPosition="1" size="136,40" pixmap="Vu_HD/buttons/yellow.png" transparent="1" alphatest="blend" /> -+ <widget name="key_yellow" position="290,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="blue" position="405,415" zPosition="1" size="136,40" pixmap="Vu_HD/buttons/blue.png" transparent="1" alphatest="blend" /> -+ <widget name="key_blue" position="425,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ </screen> -+ <!-- Mediaplayer --> -+ <screen name="MediaPlayer" position="209,48" size="864,623" title="MediaPlayer" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_Media.png" zPosition="-1" position="0,0" size="864,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Media.png" position="41,46" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Media Player" position="90,55" size="250,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27d9dee2" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget name="title" position="65,108" size="600,30" font="Semiboldit;29" valign="top" foregroundColor="#ebebeb" backgroundColor="#8c8c8c" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget name="artisttext" position="70,150" size="74,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="artist" position="150,150" size="339,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="albumtext" position="70,185" size="74,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="album" position="150,185" size="339,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="yeartext" position="470,185" size="74,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="year" position="545,185" size="150,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="genretext" position="470,150" size="74,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="genre" position="545,150" size="150,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="coverArt" pixmap="Vu_HD/no_coverArt.png" position="690,103" size="102,102" transparent="1" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/icons/mp_buttons.png" position="40,235" size="152,18" alphatest="blend" /> -+<!-- <widget name="PositionGauge" position="120,493" size="500,10" pointer="Vu_HD/position_pointer.png:660,0" seek_pointer="Vu_HD/position_pointer.png:660,0" transparent="1" />--> -+ <ePixmap pixmap="Vu_HD/icons/Mediaplayerbar_gray.png" zPosition="2" position="210,235" size="563,18" alphatest="blend" /> -+ <widget name="PositionGauge" zPosition="3" position="210,233" size="563,18" pointer="Vu_HD/icons/Mediaplayerbar_purple.png:563,0" seek_pointer="Vu_HD/icons/Mediaplayerbar_purple.png:563,0" transparent="1" /> -+ <widget source="session.CurrentService" render="Label" position="130,254" size="120,18" foregroundColor="#3d0e82" font="Semiboldit;18" halign="right" valign="center" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="ServicePosition">Position</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Label" position="735,254" size="120,18" foregroundColor="#3c3c3c" font="Semiboldit;18" halign="left" valign="center" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="ServicePosition">Remaining</convert> -+ </widget> -+ <widget name="repeat" position="785,234" size="23,20" pixmaps="Vu_HD/icons/ico_noreplay.png,Vu_HD/icons/ico_replay.png" transparent="1" alphatest="blend" /> -+ <eLabel name="Filelist" position="50,300" size="110,22" text="File List" font="Semiboldit;22" foregroundColor="#3c3c3c" backgroundColor="#d9dee2" transparent="1" /> -+ <widget name="filelist" position="45,335" itemHeight="36" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1" size="365,252" scrollbarMode="showOnDemand" /> -+ <eLabel name="Playlist" position="450,300" size="110,22" text="Play List" font="Semiboldit;22" foregroundColor="#3c3c3c" backgroundColor="#d9dee2" transparent="1" /> -+ <widget name="playlist" position="445,335" itemHeight="36" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1" size="365,252" scrollbarMode="showOnDemand" selectionDisabled="1" /> -+ <widget name="currenttext" position="65,80" size="0,0" /> -+ <widget name="titletext" position="65,80" size="0,0" /> -+ </screen> -+ <!-- Menu screens --> -+ <screen name="menu_information" position="0,0" size="580,720" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/bg.png" zPosition="-1" position="60,0" size="520,720" alphatest="blend" transparent="1" /> -+ <widget source="title" render="Label" position="110,120" size="400,38" font="Regular;38" foregroundColor="#5c5c5c" backgroundColor="#27d8dee2" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_menu_Info.png" position="475,70" size="88,88" alphatest="blend" transparent="1" /> -+ <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H45.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#271a53bb" backgroundColor="#27d9dee2" transparent="1" position="84, 175" size="472,495" scrollbarMode="showOnDemand"> -+<!-- <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/FocusBar_menu01.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#acacac" position="84,190" size="370,480" transparent="1" backgroundColor="#ececec" scrollbarMode="showNever"> --> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ MultiContentEntryText(pos = (30, 8), size = (410, 28), flags = RT_HALIGN_LEFT, text = 0 ) ], -+ "fonts": [gFont("Regular", 28)], -+ "itemHeight": 45 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="menu_shutdown" position="0,0" size="580,720" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/bg.png" zPosition="-1" position="60,0" size="520,720" alphatest="blend" transparent="1" /> -+ <widget source="title" render="Label" position="110,120" size="400,38" font="Regular;38" foregroundColor="#5c5c5c" backgroundColor="#27d8dee2" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_menu_Standby.png" position="475,70" size="88,88" alphatest="blend" transparent="1" /> -+ <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H45.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#271a53bb" backgroundColor="#27d9dee2" transparent="1" position="84, 175" size="472,495" scrollbarMode="showOnDemand"> -+<!-- <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/FocusBar_menu01.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#acacac" position="84,190" size="370,480" transparent="1" backgroundColor="#ececec" scrollbarMode="showNever"> --> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ MultiContentEntryText(pos = (30, 8), size = (410, 28), flags = RT_HALIGN_LEFT, text = 0 ) ], -+ "fonts": [gFont("Regular", 28)], -+ "itemHeight": 45 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="menu_system" position="0,0" size="580,720" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/bg.png" zPosition="-1" position="60,0" size="520,720" alphatest="blend" transparent="1" /> -+ <widget source="title" render="Label" position="110,120" size="400,38" font="Regular;38" foregroundColor="#5c5c5c" backgroundColor="#27d8dee2" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_menu_Setup.png" position="475,70" size="88,88" alphatest="blend" transparent="1" /> -+ <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H45.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#271a53bb" backgroundColor="#27d9dee2" transparent="1" position="84, 175" size="472,495" scrollbarMode="showOnDemand"> -+<!-- <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/FocusBar_menu01.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#acacac" position="84,190" size="370,480" transparent="1" backgroundColor="#ececec" scrollbarMode="showNever"> --> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ MultiContentEntryText(pos = (30, 8), size = (410, 28), flags = RT_HALIGN_LEFT, text = 0 ) ], -+ "fonts": [gFont("Regular", 28)], -+ "itemHeight": 45 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="Menu" position="0,0" size="580,720" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/bg.png" zPosition="-1" position="60,0" size="520,720" alphatest="blend" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_menu_Setup.png" position="475,70" size="88,88" alphatest="blend" transparent="1" /> -+ <widget source="title" render="Label" position="110,120" size="400,38" font="Regular;38" foregroundColor="#5c5c5c" backgroundColor="#27d8dee2" transparent="1" /> -+<!-- <eLabel text="" position="153,136" size="3,44" font="Regular;42" foregroundColor="#8c8c8c" backgroundColor="#ec1c1c" /> --> -+ <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H45.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#271a53bb" backgroundColor="#27d9dee2" transparent="1" position="84, 175" size="472,495" scrollbarMode="showOnDemand"> -+<!-- <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/FocusBar_menu01.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#acacac" position="84,190" size="370,480" transparent="1" backgroundColor="#ececec" scrollbarMode="showNever"> --> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ MultiContentEntryText(pos = (30, 8), size = (410, 28), flags = RT_HALIGN_LEFT, text = 0 ) ], -+ "fonts": [gFont("Regular", 28)], -+ "itemHeight": 45 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <!-- Messagebox --> -+ <screen name="MessageBox" position="center,center" size="600,10" title="Message"> -+ <widget name="text" position="65,8" size="420,0" font="Regular;22" /> -+ <widget name="ErrorPixmap" pixmap="Vu_HD/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="QuestionPixmap" pixmap="Vu_HD/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="InfoPixmap" pixmap="Vu_HD/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="list" position="100,100" size="380,375" transparent="1" backgroundColor="darkgrey" /> -+ <applet type="onLayoutFinish"> -+# this should be factored out into some helper code, but currently demonstrates applets. -+from enigma import eSize, ePoint -+ -+orgwidth = self.instance.size().width() -+orgpos = self.instance.position() -+textsize = self["text"].getSize() -+ -+# y size still must be fixed in font stuff... -+textsize = (textsize[0] + 50, textsize[1] + 50) -+offset = 0 -+if self.type == self.TYPE_YESNO: -+ offset = 60 -+wsizex = textsize[0] + 60 -+wsizey = textsize[1] + offset -+if (280 > wsizex): -+ wsizex = 280 -+wsize = (wsizex, wsizey) -+ -+ -+# resize -+self.instance.resize(eSize(*wsize)) -+ -+# resize label -+self["text"].instance.resize(eSize(*textsize)) -+ -+# move list -+listsize = (wsizex, 50) -+self["list"].instance.move(ePoint(0, textsize[1])) -+self["list"].instance.resize(eSize(*listsize)) -+ -+# center window -+newwidth = wsize[0] -+self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) -+ </applet> -+ </screen> -+ <!-- Minute input --> -+ <screen name="MinuteInput" position="center,center" size="280,60" title="Seek"> -+ <widget name="minutes" position="80,15" size="160,25" halign="right" font="Regular;23" /> -+ </screen> -+ <!-- Movie context menu --> -+ <screen name="MovieContextMenu" position="center,center" size="400,260" title="Movielist menu"> -+ <widget name="menu" position="10,10" size="380,250" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Movieselection --> -+ <screen name="MovieSelection" position="145, 55" size="990,610" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_List.png" position="0,0" size="990,610" zPosition="-1" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_media-info.png" position="44,40" size="37,28" alphatest="blend" transparent="1" /> -+ <eLabel text="Recorded files..." position="95,40" size="700,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="44,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="271,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="498,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="725,82" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="89,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_green" position="316,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_yellow" position="543,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_blue" position="770,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="waitingtext" position="60,150" size="860,375" zPosition="4" font="Regular;22" foregroundColor="#1c1c1c" backgroundColor="#27d8dee2" halign="center" valign="center" /> -+ <widget name="list" position="60,150" size="860,375" zPosition="2" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget name="DescriptionBorder" position="80,430" size="800,150" zPosition="1" transparent="1" alphatest="on"/> -+ <widget source="Service" render="Label" position="80,430" zPosition="1" size="640,22" font="Regular;20" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1"> -+ <convert type="MovieInfo">ShortDescription</convert> -+ </widget> -+ <widget source="Service" render="Label" position="840,430" zPosition="1" size="60,20" font="Regular;18" halign="right" backgroundColor="#27aeaeae" transparent="1"> -+ <convert type="ServiceTime">Duration</convert> -+ <convert type="ClockToText">AsLength</convert> -+ </widget> -+ <widget source="Service" render="Label" position="725,450" zPosition="2" size="175,20" font="Regular;18" halign="right" backgroundColor="#27aeaeae" transparent="1"> -+ <convert type="MovieInfo">RecordServiceName</convert> -+ </widget> -+ <widget source="Service" render="Label" position="80,470" zPosition="1" size="800,84" font="Regular;18" backgroundColor="#27aeaeae" transparent="1"> -+ <convert type="EventName">ExtendedDescription</convert> -+ </widget> -+ <widget name="freeDiskSpace" position="80,560" size="830,20" font="Regular;19" backgroundColor="#27aeaeae" valign="center" halign="right" transparent="1" /> -+ </screen> -+ <!-- Mute --> -+ <screen name="Mute" position="92,40" zPosition="10" size="90,80" backgroundColor="transparent" title="Mute" flags="wfNoBorder"> -+ <ePixmap position="0,0" size="90,80" pixmap="Vu_HD/mute.png" transparent="1" alphatest="on" /> -+ </screen> -+ <!-- Nameserver --> -+ <screen name="NameserverSetup" position="209,48" size="865,623" title="Nameserver Setup" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Nameserver Setup" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="config" position="130,166" itemHeight="36" size="600,250" zPosition="3" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget name="introduction" position="140,400" size="600,25" zPosition="10" font="Regular;21" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" halign="center" transparent="1" /> -+ </screen> -+ <!-- Network adapter selection --> -+ <screen name="NetworkAdapterSelection" position="209,48" size="865,623" title="Select Network Adapter" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Select Network Adapter" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="list" position="10,140" size="480,250" transparent="1" scrollbarMode="showOnDemand" zPosition="10"/> -+ <widget source="list" render="Listbox" position="10,140" size="550,280" zPosition="10" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> <!-- iface, name, description, interfacepng, defaultpng, activepng, divpng --> -+ {"template": [ -+ MultiContentEntryText(pos = (85, 6), size = (440, 28), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 1), # index 1 is the interfacename -+ MultiContentEntryText(pos = (85, 43), size = (440, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, text = 2), # index 2 is the description -+ MultiContentEntryPixmapAlphaTest(pos = (2, 8), size = (54, 54), png = 3), # index 3 is the interface pixmap -+ MultiContentEntryPixmapAlphaTest(pos = (63, 46), size = (15, 16), png = 4), # index 4 is the default pixmap -+ ], -+ "fonts": [gFont("Regular", 28),gFont("Regular", 20)], -+ "itemHeight": 70 -+ } -+ </convert> -+ </widget> -+ -+ <widget name="introduction" position="140,490" size="300,21" zPosition="10" font="Regular;21" halign="center" transparent="1" /> -+ </screen> -+ <!-- Network adapter test Black = "#000000" Grey = "#8c8c93" Green = "#1cff1c" Red = #f23d21--> -+ <screen name="NetworkAdapterTest" position="209,48" size="865,623" title="Network test..." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Network test..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="Adaptertext" position="60,176" size="140,26" zPosition="1" font="Semiboldit;24" backgroundColor="darkgrey" foregroundColors="#4c4c4c,#154901" transparent="1"/> -+ <widget name="Adapter" position="220,176" size="270,26" zPosition="1" font="Semiboldit;24" halign="right" foregroundColors="#4c4c4c,#aa0000,#154901" backgroundColor="darkgrey" transparent="1"/> -+ <widget name="AdapterInfo" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="600,169" zPosition="1" size="222,36" transparent="1" alphatest="blend" /> -+ <widget name="AdapterInfo_Text" position="640,177" size="150,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" transparent="1" foregroundColors="#5c5c5c,#1c1c1c,#07255d" /> -+ <widget name="AdapterInfo_OK" pixmap="Vu_HD/icons/lock_on.png" position="550,171" size="38,31" alphatest="blend" zPosition="2" /> -+ <widget name="Networktext" position="60,248" size="140,26" zPosition="1" font="Semiboldit;24" backgroundColor="darkgrey" foregroundColors="#4c4c4c,#154901" transparent="1"/> -+ <widget name="Network" position="220,248" size="270,26" zPosition="1" font="Semiboldit;24" halign="right" foregroundColors="#4c4c4c,#aa0000,#154901" backgroundColor="darkgrey" transparent="1"/> -+ <widget name="NetworkInfo" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="600,241" zPosition="1" size="222,36" transparent="1" alphatest="blend" /> -+ <widget name="NetworkInfo_Text" position="640,249" size="150,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" transparent="1" foregroundColors="#5c5c5c,#1c1c1c,#07255d" /> -+ <widget name="NetworkInfo_Check" pixmaps="Vu_HD/icons/lock_on.png,Vu_HD/icons/lock_error.png" position="550,243" size="38,31" alphatest="blend" zPosition="2" /> -+ <widget name="Dhcptext" position="60,320" size="140,26" zPosition="1" font="Semiboldit;24" backgroundColor="darkgrey" foregroundColors="#4c4c4c,#154901" transparent="1"/> -+ <widget name="Dhcp" position="220,320" size="270,26" zPosition="1" font="Semiboldit;24" halign="right" foregroundColors="#4c4c4c,#aa0000,#154901" backgroundColor="darkgrey" transparent="1"/> -+ <widget name="DhcpInfo" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="600,314" zPosition="1" size="222,36" transparent="1" alphatest="blend" /> -+ <widget name="DhcpInfo_Text" position="640,321" size="150,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" transparent="1" foregroundColors="#5c5c5c,#1c1c1c,#07255d" /> -+ <widget name="DhcpInfo_Check" pixmaps="Vu_HD/icons/lock_on.png,Vu_HD/icons/lock_error.png" position="550,315" size="38,31" alphatest="blend" zPosition="2" /> -+ <widget name="IPtext" position="60,392" size="140,26" zPosition="1" font="Semiboldit;24" backgroundColor="darkgrey" foregroundColors="#4c4c4c,#154901" transparent="1"/> -+ <widget name="IP" position="220,392" size="270,26" zPosition="1" font="Semiboldit;24" halign="right" foregroundColors="#4c4c4c,#aa0000,#154901" backgroundColor="darkgrey" transparent="1"/> -+ <widget name="IPInfo" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="600,386" zPosition="1" size="222,36" transparent="1" alphatest="blend" /> -+ <widget name="IPInfo_Text" position="640,394" size="150,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" transparent="1" foregroundColors="#5c5c5c,#1c1c1c,#07255d" /> -+ <widget name="IPInfo_Check" pixmaps="Vu_HD/icons/lock_on.png,Vu_HD/icons/lock_error.png" position="550,387" size="38,31" alphatest="blend" zPosition="2" /> -+ <widget name="DNStext" position="60,464" size="140,26" zPosition="1" font="Semiboldit;24" backgroundColor="darkgrey" foregroundColors="#4c4c4c,#154901" transparent="1"/> -+ <widget name="DNS" position="220,464" size="270,26" zPosition="1" font="Semiboldit;24" halign="right" foregroundColors="#4c4c4c,#aa0000,#154901" backgroundColor="darkgrey" transparent="1"/> -+ <widget name="DNSInfo" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="600,459" zPosition="1" size="222,36" transparent="1" alphatest="blend" /> -+ <widget name="DNSInfo_Text" position="640,467" size="150,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" transparent="1" foregroundColors="#5c5c5c,#1c1c1c,#07255d" /> -+ <widget name="DNSInfo_Check" pixmaps="Vu_HD/icons/lock_on.png,Vu_HD/icons/lock_error.png" position="550,459" size="38,31" alphatest="blend" zPosition="2" /> -+ <widget name="EditSettingsButton" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="500,531" zPosition="1" size="222,36" transparent="1" alphatest="blend" /> -+ <widget name="EditSettings_Text" position="530,540" size="160,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" halign="center" transparent="1" foregroundColors="#1c1c1c,#1c1c1c,#07255d" /> -+ <widget name="InfoText" position="40,160" size="785,430" zPosition="25" foregroundColor="#3c3c3c" backgroundColor="#27c5c9cc" font="Regular;21" /> -+ </screen> -+ <!-- Network setup --> -+ <screen name="NetworkSetup" position="130,140" size="510,330" title="Network Setup"> -+ <widget name="menu" position="10,10" selectionPixmap="Vu_HD/buttons/Selected_bar_440x23px.png" transparent="1" backgroundColor="#371e1c1a" size="440,310" /> -+ </screen> -+ <!-- Nim selection --> -+ <screen name="NimSelection" position="center,center" size="420,330" title="Choose Tuner"> -+ <widget source="nimlist" render="Listbox" transparent="1" position="0,0" size="420,300" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (10, 5), size = (400, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name, -+ MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings, -+ ], -+ "fonts": [gFont("Regular", 20), gFont("Regular", 15)], -+ "itemHeight": 70 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <!-- Nim setup --> -+ <screen name="NimSetup" position="center,center" size="500,412" title="Reception Settings"> -+ <widget name="config" position="10,10" transparent="1" size="480,402" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Numberzap --> -+ <screen name="NumberZap" position="center,center" size="250,60" title="Channel"> -+ <widget name="channel" position="35,15" size="110,25" font="Regular;23" /> -+ <widget name="number" position="145,15" size="80,25" halign="right" font="Regular;23" /> -+ </screen> -+ <!-- Numerical help dialog --> -+ <screen name="NumericalTextInputHelpDialog" position="440,535" zPosition="2" size="394,124" backgroundColor="#27b5b9bd" flags="wfNoBorder"> -+<!-- -+ <eLabel position="0,0" size="392,92" backgroundColor="#c0c0c0" zPosition="-1" /> -+--> -+ <widget name="key1" position="2,2" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/> -+ <widget name="key2" position="132,2" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/> -+ <widget name="key3" position="262,2" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/> -+ <widget name="key4" position="2,32" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/> -+ <widget name="key5" position="132,32" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/> -+ <widget name="key6" position="262,32" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/> -+ <widget name="key7" position="2,62" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/> -+ <widget name="key8" position="132,62" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/> -+ <widget name="key9" position="262,62" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/> -+ <widget name="help1" position="2,92" size="130,30" font="Regular;16" halign="center" valign="center" transparent="1"/> -+ <widget name="key0" position="132,92" size="130,30" font="Regular;16" halign="center" valign="center" transparent="1"/> -+ <widget name="help2" position="262,92" size="130,30" font="Regular;16" halign="center" valign="center" transparent="1"/> -+ </screen> -+ <!-- Parental control - change pin --> -+ <screen name="ParentalControlChangePin" position="center,center" size="520,160" title="Change pin code"> -+ <widget name="config" position="10,10" size="500,350" transparent="1" backgroundColor="#27d9dee2" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Parental control - editor --> -+ <screen name="ParentalControlEditor" position="center,center" size="520,400" title="Parental control services Editor"> -+ <widget name="servicelist" position="10,10" size="500,350" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Parental control - setup --> -+ <screen name="ParentalControlSetup" position="209,48" size="865,623" title="Parental control setup" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Parental control setup" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget name="config" position="100,129" itemHeight="36" transparent="1" backgroundColor="#275c5c5c" size="650,350" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Picture in picture --> -+ <screen name="PictureInPicture" position="400,60" zPosition="-1" size="240,192" flags="wfNoBorder"> -+ <widget name="video" position="0,0" size="240,192" backgroundColor="transparent" /> -+ </screen> -+ <!-- Pin input --> -+ <screen name="PinInput" position="center,center" size="500,170" title="Pin code needed"> -+ <widget name="service" position="10,10" size="480,25" font="Regular;20" /> -+ <widget name="text" position="10,40" size="480,25" font="Regular;20" halign="center" /> -+ <widget name="tries" position="10,70" size="480,25" font="Regular;20" halign="center" /> -+ <widget name="input" position="10,110" size="480,40" font="Regular;50" halign="center" /> -+ </screen> -+ <!-- Picture in picture setup --> -+ <screen name="PiPSetup" position="center,center" size="600,150" backgroundColor="transparent" flags="wfNoBorder" title="PiPSetup"> -+ <widget name="text" position="0,0" size="600,150" font="Regular;23" /> -+ </screen> -+ <!-- Plugin browser --> -+ <screen name="PluginBrowser" position="209,48" size="865,623" title="Plugin browser" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Plugin browser" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="435,98" size="25,25" alphatest="blend" /> -+ <widget name="red" position="76,97" zPosition="1" size="300,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="green" position="466,97" zPosition="1" size="300,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="list" position="60,130" size="700,450" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Plugin downloads --> -+ <screen name="PluginDownloadBrowser" position="209,48" size="865,623" title="Downloadable plugins" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Downloadable plugins" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget name="text" position="60,130" zPosition="1" size="700,480" foregroundColor="#3c3c3c" font="Regular;20" halign="center" valign="center" /> -+ <widget name="list" position="70,140" zPosition="2" size="680,460" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- PVR state --> -+ <screen name="PVRState" position="70,70" zPosition="2" size="150,30" backgroundColor="transpBlack" flags="wfNoBorder"> -+ <widget name="state" position="0,0" size="150,30" font="Regular;25" halign="center" backgroundColor="transpBlack" foregroundColor="white" /> -+ </screen> -+ <!-- Radio infobar --> -+ <screen name="RadioInfoBar" position="810, 173" size="320,470" zPosition="-1" flags="wfNoBorder" title="Radio" backgroundColor="#27c8c8c8"> -+ <widget source="session.CurrentService" render="Label" position="0,10" zPosition="1" size="270,24" font="Regular;24" foregroundColor="#07255d" backgroundColor="#27c8c8c8" halign="left" noWrap="1" transparent="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="RdsDecoder" render="Pixmap" pixmap="Vu_HD/icons/rass_logo.png" position="270,0" size="50,21" alphatest="on"> -+ <convert type="RdsInfo">RasInteractiveAvailable</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="session.RecordState" render="Pixmap" pixmap="Vu_HD/icons/record.png" position="288,22" zPosition="2" size="20,20" alphatest="on" > -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Label" position="0,42" zPosition="1" size="300,24" foregroundColor="#07255d" backgroundColor="#27c8c8c8" font="Semibold;24" noWrap="1" transparent="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Label" position="0,70" zPosition="1" size="50,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27c8c8c8" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Label" position="155,70" zPosition="1" size="70,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27c8c8c8" transparent="1"> -+ <convert type="EventTime">EndTime</convert> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Progress" position="165,75" zPosition="1" pixmap="Vu_HD/progress_medium.png" size="124,10" backgroundColor="#ffffff" > -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="session.Event_Next" render="Label" position="0,90" zPosition="1" size="300,24" foregroundColor="#07255d" backgroundColor="#27c8c8c8" font="Semibold;24" noWrap="1" transparent="1"> -+ <convert type="EventName">Name</convert> -+ </widget> -+ <widget source="session.Event_Next" render="Label" position="0,120" zPosition="1" size="50,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27c8c8c8" transparent="1"> -+ <convert type="EventTime">StartTime</convert> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="session.Event_Next" render="Label" position="55,120" zPosition="1" size="70,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27c8c8c8" transparent="1"> -+ <convert type="EventTime">EndTime</convert> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="RdsDecoder" render="Label" position="0,150" size="300,300" font="LCD;20" foregroundColor="#80ffff" backgroundColor="#27c8c8c8" transparent="1"> -+ <convert type="RdsInfo">RadioText</convert> -+ </widget> -+ </screen> -+ <!-- RASS --> -+ <screen name="RassInteractive" position="50,180" size="100,275" backgroundColor="transpWhite" flags="wfNoBorder"> -+ <ePixmap pixmap="Vu_HD/icons/rass_logo.png" position="25,0" size="50,21" transparent="1" alphatest="on" /> -+ <eLabel text="Index" position="36,25" size="60,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <eLabel text="0" position="5,25" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="Marker" position="21,25" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <eLabel text="1" position="5,50" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_1" position="35,50" size="36,20" alphatest="on" /> -+ <eLabel text="2" position="5,75" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_2" position="35,75" size="36,20" alphatest="on" /> -+ <eLabel text="3" position="5,100" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_3" position="35,100" size="36,20" alphatest="on" /> -+ <eLabel text="4" position="5,125" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_4" position="35,125" size="36,20" alphatest="on" /> -+ <eLabel text="5" position="5,150" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_5" position="35,150" size="36,20" alphatest="on" /> -+ <eLabel text="6" position="5,175" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_6" position="35,175" size="36,20" alphatest="on" /> -+ <eLabel text="7" position="5,200" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_7" position="35,200" size="36,20" alphatest="on" /> -+ <eLabel text="8" position="5,225" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_8" position="35,225" size="36,20" alphatest="on" /> -+ <eLabel text="9" position="5,250" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" /> -+ <widget name="subpages_9" position="35,250" size="36,20" alphatest="on" /> -+ </screen> -+ <!-- RDS info --> -+ <screen name="RdsInfoDisplay" position="0,0" size="1280,720" zPosition="-2" backgroundColor="transparent" flags="wfNoBorder"> -+ <widget name="RassLogo" pixmap="Vu_HD/icons/rass_logo.png" position="100,585" size="50,21" /> -+ <widget name="RadioText" position="100,620" size="1080,30" font="Regular;24" noWrap="1" backgroundColor="transpBlack" /> -+ <widget name="RtpText" position="100,650" size="1080,30" font="Regular;24" halign="right" noWrap="1" backgroundColor="transpBlack" /> -+ </screen> -+ <!-- Satfinder --> -+ <screen name="Satfinder" position="209,48" size="865,623" title="Satfinder" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Satfinder" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget name="introduction" position="0,0" size="0,0" font="Regular;23" /> -+ <ePixmap pixmap="Vu_HD/icons/dish_scan.png" position="150,150" zPosition="0" size="119,110" transparent="1" alphatest="on" /> -+ <widget source="Frontend" render="Label" position="340,140" zPosition="2" size="260,20" font="Regular;19" backgroundColor="#27d9dee2" halign="center" valign="center" transparent="1"> -+ <convert type="FrontendInfo">SNRdB</convert> -+ </widget> -+ <eLabel name="snr" text="SNR:" position="270,165" size="60,22" font="Regular;21" halign="right" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="340,165" size="260,20" pixmap="Vu_HD/bar_snr.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">SNR</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="610,165" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="FrontendInfo">SNR</convert> -+ </widget> -+ <eLabel name="agc" text="AGC:" position="270,190" size="60,22" font="Regular;21" halign="right" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="340,190" size="260,20" pixmap="Vu_HD/bar_snr.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">AGC</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="610,190" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="FrontendInfo">AGC</convert> -+ </widget> -+ <eLabel name="ber" text="BER:" position="270,215" size="60,22" font="Regular;21" halign="right" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="340,215" size="260,20" pixmap="Vu_HD/bar_ber.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">BER</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="610,215" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="FrontendInfo">BER</convert> -+ </widget> -+ <eLabel name="lock" text="Lock:" position="270,245" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" halign="right" transparent="1"/> -+ <widget source="Frontend" render="Pixmap" pixmap="Vu_HD/icons/lock_on.png" position="340,245" zPosition="1" size="38,31" alphatest="on"> -+ <convert type="FrontendInfo">LOCK</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="Frontend" render="Pixmap" pixmap="Vu_HD/icons/lock_off.png" position="340,240" zPosition="1" size="38,31" alphatest="on"> -+ <convert type="FrontendInfo">LOCK</convert> -+ <convert type="ConditionalShowHide">Invert</convert> -+ </widget> -+ <eLabel text=" " position="160,282" zPosition="1" size="500,2" backgroundColor="#8c8c8c" /> -+ <widget name="config" position="160,295" transparent="1" backgroundColor="#27cccccc" size="500,288" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Scan setup --> -+ <screen name="ScanSetup" position="center,center" size="520,405" title="Service scan"> -+ <widget name="config" position="10,10" transparent="1" size="500,350" scrollbarMode="showOnDemand" /> -+ <widget name="introduction" position="10,365" size="500,40" font="Regular;20" halign="center" /> -+ </screen> -+ <!-- Scan simple --> -+ <screen name="ScanSimple" position="center,center" size="420,350" title="Service scan"> -+ <widget name="header" position="10,10" size="400,25" font="Regular;23" /> -+ <widget name="config" position="10,55" transparent="1" size="400,250" scrollbarMode="showOnDemand" /> -+ <widget name="footer" position="10,310" size="400,20" font="Regular;20" halign="center" /> -+ </screen> -+ <!-- Scart --> -+ <screen name="Scart" position="0,0" size="1280,720" backgroundColor="transparent" /> -+ <!-- Service info --> -+ <screen name="ServiceInfo" position="209,48" size="865,623" title="Serviceinfo" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Info.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Serviceinfo" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget name="red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="infolist" position="60,140" size="700,460" itemHeight="36" foregroundColor="#3c3c3c" selectionDisabled="1" transparent="1"/> -+ </screen> -+ <!-- Service scan --> -+ <screen name="ServiceScan" position="center,center" size="420,390" title="Service Scan"> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-s.png" position="5,5" size="64,64" transparent="1" alphatest="blend"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">0,0</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-c.png" position="5,5" size="64,64" transparent="1" alphatest="on"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">1,1</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-t.png" position="5,5" size="64,64" transparent="1" alphatest="on"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">2,2</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget name="network" position="80,15" size="330,20" font="Regular;20" /> -+ <widget name="transponder" position="80,40" size="330,20" font="Regular;20" /> -+ <widget name="scan_state" position="10,80" zPosition="2" size="400,20" font="Regular;18" /> -+ <widget name="pass" position="10,80" size="400,20" font="Regular;18" /> -+ <widget name="scan_progress" position="10,105" size="400,15" pixmap="Vu_HD/progress_big.png" borderWidth="2" borderColor="#cccccc" /> -+ <widget name="servicelist" position="10,135" size="400,265" selectionDisabled="1" /> -+ </screen> -+ <!-- Setup --> -+ <screen name="Setup" position="209,48" size="865,624" title="Setup" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" position="0,0" size="865,624" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="26,41" size="40,40" alphatest="blend" transparent="1" /> -+ <widget source="Title" render="Label" position="80,50" size="250,34" font="Semiboldit;34" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="83,97" zPosition="2" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="2" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="config" position="45,130" itemHeight="36" foregroundColorSelected="#ebebeb" foregroundColor="#1c1c1c" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1" size="772,432" scrollbarMode="showNever" /> -+ </screen> -+ <!-- Simple channelselection --> -+ <screen name="SimpleChannelSelection" position="145, 55" size="990,610" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_List.png" position="0,0" size="990,610" zPosition="-1" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/ico_Chlist_title.png" position="44,37" size="38,34" alphatest="blend" transparent="1" /> -+ <widget source="Title" render="Label" position="95,40" size="700,32" zPosition="3" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" /> -+<!-- <widget name="etitle" position="95,43" size="450,32" font="Semiboldit;32" halign="left" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" />--> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="44,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="271,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="498,82" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="725,82" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="89,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_green" position="316,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_yellow" position="543,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="key_blue" position="770,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" /> -+ <widget name="list" position="60,130" size="700,460" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Skin Selector --> -+ <screen name="SkinSelector" position="209,48" size="865,623" title="Choose your Skin" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="26,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Choose your Skin" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="83,98" zPosition="2" size="150,25" foregroundColor="#1c1c1c" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" transparent="1" /> -+ <widget source="introduction" render="Label" position="60,130" size="600,30" zPosition="10" foregroundColor="#3c3c3c" font="Regular;21" halign="left" valign="center" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="SkinList" position="60,170" size="420,440" itemHeight="30" backgroundColor="#27d9dee2" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="Preview" position="520,250" size="280,210" alphatest="on" /> -+ </screen> -+ <!-- Sleeptimer edit --> -+ <screen name="SleepTimerEdit" position="center,center" size="520,200" title="Sleep Timer"> -+ <widget name="current_status" position="40,40" size="400,30" valign="center" font="Regular;20" foregroundColor="#3c3c3c" /> -+ <widget name="red" pixmap="Vu_HD/buttons/red.png" position="2,83" size="25,25" alphatest="blend" /> -+ <widget name="green" pixmap="Vu_HD/buttons/green.png" position="2,122" size="25,25" alphatest="blend" /> -+ <widget name="yellow" pixmap="Vu_HD/buttons/yellow.png" position="2,162" size="25,25" alphatest="blend"/> -+ <widget name="blue" pixmap="Vu_HD/buttons/blue.png" position="2,162" size="25,25" alphatest="blend" /> -+ <widget name="red_text" position="40,80" size="400,30" valign="center" font="Regular;20" foregroundColor="#3c3c3c" /> -+ <widget name="green_text" position="40,120" size="400,30" valign="center" font="Regular;20" foregroundColor="#3c3c3c" /> -+ <widget name="yellow_text" position="40,160" size="400,30" valign="center" font="Regular;20" foregroundColor="#3c3c3c" /> -+ <widget name="blue_text" position="40,200" size="400,30" valign="center" font="Regular;20" foregroundColor="#3c3c3c" /> -+ <widget name="pretext" position="15,10" size="235,25" font="Regular;19" foregroundColor="#3c3c3c" /> -+ <widget name="input" position="260,10" size="40,25" font="Regular;19" foregroundColor="#3c3c3c" /> -+ <widget name="aftertext" position="305,10" size="100,25" font="Regular;19" foregroundColor="#3c3c3c" /> -+ <ePixmap pixmap="Vu_HD/sleeptimer.png" position="390,17" size="116,142" alphatest="blend" /> -+ </screen> -+ <!-- Standby mode --> -+ <screen name="Standby" flags="wfNoBorder" position="0,0" size="720,576" title="Standby" /> -+ <!-- Start Wizard --> -+ <screen name="StartWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder"> -+ <widget name="text" position="303,140" size="340,300" font="Regular;22" /> -+ <widget source="list" render="Listbox" position="253,440" size="440,180" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <widget name="config" position="253,440" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="140,322" zPosition="0" size="25,25" transparent="1" alphatest="blend" /> -+ <widget name="languagetext" position="178,325" size="95,30" font="Regular;18" /> -+ <widget name="rc" pixmaps="Vu_HD/rc.png,Vu_HD/rcold.png" position="950,150" zPosition="10" size="154,500" alphatest="blend" /> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowdown2" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ </screen> -+ <!-- Network Wizard --> -+ <screen name="NetworkWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="303,140" size="340,300" font="Regular;22" /> -+ <widget source="list" render="Listbox" position="253,440" size="440,180" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <widget name="config" position="253,440" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="140,322" zPosition="0" size="25,25" transparent="1" alphatest="blend" /> -+ <widget name="languagetext" position="178,325" size="95,30" font="Regular;18" /> -+ <widget name="rc" pixmaps="Vu_HD/rc.png,Vu_HD/rcold.png" position="950,150" zPosition="10" size="154,500" alphatest="blend" /> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowdown2" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget source="VKeyIcon" render="Pixmap" pixmap="Vu_HD/buttons/key_text.png" position="40,260" zPosition="0" size="35,25" transparent="1" alphatest="on" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget name="HelpWindow" pixmap="Vu_HD/buttons/key_text.png" position="125,170" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen> -+ <!-- Subservice quickzap --> -+ <screen name="SubservicesQuickzap" position="124,470" size="512,200" title="Subservices" backgroundColor="transparent" flags="wfNoBorder"> -+ <widget source="session.RecordState" render="Pixmap" pixmap="Vu_HD/icons/record.png" position="450,0" zPosition="2" size="14,14" alphatest="on" > -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ <eLabel text="Subservices" position="0,0" size="470,20" font="Regular;13" backgroundColor="#33294a6b" /> -+ <widget name="CurrentSubserviceNumber" position="0,20" size="50,34" font="Regular;22" backgroundColor="#33294a6b" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget source="session.CurrentService" render="Label" position="50,20" size="420,34" font="Regular;22" backgroundColor="#33294a6b" shadowColor="black" shadowOffset="-1,-1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ </screen> -+ <!-- Subtitle selection --> -+ <screen name="Subtitles" position="center,80" size="520,538" title="Subtitle selection" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Subtitles.png" position="20,38" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Subtitle selection" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget name="config" position="15,83" itemHeight="42" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" transparent="1" zPosition="1" size="490,420" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Subtitle area --> -+ <screen name="SubtitleDisplay" position="0,0" size="1280,720" zPosition="-1" flags="wfNoBorder" backgroundColor="transparent" /> -+ <!-- Time & date input --> -+ <screen name="TimeDateInput" position="160,150" size="400,200" title="Time/Date Input"> -+ <widget name="cancel" pixmap="Vu_HD/buttons/red.png" position="10,0" size="136,40" alphatest="blend" /> -+ <widget name="ok" pixmap="Vu_HD/buttons/green.png" position="260,0" size="136,40" alphatest="blend" /> -+ <widget name="canceltext" position="30,0" zPosition="1" size="115,40" font="Regular;19" halign="center" valign="center" transparent="1" /> -+ <widget name="oktext" position="280,0" zPosition="1" size="115,40" font="Regular;19" halign="center" valign="center" transparent="1" /> -+ <widget name="config" position="10,40" transparent="1" size="380,150" /> -+ </screen> -+ <!-- Timer edit --> -+ <screen name="TimerEdit" position="70,130" size="590,335" title="Timer Edit"> -+ <widget name="description" position="10,10" size="580,40" font="Regular;25" /> -+ <widget name="lbegin" position="405,102" size="103,30" font="Regular;25" foregroundColor="red" /> -+ <widget name="lend" position="405,158" size="103,30" font="Regular;25" foregroundColor="green" /> -+ <widget name="begin" position="508,105" size="72,35" font="Regular;25" /> -+ <widget name="end" position="508,150" size="72,35" font="Regular;25" /> -+ <widget name="apply" position="10,240" size="250,35" /> -+ </screen> -+ <!-- Timer edit list --> -+ <screen name="TimerEditList" position="209,48" size="865,623" title="Eventview" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Timer.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Timer List" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="timerlist" position="60,130" transparent="1" size="740,420" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Timer entry --> -+ <screen name="TimerEntry" position="209,48" size="865,623" title="Eventview" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Timer.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Timer entry" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget name="cancel" pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" backgroundColor="#27c5c9cc" /> -+ <widget name="ok" pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" backgroundColor="#27c5c9cc" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget name="canceltext" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="oktext" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="config" position="60,140" transparent="1" backgroundColor="#27d9dee2" size="740,325" scrollbarMode="showOnDemand" /> -+ <eLabel text=" " position="50,470" zPosition="-1" size="760,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#8c8c8c" /> -+ </screen> -+ <!-- Timer log --> -+ <screen name="TimerLog" position="209,48" size="865,623" title="Eventview" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Timer.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Timer log" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="loglist" position="50,130" size="760,300" scrollbarMode="showOnDemand" /> -+ <widget name="logentry" position="50,450" size="760,150" font="Regular;20" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1"/> -+ </screen> -+ <!-- Timer sanity conflict --> -+ <screen name="TimerSanityConflict" position="209,48" size="865,623" title="Eventview" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Timer.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Timer sanity error" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="timer1" position="60,140" size="700,75" scrollbarMode="showNever" /> -+ <widget name="timer2" position="60,230" size="700,75" scrollbarMode="showNever" /> -+ <widget name="list" position="60,320" size="700,288" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Timer Selection --> -+ <screen name="TimerSelection" position="90,120" size="550,430" title="Timer selection"> -+ <widget name="timerlist" position="0,45" size="550,350" scrollbarMode="showOnDemand" /> -+ </screen> -+ <!-- Timeshift state --> -+ <screen name="TimeshiftState" position="70,70" zPosition="2" size="150,60" backgroundColor="transpBlack" flags="wfNoBorder"> -+ <widget name="state" position="0,3" size="150,30" font="Regular;25" halign="center" foregroundColor="white" backgroundColor="transpBlack" /> -+ <widget source="session.CurrentService" render="Label" position="0,35" size="150,30" font="Regular;25" halign="center" foregroundColor="white" backgroundColor="transpBlack"> -+ <convert type="ServicePosition">Remaining</convert> -+ </widget> -+ </screen> -+ <!-- Translator Info --> -+ <screen name="TranslationInfo" position="center,center" size="420,350" title="Translation"> -+ <eLabel position="10,20" size="380,23" font="Regular;23" text="Translation:" /> -+ <widget source="TranslatorName" render="Label" position="10,55" size="380,20" font="Regular;20" /> -+ <widget source="TranslationInfo" render="Label" position="10,100" size="380,250" font="Regular;20" /> -+ </screen> -+ <!-- Tutorial Wizard --> -+ <screen name="TutorialWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="303,140" size="340,300" font="Regular;22" /> -+ <widget source="list" render="Listbox" position="253,440" size="440,180" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <widget name="rc" pixmaps="Vu_HD/rc.png,Vu_HD/rcold.png" position="950,150" zPosition="10" size="154,500" alphatest="blend" /> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" /> -+ </screen> -+ <!-- Volumebar --> -+ <screen name="Volume" position="92,40" zPosition="1" size="324,62" title="Volume" flags="wfNoBorder" backgroundColor="transparent" > -+ <ePixmap pixmap="Vu_HD/volume_background.png" position="0,0" size="324,62" /> -+ <widget name="Volume" pixmap="Vu_HD/volume_up.png" position="60,13" zPosition="1" size="250,34" transparent="1" /> -+ </screen> -+ -+ <!-- LCD/OLED Screens --> -+ -+ <!-- LCD screen (channelselection) --> -+ <screen name="ChannelSelection_summary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.ServiceEvent" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="parent.ServiceEvent" render="Progress" position="16,27" size="100,5" borderWidth="1"> -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="6,32" size="90,32" font="Regular;32" halign="right" valign="top" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="100,34" zPosition="1" size="26,30" font="Regular;16" valign="top" transparent="1"> -+ <convert type="ClockToText">Format:%S</convert> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (ChannelSelection) --> -+ <screen name="ChannelSelection_summary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.ServiceEvent" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="parent.ServiceEvent" render="Progress" position="0,27" size="96,5" borderWidth="1" > -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" > -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ </screen> -+ <!-- LCD screen (main) --> -+ <screen name="InfoBarSummary" position="0,0" size="132,64" id="1"> -+ <widget source="session.CurrentService" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Progress" position="16,27" size="100,5" borderWidth="1"> -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="6,32" size="90,32" font="Regular;32" halign="right" valign="top" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="100,34" zPosition="1" size="26,30" font="Regular;16" valign="top" transparent="1"> -+ <convert type="ClockToText">Format:%S</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" text=" " position="6,30" zPosition="1" size="120,34"> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (main) --> -+ <screen name="InfoBarSummary" position="0,0" size="96,64" id="2"> -+ <widget source="session.CurrentService" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.Event_Now" render="Progress" position="0,27" size="96,5" borderWidth="1" > -+ <convert type="EventTime">Progress</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" > -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" text=" " position="0,32" zPosition="1" size="96,32"> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- LCD screen (movieplayer) --> -+ <screen name="InfoBarMoviePlayerSummary" position="0,0" size="132,64" id="1"> -+ <widget source="session.CurrentService" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Progress" position="16,27" size="100,5" borderWidth="1"> -+ <convert type="ServicePosition">Position</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="6,32" size="120,32" font="Regular;32" halign="center" valign="center" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" text=" " position="6,32" zPosition="1" size="120,32"> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (movieplayer) --> -+ <screen name="InfoBarMoviePlayerSummary" position="0,0" size="96,64" id="2"> -+ <widget source="session.CurrentService" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" > -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Progress" position="0,27" size="96,5" borderWidth="1" > -+ <convert type="ServicePosition">Position</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" > -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" text=" " position="0,32" zPosition="1" size="96,32"> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- LCD screen (ChoiceBox) --> -+ <screen name="ChoiceBox_summary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.summary_list" render="Label" position="6,0" size="126,64" font="Regular;11" /> -+ </screen> -+ <!-- Color OLED screen (ChoiceBox) --> -+ <screen name="ChoiceBox_summary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.summary_list" render="Label" position="0,0" size="96,64" font="Regular;10" /> -+ </screen> -+ <!-- LCD screen (MessageBox) --> -+ <screen name="MessageBox_summary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.Text" render="Label" position="0,0" size="132,52" font="Regular;11" halign="center" valign="center" /> -+ <widget source="parent.selectedChoice" render="Label" position="6,50" size="120,14" font="Regular;14" halign="center" valign="center" /> -+ </screen> -+ <!-- Color OLED screen (MessageBox) --> -+ <screen name="MessageBox_summary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.Text" render="Label" position="0,0" size="96,52" font="Regular;10" halign="center" valign="center" /> -+ <widget source="parent.selectedChoice" render="Label" position="0,50" size="96,14" font="Regular;12" halign="center" valign="center" /> -+ </screen> -+ <!-- LCD screen (menus) --> -+ <screen name="MenuSummary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.title" render="Label" position="6,0" size="120,32" font="Regular;14" halign="center" valign="center"/> -+ <widget source="parent.menu" render="Label" position="6,32" size="120,32" font="Regular;16" halign="center" valign="center"> -+ <convert type="StringListSelection" /> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (menus) --> -+ <screen name="MenuSummary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.title" render="Label" position="0,0" size="96,32" font="Regular;14" halign="center" valign="center"/> -+ <widget source="parent.menu" render="Label" position="0,32" size="96,32" font="Regular;14" halign="center" valign="center"> -+ <convert type="StringListSelection" /> -+ </widget> -+ </screen> -+ <!-- LCD screen (ServiceScan) --> -+ <screen name="ServiceScanSummary" position="0,0" size="132,64" id="1"> -+ <widget name="Title" position="6,4" size="120,42" font="Regular;16" transparent="1" /> -+ <widget name="Service" position="6,22" size="120,26" font="Regular;12" transparent="1" /> -+ <widget name="scan_progress" position="6,50" zPosition="1" borderWidth="1" size="56,12" backgroundColor="dark" /> -+ </screen> -+ <!-- Color OLED screen (ServiceScan) --> -+ <screen name="ServiceScanSummary" position="0,0" size="96,64" id="2"> -+ <widget name="Title" position="0,0" size="96,30" font="Regular;14" transparent="1" /> -+ <widget name="Service" position="0,30" size="96,20" font="Regular;10" transparent="1" /> -+ <widget name="scan_progress" position="0,50" zPosition="1" borderWidth="1" size="96,12" backgroundColor="dark" /> -+ </screen> -+ <!-- LCD screen (setup) --> -+ <screen name="SetupSummary" position="0,0" size="132,64" id="1"> -+ <widget source="SetupTitle" render="Label" position="6,0" size="120,16" font="Regular;12" /> -+ <widget source="SetupEntry" render="Label" position="6,16" size="120,32" font="Regular;12" /> -+ <widget source="SetupValue" render="Label" position="6,48" size="120,16" font="Regular;12" /> -+ </screen> -+ <!-- Color OLED screen (setup) --> -+ <screen name="SetupSummary" position="0,0" size="96,64" id="2"> -+ <widget source="SetupTitle" render="Label" position="0,0" size="96,16" font="Regular;10" /> -+ <widget source="SetupEntry" render="Label" position="0,16" size="96,32" font="Regular;10" /> -+ <widget source="SetupValue" render="Label" position="0,48" size="96,16" font="Regular;10" /> -+ </screen> -+ <!-- LCD screen (misc) --> -+ <screen name="SimpleSummary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.Title" render="Label" position="6,0" size="120,64" font="Regular;16" halign="center" valign="center" /> -+ </screen> -+ <!-- Color OLED screen (misc) --> -+ <screen name="SimpleSummary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.Title" render="Label" position="0,0" size="96,64" font="Regular;14" halign="center" valign="center" /> -+ </screen> -+ <!-- LCD screen (standby) --> -+ <screen name="StandbySummary" position="0,0" size="132,64" id="1"> -+ <widget source="global.CurrentTime" render="Label" position="6,0" size="120,64" font="Regular;40" halign="center" valign="center"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" position="6,0" zPosition="1" size="120,64" text=" "> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (standby) --> -+ <screen name="StandbySummary" position="0,0" size="96,64" id="2"> -+ <widget source="global.CurrentTime" render="Label" position="0,0" size="96,64" font="Regular;40" halign="center" valign="center"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <widget source="session.RecordState" render="FixedLabel" position="0,0" zPosition="1" size="96,64" text=" "> -+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert> -+ <convert type="ConditionalShowHide">Blink</convert> -+ </widget> -+ </screen> -+ <!-- LCD screen (JobView) --> -+ <screen name="JobView_summary" position="0,0" size="132,64" id="1"> -+ <widget source="parent.summary_job_name" render="Label" position="6,4" size="120,42" font="Regular;16" /> -+ <widget source="parent.summary_job_task" render="Label" position="6,22" size="120,26" font="Regular;12" /> -+ <widget source="parent.summary_job_progress" render="Progress" position="6,50" size="60,12" borderWidth="1" zPosition="1" /> -+ <widget source="parent.summary_job_progress" render="Label" position="66,50" size="50,12" font="Regular;12" zPosition="2" halign="center" transparent="1" > -+ <convert type="ProgressToText" /> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (JobView) --> -+ <screen name="JobView_summary" position="0,0" size="96,64" id="2"> -+ <widget source="parent.summary_job_name" render="Label" position="0,4" size="96,42" font="Regular;14" /> -+ <widget source="parent.summary_job_task" render="Label" position="0,22" size="96,26" font="Regular;10" /> -+ <widget source="parent.summary_job_progress" render="Progress" position="0,50" size="60,12" borderWidth="1" zPosition="1" /> -+ <widget source="parent.summary_job_progress" render="Label" position="60,50" size="36,12" font="Regular;10" zPosition="2" halign="center" transparent="1" > -+ <convert type="ProgressToText" /> -+ </widget> -+ </screen> -+ <!-- LCD screen (Wizard) --> -+ <screen name="WizardSummary" position="0,0" size="132,64" id="1"> -+ <widget source="text" render="Label" position="6,0" size="120,16" font="Regular;16" transparent="1" /> -+ <widget source="parent.list" render="Label" position="6,18" size="120,46" font="Regular;12"> -+ <convert type="StringListSelection" /> -+ </widget> -+ </screen> -+ <!-- Color OLED screen (Wizard) --> -+ <screen name="WizardSummary" position="0,0" size="96,64" id="2"> -+ <widget source="text" render="Label" position="0,0" size="96,16" font="Regular;14" transparent="1" /> -+ <widget source="parent.list" render="Label" position="0,18" size="96,46" font="Regular;12"> -+ <convert type="StringListSelection" /> -+ </widget> -+ </screen> -+ -+ <!-- JobView --> -+ <screen name="JobView" position="center,center" size="520,350" title="Job View"> -+ <widget source="job_name" render="Label" position="20,12" size="480,60" font="Regular;28" /> -+ <widget source="job_task" render="Label" position="20,90" size="480,50" font="Regular;23" /> -+ <widget source="job_progress" render="Progress" position="20,162" size="480,36" borderWidth="2" backgroundColor="#254f7497" /> -+ <widget source="job_progress" render="Label" position="120,166" size="280,32" font="Regular;28" foregroundColor="#000000" zPosition="2" halign="center" transparent="1" > -+ <convert type="ProgressToText" /> -+ </widget> -+ <widget source="job_status" render="Label" position="20,212" size="480,26" font="Regular;23" /> -+ <widget name="config" position="20,254" size="480,20" /> -+ <widget source="cancelable" render="Pixmap" pixmap="Vu_HD/buttons/red.png" position="20,300" size="25,25" alphatest="on" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="cancelable" render="FixedLabel" text="Cancel" position="50,300" zPosition="1" size="110,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="finished" render="Pixmap" pixmap="Vu_HD/buttons/green.png" position="190,300" size="25,25" alphatest="on" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="finished" render="FixedLabel" text="OK" font="Regular;20" halign="center" valign="center" position="220,300" size="110,40" transparent="1" backgroundColor="#1f771f" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="backgroundable" render="Pixmap" pixmap="Vu_HD/buttons/blue.png" position="360,300" size="25,25" alphatest="on" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="backgroundable" render="FixedLabel" text="Continue in background" font="Regular;20" halign="center" valign="center" position="390,300" size="110,40" transparent="1" backgroundColor="#18188b" > -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ </screen> -+ <!-- VirtualKeyBoard --> -+ <screen name="VirtualKeyBoard" position="center,center" size="560,350" zPosition="99" title="Virtual KeyBoard"> -+ <ePixmap pixmap="skin_default/vkey_text.png" position="9,35" zPosition="-4" size="542,52" alphatest="on" /> -+ <widget name="header" position="10,10" size="500,20" font="Regular;20" transparent="1" noWrap="1" /> -+ <widget name="text" position="12,35" size="536,46" font="Regular;46" transparent="1" noWrap="1" halign="right" /> -+ <widget name="list" position="10,100" size="540,225" selectionDisabled="1" foregroundColor="#ececec" backgroundColor="#1c2c5c" transparent="1" /> -+ </screen> -+ <!-- FileBrowser --> -+ <screen name="FileBrowser" position="center,120" size="700,500" title="DVD File Browser" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="100,0" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="295,0" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="138,0" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="#279e9fa4" transparent="1" /> -+ <widget source="key_green" render="Label" position="333,0" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="#279e9fa4" transparent="1" /> -+ <widget name="filelist" position="50,50" size="600,450" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="CutListEditor" position="0,0" size="1280,720" title="Cutlist editor" flags="wfNoBorder"> -+ <widget source="global.CurrentTime" render="Label" position="1130,40" size="80,26" font="Regular;26" halign="right" transparent="1" > -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="1000,72" size="210,22" font="Regular;20" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%d.%m.%Y</convert> -+ </widget> -+ <eLabel text="Cutlist editor" position="90,120" size="320,32" font="Regular;27" transparent="1" /> -+ <eLabel position="80,155" size="340,420" zPosition="1" backgroundColor="black" /> -+ <eLabel position="81,156" size="338,418" zPosition="2" backgroundColor="white" /> -+ <widget source="cutlist" render="Listbox" position="90,165" zPosition="3" size="320,400" scrollbarMode="showOnDemand" backgroundColor="white" transparent="1" > -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(size=(220, 20), text = 1), -+ MultiContentEntryText(pos=(220,2), size=(100, 20), text = 2, flags = RT_HALIGN_RIGHT) -+ ], -+ "fonts": [gFont("Regular", 20)], -+ "itemHeight": 25 -+ } -+ </convert> -+ </widget> -+ <eLabel position="479,124" zPosition="3" size="696,377" backgroundColor="#ff000000" /> -+ <widget name="Video" position="491,130" zPosition="-10" size="672,365" /> -+ <widget source="session.CurrentService" render="Label" position="450,510" size="790,30" zPosition="3" font="Regular;24" backgroundColor="#27c2bbb2" halign="center" valign="center" transparent="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Label" position="450,550" size="790,25" zPosition="3" font="Regular;20" halign="center" valign="center" transparent="1"> -+ <convert type="ServicePosition">Position,Detailed</convert> -+ </widget> -+ <widget name="Timeline" position="479,587" size="696,20" zPosition="3" pointer="skin_default/position_arrow.png:3,5" backgroundColor="#2707255d" /> -+ <eLabel text="OK = Menu" position="1060,630" size="140,22" zPosition="1" font="Regular;20" backgroundColor="#27c2bbb2" transparent="1" /> -+ </screen> -+ <screen name="DVDToolbox" position="center,120" size="560,420" title="DVD media toolbox" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="info" render="Label" position="20,50" size="520,100" font="Regular;20" /> -+ <widget name="details" position="20,180" size="520,200" font="Regular;16" /> -+ <widget source="space_bar" render="Progress" position="10,390" size="540,26" borderWidth="1" backgroundColor="#254f7497" /> -+ <widget source="space_label" render="Label" position="20,394" size="520,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" /> -+ </screen> -+ <screen name="ProjectSettings" position="center,120" size="560,420" title="Collection settings" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,0" size="140,40" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget name="config" position="5,50" size="550,276" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="Vu_HD/div-h.png" position="0,330" zPosition="1" size="560,2" /> -+ <widget source="info" render="Label" position="10,340" size="550,80" font="Regular;18" halign="center" valign="center" /> -+ </screen> -+ <screen name="TitleCutter" position="0,0" size="1280,720" title="Cutlist editor" flags="wfNoBorder"> -+ <widget source="global.CurrentTime" render="Label" position="1130,40" size="80,26" font="Regular;26" halign="right" transparent="1" > -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="1000,72" size="210,22" font="Regular;20" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%d.%m.%Y</convert> -+ </widget> -+ <eLabel text="Cutlist editor" position="90,120" size="320,32" font="Regular;27" transparent="1" /> -+ <eLabel position="80,155" size="340,420" zPosition="1" backgroundColor="black" /> -+ <eLabel position="81,156" size="338,418" zPosition="2" backgroundColor="white" /> -+ <widget source="cutlist" render="Listbox" position="90,165" zPosition="3" size="320,400" scrollbarMode="showOnDemand" backgroundColor="white" transparent="1" > -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(size=(220, 20), text = 1), -+ MultiContentEntryText(pos=(220,2), size=(100, 20), text = 2, flags = RT_HALIGN_RIGHT) -+ ], -+ "fonts": [gFont("Regular", 20)], -+ "itemHeight": 25 -+ } -+ </convert> -+ </widget> -+ <eLabel position="479,124" zPosition="3" size="696,377" backgroundColor="#ff000000" /> -+ <widget name="Video" position="491,130" zPosition="-10" size="672,365" /> -+ <widget source="session.CurrentService" render="Label" position="450,510" size="790,30" zPosition="3" font="Regular;24" backgroundColor="#27c2bbb2" halign="center" valign="center" transparent="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Label" position="450,550" size="790,25" zPosition="3" font="Regular;20" halign="center" valign="center" transparent="1"> -+ <convert type="ServicePosition">Position,Detailed</convert> -+ </widget> -+ <widget name="Timeline" position="479,587" size="696,20" zPosition="3" pointer="skin_default/position_arrow.png:3,5" backgroundColor="#2707255d" /> -+ <eLabel text="OK = Menu" position="1060,630" size="140,22" zPosition="1" font="Regular;20" backgroundColor="#27c2bbb2" transparent="1" /> -+ </screen> -+ <screen name="TitleList" position="209,48" size="865,623" title="DVD Tool" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="DVD Tool" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="83,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_blue" render="Label" position="663,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="title_label" render="Label" position="160,148" size="540,38" font="Regular;18" backgroundColor="#27c2bbb2" transparent="1" /> -+ <widget source="error_label" render="Label" position="160,148" size="540,340" zPosition="3" font="Regular;20" backgroundColor="#27c2bbb2" transparent="1" /> -+ <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="160,186" size="540,277" zPosition="3" transparent="1" > -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (0, 0), size = (420, 20), font = 0, flags = RT_HALIGN_LEFT, text = 1), # index 1 Title, -+ MultiContentEntryText(pos = (0, 20), size = (328, 17), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 description, -+ MultiContentEntryText(pos = (420, 6), size = (120, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 3), # index 3 begin time, -+ MultiContentEntryText(pos = (328, 20), size = (154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 channel, -+ MultiContentEntryText(pos = (482, 20), size = (58, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # index 4 channel, -+ ], -+ "fonts": [gFont("Regular", 20), gFont("Regular", 14)], -+ "itemHeight": 37 -+ } -+ </convert> -+ </widget> -+ <widget source="space_bar_single" render="Progress" position="160,490" size="270,24" borderWidth="1" zPosition="2" backgroundColor="#254f7497" /> -+ <widget source="space_label_single" render="Label" position="160,493" size="270,22" zPosition="3" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" /> -+ <widget source="space_bar_dual" render="Progress" position="160,490" size="540,24" borderWidth="1" backgroundColor="#254f7497" /> -+ <widget source="space_label_dual" render="Label" position="160,493" size="540,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" /> -+ </screen> -+ <screen name="DVDMovieSelection" position="center,120" size="560,425" title="Select a movie"> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="waitingtext" position="0,45" size="560,375" zPosition="4" font="Regular;22" halign="center" valign="center" /> -+ <widget name="list" position="5,40" size="550,355" zPosition="2" scrollbarMode="showOnDemand" /> -+ <widget name="DescriptionBorder" pixmap="Vu_HD/border_eventinfo.png" position="0,296" zPosition="1" size="560,103" transparent="1" alphatest="on" /> -+ <widget source="Service" render="Label" position="5,298" zPosition="1" size="480,35" font="Regular;17" foregroundColor="#cccccc"> -+ <convert type="MovieInfo">ShortDescription</convert> -+ </widget> -+ <widget source="Service" render="Label" position="495,298" zPosition="1" size="60,22" font="Regular;17" halign="right"> -+ <convert type="ServiceTime">Duration</convert> -+ <convert type="ClockToText">AsLength</convert> -+ </widget> -+ <widget source="Service" render="Label" position="380,317" zPosition="2" size="175,22" font="Regular;17" halign="right"> -+ <convert type="MovieInfo">RecordServiceName</convert> -+ </widget> -+ <widget source="Service" render="Label" position="5,337" zPosition="1" size="550,58" font="Regular;19"> -+ <convert type="EventName">ExtendedDescription</convert> -+ </widget> -+ <widget name="freeDiskSpace" position="10,405" size="540,20" font="Regular;19" valign="center" halign="right" /> -+ </screen> -+ <screen name="TitleProperties" position="center,120" size="560,425" title="Properties of current title" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,0" size="140,40" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget source="serviceinfo" render="Label" position="10,46" size="350,144" font="Regular;18" /> -+ <widget name="thumbnail" position="370,46" size="180,144" alphatest="on" /> -+ <widget name="config" position="10,196" size="540,228" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="DVDPlayer" flags="wfNoBorder" position="200,516" size="880,162" title="InfoBar" backgroundColor="transparent"> -+ <!-- Background --> -+ <ePixmap position="0,0" zPosition="-1" size="880,144" pixmap="Vu_HD/Bg_Media_info.png" /> -+ <ePixmap position="35,18" size="37,28" pixmap="Vu_HD/menu/ico_title_media-info.png" alphatest="blend" /> -+ <!-- colorbuttons --> -+ <ePixmap position="50,75" pixmap="Vu_HD/icons/ico_player.png" size="152,18" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="770,15" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="790,17" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <!-- Servicename --> -+ <ePixmap pixmap="Vu_HD/icons/icon_event.png" position="85,15" zPosition="1" size="15,10" alphatest="on" /> -+ <widget source="session.CurrentService" render="Label" position="110,10" size="300,20" font="Regular;20" backgroundColor="#27d9dee2" transparent="1" noWrap="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <!-- Chapter info --> -+ <widget name="chapterLabel" position="110,32" size="360,20" font="Regular;16" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" transparent="1" /> -+ <!-- Audio track info --> -+ <ePixmap pixmap="Vu_HD/icons/icon_dolby.png" position="675,52" zPosition="1" size="43,15" alphatest="blend"/> -+ <widget name="audioLabel" position="720,50" size="130,22" font="Regular;16" backgroundColor="#27aeaeae" transparent="1" /> -+ <!-- Subtitle track info --> -+ <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/icons/icon_txt.png" position="520,52" zPosition="1" size="26,16" alphatest="blend" > -+ <convert type="ServiceInfo">HasTelext</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget name="subtitleLabel" position="550,50" size="120,22" font="Regular;16" backgroundColor="#263c59" transparent="1" /> -+ <!-- Angle info --> -+ <widget name="anglePix" pixmap="Vu_HD/icons/icon_view.png" position="370,50" size="26,16" alphatest="on" /> -+ <widget name="angleLabel" position="400,48" size="120,22" font="Regular;16" backgroundColor="#263c59" transparent="1" /> -+ <!-- Elapsed time --> -+ <widget source="session.CurrentService" render="Label" position="240,95" size="100,24" font="Semiboldit;18" halign="left" valign="center" foregroundColor="#3d0e82" backgroundColor="#27aeaeae" transparent="1"> -+ <convert type="ServicePosition">Position,ShowHours</convert> -+ </widget> -+ <!-- Progressbar (movie position)--> -+ <ePixmap position="240,75" size="563,18" pixmap="Vu_HD/icons/Mediaplayerbar_gray.png" alphatest="blend" /> -+ <widget source="session.CurrentService" render="PositionGauge" position="242,68" size="563,25" zPosition="2" pointer="Vu_HD/icons/Mediaplayerbar_purple.png:563,0" transparent="1"> -+ <convert type="ServicePosition">Gauge</convert> -+ </widget> -+ <!-- Remaining time --> -+ <widget source="session.CurrentService" render="Label" position="700,95" size="95,20" font="Regular;16" halign="right" valign="center" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1"> -+ <convert type="ServicePosition">Remaining,Negate,ShowHours</convert> -+ </widget> -+ </screen> -+ <screen name="ModemSetup" position="180,100" size="320,300" title="Modem" > -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="10,10" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="160,10" size="140,40" alphatest="blend" /> -+ <widget name="key_green" position="30,10" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget name="key_red" position="180,10" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget name="list" position="10,60" size="300,120" /> -+ <widget name="state" position="10,210" size="300,80" font="Regular;20" /> -+ </screen> -+ <screen name="picshow" position="center,120" size="560,420" title="PicturePlayer" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,0" size="140,40" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget source="label" render="Label" position="5,55" size="350,140" font="Regular;19" backgroundColor="#25062748" transparent="1" /> -+ <widget name="thn" position="360,40" size="180,160" alphatest="on" /> -+ <widget name="filelist" position="5,205" zPosition="2" size="550,210" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="Pic_Exif" position="center,center" size="560,360" title="Info" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="menu" render="Listbox" position="5,50" size="550,310" scrollbarMode="showOnDemand" selectionDisabled="1" > -+ <convert type="TemplatedMultiContent"> -+ { -+ "template": [ MultiContentEntryText(pos = (5, 5), size = (250, 30), flags = RT_HALIGN_LEFT, text = 0), MultiContentEntryText(pos = (260, 5), size = (290, 30), flags = RT_HALIGN_LEFT, text = 1)], -+ "fonts": [gFont("Regular", 20)], -+ "itemHeight": 30 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="CleanupWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="400,100" size="550,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" transparent="1" position="300,400" size="500,300" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" /> -+ <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" /> -+ <widget name="config" position="300,400" zPosition="1" size="500,300" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="portpic" position="100,400" zPosition="10" size="150,150" transparent="1" alphatest="on"/> -+ <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown2" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <screen name="CleanupWizardConfiguration" position="209,48" size="865,623" title="CleanupWizard settings" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="CleanupWizard settings" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="config" zPosition="2" position="50,130" itemHeight="36" size="750,324" scrollbarMode="showOnDemand" transparent="1" /> -+ <eLabel text=" " position="145,460" zPosition="10" size="560,2" transparent="1" backgroundColor="#8c8c8c" /> -+ <widget source="status" render="Label" position="160,525" size="540,60" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ </screen> -+ <screen name="CIselectMainMenu" position="100,80" size="520,538" title="CI assignment" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="16,36" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="CI assignment" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="20,91" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="210,91" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="58,93" zPosition="1" size="150,20" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget source="key_green" render="Label" position="248,93" zPosition="1" size="150,20" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget name="CiList" position="15,125" itemHeight="42" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" transparent="1" zPosition="1" size="490,336" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="CIconfigMenu" position="209,48" size="865,623" title="CI assignment" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="CI assignment" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="73,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="CAidList_desc" render="Label" position="155,200" size="550,22" font="Regular;20" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget source="CAidList" render="Label" position="155,230" size="550,45" font="Regular;20" backgroundColor="#27d9dee2" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/div-h.png" position="150,275" zPosition="1" size="560,2" /> -+ <widget source="ServiceList_desc" render="Label" position="155,280" size="550,22" font="Regular;20" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="ServiceList" position="155,310" size="550,250" zPosition="1" scrollbarMode="showOnDemand" /> -+ <widget source="ServiceList_info" render="Label" position="155,310" size="550,250" zPosition="2" font="Regular;20" backgroundColor="#27d9dee2" transparent="1" /> -+ </screen> -+ <screen name="easyCIconfigMenu" position="209,48" size="865,623" title="CI assignment" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="CI assignment" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="73,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="ServiceList_desc" render="Label" position="155,200" size="550,22" font="Regular;20" backgroundColor="#27d9dee2" transparent="1" /> -+ <widget name="ServiceList" position="155,230" size="550,300" zPosition="1" scrollbarMode="showOnDemand" /> -+ <widget source="ServiceList_info" render="Label" position="155,230" size="550,300" zPosition="2" font="Regular;20" backgroundColor="#27d9dee2" transparent="1" /> -+ </screen> -+ <screen name="CAidSelect" position="209,48" size="865,623" title="select CAId's" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="select CAId's" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="73,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="list" position="155,150" size="540,350" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="Vu_HD/div-h.png" position="150,520" zPosition="1" size="450,2" /> -+ <widget source="introduction" render="Label" position="150,530" size="450,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#27d9dee2" transparent="1" /> -+ </screen> -+ <screen name="myProviderSelection" position="209,48" size="865,623" title="Select provider to add..." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Select provider to add..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="73,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="list" position="155,150" size="550,350" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="Vu_HD/div-h.png" position="150,510" zPosition="1" size="560,2" /> -+ <widget source="introduction" render="Label" position="150,520" size="560,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#27d9dee2" transparent="1" /> -+ </screen> -+ <screen name="myChannelSelection" position="209,48" size="865,623" title="Select service to add..." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Select service to add..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="73,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="list" position="155,150" size="550,350" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="Vu_HD/div-h.png" position="150,510" zPosition="1" size="560,2" /> -+ <widget source="introduction" render="Label" position="150,520" size="560,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#27d9dee2" transparent="1" /> -+ </screen> -+ <screen name="CrashlogAutoSubmitConfiguration" position="209,48" size="865,623" title="CrashlogAutoSubmit settings" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="CrashlogAutoSubmit settings" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="config" zPosition="2" position="50,130" itemHeight="36" size="750,324" scrollbarMode="showOnDemand" transparent="1" /> -+ <eLabel text=" " position="145,460" zPosition="10" size="560,2" transparent="1" backgroundColor="#8c8c8c" /> -+ <widget source="status" render="Label" position="160,525" size="540,60" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ <widget name="VKeyIcon" pixmap="Vu_HD/buttons/key_text.png" position="160,490" zPosition="10" size="35,25" transparent="1" alphatest="on" /> -+ <widget name="HelpWindow" pixmap="Vu_HD/vkey_icon.png" position="310,400" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen> -+ <screen name="DefaultServiceScan" position="150,115" size="420,390" title="Service Scan"> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-s.png" position="5,5" size="64,64" transparent="1" alphatest="blend"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">0,0</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-c.png" position="5,5" size="64,64" transparent="1" alphatest="on"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">1,1</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-t.png" position="5,5" size="64,64" transparent="1" alphatest="on"> -+ <convert type="FrontendInfo">TYPE</convert> -+ <convert type="ValueRange">2,2</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget name="network" position="80,15" size="330,20" font="Regular;20" /> -+ <widget name="transponder" position="80,40" size="330,20" font="Regular;20" /> -+ <widget name="scan_state" position="10,80" zPosition="2" size="400,20" font="Regular;18" /> -+ <widget name="pass" position="10,80" size="400,20" font="Regular;18" /> -+ <widget name="scan_progress" position="10,105" size="400,15" pixmap="Vu_HD/progress_big.png" borderWidth="2" borderColor="#cccccc" /> -+ <widget name="servicelist" position="10,135" size="400,265" selectionDisabled="1" /> -+ </screen> -+ <screen name="DiseqcTester" position="90,100" size="520,400" title="DiSEqC Tester" > -+ <!--ePixmap pixmap="Vu_HD/icons/dish_scan.png" position="5,25" zPosition="0" size="119,110" transparent="1" alphatest="on" /> -+ <widget source="Frontend" render="Label" position="190,10" zPosition="2" size="260,20" font="Regular;19" halign="center" valign="center" transparent="1"> -+ <convert type="FrontendInfo">SNRdB</convert> -+ </widget> -+ <eLabel name="snr" text="SNR:" position="120,35" size="60,22" font="Regular;21" halign="right" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="190,35" size="260,20" pixmap="Vu_HD/bar_snr.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">SNR</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="460,35" size="60,22" font="Regular;21"> -+ <convert type="FrontendInfo">SNR</convert> -+ </widget> -+ <eLabel name="agc" text="AGC:" position="120,60" size="60,22" font="Regular;21" halign="right" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="190,60" size="260,20" pixmap="Vu_HD/bar_snr.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">AGC</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="460,60" size="60,22" font="Regular;21"> -+ <convert type="FrontendInfo">AGC</convert> -+ </widget> -+ <eLabel name="ber" text="BER:" position="120,85" size="60,22" font="Regular;21" halign="right" transparent="1" /> -+ <widget source="Frontend" render="Progress" position="190,85" size="260,20" pixmap="Vu_HD/bar_ber.png" borderWidth="2" borderColor="#cccccc"> -+ <convert type="FrontendInfo">BER</convert> -+ </widget> -+ <widget source="Frontend" render="Label" position="460,85" size="60,22" font="Regular;21"> -+ <convert type="FrontendInfo">BER</convert> -+ </widget> -+ <eLabel name="lock" text="Lock:" position="120,115" size="60,22" font="Regular;21" halign="right" /> -+ <widget source="Frontend" render="Pixmap" pixmap="Vu_HD/icons/lock_on.png" position="190,110" zPosition="1" size="38,31" alphatest="on"> -+ <convert type="FrontendInfo">LOCK</convert> -+ <convert type="ConditionalShowHide" /> -+ </widget> -+ <widget source="Frontend" render="Pixmap" pixmap="skin_default/icons/lock_off.png" position="190,110" zPosition="1" size="38,31" alphatest="on"> -+ <convert type="FrontendInfo">LOCK</convert> -+ <convert type="ConditionalShowHide">Invert</convert> -+ </widget--> -+ <widget source="progress_list" render="Listbox" position="0,0" size="510,150" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (10, 0), size = (330, 25), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the index name, -+ MultiContentEntryText(pos = (330, 0), size = (150, 25), flags = RT_HALIGN_RIGHT, text = 2) # index 2 is the status, -+ ], -+ "fonts": [gFont("Regular", 20)], -+ "itemHeight": 25 -+ } -+ </convert> -+ </widget> -+ <eLabel name="overall_progress" text="Overall progress:" position="20,162" size="480,22" font="Regular;21" halign="center" transparent="1" /> -+ <widget source="overall_progress" render="Progress" position="20,192" size="480,20" borderWidth="2" backgroundColor="#254f7497" /> -+ <eLabel name="overall_progress" text="Progress:" position="20,222" size="480,22" font="Regular;21" halign="center" transparent="1" /> -+ <widget source="sub_progress" render="Progress" position="20,252" size="480,20" borderWidth="2" backgroundColor="#254f7497" /> -+ -+ <eLabel name="" text="Failed:" position="20,282" size="140,22" font="Regular;21" halign="left" transparent="1" /> -+ <widget source="failed_counter" render="Label" position="160,282" size="100,20" font="Regular;21" /> -+ -+ <eLabel name="" text="Succeeded:" position="20,312" size="140,22" font="Regular;21" halign="left" transparent="1" /> -+ <widget source="succeeded_counter" render="Label" position="160,312" size="100,20" font="Regular;21" /> -+ -+ <eLabel name="" text="With errors:" position="20,342" size="140,22" font="Regular;21" halign="left" transparent="1" /> -+ <widget source="witherrors_counter" render="Label" position="160,342" size="100,20" font="Regular;21" /> -+ -+ <eLabel name="" text="Not tested:" position="20,372" size="140,22" font="Regular;21" halign="left" transparent="1" /> -+ <widget source="untestable_counter" render="Label" position="160,372" size="100,20" font="Regular;21" /> -+ -+ <widget source="CmdText" render="Label" position="300,282" size="180,200" font="Regular;21" /> -+ </screen> -+ <screen name="DiseqcTesterNimSelection" position="center,center" size="400,330" title="Choose Tuner"> -+ <widget source="nimlist" render="Listbox" position="0,0" size="380,300" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (10, 5), size = (360, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name, -+ MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings, -+ ], -+ "fonts": [gFont("Regular", 20), gFont("Regular", 15)], -+ "itemHeight": 70 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="FPUpgrade" position="150,200" size="450,200" title="FP upgrade required" > -+ <widget name="text" position="0,0" size="550,50" font="Regular;20" /> -+ <widget name="oldversion_label" position="10,100" size="290,25" font="Regular;20" /> -+ <widget name="newversion_label" position="10,125" size="290,25" font="Regular;20" /> -+ <widget name="oldversion" position="300,100" size="50,25" font="Regular;20" /> -+ <widget name="newversion" position="300,125" size="50,25" font="Regular;20" /> -+ </screen> -+ <screen name="SystemMessage" position="150,200" size="450,200" title="System Message" > -+ <widget source="text" position="0,0" size="450,200" font="Regular;20" halign="center" valign="center" render="Label" /> -+ <ePixmap pixmap="Vu_HD/icons/input_error.png" position="5,5" size="53,53" alphatest="on" /> -+ </screen> -+ <screen name="NFIDownload" position="90,95" size="560,420" title="Image download utility"> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" zPosition="0" size="140,40" transparent="1" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#18188b" transparent="1" /> -+ -+ <widget source="label_top" render="Label" position="10,44" size="240,20" font="Regular;16" /> -+ <widget name="feedlist" position="10,66" size="250,222" scrollbarMode="showOnDemand" /> -+ <widget name="destlist" position="0,66" size="260,222" scrollbarMode="showOnDemand" /> -+ -+ <widget source="label_bottom" render="Label" position="10,312" size="240,18" font="Regular;16"/> -+ <widget source="path_bottom" render="Label" position="10,330" size="250,42" font="Regular;18" /> -+ -+ <widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" /> -+ <widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" /> -+ <widget source="job_progresslabel" render="Label" position="130,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="300,22" foregroundColor="#000000" /> -+ <widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" /> -+ </screen> -+ <screen name="NFIFlash" position="90,95" size="560,420" title="Image flash utility"> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> -+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" /> -+ <widget source="listlabel" render="Label" position="16,44" size="200,21" valign="center" font="Regular;18" /> -+ <widget name="filelist" position="0,68" size="260,260" scrollbarMode="showOnDemand" /> -+ <widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" /> -+ <widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" /> -+ <widget source="job_progresslabel" render="Label" position="180,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="200,22" foregroundColor="#000000" /> -+ <widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" /> -+ </screen> -+ <screen name="BackupSelection" position="center,130" size="560,400" title="Select files/folders to backup"> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="checkList" position="5,50" size="550,250" transparent="1" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="RestoreMenu" position="center,130" size="560,400" title="Restore backups" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> -+ <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ <widget name="filelist" position="5,50" size="550,230" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="UpdatePluginMenu" position="209,48" size="865,623" title="Software management" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Software management" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/border_menu.png" position="60,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" /> -+ <widget source="menu" render="Listbox" position="70,150" size="322,338" scrollbarMode="showOnDemand" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (2, 2), size = (330, 24), flags = RT_HALIGN_LEFT, text = 1), # index 0 is the MenuText, -+ ], -+ "fonts": [gFont("Regular", 22)], -+ "itemHeight": 25 -+ } -+ </convert> -+ </widget> -+ <widget source="menu" render="Listbox" position="420,150" size="390,338" scrollbarMode="showNever" selectionDisabled="1" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (2, 2), size = (380, 300), flags = RT_HALIGN_CENTER|RT_VALIGN_CENTER|RT_WRAP, text = 2), # index 2 is the Description, -+ ], -+ "fonts": [gFont("Regular", 22)], -+ "itemHeight": 300 -+ } -+ </convert> -+ </widget> -+ <widget source="status" render="Label" position="50,500" zPosition="10" size="750,50" halign="center" valign="center" font="Regular;22" transparent="1" backgroundColor="#27aeaeae" /> -+ </screen> -+ <screen name="PluginManager" position="209,48" size="865,623" title="Extensions management" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Extensions management" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="list" render="Listbox" position="50,130" size="750,416" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"templates": -+ {"default": (51,[ -+ MultiContentEntryText(pos = (30, 1), size = (670, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (30, 25), size = (670, 24), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description -+ MultiContentEntryPixmapAlphaTest(pos = (675, 0), size = (48, 48), png = 5), # index 5 is the status pixmap -+ MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (750, 2), png = 6), # index 6 is the div pixmap -+ ]), -+ "category": (40,[ -+ MultiContentEntryText(pos = (30, 0), size = (700, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (30, 22), size = (700, 16), font=2, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description -+ MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (750, 2), png = 3), # index 3 is the div pixmap -+ ]) -+ }, -+ "fonts": [gFont("Regular", 22),gFont("Regular", 20),gFont("Regular", 16)], -+ "itemHeight": 52 -+ } -+ </convert> -+ </widget> -+ <widget source="status" render="Label" position="50,560" zPosition="10" size="750,23" halign="center" valign="center" font="Regular;22" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1"/> -+ </screen> -+ <screen name="PluginManagerInfo" position="209,48" size="865,623" title="Plugin manager activity information" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Plugin manager activity information" position="90,50" size="700,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="list" render="Listbox" position="50,140" size="750,400" scrollbarMode="showOnDemand" selectionDisabled="1"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (50, 0), size = (250, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (50, 27), size = (640, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state -+ MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap -+ MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (750, 2), png = 3), # index 3 is the div pixmap -+ ], -+ "fonts": [gFont("Regular", 24),gFont("Regular", 22)], -+ "itemHeight": 50 -+ } -+ </convert> -+ </widget> -+ <widget source="status" render="Label" position="50,560" zPosition="10" size="750,44" halign="center" valign="center" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;22" transparent="1" /> -+ </screen> -+ <screen name="PluginManagerHelp" position="209,48" size="865,623" title="Plugin manager help" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Plugin manager help" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="list" render="Listbox" position="80,140" size="700,400" scrollbarMode="showOnDemand" selectionDisabled="1"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (50, 0), size = (540, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state -+ MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap -+ MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap -+ ], -+ "fonts": [gFont("Regular", 24),gFont("Regular", 22)], -+ "itemHeight": 50 -+ } -+ </convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/div-h.png" position="70,550" zPosition="10" size="720,2" transparent="1" alphatest="on" /> -+ <widget source="status" render="Label" position="50,560" zPosition="10" size="750,44" halign="center" valign="center" font="Regular;22" backgroundColor="#27aeaeae" transparent="1" /> -+ </screen> -+ <screen name="PluginDetails" position="209,48" size="865,623" title="Plugin details" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Plugin details" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="author" render="Label" position="60,140" size="700,25" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;21" transparent="1" /> -+ <widget name="statuspic" position="770,130" size="48,48" alphatest="on"/> -+ <widget name="divpic" position="60,190" size="740,2" alphatest="on"/> -+ <widget name="detailtext" position="70,200" size="400,400" zPosition="10" font="Regular;21" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1" halign="left" valign="top"/> -+ <widget name="screenshot" position="490,230" size="300,330" alphatest="on"/> -+ </screen> -+ <screen name="UpdatePlugin" position="209,48" size="865,623" title="Software update" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Software update" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget name="activityslider" position="60,140" size="720,5" /> -+ <widget source="package" render="Label" position="70,160" size="700,20" font="Regular;18" halign="center" valign="center" backgroundColor="darkgrey" transparent="1" /> -+ <widget source="status" render="Label" position="70,190" size="700,80" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" transparent="1" /> -+ <widget name="slider" position="70,280" size="700,30" /> -+ </screen> -+ <screen name="IPKGMenu" position="209,48" size="865,623" title="Select upgrade source to edit." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Select upgrade source to edit." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="filelist" position="50,140" size="750,440" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="IPKGSource" position="209,48" size="865,623" title="Edit upgrade source url." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Edit upgrade source url." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="text" position="50,150" size="750,25" font="Regular;20" backgroundColor="background" foregroundColor="#cccccc" /> -+ </screen> -+ <screen name="PacketManager" position="209,48" size="865,623" title="Packet manager" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Packet manager" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="list" render="Listbox" position="50,150" size="750,416" scrollbarMode="showOnDemand"> -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (5, 1), size = (640, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (5, 26), size = (640, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description -+ MultiContentEntryPixmapAlphaTest(pos = (645, 2), size = (48, 48), png = 4), # index 4 is the status pixmap -+ MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (740, 2), png = 5), # index 4 is the div pixmap -+ ], -+ "fonts": [gFont("Regular", 22),gFont("Regular", 14)], -+ "itemHeight": 52 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="IpkgInstaller" position="209,48" size="865,623" title="Install extensions" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Install extensions" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="list" position="50,150" size="750,350" /> -+ <ePixmap pixmap="Vu_HD/div-h.png" position="50,520" zPosition="10" size="750,2" transparent="1" alphatest="on" /> -+ <widget source="introduction" render="Label" position="50,540" zPosition="10" size="750,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> -+ </screen> -+ <screen name="VideoWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" > -+ <widget name="text" position="400,100" size="550,270" font="Regular;23" /> -+ <widget source="list" render="Listbox" transparent="1" position="300,400" size="500,300" scrollbarMode="showOnDemand" > -+ <convert type="StringList" /> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" /> -+ <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" /> -+ <widget name="config" position="300,400" zPosition="1" size="500,300" transparent="1" scrollbarMode="showOnDemand" /> -+ <widget name="portpic" position="100,400" zPosition="10" size="150,150" transparent="1" alphatest="on"/> -+ <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowdown2" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/> -+ </screen> -+ <!-- FileBrowser --> -+ <screen name="FilebrowserScreen" position="0,0" size="1280,720" title="" flags="wfNoBorder"> -+ <widget source="global.CurrentTime" render="Label" position="1130,40" size="80,26" font="Regular;26" halign="right" transparent="1"> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="1000,72" size="210,22" font="Regular;20" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%d.%m.%Y</convert> -+ </widget> -+ <eLabel text="Filebrowser" position=" 80,110" size="1120,35" zPosition="3" font="Regular;32" foregroundColor="#3c3c3c" halign="center" transparent="1" /> -+ <eLabel position=" 80,150" size="1120,2" backgroundColor="black" zPosition="5" /> -+ <eLabel position=" 80,152" size="1120,2" zPosition="5" /> -+ <widget name="list_left" position=" 90,167" size="540,437" scrollbarMode="showOnDemand" transparent="1" /> -+ <eLabel position="638,155" size="1,460" backgroundColor="black" zPosition="5" /> -+ <eLabel position="639,155" size="2,460" zPosition="5" /> -+ <widget name="list_right" position="650,167" size="540,437" scrollbarMode="showOnDemand" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="100,643" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="390,643" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="680,643" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="970,643" size="25,25" alphatest="blend" /> -+ <widget name="red" position="150,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" /> -+ <widget name="green" position="440,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" /> -+ <widget name="yellow" position="730,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" /> -+ <widget name="blue" position="1020,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" /> -+ </screen> -+ <screen name="FilebrowserConfigScreen" position="0,0" size="1280,720" title="" flags="wfNoBorder"> -+ <widget source="global.CurrentTime" render="Label" position="1130,40" size="80,26" font="Regular;26" halign="right" transparent="1"> -+ <convert type="ClockToText">Default</convert> -+ </widget> -+ <widget source="global.CurrentTime" render="Label" position="1000,72" size="210,22" font="Regular;20" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%d.%m.%Y</convert> -+ </widget> -+ <widget source="session.VideoPicture" render="Pig" position="75,115" size="380,215" zPosition="3" backgroundColor="#ff000000" /> -+ <eLabel text="FilebrowserConfigScreen" position="510,110" size="700,35" zPosition="3" font="Regular;32" foregroundColor="#3c3c3c" transparent="1" /> -+ <eLabel position="500,150" size="730,2" backgroundColor="black" zPosition="5" /> -+ <eLabel position="500,152" size="730,2" zPosition="5" /> -+ <widget name="config" position="510,175" size="660,450" zPosition="3" scrollbarMode="showOnDemand" transparent="1" /> -+ <eLabel position="476,110" size="1,500" backgroundColor="black" zPosition="5" /> -+ <eLabel position="477,110" size="2,500" zPosition="5" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="100,643" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="390,643" size="25,25" alphatest="blend" /> -+ <widget name="buttonred" position="150,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" /> -+ <widget name="buttongreen" position="440,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" /> -+ </screen> -+ <screen name="VideoFinetune" position="0,0" size="1280,720" backgroundColor="black"> -+ <widget source="Canvas" render="Canvas" position="280,70" size="720,576" /> -+ </screen> -+ <screen name="RecordPathsSettings" position="209,48" size="865,623" title="Recording paths" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Recording paths" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="config" position="50,130" itemHeight="36" size="750,300" backgroundColor="#27d9dee2" transparent="1"/> -+ </screen> -+ <screen name="SecParameterSetup" position="209,48" size="865,623" title="Satellite Equipment Setup" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Satellite Equipment Setup" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget name="config" position="130,140" size="600,450" transparent="1"/> -+ </screen> -+ <screen name="SatNimSelection" position="100,80" size="520,538" title="Subtitle selection" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="16,36" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="select Slot" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#b5b9bd" transparent="1" /> -+ <widget name="nimlist" position="15,83" itemHeight="42" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" transparent="1" zPosition="1" size="490,420" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="RotorNimSelection" position="100,80" size="520,538" title="Subtitle selection" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="16,36" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="select Slot" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#b5b9bd" transparent="1" /> -+ <widget name="nimlist" position="15,83" itemHeight="42" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" transparent="1" zPosition="1" size="490,420" scrollbarMode="showOnDemand" /> -+ </screen> -+ <screen name="PositionerSetup" position="209,48" size="865,623" title="Positioner setup..." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Positioner setup..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget name="red" position="83,97" size="150,25" backgroundColor="darkgrey" halign="center" valign="center" font="Regular;20" transparent="1"/> -+ <widget name="green" position="278,97" size="150,25" backgroundColor="darkgrey" halign="center" valign="center" font="Regular;20" transparent="1"/> -+ <widget name="yellow" position="473,97" size="150,25" backgroundColor="darkgrey" halign="center" valign="center" font="Regular;20" transparent="1"/> -+ <widget name="blue" position="668,97" size="150,25" backgroundColor="darkgrey" halign="center" valign="center" font="Regular;20" transparent="1"/> -+ -+ <widget name="list" position="200,160" size="450,155" backgroundColor="#27d9dee2" transparent="1"/> -+ -+ <widget name="snr_db" position="210,355" size="150,22" halign="center" valign="center" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <eLabel text="SNR:" position="150,380" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <eLabel text="BER:" position="150,405" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <eLabel text="Lock:" position="150,430" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="snr_percentage" position="370,380" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="ber_value" position="370,405" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="lock_state" position="210,430" size="150,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="snr_bar" position="210,380" size="150,22" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="ber_bar" position="210,405" size="150,22" backgroundColor="#27d9dee2" transparent="1"/> -+ -+ <eLabel text="Frequency:" position="450,355" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <eLabel text="Symbolrate:" position="450,380" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <eLabel text="FEC:" position="450,405" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="frequency_value" position="570,355" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="symbolrate_value" position="570,380" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ <widget name="fec_value" position="570,405" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/> -+ </screen> -+ <screen name="VideoEnhancementSetup" position="209,48" size="865,623" title="VideoEnhancementSetup" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Video enhancement setup" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="config" position="50,133" itemHeight="36" size="750,360" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1"/> -+ <eLabel text=" " position="50,527" size="750,2" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#5c5c5c" /> -+ <widget source="introduction" render="Label" position="50,530" size="750,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#27b5b9bd" transparent="1" /> -+ </screen> -+ <screen name="VideoEnhancementPreview" position="center,360" size="560,170" title="VideoEnhancementPreview"> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,10" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="280,10" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="35,10" zPosition="1" size="140,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="315,10" zPosition="1" size="140,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="config" position="5,50" size="550,80" scrollbarMode="showOnDemand" /> -+ <eLabel text=" " position="0,130" size="560,2" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#5c5c5c" /> -+ <widget source="introduction" render="Label" position="0,140" size="550,25" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#27b5b9bd" transparent="1" /> -+ </screen> -+ <screen name="MyTubePlayerMainScreen" flags="wfNoBorder" position="280,70" size="720,576" title="MyTubePlayerMainScreen..." > -+ <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/> -+ <widget name="config" zPosition="2" position="60,60" size="600,50" scrollbarMode="showNever" transparent="1" /> -+ <widget source="feedlist" render="Listbox" position="49,110" size="628,385" zPosition="1" scrollbarMode="showOnDemand" backgroundColorSelected="#5c8cac" transparent="1" backgroundPixmap="~/list_bg.png" selectionPixmap="~/list_sel.png" > -+ <convert type="TemplatedMultiContent"> -+ {"templates": -+ {"default": (77,[ -+ MultiContentEntryPixmapAlphaTest(pos = (0, 0), size = (100, 75), png = 4), # index 4 is the thumbnail -+ MultiContentEntryText(pos = (100, 1), size = (500, 22), font=0, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 1), # index 1 is the Title -+ MultiContentEntryText(pos = (100, 24), size = (300, 18), font=1, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 5), # index 5 is the Published Date -+ MultiContentEntryText(pos = (100, 43), size = (300, 18), font=1, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 6), # index 6 is the Views Count -+ MultiContentEntryText(pos = (400, 24), size = (200, 18), font=1, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 7), # index 7 is the duration -+ MultiContentEntryText(pos = (400, 43), size = (200, 18), font=1, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 8), # index 8 is the ratingcount -+ ]), -+ "state": (77,[ -+ MultiContentEntryText(pos = (10, 1), size = (560, 28), font=2, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (10, 22), size = (560, 46), font=3, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 1), # index 2 is the description -+ ]) -+ }, -+ "fonts": [gFont("Regular", 22),gFont("Regular", 18),gFont("Regular", 26),gFont("Regular", 20)], -+ "itemHeight": 77 -+ } -+ </convert> -+ </widget> -+ -+ <ePixmap pixmap="skin_default/buttons/key_info.png" position="50,500" zPosition="4" size="35,25" alphatest="on" transparent="1" /> -+ <ePixmap pixmap="skin_default/buttons/key_menu.png" position="50,520" zPosition="4" size="35,25" alphatest="on" transparent="1" /> -+ <ePixmap position="90,500" size="100,40" zPosition="4" pixmap="~/plugin.png" alphatest="on" transparent="1" /> -+ <ePixmap position="190,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" /> -+ <ePixmap position="330,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" /> -+ <ePixmap position="470,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" /> -+ <widget name="key_red" position="190,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="key_green" position="330,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="key_yellow" position="470,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="ButtonBlue" pixmap="skin_default/buttons/button_blue.png" position="610,510" zPosition="10" size="15,16" transparent="1" alphatest="on" /> -+ <widget name="VKeyIcon" pixmap="skin_default/vkey_icon.png" position="620,495" zPosition="10" size="60,48" transparent="1" alphatest="on" /> -+ <widget name="thumbnail" position="0,0" size="100,75" alphatest="on"/> # fake entry for dynamic thumbnail resizing, currently there is no other way doing this. -+ <widget name="HelpWindow" position="340,325" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen> -+ <screen name="MyTubeVideoInfoScreen" flags="wfNoBorder" position="center,center" size="720,576" title="MyTubePlayerMainScreen..." > -+ <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/> -+ <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="starsbg" pixmap="~/starsbar_empty.png" position="560,220" zPosition="5" size="100,20" transparent="1" alphatest="on" /> -+ <widget name="stars" pixmap="~/starsbar_filled.png" position="560,220" zPosition="6" size="100,20" transparent="1" /> -+ <widget source="infolist" render="Listbox" position="50,110" size="620,110" zPosition="6" scrollbarMode="showNever" foregroundColor="white" backgroundColor="#1c3c5c" selectionDisabled="1" transparent="1"> -+ <convert type="TemplatedMultiContent"> -+ {"templates": -+ {"default": (110,[ -+ MultiContentEntryPixmapAlphaTest(pos = (0, 4), size = (130, 98), png = 0), # index 0 is the thumbnail -+ MultiContentEntryPixmapAlphaTest(pos = (130, 4), size = (130, 98), png = 1), # index 0 is the thumbnail -+ MultiContentEntryPixmapAlphaTest(pos = (260, 4), size = (130, 98), png = 2), # index 0 is the thumbnail -+ MultiContentEntryPixmapAlphaTest(pos = (390, 4), size = (130, 98), png = 3), # index 0 is the thumbnail -+ ]), -+ "state": (110,[ -+ MultiContentEntryText(pos = (10, 40), size = (550, 38), font=2, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 0), # index 0 is the name -+ ]) -+ }, -+ "fonts": [gFont("Regular", 20),gFont("Regular", 14),gFont("Regular", 28)], -+ "itemHeight": 110 -+ } -+ </convert> -+ </widget> -+ <widget name="author" position="60,220" size="300,20" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top" /> -+ <widget name="duration" position="370,220" size="200,20" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top" /> -+ <widget name="published" position="60,245" size="300,20" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top" /> -+ <widget name="views" position="370,245" size="200,20" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top" /> -+ <widget name="tags" position="60,270" size="600,20" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top" /> -+ <widget name="detailtext" position="60,300" size="610,200" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top"/> -+ <ePixmap position="100,500" size="100,40" zPosition="0" pixmap="~/plugin.png" alphatest="on" transparent="1" /> -+ <ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" /> -+ <widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="thumbnail" position="0,0" size="130,98" alphatest="on"/> -+ </screen> -+ <screen name="MyTubeVideoHelpScreen" flags="wfNoBorder" position="center,center" size="720,576" title="MyTubePlayerMainScreen..." > -+ <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/> -+ <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" /> -+ <widget name="detailtext" position="60,120" size="610,370" zPosition="10" font="Regular;21" foregroundColor="white" backgroundColor="#1c3c5c" transparent="1" halign="left" valign="top"/> -+ <ePixmap position="100,500" size="100,40" zPosition="0" pixmap="~/plugin.png" alphatest="on" transparent="1" /> -+ <ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" /> -+ <widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" /> -+ </screen> -+ <screen name="MyTubePlayer" flags="wfNoBorder" position="center,550" size="720,160" title="InfoBar" backgroundColor="transparent"> -+ <ePixmap position="0,0" pixmap="skin_default/info-bg_mp.png" zPosition="-1" size="720,160" /> -+ <ePixmap position="29,40" pixmap="skin_default/screws_mp.png" size="665,104" alphatest="on" /> -+ <ePixmap position="48,70" pixmap="skin_default/icons/mp_buttons.png" size="108,13" alphatest="on" /> -+ <ePixmap pixmap="skin_default/icons/icon_event.png" position="207,78" size="15,10" alphatest="on" /> -+ <widget source="session.CurrentService" render="Label" position="230,73" size="360,40" font="Regular;20" foregroundColor="#ececec" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ServiceName">Name</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Label" position="580,73" size="90,24" font="Regular;20" foregroundColor="#ececec" halign="right" backgroundColor="#4e5a74" transparent="1"> -+ <convert type="ServicePosition">Length</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Label" position="205,129" size="100,20" font="Regular;18" foregroundColor="#ececec" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ServicePosition">Position</convert> -+ </widget> -+ <widget source="session.CurrentService" render="PositionGauge" position="300,133" size="270,10" zPosition="2" pointer="skin_default/position_pointer.png:540,0" transparent="1" foregroundColor="#20224f"> -+ <convert type="ServicePosition">Gauge</convert> -+ </widget> -+ <widget source="session.CurrentService" render="Label" position="576,129" size="100,20" font="Regular;18" foregroundColor="#ececec" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1"> -+ <convert type="ServicePosition">Remaining</convert> -+ </widget> -+ </screen> -+ <screen name="MyTubeSuggestionsListScreen" position="340,163" zPosition="6" size="610,160" flags="wfNoBorder" > -+ <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/> -+ <widget source="suggestionslist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" foregroundColor="#cccccc" backgroundColor="#1c3c5c" > -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (0, 1), size = (340, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ MultiContentEntryText(pos = (350, 1), size = (180, 24), font=1, flags = RT_HALIGN_RIGHT, text = 1), # index 1 are the rtesults -+ ], -+ "fonts": [gFont("Regular", 22),gFont("Regular", 18)], -+ "itemHeight": 25 -+ } -+ </convert> -+ </widget> -+ </screen> -+ <screen name="MyTubeHistoryScreen" position="340,163" zPosition="6" size="610,160" flags="wfNoBorder" > -+ <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/> -+ <widget source="historylist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" foregroundColor="#cccccc" backgroundColor="#1c3c5c" > -+ <convert type="TemplatedMultiContent"> -+ {"template": [ -+ MultiContentEntryText(pos = (0, 1), size = (340, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name -+ ], -+ "fonts": [gFont("Regular", 22),gFont("Regular", 18)], -+ "itemHeight": 25 -+ } -+ </convert> -+ </widget> -+ </screen> -+ -+ <!-- Genuine Vuplus Plugin --> -+ <screen name="VuplusAuthenticity" position="center,center" size="800,370" title="Return the Love Event (only for genuine box)"> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="250,15" size="25,25" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="435,15" size="25,25" alphatest="on" /> -+ <widget source="key_red" render="Label" position="265,15" zPosition="1" size="140,25" font="Regular;24" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="450,15" zPosition="1" size="140,25" font="Regular;24" halign="center" valign="center" transparent="1" /> -+ <widget name="config" zPosition="2" position="80,70" size="640,80" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget name="text1" position="0,165" size="800,90" font="Regular;32" halign="center" valign="center"/> -+ <widget name="text2" position="100,260" size="600,110" font="Regular;24" halign="center" valign="center"/> -+ </screen> -+ <screen name="MessageBoxGenuine" position="center,center" size="600,10" title="Message"> -+ <widget name="text" position="65,8" size="420,0" font="Regular;22" /> -+ <widget name="ErrorPixmap" pixmap="Vu_HD/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="QuestionPixmap" pixmap="Vu_HD/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="InfoPixmap" pixmap="Vu_HD/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="list" position="100,100" size="380,375" transparent="1" backgroundColor="darkgrey" /> -+ <applet type="onLayoutFinish"> -+# this should be factored out into some helper code, but currently demonstrates applets. -+from enigma import eSize, ePoint -+ -+orgwidth = self.instance.size().width() -+orgpos = self.instance.position() -+textsize = self["text"].getSize() -+ -+# y size still must be fixed in font stuff... -+textsize = (textsize[0] + 50, textsize[1] + 50) -+offset = 0 -+if self.type == self.TYPE_YESNO: -+ offset = 60 -+wsizex = textsize[0] + 60 -+wsizey = textsize[1] + offset -+if (280 > wsizex): -+ wsizex = 280 -+wsize = (wsizex, wsizey) -+ -+ -+# resize -+self.instance.resize(eSize(*wsize)) -+ -+# resize label -+self["text"].instance.resize(eSize(*textsize)) -+ -+# move list -+listsize = (wsizex, 50) -+self["list"].instance.move(ePoint(0, textsize[1])) -+self["list"].instance.resize(eSize(*listsize)) -+ -+# center window -+newwidth = wsize[0] -+self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) -+ </applet> -+ </screen> -+ -+ <!-- HDMI CEC Plugin --> -+ <screen name="HdmiCecPlugin" position="center,center" size="590,320" title="HDMI-CEC Plugin" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="20,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="160,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="300,0" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="440,0" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="25,0" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="165,0" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="305,0" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_blue" render="Label" position="445,0" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="10,50" size="580,270" scrollbarMode="showOnDemand" transparent="1" /> -+ </screen> -+ -+ <!-- LED Brightness Setup Plugin --> -+ <screen name="LEDBrightnessSetup" position="center,center" size="560,300" title="LED Brightness Setup"> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="10,10" size="25,25" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="195,10" size="25,25" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="380,10" size="25,25" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="30,10" zPosition="1" size="140,25" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="215,10" zPosition="1" size="140,25" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="400,10" zPosition="1" size="140,25" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,50" size="550,200" scrollbarMode="showOnDemand" transparent="1"/> -+ <widget name="current_entry" position="130,240" size="300,30" font="Regular;18" halign="center" valign="center"/> -+ </screen> -+ -+ <!-- Fancontrol Plugin --> -+ <screen name="FancontrolConfiguration" position="center,center" size="560,300" title="Standbymode Fancontrol settings" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="110,10" size="30,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="310,10" size="30,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="115,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="315,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" /> -+ </screen> -+ -+ <!-- RC Code Plugin --> -+ <screen name="RemoteControlCode" position="center,center" size="560,250" title="Remote Control System Code Setting" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="110,10" size="30,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="310,10" size="30,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="115,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="315,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,50" size="550,200" scrollbarMode="showOnDemand" transparent="1" /> -+ </screen> -+ -+ <screen name="MessageBoxConfirmCode" position="center,center" size="620,10" title="Message"> -+ <widget name="text" position="65,8" size="420,0" font="Regular;20" /> -+ <widget name="ErrorPixmap" pixmap="Vu_HD/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="QuestionPixmap" pixmap="Vu_HD/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="InfoPixmap" pixmap="Vu_HD/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" /> -+ <widget name="list" position="100,100" size="380,375" transparent="1" backgroundColor="#279e9fa4" /> -+ <applet type="onLayoutFinish"> -+# this should be factored out into some helper code, but currently demonstrates applets. -+from enigma import eSize, ePoint -+ -+orgwidth = self.instance.size().width() -+orgheight = self.instance.size().height() -+orgpos = self.instance.position() -+textsize = self["text"].getSize() -+ -+# y size still must be fixed in font stuff... -+textsize = (textsize[0] + 50, textsize[1] + 50) -+offset = 0 -+if self.type == self.TYPE_YESNO: -+ offset = 60 -+wsizex = textsize[0] + 60 -+wsizey = textsize[1] + offset -+if (280 > wsizex): -+ wsizex = 280 -+wsize = (wsizex, wsizey) -+ -+ -+# resize -+self.instance.resize(eSize(*wsize)) -+ -+# resize label -+self["text"].instance.resize(eSize(*textsize)) -+ -+# move list -+listsize = (wsizex, 50) -+self["list"].instance.move(ePoint(0, textsize[1])) -+self["list"].instance.resize(eSize(*listsize)) -+ -+# center window -+newwidth = wsize[0] -+newheight = wsize[1] -+self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y() + (orgheight - newheight)/2)) -+ </applet> -+ </screen> -+ -+ <!-- Manual Fancontrol Plugin --> -+ <screen name="ManualFancontrol" position="center,center" size="560,300" title="Fancontrol Settings in Standby mode" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="110,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="310,10" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="120,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="320,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget source="current" render="Label" position="150,270" zPosition="1" size="280,30" font="Regular;20" halign="center" valign="center" /> -+ </screen> -+ -+ <!-- UI 3D Setup Plugin --> -+ <screen name="UI3DSetupScreen" position="center,center" size="560,300" title="UI 3D setup" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="110,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="310,10" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="120,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="320,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" /> -+ </screen> -+ -+ <!-- Blindscan Plugin --> -+ <screen name="Blindscan" position="center,center" size="560,390" title="Blindscan"> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="40,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="210,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="380,10" size="140,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="50,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ <widget source="key_green" render="Label" position="220,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ <widget source="key_blue" render="Label" position="390,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ -+ <widget name="config" position="5,70" size="550,280" scrollbarMode="showOnDemand" /> -+ <widget name="introduction" position="0,365" size="560,20" font="Regular;20" halign="center" /> -+ </screen> -+ -+ <!-- Web Browser Plugin --> -+ <screen name="BrowserLauncher" position="center,center" size="309,498" title="Web Browser"> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="4,0" size="40,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="154,0" size="40,40" alphatest="on" /> -+ -+ <widget source="key_red" render="Label" position="30,0" zPosition="1" size="125,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="180,0" zPosition="1" size="125,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ -+ <widget name="config" position="0,50" size="309,100" scrollbarMode="showOnDemand" /> -+ <ePixmap pixmap="rc_wb_desc.png" position="0,150" size="309,296" alphatest="on" /> -+ <widget name="info" position="0,455" size="309,50" font="Regular;18" halign="center" foregroundColor="blue" transparent="1" /> -+ </screen> -+ -+ <!-- Crash Report Plugin --> -+ <screen name="CrashlogReportConfiguration" position="209,48" size="865,623" title="CrashlogReport Setting" flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="CrashlogReport Setting" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#27d9dee2" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="config" zPosition="2" position="50,130" itemHeight="36" size="750,324" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget source="status" render="Label" position="160,525" size="540,60" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ <widget name="VKeyIcon" pixmap="Vu_HD/buttons/key_text.png" position="500,350" zPosition="10" size="35,25" transparent="1" alphatest="on" /> -+ <widget name="HelpWindow" pixmap="Vu_HD/vkey_icon.png" position="310,400" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen> -+ -+ <!-- FPGA Upgrade Plugin --> -+ <screen name="FPGAUpgrade" position="center,center" size="560,420" title="FPGA Upgrade" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="40,10" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="210,10" size="140,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="380,10" size="140,40" alphatest="blend" /> -+ -+ <widget source="key_red" render="Label" position="60,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ <widget source="key_green" render="Label" position="230,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ <widget source="key_blue" render="Label" position="400,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/> -+ -+ <widget source="status" render="Label" position="15,60" zPosition="1" size="540,40" font="Regular;18" halign="left" valign="center" transparent="1" /> -+ <widget name="file_list" position="0,100" size="555,320" scrollbarMode="showOnDemand" /> -+ </screen> -+ -+ <screen name="UpgradeStatus" position="center,center" size="450,130" title=" "> -+ <widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/> -+ <widget name="slider" position="10,25" size="430,30" borderWidth="2" borderColor="#cccccc"/> -+ <widget name="status" position="10,25" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="blue" backgroundColor="blue" transparent="1"/> -+ <widget source="info" render="Label" position="10,70" zPosition="1" size="430,60" font="Regular;22" halign="center" valign="center" transparent="1"/> -+ </screen> -+ -+ <!-- Firmware Upgrade Plugin --> -+ <screen name="FirmwareUpgrade" position="center,center" size="560,175" title="Firmware Upgrade" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="125,7" size="80,40" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="330,7" size="80,40" alphatest="blend" /> -+ -+ <widget source="key_red" render="Label" position="160,0" zPosition="1" size="155,40" font="Regular;20" halign="left" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="365,0" zPosition="1" size="155,40" font="Regular;20" halign="left" valign="center" transparent="1" /> -+ -+ <widget name="config" zPosition="2" position="0,50" itemHeight="36" size="540,40" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget source="status" render="Label" position="0,100" zPosition="1" size="540,75" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ </screen> -+ -+ <screen name="FUFilebrowser" position="center,center" size="500,290" title="File Browser" > -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="5,7" size="80,40" alphatest="blend" /> -+ <widget source="key_blue" render="Label" position="40,0" zPosition="1" size="300,40" font="Regular;20" halign="left" valign="center" transparent="1"/> -+ <widget name="file_list" position="0,50" size="500,160" scrollbarMode="showOnDemand" /> -+ -+ <widget source="status" render="Label" position="0,230" zPosition="1" size="500,60" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> -+ </screen> -+ -+ -+ <!-- WLan Setup Plugin --> -+ <screen name="WlanSelection" position="209,48" size="865,623" title="Wireless Network Configuration..." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Wireless Network Adapter Selection..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/border_menu.png" position="120,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" /> -+ <widget name="menulist" position="130,150" size="322,338" transparent="1" backgroundColor="#27d9dee2" zPosition="10" scrollbarMode="showOnDemand" /> -+ <widget source="description" render="Label" position="500,140" size="280,360" font="Regular;19" halign="center" valign="center" backgroundColor="#c5c9cc" transparent="1"/> -+ </screen> -+ -+ <screen name="WlanSetup" position="209,48" size="865,623" title="Wireless Network Configuration..." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Wireless Network Setup Menu..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/border_menu.png" position="120,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" /> -+ <widget name="menulist" position="130,150" size="322,338" transparent="1" backgroundColor="#27d9dee2" zPosition="10" scrollbarMode="showOnDemand" /> -+ <widget source="description" render="Label" position="500,140" size="280,360" font="Regular;19" halign="center" valign="center" backgroundColor="#c5c9cc" transparent="1"/> -+ </screen> -+ -+ <screen name="WlanConfig" position="209,48" size="865,623" title="Wireless Network Configuration..." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Wireless Network Configuration..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/border_menu.png" position="120,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" /> -+ <widget name="config" position="130,150" size="322,338" transparent="1" backgroundColor="#27d9dee2" zPosition="10" scrollbarMode="showOnDemand" /> -+ <eLabel text="IP Address : " position="500,160" size="200,26" font="Semiboldit;22" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget source="ipaddress" render="Label" position="530,190" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" /> -+ <eLabel text="NetMask : " position="500,220" size="200,26" font="Semiboldit;22" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget source="netmask" render="Label" position="530,250" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" /> -+ <eLabel text="Gateway : " position="500,280" size="200,26" font="Semiboldit;22" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <widget source="gateway" render="Label" position="530,310" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget name="VKeyIcon" pixmap="Vu_HD/buttons/key_text.png" position="500,350" zPosition="10" size="35,25" transparent="1" alphatest="on" /> -+ <widget name="HelpWindow" pixmap="Vu_HD/vkey_icon.png" position="310,535" zPosition="1" size="1,1" transparent="1" alphatest="on" /> -+ </screen> -+ -+ <screen name="WlanScanAp" position="209,48" size="865,623" title="Wireless Network Configuration..." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Wireless Network AP Scan..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="key_blue" render="Label" position="665,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/border_menu.png" position="120,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" /> -+ <widget name="menulist" position="130,150" size="322,338" transparent="1" backgroundColor="#27d9dee2" zPosition="10" scrollbarMode="showOnDemand" /> -+ <widget source="Address" render="Label" position="490,220" zPosition="1" size="300,30" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="ESSID" render="Label" position="490,250" zPosition="1" size="300,30" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="Protocol" render="Label" position="490,280" zPosition="1" size="300,30" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="Frequency" render="Label" position="490,310" zPosition="1" size="300,30" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="Encryption key" render="Label" position="490,340" zPosition="1" size="300,30" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="BitRate" render="Label" position="490,370" zPosition="1" size="300,60" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" /> -+ </screen> -+ -+ <screen name="Wlanstatus" position="209,48" size="865,623" title="Wireless Network Configuration..." flags="wfNoBorder" backgroundColor="transparent"> -+ <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend" transparent="1" /> -+ <eLabel text="Wireless Network Status..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" /> -+ <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" /> -+ <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1"> -+ <convert type="ClockToText">Format:%H:%M</convert> -+ </widget> -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" /> -+ <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" /> -+ <widget source="status" render="Label" position="110,200" size="650,400" transparent="1" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" zPosition="1" /> -+ </screen> -+ -+ <!-- Wireless Access Point Plugin --> -+ <screen name = "WirelessAccessPoint" position="center,center" size="650,520" title="Wireless Access Point Setup" > -+ <ePixmap pixmap="Vu_HD/buttons/red.png" position="20,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/green.png" position="180,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="340,10" size="140,40" alphatest="on" /> -+ <ePixmap pixmap="Vu_HD/buttons/blue.png" position="500,10" size="140,40" alphatest="on" /> -+ <widget source="key_red" render="Label" position="25,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_green" render="Label" position="185,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_yellow" render="Label" position="345,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget source="key_blue" render="Label" position="505,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" /> -+ <widget name="config" zPosition="2" position="10,60" size="630,350" scrollbarMode="showOnDemand" transparent="1" /> -+ <widget source="current_settings" render="Label" position="10,410" size="630,20" font="Regular;19" halign="center" valign="center" transparent="1" /> -+ <widget source="IPAddress_text" render="Label" position="160,440" size="190,21" font="Regular;19" transparent="1" /> -+ <widget source="Netmask_text" render="Label" position="160,465" size="190,21" font="Regular;19" transparent="1" /> -+ <widget source="Gateway_text" render="Label" position="160,490" size="190,21" font="Regular;19" transparent="1" /> -+ <widget source="IPAddress" render="Label" position="370,440" size="240,21" font="Regular;19" transparent="1" /> -+ <widget source="Netmask" render="Label" position="370,465" size="240,21" font="Regular;19" transparent="1" /> -+ <widget source="Gateway" render="Label" position="370,490" size="240,21" font="Regular;19" transparent="1" /> -+ </screen> -+ -+</skin> -+ -diff --git a/data/fonts/Makefile.am b/data/fonts/Makefile.am -index 2f7e7c7..f81801a 100644 ---- a/data/fonts/Makefile.am -+++ b/data/fonts/Makefile.am -@@ -5,4 +5,7 @@ dist_install_DATA = \ - lcd.ttf \ - md_khmurabi_10.ttf \ - nmsbd.ttf \ -- tuxtxt.ttf -+ tuxtxt.ttf \ -+ MyriadPro-Regular.otf \ -+ MyriadPro-Semibold.otf \ -+ MyriadPro-SemiboldIt.otf -diff --git a/data/skin.xml b/data/skin.xml -index ccd8eb7..9233610 100755 ---- a/data/skin.xml -+++ b/data/skin.xml -@@ -150,11 +150,10 @@ - <convert type="ConditionalShowHide" /> - </widget> - <!-- Audio icon (is there multichannel audio?) --> --<!-- ikseong - <widget source="session.CurrentService" render="Pixmap" pixmap="skin_default/icons/icon_dolby.png" position="645,48" zPosition="1" size="26,16" alphatest="on"> - <convert type="ServiceInfo">IsMultichannel</convert> - <convert type="ConditionalShowHide" /> -- </widget> --> -+ </widget> - <!-- Progressbar (current event duration)--> - <ePixmap pixmap="skin_default/progress_bg.png" position="48,77" size="84,7" transparent="1" alphatest="on" /> - <widget source="session.Event_Now" render="Progress" pixmap="skin_default/progress_small.png" position="50,78" zPosition="1" size="80,5" transparent="1"> -diff --git a/lib/gdi/epng.cpp b/lib/gdi/epng.cpp -index fd33298..d8c1982 100644 ---- a/lib/gdi/epng.cpp -+++ b/lib/gdi/epng.cpp -@@ -116,10 +116,71 @@ int loadPNG(ePtr<gPixmap> &result, const char *filename) - } - surface->clut.start=0; - png_read_end(png_ptr, end_info); -+#ifndef BUILD_VUPLUS - } else { - result=0; - eDebug("%s: %dx%dx%d png, %d", filename, (int)width, (int)height, (int)bit_depth, color_type); - } -+#else //csh Support for 32bit png file. -+ }else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA && bit_depth == 8){ -+// eDebug("%s: %dx%dx%d png, %d", filename, (int)width, (int)height, (int)bit_depth, color_type); -+ result=new gPixmap(eSize(width, height), bit_depth*4); -+ gSurface *surface = result->surface; -+ int pass; -+ png_bytep *rowptr=new png_bytep[height]; -+ -+ -+ //png_set_swap_alpha(png_ptr); -+ -+ if (color_type & PNG_COLOR_MASK_COLOR) -+ png_set_bgr(png_ptr); -+ -+ -+ -+ int number_passes = png_set_interlace_handling(png_ptr); -+ -+ for (unsigned int i=0; i<height; i++) -+ rowptr[i]=((png_byte*)(surface->data))+i*surface->stride; -+ -+ for (pass = 0; pass < number_passes; pass++) -+ for (int y = 0; y < height; y++) -+ { -+ png_read_rows(png_ptr, &rowptr[y], png_bytepp_NULL, 1); -+ } -+ -+/* -+ png_bytep testptr = rowptr[32] + sizeof(unsigned int)*32; -+ -+ for(int i = 0 ; i < 40 ; i ++) -+ fprintf(stderr, "0x%x\n", testptr[i]); -+*/ -+ for (int y = 0; y < height; y++){ //csh -+ __u32 col; -+ unsigned int *ptr = (unsigned int *)rowptr[y]; -+ for(int i = 0 ; i < width ; i ++){ -+ col= ptr[i]; -+ col ^=0xFF000000; -+ ptr[i] = col; -+ } -+ } -+ -+ surface->clut.data=0; -+ surface->clut.colors=0; -+ surface->clut.start=0; -+/* -+ testptr = rowptr[32] + sizeof(unsigned int)*32; -+ fprintf(stderr, "----------------------------------------------\n"); -+ for(int i = 0 ; i < 40 ; i ++) -+ fprintf(stderr, "0x%x\n", testptr[i]); -+*/ -+ delete [] rowptr; -+ png_read_end(png_ptr, end_info); -+ -+ } else { -+ result=0; -+ eDebug("%s: %dx%dx%d png, %d", filename, (int)width, (int)height, (int)bit_depth, color_type); -+ } -+#endif - - png_destroy_read_struct(&png_ptr, &info_ptr,&end_info); - fclose(fp); -diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py -index 688fe50..7bc66dc 100755 ---- a/lib/python/Screens/ChannelSelection.py -+++ b/lib/python/Screens/ChannelSelection.py -@@ -2,6 +2,8 @@ from Tools.Profile import profile - - from Screen import Screen - from Components.Button import Button -+# ikseong -+from Components.Label import Label - from Components.ServiceList import ServiceList - from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap - from Components.MenuList import MenuList -@@ -731,6 +733,9 @@ class ChannelSelectionBase(Screen): - self["key_yellow"] = Button(_("Provider")) - self["key_blue"] = Button(_("Favourites")) - -+ # ikseong -+ self["etitle"] = Label(_('Channel Selection')) -+ - self["list"] = ServiceList() - self.servicelist = self["list"] - -@@ -876,25 +881,51 @@ class ChannelSelectionBase(Screen): - pos = titleStr.find(']') - if pos == -1: - pos = titleStr.find(')') -- if pos != -1: -- titleStr = titleStr[:pos+1] -- Len = len(self.servicePath) -- if Len > 0: -- base_ref = self.servicePath[0] -- if Len > 1: -- end_ref = self.servicePath[Len-1] -- else: -- end_ref = None -- nameStr = self.getServiceName(base_ref) -- titleStr += ' ' + nameStr -- if end_ref is not None: -- if Len > 2: -- titleStr += '/../' -+ # ikseong -+ if config.skin.primary_skin.value =="750S/skin.xml": -+ if pos != -1: -+ titleStr = titleStr[:pos+1] -+ Len = len(self.servicePath) -+ if Len > 0: -+ base_ref = self.servicePath[0] -+ if Len > 1: -+ end_ref = self.servicePath[Len-1] - else: -- titleStr += '/' -- nameStr = self.getServiceName(end_ref) -- titleStr += nameStr -- self.setTitle(titleStr) -+ end_ref = None -+ nameStr = self.getServiceName(base_ref) -+ if end_ref is not None: -+ titles = ".../"+ nameStr -+ if Len > 2: -+ titles += '/../' -+ else: -+ titles += '/' -+ nameStr = self.getServiceName(end_ref) -+ titles += nameStr -+ self["etitle"].setText(titles) -+ else: -+ titles = "Channel Selection "+titleStr + ' ' + nameStr -+ self["etitle"].setText(titles) -+ else: -+ # -+ if pos != -1: -+ titleStr = titleStr[:pos+1] -+ Len = len(self.servicePath) -+ if Len > 0: -+ base_ref = self.servicePath[0] -+ if Len > 1: -+ end_ref = self.servicePath[Len-1] -+ else: -+ end_ref = None -+ nameStr = self.getServiceName(base_ref) -+ titleStr += ' ' + nameStr -+ if end_ref is not None: -+ if Len > 2: -+ titleStr += '/../' -+ else: -+ titleStr += '/' -+ nameStr = self.getServiceName(end_ref) -+ titleStr += nameStr -+ self.setTitle(titleStr) - - def moveUp(self): - self.servicelist.moveUp() -diff --git a/lib/python/Screens/FixedMenu.py b/lib/python/Screens/FixedMenu.py -index 0122346..c877a19 100644 ---- a/lib/python/Screens/FixedMenu.py -+++ b/lib/python/Screens/FixedMenu.py -@@ -20,3 +20,10 @@ class FixedMenu(Screen): - }) - - self["title"] = StaticText(title) -+ # ikseong -+ self["thistory"] = StaticText(title) -+ self["title0"] = StaticText('') -+ self["title1"] = StaticText('') -+ self["title2"] = StaticText('') -+ # -+ -diff --git a/lib/python/Screens/Menu.py b/lib/python/Screens/Menu.py -index 2a8801c..20403d8 100755 ---- a/lib/python/Screens/Menu.py -+++ b/lib/python/Screens/Menu.py -@@ -22,6 +22,28 @@ from Screens.Setup import Setup, getSetupTitle - # read the menu - mdom = xml.etree.cElementTree.parse(resolveFilename(SCOPE_SKIN, 'menu.xml')) - -+# ikseong make menu title -+class title_History: -+ def __init__(self): -+ self.thistory = '' -+ def reset(self): -+ self.thistory = '' -+ def reducehistory(self): -+# print "reducehistory" , self.thistory -+ history_len = len(self.thistory.split('>')) -+ if(history_len < 3): -+ self.reset() -+ return -+ if(self.thistory == ''): -+ return -+ result = self.thistory.rsplit('>',2) -+ if(result[0] == ''): -+ self.reset() -+ return -+ self.thistory = result[0] + '> ' -+ -+t_history = title_History() -+# - class boundFunction: - def __init__(self, fnc, *args): - self.fnc = fnc -@@ -237,9 +259,41 @@ class Menu(Screen): - a = a and _(a) - if a is None: - a = _(parent.get("text", "").encode("UTF-8")) -+ # ikseong - enter Main menu -+ else: -+ t_history.reset() -+ - self["title"] = StaticText(a) - self.menu_title = a - -+ # ikseong make menu title -+ self["thistory"] = StaticText(t_history.thistory) -+ history_len = len(t_history.thistory) -+ self["title0"] = StaticText('') -+ self["title1"] = StaticText('') -+ self["title2"] = StaticText('') -+ if history_len < 13 : -+ self["title0"] = StaticText(a) -+ elif history_len < 21 : -+ self["title0"] = StaticText('') -+ self["title1"] = StaticText(a) -+ else: -+ self["title0"] = StaticText('') -+ self["title1"] = StaticText('') -+ self["title2"] = StaticText(a) -+ -+# english title -+# if(t_history.thistory ==''): -+# t_history.thistory = str(etitle) + ' > ' -+# else: -+# t_history.thistory = t_history.thistory + str(etitle) + ' > ' -+ -+ if(t_history.thistory ==''): -+ t_history.thistory = str(a) + ' > ' -+ else: -+ t_history.thistory = t_history.thistory + str(a) + ' > ' -+ # -+ - def keyNumberGlobal(self, number): - print "menu keyNumber:", number - # Calculate index -@@ -250,9 +304,15 @@ class Menu(Screen): - self.okbuttonClick() - - def closeNonRecursive(self): -+ # ikseong for menu title -+ t_history.reducehistory() -+ # - self.close(False) - - def closeRecursive(self): -+ # ikseong for menu title -+ t_history.reset() -+ # - self.close(True) - - def createSummary(self): -diff --git a/skin.py b/skin.py -index 19da203..f191530 100755 ---- a/skin.py -+++ b/skin.py -@@ -50,7 +50,7 @@ def loadSkin(name, scope = SCOPE_SKIN): - - # example: loadSkin("nemesis_greenline/skin.xml") - config.skin = ConfigSubsection() --config.skin.primary_skin = ConfigText(default = "skin.xml") -+config.skin.primary_skin = ConfigText(default = "Vu_HD/skin.xml") - - profile("LoadSkin") - try: -@@ -133,6 +133,36 @@ def loadPixmap(path, desktop): - raise SkinError("pixmap file %s not found!" % (path)) - return ptr - -+# ikseong -+from enigma import runMainloop, eDVBDB, eTimer, quitMainloop, \ -+ getDesktop, ePythonConfigQuery, eAVSwitch, eServiceEvent -+pngcache = [] -+def cachemenu(): -+ pixmaplist = [] -+ for (path, skin) in dom_skins: -+ for x in skin.findall("screen"): -+ if x.attrib.get('name') == 'menu_mainmenu': -+ print x.attrib.get('name') -+ for s in x.findall("ePixmap"): -+ if s.attrib.get('pixmap','') is not '': -+ pixmaplist.append(s.attrib.get('pixmap','')) -+ for s in x.findall('widget'): -+ if s.attrib.get('pixmap','') is not '': -+ pixmaplist.append(s.attrib.get('pixmap','')) -+ desktop = getDesktop(0) -+ for s in pixmaplist: -+ value ='/usr/share/enigma2/'+s -+# print value -+ ptr = loadPixmap(value, desktop) -+ pngcache.append((value,ptr)) -+# ikseong -+try: -+ if config.skin.primary_skin.value == "750S/skin.xml" or config.skin.primary_skin.value == "Vu_HD/skin.xml": -+ cachemenu() -+except: -+ print "fail cache main menu" -+# -+ - def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1))): - # and set attributes - try: -@@ -151,7 +181,15 @@ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1) - elif attrib == 'itemHeight': - guiObject.setItemHeight(int(value)) - elif attrib in ("pixmap", "backgroundPixmap", "selectionPixmap"): -- ptr = loadPixmap(value, desktop) # this should already have been filename-resolved. -+#ikseong -+ global pngcache -+ ptr = None -+ for cvalue, cptr in pngcache: -+ if cvalue== value: -+ ptr=cptr -+ if ptr is None: -+ ptr = loadPixmap(value, desktop) # this should already have been filename-resolved. -+# - if attrib == "pixmap": - guiObject.setPixmap(ptr) - elif attrib == "backgroundPixmap": diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_textvfd.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_textvfd.patch deleted file mode 100644 index f053a20..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_textvfd.patch +++ /dev/null @@ -1,43 +0,0 @@ -diff --git a/lib/python/Screens/ChoiceBox.py b/lib/python/Screens/ChoiceBox.py -index 7c8b142..39e70d4 100644 ---- a/lib/python/Screens/ChoiceBox.py -+++ b/lib/python/Screens/ChoiceBox.py -@@ -31,7 +31,9 @@ class ChoiceBox(Screen): - pos += 1 - self["list"] = ChoiceList(list = self.list, selection = selection) - self["summary_list"] = StaticText() -- self.updateSummary() -+# ikseong -+# self.updateSummary() -+ self.updateSummary(selection) - - self["actions"] = NumberActionMap(["WizardActions", "InputActions", "ColorActions", "DirectionActions"], - { -@@ -120,14 +122,21 @@ class ChoiceBox(Screen): - def updateSummary(self, curpos=0): - pos = 0 - summarytext = "" -+# ikseong -+# for entry in self.summarylist: -+# if pos > curpos-2 and pos < curpos+5: -+# if pos == curpos: -+# summarytext += ">" -+# else: -+# summarytext += entry[0] -+# summarytext += ' ' + entry[1] + '\n' -+# pos += 1 - for entry in self.summarylist: -- if pos > curpos-2 and pos < curpos+5: -- if pos == curpos: -- summarytext += ">" -- else: -- summarytext += entry[0] -- summarytext += ' ' + entry[1] + '\n' -+ if pos == curpos: -+ summarytext += entry[1] +'\n' -+ break - pos += 1 -+# - self["summary_list"].setText(summarytext) - - def cancel(self): diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd.patch deleted file mode 100644 index 473eea1..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd.patch +++ /dev/null @@ -1,141 +0,0 @@ -diff --git a/configure.ac b/configure.ac -index 4902a9c..4bd2117 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -207,4 +207,5 @@ tools/enigma2.sh - enigma2.pc - ]) - AC_DEFINE(BUILD_VUPLUS,1,[Define to 1 for vuplus]) -+AC_DEFINE(BUILD_VUPLUS_DUO,1,[Define to 1 for duo]) - AC_OUTPUT -diff --git a/lib/gdi/glcddc.cpp b/lib/gdi/glcddc.cpp -index 096705e..bcf0f5f 100755 ---- a/lib/gdi/glcddc.cpp -+++ b/lib/gdi/glcddc.cpp -@@ -34,6 +34,16 @@ void gLCDDC::exec(gOpcode *o) - { - switch (o->opcode) - { -+#ifdef BUILD_VUPLUS_DUO /* ikseong */ -+ case gOpcode::renderText: -+ if (o->parm.renderText->text) -+ { -+ lcd->updates(gDC::m_current_offset,o->parm.renderText->text); -+ free(o->parm.renderText->text); -+ delete o->parm.renderText; -+ } -+ break; -+#endif - case gOpcode::flush: - // if (update) - #ifndef BUILD_VUPLUS /* ikseong */ -diff --git a/lib/gdi/lcd.cpp b/lib/gdi/lcd.cpp -index 9cb657c..83add38 100755 ---- a/lib/gdi/lcd.cpp -+++ b/lib/gdi/lcd.cpp -@@ -228,3 +228,25 @@ void eDBoxLCD::update() - } - } - -+#ifdef BUILD_VUPLUS_DUO /* ikseong */ -+char *eDBoxLCD::remaketext(char *text) -+{ -+ int len = strlen(text); -+ int i; -+ for(i=0;i<len;i++) -+ { -+ if(text[i]==0x0a) -+ text[i] = 0x20; -+ } -+ return text; -+} -+ -+void eDBoxLCD::updates(ePoint start,char *text) -+{ -+ if((lcdfd >= 0) && (start.y() < 5)) -+ { -+ text = remaketext(text); -+ write(lcdfd,text,strlen(text)); -+ } -+} -+#endif -diff --git a/lib/gdi/lcd.h b/lib/gdi/lcd.h -index e7b4c2c..561e3b0 100644 ---- a/lib/gdi/lcd.h -+++ b/lib/gdi/lcd.h -@@ -36,6 +36,9 @@ public: - int stride() { return _stride; } - eSize size() { return res; } - virtual void update()=0; -+#ifdef BUILD_VUPLUS_DUO /* ikseong */ -+ virtual void updates(ePoint start,char *text) = 0; -+#endif - #endif - }; - -@@ -59,6 +62,10 @@ public: - void setInverted( unsigned char ); - bool isOled() const { return !!is_oled; } - void update(); -+#ifdef BUILD_VUPLUS_DUO /* ikseong */ -+ char *remaketext(char *text); -+ void updates(ePoint start,char *text); -+#endif - }; - - #endif -diff --git a/lib/python/Screens/ChoiceBox.py b/lib/python/Screens/ChoiceBox.py -index 7c8b142..39e70d4 100644 ---- a/lib/python/Screens/ChoiceBox.py -+++ b/lib/python/Screens/ChoiceBox.py -@@ -31,7 +31,9 @@ class ChoiceBox(Screen): - pos += 1 - self["list"] = ChoiceList(list = self.list, selection = selection) - self["summary_list"] = StaticText() -- self.updateSummary() -+# ikseong -+# self.updateSummary() -+ self.updateSummary(selection) - - self["actions"] = NumberActionMap(["WizardActions", "InputActions", "ColorActions", "DirectionActions"], - { -@@ -120,14 +122,21 @@ class ChoiceBox(Screen): - def updateSummary(self, curpos=0): - pos = 0 - summarytext = "" -+# ikseong -+# for entry in self.summarylist: -+# if pos > curpos-2 and pos < curpos+5: -+# if pos == curpos: -+# summarytext += ">" -+# else: -+# summarytext += entry[0] -+# summarytext += ' ' + entry[1] + '\n' -+# pos += 1 - for entry in self.summarylist: -- if pos > curpos-2 and pos < curpos+5: -- if pos == curpos: -- summarytext += ">" -- else: -- summarytext += entry[0] -- summarytext += ' ' + entry[1] + '\n' -+ if pos == curpos: -+ summarytext += entry[1] +'\n' -+ break - pos += 1 -+# - self["summary_list"].setText(summarytext) - - def cancel(self): -diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i -index 0bddce1..040952d 100755 ---- a/lib/python/enigma_python.i -+++ b/lib/python/enigma_python.i -@@ -131,6 +131,7 @@ is usually caused by not marking PSignals as immutable. - - #define DEBUG - #define BUILD_VUPLUS -+#define BUILD_VUPLUS_DUO - typedef long time_t; - %include "typemaps.i" - %include "std_string.i" diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd_mode.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd_mode.patch deleted file mode 100644 index 7d873ee..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd_mode.patch +++ /dev/null @@ -1,124 +0,0 @@ -diff --git a/configure.ac b/configure.ac -index 27beb1e..8e007e1 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -46,6 +46,28 @@ AC_CHECK_LIB([xmlccwrap], [exit], [LIBXMLCCWRAP_LIBS="-lxmlccwrap"], [AC_MSG_ERR - AC_SUBST(LIBXMLCCWRAP_LIBS) - AC_LANG_POP - -+ -+AC_ARG_WITH(display-text-vfd, -+ AC_HELP_STRING([--with-display-text-vfd], [use text based vfd, yes or no]), -+ [[withtextvfd=$withval]], -+ [[withtextvfd=no]] -+) -+if test x"$withtextvfd" != xno ; then -+ AC_DEFINE(DISPLAY_TEXTVFD, 1,[Define when using an text based vfd device]) -+fi -+AM_CONDITIONAL(DISPLAY_TEXTVFD, test x"$withtextvfd" != xno) -+ -+AC_ARG_WITH(display-graphic-vfd, -+ AC_HELP_STRING([--with-display-graphic-vfd], [use graphic based vfd, yes or no]), -+ [[withgraphicvfd=$withval]], -+ [[withgraphicvfd=no]] -+) -+if test x"$withgraphicvfd" != xno ; then -+ AC_DEFINE(DISPLAY_GRAPHICVFD, 1,[Define when using an graphic based vfd device]) -+fi -+AM_CONDITIONAL(DISPLAY_GRAPHICVFD, test x"$withgraphicvfd != xno") -+ -+ - AC_ARG_WITH(libsdl, - AS_HELP_STRING([--with-libsdl],[use libsdl, yes or no]), - [with_libsdl=$withval],[with_libsdl=no]) -diff --git a/lib/gdi/glcddc.cpp b/lib/gdi/glcddc.cpp -index 8ac8cd3..74f6afd 100755 ---- a/lib/gdi/glcddc.cpp -+++ b/lib/gdi/glcddc.cpp -@@ -34,13 +34,23 @@ void gLCDDC::exec(const gOpcode *o) - { - switch (o->opcode) - { -+#if defined(DISPLAY_TEXTVFD) -+ case gOpcode::renderText: -+ if (o->parm.renderText->text) -+ { -+ lcd->updates(gDC::m_current_offset, o->parm.renderText->text); -+ free(o->parm.renderText->text); -+ delete o->parm.renderText; -+ } -+ break; -+#endif /*defined(DISPLAY_TEXTVFD)*/ - case gOpcode::flush: -+#if defined(DISPLAY_GRAPHICVFD) && !defined(DISPLAY_TEXTVFD) - // if (update) --#ifndef BUILD_VUPLUS /* ikseong */ - lcd->update(); - #else -- ; --#endif -+ ; -+#endif /*defined(DISPLAY_GRAPHICVFD) && !defined(DISPLAY_TEXTVFD)*/ - default: - gDC::exec(o); - break; -diff --git a/lib/gdi/lcd.cpp b/lib/gdi/lcd.cpp -index a5ac351..74bc3e0 100755 ---- a/lib/gdi/lcd.cpp -+++ b/lib/gdi/lcd.cpp -@@ -183,9 +183,7 @@ eDBoxLCD *eDBoxLCD::getInstance() - - void eDBoxLCD::update() - { --#ifdef BUILD_VUPLUS /* ikseong */ -- return ; --#endif -+#if defined(DISPLAY_GRAPHICVFD) && !defined(DISPLAY_TEXTVFD) - if (lcdfd >= 0) - { - if (!is_oled || is_oled == 2) -@@ -227,5 +225,20 @@ void eDBoxLCD::update() - write(lcdfd, raw, 64*64); - } - } -+#endif /*defined(DISPLAY_GRAPHICVFD) && !defined(DISPLAY_TEXTVFD)*/ - } - -+#if defined(DISPLAY_TEXTVFD) -+void eDBoxLCD::updates(ePoint start,char *text) -+{ -+ if((lcdfd >= 0) && (start.y() < 5)) -+ { -+ int i = 0, text_len = strlen(text); -+ for(; i<text_len ; i++) -+ { -+ if(text[i]==0x0a) text[i] = 0x20; -+ } -+ write(lcdfd, text, text_len); -+ } -+} -+#endif /*defined(DISPLAY_TEXTVFD)*/ -diff --git a/lib/gdi/lcd.h b/lib/gdi/lcd.h -index e7b4c2c..80a56f2 100644 ---- a/lib/gdi/lcd.h -+++ b/lib/gdi/lcd.h -@@ -36,6 +36,9 @@ public: - int stride() { return _stride; } - eSize size() { return res; } - virtual void update()=0; -+#if defined(DISPLAY_TEXTVFD) -+ virtual void updates(ePoint start,char *text) = 0; -+#endif /*defined(DISPLAY_TEXTVFD)*/ - #endif - }; - -@@ -59,6 +62,9 @@ public: - void setInverted( unsigned char ); - bool isOled() const { return !!is_oled; } - void update(); -+#if defined(DISPLAY_TEXTVFD) -+ void updates(ePoint start,char *text); -+#endif /*defined(DISPLAY_TEXTVFD)*/ - }; - - #endif diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_0.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_0.png deleted file mode 100755 index c74e818cb8109761f3b13e0c3bfa0d84d96a01b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$x6yOu$8WIu`5D*X=8tUuo>+kRH z;^N}x=jY|+<?Ze5>FMe0>>L~%?BU_z=H?a@6y)ma8Xg}0@ZrOC>(;GWwd(Zg)9cr- zFDol6FE5XYi8*`r?4w7IZrr%h*Vngg+qUc1uUAx596o$FD=RBDHg@XNsimc*U0q$# z(b1D9Pu{U($F*zMl9Q7wD=W8b*)n6sjD&=Q^z`%t2M#znIfaFVy?OJ-+S>a6|Nl;H z(|m!hH7g173kGsY2Mi1Q{S1L7-1BsC45_%aWb(<PLk0q@sRrH6!XKP&OxmE&nbK(f z^M8EzjFmU8DReQ{&Ip?RTc!8x``n)7FXyiwt9#9vm%8fY$|X{g^^aVZ`DE$sJC@;L zenoKK@5!F^is_fm3LDEP&rMWWB*oPtk}1&hLCGyom@E0s;Sa*rhF48y@*g;-dCw&@ zIGxSGP<K_P@p&+17~e2gdr$W&H6fuhi!(aI4THW58%u7oIJYrv=Z?efX)_dlJL)-! zzrUJl)~<4&tw!biZu6KEyY2ZyYkn8^^{M`|eNwB(wd?Wz9mnP~Ff*JoZoTj1QsD{o ODTAl0pUXO@geCxmVGytY diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_1.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_1.png deleted file mode 100755 index 7d5319b693b996eae8151bf7a8d8955bc46a3f0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$B3h)VW4G9Txb93|X@NjW)@%Q%+ z4Gj$l2nY%aa&>iec6JUA56{of&&$hu^ypDmR#s+aW=u>>VPRozZtkpEv(BD9o1LAV zl9H01o}QMLR#{nj?b<b8UtcdTFF!v&Z*OlWCnrx&&*0$TH*emAg@svLTmS$6|H1Ji z7l5{_l?3?(1G$6&!}6-eJwP2BJzX3_DsC;A>@If5fQOa0CBW&$-p_*H_bV|*>uvfJ zVX*q*=QTMu_tYg%>YQ<HnWc2}rBg>v8Vk6)`A<60vSj`uQ#Yqg3*GrnrX|c=pQSUW zyUoixlzGLSfS_9<)877K@VOJv@$6BiRM^EiHU}n!nuPOjNEAJLli4TIwfMUUuXg9} zmqrK9M3%M7vfZ#;{AO=kpYpdbkIL_HTq}PYcU}DUT=*{2FS)w!H^sjk-=FbV_W*-@ XOv=^829gtjj%V<6^>bP0l+XkKM|sj9 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_2.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_2.png deleted file mode 100755 index 7ab668b8dd37d27be73f61e35687bf23a294a838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$>3GfMV_4D)d_V#vlb@lS{3JneQ z^z?LbaR~?r2o4T*c6JU53i9yqaC37D4-a3nW=%^=%b7E0=Fgvh@ZiBihYp=SeR}84 zoq>UYv9Yl?Zrq5BjGQ%V*3zX*w{6>2RaI44S$X#C+2rKp!-o&2rlvl6^vKuO*U8Dr z-`_tZBqS^>?9H1u*4Ebl|Nnn-Z}mr@dvr>I{DOg8VgbYPYn(kmefvFK978H@ExCMC zs!2hhEm6xi+Vu8!+rP_y@82)vl5k{s^S#A0kH6;#*i$cj&MhkY^Ix;TJ6<<D6K_oX zpzf#QBebK&_nct9#<Xj{jm@l0j~|)6u;i%hfgs&A3q35=0;e#TZ=HC1kIn&4-Zg^9 zSZ}QAH04k3%QW4%EO@q(?y8BVwr?9uE*NJ!sh*$kbfMdu8n;VKmwfbkjb)~Xt&rLo z_;}wgnaX#2-z&ZUEqSBn{qml9ZU1FYeUB0Ua=iZHGvxye%~^#n51nZE0`v-lr>mdK II;Vst0GeL%iU0rr diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_3.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_3.png deleted file mode 100755 index 7c559c6b292bf3a96bc746084b188e55e5a39394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$x8sHP+8WIxX=jRs?5a8?U>*C_# z?d=^J8tUQU;q2@j92^`J6y)aS=IZJi9v=Si;luUo*PlImcK`nUQBhHGadD3xJt`?F zS-W;^Oiav@B}=-yyJKTx6A}_uty;Bi-MZA&)EhT$L`FuImzSrcq*PT^O`be?&6+jS zrcEm?EuB7n`h*D+=FOYe(a}*<RCM6Lf%)_2dwF>|IXU_J`+ItNzIpQ|EG*30+WP<h z|NlM}H3A)MUJ~RN4CIml7z85cb_0#L<muuVQgLg^<l}sY3<O+!U+6kGz2Eyi@#lYk z<r{4`x&_(irDVF-slSi7Q?I<nMSq{w#n{Ni=tCiShRam$bg6bmoV>9^=Ah!cfVfTT zLkw4ygetrfQJMW~L9BZy>$3^VIhf8%GZ{}kQKrXsAcXgf=N?J(i&vD3C(Yt)_^NH7 zzV@ZA_y=n%gXbcfo7Ss8i{Wi(lj_*(A136soUz5IW>4ZrPww{0`^N*@lxp9s7I~PP z{ULkzq!yWK|C<vw+gl2U*U!6TdF-z9&F9-4>;H7;+ptJ5L<sesiFxy89?*9Tp00i_ I>zopr03)IeA^-pY diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_4.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_4.png deleted file mode 100755 index ca0fc51ae1b45e96608de2b073e330722e5e1627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$>5AX?b4G9Txb#?Xd@Njc;3kV4C z^YaT04fXZ)4GIc!ad8O_4)*u=cXoF6_V)Jj@(K?RKXc~HqeqXjva${xIy8Oy^t`;h zii(QN%*<=ouEoa2=H}+Mw6t8memx~6rL3%M=gyt!>FJe~l{aqONJvOHd-m+ZhYw3j zOP!pYJUu<b!ouFXd1GyD{r~^}#!uUsfKJja3GxdDa)|~EOW$+<1!_F*>Eaktacjxs zlR`}f0xplcx)eCx{a$DL@Beqn1f>*?rw7ADSM9Ett|I*PU+*R<Nh#UC`9TTMt5)st zS~aOid)gAOrTLGGrnD?^R!%EDI#by*{eTQZfe2seOkSY_BAaCQCx{<cZ|K&a6X)3U zljp%D;lAmUmA+nUIL@JdVh2OumaFq?<Cq_|NCxj!zw>3+b5oIXpS#6;RSNBL4>LUo zu|C}QutQaS)!lG!r@m_WTN8@wj)lg2p6uB#^j+rJ=Rc+|`pYjKac^K`n7g>Jb>h|R RD?l$Xc)I$ztaD0e0syyK@v{H` diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_5.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_5.png deleted file mode 100755 index d3968de367d0678953e15027711a836752ca7678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%c9N-h;>h10A>gww0>FMI)5*ixn z=jZ3^>+9_792^|%;o%V!6y)aS79Jk{@ZrNVXU<%^cJ1`()4jdDJ9g}dkB^@}fBxdd zivt4#V`5?w5)$g`>$|$T4jnpl<Hn6OYu1#OmUee{H#aw@rlwxMetr7%>1WTL-MV#a zWo2c0dU`-WfR~q7NJxm2las%{|C={&!otF=t*!t6|9?i3*%0VF!;&DsU?7(yz#u=% zPZ6m3n5T<lNX4xsmv0I+8Spq<-1VT1_0IQNXO(0B|646|yxnGGSCKX&v+cJ_bH!h^ zHJtWZv){zdzcJNd^71sdLvtf0Uhus9EK7*5vRSsM?aZumCuYwxIxTE*>3~$vNyfH~ zZDo@uY5N5An#xHwOj%uPSg|H^Vz7WmgRkL6w+!nB%efK7<_tM656rTXOg%4@;v~H3 z{pHXlJx&d*yi4<6JYV+Mqiy<Z{|zParhKyB?`>FETz^aL`oAX^or~Wuy!AZ4vHp*E d=shML2D5h!oPx8B76E<4;OXk;vd$@?2>_hD`=$T@ diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_6.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_6.png deleted file mode 100755 index f48d3aa91a86b4bdb858ef1ff096140b9f690e41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 558 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%c7T^=&>hJF#5D*X=8X6oN?Be3$ z>FMd`=jY|+<?HL~?CcyA6y)LI;qC41>gwv|<`y0ve)jCyhYuf~Idf*snl-(>y{Au~ zE-fuRaNxkysZ$RfI&}E(;k2~0ojZ4ym6fHZr>|YRwxXh<wzjsYs3<EdD<&pp!h{Kt zk&&sXsWWEG*s^8IqeqYW`ud!loI*lE!otGdym@17ZT<iM|HXycd_Wf(l?3?(1G%ID z2Ht=f?}54>c)B=-RNPu}`F2^8fk5lSjMWhz1XygsbGJS}G;iPk)1GP^DIKfD>%=ES z{t5RCsQ({)&L!M@_NUutinOo#b-7sw{X5bbGWkpFKDFr{W?up-Z`Ur4nv~;IcCF#w zjZzJ%SCLY`7KbZu4}8P^E7sJ-IHh>W{MUyIBLvTOFcwb<vhH;;Hk;SDL__FEvbRa& zMut=A@(~{-I?@uJIK=I15bkFd`YkN!y=GBH>x}jlo7;nv<&~qE^lf}r7RL!E|7J~D zzh};b=Xc~|pX{~w&)xSsdC~p0|8k#d*KzN9ynn}2r2`BsOY1H#I>`V^84RATelF{r G5}E)=I|{=9 diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_7.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_7.png deleted file mode 100755 index 9e36d88d839275a7bf8ac79a5a6485ac95a6b6a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%s3-AeX_44ux2?_D{_xJVn4Gj%- zb8~ZXaq;l*aCLPJ2ncX?b`A;(3J(u|`0!z5WaRbh*B?E4v}DPWHEY&v-MTd)Az{&? zMM+6X3l=PxIdf)aW@dDB^xCy+SFKvLaN)v;h={bbv~AnA`T6;IdwV-MIeB_|zIpQ| zI5;>gEX>;4`v3p`;rSwKfiBT13GxdDa)|>BMk_wV0Cnx~ba4!+xV7Z+O|d2gfrdma z-)Mu|-*cpA-}}$%o#4P`6Z<8W_xOJ<w~zmPE7Voyp8bA1<g@lgzc@c@p^rzpTfBwh z*Sst|A-%@=#OzKZ=G1k3YYt9Kn>E*N;r%aj7wK@@ZhZDkCNWp-8qXTu6Wx-L#oNUS zmQ6HmTH~N*viX_kx(!>6H~l`j#rDLlp2&jsmD^f^y$mYW?+Ns*Ji*(u=l6y7i+?4z tAN{txQ_io3|Ek?>rvE?mch#^+FobQ(<vHY0*aGwegQu&X%Q~loCIH88;?@8F diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_8.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_8.png deleted file mode 100755 index f88ec9563afce8a2690ecdc4736c3e5122ee0cd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 590 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$x9pDq<8WIxX;^N}z=@}Xt8W0fR z@9*#B<>l+^8yp<$?d|RC?Cj^~=i%WI6cps<=H}|^8Xg}0=+UEx4<F8&HS7BI>!(kj zE-5KlwQ5y%c6MZBWNK>a)TvXKELqaq+q-DdqBCdC6crV1-@g6e!GjYfOz7_Jj);gj zd-m+)$&<6PvbJs8*3{H=`0(L1Yt~%5b}cS0uDQ9nwzhWu{P|n9Y^kWIaB^}A3k!Sm z=8d(r_5c6>U9Tu+0G(}F666;Q<dOv#tk$GD01bKK>Eaktacjxs$nZl30&dFNjxJr~ z84)F5o>Is@J^#=D{XIs_+awQtJotOU<m#gNlRAI?lNOfvyJ7pvb9yZsjLtq;y-adu zg^<fKKR)NA-is6RUU<x~VKmmSzI0adapK<XJ5mC9Rhy0)c(!dw5;0rJFeNkUP}j<5 zAv>JDzkMu~Y<P7`>q}jR?>kJd%5b+HE*4)W5bUeA=Yid6xdQcNv&1$ttlD}$n|0;y zljeJv{@TbdJie{CT{ewjyA*@B*saR-#cB7NtM@<Db-njjp=HtM;!7%K_OoAXR<moj lIlrIv@8kG4$+`y^UcBsmHh=!>4M6`gc)I$ztaD0e0sy*BC3ye< diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_9.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_9.png deleted file mode 100755 index 8a55eaaf938e0ab210bb822a8586a37e18183162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mj1!3-pOo~17UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$x8sHP+8WIu`5D?(v;u0Df>gVU@ z<>eI|9PID!@8RL$>+9?6?Cj>|=I!n6>gpO46cipF{_x?$qN1XTii&I3uAMn^X6DS9 zt5&T_PfwpVZQ9PAJ0CrIl#q~c;J|^&lP9lUz54p~>(i%CFDxvKh=@3N@L*hATwY#Y zWMpJ{dHJ?&+s>XnTU}k<+uNIxlCp5&!u|XAA3AjC@ZrNwPEMYlo?&5OZ{EDIwzmHN z|G&m6t5%?c%}av(f`MEz0E0l}+-{%|_dQ)4Ln>}9nS48{DL}x@e5S@yPPv0d=hJo9 z)>r*^_fB)V@%Y*2MWu|J?XF$D*Zgy5|Hd98ui2-!PfG}2Hlyabi1K5<H7A~U9zAwd zg7;-xjiOhB%A}bkpAWrhv&c1^vuQ<}O=8cy=U+c)x|IbdPdo6mk|Au(s>+mG4!@Xg zty#r6L(+h=$#z3psIRjH(`UVgaI>o+|2wQ-9DC8R;@Rp0Z10UGSk13$yYIf^!OLen z^JhB#*LATFSUCH4)-sm^$4@-o=-F3Yzd`Z&KO51)xBgOdi|<sQ_+6v>LjJ$2<bEa| Z2ELWuu8k+PRDoV)@O1TaS?83{1OQ~XAS3_) diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/skin_user.xml b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/skin_user.xml deleted file mode 100644 index d35cc2f..0000000 --- a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/skin_user.xml +++ /dev/null @@ -1,243 +0,0 @@ -<skin> - <fonts> - <font filename="nmsbd.ttf" name="VFD" scale="90"/> - </fonts> - <screen name="InfoBarSummary" position="0,0" size="256,64" id="1"> - <widget source="session.CurrentService" render="Label" position="0,7" size="143,48" font="VFD;24" halign="center" valign="center" > - <convert type="ServiceName">Name</convert> - </widget> - <widget source="session.Event_Now" render="Progress" position="0,59" size="143,5" borderWidth="1"> - <convert type="EventTime">Progress</convert> - </widget> - <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1"> - <convert type="ClockToText">Format:%H:%M</convert> - </widget> - <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1"> - <convert type="ClockToText">Format:%S</convert> - </widget> - <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0" size="28,12"> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0" size="10,12"> - <convert type="ServiceInfo">IsCrypted</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12"> - <convert type="ServiceInfo">HasTelext</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12"> - <convert type="ServiceInfo">IsWidescreen</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12"> - <convert type="ServiceInfo">IsMultichannel</convert> - <convert type="ConditionalShowHide" /> - </widget> - </screen> - <screen name="ChannelSelection_summary" position="0,0" size="256,64" id="1"> - <widget source="parent.ServiceEvent" render="Label" position="0,7" size="143,48" font="VFD;24" halign="center" valign="center" > - <convert type="ServiceName">Name</convert> - </widget> - <widget source="session.Event_Now" render="Progress" position="0,59" size="143,5" borderWidth="1"> - <convert type="EventTime">Progress</convert> - </widget> - <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1"> - <convert type="ClockToText">Format:%H:%M</convert> - </widget> - <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1"> - <convert type="ClockToText">Format:%S</convert> - </widget> - <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0" size="28,12"> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0" size="10,12"> - <convert type="ServiceInfo">IsCrypted</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12"> - <convert type="ServiceInfo">HasTelext</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12"> - <convert type="ServiceInfo">IsWidescreen</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12"> - <convert type="ServiceInfo">IsMultichannel</convert> - <convert type="ConditionalShowHide" /> - </widget> - </screen> - <screen name="InfoBarMoviePlayerSummary" position="0,0" size="256,64" id="1"> - <widget source="session.CurrentService" render="Label" position="0,7" size="143,48" font="VFD;24" halign="center" valign="center" > - <convert type="ServiceName">Name</convert> - </widget> - <widget source="session.CurrentService" render="Progress" position="0,59" size="143,5" borderWidth="1"> - <convert type="ServicePosition">Position</convert> - </widget> - <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1"> - <convert type="ClockToText">Format:%H:%M</convert> - </widget> - <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1"> - <convert type="ClockToText">Format:%S</convert> - </widget> - <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0" size="28,12"> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0" size="10,12"> - <convert type="ServiceInfo">IsCrypted</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12"> - <convert type="ServiceInfo">HasTelext</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12"> - <convert type="ServiceInfo">IsWidescreen</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12"> - <convert type="ServiceInfo">IsMultichannel</convert> - <convert type="ConditionalShowHide" /> - </widget> - </screen> - <screen name="ChoiceBox_summary" position="0,0" size="256,64" id="1"> - <widget source="parent.summary_list" render="Label" position="6,0" size="244,64" font="Regular;12" /> - </screen> - <screen name="MessageBox_summary" position="0,0" size="256,64" id="1"> - <widget source="parent.Text" render="Label" position="6,0" size="244,45" font="Regular;15" halign="center" valign="center" /> - <widget source="parent.selectedChoice" render="Label" position="6,46" size="244,18" font="Regular;18" halign="center" valign="center" /> - </screen> - <screen name="MenuSummary" position="0,0" size="256,64" id="1"> - <widget source="parent.title" render="Label" position="0,0" size="143,32" font="VFD;18" halign="center" valign="center"/> - <widget source="parent.menu" render="Label" position="0,32" size="143,32" font="VFD;18" halign="center" valign="center"> - <convert type="StringListSelection" /> - </widget> - <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1"> - <convert type="ClockToText">Format:%H:%M</convert> - </widget> - <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1"> - <convert type="ClockToText">Format:%S</convert> - </widget> - <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0" size="28,12"> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0" size="10,12"> - <convert type="ServiceInfo">IsCrypted</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12"> - <convert type="ServiceInfo">HasTelext</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12"> - <convert type="ServiceInfo">IsWidescreen</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12"> - <convert type="ServiceInfo">IsMultichannel</convert> - <convert type="ConditionalShowHide" /> - </widget> - </screen> - <screen name="ServiceScanSummary" position="0,0" size="256,64" id="1"> - <widget name="Title" position="0,0" size="256,26" font="VFD;20" transparent="1" /> - <widget name="Service" position="0,30" size="256,30" font="VFD;15" transparent="1" /> - <widget name="scan_progress" position="0,59" zPosition="1" borderWidth="1" size="143,5" backgroundColor="dark" /> - </screen> - <screen name="SetupSummary" position="0,0" size="256,64" id="1"> - <widget source="SetupTitle" render="Label" position="6,0" size="143,16" font="VFD;16" /> - <widget source="SetupEntry" render="Label" position="6,16" size="143,32" font="VFD;14" /> - <widget source="SetupValue" render="Label" position="6,48" size="143,16" font="VFD;14" /> - <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1"> - <convert type="ClockToText">Format:%H:%M</convert> - </widget> - <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1"> - <convert type="ClockToText">Format:%S</convert> - </widget> - <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0" size="28,12"> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0" size="10,12"> - <convert type="ServiceInfo">IsCrypted</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12"> - <convert type="ServiceInfo">HasTelext</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12"> - <convert type="ServiceInfo">IsWidescreen</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12"> - <convert type="ServiceInfo">IsMultichannel</convert> - <convert type="ConditionalShowHide" /> - </widget> - </screen> - <screen name="StandbySummary" position="0,0" size="256,64" id="1"> - <widget source="global.CurrentTime" render="Label" position="20,22" size="113,32" font="VFD;40" halign="right" valign="center" transparent="1"> - <convert type="ClockToText">Format:%H:%M</convert> - </widget> - <widget source="global.CurrentTime" render="Label" position="135,20" zPosition="1" size="32,20" font="VFD;20" valign="center" transparent="1"> - <convert type="ClockToText">Format:%S</convert> - </widget> - <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0" size="28,12"> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0" size="10,12"> - <convert type="ServiceInfo">IsCrypted</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12"> - <convert type="ServiceInfo">HasTelext</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12"> - <convert type="ServiceInfo">IsWidescreen</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12"> - <convert type="ServiceInfo">IsMultichannel</convert> - <convert type="ConditionalShowHide" /> - </widget> - </screen> - <screen name="SimpleSummary" position="0,0" size="256,64" id="1"> - <widget source="parent.Title" render="Label" position="0,0" size="143,64" font="VFD;20" halign="center" valign="center" /> - <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1"> - <convert type="ClockToText">Format:%H:%M</convert> - </widget> - <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1"> - <convert type="ClockToText">Format:%S</convert> - </widget> - <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0" size="28,12"> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0" size="10,12"> - <convert type="ServiceInfo">IsCrypted</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12"> - <convert type="ServiceInfo">HasTelext</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12"> - <convert type="ServiceInfo">IsWidescreen</convert> - <convert type="ConditionalShowHide" /> - </widget> - <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12"> - <convert type="ServiceInfo">IsMultichannel</convert> - <convert type="ConditionalShowHide" /> - </widget> - </screen> - <screen name="MediaPlayerLCDScreen" position="0,0" size="256,64" id="1"> - <widget name="text1" position="4,0" size="252,38" font="VFD;18"/> - <widget name="text3" position="4,39" size="252,12" font="VFD;12"/> - <widget name="text4" position="4,52" size="252,12" font="VFD;12"/> - </screen> - <screen name="WizardSummary" position="0,0" size="256,64" id="1"> - <widget source="text" render="Label" position="6,0" size="252,16" font="VFD;18" transparent="1" /> - <widget source="parent.list" render="Label" position="6,18" size="252,46" font="VFD;12"> - <convert type="StringListSelection" /> - </widget> - </screen> -</skin> diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_crypt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_crypt.png deleted file mode 100755 index e722ee29e9cb8df8c59c5285053fe7a760ce5841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 961 zcmV;y13vtTP)<h;3K|Lk000e1NJLTq000UA000aK00000egJcP00009a7bBm000XU z000XU0RWnu7ytkR8)-vBP*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-muNV4mRU;^fLC zz`#&YR8r&~<QN$d8KuB}o`H>lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4{Q&k2kgNVo|1qcff zJ_s=cNG>fZg9jx8g8+jTgC9dB!zzXcjM9uzjPn?uG8r;8FkNESU~Xi-%VNVakCmA< zoAoN26Wb<s7514N0vw&3tenkU%v^2U+}sm+q<EI{8uK3F3+8*qUo9Xcuv*Yf@R3lX zu%hr`k#tdB(XC=};+*1JB~m1XC67u~Nb5>Jk(nbKDkms+R=!8UN0C?Yg3=V_C>14@ z*Q#698rA(YWHsJu?$es6ovLH4E2R5M?}+|<gBrsqBTHjR<KHItOb?r_Fz>ghuuQb_ zv9_>LwH2{rvHNQO+~Kz41*c=qdtJ7=u6JAMzSLup=R&Uq-V1#e`!4fa<-a~)YvA6X zW5MS`ZiPMz`x3zvDHx>`Z5-nk8x@xq-;yvpadXny<mahOX>#c{8Bv*4S+lbD<lM_+ z%2zM&DJ(9UU3|FYZJ9*5OGRPjysER+e{1#X;_D|h9BcgDY|xV4I<M_|hhV37S9|y2 zUWPvV{<;bKCjOu7IHh&!iRrvEf@jW}^=OXP+>&|w7H};LTeNub$E6O-CM<ur(s)(t z>YHnI*EOxbxzS)#$L0rHt+q|w{$Z!@u2p+D_NMPUen9<T=b_g}{EluuE`Fl+<df6h zXSSS^J>P!e)1|n}r><IDTXsYAX6vo5chc|Pyzleiz$4SgtDh=9oB2ZUW!G!wH+64+ zzAydo=~KbycVF|qz59{>^TY4rKi~dU{r?XDE({%upgajN0000WV@Og>004R=004l4 z008;_004mL004C`008P>0026e000+nl3&F}0000WNkl<Zc-mt8&j15V4CqWoMify- jd}=9R0ssI2|NjF3;7<Y<r0m{t00000NkvXXu0mjf$Um)S diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_dolby.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_dolby.png deleted file mode 100755 index e15fce58f7d27864386f82ba18163ee3fd88f243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 985 zcmV;~119{5P)<h;3K|Lk000e1NJLTq000mG000aK00000PK;t*00009a7bBm000XU z000XU0RWnu7ytkR8)-vBP*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-muNV4mRU;^fLC zz`#&YR8r&~<QN$d8KuB}o`H>lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4{Q&k2kgNVo|1qcff zJ_s=cNG>fZg9jx8g8+jTgC9dB!zzXcjM9uzjPn?uG8r;8FkNESU~Xi-%VNVakCmA< zoAoN26Wb<s7514N0vw&3tenkU%v^2U+}sm+q<EI{8uK3F3+8*qUo9Xcuv*Yf@R3lX zu%hr`k#tdB(XC=};+*1JB~m1XC67u~Nb5>Jk(nbKDkms+R=!8UN0C?Yg3=V_C>14@ z*Q#698rA(YWHsJu?$es6ovLH4E2R5M?}+|<gBrsqBTHjR<KHItOb?r_Fz>ghuuQb_ zv9_>LwH2{rvHNQO+~Kz41*c=qdtJ7=u6JAMzSLup=R&Uq-V1#e`!4fa<-a~)YvA6X zW5MS`ZiPMz`x3zvDHx>`Z5-nk8x@xq-;yvpadXny<mahOX>#c{8Bv*4S+lbD<lM_+ z%2zM&DJ(9UU3|FYZJ9*5OGRPjysER+e{1#X;_D|h9BcgDY|xV4I<M_|hhV37S9|y2 zUWPvV{<;bKCjOu7IHh&!iRrvEf@jW}^=OXP+>&|w7H};LTeNub$E6O-CM<ur(s)(t z>YHnI*EOxbxzS)#$L0rHt+q|w{$Z!@u2p+D_NMPUen9<T=b_g}{EluuE`Fl+<df6h zXSSS^J>P!e)1|n}r><IDTXsYAX6vo5chc|Pyzleiz$4SgtDh=9oB2ZUW!G!wH+64+ zzAydo=~KbycVF|qz59{>^TY4rKi~dU{r?XDE({%upgajN0000WV@Og>004R=004l4 z008;_004mL004C`008P>0026e000+nl3&F}0000uNkl<Zc-mt8&wvV;(D)223=E76 z3=n0E3=IFFDj4AeOba87k7)+c0{>w)K?VN92?j=jE(Ht#11Sg>SXA&w00000NkvXX Hu0mjfTaC2G diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_format.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_format.png deleted file mode 100755 index 382637e400f2072ae9472d6b39f6a39b8c001e8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996 zcmV<A0~`E_P)<h;3K|Lk000e1NJLTq000#L000aK00000sHLeH00009a7bBm000XU z000XU0RWnu7ytkR8)-vBP*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-muNV4mRU;^fLC zz`#&YR8r&~<QN$d8KuB}o`H>lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4{Q&k2kgNVo|1qcff zJ_s=cNG>fZg9jx8g8+jTgC9dB!zzXcjM9uzjPn?uG8r;8FkNESU~Xi-%VNVakCmA< zoAoN26Wb<s7514N0vw&3tenkU%v^2U+}sm+q<EI{8uK3F3+8*qUo9Xcuv*Yf@R3lX zu%hr`k#tdB(XC=};+*1JB~m1XC67u~Nb5>Jk(nbKDkms+R=!8UN0C?Yg3=V_C>14@ z*Q#698rA(YWHsJu?$es6ovLH4E2R5M?}+|<gBrsqBTHjR<KHItOb?r_Fz>ghuuQb_ zv9_>LwH2{rvHNQO+~Kz41*c=qdtJ7=u6JAMzSLup=R&Uq-V1#e`!4fa<-a~)YvA6X zW5MS`ZiPMz`x3zvDHx>`Z5-nk8x@xq-;yvpadXny<mahOX>#c{8Bv*4S+lbD<lM_+ z%2zM&DJ(9UU3|FYZJ9*5OGRPjysER+e{1#X;_D|h9BcgDY|xV4I<M_|hhV37S9|y2 zUWPvV{<;bKCjOu7IHh&!iRrvEf@jW}^=OXP+>&|w7H};LTeNub$E6O-CM<ur(s)(t z>YHnI*EOxbxzS)#$L0rHt+q|w{$Z!@u2p+D_NMPUen9<T=b_g}{EluuE`Fl+<df6h zXSSS^J>P!e)1|n}r><IDTXsYAX6vo5chc|Pyzleiz$4SgtDh=9oB2ZUW!G!wH+64+ zzAydo=~KbycVF|qz59{>^TY4rKi~dU{r?XDE({%upgajN0000WV@Og>004R=004l4 z008;_004mL004C`008P>0026e000+nl3&F}0000(Nkl<Zc-oYYK@Na048t76|G(@V z3TUf(p~u9s(#UYv6mmm)X0h^kRJ%b)UPDWEHUXgo9}5twIt+X7v@Ab<TLS<TFcKE2 SvvO+y0000<MNUMnLSTYFOTK0R diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_rec.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_rec.png deleted file mode 100755 index 061d63c7b2ff07e7aad551072913c815f5f1230e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmV<N0}lL&P)<h;3K|Lk000e1NJLTq000~S000aK00000RIq~600009a7bBm000XU z000XU0RWnu7ytkR8)-vBP*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-muNV4mRU;^fLC zz`#&YR8r&~<QN$d8KuB}o`H>lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4{Q&k2kgNVo|1qcff zJ_s=cNG>fZg9jx8g8+jTgC9dB!zzXcjM9uzjPn?uG8r;8FkNESU~Xi-%VNVakCmA< zoAoN26Wb<s7514N0vw&3tenkU%v^2U+}sm+q<EI{8uK3F3+8*qUo9Xcuv*Yf@R3lX zu%hr`k#tdB(XC=};+*1JB~m1XC67u~Nb5>Jk(nbKDkms+R=!8UN0C?Yg3=V_C>14@ z*Q#698rA(YWHsJu?$es6ovLH4E2R5M?}+|<gBrsqBTHjR<KHItOb?r_Fz>ghuuQb_ zv9_>LwH2{rvHNQO+~Kz41*c=qdtJ7=u6JAMzSLup=R&Uq-V1#e`!4fa<-a~)YvA6X zW5MS`ZiPMz`x3zvDHx>`Z5-nk8x@xq-;yvpadXny<mahOX>#c{8Bv*4S+lbD<lM_+ z%2zM&DJ(9UU3|FYZJ9*5OGRPjysER+e{1#X;_D|h9BcgDY|xV4I<M_|hhV37S9|y2 zUWPvV{<;bKCjOu7IHh&!iRrvEf@jW}^=OXP+>&|w7H};LTeNub$E6O-CM<ur(s)(t z>YHnI*EOxbxzS)#$L0rHt+q|w{$Z!@u2p+D_NMPUen9<T=b_g}{EluuE`Fl+<df6h zXSSS^J>P!e)1|n}r><IDTXsYAX6vo5chc|Pyzleiz$4SgtDh=9oB2ZUW!G!wH+64+ zzAydo=~KbycVF|qz59{>^TY4rKi~dU{r?XDE({%upgajN0000WV@Og>004R=004l4 z008;_004mL004C`008P>0026e000+nl3&F}0000`Nkl<Zc-nlBK@Pw$2*d1&|9_bs zSgW-v%_SlrIYN?7+V3C$0m$iCM$EwELrB&b2NdHhww!;#Si-H{Q_LK74$DP}pbay% f2-hcgd*3?%V{I56SfQ-T00000NkvXXu0mjfuvEt` diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_txt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_txt.png deleted file mode 100755 index 9df696c079e99c0d53c339b014796851bf090a3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 975 zcmV;=12FuFP)<h;3K|Lk000e1NJLTq000gE000aK00000ck9yz00009a7bBm000XU z000XU0RWnu7ytkR8)-vBP*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-muNV4mRU;^fLC zz`#&YR8r&~<QN$d8KuB}o`H>lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4{Q&k2kgNVo|1qcff zJ_s=cNG>fZg9jx8g8+jTgC9dB!zzXcjM9uzjPn?uG8r;8FkNESU~Xi-%VNVakCmA< zoAoN26Wb<s7514N0vw&3tenkU%v^2U+}sm+q<EI{8uK3F3+8*qUo9Xcuv*Yf@R3lX zu%hr`k#tdB(XC=};+*1JB~m1XC67u~Nb5>Jk(nbKDkms+R=!8UN0C?Yg3=V_C>14@ z*Q#698rA(YWHsJu?$es6ovLH4E2R5M?}+|<gBrsqBTHjR<KHItOb?r_Fz>ghuuQb_ zv9_>LwH2{rvHNQO+~Kz41*c=qdtJ7=u6JAMzSLup=R&Uq-V1#e`!4fa<-a~)YvA6X zW5MS`ZiPMz`x3zvDHx>`Z5-nk8x@xq-;yvpadXny<mahOX>#c{8Bv*4S+lbD<lM_+ z%2zM&DJ(9UU3|FYZJ9*5OGRPjysER+e{1#X;_D|h9BcgDY|xV4I<M_|hhV37S9|y2 zUWPvV{<;bKCjOu7IHh&!iRrvEf@jW}^=OXP+>&|w7H};LTeNub$E6O-CM<ur(s)(t z>YHnI*EOxbxzS)#$L0rHt+q|w{$Z!@u2p+D_NMPUen9<T=b_g}{EluuE`Fl+<df6h zXSSS^J>P!e)1|n}r><IDTXsYAX6vo5chc|Pyzleiz$4SgtDh=9oB2ZUW!G!wH+64+ zzAydo=~KbycVF|qz59{>^TY4rKi~dU{r?XDE({%upgajN0000WV@Og>004R=004l4 z008;_004mL004C`008P>0026e000+nl3&F}0000kNkl<Zc-mt8&wvb=P<RY13=E8L x&VL3L1_lP0dPW8Y76xQ#ie%C3WyI?$zyOy91||SCp5*`l002ovPDHLkV1kBOvk?FQ diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugin-dvbmediasink_0.10.bb b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugin-dvbmediasink_0.10.bb deleted file mode 100644 index 11febfc..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugin-dvbmediasink_0.10.bb +++ /dev/null @@ -1,17 +0,0 @@ -SUMMARY = "Plugin for gstreamer: dvbmediasink" -SECTION = "multimedia" -LICENSE = "MIT | LGPLv2.1" -LIC_FILES_CHKSUM = "file://src/gstdvbaudiosink.c;beginline=1;endline=45;md5=023ebb8eaef9b8cce8591a9d96638392 \ - file://src/gstdvbvideosink.c;beginline=1;endline=44;md5=b597d3f0a4e3b49db42d2b5140bd7004" -DEPENDS = "gstreamer gst-plugins-base" -SRCREV = "1bc9f47255396df4b3119a02790c4e864566560a" -PR = "r5" - -SCHWERKRAFT_PROJECT = "dvbmediasink" - -inherit autotools schwerkraft-git - -FILES_${PN} = "${libdir}/gstreamer-0.10/*.so" -FILES_${PN}-dev += "${libdir}/gstreamer-0.10/*.la" -FILES_${PN}-staticdev += "${libdir}/gstreamer-0.10/*.a" -FILES_${PN}-dbg += "${libdir}/gstreamer-0.10/.debug" diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0001-mpegtsdemux-fix-bd-streamtype-detection.diff.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0001-mpegtsdemux-fix-bd-streamtype-detection.diff.patch deleted file mode 100644 index 7061e4a..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0001-mpegtsdemux-fix-bd-streamtype-detection.diff.patch +++ /dev/null @@ -1,201 +0,0 @@ -From 55091d9a55ad100b99638503da038432549632f8 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter <obi@opendreambox.org> -Date: Wed, 21 Mar 2012 15:45:17 +0100 -Subject: [PATCH 1/3] mpegtsdemux-fix-bd-streamtype-detection.diff - ---- - gst/mpegdemux/gstmpegtsdemux.c | 134 +++++++++++++++++++++++---------------- - 1 files changed, 79 insertions(+), 55 deletions(-) - -diff --git a/gst/mpegdemux/gstmpegtsdemux.c b/gst/mpegdemux/gstmpegtsdemux.c -index 012c1cc..fffc50f 100644 ---- a/gst/mpegdemux/gstmpegtsdemux.c -+++ b/gst/mpegdemux/gstmpegtsdemux.c -@@ -647,6 +647,18 @@ gst_mpegts_demux_get_stream_for_PID (GstMpegTSDemux * demux, guint16 PID) - } - - static gboolean -+gst_mpeg_desc_reg_format_id_in_array(GArray *array, guint32 identifier) -+{ -+ guint i = 0; -+ for (; i < array->len; ++i) { -+ guint8 *desc = g_array_index(array, guint8*, i); -+ if (DESC_REGISTRATION_format_identifier (desc) == identifier) -+ return TRUE; -+ } -+ return FALSE; -+} -+ -+static gboolean - gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id, - guint8 stream_type) - { -@@ -655,6 +667,8 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id, - GstMpegTSDemuxClass *klass; - GstMpegTSDemux *demux; - GstCaps *caps; -+ GArray *stream_desc_reg_array = NULL; -+ gboolean is_hdmv = FALSE; - - if (stream->stream_type && stream->stream_type != stream_type) - goto wrong_type; -@@ -666,6 +680,31 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id, - template = NULL; - caps = NULL; - -+ if (stream->ES_info) { -+ stream_desc_reg_array = -+ gst_mpeg_descriptor_find_all (stream->ES_info, DESC_REGISTRATION); -+ if (stream_desc_reg_array && -+ gst_mpeg_desc_reg_format_id_in_array(stream_desc_reg_array, DRF_ID_HDMV)) { -+ is_hdmv = TRUE; -+ } -+ } -+ -+ if (!is_hdmv) { -+ GstMpegTSStream *PMT_stream = -+ gst_mpegts_demux_get_stream_for_PID (stream->demux, stream->PMT_pid); -+ GstMPEGDescriptor *program_info = PMT_stream->PMT.program_info; -+ if (program_info) { -+ GArray *program_desc_reg_array = -+ gst_mpeg_descriptor_find_all (program_info, DESC_REGISTRATION); -+ if (program_desc_reg_array) { -+ if (gst_mpeg_desc_reg_format_id_in_array(program_desc_reg_array, DRF_ID_HDMV)) { -+ is_hdmv = TRUE; -+ } -+ g_array_free(program_desc_reg_array, TRUE); -+ } -+ } -+ } -+ - switch (stream_type) { - case ST_VIDEO_MPEG1: - case ST_VIDEO_MPEG2: -@@ -756,11 +795,8 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id, - break; - case ST_PRIVATE_EA: /* Try to detect a VC1 stream */ - { -- guint8 *desc = NULL; -- -- if (stream->ES_info) -- desc = gst_mpeg_descriptor_find (stream->ES_info, DESC_REGISTRATION); -- if (!(desc && DESC_REGISTRATION_format_identifier (desc) == DRF_ID_VC1)) { -+ if (!(stream_desc_reg_array && -+ gst_mpeg_desc_reg_format_id_in_array(stream_desc_reg_array, DRF_ID_VC1))) { - GST_WARNING ("0xea private stream type found but no descriptor " - "for VC1. Assuming plain VC1."); - } -@@ -772,47 +808,7 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id, - NULL); - break; - } -- case ST_BD_AUDIO_AC3: -- { -- GstMpegTSStream *PMT_stream = -- gst_mpegts_demux_get_stream_for_PID (stream->demux, stream->PMT_pid); -- GstMPEGDescriptor *program_info = PMT_stream->PMT.program_info; -- guint8 *desc = NULL; -- -- if (program_info) -- desc = gst_mpeg_descriptor_find (program_info, DESC_REGISTRATION); -- -- if (desc && DESC_REGISTRATION_format_identifier (desc) == DRF_ID_HDMV) { -- template = klass->audio_template; -- name = g_strdup_printf ("audio_%04x", stream->PID); -- caps = gst_caps_new_simple ("audio/x-eac3", NULL); -- } else if (stream->ES_info && gst_mpeg_descriptor_find (stream->ES_info, -- DESC_DVB_ENHANCED_AC3)) { -- template = klass->audio_template; -- name = g_strdup_printf ("audio_%04x", stream->PID); -- caps = gst_caps_new_simple ("audio/x-eac3", NULL); -- } else { -- if (!stream->ES_info || -- !gst_mpeg_descriptor_find (stream->ES_info, DESC_DVB_AC3)) { -- GST_WARNING ("AC3 stream type found but no corresponding " -- "descriptor to differentiate between AC3 and EAC3. " -- "Assuming plain AC3."); -- } -- template = klass->audio_template; -- name = g_strdup_printf ("audio_%04x", stream->PID); -- caps = gst_caps_new_simple ("audio/x-ac3", NULL); -- } -- break; -- } -- case ST_BD_AUDIO_EAC3: -- template = klass->audio_template; -- name = g_strdup_printf ("audio_%04x", stream->PID); -- caps = gst_caps_new_simple ("audio/x-eac3", NULL); -- break; - case ST_PS_AUDIO_DTS: -- case ST_BD_AUDIO_DTS: -- case ST_BD_AUDIO_DTS_HD: -- case ST_BD_AUDIO_DTS_HD_MASTER_AUDIO: - template = klass->audio_template; - name = g_strdup_printf ("audio_%04x", stream->PID); - caps = gst_caps_new_simple ("audio/x-dts", NULL); -@@ -822,24 +818,52 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id, - name = g_strdup_printf ("audio_%04x", stream->PID); - caps = gst_caps_new_simple ("audio/x-lpcm", NULL); - break; -- case ST_BD_AUDIO_LPCM: -- template = klass->audio_template; -- name = g_strdup_printf ("audio_%04x", stream->PID); -- caps = gst_caps_new_simple ("audio/x-private-ts-lpcm", NULL); -- break; - case ST_PS_DVD_SUBPICTURE: - template = klass->subpicture_template; - name = g_strdup_printf ("subpicture_%04x", stream->PID); - caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL); - break; -- case ST_BD_PGS_SUBPICTURE: -- template = klass->subpicture_template; -- name = g_strdup_printf ("subpicture_%04x", stream->PID); -- caps = gst_caps_new_simple ("subpicture/x-pgs", NULL); -- break; - default: - break; - } -+ -+ if (!template && is_hdmv) { -+ switch (stream_type) { -+ case ST_BD_AUDIO_AC3: -+ template = klass->audio_template; -+ name = g_strdup_printf ("audio_%04x", stream->PID); -+ caps = gst_caps_new_simple ("audio/x-ac3", NULL); -+ break; -+ case ST_BD_AUDIO_EAC3: -+ template = klass->audio_template; -+ name = g_strdup_printf ("audio_%04x", stream->PID); -+ caps = gst_caps_new_simple ("audio/x-eac3", NULL); -+ break; -+ case ST_BD_AUDIO_DTS: -+ case ST_BD_AUDIO_DTS_HD: -+ case ST_BD_AUDIO_DTS_HD_MASTER_AUDIO: -+ template = klass->audio_template; -+ name = g_strdup_printf ("audio_%04x", stream->PID); -+ caps = gst_caps_new_simple ("audio/x-dts", NULL); -+ break; -+ case ST_BD_AUDIO_LPCM: -+ template = klass->audio_template; -+ name = g_strdup_printf ("audio_%04x", stream->PID); -+ caps = gst_caps_new_simple ("audio/x-private-ts-lpcm", NULL); -+ break; -+ case ST_BD_PGS_SUBPICTURE: -+ template = klass->subpicture_template; -+ name = g_strdup_printf ("subpicture_%04x", stream->PID); -+ caps = gst_caps_new_simple ("subpicture/x-pgs", NULL); -+ break; -+ default: -+ break; -+ } -+ } -+ -+ if (stream_desc_reg_array) -+ g_array_free(stream_desc_reg_array, TRUE); -+ - if (name == NULL || template == NULL || caps == NULL) { - if (name) - g_free (name); --- -1.7.5.4 - diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0002-add-indexing-capabilities-to-generate-a-SPN-PTS-map-.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0002-add-indexing-capabilities-to-generate-a-SPN-PTS-map-.patch deleted file mode 100644 index 1be4bbd..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0002-add-indexing-capabilities-to-generate-a-SPN-PTS-map-.patch +++ /dev/null @@ -1,423 +0,0 @@ -From 0d5e73089dcf64398a4835d84c0dbcf77ef04e14 Mon Sep 17 00:00:00 2001 -From: Andreas Frisch <fraxinas@opendreambox.org> -Date: Mon, 28 Mar 2011 10:31:23 +0200 -Subject: [PATCH 2/3] add indexing capabilities to generate a SPN/PTS map on - the fly in m2ts-mode - ---- - gst/mpegtsmux/mpegtsmux.c | 234 ++++++++++++++++++++++++++++++++++++++++++++- - gst/mpegtsmux/mpegtsmux.h | 13 +++ - 2 files changed, 243 insertions(+), 4 deletions(-) - -diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c -index a243e40..d5492a4 100644 ---- a/gst/mpegtsmux/mpegtsmux.c -+++ b/gst/mpegtsmux/mpegtsmux.c -@@ -104,7 +104,8 @@ - ARG_PROG_MAP, - ARG_M2TS_MODE, - ARG_PAT_INTERVAL, -- ARG_PMT_INTERVAL -+ ARG_PMT_INTERVAL, -+ ARG_ALIGNMENT - }; - - static GstStaticPadTemplate mpegtsmux_sink_factory = -@@ -157,6 +158,12 @@ - static void mpegtsdemux_set_header_on_caps (MpegTsMux * mux); - static gboolean mpegtsmux_sink_event (GstPad * pad, GstEvent * event); - static gboolean mpegtsmux_src_event (GstPad * pad, GstEvent * event); -+static void mpegtsmux_set_index (GstElement * element, GstIndex * index); -+static GstIndex *mpegtsmux_get_index (GstElement * element); -+ -+static GstFormat pts_format; -+static GstFormat spn_format; -+guint get_packets_per_buffer (MpegTsMux * mux); - - GST_BOILERPLATE (MpegTsMux, mpegtsmux, GstElement, GST_TYPE_ELEMENT); - -@@ -175,6 +182,10 @@ - "MPEG Transport Stream Muxer", "Codec/Muxer", - "Multiplexes media streams into an MPEG Transport Stream", - "Fluendo <contact@fluendo.com>"); -+ -+ pts_format = -+ gst_format_register ("PTS", "MPEG System Presentation Time Stamp"); -+ spn_format = gst_format_register ("SPN", "Source Packet Number"); - } - - static void -@@ -191,6 +202,9 @@ - gstelement_class->release_pad = mpegtsmux_release_pad; - gstelement_class->change_state = mpegtsmux_change_state; - -+ gstelement_class->set_index = GST_DEBUG_FUNCPTR (mpegtsmux_set_index); -+ gstelement_class->get_index = GST_DEBUG_FUNCPTR (mpegtsmux_get_index); -+ - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PROG_MAP, - g_param_spec_boxed ("prog-map", "Program map", - "A GstStructure specifies the mapping from elementary streams to programs", -@@ -213,6 +227,12 @@ - "Set the interval (in ticks of the 90kHz clock) for writing out the PMT table", - 1, G_MAXUINT, TSMUX_DEFAULT_PMT_INTERVAL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -+ -+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ALIGNMENT, -+ g_param_spec_uint ("alignment", "packet alignment", -+ "Queue this amount of ts/m2ts packets before pushing buffer. On EOS, pad with dummy packets until aligned. Default: 32 for m2ts streams, else disabled.", -+ 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -+ - } - - static void -@@ -247,6 +267,15 @@ - mux->streamheader_sent = FALSE; - mux->force_key_unit_event = NULL; - mux->pending_key_unit_ts = GST_CLOCK_TIME_NONE; -+ -+ mux->spn_count = 0; -+ -+ mux->element_index = NULL; -+ mux->element_index_writer_id = -1; -+ -+ mux->arbitrary_align = FALSE; -+ mux->alignment_adapter = gst_adapter_new (); -+ mux->packets_per_buffer = 0; - } - - static void -@@ -288,6 +317,15 @@ - g_list_free (mux->streamheader); - mux->streamheader = NULL; - } -+ if (mux->alignment_adapter) { -+ gst_adapter_clear (mux->alignment_adapter); -+ g_object_unref (mux->alignment_adapter); -+ mux->alignment_adapter = NULL; -+ } -+ -+ if (mux->element_index) -+ gst_object_unref (mux->element_index); -+ - GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); - } - -@@ -331,12 +369,27 @@ - walk = g_slist_next (walk); - } - break; -+ case ARG_ALIGNMENT: -+ mux->packets_per_buffer = g_value_get_uint (value); -+ mux->arbitrary_align = TRUE; -+ break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - } - -+guint -+get_packets_per_buffer (MpegTsMux * mux) -+{ -+ if (mux->arbitrary_align == TRUE) { -+ return mux->packets_per_buffer; -+ } else if (mux->m2ts_mode) { -+ return BDMV_PACKETS_PER_BUFFER; -+ } -+ return DEFAULT_PACKETS_PER_BUFFER; -+} -+ - static void - gst_mpegtsmux_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -@@ -356,6 +409,9 @@ - case ARG_PMT_INTERVAL: - g_value_set_uint (value, mux->pmt_interval); - break; -+ case ARG_ALIGNMENT: -+ g_value_set_uint (value, get_packets_per_buffer (mux)); -+ break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; -@@ -363,6 +419,37 @@ - } - - static void -+mpegtsmux_set_index (GstElement * element, GstIndex * index) -+{ -+ MpegTsMux *mux = GST_MPEG_TSMUX (element); -+ -+ GST_OBJECT_LOCK (mux); -+ if (mux->element_index) -+ gst_object_unref (mux->element_index); -+ mux->element_index = index ? gst_object_ref (index) : NULL; -+ GST_OBJECT_UNLOCK (mux); -+ GST_DEBUG_OBJECT (mux, "Set index %" GST_PTR_FORMAT, mux->element_index); -+ gst_index_add_format (index, mux->element_index_writer_id, pts_format); -+ gst_index_add_format (index, mux->element_index_writer_id, spn_format); -+} -+ -+static GstIndex * -+mpegtsmux_get_index (GstElement * element) -+{ -+ GstIndex *result = NULL; -+ MpegTsMux *mux = GST_MPEG_TSMUX (element); -+ -+ GST_OBJECT_LOCK (mux); -+ if (mux->element_index) -+ result = gst_object_ref (mux->element_index); -+ GST_OBJECT_UNLOCK (mux); -+ -+ GST_DEBUG_OBJECT (mux, "Returning index %" GST_PTR_FORMAT, result); -+ -+ return result; -+} -+ -+static void - release_buffer_cb (guint8 * data, void *user_data) - { - GstBuffer *buf = (GstBuffer *) user_data; -@@ -505,6 +592,24 @@ - ret = GST_FLOW_OK; - } - -+ if (mux->element_index) { -+ gboolean parsed = FALSE; -+ if (ts_data->stream->is_video_stream) { -+ if (gst_structure_get_boolean (s, "parsed", &parsed) && parsed) { -+ if (mux->element_index_writer_id == -1) { -+ gst_index_get_writer_id (mux->element_index, GST_OBJECT (mux), -+ &mux->element_index_writer_id); -+ GST_INFO_OBJECT (mux, -+ "created GstIndex writer_id = %d for PID 0x%04x", -+ mux->element_index_writer_id, ts_data->pid); -+ } -+ } else -+ GST_WARNING_OBJECT (pad, -+ "Indexing capability for PID=0x%04x disabled - parsed input stream is required!", -+ ts_data->pid); -+ } -+ } -+ - beach: - gst_caps_unref (caps); - return ret; -@@ -659,6 +764,105 @@ - return best; - } - -+static GstFlowReturn -+aligned_push (MpegTsMux * mux, GstBuffer * buf) -+{ -+ guint accu_bytes, packet_length; -+ GstBuffer *out_buf; -+ -+ if (get_packets_per_buffer (mux) == 0) { -+ return gst_pad_push (mux->srcpad, buf); -+ } -+ -+ packet_length = mux->m2ts_mode ? M2TS_PACKET_LENGTH : NORMAL_TS_PACKET_LENGTH; -+ gst_adapter_push (mux->alignment_adapter, buf); -+ -+ accu_bytes = gst_adapter_available (mux->alignment_adapter); -+ GST_DEBUG_OBJECT (mux, -+ "Accumulating packet in alignment adapter, accu_bytes=%i", accu_bytes); -+ -+ if (accu_bytes == get_packets_per_buffer (mux) * packet_length) { -+ out_buf = gst_adapter_take_buffer (mux->alignment_adapter, accu_bytes); -+ gst_buffer_set_caps (out_buf, GST_PAD_CAPS (mux->srcpad)); -+ gst_adapter_clear (mux->alignment_adapter); -+ GST_DEBUG_OBJECT (mux, -+ "Accumulated desired amount of packets in alignment unit, handing off %i bytes", -+ accu_bytes); -+ return gst_pad_push (mux->srcpad, out_buf); -+ } else if (accu_bytes > get_packets_per_buffer (mux) * packet_length) { -+ GST_WARNING_OBJECT (mux, "Packet alignment error!"); -+ gst_adapter_clear (mux->alignment_adapter); -+ return GST_FLOW_CUSTOM_ERROR; -+ } -+ -+ return GST_FLOW_OK; -+} -+ -+static void -+mpegtsmux_eos_align (MpegTsMux * mux) -+{ -+ guint accu_bytes, packet_length, packets_needed, dummy_packet_count; -+ guint continuity_counter; -+ unsigned char header[4]; -+ guint p; -+ GstBuffer *buf; -+ guint32 m2ts_header = 0; -+ -+ accu_bytes = gst_adapter_available (mux->alignment_adapter); -+ packet_length = mux->m2ts_mode ? M2TS_PACKET_LENGTH : NORMAL_TS_PACKET_LENGTH; -+ packets_needed = get_packets_per_buffer (mux) - accu_bytes / packet_length; -+ -+ if (get_packets_per_buffer (mux) == 0 || accu_bytes == 0) { -+ return; -+ } -+ -+ GST_DEBUG_OBJECT (mux, -+ "received EOS - %i bytes accumulated in alignment adapter -> %i dummy packets needed for padding!\n", -+ accu_bytes, packets_needed); -+ -+ if (mux->m2ts_mode) { -+ gst_adapter_copy (mux->alignment_adapter, header, -+ accu_bytes - packet_length, 4); -+ m2ts_header = GST_READ_UINT32_BE (header); -+ gst_adapter_copy (mux->alignment_adapter, header, -+ accu_bytes - packet_length + 7, 1); -+ } else { -+ gst_adapter_copy (mux->alignment_adapter, header, -+ accu_bytes - packet_length + 3, 1); -+ } -+ -+ continuity_counter = header[0] & 0xF; -+ -+ for (dummy_packet_count = 0; dummy_packet_count < packets_needed; -+ dummy_packet_count++) { -+ buf = gst_buffer_new_and_alloc (packet_length); -+ if (mux->m2ts_mode) { -+ // monotonically increase m2ts_header -+ m2ts_header++; -+ GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf), m2ts_header); -+ p = (guint) GST_BUFFER_DATA (buf) + 4; -+ } else { -+ p = (guint) GST_BUFFER_DATA (buf); -+ } -+ GST_WRITE_UINT8 (p++, TSMUX_SYNC_BYTE); -+ // dummy PID -+ GST_WRITE_UINT16_BE (p, 0x1FFF); -+ p += 2; -+ // adaptation field exists | no payload exists | continuity counter -+ GST_WRITE_UINT8 (p++, 0x20 + ((++continuity_counter) & 0xF)); -+ // adaptation field length | flags -+ GST_WRITE_UINT16_BE (p, 0xB700); -+ p += 2; -+ // adaptation field -+ memset ((guint*)p, 0xFF, 0xB6); -+ -+ aligned_push (mux, buf); -+ GST_LOG_OBJECT (mux, -+ "generated dummy packet %i with m2ts_header=0x%x, contiuity=0x%02x\n", -+ dummy_packet_count, m2ts_header, continuity_counter); -+ } -+} -+ - #define COLLECT_DATA_PAD(collect_data) (((GstCollectData *)(collect_data))->pad) - - static MpegTsPadData * -@@ -971,6 +1175,7 @@ - } else { - /* FIXME: Drain all remaining streams */ - /* At EOS */ -+ mpegtsmux_eos_align (mux); - gst_pad_push_event (mux->srcpad, gst_event_new_eos ()); - } - -@@ -1081,7 +1286,7 @@ - GST_LOG_OBJECT (mux, "marking as delta unit"); - GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); - } else { -- GST_DEBUG_OBJECT (mux, "marking as non-delta unit"); -+ GST_DEBUG_OBJECT (mux, "marking as non-delta unit, spn %i", mux->spn_count); - mux->is_delta = TRUE; - } - } -@@ -1104,6 +1309,8 @@ - return FALSE; - } - -+// mux->spn_count++; -+ - /* copies the TS data of 188 bytes to the m2ts buffer at an offset - of 4 bytes to leave space for writing the timestamp later */ - memcpy (GST_BUFFER_DATA (buf) + 4, data, len); -@@ -1168,13 +1375,25 @@ - break; - gst_buffer_set_caps (out_buf, GST_PAD_CAPS (mux->srcpad)); - GST_BUFFER_TIMESTAMP (out_buf) = MPEG_SYS_TIME_TO_GSTTIME (cur_pcr); -+ -+ mux->spn_count++; -+ -+ if (mux->element_index) { -+ if (!GST_BUFFER_FLAG_IS_SET (out_buf, GST_BUFFER_FLAG_DELTA_UNIT)) { -+ gst_index_add_association (mux->element_index, -+ mux->element_index_writer_id, -+ GST_ASSOCIATION_FLAG_KEY_UNIT, spn_format, -+ mux->spn_count, pts_format, -+ GSTTIME_TO_MPEGTIME (GST_BUFFER_TIMESTAMP (out_buf)), NULL); -+ } -+ } - - /* Write the 4 byte timestamp value, bottom 30 bits only = PCR */ - GST_WRITE_UINT32_BE (GST_BUFFER_DATA (out_buf), cur_pcr & 0x3FFFFFFF); - - GST_LOG_OBJECT (mux, "Outputting a packet of length %d PCR %" - G_GUINT64_FORMAT, M2TS_PACKET_LENGTH, cur_pcr); -- ret = gst_pad_push (mux->srcpad, out_buf); -+ ret = aligned_push (mux, out_buf); - if (G_UNLIKELY (ret != GST_FLOW_OK)) { - mux->last_flow_ret = ret; - return FALSE; -@@ -1190,7 +1409,7 @@ - - GST_LOG_OBJECT (mux, "Outputting a packet of length %d PCR %" - G_GUINT64_FORMAT, M2TS_PACKET_LENGTH, new_pcr); -- ret = gst_pad_push (mux->srcpad, buf); -+ ret = aligned_push (mux, buf); - if (G_UNLIKELY (ret != GST_FLOW_OK)) { - mux->last_flow_ret = ret; - return FALSE; -@@ -1221,7 +1440,7 @@ - - GST_BUFFER_TIMESTAMP (buf) = mux->last_ts; - -- ret = gst_pad_push (mux->srcpad, buf); -+ ret = aligned_push (mux, buf); - if (G_UNLIKELY (ret != GST_FLOW_OK)) { - mux->last_flow_ret = ret; - return FALSE; -@@ -1319,6 +1538,8 @@ - case GST_STATE_CHANGE_READY_TO_NULL: - if (mux->adapter) - gst_adapter_clear (mux->adapter); -+ if (mux->alignment_adapter) -+ gst_adapter_clear (mux->alignment_adapter); - break; - default: - break; -diff --git a/gst/mpegtsmux/mpegtsmux.h b/gst/mpegtsmux/mpegtsmux.h -index 26003a8..1b88a33 100644 ---- a/gst/mpegtsmux/mpegtsmux.h -+++ b/gst/mpegtsmux/mpegtsmux.h -@@ -130,6 +130,14 @@ - gboolean streamheader_sent; - GstClockTime pending_key_unit_ts; - GstEvent *force_key_unit_event; -+ -+ guint32 spn_count; -+ GstIndex *element_index; -+ gint element_index_writer_id; -+ -+ gboolean arbitrary_align; -+ guint packets_per_buffer; -+ GstAdapter *alignment_adapter; - }; - - struct MpegTsMuxClass { -@@ -186,6 +194,9 @@ - #define MAX_PROG_NUMBER 32 - #define DEFAULT_PROG_ID 0 - -+#define DEFAULT_PACKETS_PER_BUFFER 0 -+#define BDMV_PACKETS_PER_BUFFER 32 -+ - G_END_DECLS - - #endif --- -1.7.5.4 - diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0003-mpegpsdemux_speedup.diff.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0003-mpegpsdemux_speedup.diff.patch deleted file mode 100644 index 48647cf..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0003-mpegpsdemux_speedup.diff.patch +++ /dev/null @@ -1,112 +0,0 @@ -From 9fce0ed5dd37daa6d98d0a4aaed05faafb2e6771 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter <obi@opendreambox.org> -Date: Wed, 21 Mar 2012 15:55:42 +0100 -Subject: [PATCH 3/3] mpegpsdemux_speedup.diff - ---- - gst/mpegdemux/gstmpegdemux.c | 52 +++++++++++++++++++++++++++++++++++++----- - gst/mpegdemux/gstmpegdemux.h | 4 +++ - 2 files changed, 50 insertions(+), 6 deletions(-) - -diff --git a/gst/mpegdemux/gstmpegdemux.c b/gst/mpegdemux/gstmpegdemux.c -index 8359285..35a7ee9 100644 ---- a/gst/mpegdemux/gstmpegdemux.c -+++ b/gst/mpegdemux/gstmpegdemux.c -@@ -285,7 +285,10 @@ gst_flups_demux_reset (GstFluPSDemux * demux) - if (stream != NULL) { - if (stream->pad) - gst_element_remove_pad (GST_ELEMENT_CAST (demux), stream->pad); -- -+ if (stream->buf) -+ free(stream->buf); -+ if (stream->meta_buf) -+ gst_buffer_unref(stream->meta_buf); - g_free (stream); - demux->streams[i] = NULL; - } -@@ -415,6 +418,15 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type) - stream->type = stream_type; - stream->pad = gst_pad_new_from_template (template, name); - stream->segment_thresh = threshold; -+ -+ if (threshold == VIDEO_SEGMENT_THRESHOLD) { -+ stream->buf = malloc(64*1024); -+ stream->buf_pos = 0; -+ stream->meta_buf = gst_buffer_new(); -+ } -+ else -+ stream->buf = 0; -+ - gst_pad_set_event_function (stream->pad, - GST_DEBUG_FUNCPTR (gst_flups_demux_src_event)); - gst_pad_set_query_function (stream->pad, -@@ -466,6 +478,7 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream, - GstFlowReturn result; - guint64 timestamp; - guint size; -+ gboolean sent = FALSE; - - if (stream == NULL) - goto no_stream; -@@ -568,11 +581,38 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream, - demux->next_pts = G_MAXUINT64; - demux->next_dts = G_MAXUINT64; - -- result = gst_pad_push (stream->pad, buf); -- GST_DEBUG_OBJECT (demux, "pushed stream id 0x%02x type 0x%02x, time: %" -- GST_TIME_FORMAT ", size %d. result: %s", -- stream->id, stream->type, GST_TIME_ARGS (timestamp), -- size, gst_flow_get_name (result)); -+ if (stream->buf && stream->buf_pos && (timestamp != GST_CLOCK_TIME_NONE || stream->buf_pos+size > 64*1024)) { -+ GstBuffer *tmp = gst_buffer_new_and_alloc(stream->buf_pos); -+ gst_buffer_copy_metadata(tmp, stream->meta_buf, GST_BUFFER_COPY_ALL); -+ GST_BUFFER_SIZE(tmp) = stream->buf_pos; -+ memcpy(GST_BUFFER_DATA(tmp), stream->buf, stream->buf_pos); -+ result = gst_pad_push (stream->pad, tmp); -+ GST_DEBUG_OBJECT (demux, "pushed stream id 0x%02x type 0x%02x, time: %" -+ GST_TIME_FORMAT ", size %d. result: %s", -+ stream->id, stream->type, GST_TIME_ARGS (timestamp), -+ stream->buf_pos, gst_flow_get_name (result)); -+ stream->buf_pos = 0; -+ sent = TRUE; -+ } -+ -+ if (!stream->buf || size > 64*1024) { -+ result = gst_pad_push (stream->pad, buf); -+ GST_DEBUG_OBJECT (demux, "pushed stream id 0x%02x type 0x%02x, time: %" -+ GST_TIME_FORMAT ", size %d. result: %s", -+ stream->id, stream->type, GST_TIME_ARGS (timestamp), -+ size, gst_flow_get_name (result)); -+ } -+ else { -+ if (!stream->buf_pos) -+ gst_buffer_copy_metadata(stream->meta_buf, buf, GST_BUFFER_COPY_ALL); -+ -+ memcpy(stream->buf + stream->buf_pos, GST_BUFFER_DATA(buf), size); -+ stream->buf_pos += size; -+ gst_buffer_unref(buf); -+ -+ if (!sent) -+ result = GST_FLOW_OK; -+ } - - return result; - -diff --git a/gst/mpegdemux/gstmpegdemux.h b/gst/mpegdemux/gstmpegdemux.h -index 6cf7aed..5977578 100644 ---- a/gst/mpegdemux/gstmpegdemux.h -+++ b/gst/mpegdemux/gstmpegdemux.h -@@ -92,6 +92,10 @@ struct _GstFluPSStream - gboolean discont; - gboolean notlinked; - gboolean need_segment; -+ -+ GstBuffer *meta_buf; -+ unsigned char *buf; -+ size_t buf_pos; - }; - - struct _GstFluPSDemux --- -1.7.5.4 - diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/orc.m4-fix-location-of-orcc-when-cross-compiling.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/orc.m4-fix-location-of-orcc-when-cross-compiling.patch deleted file mode 100644 index d1942cf..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/orc.m4-fix-location-of-orcc-when-cross-compiling.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 114ec19a882192dfcb5f71bb12c811d0a3b7f324 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter <obi@opendreambox.org> -Date: Tue, 8 May 2012 17:27:55 +0200 -Subject: [PATCH] orc.m4: fix location of orcc when cross-compiling - -* Prepend PKG_CONFIG_SYSROOT to orcc, so configure doesn't - accidentially use an incompatible version of orcc installed - on the build system. - -Signed-off-by: Andreas Oberritter <obi@opendreambox.org> ---- - m4/orc.m4 | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/common/m4/orc.m4 b/common/m4/orc.m4 -index 26b2459..81b111e 100644 ---- a/common/m4/orc.m4 -+++ b/common/m4/orc.m4 -@@ -3,6 +3,8 @@ dnl pkg-config-based checks for Orc - dnl specific: - dnl ORC_CHECK([REQUIRED_VERSION]) - -+m4_pattern_allow(PKG_CONFIG_SYSROOT_DIR) -+ - AC_DEFUN([ORC_CHECK], - [ - ORC_REQ=ifelse([$1], , "0.4.6", [$1]) -@@ -24,7 +26,7 @@ AC_DEFUN([ORC_CHECK], - HAVE_ORC=yes - if test "x$ORCC" = "x" ; then - AC_MSG_CHECKING(for usable orcc) -- ORCC=`$PKG_CONFIG --variable=orcc orc-0.4` -+ ORCC=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=orcc orc-0.4` - dnl check whether the orcc found by pkg-config can be run from the build environment - dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH - AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`]) --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad_0.10.23.bbappend b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad_0.10.23.bbappend deleted file mode 100644 index 94b8221..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad_0.10.23.bbappend +++ /dev/null @@ -1,15 +0,0 @@ -DEPENDS += "libmms" -PR .= "-vuplus0" - -SRC_URI += " \ - file://0001-mpegtsdemux-fix-bd-streamtype-detection.diff.patch \ - file://0002-add-indexing-capabilities-to-generate-a-SPN-PTS-map-.patch \ - file://0003-mpegpsdemux_speedup.diff.patch \ - file://orc.m4-fix-location-of-orcc-when-cross-compiling.patch \ -" - -EXTRA_OECONF += "--enable-orc --with-plugins=" -# fix "configure: error: cannot run test program while cross compiling" -EXTRA_OECONF += "--disable-mpeg2enc --disable-mplex" - -FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base-0.10.36/orc.m4-fix-location-of-orcc-when-cross-compiling.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base-0.10.36/orc.m4-fix-location-of-orcc-when-cross-compiling.patch deleted file mode 100644 index d1942cf..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base-0.10.36/orc.m4-fix-location-of-orcc-when-cross-compiling.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 114ec19a882192dfcb5f71bb12c811d0a3b7f324 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter <obi@opendreambox.org> -Date: Tue, 8 May 2012 17:27:55 +0200 -Subject: [PATCH] orc.m4: fix location of orcc when cross-compiling - -* Prepend PKG_CONFIG_SYSROOT to orcc, so configure doesn't - accidentially use an incompatible version of orcc installed - on the build system. - -Signed-off-by: Andreas Oberritter <obi@opendreambox.org> ---- - m4/orc.m4 | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/common/m4/orc.m4 b/common/m4/orc.m4 -index 26b2459..81b111e 100644 ---- a/common/m4/orc.m4 -+++ b/common/m4/orc.m4 -@@ -3,6 +3,8 @@ dnl pkg-config-based checks for Orc - dnl specific: - dnl ORC_CHECK([REQUIRED_VERSION]) - -+m4_pattern_allow(PKG_CONFIG_SYSROOT_DIR) -+ - AC_DEFUN([ORC_CHECK], - [ - ORC_REQ=ifelse([$1], , "0.4.6", [$1]) -@@ -24,7 +26,7 @@ AC_DEFUN([ORC_CHECK], - HAVE_ORC=yes - if test "x$ORCC" = "x" ; then - AC_MSG_CHECKING(for usable orcc) -- ORCC=`$PKG_CONFIG --variable=orcc orc-0.4` -+ ORCC=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=orcc orc-0.4` - dnl check whether the orcc found by pkg-config can be run from the build environment - dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH - AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`]) --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base_0.10.36.bbappend b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base_0.10.36.bbappend deleted file mode 100644 index f27d55a..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base_0.10.36.bbappend +++ /dev/null @@ -1,8 +0,0 @@ -DEPENDS += "cdparanoia orc orc-native" -PR .= "-vuplus0" - -SRC_URI += "file://orc.m4-fix-location-of-orcc-when-cross-compiling.patch" - -EXTRA_OECONF += "--enable-orc" - -FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/audioparser-raise-ranks.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/audioparser-raise-ranks.patch deleted file mode 100644 index ad73541..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/audioparser-raise-ranks.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- gst-plugins-good-0.10.30/gst/audioparsers/plugin.c~ 2012-01-04 21:55:58.816556710 +0100 -+++ gst-plugins-good-0.10.30/gst/audioparsers/plugin.c 2012-01-04 21:55:58.843221178 +0100 -@@ -34,13 +34,13 @@ - gboolean ret; - - ret = gst_element_register (plugin, "aacparse", -- GST_RANK_PRIMARY + 1, GST_TYPE_AAC_PARSE); -+ GST_RANK_PRIMARY + 2, GST_TYPE_AAC_PARSE); - ret &= gst_element_register (plugin, "amrparse", - GST_RANK_PRIMARY + 1, GST_TYPE_AMR_PARSE); - ret &= gst_element_register (plugin, "ac3parse", -- GST_RANK_PRIMARY + 1, GST_TYPE_AC3_PARSE); -+ GST_RANK_PRIMARY + 2, GST_TYPE_AC3_PARSE); - ret &= gst_element_register (plugin, "dcaparse", -- GST_RANK_PRIMARY + 1, GST_TYPE_DCA_PARSE); -+ GST_RANK_PRIMARY + 2, GST_TYPE_DCA_PARSE); - ret &= gst_element_register (plugin, "flacparse", - GST_RANK_PRIMARY + 1, GST_TYPE_FLAC_PARSE); - ret &= gst_element_register (plugin, "mpegaudioparse", diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/orc.m4-fix-location-of-orcc-when-cross-compiling.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/orc.m4-fix-location-of-orcc-when-cross-compiling.patch deleted file mode 100644 index d1942cf..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/orc.m4-fix-location-of-orcc-when-cross-compiling.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 114ec19a882192dfcb5f71bb12c811d0a3b7f324 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter <obi@opendreambox.org> -Date: Tue, 8 May 2012 17:27:55 +0200 -Subject: [PATCH] orc.m4: fix location of orcc when cross-compiling - -* Prepend PKG_CONFIG_SYSROOT to orcc, so configure doesn't - accidentially use an incompatible version of orcc installed - on the build system. - -Signed-off-by: Andreas Oberritter <obi@opendreambox.org> ---- - m4/orc.m4 | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/common/m4/orc.m4 b/common/m4/orc.m4 -index 26b2459..81b111e 100644 ---- a/common/m4/orc.m4 -+++ b/common/m4/orc.m4 -@@ -3,6 +3,8 @@ dnl pkg-config-based checks for Orc - dnl specific: - dnl ORC_CHECK([REQUIRED_VERSION]) - -+m4_pattern_allow(PKG_CONFIG_SYSROOT_DIR) -+ - AC_DEFUN([ORC_CHECK], - [ - ORC_REQ=ifelse([$1], , "0.4.6", [$1]) -@@ -24,7 +26,7 @@ AC_DEFUN([ORC_CHECK], - HAVE_ORC=yes - if test "x$ORCC" = "x" ; then - AC_MSG_CHECKING(for usable orcc) -- ORCC=`$PKG_CONFIG --variable=orcc orc-0.4` -+ ORCC=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=orcc orc-0.4` - dnl check whether the orcc found by pkg-config can be run from the build environment - dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH - AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`]) --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good_0.10.31.bbappend b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good_0.10.31.bbappend deleted file mode 100644 index 958007a..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good_0.10.31.bbappend +++ /dev/null @@ -1,9 +0,0 @@ -DEPENDS := "${@oe_filter_out('^(gconf|pulseaudio)$', '${DEPENDS}', d)}" -PR .= "-vuplus0" - -SRC_URI += "file://audioparser-raise-ranks.patch \ - file://orc.m4-fix-location-of-orcc-when-cross-compiling.patch" - -EXTRA_OECONF += "--enable-orc" - -FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/dvdsubdec-addproperty-singlebuffer.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/dvdsubdec-addproperty-singlebuffer.patch deleted file mode 100644 index 8247a9f..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/dvdsubdec-addproperty-singlebuffer.patch +++ /dev/null @@ -1,103 +0,0 @@ -From: Fraxinas <andreas.frisch@multimedia-labs.de> -Subject: [PATCH] dvdsubdec: add singlebuffer property (fixes bug 619136) - -diff -u a/gst/dvdsub/gstdvdsubdec.c b/gst/dvdsub/gstdvdsubdec.c ---- a/gst/dvdsub/gstdvdsubdec.c 2009-11-05 19:06:16.000000000 +0100 -+++ b/gst/dvdsub/gstdvdsubdec.c 2010-05-26 16:27:06.000000000 +0200 -@@ -41,6 +41,10 @@ - static GstClockTime gst_dvd_sub_dec_get_event_delay (GstDvdSubDec * dec); - static gboolean gst_dvd_sub_dec_sink_event (GstPad * pad, GstEvent * event); - static gboolean gst_dvd_sub_dec_sink_setcaps (GstPad * pad, GstCaps * caps); -+static void gst_dvd_sub_set_property (GObject * object, guint prop_id, -+ const GValue * value, GParamSpec * pspec); -+static void gst_dvd_sub_get_property (GObject * object, guint prop_id, -+ GValue * value, GParamSpec * pspec); - - static GstFlowReturn gst_send_subtitle_frame (GstDvdSubDec * dec, - GstClockTime end_ts); -@@ -100,6 +104,9 @@ - } - RLE_state; - -+#define ARG_SINGLEBUFFER 0x01 -+#define DEFAULT_SINGLEBUFFER FALSE -+ - static void - gst_dvd_sub_dec_base_init (gpointer klass) - { -@@ -123,6 +130,13 @@ - - gobject_class = (GObjectClass *) klass; - -+ gobject_class->set_property = gst_dvd_sub_set_property; -+ gobject_class->get_property = gst_dvd_sub_get_property; -+ -+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SINGLEBUFFER, -+ g_param_spec_boolean ("singlebuffer", "Single Buffer", "invoke only one single buffer upon changed dvd subpicture. false will output continuous video stream", -+ DEFAULT_SINGLEBUFFER, G_PARAM_READWRITE)); -+ - gobject_class->finalize = gst_dvd_sub_dec_finalize; - } - -@@ -167,6 +181,40 @@ - dec->out_buffer = NULL; - dec->buf_dirty = TRUE; - dec->use_ARGB = FALSE; -+ -+ dec->singlebuffer = DEFAULT_SINGLEBUFFER; -+} -+ -+static void -+gst_dvd_sub_set_property (GObject * object, guint prop_id, -+ const GValue * value, GParamSpec * pspec) -+{ -+ GstDvdSubDec *src; -+ -+ src = GST_DVD_SUB_DEC (object); -+ -+ switch (prop_id) { -+ case ARG_SINGLEBUFFER: -+ src->singlebuffer = g_value_get_boolean (value); -+ break; -+ default: -+ break; -+ } -+} -+ -+static void -+gst_dvd_sub_get_property (GObject * object, guint prop_id, GValue * value, -+ GParamSpec * pspec) -+{ -+ GstDvdSubDec *src; -+ -+ src = GST_DVD_SUB_DEC (object); -+ -+ switch (prop_id) { -+ case ARG_SINGLEBUFFER: -+ g_value_set_boolean (value, src->singlebuffer); -+ break; -+ } - } - - static void -@@ -697,6 +745,8 @@ - dec->out_buffer = out_buf; - dec->buf_dirty = FALSE; - } -+ else if (dec->singlebuffer) -+ goto out; - - out_buf = gst_buffer_create_sub (dec->out_buffer, 0, - GST_BUFFER_SIZE (dec->out_buffer)); -diff -u a/gst/dvdsub/gstdvdsubdec.h b/gst/dvdsub/gstdvdsubdec.h ---- a/gst/dvdsub//gstdvdsubdec.h 2009-05-21 20:45:29.000000000 +0200 -+++ b/gst/dvdsub/gstdvdsubdec.h 2010-05-26 13:39:32.000000000 +0200 -@@ -91,6 +91,8 @@ - - GstBuffer *out_buffer; - gboolean buf_dirty; -+ -+ gboolean singlebuffer; - }; - - struct _GstDvdSubDecClass diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-1.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-1.patch deleted file mode 100644 index 042cd9d..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-1.patch +++ /dev/null @@ -1,55 +0,0 @@ -Upstream-Status: Backport - -From 593ddf4bb9dc3c4d97bdde8d087db42147511274 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= <tim.muller@collabora.co.uk> -Date: Sat, 3 Mar 2012 16:56:13 +0000 -Subject: [PATCH 1/2] configure: get rid of non-pkg-config ways to check for - opencore-amr - ---- - configure.ac | 22 ++++++++++------------ - 1 file changed, 10 insertions(+), 12 deletions(-) - -diff --git a/configure.ac b/configure.ac -index e5be3ed..3c2e341 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -250,12 +250,11 @@ AG_GST_CHECK_FEATURE(A52DEC, [a52dec], a52dec, [ - dnl *** amr-nb *** - translit(dnm, m, l) AM_CONDITIONAL(USE_AMRNB, true) - AG_GST_CHECK_FEATURE(AMRNB, [amrnb library], amrnb, [ -- PKG_CHECK_MODULES(AMRNB, opencore-amrnb, HAVE_AMRNB="yes", -- [ AG_GST_CHECK_LIBHEADER(AMRNB, opencore-amrnb, -- Decoder_Interface_init, $LIBM, -- opencore-amrnb/interf_dec.h, -- AMRNB_LIBS="-lopencore-amrnb") -- ]) -+ PKG_CHECK_MODULES(AMRNB, opencore-amrnb, [ -+ HAVE_AMRNB="yes" -+ ], [ -+ HAVE_AMRNB="no" -+ ]) - AC_SUBST(AMRNB_CFLAGS) - AC_SUBST(AMRNB_LIBS) - ]) -@@ -263,12 +262,11 @@ AG_GST_CHECK_FEATURE(AMRNB, [amrnb library], amrnb, [ - dnl *** amr-wb dec *** - translit(dnm, m, l) AM_CONDITIONAL(USE_AMRWB, true) - AG_GST_CHECK_FEATURE(AMRWB, [amrwb library], amrwbdec, [ -- PKG_CHECK_MODULES(AMRWB, opencore-amrwb, HAVE_AMRWB="yes", -- [ AG_GST_CHECK_LIBHEADER(AMRWB, opencore-amrwb, -- D_IF_decode, , -- opencore-amrwb/dec_if.h, -- AMRWB_LIBS="-lopencore-amrwb") -- ]) -+ PKG_CHECK_MODULES(AMRWB, opencore-amrwb, [ -+ HAVE_AMRWB="yes" -+ ], [ -+ HAVE_AMRWB="no" -+ ]) - AC_SUBST(AMRWB_CFLAGS) - AC_SUBST(AMRWB_LIBS) - ]) --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-2.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-2.patch deleted file mode 100644 index 4828feb..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-2.patch +++ /dev/null @@ -1,105 +0,0 @@ -Upstream-Status: Backport - -From 425e6e395f6bcaff77d0393126e1253066ddcd8a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= <tim.muller@collabora.co.uk> -Date: Sat, 3 Mar 2012 17:17:31 +0000 -Subject: [PATCH 2/2] amrnb, amrwbdec: fix build with opencore-amr >= 0.1.3 - -In previous versions, the opencore-amr include sub-directory -would be specified in the include path in the CFLAGS, but this -is no longer the case in newer versions, so we need to add those -to our include directives. - -Based on patch by: Christian Morales Vega - -https://bugzilla.gnome.org/show_bug.cgi?id=671123 ---- - configure.ac | 6 ++++++ - ext/amrnb/amrnbdec.h | 5 +++++ - ext/amrnb/amrnbenc.h | 7 ++++++- - ext/amrwbdec/amrwbdec.h | 6 ++++++ - 4 files changed, 23 insertions(+), 1 deletion(-) - -diff --git a/configure.ac b/configure.ac -index 3c2e341..18f2904 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -251,6 +251,9 @@ dnl *** amr-nb *** - translit(dnm, m, l) AM_CONDITIONAL(USE_AMRNB, true) - AG_GST_CHECK_FEATURE(AMRNB, [amrnb library], amrnb, [ - PKG_CHECK_MODULES(AMRNB, opencore-amrnb, [ -+ if $PKG_CONFIG --atleast-version=0.1.3 opencore-amrnb; then -+ AC_DEFINE(HAVE_OPENCORE_AMRNB_0_1_3_OR_LATER, 1, [Defined for newer opencore-amrnb]) -+ fi - HAVE_AMRNB="yes" - ], [ - HAVE_AMRNB="no" -@@ -263,6 +266,9 @@ dnl *** amr-wb dec *** - translit(dnm, m, l) AM_CONDITIONAL(USE_AMRWB, true) - AG_GST_CHECK_FEATURE(AMRWB, [amrwb library], amrwbdec, [ - PKG_CHECK_MODULES(AMRWB, opencore-amrwb, [ -+ if $PKG_CONFIG --atleast-version=0.1.3 opencore-amrwb; then -+ AC_DEFINE(HAVE_OPENCORE_AMRWB_0_1_3_OR_LATER, 1, [Defined for newer opencore-amrwb]) -+ fi - HAVE_AMRWB="yes" - ], [ - HAVE_AMRWB="no" -diff --git a/ext/amrnb/amrnbdec.h b/ext/amrnb/amrnbdec.h -index 1e81839..5fe6982 100644 ---- a/ext/amrnb/amrnbdec.h -+++ b/ext/amrnb/amrnbdec.h -@@ -22,7 +22,12 @@ - - #include <gst/gst.h> - #include <gst/audio/gstaudiodecoder.h> -+ -+#ifdef HAVE_OPENCORE_AMRNB_0_1_3_OR_LATER -+#include <opencore-amrnb/interf_dec.h> -+#else - #include <interf_dec.h> -+#endif - - G_BEGIN_DECLS - -diff --git a/ext/amrnb/amrnbenc.h b/ext/amrnb/amrnbenc.h -index 7f673ac..48a8fe8 100644 ---- a/ext/amrnb/amrnbenc.h -+++ b/ext/amrnb/amrnbenc.h -@@ -21,9 +21,14 @@ - #define __GST_AMRNBENC_H__ - - #include <gst/gst.h> --#include <interf_enc.h> - #include <gst/audio/gstaudioencoder.h> - -+#ifdef HAVE_OPENCORE_AMRNB_0_1_3_OR_LATER -+#include <opencore-amrnb/interf_enc.h> -+#else -+#include <interf_enc.h> -+#endif -+ - G_BEGIN_DECLS - - #define GST_TYPE_AMRNBENC \ -diff --git a/ext/amrwbdec/amrwbdec.h b/ext/amrwbdec/amrwbdec.h -index c3528fc..6b82ae9 100644 ---- a/ext/amrwbdec/amrwbdec.h -+++ b/ext/amrwbdec/amrwbdec.h -@@ -22,8 +22,14 @@ - - #include <gst/gst.h> - #include <gst/audio/gstaudiodecoder.h> -+ -+#ifdef HAVE_OPENCORE_AMRWB_0_1_3_OR_LATER -+#include <opencore-amrwb/dec_if.h> -+#include <opencore-amrwb/if_rom.h> -+#else - #include <dec_if.h> - #include <if_rom.h> -+#endif - - G_BEGIN_DECLS - --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/orc.m4-fix-location-of-orcc-when-cross-compiling.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/orc.m4-fix-location-of-orcc-when-cross-compiling.patch deleted file mode 100644 index d1942cf..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/orc.m4-fix-location-of-orcc-when-cross-compiling.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 114ec19a882192dfcb5f71bb12c811d0a3b7f324 Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter <obi@opendreambox.org> -Date: Tue, 8 May 2012 17:27:55 +0200 -Subject: [PATCH] orc.m4: fix location of orcc when cross-compiling - -* Prepend PKG_CONFIG_SYSROOT to orcc, so configure doesn't - accidentially use an incompatible version of orcc installed - on the build system. - -Signed-off-by: Andreas Oberritter <obi@opendreambox.org> ---- - m4/orc.m4 | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/common/m4/orc.m4 b/common/m4/orc.m4 -index 26b2459..81b111e 100644 ---- a/common/m4/orc.m4 -+++ b/common/m4/orc.m4 -@@ -3,6 +3,8 @@ dnl pkg-config-based checks for Orc - dnl specific: - dnl ORC_CHECK([REQUIRED_VERSION]) - -+m4_pattern_allow(PKG_CONFIG_SYSROOT_DIR) -+ - AC_DEFUN([ORC_CHECK], - [ - ORC_REQ=ifelse([$1], , "0.4.6", [$1]) -@@ -24,7 +26,7 @@ AC_DEFUN([ORC_CHECK], - HAVE_ORC=yes - if test "x$ORCC" = "x" ; then - AC_MSG_CHECKING(for usable orcc) -- ORCC=`$PKG_CONFIG --variable=orcc orc-0.4` -+ ORCC=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=orcc orc-0.4` - dnl check whether the orcc found by pkg-config can be run from the build environment - dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH - AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`]) --- -1.7.9.5 - diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly_0.10.19.bbappend b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly_0.10.19.bbappend deleted file mode 100644 index 581f4b2..0000000 --- a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly_0.10.19.bbappend +++ /dev/null @@ -1,11 +0,0 @@ -DEPENDS += "libcdio opencore-amr" -PR .= "-vuplus0" - -SRC_URI += "file://dvdsubdec-addproperty-singlebuffer.patch \ - file://fix-opencore-amr-1.patch \ - file://fix-opencore-amr-2.patch \ - file://orc.m4-fix-location-of-orcc-when-cross-compiling.patch" - -EXTRA_OECONF += "--enable-orc --with-plugins=" - -FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" diff --git a/meta-openvuplus/recipes-enigma2/libav/libav_0.7.4.bbappend b/meta-openvuplus/recipes-enigma2/libav/libav_0.7.4.bbappend deleted file mode 100644 index 0346404..0000000 --- a/meta-openvuplus/recipes-enigma2/libav/libav_0.7.4.bbappend +++ /dev/null @@ -1,4 +0,0 @@ -LICENSE = "LGPLv2.1+" -PR .= "-vuplus0" - -EXTRA_OECONF += "--disable-gpl --disable-nonfree --disable-version3 --disable-x11grab" diff --git a/meta-openvuplus/recipes-enigma2/libdreamdvd/libdreamdvd_0.9.bb b/meta-openvuplus/recipes-enigma2/libdreamdvd/libdreamdvd_0.9.bb deleted file mode 100644 index 62e69fa..0000000 --- a/meta-openvuplus/recipes-enigma2/libdreamdvd/libdreamdvd_0.9.bb +++ /dev/null @@ -1,8 +0,0 @@ -SUMMARY = "libdvdnav wrapper for dream multimedia stbs" -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://LICENSE;md5=94d55d512a9ba36caa9b7df079bae19f" -DEPENDS = "libdvdnav" -SRCREV = "ee7b0b4c1b35264ed7e003782b501040b7b435fd" -PR = "r0" - -inherit autotools pkgconfig schwerkraft-git diff --git a/meta-openvuplus/recipes-enigma2/libdvbsi++/libdvbsi++_0.3.6.bb b/meta-openvuplus/recipes-enigma2/libdvbsi++/libdvbsi++_0.3.6.bb deleted file mode 100644 index 5916755..0000000 --- a/meta-openvuplus/recipes-enigma2/libdvbsi++/libdvbsi++_0.3.6.bb +++ /dev/null @@ -1,12 +0,0 @@ -SUMMARY = "C++ parsing library for Service Information (SI) in DVB systems" -AUTHOR = "Andreas Oberritter" -SECTION = "libs/multimedia" -LICENSE = "LGPLv2.1" -LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343" -PR = "r1" - -SRC_URI = "http://www.saftware.de/${PN}/${P}.tar.bz2" -SRC_URI[md5sum] = "4e9fb95c3ab8bb31ff051ed1aa98c8c5" -SRC_URI[sha256sum] = "7f9a8fc7bed9372784ecb101fc45042dcb36dcd4949c57aa524365366f71ebf2" - -inherit autotools pkgconfig diff --git a/meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav/0001-dvdnavmini.pc-link-against-libdvdnavmini.patch b/meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav/0001-dvdnavmini.pc-link-against-libdvdnavmini.patch deleted file mode 100644 index 84ce442..0000000 --- a/meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav/0001-dvdnavmini.pc-link-against-libdvdnavmini.patch +++ /dev/null @@ -1,25 +0,0 @@ -upstream: Daniel Baumann <daniel@debian.org> -status: pending - -From 2329cd28d7508f9809f849fa547362aa7df160ba Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter <obi@opendreambox.org> -Date: Fri, 8 Oct 2010 00:50:54 +0000 -Subject: [PATCH] dvdnavmini.pc: link against libdvdnavmini - ---- - misc/dvdnavmini.pc.in | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/misc/dvdnavmini.pc.in b/misc/dvdnavmini.pc.in -index 52945b3..773be2f 100644 ---- a/misc/dvdnavmini.pc.in -+++ b/misc/dvdnavmini.pc.in -@@ -8,4 +8,4 @@ Description: DVD Navigation mini library - Version: @VERSION@ - - Cflags: -I${includedir} @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Libs: -L${libdir} -ldvdnavmini @THREAD_LIBS@ --- -1.7.1 - diff --git a/meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav_svn.bb b/meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav_svn.bb deleted file mode 100644 index b00f742..0000000 --- a/meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav_svn.bb +++ /dev/null @@ -1,24 +0,0 @@ -SUMMARY = "DVD navigation multimeda library" -SECTION = "libs/multimedia" -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://README;beginline=42;endline=43;md5=3f2e6972567beedaa901b809725027ff \ - file://src/dvdnav.c;beginline=1;endline=19;md5=8270661e7e05a78e14714e0fb3048b12" -DEPENDS = "libdvdread" -PV = "4.2.0+svnr${SRCPV}" -PR = "r1" - -SRC_URI = "svn://svn.mplayerhq.hu/dvdnav/trunk;module=${PN} \ - file://0001-dvdnavmini.pc-link-against-libdvdnavmini.patch" - -SRCREV = "1243" -S = "${WORKDIR}/${PN}" - -inherit autotools lib_package binconfig pkgconfig - -FILES_${PN} = "${libdir}/${PN}${SOLIB}" - -python populate_packages_prepend() { - description = bb.data.expand('${DESCRIPTION}', d) - libdir = bb.data.expand('${libdir}', d) - do_split_packages(d, libdir, '^lib(.*)\.so\..*', 'lib%s', description + ' (%s)', extra_depends='', allow_links=True) -} diff --git a/meta-openvuplus/recipes-enigma2/libdvdread/libdvdread_svn.bb b/meta-openvuplus/recipes-enigma2/libdvdread/libdvdread_svn.bb deleted file mode 100644 index afc488c..0000000 --- a/meta-openvuplus/recipes-enigma2/libdvdread/libdvdread_svn.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "DVD access multimeda library" -SECTION = "libs/multimedia" -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://COPYING;md5=64e753fa7d1ca31632bc383da3b57c27" -PV = "4.2.0+svnr${SRCPV}" -PR = "r1" - -SRC_URI = "svn://svn.mplayerhq.hu/dvdnav/trunk;module=${PN}" - -SRCREV = "1243" -S = "${WORKDIR}/${PN}" - -inherit autotools lib_package binconfig pkgconfig diff --git a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch b/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch deleted file mode 100644 index 9eb2b87..0000000 --- a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch +++ /dev/null @@ -1,125 +0,0 @@ ---- libsigc++-1.2.5-old/configure.in 2003-05-14 10:04:25.000000000 +0200 -+++ libsigc++-1.2.5/configure.in 2004-07-03 10:00:13.000000000 +0200 -@@ -35,9 +35,9 @@ - dnl AC_SUBST(SIGC_RELEASE, $SIGC_RELEASE) - AC_SUBST(SIGC_VERSION) - --AC_DEFINE_UNQUOTED(SIGC_MAJOR_VERSION, $SIGC_MAJOR_VERSION) --AC_DEFINE_UNQUOTED(SIGC_MINOR_VERSION, $SIGC_MINOR_VERSION) --AC_DEFINE_UNQUOTED(SIGC_MICRO_VERSION, $SIGC_MICRO_VERSION) -+AC_DEFINE_UNQUOTED(SIGC_MAJOR_VERSION, $SIGC_MAJOR_VERSION, [library major version]) -+AC_DEFINE_UNQUOTED(SIGC_MINOR_VERSION, $SIGC_MINOR_VERSION, [library minor version]) -+AC_DEFINE_UNQUOTED(SIGC_MICRO_VERSION, $SIGC_MICRO_VERSION, [library micro version]) - - AC_CONFIG_AUX_DIR(scripts) - -@@ -50,6 +50,23 @@ - - dnl Specify a configuration file - AM_CONFIG_HEADER(sigc++/config/sigcconfig.h) -+AH_BOTTOM([ -+// Window DLL declarations -+ -+#ifdef LIBSIGC_DLL -+ #if defined(LIBSIGC_COMPILATION) && defined(DLL_EXPORT) -+ #define LIBSIGC_API __declspec(dllexport) -+ #define LIBSIGC_TMPL -+ #elif !defined(LIBSIGC_COMPILATION) -+ #define LIBSIGC_API __declspec(dllimport) -+ #define LIBSIGC_TMPL extern -+ #else -+ #define LIBSIGC_API -+ #endif /* LIBSIGC_COMPILATION - DLL_EXPORT */ -+#else -+ #define LIBSIGC_API -+#endif /* LIBSIGC_DLL */ -+]) - - AM_MAINTAINER_MODE - -@@ -288,10 +307,10 @@ - }; - ],[ - ], -- AC_DEFINE(SIGC_CXX_EXPLICIT,explicit) -+ AC_DEFINE(SIGC_CXX_EXPLICIT,explicit,[if C++ compiler supports explicit]) - ac_cxx_explicit=yes - , -- AC_DEFINE(SIGC_CXX_EXPLICIT,) -+ AC_DEFINE(SIGC_CXX_EXPLICIT) - ac_cxx_explicit=no - ) - AC_MSG_RESULT([$ac_cxx_explicit]) -@@ -305,7 +324,7 @@ - }; - ],[ - ], -- AC_DEFINE(SIGC_CXX_EXPLICIT_COPY,explicit) -+ AC_DEFINE(SIGC_CXX_EXPLICIT_COPY,explicit,[if C++ compiler supports explicit copy ctor]) - ac_cxx_explicit_copy_ctor=yes - , - AC_DEFINE(SIGC_CXX_EXPLICIT_COPY,) -@@ -413,7 +432,7 @@ - k<void,void> a; - ],[ - ac_cxx_partial_specialization=yes -- AC_DEFINE(SIGC_CXX_PARTIAL_SPEC) -+ AC_DEFINE(SIGC_CXX_PARTIAL_SPEC,,[if C++ compiler supports partial specialization]) - ],[ - # config_error=yes - ac_cxx_partial_specialization=no -@@ -434,7 +453,7 @@ - ],[ - ac_cxx_namespaces=yes - AC_MSG_RESULT([$ac_cxx_namespaces]) -- AC_DEFINE(SIGC_CXX_NAMESPACES) -+ AC_DEFINE(SIGC_CXX_NAMESPACES,,[if C++ compiler supports name spaces]) - ],[ - ac_cxx_namespaces=no - AC_MSG_RESULT([$ac_cxx_namespaces]) -@@ -474,7 +493,7 @@ - A<int> i; - ],[ - ],[ -- AC_DEFINE(SIGC_CXX_INT_CTOR) -+ AC_DEFINE(SIGC_CXX_INT_CTOR,,[if C++ compiler has intrinsic constructors]) - ac_cxx_tmpl_intctor=yes - ],[ - ac_cxx_tmpl_intctor=no -@@ -515,7 +534,7 @@ - ],[ - ],[ - ac_cxx_void_return=yes -- AC_DEFINE(SIGC_CXX_VOID_RETURN) -+ AC_DEFINE(SIGC_CXX_VOID_RETURN,,[if C++ compiler allows void returns]) - ],[ - ac_cxx_void_return=no - ]) -@@ -530,7 +549,7 @@ - ],[ - ],[ - ac_cxx_void_cast_return=yes -- AC_DEFINE(SIGC_CXX_VOID_CAST_RETURN) -+ AC_DEFINE(SIGC_CXX_VOID_CAST_RETURN,,[if C++ compiler supports void cast return]) - ],[ - ac_cxx_void_cast_return=no - ]) -@@ -565,7 +584,7 @@ - P<int&>::ptr q=b; - ],[ - ac_cxx_specialize_references=yes -- AC_DEFINE(SIGC_CXX_SPECIALIZE_REFERENCES) -+ AC_DEFINE(SIGC_CXX_SPECIALIZE_REFERENCES,,[if C++ compiler allows specialization of references]) - ],[ - ac_cxx_specialize_references=no - ]) ---- libsigc++-1.2.5-old/Makefile.am 2004-06-27 12:45:19.000000000 +0200 -+++ libsigc++-1.2.5/Makefile.am 2004-07-03 08:40:44.000000000 +0200 -@@ -1,6 +1,6 @@ - SUBDIRS = sigc++ tests doc - DIST_SUBDIRS = $(SUBDIRS) examples scripts MSVC_6 MSVC_Net2003 --ACLOCAL_AMFLAGS = -I $(srcdir)/scripts -+ACLOCAL_AMFLAGS = -I ./scripts - - EXTRA_DIST = \ - FEATURES IDEAS \ diff --git a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch b/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch deleted file mode 100644 index 1cdfedb..0000000 --- a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch +++ /dev/null @@ -1,15 +0,0 @@ -upstream: unmaintained - -| ...build/tmp/sysroots/i686-linux/usr/bin/install: will not overwrite just-created `...build/tmp/work/mipsel-oe-linux/libsigc++-1.2-1.2.5-r2/image/usr/include/sigc++-1.2/sigc++/method_slot.h' with `method_slot.h' - ---- libsigc++-1.2.7/sigc++/Makefile.am.orig 2010-09-24 12:03:24.000000000 +0000 -+++ libsigc++-1.2.7/sigc++/Makefile.am 2010-09-24 12:03:30.000000000 +0000 -@@ -12,7 +12,7 @@ - sigc_built_h = bind_return.h \ - object_slot.h retype_return.h slot.h bind.h \ - class_slot.h hide.h retype.h signal.h \ -- method_slot.h method_slot.h -+ method_slot.h - - built_sources = $(sigc_built_cc) $(sigc_built_h) - dist_sources = $(sigc_fixed_cc) $(sigc_fixed_h) diff --git a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch b/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch deleted file mode 100644 index 7495a4d..0000000 --- a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch +++ /dev/null @@ -1,13 +0,0 @@ - -# -# Patch managed by http://www.holgerschurig.de/patcher.html -# - ---- libsigc++-1.2.5/sigc++-1.2.pc.in~pkgconfig -+++ libsigc++-1.2.5/sigc++-1.2.pc.in -@@ -7,4 +7,4 @@ - Description: Type-safe signal and callback system for C++ - Version: @VERSION@ - Libs: -L${libdir} -lsigc-1.2 --Cflags: -I${exec_prefix}/lib/sigc++-1.2/include -I${includedir}/sigc++-1.2 -+Cflags: -I${libdir}/sigc++-1.2/include -I${includedir}/sigc++-1.2 diff --git a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch b/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch deleted file mode 100644 index 21fa729..0000000 --- a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch +++ /dev/null @@ -1,159 +0,0 @@ -diff -Naur libsigc++-1.2.5/sigc++/macros/signal.h.m4 libsigc++-1.2.7/sigc++/macros/signal.h.m4 ---- libsigc++-1.2.5/sigc++/macros/signal.h.m4 2003-03-06 09:06:12.000000000 +0100 -+++ libsigc++-1.2.7/sigc++/macros/signal.h.m4 2005-01-29 00:10:34.000000000 +0100 -@@ -82,6 +82,8 @@ - bool empty(); - void clear(); - void cleanup(); // nothrow -+ private: -+ void _remove(SignalConnectionNode* c); - }; - - class LIBSIGC_API SignalBase -diff -Naur libsigc++-1.2.5/sigc++/object.h libsigc++-1.2.7/sigc++/object.h ---- libsigc++-1.2.5/sigc++/object.h 2003-05-08 21:35:11.000000000 +0200 -+++ libsigc++-1.2.7/sigc++/object.h 2012-02-14 13:08:00.193044640 +0100 -@@ -69,7 +69,7 @@ - virtual void unreference() const; - virtual void set_manage(); - -- ObjectBase& operator=(const ObjectBase& /* o */) -+ ObjectBase& operator=(const ObjectBase& o) - { return *this; } - - ObjectBase() -@@ -79,7 +79,11 @@ - : control_(0) {} - - virtual ~ObjectBase()=0; -- -+ -+ Control_* control() const -+ { -+ return const_cast<ObjectBase *>(this)->control(); -+ } - Control_* control() - { - if (!control_) -@@ -129,7 +133,6 @@ - template <class T2> - Ptr(const Ptr<T2>& p2) - { -- T* test_assignment_ = (T2*)0; - assign( p2.get() ); - } - -@@ -144,7 +147,7 @@ - - template <class T2> - Ptr& operator=(const Ptr<T2>& p2) -- { T *test_assignment_=(T2*)0; reset(p2.get()); return *this; } -+ { reset(p2.get()); return *this; } - - Ptr& operator=(const Ptr& p) - { reset(p.get()); return *this; } -@@ -175,7 +178,7 @@ - if (control_) - control_->ref(); - } -- -+ - void reset(T* t = 0) - { - if (object_ == t) -@@ -197,4 +200,3 @@ - - - #endif // SIGC_OBJECT -- -diff -Naur libsigc++-1.2.5/sigc++/signal.cc libsigc++-1.2.7/sigc++/signal.cc ---- libsigc++-1.2.5/sigc++/signal.cc 2002-12-12 20:18:24.000000000 +0100 -+++ libsigc++-1.2.7/sigc++/signal.cc 2005-01-29 00:10:34.000000000 +0100 -@@ -93,33 +93,11 @@ - defered_ = false; - - SignalConnectionNode* i = begin_; -- -- while(begin_ && begin_->defered_) -- begin_ = begin_->next_; -- -- while(end_ && end_->defered_) -- end_ = end_->prev_; -- -- // Hmm, this looks a bit tricky to me. The code above removes all -- // elements from the front and the back that have defered_ = true set. -- // But the following loop unreferences *all* defered elements, including -- // those that are still in the list. -- // -- // I don't know whether this is a bug -- it's possible that defered nodes -- // are always at the front or back. If not, a node could be unreferenced -- // twice which is bad. -- // -- // --Daniel -- - while(i) - { - SignalConnectionNode* next = i->next_; -- - if(i->defered_) -- { -- i->parent_ = 0; -- i->unreference(); -- } -+ _remove(i); - - i = next; - } -@@ -141,7 +119,7 @@ - begin_->prev_=c; - else - end_=c; -- end_=c; -+ begin_=c; - return c; - } - -@@ -161,21 +139,8 @@ - - void SignalNode::remove(SignalConnectionNode* c) - { -- if (!exec_count_) -- { -- if (c->prev_) -- c->prev_->next_=c->next_; -- else -- begin_=c->next_; -- -- if (c->next_) -- c->next_->prev_=c->prev_; -- else -- end_=c->prev_; -- -- c->parent_ = 0; -- c->unreference(); -- } -+ if(!exec_count_) -+ _remove(c); - else - { - c->defered_=true; -@@ -184,6 +149,19 @@ - } - } - -+void SignalNode::_remove(SignalConnectionNode* c) -+ { -+ if (c->prev_) -+ c->prev_->next_=c->next_; -+ else -+ begin_=c->next_; -+ if (c->next_) -+ c->next_->prev_=c->prev_; -+ else -+ end_=c->prev_; -+ c->parent_ = 0; -+ c->unreference(); -+ } - - - /**********************************************************/ diff --git a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2_1.2.5.bb b/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2_1.2.5.bb deleted file mode 100644 index 632a6f5..0000000 --- a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2_1.2.5.bb +++ /dev/null @@ -1,21 +0,0 @@ -SUMMARY = "A library for loose coupling of C++ method calls" -SECTION = "libs" -LICENSE = "LGPLv2.1" -LIC_FILES_CHKSUM = "file://COPYING;md5=d8045f3b8f929c1cb29a1e3fd737b499" -PR = "r2" - -SRC_URI = "${SOURCEFORGE_MIRROR}/libsigc/libsigc++-${PV}.tar.gz \ - file://autofoo.patch \ - file://fix-install.patch \ - file://pkgconfig.patch \ - file://to_1.2.7.patch" -SRC_URI[md5sum] = "d0d1ffcae0eced97ef4f17ce0ba81352" -SRC_URI[sha256sum] = "dcd6d3ea9a2c185b5286f80eefe9ac1402036b8fa21cfc742442d99579bd2b3e" - -S = "${WORKDIR}/libsigc++-${PV}" - -inherit autotools pkgconfig - -EXTRA_AUTORECONF = "--exclude=autoheader" - -FILES_${PN}-dev += "${libdir}/sigc++-*/" diff --git a/meta-openvuplus/recipes-enigma2/libungif/libungif-native_4.1.3.bb b/meta-openvuplus/recipes-enigma2/libungif/libungif-native_4.1.3.bb deleted file mode 100644 index c8cc832..0000000 --- a/meta-openvuplus/recipes-enigma2/libungif/libungif-native_4.1.3.bb +++ /dev/null @@ -1,7 +0,0 @@ -require libungif_${PV}.bb - -S = "${WORKDIR}/libungif-${PV}" - -PACKAGES = "" - -inherit autotools native diff --git a/meta-openvuplus/recipes-enigma2/libungif/libungif_4.1.3.bb b/meta-openvuplus/recipes-enigma2/libungif/libungif_4.1.3.bb deleted file mode 100644 index d14c643..0000000 --- a/meta-openvuplus/recipes-enigma2/libungif/libungif_4.1.3.bb +++ /dev/null @@ -1,15 +0,0 @@ -DESCRIPTION = "shared library for GIF images" -SECTION = "libs" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://COPYING;md5=ae11c61b04b2917be39b11f78d71519a" -PR = "r3" - -SRC_URI = "${SOURCEFORGE_MIRROR}/giflib/libungif-${PV}.tar.bz2" -SRC_URI[md5sum] = "8c198831cc0495596c78134b8849e9ad" -SRC_URI[sha256sum] = "59e835a57e6df03e4d2253b2357253f3d13da9473ff465563a3b9833a744fc36" - -inherit autotools lib_package - -PACKAGES =+ "${PN}-utils" - -FILES_${PN}-utils = "${bindir}/*" diff --git a/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/disable_libxslt.patch b/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/disable_libxslt.patch deleted file mode 100644 index b178641..0000000 --- a/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/disable_libxslt.patch +++ /dev/null @@ -1,96 +0,0 @@ -diff -Naur libxmlccwrap-0.0.12_org/configure.ac libxmlccwrap-0.0.12/configure.ac ---- libxmlccwrap-0.0.12_org/configure.ac 2005-07-28 21:27:58.000000000 +0200 -+++ libxmlccwrap-0.0.12/configure.ac 2007-10-29 15:36:49.000000000 +0100 -@@ -15,7 +15,7 @@ - AM_PROG_LIBTOOL - - AC_CHECK_LIB(xml2,main) --AC_CHECK_LIB(xslt,main) -+#AC_CHECK_LIB(xslt,main) - - AC_OUTPUT([Makefile \ - xmlccwrap/Makefile \ -diff -Naur libxmlccwrap-0.0.12_org/xmlccwrap/xmlccwrap.cc libxmlccwrap-0.0.12/xmlccwrap/xmlccwrap.cc ---- libxmlccwrap-0.0.12_org/xmlccwrap/xmlccwrap.cc 2003-12-18 23:48:08.000000000 +0100 -+++ libxmlccwrap-0.0.12/xmlccwrap/xmlccwrap.cc 2007-10-24 22:54:15.000000000 +0200 -@@ -23,8 +23,10 @@ - #include <libxml/tree.h> - #include <libxml/HTMLparser.h> - #include <libxml/encoding.h> -+/* - #include <libxslt/xsltutils.h> - #include <libxslt/transform.h> -+*/ - #include "xmlccwrap.h" - #include "libxmlexport.h" - -@@ -47,7 +49,7 @@ - Element *readnode(xmlNodePtr); - void writenode(xmlDocPtr, Element *, xmlNodePtr, int = 0); - -- -+/* - XSLTTree::XSLTTree() - { - xsltP = 0; -@@ -83,7 +85,7 @@ - { - return xsltP; - } -- -+*/ - - XMLTree::XMLTree() : _filename(), _root(), _compression(0) - { } -@@ -380,7 +382,7 @@ - return retval; - } - -- -+/* - bool XMLTree::xslt(const XSLTTree & xsltTree, const std::string & outputfile, ParameterMap & parameterMap) - { - bool ret = false; -@@ -425,7 +427,7 @@ - ParameterMap parameterMap; - return xslt(xsltTree, outputfile, parameterMap); - } -- -+*/ - - const std::string & XMLTree::getErrorString() - { -diff -Naur libxmlccwrap-0.0.12_org/xmlccwrap/xmlccwrap.h libxmlccwrap-0.0.12/xmlccwrap/xmlccwrap.h ---- libxmlccwrap-0.0.12_org/xmlccwrap/xmlccwrap.h 2003-12-18 23:42:37.000000000 +0100 -+++ libxmlccwrap-0.0.12/xmlccwrap/xmlccwrap.h 2007-10-24 22:54:15.000000000 +0200 -@@ -43,7 +41,7 @@ - typedef std::multimap<std::string, std::string> ParameterMap; - typedef ParameterMap::value_type ValuePair; - -- -+/* - class XSLTTree - { - private: -@@ -60,7 +58,7 @@ - bool read(const std::string &fn); - const void * exportxsltStylesheetPtr() const; - }; -- -+*/ - - class XMLTree - { -@@ -102,10 +100,10 @@ - bool write(const std::string &fn); - const std::string & writeBuffer() const; - -- -+/* - bool xslt(const XSLTTree & xsltTree, const std::string & outputfile, ParameterMap & parameterMap); - bool xslt(const XSLTTree & xsltTree, const std::string & outputfile); -- -+*/ - const std::string & getErrorString(); - }; - diff --git a/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/dont_build_unneeded.patch b/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/dont_build_unneeded.patch deleted file mode 100644 index 69eaa15..0000000 --- a/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/dont_build_unneeded.patch +++ /dev/null @@ -1,6 +0,0 @@ -diff -Naur libxmlccwrap-0.0.12_org/Makefile.am libxmlccwrap-0.0.12/Makefile.am ---- libxmlccwrap-0.0.12_org/Makefile.am 2002-12-11 23:18:41.000000000 +0100 -+++ libxmlccwrap-0.0.12/Makefile.am 2007-10-29 15:35:11.000000000 +0100 -@@ -1 +1 @@ --SUBDIRS = xmlccwrap html testlib -+SUBDIRS = xmlccwrap diff --git a/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/fix_assignment_operator.patch b/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/fix_assignment_operator.patch deleted file mode 100644 index 1d64590..0000000 --- a/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/fix_assignment_operator.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- libxmlccwrap-0.0.12_org/xmlccwrap/xmlccwrap.cc 2003-12-18 23:48:08.000000000 +0100 -+++ libxmlccwrap-0.0.12/xmlccwrap/xmlccwrap.cc 2007-10-24 22:54:15.000000000 +0200 -@@ -498,6 +500,7 @@ - for (ElementIterator curnode = nodes.begin(); curnode != nodes.end(); curnode++) - add - (**curnode); -+ return *this; - } - - diff --git a/meta-openvuplus/recipes-enigma2/libxmlccwrap/libxmlccwrap_0.0.12.bb b/meta-openvuplus/recipes-enigma2/libxmlccwrap/libxmlccwrap_0.0.12.bb deleted file mode 100644 index 51b934a..0000000 --- a/meta-openvuplus/recipes-enigma2/libxmlccwrap/libxmlccwrap_0.0.12.bb +++ /dev/null @@ -1,21 +0,0 @@ -SUMMARY = "A small libxml2 c++ wrapper" -AUTHOR = "Jürgen Rinas <jrinas@gmx.de>" -HOMEPAGE = "http://www.ant.uni-bremen.de/whomes/rinas/libxmlccwrap/" -SECTION = "libs" -LICENSE = "LGPLv2.1+" -LIC_FILES_CHKSUM = "file://COPYING;md5=fad9b3332be894bab9bc501572864b29" -DEPENDS = "libxml2" -PR = "r1" - -SRC_URI = "http://www.ant.uni-bremen.de/whomes/rinas/libxmlccwrap/download/${P}.tar.gz \ - file://dont_build_unneeded.patch \ - file://disable_libxslt.patch \ - file://fix_assignment_operator.patch" - -SRC_URI[md5sum] = "9f8bbad3452d704603246273b2dda758" -SRC_URI[sha256sum] = "38fb5f75f8b7dad1c8d535cc7b18ea9f1603e14a8b9256a2f60cf721513dc299" - -inherit autotools - -FILES_${PN} = "${libdir}/${P}${SOLIBSDEV}" -FILES_${PN}-dev = "${includedir} ${libdir}/${PN}${SOLIBSDEV} ${libdir}/*.la" diff --git a/meta-openvuplus/recipes-enigma2/opencore-amr/opencore-amr_0.1.3.bb b/meta-openvuplus/recipes-enigma2/opencore-amr/opencore-amr_0.1.3.bb deleted file mode 100644 index 7976379..0000000 --- a/meta-openvuplus/recipes-enigma2/opencore-amr/opencore-amr_0.1.3.bb +++ /dev/null @@ -1,20 +0,0 @@ -SUMMARY = "Adaptive Multi Rate speech codecs" -SECTION = "libs/multimedia" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=dd2c2486aca02190153cf399e508c7e7" -PR = "r0" - -SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BP}.tar.gz" -SRC_URI[md5sum] = "09d2c5dfb43a9f6e9fec8b1ae678e725" -SRC_URI[sha256sum] = "106bf811c1f36444d7671d8fd2589f8b2e0cca58a2c764da62ffc4a070595385" - -inherit autotools pkgconfig - -PACKAGES =+ "libopencore-amrnb libopencore-amrwb" - -RDEPENDS_${PN} = "libopencore-amrnb libopencore-amrwb" - -FILES_libopencore-amrnb = "${libdir}/libopencore-amrnb${SOLIBS}" -FILES_libopencore-amrwb = "${libdir}/libopencore-amrwb${SOLIBS}" - -ALLOW_EMPTY_${PN} = "1" diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/configure-targets.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/configure-targets.patch deleted file mode 100644 index 2317949..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/configure-targets.patch +++ /dev/null @@ -1,25 +0,0 @@ -Upstream-Status: Inappropriate [embedded specific] - -The number of colons are important :) - -Index: openssl-0.9.8g/Configure -=================================================================== ---- openssl-0.9.8g.orig/Configure 2008-04-12 04:27:22.000000000 +0200 -+++ openssl-0.9.8g/Configure 2008-04-12 04:38:56.000000000 +0200 -@@ -395,6 +395,16 @@ - "linux-alpha-ccc","ccc:-fast -readonly_strings -DL_ENDIAN -DTERMIO::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${no_asm}", - "linux-alpha+bwx-ccc","ccc:-fast -readonly_strings -DL_ENDIAN -DTERMIO::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${no_asm}", - -+ # Linux on ARM -+"linux-elf-arm","$ENV{'CC'}:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"linux-elf-armeb","$ENV{'CC'}:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"linux-gnueabi-arm","$ENV{'CC'}:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"linux-gnueabi-armeb","$ENV{'CC'}:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"linux-uclibceabi-arm","$ENV{'CC'}:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"linux-uclibceabi-armeb","$ENV{'CC'}:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+ -+"linux-avr32","$ENV{'CC'}:-DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).", -+ - #### *BSD [do see comment about ${BSDthreads} above!] - "BSD-generic32","gcc:-DTERMIOS -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", - "BSD-x86", "gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_out_asm}:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/ca.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/ca.patch deleted file mode 100644 index aba4d42..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/ca.patch +++ /dev/null @@ -1,22 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8m/apps/CA.pl.in -=================================================================== ---- openssl-0.9.8m.orig/apps/CA.pl.in 2006-04-28 00:28:51.000000000 +0000 -+++ openssl-0.9.8m/apps/CA.pl.in 2010-02-27 00:36:51.000000000 +0000 -@@ -65,6 +65,7 @@ - foreach (@ARGV) { - if ( /^(-\?|-h|-help)$/ ) { - print STDERR "usage: CA -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify\n"; -+ print STDERR "usage: CA -signcert certfile keyfile|-newcert|-newreq|-newca|-sign|-verify\n"; - exit 0; - } elsif (/^-newcert$/) { - # create a certificate -@@ -165,6 +166,7 @@ - } else { - print STDERR "Unknown arg $_\n"; - print STDERR "usage: CA -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify\n"; -+ print STDERR "usage: CA -signcert certfile keyfile|-newcert|-newreq|-newca|-sign|-verify\n"; - exit 1; - } - } diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/config-hurd.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/config-hurd.patch deleted file mode 100644 index 2359d15..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/config-hurd.patch +++ /dev/null @@ -1,17 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/config -=================================================================== ---- openssl-0.9.8k.orig/config 2009-02-16 09:43:41.000000000 +0100 -+++ openssl-0.9.8k/config 2009-07-19 11:32:41.000000000 +0200 -@@ -162,8 +162,8 @@ - echo "${MACHINE}-whatever-linux1"; exit 0 - ;; - -- GNU*) -- echo "hurd-x86"; exit 0; -+ GNU:*|GNU/*:*) -+ echo "${MACHINE}-gnuish"; exit 0; - ;; - - LynxOS:*) diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/debian-targets.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/debian-targets.patch deleted file mode 100644 index 5720988..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/debian-targets.patch +++ /dev/null @@ -1,56 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/Configure -=================================================================== ---- openssl-0.9.8k.orig/Configure 2009-12-09 16:09:41.000000000 +0000 -+++ openssl-0.9.8k/Configure 2009-12-09 16:09:55.000000000 +0000 -@@ -320,6 +320,49 @@ - "osf1-alpha-cc", "cc:-std1 -tune host -O4 -readonly_strings::(unknown):::SIXTY_FOUR_BIT_LONG RC4_CHUNK:${no_asm}:dlfcn:alpha-osf1-shared:::.so", - "tru64-alpha-cc", "cc:-std1 -tune host -fast -readonly_strings::-pthread:::SIXTY_FOUR_BIT_LONG RC4_CHUNK:${no_asm}:dlfcn:alpha-osf1-shared::-msym:.so", - -+# Debian GNU/* (various architectures) -+"debian-alpha","gcc:-DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-alpha-ev4","gcc:-DTERMIO -O3 -Wa,--noexecstack -mcpu=ev4 -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-alpha-ev5","gcc:-DTERMIO -O3 -Wa,--noexecstack -mcpu=ev5 -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-arm","gcc:-DL_ENDIAN -DTERMIO -O2 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-armeb","gcc:-DB_ENDIAN -DTERMIO -O2 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-armel","gcc:-DL_ENDIAN -DTERMIO -O2 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+#"debian-amd64","gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-amd64", "gcc:-m64 -DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK RC4_CHAR BF_PTR2 DES_INT DES_UNROLL:${x86_64_asm_linux}:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-avr32", "gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG_BF_PTR::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-kfreebsd-amd64","gcc:-m64 -DL_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -Wall -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK BF_PTR2 DES_INT DES_UNROLL:${x86_64_asm}:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+#"debian-freebsd-alpha","gcc:-DTERMIOS -O -Wa,--noexecstack -fomit-frame-pointer::(unknown):::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC2::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-kfreebsd-i386","gcc:-DL_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -march=i486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-hppa","gcc:-DB_ENDIAN -DTERMIO -O2 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG MD2_CHAR RC4_INDEX::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-hurd-i386","gcc:-DL_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -mtune=i486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-ia64","gcc:-DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK RC4_CHAR:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+#"debian-i386","gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:linux-shared:-fPIC", -+"debian-i386","gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-i386-i486","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i486 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-i386-i586","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i586 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-i386-i686/cmov","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i686 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-m68k","gcc:-DB_ENDIAN -DTERMIO -O2 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG MD2_CHAR RC4_INDEX::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-mips", "gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL DES_RISC2::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-mipsel", "gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL DES_RISC2::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-netbsd-i386", "gcc:-DL_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -m486 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-netbsd-m68k", "gcc:-DB_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -Wall::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL::::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-netbsd-sparc", "gcc:-DB_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -mv8 -Wall::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL::::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-openbsd-alpha","gcc:-DTERMIOS -O3 -Wa,--noexecstack -g::(unknown):::SIXTY_FOUR_BIT_LONG DES_INT DES_PTR DES_RISC2::::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-openbsd-i386", "gcc:-DL_ENDIAN -DTERMIOS -O3 -Wa,--noexecstack -g -m486::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_out_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-openbsd-mips","gcc:-O2 -Wa,--noexecstack -g -DL_ENDIAN::(unknown)::BN_LLONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC2 DES_PTR BF_PTR:::::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-powerpc","gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_UNROLL DES_RISC2 DES_PTR MD2_CHAR RC4_INDEX::linux_ppc32.o::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-ppc64","gcc:-m64 -DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL::linux_ppc64.o::::::::::dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-s390","gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-sh3", "gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-sh4", "gcc:-DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-sh3eb", "gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-sh4eb", "gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-m32r","gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-sparc","gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-sparc-v8","gcc:-DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -mcpu=v8 -g -Wall -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::sparcv8.o:des_enc-sparc.o fcrypt_b.o:::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-sparc-v9","gcc:-DB_ENDIAN -DTERMIO -O3 -mcpu=v9 -Wa,--noexecstack -Wa,-Av8plus -g -Wall -DULTRASPARC -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::sparcv8plus.o:des_enc-sparc.o fcrypt_b.o:::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+"debian-sparc64","gcc:-m64 -DB_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall -DULTRASPARC -DBN_DIV2W::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR:::des_enc-sparc.o fcrypt_b.o:::::::::dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", -+ - #### - #### Variety of LINUX:-) - #### diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/engines-path.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/engines-path.patch deleted file mode 100644 index 5b4c7d5..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/engines-path.patch +++ /dev/null @@ -1,49 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8m/Makefile.org -=================================================================== ---- openssl-0.9.8m.orig/Makefile.org 2010-01-27 16:06:36.000000000 +0000 -+++ openssl-0.9.8m/Makefile.org 2010-02-27 00:43:04.000000000 +0000 -@@ -620,7 +620,7 @@ - install_sw: - @$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ - $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR) \ -- $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines \ -+ $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/ssl/engines \ - $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig \ - $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl \ - $(INSTALL_PREFIX)$(OPENSSLDIR)/misc \ -Index: openssl-0.9.8m/engines/Makefile -=================================================================== ---- openssl-0.9.8m.orig/engines/Makefile 2009-11-10 01:53:02.000000000 +0000 -+++ openssl-0.9.8m/engines/Makefile 2010-02-27 00:45:03.000000000 +0000 -@@ -101,13 +101,13 @@ - *DSO_DL*) sfx="sl";; \ - *) sfx="bad";; \ - esac; \ -- cp lib$$l.$$sfx $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx.new; \ -+ cp lib$$l.$$sfx $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/ssl/engines/lib$$l.$$sfx.new; \ - else \ - sfx="so"; \ - cp cyg$$l.dll $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx.new; \ - fi; \ -- chmod 555 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx.new; \ -- mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx ); \ -+ chmod 555 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/ssl/engines/lib$$l.$$sfx.new; \ -+ mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/ssl/engines/lib$$l.$$sfx.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/lib$$l.$$sfx ); \ - done; \ - fi - -Index: openssl-0.9.8m/Configure -=================================================================== ---- openssl-0.9.8m.orig/Configure 2010-02-27 00:40:42.000000000 +0000 -+++ openssl-0.9.8m/Configure 2010-02-27 00:46:47.000000000 +0000 -@@ -1738,7 +1738,7 @@ - # $foo is to become "$prefix/lib$multilib/engines"; - # as Makefile.org and engines/Makefile are adapted for - # $multilib suffix. -- my $foo = "$prefix/lib/engines"; -+ my $foo = "$prefix/lib/ssl/engines"; - $foo =~ s/\\/\\\\/g; - print OUT "#define ENGINESDIR \"$foo\"\n"; - } diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/kfreebsd-pipe.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/kfreebsd-pipe.patch deleted file mode 100644 index b0312f3..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/kfreebsd-pipe.patch +++ /dev/null @@ -1,15 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/crypto/perlasm/x86_64-xlate.pl -=================================================================== ---- openssl-0.9.8k.orig/crypto/perlasm/x86_64-xlate.pl 2008-02-13 21:01:48.000000000 +0100 -+++ openssl-0.9.8k/crypto/perlasm/x86_64-xlate.pl 2009-07-19 11:37:23.000000000 +0200 -@@ -62,7 +62,7 @@ - my ($outdev,$outino,@junk)=stat($output); - - open STDOUT,">$output" || die "can't open $output: $!" -- if ($stddev!=$outdev || $stdino!=$outino); -+# if ($stddev!=$outdev || $stdino!=$outino); - } - - my $masmref=8 + 50727*2**-32; # 8.00.50727 shipped with VS2005 diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/make-targets.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/make-targets.patch deleted file mode 100644 index 91207d8..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/make-targets.patch +++ /dev/null @@ -1,15 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/Makefile.org -=================================================================== ---- openssl-0.9.8k.orig/Makefile.org 2009-07-19 11:32:41.000000000 +0200 -+++ openssl-0.9.8k/Makefile.org 2009-07-19 11:37:31.000000000 +0200 -@@ -131,7 +131,7 @@ - - BASEADDR= - --DIRS= crypto fips ssl engines apps test tools -+DIRS= crypto fips ssl engines apps tools - SHLIBDIRS= crypto ssl fips - - # dirs in crypto to build diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/man-dir.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/man-dir.patch deleted file mode 100644 index 358f8cd..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/man-dir.patch +++ /dev/null @@ -1,15 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/Makefile.org -=================================================================== ---- openssl-0.9.8k.orig/Makefile.org 2009-07-19 11:32:41.000000000 +0200 -+++ openssl-0.9.8k/Makefile.org 2009-07-19 11:37:29.000000000 +0200 -@@ -152,7 +152,7 @@ - - MAKEFILE= Makefile - --MANDIR=$(OPENSSLDIR)/man -+MANDIR=/usr/share/man - MAN1=1 - MAN3=3 - MANSUFFIX= diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/man-section.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/man-section.patch deleted file mode 100644 index b74b12e..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/man-section.patch +++ /dev/null @@ -1,34 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/Makefile.org -=================================================================== ---- openssl-0.9.8k.orig/Makefile.org 2009-07-19 11:34:06.000000000 +0200 -+++ openssl-0.9.8k/Makefile.org 2009-07-19 11:37:21.000000000 +0200 -@@ -155,7 +155,8 @@ - MANDIR=/usr/share/man - MAN1=1 - MAN3=3 --MANSUFFIX= -+MANSUFFIX=ssl -+MANSECTION=SSL - SHELL=/bin/sh - - TOP= . -@@ -694,7 +695,7 @@ - echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ - (cd `$(PERL) util/dirname.pl $$i`; \ - sh -c "$$pod2man \ -- --section=$$sec --center=OpenSSL \ -+ --section=$${sec}$(MANSECTION) --center=OpenSSL \ - --release=$(VERSION) `basename $$i`") \ - > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ - $(PERL) util/extract-names.pl < $$i | \ -@@ -711,7 +712,7 @@ - echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ - (cd `$(PERL) util/dirname.pl $$i`; \ - sh -c "$$pod2man \ -- --section=$$sec --center=OpenSSL \ -+ --section=$${sec}$(MANSECTION) --center=OpenSSL \ - --release=$(VERSION) `basename $$i`") \ - > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ - $(PERL) util/extract-names.pl < $$i | \ diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/no-rpath.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/no-rpath.patch deleted file mode 100644 index 53b7614..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/no-rpath.patch +++ /dev/null @@ -1,15 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/Makefile.shared -=================================================================== ---- openssl-0.9.8k.orig/Makefile.shared 2008-09-17 17:56:40.000000000 +0200 -+++ openssl-0.9.8k/Makefile.shared 2009-07-19 11:37:25.000000000 +0200 -@@ -151,7 +151,7 @@ - NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ - SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX" - --DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)" -+DO_GNU_APP=LDFLAGS="$(CFLAGS)" - - #This is rather special. It's a special target with which one can link - #applications without bothering with any features that have anything to diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/no-symbolic.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/no-symbolic.patch deleted file mode 100644 index 87eadac..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/no-symbolic.patch +++ /dev/null @@ -1,15 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/Makefile.shared -=================================================================== ---- openssl-0.9.8k.orig/Makefile.shared 2009-07-19 11:35:02.000000000 +0200 -+++ openssl-0.9.8k/Makefile.shared 2009-07-19 11:35:48.000000000 +0200 -@@ -149,7 +149,7 @@ - SHLIB_SUFFIX=; \ - ALLSYMSFLAGS='-Wl,--whole-archive'; \ - NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ -- SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX" -+ SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX" - - DO_GNU_APP=LDFLAGS="$(CFLAGS)" - diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/perl-path.diff b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/perl-path.diff deleted file mode 100644 index ced45a3..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/perl-path.diff +++ /dev/null @@ -1,762 +0,0 @@ -Upstream-Status: Backport [debian] - -From: Kurt Roeckx <kurt@roeckx.be> -Subject: Change the perl path's to /usr/bin/perl - -This is the result of running: -perl util/perlpath.pl /usr/bin - -The upstream sources have this set to various different paths. - ---- openssl-0.9.8m.orig/Configure -+++ openssl-0.9.8m/Configure -@@ -1,4 +1,4 @@ --: -+#!/usr/bin/perl - eval 'exec perl -S $0 ${1+"$@"}' - if $running_under_some_shell; - ## ---- openssl-0.9.8m.orig/VMS/VMSify-conf.pl -+++ openssl-0.9.8m/VMS/VMSify-conf.pl -@@ -1,4 +1,4 @@ --#! /usr/bin/perl -+#!/usr/bin/perl - - use strict; - use warnings; ---- openssl-0.9.8m.orig/Netware/do_tests.pl -+++ openssl-0.9.8m/Netware/do_tests.pl -@@ -1,4 +1,4 @@ --# perl script to run OpenSSL tests -+#!/usr/bin/perl - - - my $base_path = "\\openssl"; ---- openssl-0.9.8m.orig/apps/progs.pl -+++ openssl-0.9.8m/apps/progs.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - print "/* apps/progs.h */\n"; - print "/* automatically generated by progs.pl for openssl.c */\n\n"; ---- openssl-0.9.8m.orig/os2/backwardify.pl -+++ openssl-0.9.8m/os2/backwardify.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/perl -w -+#!/usr/bin/perl - use strict; - - # Use as $0 ---- openssl-0.9.8m.orig/times/091/mips-rel.pl -+++ openssl-0.9.8m/times/091/mips-rel.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - &doit(100,"Pentium 100 32",0.0195,0.1000,0.6406,4.6100); # pentium-100 - &doit(200,"PPro 200 32",0.0070,0.0340,0.2087,1.4700); # pentium-100 ---- openssl-0.9.8m.orig/fips/mkfipsscr.pl -+++ openssl-0.9.8m/fips/mkfipsscr.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -w -+#!/usr/bin/perl - # Quick & dirty utility to generate a script for executing the - # FIPS 140-2 CMVP algorithm tests based on the pathnames of - # input algorithm test files actually present (the unqualified ---- openssl-0.9.8m.orig/fips/fipsalgtest.pl -+++ openssl-0.9.8m/fips/fipsalgtest.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/perl -w -+#!/usr/bin/perl - # Perl utility to run or verify FIPS 140-2 CMVP algorithm tests based on the - # pathnames of input algorithm test files actually present (the unqualified - # file names are consistent but the pathnames are not). ---- openssl-0.9.8m.orig/ms/uplink.pl -+++ openssl-0.9.8m/ms/uplink.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # - # For Microsoft CL this is implemented as inline assembler. So that - # even though this script can generate even Win32 code, we'll be ---- openssl-0.9.8m.orig/ms/segrenam.pl -+++ openssl-0.9.8m/ms/segrenam.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - - my $quiet = 1; - ---- openssl-0.9.8m.orig/ms/cmp.pl -+++ openssl-0.9.8m/ms/cmp.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - ($#ARGV == 1) || die "usage: cmp.pl <file1> <file2>\n"; - ---- openssl-0.9.8m.orig/test/cms-test.pl -+++ openssl-0.9.8m/test/cms-test.pl -@@ -1,4 +1,4 @@ --# test/cms-test.pl -+#!/usr/bin/perl - # Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL - # project. - # ---- openssl-0.9.8m.orig/test/cms-examples.pl -+++ openssl-0.9.8m/test/cms-examples.pl -@@ -1,4 +1,4 @@ --# test/cms-examples.pl -+#!/usr/bin/perl - # Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL - # project. - # ---- openssl-0.9.8m.orig/demos/b64.pl -+++ openssl-0.9.8m/demos/b64.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # - # Make PEM encoded data have lines of 64 bytes of data ---- openssl-0.9.8m.orig/demos/tunala/configure.in -+++ openssl-0.9.8m/demos/tunala/configure.in -@@ -1,4 +1,4 @@ --dnl Process this file with autoconf to produce a configure script. -+#!/usr/bin/perl - AC_INIT(tunala.c) - AM_CONFIG_HEADER(config.h) - AM_INIT_AUTOMAKE(tunala, 0.0.1-dev) ---- openssl-0.9.8m.orig/crypto/x86cpuid.pl -+++ openssl-0.9.8m/crypto/x86cpuid.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - - push(@INC,"perlasm"); - require "x86asm.pl"; ---- openssl-0.9.8m.orig/crypto/x86_64cpuid.pl -+++ openssl-0.9.8m/crypto/x86_64cpuid.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - - $output=shift; - $masm=1 if ($output =~ /\.asm/); ---- openssl-0.9.8m.orig/crypto/md5/asm/md5-586.pl -+++ openssl-0.9.8m/crypto/md5/asm/md5-586.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # Normal is the - # md5_block_x86(MD5_CTX *c, ULONG *X); ---- openssl-0.9.8m.orig/crypto/md5/asm/md5-x86_64.pl -+++ openssl-0.9.8m/crypto/md5/asm/md5-x86_64.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/perl -w -+#!/usr/bin/perl - # - # MD5 optimized for AMD64. - # ---- openssl-0.9.8m.orig/crypto/sha/asm/sha1-ia64.pl -+++ openssl-0.9.8m/crypto/sha/asm/sha1-ia64.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # - # ==================================================================== - # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL ---- openssl-0.9.8m.orig/crypto/sha/asm/sha1-x86_64.pl -+++ openssl-0.9.8m/crypto/sha/asm/sha1-x86_64.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # - # ==================================================================== - # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL ---- openssl-0.9.8m.orig/crypto/sha/asm/sha512-sse2.pl -+++ openssl-0.9.8m/crypto/sha/asm/sha512-sse2.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # - # ==================================================================== - # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL ---- openssl-0.9.8m.orig/crypto/sha/asm/sha512-ia64.pl -+++ openssl-0.9.8m/crypto/sha/asm/sha512-ia64.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # - # ==================================================================== - # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL ---- openssl-0.9.8m.orig/crypto/sha/asm/sha512-x86_64.pl -+++ openssl-0.9.8m/crypto/sha/asm/sha512-x86_64.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # - # ==================================================================== - # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL ---- openssl-0.9.8m.orig/crypto/sha/asm/sha1-586.pl -+++ openssl-0.9.8m/crypto/sha/asm/sha1-586.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - - # ==================================================================== - # [Re]written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL ---- openssl-0.9.8m.orig/crypto/des/asm/des-586.pl -+++ openssl-0.9.8m/crypto/des/asm/des-586.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # The inner loop instruction sequence and the IP/FP modifications are from - # Svend Olaf Mikkelsen <svolaf@inet.uni-c.dk> ---- openssl-0.9.8m.orig/crypto/des/asm/desboth.pl -+++ openssl-0.9.8m/crypto/des/asm/desboth.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - $L="edi"; - $R="esi"; ---- openssl-0.9.8m.orig/crypto/des/asm/des686.pl -+++ openssl-0.9.8m/crypto/des/asm/des686.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - $prog="des686.pl"; - ---- openssl-0.9.8m.orig/crypto/des/asm/crypt586.pl -+++ openssl-0.9.8m/crypto/des/asm/crypt586.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # The inner loop instruction sequence and the IP/FP modifications are from - # Svend Olaf Mikkelsen <svolaf@inet.uni-c.dk> ---- openssl-0.9.8m.orig/crypto/lhash/num.pl -+++ openssl-0.9.8m/crypto/lhash/num.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - #node 10 -> 4 - ---- openssl-0.9.8m.orig/crypto/ripemd/asm/rmd-586.pl -+++ openssl-0.9.8m/crypto/ripemd/asm/rmd-586.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # Normal is the - # ripemd160_block_asm_data_order(RIPEMD160_CTX *c, ULONG *X,int blocks); ---- openssl-0.9.8m.orig/crypto/rc4/asm/rc4-586.pl -+++ openssl-0.9.8m/crypto/rc4/asm/rc4-586.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # At some point it became apparent that the original SSLeay RC4 - # assembler implementation performs suboptimaly on latest IA-32 ---- openssl-0.9.8m.orig/crypto/rc4/asm/rc4-x86_64.pl -+++ openssl-0.9.8m/crypto/rc4/asm/rc4-x86_64.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # - # ==================================================================== - # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL ---- openssl-0.9.8m.orig/crypto/cast/asm/cast-586.pl -+++ openssl-0.9.8m/crypto/cast/asm/cast-586.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # define for pentium pro friendly version - $ppro=1; ---- openssl-0.9.8m.orig/crypto/rc5/asm/rc5-586.pl -+++ openssl-0.9.8m/crypto/rc5/asm/rc5-586.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - push(@INC,"perlasm","../../perlasm"); - require "x86asm.pl"; ---- openssl-0.9.8m.orig/crypto/perlasm/x86ms.pl -+++ openssl-0.9.8m/crypto/perlasm/x86ms.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - package x86ms; - ---- openssl-0.9.8m.orig/crypto/perlasm/x86asm.pl -+++ openssl-0.9.8m/crypto/perlasm/x86asm.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # require 'x86asm.pl'; - # &asm_init("cpp","des-586.pl"); ---- openssl-0.9.8m.orig/crypto/perlasm/x86nasm.pl -+++ openssl-0.9.8m/crypto/perlasm/x86nasm.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - package x86nasm; - ---- openssl-0.9.8m.orig/crypto/perlasm/x86unix.pl -+++ openssl-0.9.8m/crypto/perlasm/x86unix.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - package x86unix; # GAS actually... - ---- openssl-0.9.8m.orig/crypto/perlasm/cbc.pl -+++ openssl-0.9.8m/crypto/perlasm/cbc.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # void des_ncbc_encrypt(input, output, length, schedule, ivec, enc) - # des_cblock (*input); ---- openssl-0.9.8m.orig/crypto/perlasm/x86_64-xlate.pl -+++ openssl-0.9.8m/crypto/perlasm/x86_64-xlate.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - - # Ascetic x86_64 AT&T to MASM assembler translator by <appro>. - # ---- openssl-0.9.8m.orig/crypto/bf/asm/bf-686.pl -+++ openssl-0.9.8m/crypto/bf/asm/bf-686.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - push(@INC,"perlasm","../../perlasm"); - require "x86asm.pl"; ---- openssl-0.9.8m.orig/crypto/bf/asm/bf-586.pl -+++ openssl-0.9.8m/crypto/bf/asm/bf-586.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - push(@INC,"perlasm","../../perlasm"); - require "x86asm.pl"; ---- openssl-0.9.8m.orig/crypto/objects/objects.pl -+++ openssl-0.9.8m/crypto/objects/objects.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - open (NUMIN,"$ARGV[1]") || die "Can't open number file $ARGV[1]"; - $max_nid=0; ---- openssl-0.9.8m.orig/crypto/objects/obj_dat.pl -+++ openssl-0.9.8m/crypto/objects/obj_dat.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # fixes bug in floating point emulation on sparc64 when - # this script produces off-by-one output on sparc64 ---- openssl-0.9.8m.orig/crypto/conf/keysets.pl -+++ openssl-0.9.8m/crypto/conf/keysets.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - $NUMBER=0x01; - $UPPER=0x02; ---- openssl-0.9.8m.orig/crypto/bn/bn_prime.pl -+++ openssl-0.9.8m/crypto/bn/bn_prime.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # bn_prime.pl - - $num=2048; ---- openssl-0.9.8m.orig/crypto/bn/asm/x86.pl -+++ openssl-0.9.8m/crypto/bn/asm/x86.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - push(@INC,"perlasm","../../perlasm"); - require "x86asm.pl"; ---- openssl-0.9.8m.orig/crypto/bn/asm/ppc.pl -+++ openssl-0.9.8m/crypto/bn/asm/ppc.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # - # Implemented as a Perl wrapper as we want to support several different - # architectures with single file. We pick up the target based on the ---- openssl-0.9.8m.orig/crypto/bn/asm/co-586.pl -+++ openssl-0.9.8m/crypto/bn/asm/co-586.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - push(@INC,"perlasm","../../perlasm"); - require "x86asm.pl"; ---- openssl-0.9.8m.orig/crypto/bn/asm/bn-586.pl -+++ openssl-0.9.8m/crypto/bn/asm/bn-586.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - push(@INC,"perlasm","../../perlasm"); - require "x86asm.pl"; ---- openssl-0.9.8m.orig/crypto/bn/asm/mo-586.pl -+++ openssl-0.9.8m/crypto/bn/asm/mo-586.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - - # This is crypto/bn/asm/x86-mont.pl (with asciz from crypto/perlasm/x86asm.pl) - # from OpenSSL 0.9.9-dev ---- openssl-0.9.8m.orig/crypto/bn/asm/x86_64-mont.pl -+++ openssl-0.9.8m/crypto/bn/asm/x86_64-mont.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - - # ==================================================================== - # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL ---- openssl-0.9.8m.orig/crypto/bn/asm/x86/comba.pl -+++ openssl-0.9.8m/crypto/bn/asm/x86/comba.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # x86 assember - - sub mul_add_c ---- openssl-0.9.8m.orig/crypto/bn/asm/x86/add.pl -+++ openssl-0.9.8m/crypto/bn/asm/x86/add.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # x86 assember - - sub bn_add_words ---- openssl-0.9.8m.orig/crypto/bn/asm/x86/mul.pl -+++ openssl-0.9.8m/crypto/bn/asm/x86/mul.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # x86 assember - - sub bn_mul_words ---- openssl-0.9.8m.orig/crypto/bn/asm/x86/mul_add.pl -+++ openssl-0.9.8m/crypto/bn/asm/x86/mul_add.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # x86 assember - - sub bn_mul_add_words ---- openssl-0.9.8m.orig/crypto/bn/asm/x86/sqr.pl -+++ openssl-0.9.8m/crypto/bn/asm/x86/sqr.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # x86 assember - - sub bn_sqr_words ---- openssl-0.9.8m.orig/crypto/bn/asm/x86/sub.pl -+++ openssl-0.9.8m/crypto/bn/asm/x86/sub.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # x86 assember - - sub bn_sub_words ---- openssl-0.9.8m.orig/crypto/bn/asm/x86/div.pl -+++ openssl-0.9.8m/crypto/bn/asm/x86/div.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # x86 assember - - sub bn_div_words ---- openssl-0.9.8m.orig/crypto/aes/asm/aes-586.pl -+++ openssl-0.9.8m/crypto/aes/asm/aes-586.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # - # ==================================================================== - # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL ---- openssl-0.9.8m.orig/crypto/aes/asm/aes-x86_64.pl -+++ openssl-0.9.8m/crypto/aes/asm/aes-x86_64.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # - # ==================================================================== - # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL ---- openssl-0.9.8m.orig/crypto/asn1/charmap.pl -+++ openssl-0.9.8m/crypto/asn1/charmap.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -w -+#!/usr/bin/perl - - use strict; - ---- openssl-0.9.8m.orig/util/mksdef.pl -+++ openssl-0.9.8m/util/mksdef.pl -@@ -1,4 +1,4 @@ -- -+#!/usr/bin/perl - # Perl script to split libeay32.def into two distinct DEF files for use in - # fipdso mode. It works out symbols in each case by running "link" command and - # parsing the output to find the list of missing symbols then splitting ---- openssl-0.9.8m.orig/util/dirname.pl -+++ openssl-0.9.8m/util/dirname.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - if ($#ARGV < 0) { - die "dirname.pl: too few arguments\n"; ---- openssl-0.9.8m.orig/util/tab_num.pl -+++ openssl-0.9.8m/util/tab_num.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - $num=1; - $width=40; ---- openssl-0.9.8m.orig/util/sp-diff.pl -+++ openssl-0.9.8m/util/sp-diff.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # This file takes as input, the files that have been output from - # ssleay speed. ---- openssl-0.9.8m.orig/util/mkerr.pl -+++ openssl-0.9.8m/util/mkerr.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -w -+#!/usr/bin/perl - - my $config = "crypto/err/openssl.ec"; - my $debug = 0; ---- openssl-0.9.8m.orig/util/clean-depend.pl -+++ openssl-0.9.8m/util/clean-depend.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -w -+#!/usr/bin/perl - # Clean the dependency list in a makefile of standard includes... - # Written by Ben Laurie <ben@algroup.co.uk> 19 Jan 1999 - ---- openssl-0.9.8m.orig/util/add_cr.pl -+++ openssl-0.9.8m/util/add_cr.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # This adds a copyright message to a souce code file. - # It also gets the file name correct. ---- openssl-0.9.8m.orig/util/pod2man.pl -+++ openssl-0.9.8m/util/pod2man.pl -@@ -1,4 +1,4 @@ --: #!/usr/bin/perl-5.005 -+#!/usr/bin/perl - eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' - if $running_under_some_shell; - ---- openssl-0.9.8m.orig/util/mkstack.pl -+++ openssl-0.9.8m/util/mkstack.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -w -+#!/usr/bin/perl - - # This is a utility that searches out "DECLARE_STACK_OF()" - # declarations in .h and .c files, and updates/creates/replaces ---- openssl-0.9.8m.orig/util/selftest.pl -+++ openssl-0.9.8m/util/selftest.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -w -+#!/usr/bin/perl - # - # Run the test suite and generate a report - # ---- openssl-0.9.8m.orig/util/ck_errf.pl -+++ openssl-0.9.8m/util/ck_errf.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # This is just a quick script to scan for cases where the 'error' - # function name in a XXXerr() macro is wrong. ---- openssl-0.9.8m.orig/util/mklink.pl -+++ openssl-0.9.8m/util/mklink.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # mklink.pl - ---- openssl-0.9.8m.orig/util/src-dep.pl -+++ openssl-0.9.8m/util/src-dep.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # we make up an array of - # $file{function_name}=filename; ---- openssl-0.9.8m.orig/util/deleof.pl -+++ openssl-0.9.8m/util/deleof.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - while (<>) - { ---- openssl-0.9.8m.orig/util/arx.pl -+++ openssl-0.9.8m/util/arx.pl -@@ -1,4 +1,4 @@ --#!/bin/perl -+#!/usr/bin/perl - - # Simple perl script to wrap round "ar" program and exclude any - # object files in the environment variable EXCL_OBJ ---- openssl-0.9.8m.orig/util/copy.pl -+++ openssl-0.9.8m/util/copy.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - use Fcntl; - ---- openssl-0.9.8m.orig/util/mkdir-p.pl -+++ openssl-0.9.8m/util/mkdir-p.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - - # mkdir-p.pl - ---- openssl-0.9.8m.orig/util/mkdef.pl -+++ openssl-0.9.8m/util/mkdef.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -w -+#!/usr/bin/perl - # - # generate a .def file - # ---- openssl-0.9.8m.orig/util/files.pl -+++ openssl-0.9.8m/util/files.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # used to generate the file MINFO for use by util/mk1mf.pl - # It is basically a list of all variables from the passed makefile ---- openssl-0.9.8m.orig/util/mkfiles.pl -+++ openssl-0.9.8m/util/mkfiles.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # This is a hacked version of files.pl for systems that can't do a 'make files'. - # Do a perl util/mkminfo.pl >MINFO to build MINFO ---- openssl-0.9.8m.orig/util/perlpath.pl -+++ openssl-0.9.8m/util/perlpath.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # modify the '#!/usr/local/bin/perl' - # line in all scripts that rely on perl. ---- openssl-0.9.8m.orig/util/mk1mf.pl -+++ openssl-0.9.8m/util/mk1mf.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # A bit of an evil hack but it post processes the file ../MINFO which - # is generated by `make files` in the top directory. - # This script outputs one mega makefile that has no shell stuff or any ---- openssl-0.9.8m.orig/util/err-ins.pl -+++ openssl-0.9.8m/util/err-ins.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # tack error codes onto the end of a file - # ---- openssl-0.9.8m.orig/util/pl/Mingw32.pl -+++ openssl-0.9.8m/util/pl/Mingw32.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # Mingw32.pl -- Mingw - # ---- openssl-0.9.8m.orig/util/pl/unix.pl -+++ openssl-0.9.8m/util/pl/unix.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # unix.pl - the standard unix makefile stuff. - # ---- openssl-0.9.8m.orig/util/pl/netware.pl -+++ openssl-0.9.8m/util/pl/netware.pl -@@ -1,4 +1,4 @@ --# Metrowerks Codewarrior or gcc / nlmconv for NetWare -+#!/usr/bin/perl - # - - $version_header = "crypto/opensslv.h"; ---- openssl-0.9.8m.orig/util/pl/VC-32.pl -+++ openssl-0.9.8m/util/pl/VC-32.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # VC-32.pl - unified script for Microsoft Visual C++, covering Win32, - # Win64 and WinCE [follow $FLAVOR variable to trace the differences]. - # ---- openssl-0.9.8m.orig/util/pl/OS2-EMX.pl -+++ openssl-0.9.8m/util/pl/OS2-EMX.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # OS2-EMX.pl - for EMX GCC on OS/2 - # ---- openssl-0.9.8m.orig/util/pl/ultrix.pl -+++ openssl-0.9.8m/util/pl/ultrix.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # linux.pl - the standard unix makefile stuff. - # ---- openssl-0.9.8m.orig/util/pl/linux.pl -+++ openssl-0.9.8m/util/pl/linux.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # - # linux.pl - the standard unix makefile stuff. - # ---- openssl-0.9.8m.orig/util/pl/BC-32.pl -+++ openssl-0.9.8m/util/pl/BC-32.pl -@@ -1,4 +1,4 @@ --#!/usr/local/bin/perl -+#!/usr/bin/perl - # Borland C++ builder 3 and 4 -- Janez Jere <jj@void.si> - # - diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/pic.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/pic.patch deleted file mode 100644 index 5fc8f65..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/pic.patch +++ /dev/null @@ -1,303 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8o/crypto/Makefile -=================================================================== ---- openssl-0.9.8o.orig/crypto/Makefile 2008-09-17 17:10:55.000000000 +0000 -+++ openssl-0.9.8o/crypto/Makefile 2010-06-06 13:09:28.000000000 +0000 -@@ -57,7 +57,7 @@ - echo " #define DATE \"`LC_ALL=C LC_TIME=C date`\""; \ - echo '#endif' ) >buildinf.h - --x86cpuid-elf.s: x86cpuid.pl perlasm/x86asm.pl -+x86cpuid-elf.S: x86cpuid.pl perlasm/x86asm.pl - $(PERL) x86cpuid.pl elf $(CFLAGS) $(PROCESSOR) > $@ - x86cpuid-cof.s: x86cpuid.pl perlasm/x86asm.pl - $(PERL) x86cpuid.pl coff $(CFLAGS) $(PROCESSOR) > $@ -@@ -70,7 +70,7 @@ - uplink-cof.s: ../ms/uplink.pl - $(PERL) ../ms/uplink.pl coff > $@ - --x86_64cpuid.s: x86_64cpuid.pl -+x86_64cpuid.S: x86_64cpuid.pl - $(PERL) x86_64cpuid.pl $@ - ia64cpuid.s: ia64cpuid.S - $(CC) $(CFLAGS) -E ia64cpuid.S > $@ -Index: openssl-0.9.8o/crypto/x86_64cpuid.pl -=================================================================== ---- openssl-0.9.8o.orig/crypto/x86_64cpuid.pl 2007-11-11 16:25:00.000000000 +0000 -+++ openssl-0.9.8o/crypto/x86_64cpuid.pl 2010-06-06 13:09:28.000000000 +0000 -@@ -95,7 +95,11 @@ - .size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu - - .section .init -+#ifdef OPENSSL_PIC -+ call OPENSSL_cpuid_setup\@PLT -+#else - call OPENSSL_cpuid_setup -+#endif - - ___ - -Index: openssl-0.9.8o/crypto/md5/Makefile -=================================================================== ---- openssl-0.9.8o.orig/crypto/md5/Makefile 2008-09-17 17:11:02.000000000 +0000 -+++ openssl-0.9.8o/crypto/md5/Makefile 2010-06-06 13:09:28.000000000 +0000 -@@ -52,7 +52,8 @@ - mx86-out.s: asm/md5-586.pl ../perlasm/x86asm.pl - (cd asm; $(PERL) md5-586.pl a.out $(CFLAGS) > ../$@) - --md5-x86_64.s: asm/md5-x86_64.pl; $(PERL) asm/md5-x86_64.pl $@ -+md5-x86_64.s: asm/md5-x86_64.pl -+ $(PERL) asm/md5-x86_64.pl $@ - - files: - $(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO -Index: openssl-0.9.8o/crypto/des/asm/desboth.pl -=================================================================== ---- openssl-0.9.8o.orig/crypto/des/asm/desboth.pl 2001-10-24 21:20:56.000000000 +0000 -+++ openssl-0.9.8o/crypto/des/asm/desboth.pl 2010-06-06 13:09:28.000000000 +0000 -@@ -16,6 +16,11 @@ - - &push("edi"); - -+ &call (&label("pic_point0")); -+ &set_label("pic_point0"); -+ &blindpop("ebp"); -+ &add ("ebp", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point0") . "]"); -+ - &comment(""); - &comment("Load the data words"); - &mov($L,&DWP(0,"ebx","",0)); -@@ -47,15 +52,21 @@ - &mov(&swtmp(2), (DWC(($enc)?"1":"0"))); - &mov(&swtmp(1), "eax"); - &mov(&swtmp(0), "ebx"); -- &call("DES_encrypt2"); -+ &exch("ebx", "ebp"); -+ &call("DES_encrypt2\@PLT"); -+ &exch("ebx", "ebp"); - &mov(&swtmp(2), (DWC(($enc)?"0":"1"))); - &mov(&swtmp(1), "edi"); - &mov(&swtmp(0), "ebx"); -- &call("DES_encrypt2"); -+ &exch("ebx", "ebp"); -+ &call("DES_encrypt2\@PLT"); -+ &exch("ebx", "ebp"); - &mov(&swtmp(2), (DWC(($enc)?"1":"0"))); - &mov(&swtmp(1), "esi"); - &mov(&swtmp(0), "ebx"); -- &call("DES_encrypt2"); -+ &exch("ebx", "ebp"); -+ &call("DES_encrypt2\@PLT"); -+ &exch("ebx", "ebp"); - - &stack_pop(3); - &mov($L,&DWP(0,"ebx","",0)); -Index: openssl-0.9.8o/crypto/rc4/Makefile -=================================================================== ---- openssl-0.9.8o.orig/crypto/rc4/Makefile 2008-11-19 16:03:50.000000000 +0000 -+++ openssl-0.9.8o/crypto/rc4/Makefile 2010-06-06 13:09:28.000000000 +0000 -@@ -51,7 +51,7 @@ - rx86-out.s: asm/rc4-586.pl ../perlasm/x86asm.pl - (cd asm; $(PERL) rc4-586.pl a.out $(CFLAGS) > ../$@) - --rc4-x86_64.s: asm/rc4-x86_64.pl; $(PERL) asm/rc4-x86_64.pl $@ -+rc4-x86_64.S: asm/rc4-x86_64.pl; $(PERL) asm/rc4-x86_64.pl $@ - - rc4-ia64.s: asm/rc4-ia64.S - @case `awk '/^#define RC4_INT/{print$$NF}' $(TOP)/include/openssl/opensslconf.h` in \ -Index: openssl-0.9.8o/crypto/rc4/asm/rc4-x86_64.pl -=================================================================== ---- openssl-0.9.8o.orig/crypto/rc4/asm/rc4-x86_64.pl 2008-09-16 10:47:27.000000000 +0000 -+++ openssl-0.9.8o/crypto/rc4/asm/rc4-x86_64.pl 2010-06-06 13:09:28.000000000 +0000 -@@ -270,7 +270,11 @@ - xor %r10,%r10 - xor %r11,%r11 - -+#ifdef OPENSSL_PIC -+ mov OPENSSL_ia32cap_P\@GOTPCREL(%rip),$idx#d -+#else - mov OPENSSL_ia32cap_P(%rip),$idx#d -+#endif - bt \$20,$idx#d - jnc .Lw1stloop - bt \$30,$idx#d -@@ -338,7 +342,11 @@ - RC4_options: - .picmeup %rax - lea .Lopts-.(%rax),%rax -+#ifdef OPENSSL_PIC -+ mov OPENSSL_ia32cap_P\@GOTPCREL(%rip),%edx -+#else - mov OPENSSL_ia32cap_P(%rip),%edx -+#endif - bt \$20,%edx - jnc .Ldone - add \$12,%rax -Index: openssl-0.9.8o/crypto/perlasm/x86unix.pl -=================================================================== ---- openssl-0.9.8o.orig/crypto/perlasm/x86unix.pl 2008-05-01 23:11:32.000000000 +0000 -+++ openssl-0.9.8o/crypto/perlasm/x86unix.pl 2010-06-06 13:09:28.000000000 +0000 -@@ -400,6 +400,29 @@ - $stack=4; - } - -+sub main'function_begin_B_static -+ { -+ local($func,$extra)=@_; -+ -+ &main'external_label($func); -+ $func=$under.$func; -+ -+ local($tmp)=<<"EOF"; -+.text -+EOF -+ push(@out,$tmp); -+ if ($main'cpp) -+ { push(@out,"TYPE($func,\@function)\n"); } -+ elsif ($main'coff) -+ { $tmp=push(@out,".def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); } -+ elsif ($main'aout and !$main'pic) -+ { } -+ else { push(@out,".type $func,\@function\n"); } -+ push(@out,".align\t$align\n"); -+ push(@out,"$func:\n"); -+ $stack=4; -+ } -+ - sub main'function_end - { - local($func)=@_; -@@ -694,7 +717,17 @@ - { - $tmp=<<___; - .section .init -+#ifdef OPENSSL_PIC -+ pushl %ebx -+ call .pic_point0 -+.pic_point0: -+ popl %ebx -+ addl \$_GLOBAL_OFFSET_TABLE_+[.-.pic_point0],%ebx -+ call $under$f\@PLT -+ popl %ebx -+#else - call $under$f -+#endif - jmp .Linitalign - .align $align - .Linitalign: -Index: openssl-0.9.8o/crypto/perlasm/cbc.pl -=================================================================== ---- openssl-0.9.8o.orig/crypto/perlasm/cbc.pl 2005-05-09 21:48:00.000000000 +0000 -+++ openssl-0.9.8o/crypto/perlasm/cbc.pl 2010-06-06 13:09:28.000000000 +0000 -@@ -122,7 +122,11 @@ - &mov(&DWP($data_off,"esp","",0), "eax"); # put in array for call - &mov(&DWP($data_off+4,"esp","",0), "ebx"); # - -- &call($enc_func); -+ &call (&label("pic_point0")); -+ &set_label("pic_point0"); -+ &blindpop("ebx"); -+ &add ("ebx", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point0") . "]"); -+ &call("$enc_func\@PLT"); - - &mov("eax", &DWP($data_off,"esp","",0)); - &mov("ebx", &DWP($data_off+4,"esp","",0)); -@@ -187,7 +191,11 @@ - &mov(&DWP($data_off,"esp","",0), "eax"); # put in array for call - &mov(&DWP($data_off+4,"esp","",0), "ebx"); # - -- &call($enc_func); -+ &call (&label("pic_point1")); -+ &set_label("pic_point1"); -+ &blindpop("ebx"); -+ &add ("ebx", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point1") . "]"); -+ &call("$enc_func\@PLT"); - - &mov("eax", &DWP($data_off,"esp","",0)); - &mov("ebx", &DWP($data_off+4,"esp","",0)); -@@ -220,7 +228,11 @@ - &mov(&DWP($data_off,"esp","",0), "eax"); # put back - &mov(&DWP($data_off+4,"esp","",0), "ebx"); # - -- &call($dec_func); -+ &call (&label("pic_point2")); -+ &set_label("pic_point2"); -+ &blindpop("ebx"); -+ &add ("ebx", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point2") . "]"); -+ &call("$dec_func\@PLT"); - - &mov("eax", &DWP($data_off,"esp","",0)); # get return - &mov("ebx", &DWP($data_off+4,"esp","",0)); # -@@ -263,7 +275,11 @@ - &mov(&DWP($data_off,"esp","",0), "eax"); # put back - &mov(&DWP($data_off+4,"esp","",0), "ebx"); # - -- &call($dec_func); -+ &call (&label("pic_point3")); -+ &set_label("pic_point3"); -+ &blindpop("ebx"); -+ &add ("ebx", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point3") . "]"); -+ &call("$dec_func\@PLT"); - - &mov("eax", &DWP($data_off,"esp","",0)); # get return - &mov("ebx", &DWP($data_off+4,"esp","",0)); # -Index: openssl-0.9.8o/crypto/perlasm/x86_64-xlate.pl -=================================================================== ---- openssl-0.9.8o.orig/crypto/perlasm/x86_64-xlate.pl 2010-06-06 13:09:00.000000000 +0000 -+++ openssl-0.9.8o/crypto/perlasm/x86_64-xlate.pl 2010-06-06 13:09:28.000000000 +0000 -@@ -435,7 +435,7 @@ - - chomp($line); - -- $line =~ s|[#!].*$||; # get rid of asm-style comments... -+# $line =~ s|[#!].*$||; # get rid of asm-style comments... - $line =~ s|/\*.*\*/||; # ... and C-style comments... - $line =~ s|^\s+||; # ... and skip white spaces in beginning - -Index: openssl-0.9.8o/crypto/aes/asm/aes-586.pl -=================================================================== ---- openssl-0.9.8o.orig/crypto/aes/asm/aes-586.pl 2008-12-17 14:14:51.000000000 +0000 -+++ openssl-0.9.8o/crypto/aes/asm/aes-586.pl 2010-06-06 13:09:28.000000000 +0000 -@@ -250,7 +250,7 @@ - sub _data_word() { my $i; while(defined($i=shift)) { &data_word($i,$i); } } - - &public_label("AES_Te"); --&function_begin_B("_x86_AES_encrypt"); -+&function_begin_B_static("_x86_AES_encrypt"); - if ($vertical_spin) { - # I need high parts of volatile registers to be accessible... - &exch ($s1="edi",$key="ebx"); -@@ -539,7 +539,7 @@ - } - - &public_label("AES_Td"); --&function_begin_B("_x86_AES_decrypt"); -+&function_begin_B_static("_x86_AES_decrypt"); - # note that caller is expected to allocate stack frame for me! - &mov (&DWP(12,"esp"),$key); # save key - -@@ -1461,15 +1461,22 @@ - &public_label("AES_Td"); - &public_label("AES_Te"); - &function_begin_B("AES_set_decrypt_key"); -+ &push ("ebx"); - &mov ("eax",&wparam(0)); - &mov ("ecx",&wparam(1)); - &mov ("edx",&wparam(2)); - &sub ("esp",12); -+ -+ &call (&label("pic_point0")); -+ &set_label("pic_point0"); -+ &blindpop("ebx"); -+ &add ("ebx", "\$_GLOBAL_OFFSET_TABLE_+[.-" . &label("pic_point0") . "]"); - &mov (&DWP(0,"esp"),"eax"); - &mov (&DWP(4,"esp"),"ecx"); - &mov (&DWP(8,"esp"),"edx"); -- &call ("AES_set_encrypt_key"); -+ &call ("AES_set_encrypt_key\@PLT"); - &add ("esp",12); -+ &pop ("ebx"); - &cmp ("eax",0); - &je (&label("proceed")); - &ret (); diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/pkg-config.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/pkg-config.patch deleted file mode 100644 index 46c6f03..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/pkg-config.patch +++ /dev/null @@ -1,36 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/Makefile.org -=================================================================== ---- openssl-0.9.8k.orig/Makefile.org 2009-07-19 11:34:56.000000000 +0200 -+++ openssl-0.9.8k/Makefile.org 2009-07-19 11:36:02.000000000 +0200 -@@ -444,7 +444,8 @@ - echo 'Description: OpenSSL cryptography library'; \ - echo 'Version: '$(VERSION); \ - echo 'Requires: '; \ -- echo 'Libs: -L$${libdir} -lcrypto $(EX_LIBS)'; \ -+ echo 'Libs: -L$${libdir} -lcrypto'; \ -+ echo 'Libs.private: $(EX_LIBS)'; \ - echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libcrypto.pc - - libssl.pc: Makefile -@@ -457,7 +458,8 @@ - echo 'Description: Secure Sockets Layer and cryptography libraries'; \ - echo 'Version: '$(VERSION); \ - echo 'Requires: '; \ -- echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \ -+ echo 'Libs: -L$${libdir} -lssl'; \ -+ echo 'Libs.private: -lcrypto $(EX_LIBS)'; \ - echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libssl.pc - - openssl.pc: Makefile -@@ -470,7 +472,8 @@ - echo 'Description: Secure Sockets Layer and cryptography libraries and tools'; \ - echo 'Version: '$(VERSION); \ - echo 'Requires: '; \ -- echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \ -+ echo 'Libs: -L$${libdir} -lssl -lcrypto'; \ -+ echo 'Libs.private: $(EX_LIBS)'; \ - echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > openssl.pc - - Makefile: Makefile.org Configure config diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rc4-amd64.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rc4-amd64.patch deleted file mode 100644 index f57fbc9..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rc4-amd64.patch +++ /dev/null @@ -1,16 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/Configure -=================================================================== ---- openssl-0.9.8k.orig/Configure 2009-07-19 11:32:41.000000000 +0200 -+++ openssl-0.9.8k/Configure 2009-07-19 11:37:10.000000000 +0200 -@@ -128,6 +128,9 @@ - my $x86_out_asm="x86cpuid-out.o:bn86-out.o co86-out.o MAYBE-MO86-out.o:dx86-out.o yx86-out.o:ax86-out.o:bx86-out.o:mx86-out.o:sx86-out.o s512sse2-out.o:cx86-out.o:rx86-out.o rc4_skey.o:rm86-out.o:r586-out.o"; - - my $x86_64_asm="x86_64cpuid.o:x86_64-gcc.o x86_64-mont.o::aes-x86_64.o::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o::rc4-x86_64.o::"; -+# rc4 asm is disabled on amd64 because we configured it with RC4_CHAR while -+# the assembler only works with int -+my $x86_64_asm_linux="x86_64cpuid.o:x86_64-gcc.o x86_64-mont.o::aes-x86_64.o::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o::::"; - my $ia64_asm=":bn-ia64.o::aes_core.o aes_cbc.o aes-ia64.o:::sha1-ia64.o sha256-ia64.o sha512-ia64.o::rc4-ia64.o rc4_skey.o::"; - - my $no_asm="::::::::::"; diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rehash-crt.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rehash-crt.patch deleted file mode 100644 index d9d6b70..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rehash-crt.patch +++ /dev/null @@ -1,35 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/tools/c_rehash.in -=================================================================== ---- openssl-0.9.8k.orig/tools/c_rehash.in 2002-10-11 22:31:27.000000000 +0200 -+++ openssl-0.9.8k/tools/c_rehash.in 2009-07-19 11:36:26.000000000 +0200 -@@ -59,12 +59,15 @@ - } - } - closedir DIR; -- FILE: foreach $fname (grep {/\.pem$/} @flist) { -+ FILE: foreach $fname (grep {/\.pem$|\.crt$/} @flist) { - # Check to see if certificates and/or CRLs present. - my ($cert, $crl) = check_file($fname); - if(!$cert && !$crl) { -- print STDERR "WARNING: $fname does not contain a certificate or CRL: skipping\n"; -- next; -+ ($cert, $crl) = check_file("$openssl x509 -in \"$fname\" -inform der -outform pem | "); -+ if(!$cert && !$crl) { -+ print STDERR "WARNING: $fname does not contain a certificate or CRL: skipping\n"; -+ next; -+ } - } - link_hash_cert($fname) if($cert); - link_hash_crl($fname) if($crl); -@@ -102,6 +105,9 @@ - my $fname = $_[0]; - $fname =~ s/'/'\\''/g; - my ($hash, $fprint) = `"$openssl" x509 -hash -fingerprint -noout -in '$fname'`; -+ if(!$hash || !fprint) { -+ ($hash, $fprint) = `"$openssl" x509 -hash -fingerprint -noout -in '$fname' -inform der`; -+ } - chomp $hash; - chomp $fprint; - $fprint =~ s/^.*=//; diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rehash_pod.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rehash_pod.patch deleted file mode 100644 index 3426ba8..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/rehash_pod.patch +++ /dev/null @@ -1,62 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/doc/apps/c_rehash.pod -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ openssl-0.9.8k/doc/apps/c_rehash.pod 2009-07-19 11:36:27.000000000 +0200 -@@ -0,0 +1,55 @@ -+ -+=pod -+ -+=head1 NAME -+ -+c_rehash - Create symbolic links to files named by the hash values -+ -+=head1 SYNOPSIS -+ -+B<c_rehash> -+[directory] ... -+ -+=head1 DESCRIPTION -+ -+c_rehash scans directories and takes a hash value of each .pem and .crt file in the directory. It then creates symbolic links for each of the files named by the hash value. This is useful as many programs require directories to be set up like this in order to find the certificates they require. -+ -+If any directories are named on the command line then these directories are processed in turn. If not then and the environment variable SSL_CERT_DIR is defined then that is consulted. This variable should be a colon (:) separated list of directories, all of which will be processed. If neither of these conditions are true then /usr/lib/ssl/certs is processed. -+ -+For each directory that is to be processed he user must have write permissions on the directory, if they do not then nothing will be printed for that directory. -+ -+Note that this program deletes all the symbolic links that look like ones that it creates before processing a directory. Beware that if you run the program on a directory that contains symbolic links for other purposes that are named in the same format as those created by this program they will be lost. -+ -+The hashes for certificate files are of the form <hash>.<n> where n is an integer. If the hash value already exists then n will be incremented, unless the file is a duplicate. Duplicates are detected using the fingerprint of the certificate. A warning will be printed if a duplicate is detected. The hashes for CRL files are of the form <hash>.r<n> and have the same behavior. -+ -+The program will also warn if there are files with extension .pem which are not certificate or CRL files. -+ -+The program uses the openssl program to compute the hashes and fingerprints. It expects the executable to be named openssl and be on the PATH, or in the /usr/lib/ssl/bin directory. If the OPENSSL environment variable is defined then this is used instead as the executable that provides the hashes and fingerprints. When called as $OPENSSL x509 -hash -fingerprint -noout -in $file it must output the hash of $file on the first line followed by the fingerprint on the second line, optionally prefixed with some text and an equals sign (=). -+ -+=head1 OPTIONS -+ -+None -+ -+=head1 ENVIRONMENT -+ -+=over 4 -+ -+=item B<OPENSSL> -+ -+The name (and path) of an executable to use to generate hashes and fingerprints (see above). -+ -+=item B<SSL_CERT_DIR> -+ -+Colon separated list of directories to operate on. Ignored if directories are listed on the command line. -+ -+=head1 SEE ALSO -+ -+L<openssl(1)|openssl(1)>, L<x509(1)|x509(1)> -+ -+=back -+ -+=head1 BUGS -+ -+No known bugs -+ -+=cut diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/series b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/series deleted file mode 100644 index b764c04..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/series +++ /dev/null @@ -1,20 +0,0 @@ -ca.patch -config-hurd.patch -debian-targets.patch -engines-path.patch -kfreebsd-pipe.patch -make-targets.patch -man-dir.patch -man-section.patch -no-rpath.patch -no-symbolic.patch -pic.patch -pkg-config.patch -valgrind.patch -rc4-amd64.patch -rehash-crt.patch -rehash_pod.patch -shared-lib-ext.patch -stddef.patch -version-script.patch -perl-path.diff diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/shared-lib-ext.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/shared-lib-ext.patch deleted file mode 100644 index 79eb39f..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/shared-lib-ext.patch +++ /dev/null @@ -1,16 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/Configure -=================================================================== ---- openssl-0.9.8k.orig/Configure 2009-07-19 11:36:24.000000000 +0200 -+++ openssl-0.9.8k/Configure 2009-07-19 11:37:03.000000000 +0200 -@@ -1568,7 +1568,8 @@ - elsif ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/) - { - my $sotmp = $1; -- s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/; -+# s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/; -+ s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp/; - } - elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.[^\.]*\.dylib$/) - { diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/stddef.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/stddef.patch deleted file mode 100644 index 3436b29..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/stddef.patch +++ /dev/null @@ -1,14 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8k/crypto/sha/sha.h -=================================================================== ---- openssl-0.9.8k.orig/crypto/sha/sha.h 2008-09-16 12:47:28.000000000 +0200 -+++ openssl-0.9.8k/crypto/sha/sha.h 2009-07-19 11:36:28.000000000 +0200 -@@ -59,6 +59,7 @@ - #ifndef HEADER_SHA_H - #define HEADER_SHA_H - -+#include <stddef.h> - #include <openssl/e_os2.h> - #include <stddef.h> - diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/version-script.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/version-script.patch deleted file mode 100644 index 6fa3d75..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/debian/version-script.patch +++ /dev/null @@ -1,35 +0,0 @@ -Upstream-Status: Backport [debian] - -Index: openssl-0.9.8m/Configure -=================================================================== ---- openssl-0.9.8m.orig/Configure 2010-02-27 12:28:32.000000000 +0100 -+++ openssl-0.9.8m/Configure 2010-02-27 12:28:35.000000000 +0100 -@@ -1512,6 +1512,8 @@ - } - } - -+$shared_ldflag .= " -Wl,--version-script=openssl.ld"; -+ - open(IN,'<Makefile.org') || die "unable to read Makefile.org:$!\n"; - unlink("$Makefile.new") || die "unable to remove old $Makefile.new:$!\n" if -e "$Makefile.new"; - open(OUT,">$Makefile.new") || die "unable to create $Makefile.new:$!\n"; -Index: openssl-0.9.8m/openssl.ld -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ openssl-0.9.8m/openssl.ld 2010-02-27 12:28:35.000000000 +0100 -@@ -0,0 +1,5 @@ -+OPENSSL_0.9.8 { -+ global: -+ *; -+}; -+ -Index: openssl-0.9.8m/engines/openssl.ld -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ openssl-0.9.8m/engines/openssl.ld 2010-02-27 12:28:35.000000000 +0100 -@@ -0,0 +1,5 @@ -+OPENSSL_0.9.8 { -+ global: -+ *; -+}; -+ diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/parallel-make-fix.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/parallel-make-fix.patch deleted file mode 100644 index 82857f5..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/parallel-make-fix.patch +++ /dev/null @@ -1,20 +0,0 @@ -Upstream-Status: Submitted - -fix the parallel build regarding shared libraries. - -Signed-off-by: Qing He <qing.he@intel.com> - -diff --git a/Makefile.org b/Makefile.org -index 2fb0309..8bec3d0 100644 ---- a/Makefile.org -+++ b/Makefile.org -@@ -352,6 +352,9 @@ all_testapps: build_libs build_testapps - build_testapps: - @dir=crypto; target=testapps; $(BUILD_ONE_CMD) - -+libcrypto.a: build_crypto -+libssl.a: build_ssl -+ - build_shared: $(SHARED_LIBS) - libcrypto$(SHLIB_EXT): libcrypto.a $(SHARED_FIPS) - @if [ "$(SHLIB_TARGET)" != "" ]; then \ diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/shared-libs.patch b/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/shared-libs.patch deleted file mode 100644 index 19de112..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl-0.9.8x/shared-libs.patch +++ /dev/null @@ -1,50 +0,0 @@ -Upstream-Status: Inappropriate [configuration] - -diff --git a/Makefile.org b/Makefile.org -index e87d623..25ff367 100644 ---- a/Makefile.org -+++ b/Makefile.org -@@ -355,7 +355,7 @@ libcrypto$(SHLIB_EXT): libcrypto.a $(SHARED_FIPS) - @if [ "$(SHLIB_TARGET)" != "" ]; then \ - if [ "$(FIPSCANLIB)" = "libfips" ]; then \ - $(ARD) libcrypto.a fipscanister.o ; \ -- $(MAKE) SHLIBDIRS='crypto' SHLIBDEPS='-lfips' build-shared; \ -+ $(MAKE) -e SHLIBDIRS='crypto' SHLIBDEPS='-lfips' build-shared; \ - $(AR) libcrypto.a fips/fipscanister.o ; \ - else \ - if [ "$(FIPSCANLIB)" = "libcrypto" ]; then \ -@@ -373,7 +373,7 @@ libssl$(SHLIB_EXT): libcrypto$(SHLIB_EXT) libssl.a - @if [ "$(SHLIB_TARGET)" != "" ]; then \ - shlibdeps=-lcrypto; \ - [ "$(FIPSCANLIB)" = "libfips" ] && shlibdeps="$$shlibdeps -lfips"; \ -- $(MAKE) SHLIBDIRS=ssl SHLIBDEPS="$$shlibdeps" build-shared; \ -+ $(MAKE) -e SHLIBDIRS=ssl SHLIBDEPS="$$shlibdeps" build-shared; \ - else \ - echo "There's no support for shared libraries on this platform" >&2 ; \ - exit 1; \ -diff --git a/crypto/Makefile b/crypto/Makefile -index 6557f2b..a69bf7c 100644 ---- a/crypto/Makefile -+++ b/crypto/Makefile -@@ -103,7 +103,7 @@ $(LIB): $(LIBOBJ) - - shared: buildinf.h lib subdirs - if [ -n "$(SHARED_LIBS)" ]; then \ -- (cd ..; $(MAKE) $(SHARED_LIB)); \ -+ (cd ..; $(MAKE) -e $(SHARED_LIB)); \ - fi - - libs: -diff --git a/ssl/Makefile b/ssl/Makefile -index 5ac3507..77ea2bd 100644 ---- a/ssl/Makefile -+++ b/ssl/Makefile -@@ -62,7 +62,7 @@ lib: $(LIBOBJ) - - shared: lib - if [ -n "$(SHARED_LIBS)" ]; then \ -- (cd ..; $(MAKE) $(SHARED_LIB)); \ -+ (cd ..; $(MAKE) -e $(SHARED_LIB)); \ - fi - - files: diff --git a/meta-openvuplus/recipes-enigma2/openssl/openssl_0.9.8x.bb b/meta-openvuplus/recipes-enigma2/openssl/openssl_0.9.8x.bb deleted file mode 100644 index c1e9cca..0000000 --- a/meta-openvuplus/recipes-enigma2/openssl/openssl_0.9.8x.bb +++ /dev/null @@ -1,38 +0,0 @@ -require recipes-connectivity/openssl/openssl.inc - -PR = "${INC_PR}.0" - -LIC_FILES_CHKSUM = "file://LICENSE;md5=f9a8f968107345e0b75aa8c2ecaa7ec8" - -SRC_URI += "file://debian/ca.patch \ - file://debian/config-hurd.patch;apply=no \ - file://debian/debian-targets.patch \ - file://debian/engines-path.patch \ - file://debian/kfreebsd-pipe.patch;apply=no \ - file://debian/make-targets.patch \ - file://debian/man-dir.patch \ - file://debian/man-section.patch \ - file://debian/no-rpath.patch \ - file://debian/no-symbolic.patch \ - file://debian/pic.patch \ - file://debian/pkg-config.patch \ - file://debian/rc4-amd64.patch \ - file://debian/rehash-crt.patch \ - file://debian/rehash_pod.patch \ - file://debian/shared-lib-ext.patch \ - file://debian/stddef.patch \ - file://debian/version-script.patch \ - file://debian/perl-path.diff" - -SRC_URI += "file://configure-targets.patch \ - file://shared-libs.patch \ - file://parallel-make-fix.patch" - -SRC_URI[md5sum] = "ee17e9bc805c8cc7d0afac3b0ef78eda" -SRC_URI[sha256sum] = "7ce0c7f2c451070b4497ea7ca6f23eba6cef1a56db2e86e433f65926a7bc7497" - -EXTRA_OECONF += "no-idea no-mdc2 no-rc5" - -BBCLASSEXTEND = "native nativesdk" - -PARALLEL_MAKEINST = "" diff --git a/meta-openvuplus/recipes-enigma2/python/python-coherence_git.bb b/meta-openvuplus/recipes-enigma2/python/python-coherence_git.bb deleted file mode 100644 index 202e827..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-coherence_git.bb +++ /dev/null @@ -1,33 +0,0 @@ -SUMMARY = "Python UPnP framework" -HOMEPAGE = "http://coherence.beebits.net/" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENCE;md5=3f7c147addd67ce1d53239c68a6b7022" -DEPENDS = "libxml2" -SRCREV = "f4864b1f63866d738c18c02dcb16d824a049880c" -PV = "0.6.7" -PR = "r4" - -SRC_URI = "git://github.com/sreichholf/coherence.git;protocol=git" - -S = "${WORKDIR}/git/Coherence" - -inherit setuptools - -do_configure_prepend() { - sed -e 's,^from coherence import __version__$,__version__ = "${PV}",' -i setup.py -} -do_install_append() { - rm ${D}${bindir}/applet-coherence - rm -r ${D}${PYTHON_SITEPACKAGES_DIR}/Coherence-${PV}-*.egg-info - rm -r ${D}${PYTHON_SITEPACKAGES_DIR}/coherence/test - rm -r ${D}${PYTHON_SITEPACKAGES_DIR}/misc/Desktop-Applet -} - -RDEPENDS_${PN} = "python-xmlrpc python-twisted-web" - -PACKAGES =+ "${PN}-bin" - -RDEPENDS_${PN}-bin = "${PN} python-zopeinterface" - -FILES_${PN}-bin = "${bindir} ${PYTHON_SITEPACKAGES_DIR}/misc/*.py" diff --git a/meta-openvuplus/recipes-enigma2/python/python-daap/python-daap.patch b/meta-openvuplus/recipes-enigma2/python/python-daap/python-daap.patch deleted file mode 100644 index 8fb9ae5..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-daap/python-daap.patch +++ /dev/null @@ -1,57 +0,0 @@ ---- python-daap-0.7.1/daap.py 2007-09-10 20:35:45.000000000 +0200 -+++ python-daap-0.7.1/daap.py 2010-11-03 19:39:09.000000000 +0100 -@@ -417,18 +417,21 @@ - # this returns an HTTP response object - response = self._get_response(r, params) - status = response.status -- content = response.read() -- # if we got gzipped data base, gunzip it. -- if response.getheader("Content-Encoding") == "gzip": -- log.debug("gunzipping data") -- old_len = len(content) -- compressedstream = StringIO( content ) -- gunzipper = gzip.GzipFile(fileobj=compressedstream) -- content = gunzipper.read() -- log.debug("expanded from %s bytes to %s bytes", old_len, len(content)) -- # close this, we're done with it -+ #Dr.Best --> fix -+ if status == 200: -+ content = response.read() -+ # if we got gzipped data base, gunzip it. -+ if response.getheader("Content-Encoding") == "gzip": -+ log.debug("gunzipping data") -+ old_len = len(content) -+ compressedstream = StringIO( content ) -+ gunzipper = gzip.GzipFile(fileobj=compressedstream) -+ content = gunzipper.read() -+ log.debug("expanded from %s bytes to %s bytes", old_len, len(content)) -+ # close this, we're done with it - response.close() - -+ - if status == 401: - raise DAAPError('DAAPClient: %s: auth required'%r) - elif status == 403: -@@ -511,7 +514,7 @@ - # the atoms we want. Making this list smaller reduces memory footprint, - # and speeds up reading large libraries. It also reduces the metainformation - # available to the client. --daap_atoms = "dmap.itemid,dmap.itemname,daap.songalbum,daap.songartist,daap.songformat,daap.songtime,daap.songsize,daap.songgenre,daap.songyear,daap.songtracknumber" -+daap_atoms = "dmap.itemid,dmap.itemname,daap.songalbum,daap.songartist,daap.songformat,daap.songtime,daap.songsize,daap.songgenre,daap.songyear,daap.songtracknumber,daap.songtrackcount,daap.songbitrate" - - class DAAPDatabase(object): - -@@ -560,7 +563,12 @@ - 'id':'miid', - 'type':'asfm', - 'time':'astm', -- 'size':'assz'} -+ 'size':'assz', -+ 'year':'asyr', -+ 'genre':'asgn', -+ 'tracknr': 'astn', -+ 'trackcount': 'astc', -+ 'bitrate': 'asbr'} - - def __init__(self, database, atom): - self.database = database diff --git a/meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bb b/meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bb deleted file mode 100644 index 994b3a7..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bb +++ /dev/null @@ -1,17 +0,0 @@ -SUMMARY = "A pure Python DAAP client implementation" -SECTION = "devel/python" -PRIORITY = "optional" -LICENSE = "LGPLv2.1" -LIC_FILES_CHKSUM = "file://LICENSE;md5=fbc093901857fcd118f065f900982c24" -PR = "r3" - -inherit distutils - -SRC_URI = "http://jerakeen.org/files/PythonDaap-${PV}.tar.gz" -S = "${WORKDIR}/PythonDaap-${PV}" - -RDEPENDS_${PN} = "python-compression" - - -SRC_URI[md5sum] = "b3db3d60b0ee83f5f23101d2c3bb99e0" -SRC_URI[sha256sum] = "ea1d3a8141654781a0df31e6607c4722436fa33eb2e9934492770b3b61be8122" diff --git a/meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bbappend b/meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bbappend deleted file mode 100644 index 26d705e..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bbappend +++ /dev/null @@ -1,5 +0,0 @@ -PR .= "-vuplus0" - -SRC_URI += " \ - file://python-daap.patch \ -" diff --git a/meta-openvuplus/recipes-enigma2/python/python-flickrapi_1.4.2.bb b/meta-openvuplus/recipes-enigma2/python/python-flickrapi_1.4.2.bb deleted file mode 100644 index e0c0db9..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-flickrapi_1.4.2.bb +++ /dev/null @@ -1,31 +0,0 @@ -SUMMARY = "The official Python interface to the Flickr API" -HOMEPAGE = "http://stuvel.eu/flickrapi" -SECTION = "devel/python" -LICENSE = "PSF" -LIC_FILES_CHKSUM = "file://LICENSE;md5=d54e175a4083eea51ac31acaff818df5" -PRIORITY = "optional" -PR = "r3" - -SRC_URI = "http://pypi.python.org/packages/source/f/flickrapi/flickrapi-${PV}.zip" -SRC_URI[md5sum] = "90dca08a45968b18da0894887f3e59b3" -SRC_URI[sha256sum] = "ac9304f571175b8af4fc2ee17d3e110847b526640665ca53d97bbf9df98329bc" - -S = "${WORKDIR}/flickrapi-${PV}" - -inherit distutils - -# NOTE: the package only offers documentation as data, so fix the path here -# instead of trying to move all files retroactively. -DISTUTILS_INSTALL_ARGS += "--install-data=${D}/${docdir}/${PN}" - -# NOTE: requires python-misc for webbrowser and subprocess as missing dependency of the webbrowser -RDEPENDS_${PN} = "\ - python-core \ - python-elementtree \ - python-logging \ - python-misc \ - python-netclient \ - python-subprocess \ - python-threading \ - python-xml \ -" diff --git a/meta-openvuplus/recipes-enigma2/python/python-gdata_2.0.14.bb b/meta-openvuplus/recipes-enigma2/python/python-gdata_2.0.14.bb deleted file mode 100644 index 8c0ab29..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-gdata_2.0.14.bb +++ /dev/null @@ -1,21 +0,0 @@ -SUMMARY = "Google Data APIs Python Client Library" -HOMEPAGE = "http://code.google.com/p/gdata-python-client/" -SECTION = "devel/python" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://README.txt;beginline=1;endline=13;md5=7a713fc5eed20ac1904c2efe0b816a33" -RDEPENDS = "python-elementtree" -RDEPENDS_${PN}-tests = "${PN}" -PR = "r2" - -SRC_URI = "http://gdata-python-client.googlecode.com/files/gdata-${PV}.tar.gz;name=archive" -SRC_URI[archive.md5sum] = "29cf394b4f75aa4fae8c1b59079f2a02" -SRC_URI[archive.sha256sum] = "ba291d2b9d36a0f1b1b31a5a3ac3ba11f1bcce21c915a6ec78d109a43dafb1b0" - -S = "${WORKDIR}/gdata-${PV}" - -inherit distutils - -PACKAGES =+ "${PN}-tests" - -FILES_${PN}-tests = "${libdir}/${PYTHON_DIR}/site-packages/gdata/test*" -FILES_${PN} += "${datadir}" diff --git a/meta-openvuplus/recipes-enigma2/python/python-mutagen/patch.diff b/meta-openvuplus/recipes-enigma2/python/python-mutagen/patch.diff deleted file mode 100644 index 73a112c..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-mutagen/patch.diff +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur mutagen/easymp4.py mutagen_pach/easymp4.py ---- mutagen/mutagen/easymp4.py 2009-08-10 12:57:55.000000000 +0200 -+++ mutagen/mutagen/easymp4.py 2010-01-11 19:24:05.000000000 +0100 -@@ -204,7 +204,7 @@ - '\xa9cmt': 'comment', - 'desc': 'description', - '\xa9grp': 'grouping', -- '\xa9grn': 'genre', -+ '\xa9gen': 'genre', - 'cprt': 'copyright', - 'soal': 'albumsort', - 'soaa': 'albumartistsort', diff --git a/meta-openvuplus/recipes-enigma2/python/python-mutagen_1.18.bb b/meta-openvuplus/recipes-enigma2/python/python-mutagen_1.18.bb deleted file mode 100644 index b785e2a..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-mutagen_1.18.bb +++ /dev/null @@ -1,22 +0,0 @@ -SUMMARY = "Module for manipulating ID3 (v1 + v2) tags in Python" -SECTION = "devel/python" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" -SRCNAME = "mutagen" -PR = "r2" - -DEPENDS = "python" -RDEPENDS = "python-shell" - -SRC_URI = "http://mutagen.googlecode.com/files/mutagen-${PV}.tar.gz \ - file://patch.diff \ -" - -SRC_URI[md5sum] = "0c2cd954e4bacd79fadd45afc4acce4c" -SRC_URI[sha256sum] = "30b6147baf59ab3609939acf49a1a1c73b15d8b1c637a01bfee89da7feea0d6c" - -S = "${WORKDIR}/mutagen-${PV}" - -inherit distutils - - diff --git a/meta-openvuplus/recipes-enigma2/python/python-native_2.7.2.bbappend b/meta-openvuplus/recipes-enigma2/python/python-native_2.7.2.bbappend deleted file mode 100644 index 04139f0..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-native_2.7.2.bbappend +++ /dev/null @@ -1,2 +0,0 @@ -RPROVIDES += "python-pickle-native python-pprint-native" - diff --git a/meta-openvuplus/recipes-enigma2/python/python-pycrypto/no-usr-include.patch b/meta-openvuplus/recipes-enigma2/python/python-pycrypto/no-usr-include.patch deleted file mode 100644 index 4b74b5a..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-pycrypto/no-usr-include.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- pycrypto-2.5/setup.py.orig 2012-03-13 17:29:36.215553438 +0100 -+++ pycrypto-2.5/setup.py 2012-03-13 17:29:46.339553341 +0100 -@@ -366,7 +366,7 @@ - 'ext_modules': plat_ext + [ - # _fastmath (uses GNU mp library) - Extension("Crypto.PublicKey._fastmath", -- include_dirs=['src/','/usr/include/'], -+ include_dirs=['src/'], - libraries=['gmp'], - sources=["src/_fastmath.c"]), - diff --git a/meta-openvuplus/recipes-enigma2/python/python-pycrypto_2.5.bb b/meta-openvuplus/recipes-enigma2/python/python-pycrypto_2.5.bb deleted file mode 100644 index b7a4811..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-pycrypto_2.5.bb +++ /dev/null @@ -1,17 +0,0 @@ -SUMMARY = "A collection of cryptographic algorithms and protocols" -SECTION = "devel/python" -LICENSE = "PD & Python-2.0" -LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=35f354d199e8cb7667b059a23578e63d" -DEPENDS = "gmp" -PR = "r2" - -SRC_URI = "http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-${PV}.tar.gz \ - file://no-usr-include.patch" -SRC_URI[md5sum] = "783e45d4a1a309e03ab378b00f97b291" -SRC_URI[sha256sum] = "e950a78184e2a7defccf5d45e0c29c1e9edeb29984433f0d110a21e9631e38de" - -S = "${WORKDIR}/pycrypto-${PV}" - -inherit autotools distutils - -BBCLASSEXTEND = "native" diff --git a/meta-openvuplus/recipes-enigma2/python/python-transmissionrpc_hg.bb b/meta-openvuplus/recipes-enigma2/python/python-transmissionrpc_hg.bb deleted file mode 100644 index 01db4e3..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-transmissionrpc_hg.bb +++ /dev/null @@ -1,17 +0,0 @@ -DESCRIPTION = "Transmission RPC is a python module that can communicate with the bittorrent client Transmission through json-rpc" -HOMEPAGE = "http://bitbucket.org/blueluna/transmissionrpc/wiki/Home" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=725cfd8eb1ec903074184b7edf9379c9" -SRCREV = "4fe71eb818d0" -PV = "0.7+hg${SRCREV}" -PRIORITY = "optional" -PR = "r1" - -SRC_URI = "hg://bitbucket.org/blueluna;proto=http;module=transmissionrpc;rev=${SRCREV}" - -S = "${WORKDIR}/transmissionrpc" - -inherit setuptools - -RDEPENDS_${PN} = "python-simplejson" diff --git a/meta-openvuplus/recipes-enigma2/python/python-twisted_12.0.0.bb b/meta-openvuplus/recipes-enigma2/python/python-twisted_12.0.0.bb deleted file mode 100644 index a4314f7..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-twisted_12.0.0.bb +++ /dev/null @@ -1,237 +0,0 @@ -DESCRIPTION = "Twisted is an event-driven networking framework written in Python and licensed under the LGPL. \ -Twisted supports TCP, UDP, SSL/TLS, multicast, Unix sockets, a large number of protocols \ -(including HTTP, NNTP, IMAP, SSH, IRC, FTP, and others), and much more." -HOMEPAGE = "http://www.twistedmatrix.com" -SECTION = "console/network" - -#twisted/topfiles/NEWS:655: - Relicensed: Now under the MIT license, rather than LGPL. -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;beginline=40;md5=3fced11d6df719b47505837a51c16ae5" - -SRC_URI = "http://twistedmatrix.com/Releases/Twisted/12.0/Twisted-${PV}.tar.bz2" -SRC_URI[md5sum] = "cf49a8676c21c50faf1b42b528049471" -SRC_URI[sha256sum] = "e5561c9714583fd052ea9e0b10331609a719b3878f9d2593e4c57eab0ba0effd" - -S = "${WORKDIR}/Twisted-${PV}" -PR = "r2" - -inherit setuptools - -do_install_append() { - # remove some useless files before packaging - find ${D} -name "*.bat" -o -name "*.c" -o -name "*.h" -exec rm {} \; -} - -PACKAGES += "\ - ${PN}-zsh \ - ${PN}-test \ - ${PN}-protocols \ - ${PN}-bin \ - ${PN}-conch \ - ${PN}-lore \ - ${PN}-mail \ - ${PN}-names \ - ${PN}-news \ - ${PN}-runner \ - ${PN}-web \ - ${PN}-words \ - ${PN}-flow \ - ${PN}-pair \ - ${PN}-core \ -" - -RDEPENDS_${PN} += "\ - ${PN}-bin \ - ${PN}-conch \ - ${PN}-lore \ - ${PN}-mail \ - ${PN}-names \ - ${PN}-news \ - ${PN}-runner \ - ${PN}-web \ - ${PN}-words \ -" - -ALLOW_EMPTY_${PN} = "1" -FILES_${PN} = "" - -FILES_${PN}-test = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/test \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/*/test \ -" -RDEPENDS_${PN}-test = "${PN}" - -FILES_${PN}-protocols = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/ \ -" - -FILES_${PN}-zsh = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zsh \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zshcomp.* \ -" - -FILES_${PN}-bin = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/_c_urlarg.so \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/spread/cBanana.so \ -" - -FILES_${PN}-conch = " \ - ${bindir}/ckeygen \ - ${bindir}/tkconch \ - ${bindir}/conch \ - ${bindir}/conchftp \ - ${bindir}/cftp \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_conch.py* \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/conch \ -" -RDEPENDS_${PN}-conch = "${PN}-core ${PN}-protocols" - -FILES_${PN}-core = " \ -${bindir}/manhole \ -${bindir}/mktap \ -${bindir}/twistd \ -${bindir}/tap2deb \ -${bindir}/tap2rpm \ -${bindir}/tapconvert \ -${bindir}/tkmktap \ -${bindir}/trial \ -${bindir}/easy_install* \ -${bindir}/pyhtmlizer \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/*.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__init__.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/notestplugin.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/testplugin.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_ftp.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_inet.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_manhole.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_portforward.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_socks.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_telnet.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_trial.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/dropin.cache \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/application \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/cred \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/enterprise \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/internet \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/manhole \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/manhole \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/persisted \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols\ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python\ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/timeoutqueue.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/filepath.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dxprofile.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/plugin.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/htmlizer.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/__init__.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dispatch.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/hook.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/threadpool.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/otp.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/usage.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/roots.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/versions.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/urlpath.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/util.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/components.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/logfile.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/runtime.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/reflect.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/context.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/threadable.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/rebuild.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/failure.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/lockfile.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/formmethod.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/finalize.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/win32.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dist.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/shortcut.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zipstream.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/release.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/syslog.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/log.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/compat.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zshcomp.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/procutils.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/text.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_twisted_zsh_stub \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_epoll.so \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_initgroups.so \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/scripts/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/spread/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/tap/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/trial/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/__init__.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/_version.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/copyright.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/im.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/*.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/*.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/*.py* \ -" -RDEPENDS_${PN}-core = "python-core python-zopeinterface" - -FILES_${PN}-lore = " \ -${bindir}/bookify \ -${bindir}/lore \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_lore.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/lore \ -" -RDEPENDS_${PN}-lore = "${PN}-core" - -FILES_${PN}-mail = " \ -${bindir}/mailmail \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_mail.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/mail \ -" -RDEPENDS_${PN}-mail = "${PN}-core ${PN}-protocols" - -FILES_${PN}-names = " \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_names.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/names \ -" -RDEPENDS_${PN}-names = "${PN}-core" - -FILES_${PN}-news = " \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_news.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/news \ -" -RDEPENDS_${PN}-news = "${PN}-core ${PN}-protocols" - -FILES_${PN}-runner = " \ -${libdir}/site-packages/twisted/runner/portmap.so \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/runner\ -" -RDEPENDS_${PN}-runner = "${PN}-core ${PN}-protocols" - -FILES_${PN}-web = " \ -${bindir}/websetroot \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_web.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/web\ -" -RDEPENDS_${PN}-web += "${PN}-core ${PN}-protocols" - -FILES_${PN}-words = " \ -${bindir}/im \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_words.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/words\ -" -RDEPENDS_${PN}-words += "${PN}-core" - -FILES_${PN}-flow = " \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_flow.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/flow \" -RDEPENDS_${PN}-flow += "${PN}-core" - -FILES_${PN}-pair = " \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_pair.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/pair \ -" -RDEPENDS_${PN}-pair += "${PN}-core" - -FILES_${PN}-dbg += " \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/*/.debug \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/*/*/.debug \ -" -RDEPENDS_${PN}-dbg = "${PN}" diff --git a/meta-openvuplus/recipes-enigma2/python/python-wifi_0.5.0.bb b/meta-openvuplus/recipes-enigma2/python/python-wifi_0.5.0.bb deleted file mode 100644 index e831a74..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python-wifi_0.5.0.bb +++ /dev/null @@ -1,29 +0,0 @@ -SUMMARY = "Provides access to Linux Wireless Extensions" -HOMEPAGE = "http://pythonwifi.wikispot.org/" -SECTION = "devel/python" -LICENSE = "LGPLv2+" -LICENSE_${PN}-examples = "GPLv2+" -LIC_FILES_CHKSUM = "file://README;beginline=56;endline=57;md5=31ebd3ff22b6f3c0160a143e0c4a98a3 \ - file://examples/iwconfig.py;beginline=1;endline=20;md5=60fd41501905b3e20e9065995edfc0cf \ - file://pythonwifi/iwlibs.py;beginline=1;endline=22;md5=679475d61cc083a24158bb8b473f0c6f" -RDEPENDS_${PN} = "python-ctypes python-datetime" -PR = "r2" - -SRC_URI = "http://download.berlios.de/pythonwifi/${P}.tar.bz2" -SRC_URI[md5sum] = "8fe7fd0a4edce1f9bedaff4acb7fd500" -SRC_URI[sha256sum] = "3e3f645d37ab20450f60c785cec5f21b330f28a6c46c7c1b0898305dd7a34b26" - -inherit setuptools - -do_install_append() { - install -d ${D}${docdir}/${PN} - mv ${D}${datadir}/README ${D}${docdir}/${PN} - mv ${D}${datadir}/INSTALL ${D}${docdir}/${PN} - mv ${D}${datadir}/docs/* ${D}${docdir}/${PN} - install -d ${D}${sbindir} - mv ${D}${datadir}/examples/* ${D}${sbindir} -} - -PACKAGES =+ "${PN}-examples" - -FILES_${PN}-examples = "${sbindir}" diff --git a/meta-openvuplus/recipes-enigma2/python/python/ctypes-error-handling-fix.patch b/meta-openvuplus/recipes-enigma2/python/python/ctypes-error-handling-fix.patch deleted file mode 100644 index 5e07082..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python/ctypes-error-handling-fix.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- a/Modules/_ctypes/_ctypes.c 2012-01-26 15:41:30.000000000 +0100 -+++ b/Modules/_ctypes/_ctypes.c 2012-01-26 15:44:41.046977137 +0100 -@@ -602,10 +602,16 @@ - #ifdef __CYGWIN__ - /* dlerror() isn't very helpful on cygwin */ - PyErr_Format(PyExc_ValueError, -- "symbol '%s' not found (%s) ", -+ "symbol '%s' not found", - name); - #else -- PyErr_SetString(PyExc_ValueError, ctypes_dlerror()); -+ const char *err = ctypes_dlerror(); -+ if (!err) -+ PyErr_Format(PyExc_ValueError, -+ "symbol '%s' not found", -+ name); -+ else -+ PyErr_SetString(PyExc_ValueError, err); - #endif - return NULL; - } -@@ -3290,10 +3296,16 @@ - #ifdef __CYGWIN__ - /* dlerror() isn't very helpful on cygwin */ - PyErr_Format(PyExc_AttributeError, -- "function '%s' not found (%s) ", -+ "function '%s' not found", - name); - #else -- PyErr_SetString(PyExc_AttributeError, ctypes_dlerror()); -+ const char *err = ctypes_dlerror(); -+ if (!err) -+ PyErr_Format(PyExc_AttributeError, -+ "function '%s' not found", -+ name); -+ else -+ PyErr_SetString(PyExc_AttributeError, err); - #endif - return NULL; - } diff --git a/meta-openvuplus/recipes-enigma2/python/python/fix_pthread_site.patch b/meta-openvuplus/recipes-enigma2/python/python/fix_pthread_site.patch deleted file mode 100644 index d392060..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python/fix_pthread_site.patch +++ /dev/null @@ -1,38 +0,0 @@ ---- configure.in.org 2008-05-01 12:40:58.000000000 +0200 -+++ configure.in 2008-05-01 12:39:39.000000000 +0200 -@@ -998,7 +999,7 @@ - # so we need to run a program to see whether it really made the - # function available. - AC_MSG_CHECKING(whether $CC accepts -pthread) --AC_CACHE_VAL(ac_cv_thread, -+AC_CACHE_VAL(ac_cv_pthread, - [ac_save_cc="$CC" - CC="$CC -pthread" - AC_TRY_RUN([ -@@ -1023,11 +1024,11 @@ - - # If we have set a CC compiler flag for thread support then - # check if it works for CXX, too. --ac_cv_cxx_thread=no - if test ! -z "$CXX" - then - AC_MSG_CHECKING(whether $CXX also accepts flags for thread support) --ac_save_cxx="$CXX" -+AC_CACHE_VAL(ac_cv_cxx_thread, -+[ac_save_cxx="$CXX" - - if test "$ac_cv_kpthread" = "yes" - then -@@ -1056,9 +1057,11 @@ - fi - rm -fr conftest* - fi -+CXX="$ac_save_cxx"]) - AC_MSG_RESULT($ac_cv_cxx_thread) -+else -+ ac_cv_cxx_thread=no - fi --CXX="$ac_save_cxx" - - dnl # check for ANSI or K&R ("traditional") preprocessor - dnl AC_MSG_CHECKING(for C preprocessor type) diff --git a/meta-openvuplus/recipes-enigma2/python/python/no-ldconfig.patch b/meta-openvuplus/recipes-enigma2/python/python/no-ldconfig.patch deleted file mode 100644 index fff1ccd..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python/no-ldconfig.patch +++ /dev/null @@ -1,23 +0,0 @@ -Fixes exception on 'import uuid' if ldconfig is unavailable. - -diff -Naur Python-2.6.7.orig/Lib/ctypes/util.py Python-2.6.7/Lib/ctypes/util.py ---- Python-2.6.7.orig/Lib/ctypes/util.py 2010-03-20 03:11:16.000000000 +0100 -+++ Python-2.6.7/Lib/ctypes/util.py 2012-01-12 15:26:37.562726637 +0100 -@@ -204,7 +204,16 @@ - return res.group(1) - - def find_library(name): -- return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) -+ from glob import glob -+ paths = ['/lib', '/usr/lib'] -+ if os.environ.has_key('LD_LIBRARY_PATH'): -+ paths = os.environ['LD_LIBRARY_PATH'].split(':') + paths -+ for path in paths: -+ for lib in glob("%s/lib%s.so.*" % (path, name)): -+ rpath = os.path.realpath(lib) -+ if os.path.isfile(rpath): -+ return rpath -+ return None - - ################################################################ - # test code diff --git a/meta-openvuplus/recipes-enigma2/python/python/some_configure_fixes.patch b/meta-openvuplus/recipes-enigma2/python/python/some_configure_fixes.patch deleted file mode 100644 index eced413..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python/some_configure_fixes.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- configure.in 2008-02-13 20:17:17.000000000 +0100 -+++ configure.in 2008-10-21 22:45:31.000000000 +0200 -@@ -3369,27 +3369,9 @@ - AC_MSG_RESULT(no) - ) - --AC_MSG_CHECKING(for /dev/ptmx) -+AC_CHECK_FILE(/dev/ptmx, AC_DEFINE(HAVE_DEV_PTMX, 1, [Define if we have /dev/ptmx.])) - --if test -r /dev/ptmx --then -- AC_MSG_RESULT(yes) -- AC_DEFINE(HAVE_DEV_PTMX, 1, -- [Define if we have /dev/ptmx.]) --else -- AC_MSG_RESULT(no) --fi -- --AC_MSG_CHECKING(for /dev/ptc) -- --if test -r /dev/ptc --then -- AC_MSG_RESULT(yes) -- AC_DEFINE(HAVE_DEV_PTC, 1, -- [Define if we have /dev/ptc.]) --else -- AC_MSG_RESULT(no) --fi -+AC_CHECK_FILE(/dev/ptc, AC_DEFINE(HAVE_DEV_PTC, 1, [Define if we have /dev/ptc.])) - - case $MACHDEP in - darwin) diff --git a/meta-openvuplus/recipes-enigma2/python/python_2.7.2.bbappend b/meta-openvuplus/recipes-enigma2/python/python_2.7.2.bbappend deleted file mode 100644 index dca8c27..0000000 --- a/meta-openvuplus/recipes-enigma2/python/python_2.7.2.bbappend +++ /dev/null @@ -1,19 +0,0 @@ -FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" - -PR .= "-vuplus0" - -SRC_URI += " \ - file://some_configure_fixes.patch;striplevel=0 \ - file://fix_pthread_site.patch;striplevel=0 \ - file://no-ldconfig.patch \ - file://ctypes-error-handling-fix.patch \ -" - -EXTRA_OECONF += " \ - ac_cv_file__dev_ptmx=yes \ - ac_cv_file__dev_ptc=no \ - ac_cv_no_strict_aliasing_ok=yes \ - ac_cv_pthread=yes \ - ac_cv_cxx_thread=yes \ - ac_cv_sizeof_off_t=8 \ -" diff --git a/meta-openvuplus/recipes-enigma2/showiframe/showiframe_1.8.bb b/meta-openvuplus/recipes-enigma2/showiframe/showiframe_1.8.bb deleted file mode 100644 index 1176e31..0000000 --- a/meta-openvuplus/recipes-enigma2/showiframe/showiframe_1.8.bb +++ /dev/null @@ -1,9 +0,0 @@ -SUMMARY = "Displays an IFrame using a LinuxTV video decoder" -SECTION = "base" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://src/showiframe.c;endline=10;md5=513a8a3c6a14de8ef311dfa25fb0eaa6" -PR = "r1" - -SRCREV = "f19e4b573ba755ca6300df72b0736e98c967aba5" - -inherit autotools opendreambox-git diff --git a/meta-openvuplus/recipes-enigma2/sqlite/sqlite3_3.7.10.bbappend b/meta-openvuplus/recipes-enigma2/sqlite/sqlite3_3.7.10.bbappend deleted file mode 100644 index f9c383b..0000000 --- a/meta-openvuplus/recipes-enigma2/sqlite/sqlite3_3.7.10.bbappend +++ /dev/null @@ -1,3 +0,0 @@ -PR .= "-vuplus0" - -CFLAGS += "-DSQLITE_ENABLE_COLUMN_METADATA" diff --git a/meta-openvuplus/recipes-enigma2/streamripper/streamripper_1.64.6.bb b/meta-openvuplus/recipes-enigma2/streamripper/streamripper_1.64.6.bb deleted file mode 100644 index 4be9d0d..0000000 --- a/meta-openvuplus/recipes-enigma2/streamripper/streamripper_1.64.6.bb +++ /dev/null @@ -1,17 +0,0 @@ -SUMMARY = "StreamRipper lets you record streaming mp3 to your hard drive." -SECTION = "console/multimedia" -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b" -DEPENDS = "libogg libvorbis faad2 glib-2.0 libmad" -PR = "r1" - -SRC_URI = "${SOURCEFORGE_MIRROR}/streamripper/streamripper-${PV}.tar.gz" -SRC_URI[md5sum] = "a37a1a8b8f9228522196a122a1c2dd32" -SRC_URI[sha256sum] = "c1d75f2e9c7b38fd4695be66eff4533395248132f3cc61f375196403c4d8de42" - -EXTRA_OECONF = "--disable-oggtest \ - --disable-vorbistest \ - --with-ogg=${STAGING_LIBDIR} \ - --with-vorbis=${STAGING_LIBDIR}" - -inherit autotools diff --git a/meta-openvuplus/recipes-enigma2/swig/swig_2.0.4.bb b/meta-openvuplus/recipes-enigma2/swig/swig_2.0.4.bb deleted file mode 100644 index e05c9d6..0000000 --- a/meta-openvuplus/recipes-enigma2/swig/swig_2.0.4.bb +++ /dev/null @@ -1,11 +0,0 @@ -require recipes-devtools/swig/swig.inc - -LIC_FILES_CHKSUM = "file://LICENSE;md5=e7807a6282784a7dde4c846626b08fc6 \ - file://LICENSE-GPL;md5=d32239bcb673463ab874e80d47fae504 \ - file://LICENSE-UNIVERSITIES;md5=8ce9dcc8f7c994de4a408b205c72ba08" - -DEPENDS += "libpcre-native" -PR = "${INC_PR}.0" - -SRC_URI[md5sum] = "4319c503ee3a13d2a53be9d828c3adc0" -SRC_URI[sha256sum] = "763a117730d26f8e5ed67f5718c6c0761fbb8461680fc20269db8c0839e1ec8a" diff --git a/meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.bb b/meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.bb deleted file mode 100644 index 58ceee2..0000000 --- a/meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.bb +++ /dev/null @@ -1,7 +0,0 @@ -PR = "${INC_PR}.0" - -RDEPENDS_${PN} = " \ - enigma2-streamproxy-xinetd \ -" - -require task-vuplus-enigma2.inc diff --git a/meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.inc b/meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.inc deleted file mode 100644 index df4a9a8..0000000 --- a/meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.inc +++ /dev/null @@ -1,85 +0,0 @@ -SUMMARY = "Enigma2 Task for Vuplus" -SECTION = "vuplus/base" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" -INC_PR = "r0" - -inherit task - -PACKAGE_ARCH = "${MACHINE_ARCH}" - -#DEPENDS_${PN} += " \ -# enigma2-plugin-extensions-openwebif \ -#" - -RDEPENDS_${PN} += " \ - enigma2 \ - enigma2-defaultservices \ - enigma2-streamproxy \ - tuxbox-tuxtxt-32bpp \ - showiframe \ - enigma2-meta \ - enigma2-plugins-meta \ - enigma2-skins-meta \ - enigma2-plugin-extensions-mediascanner \ - enigma2-plugin-systemplugins-factorytest \ - enigma2-plugin-systemplugins-crashreport \ - enigma2-plugin-extensions-remotestreamconvert \ - enigma2-plugin-systemplugins-zappingmodeselection \ - enigma2-plugin-extensions-addstreamurl \ -" - -# vuplus-blindscan-utils \ -# enigma2-plugin-systemplugins-3gmodemmanager \ -# enigma2-plugin-extensions-streamtv \ -# enigma2-plugin-extensions-dlnaserver \ -# enigma2-plugin-extensions-dlnabrowser \ - -RRECOMMENDS_${PN} += " \ - aio-grab \ - python-crypt \ - python-netserver \ - python-twisted-core \ - python-twisted-protocols \ - python-twisted-web \ - ${@base_contains("MACHINE_FEATURES", "wifi", "task-vuplus-wlan", "", d)} \ - enigma2-plugin-extensions-mediaplayer \ - enigma2-plugin-extensions-pictureplayer \ - enigma2-plugin-systemplugins-skinselector \ - enigma2-plugin-systemplugins-ui3dsetup \ - enigma2-plugin-systemplugins-uipositionsetup \ - enigma2-plugin-systemplugins-hdmicec \ -" -# ${@base_contains("MACHINE_FEATURES", "wifi", "enigma2-plugin-systemplugins-wirelessaccesspoint", "", d)} \ -#" - -RDEPENDS_${PN} += " \ - ${@base_contains("VUPLUS_FEATURES", "fan_simple", "enigma2-plugin-systemplugins-fancontrol","", d)} \ - ${@base_contains("VUPLUS_FEATURES", "fan_manual", "enigma2-plugin-systemplugins-manualfancontrol", "", d)} \ - ${@base_contains("VUPLUS_FEATURES", "rc_code", "enigma2-plugin-systemplugins-remotecontrolcode", "", d)} \ - ${@base_contains("VUPLUS_FEATURES", "led", "enigma2-plugin-systemplugins-ledbrightnesssetup", "", d)} \ -" - -#RDEPENDS_task-vuplus-enigma2_append_bm750 = "\ -# enigma2-plugin-systemplugins-fancontrol \ -#" -# vuplus-webbrowser-utils enigma2-plugin-extensions-webbrowser - -#RDEPENDS_task-vuplus-enigma2_append_vuuno = "\ -# enigma2-plugin-systemplugins-fpgaupgrade \ -# enigma2-plugin-systemplugins-blindscan \ -# enigma2-plugin-systemplugins-manualfancontrol \ -# enigma2-plugin-systemplugins-remotecontrolcode \ -#" -# vuplus-webbrowser-utils enigma2-plugin-extensions-webbrowser - -#RDEPENDS_task-vuplus-enigma2_append_vuultimo = "\ -# enigma2-plugin-systemplugins-firmwareupgrade \ -# enigma2-plugin-systemplugins-blindscan \ -# enigma2-plugin-systemplugins-manualfancontrol \ -# enigma2-plugin-systemplugins-remotecontrolcode \ -# enigma2-plugin-systemplugins-ledbrightnesssetup \ -#" -# vuplus-webbrowser-utils enigma2-plugin-extensions-webbrowser - -PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/meta-openvuplus/recipes-enigma2/timezones/files/GPL-1.0 b/meta-openvuplus/recipes-enigma2/timezones/files/GPL-1.0 deleted file mode 100644 index 9d4ef93..0000000 --- a/meta-openvuplus/recipes-enigma2/timezones/files/GPL-1.0 +++ /dev/null @@ -1,252 +0,0 @@ - -GNU General Public License, version 1 - - GNU GENERAL PUBLIC LICENSE - Version 1, February 1989 - - Copyright (C) 1989 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The license agreements of most software companies try to keep users -at the mercy of those companies. By contrast, our General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. The -General Public License applies to the Free Software Foundation`s -software and to any other program whose authors commit to using it. -You can use it for your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Specifically, the General Public License is designed to make -sure that you have the freedom to give away or sell copies of free -software, that you receive source code or can get it if you want it, -that you can change the software or use pieces of it in new free -programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of a such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must tell them their rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author`s protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors` reputations. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any program or other work which -contains a notice placed by the copyright holder saying it may be -distributed under the terms of this General Public License. The -"Program", below, refers to any such program or work, and a "work based -on the Program" means either the Program or any work containing the -Program or a portion of it, either verbatim or with modifications. Each -licensee is addressed as "you". - - 1. You may copy and distribute verbatim copies of the Program`s source -code as you receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice and -disclaimer of warranty; keep intact all the notices that refer to this -General Public License and to the absence of any warranty; and give any -other recipients of the Program a copy of this General Public License -along with the Program. You may charge a fee for the physical act of -transferring a copy. - - 2. You may modify your copy or copies of the Program or any portion of -it, and copy and distribute such modifications under the terms of Paragraph -1 above, provided that you also do the following: - - a) cause the modified files to carry prominent notices stating that - you changed the files and the date of any change; and - - b) cause the whole of any work that you distribute or publish, that - in whole or in part contains the Program or any part thereof, either - with or without modifications, to be licensed at no charge to all - third parties under the terms of this General Public License (except - that you may choose to grant warranty protection to some or all - third parties, at your option). - - c) If the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the simplest and most usual way, to print or display an - announcement including an appropriate copyright notice and a notice - that there is no warranty (or else, saying that you provide a - warranty) and that users may redistribute the program under these - conditions, and telling the user how to view a copy of this General - Public License. - - d) You may charge a fee for the physical act of transferring a - copy, and you may at your option offer warranty protection in - exchange for a fee. - -Mere aggregation of another independent work with the Program (or its -derivative) on a volume of a storage or distribution medium does not bring -the other work under the scope of these terms. - - 3. You may copy and distribute the Program (or a portion or derivative of -it, under Paragraph 2) in object code or executable form under the terms of -Paragraphs 1 and 2 above provided that you also do one of the following: - - a) accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of - Paragraphs 1 and 2 above; or, - - b) accompany it with a written offer, valid for at least three - years, to give any third party free (except for a nominal charge - for the cost of distribution) a complete machine-readable copy of the - corresponding source code, to be distributed under the terms of - Paragraphs 1 and 2 above; or, - - c) accompany it with the information you received as to where the - corresponding source code may be obtained. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form alone.) - -Source code for a work means the preferred form of the work for making -modifications to it. For an executable file, complete source code means -all the source code for all modules it contains; but, as a special -exception, it need not include source code for modules which are standard -libraries that accompany the operating system on which the executable -file runs, or for standard header files or definitions files that -accompany that operating system. - - 4. You may not copy, modify, sublicense, distribute or transfer the -Program except as expressly provided under this General Public License. -Any attempt otherwise to copy, modify, sublicense, distribute or transfer -the Program is void, and will automatically terminate your rights to use -the Program under this License. However, parties who have received -copies, or rights to use copies, from you under this General Public -License will not have their licenses terminated so long as such parties -remain in full compliance. - - 5. By copying, distributing or modifying the Program (or any work based -on the Program) you indicate your acceptance of this license to do so, -and all its terms and conditions. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the original -licensor to copy, distribute or modify the Program subject to these -terms and conditions. You may not impose any further restrictions on the -recipients` exercise of the rights granted herein. - - 7. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of the license which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -the license, you may choose any version ever published by the Free Software -Foundation. - - 8. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to humanity, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is safest to -attach them to the start of each source file to most effectively convey -the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the program`s name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19xx name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w`. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c` for details. - -The hypothetical commands `show w` and `show c` should show the -appropriate parts of the General Public License. Of course, the -commands you use may be called something other than `show w` and `show -c`; they could even be mouse-clicks or menu items--whatever suits your -program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - program `Gnomovision` (a program to direct compilers to make passes - at assemblers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -That`s all there is to it! - diff --git a/meta-openvuplus/recipes-enigma2/timezones/files/zoneinfo.tar.bz2 b/meta-openvuplus/recipes-enigma2/timezones/files/zoneinfo.tar.bz2 deleted file mode 100644 index 19fa9288a79ad1615c587d728e988f970e57c0b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38585 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 FYi1d7toi@| diff --git a/meta-openvuplus/recipes-enigma2/timezones/timezones-alternative.bb b/meta-openvuplus/recipes-enigma2/timezones/timezones-alternative.bb deleted file mode 100644 index 0fb50f3..0000000 --- a/meta-openvuplus/recipes-enigma2/timezones/timezones-alternative.bb +++ /dev/null @@ -1,25 +0,0 @@ -DESCRIPTION = "Timezone data, alternative" -SECTION = "base" -PRIORITY = "optional" -MAINTAINER = "Felix Domke <tmbinc@elitedvb.net>" -LICENSE = "GPL" -LIC_FILES_CHKSUM = "file://${THISDIR}/files/GPL-1.0;md5=e9e36a9de734199567a4d769498f743d" - -PV = "2008i" -PR = "r0" - -SRC_URI = "file://zoneinfo.tar.bz2" -S = "${WORKDIR}/zoneinfo" - -FILES_${PN} = "usr/share/zoneinfo/[A-Z]*" -PACKAGE_ARCH = "all" - -do_install() { - install -d ${D}/usr/share/zoneinfo/ - - for file in ${S}/* - do - [ -f $file ] && install -m 644 "$file" ${D}/usr/share/zoneinfo/ - done; - true; -} diff --git a/meta-openvuplus/recipes-extended/hddtemp/hddtemp/hddtemp-no-nls-support.patch b/meta-openvuplus/recipes-extended/hddtemp/hddtemp/hddtemp-no-nls-support.patch new file mode 100644 index 0000000..8f6b9c3 --- /dev/null +++ b/meta-openvuplus/recipes-extended/hddtemp/hddtemp/hddtemp-no-nls-support.patch @@ -0,0 +1,66 @@ +diff -ru hddtemp-0.3-beta15.orig/configure.in hddtemp-0.3-beta15/configure.in +--- hddtemp-0.3-beta15.orig/configure.in 2005-10-17 20:14:19.000000000 +0100 ++++ hddtemp-0.3-beta15/configure.in 2008-06-27 00:00:46.000000000 +0100 +@@ -17,6 +17,7 @@ + # append the host alias to the tools for cross compiling + AC_HEADER_STDC + AC_CHECK_HEADERS(fcntl.h) ++AC_CHECK_HEADERS(iconv.h) + AC_CHECK_HEADERS(netinet/in.h) + AC_CHECK_TYPE(in_addr_t, ,[AC_DEFINE_UNQUOTED([in_addr_t], [uint32_t], [Define to 'uint32_t' if <netinet/in.h> does not define.])], [#include <netinet/in.h>]) + +@@ -29,6 +30,8 @@ + AM_GNU_GETTEXT + #AM_GNU_GETTEXT([external]) + ++AC_CHECK_FUNCS([bindtextdomain textdomain iconv]) ++ + dnl reasonable guesses for where stuff is installed + dnl if we don't do that now, the config.h will use ${prefix} + dnl for DEFAULT_DATABASE_PATH. +diff -ru hddtemp-0.3-beta15.orig/src/hddtemp.c hddtemp-0.3-beta15/src/hddtemp.c +--- hddtemp-0.3-beta15.orig/src/hddtemp.c 2006-04-19 03:37:35.000000000 +0100 ++++ hddtemp-0.3-beta15/src/hddtemp.c 2008-06-26 23:59:40.000000000 +0100 +@@ -276,8 +276,12 @@ + backtrace_sigbus(); + + setlocale (LC_ALL, ""); ++#ifdef HAVE_BINDTEXTDOMAIN + bindtextdomain (PACKAGE, LOCALEDIR); ++#endif ++#ifdef HAVE_TEXTDOMAIN + textdomain (PACKAGE); ++#endif + + show_db = debug = numeric = quiet = wakeup = af_hint = syslog_interval = 0; + unit = DEFAULT; +diff -ru hddtemp-0.3-beta15.orig/src/utf8.c hddtemp-0.3-beta15/src/utf8.c +--- hddtemp-0.3-beta15.orig/src/utf8.c 2006-04-19 03:37:02.000000000 +0100 ++++ hddtemp-0.3-beta15/src/utf8.c 2008-06-27 00:02:15.000000000 +0100 +@@ -23,7 +23,9 @@ + + // Standard includes + #include <stdlib.h> ++#ifdef HAVE_ICONV_H + #include <iconv.h> ++#endif + #include <langinfo.h> + #include <locale.h> + #include <string.h> +@@ -34,6 +36,7 @@ + + static char *iconv_from_utf8_to_locale(const char *string, const char* fallback_string) + { ++#ifdef HAVE_ICONV + const size_t buffer_inc = 80; // Increment buffer size in 80 bytes step + const char *charset; + iconv_t cd; +@@ -93,6 +96,8 @@ + if (dest_buffer != NULL) + free(dest_buffer); // free buffer + free(src_buffer); // free string ++#endif ++ + return strdup(fallback_string); // and return fallback string + } + diff --git a/meta-openvuplus/recipes-extended/hddtemp/hddtemp_0.3-beta15.bb b/meta-openvuplus/recipes-extended/hddtemp/hddtemp_0.3-beta15.bb new file mode 100644 index 0000000..8ef9a2c --- /dev/null +++ b/meta-openvuplus/recipes-extended/hddtemp/hddtemp_0.3-beta15.bb @@ -0,0 +1,22 @@ +SUMMARY = "Hard disk temperature monitor daemon" +SECTION = "console/network" +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://GPL-2;md5=eb723b61539feef013de476e68b5c50a" +PR = "r1" + +SRC_URI = "http://download.savannah.nongnu.org/releases/${PN}/${PN}-${PV}.tar.bz2;name=tar \ + http://download.savannah.nongnu.org/releases/${PN}/hddtemp.db;name=db \ + file://hddtemp-no-nls-support.patch" +SRC_URI[tar.md5sum] = "8b829339e1ae9df701684ec239021bb8" +SRC_URI[tar.sha256sum] = "618541584054093d53be8a2d9e81c97174f30f00af91cb8700a97e442d79ef5b" +SRC_URI[db.md5sum] = "5321858f8c028d4b1a91a8a5f951f2f8" +SRC_URI[db.sha256sum] = "8b19e70228214562eb10a46bd73b6ea8601e996f2d6527907b560d35b33f5240" + +inherit autotools gettext + +FILES_${PN} += "/usr/share/misc/hddtemp.db" + +do_install_append() { + install -d ${D}/usr/share/misc/ + install -m 0644 ${WORKDIR}/hddtemp.db ${D}/usr/share/misc/hddtemp.db +} diff --git a/meta-openvuplus/recipes-extended/joe/joe_3.7.bb b/meta-openvuplus/recipes-extended/joe/joe_3.7.bb new file mode 100644 index 0000000..436fd07 --- /dev/null +++ b/meta-openvuplus/recipes-extended/joe/joe_3.7.bb @@ -0,0 +1,14 @@ +SUMMARY = "Console text editor with good functionality, good choice for vi-haters." +HOMEPAGE = "http://joe-editor.sourceforge.net/" +SECTION = "console/utils" +LICENSE = "GPL-1.0" +LIC_FILES_CHKSUM = "file://COPYING;md5=da10ed7cf8038981c580e11c1d3e8fb6" +PR = "r2" + +SRC_URI = "${SOURCEFORGE_MIRROR}/joe-editor/joe-${PV}.tar.gz" +SRC_URI[md5sum] = "66de1b073e869ba12abbfcde3885c577" +SRC_URI[sha256sum] = "cae456e1ad5a8c1d3c94920a3416c2347277739b260e3494d3bc0f2b9b73106f" + +inherit autotools + +RDEPENDS_${PN} = "ncurses-terminfo" diff --git a/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-extfs-dir.patch b/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-extfs-dir.patch new file mode 100644 index 0000000..aebb31e --- /dev/null +++ b/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-extfs-dir.patch @@ -0,0 +1,18 @@ +Upstream-Status: Inappropriate [Configuration] + +Don't show "Warning: cannot open /usr/libexec/mc/extfs.d directory", +because it's packaged separately. + +Signed-off-by: Andreas Oberritter <obi@opendreambox.org> + +--- mc-4.8.1/src/vfs/extfs/extfs.c.orig 2012-05-10 15:50:04.633833530 +0200 ++++ mc-4.8.1/src/vfs/extfs/extfs.c 2012-05-10 15:50:20.349833289 +0200 +@@ -1558,8 +1558,6 @@ + * appear on screen. */ + if (dir == NULL) + { +- if (!silent) +- fprintf (stderr, _("Warning: cannot open %s directory\n"), dirname); + g_free (dirname); + return FALSE; + } diff --git a/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-hints.patch b/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-hints.patch new file mode 100644 index 0000000..a0ccdcd --- /dev/null +++ b/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-hints.patch @@ -0,0 +1,17 @@ +Upstream-Status: Pending + +Fixes a text drawing issue if hints are unavailable. + +Signed-off-by: Andreas Oberritter <obi@opendreambox.org> + +--- mc-4.8.1/src/filemanager/midnight.c.orig 2012-05-10 15:30:56.645804130 +0200 ++++ mc-4.8.1/src/filemanager/midnight.c 2012-05-10 15:31:27.601804920 +0200 +@@ -1587,7 +1587,7 @@ + { + char text[BUF_SMALL]; + +- g_snprintf (text, sizeof (text), _("GNU Midnight Commander %s\n"), VERSION); ++ g_snprintf (text, sizeof (text), _("GNU Midnight Commander %s"), VERSION); + set_hintbar (text); + } + } diff --git a/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-sfs-ini.patch b/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-sfs-ini.patch new file mode 100644 index 0000000..fd5afd3 --- /dev/null +++ b/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-sfs-ini.patch @@ -0,0 +1,17 @@ +Upstream-Status: Inappropriate [Configuration] + +Don't show "sfs_init(): Warning: file /etc/mc/sfs.ini not found", +because it's packaged separately. + +Signed-off-by: Andreas Oberritter <obi@opendreambox.org> + +--- mc-4.8.1/src/vfs/sfs/sfs.c.orig 2012-05-10 15:48:05.405830465 +0200 ++++ mc-4.8.1/src/vfs/sfs/sfs.c 2012-05-10 15:48:24.389830919 +0200 +@@ -419,7 +419,6 @@ + + if (cfg == NULL) + { +- fprintf (stderr, _("%s: Warning: file %s not found\n"), "sfs_init()", mc_sfsini); + g_free (mc_sfsini); + return 0; + } diff --git a/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-syntax-file.patch b/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-syntax-file.patch new file mode 100644 index 0000000..ee0ee46 --- /dev/null +++ b/meta-openvuplus/recipes-extended/mc/mc-4.8.1/optional-syntax-file.patch @@ -0,0 +1,18 @@ +Upstream-Status: Inappropriate [Configuration] + +Don't show an error message if the syntax file can't +be opened, because it's packaged separately. + +Signed-off-by: Andreas Oberritter <obi@opendreambox.org> + +--- mc-4.8.1/src/editor/syntax.c.orig 2011-12-12 10:15:38.000000000 +0100 ++++ mc-4.8.1/src/editor/syntax.c 2012-05-10 15:07:56.517768788 +0200 +@@ -1522,8 +1522,6 @@ + if (r == -1) + { + edit_free_syntax_rules (edit); +- message (D_ERROR, _("Load syntax file"), +- _("Cannot open file %s\n%s"), f, unix_error_string (errno)); + } + else if (r != 0) + { diff --git a/meta-openvuplus/recipes-extended/mc/mc_4.8.1.bbappend b/meta-openvuplus/recipes-extended/mc/mc_4.8.1.bbappend new file mode 100644 index 0000000..73b41c6 --- /dev/null +++ b/meta-openvuplus/recipes-extended/mc/mc_4.8.1.bbappend @@ -0,0 +1,26 @@ +PR .= "-vuplus0" + +SRC_URI += "file://optional-extfs-dir.patch \ + file://optional-hints.patch \ + file://optional-sfs-ini.patch \ + file://optional-syntax-file.patch" + +PACKAGES += "${PN}-full" + +RDEPENDS_${PN} = "" +RDEPENDS_${PN}-full = "ncurses-terminfo" + +RSUGGESTS_${PN} = "${PN}-full" + +FILES_${PN} = " \ + ${bindir}/* \ + ${sysconfdir}/mc/filehighlight.ini \ + ${sysconfdir}/mc/*.ext \ + ${sysconfdir}/mc/*.keymap \ + ${sysconfdir}/mc/*.menu \ + ${datadir}/${BPN}/mc.* \ + ${datadir}/${BPN}/skins/default.ini \ +" +FILES_${PN}-full = "${libexecdir}/* ${sysconfdir} ${datadir}/${BPN}" + +FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" diff --git a/meta-openvuplus/recipes-extended/ncdu/ncdu_1.8.bb b/meta-openvuplus/recipes-extended/ncdu/ncdu_1.8.bb new file mode 100644 index 0000000..75e0641 --- /dev/null +++ b/meta-openvuplus/recipes-extended/ncdu/ncdu_1.8.bb @@ -0,0 +1,11 @@ +SUMMARY = "NCurses Disk Usage" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://COPYING;md5=321d4ec4e1e7746028446d003a975868" +DEPENDS = "ncurses" +PR = "r1" + +SRC_URI = "http://dev.yorhel.nl/download/ncdu-${PV}.tar.gz" +SRC_URI[md5sum] = "94d7a821f8a0d7ba8ef3dd926226f7d5" +SRC_URI[sha256sum] = "42aaf0418c05e725b39b220166a9c604a9c54c0fbf7692c9c119b36d0ed5d099" + +inherit autotools diff --git a/meta-openvuplus/recipes-extended/shadow/shadow-securetty/securetty b/meta-openvuplus/recipes-extended/shadow/shadow-securetty/securetty new file mode 100644 index 0000000..e1dfa24 --- /dev/null +++ b/meta-openvuplus/recipes-extended/shadow/shadow-securetty/securetty @@ -0,0 +1,275 @@ +# /etc/securetty: list of terminals on which root is allowed to login. +# See securetty(5) and login(1). +console + +# Standard serial ports +ttyS0 +ttyS1 +ttyS2 +ttyS3 + +# Samsung ARM SoCs +ttySAC0 +ttySAC1 +ttySAC2 +ttySAC3 + +# TI OMAP SoCs +ttyO0 +ttyO1 +ttyO2 +ttyO3 + +# USB dongles +ttyUSB0 +ttyUSB1 +ttyUSB2 + +# USB serial gadget +ttyGS0 + +# PowerMac +ttyPZ0 +ttyPZ1 +ttyPZ2 +ttyPZ3 + +# Embedded MPC platforms +ttyPSC0 +ttyPSC1 +ttyPSC2 +ttyPSC3 +ttyPSC4 +ttyPSC5 + +# PA-RISC mux ports +ttyB0 +ttyB1 + +# Standard hypervisor virtual console +hvc0 + +# Oldstyle Xen console +xvc0 + +# Standard consoles +tty1 +tty2 +tty3 +tty4 +tty5 +tty6 +tty7 +tty8 +tty9 +tty10 +tty11 +tty12 +tty13 +tty14 +tty15 +tty16 +tty17 +tty18 +tty19 +tty20 +tty21 +tty22 +tty23 +tty24 +tty25 +tty26 +tty27 +tty28 +tty29 +tty30 +tty31 +tty32 +tty33 +tty34 +tty35 +tty36 +tty37 +tty38 +tty39 +tty40 +tty41 +tty42 +tty43 +tty44 +tty45 +tty46 +tty47 +tty48 +tty49 +tty50 +tty51 +tty52 +tty53 +tty54 +tty55 +tty56 +tty57 +tty58 +tty59 +tty60 +tty61 +tty62 +tty63 + +# Local X displays (allows empty passwords with pam_unix's nullok_secure) +:0 +:0.0 +:0.1 +:1 +:1.0 +:1.1 +:2 +:2.0 +:2.1 +:3 +:3.0 +:3.1 + +# Embedded Freescale i.MX ports +ttymxc0 +ttymxc1 +ttymxc2 +ttymxc3 +ttymxc4 +ttymxc5 + +# Standard serial ports, with devfs +tts/0 +tts/1 + +# Standard consoles, with devfs +vc/1 +vc/2 +vc/3 +vc/4 +vc/5 +vc/6 +vc/7 +vc/8 +vc/9 +vc/10 +vc/11 +vc/12 +vc/13 +vc/14 +vc/15 +vc/16 +vc/17 +vc/18 +vc/19 +vc/20 +vc/21 +vc/22 +vc/23 +vc/24 +vc/25 +vc/26 +vc/27 +vc/28 +vc/29 +vc/30 +vc/31 +vc/32 +vc/33 +vc/34 +vc/35 +vc/36 +vc/37 +vc/38 +vc/39 +vc/40 +vc/41 +vc/42 +vc/43 +vc/44 +vc/45 +vc/46 +vc/47 +vc/48 +vc/49 +vc/50 +vc/51 +vc/52 +vc/53 +vc/54 +vc/55 +vc/56 +vc/57 +vc/58 +vc/59 +vc/60 +vc/61 +vc/62 +vc/63 + +# Pseudo terminals +pts/0 +pts/1 +pts/2 +pts/3 +pts/4 +pts/5 +pts/6 +pts/7 +pts/8 +pts/9 +pts/10 +pts/11 +pts/12 +pts/13 +pts/14 +pts/15 +pts/16 +pts/17 +pts/18 +pts/19 +pts/20 +pts/21 +pts/22 +pts/23 +pts/24 +pts/25 +pts/26 +pts/27 +pts/28 +pts/29 +pts/30 +pts/31 +pts/32 +pts/33 +pts/34 +pts/35 +pts/36 +pts/37 +pts/38 +pts/39 +pts/40 +pts/41 +pts/42 +pts/43 +pts/44 +pts/45 +pts/46 +pts/47 +pts/48 +pts/49 +pts/50 +pts/51 +pts/52 +pts/53 +pts/54 +pts/55 +pts/56 +pts/57 +pts/58 +pts/59 +pts/60 +pts/61 +pts/62 +pts/63 diff --git a/meta-openvuplus/recipes-extended/shadow/shadow-securetty_4.1.4.3.bbappend b/meta-openvuplus/recipes-extended/shadow/shadow-securetty_4.1.4.3.bbappend new file mode 100644 index 0000000..f6a5fef --- /dev/null +++ b/meta-openvuplus/recipes-extended/shadow/shadow-securetty_4.1.4.3.bbappend @@ -0,0 +1,3 @@ +PR .= "-vuplus0" + +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" diff --git a/meta-openvuplus/recipes-extended/smartmontools/smartmontools.inc b/meta-openvuplus/recipes-extended/smartmontools/smartmontools.inc new file mode 100644 index 0000000..c1ded3a --- /dev/null +++ b/meta-openvuplus/recipes-extended/smartmontools/smartmontools.inc @@ -0,0 +1,10 @@ +SECTION = "console/utils" +SUMMARY = "Control and monitor storage systems using S.M.A.R.T." +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" +INC_PR = "r1" + +SRC_URI = "${SOURCEFORGE_MIRROR}/smartmontools/smartmontools-${PV}.tar.gz" +S = "${WORKDIR}/smartmontools-${PV}" + +inherit autotools diff --git a/meta-openvuplus/recipes-extended/smartmontools/smartmontools_5.42.bb b/meta-openvuplus/recipes-extended/smartmontools/smartmontools_5.42.bb new file mode 100644 index 0000000..98ebb37 --- /dev/null +++ b/meta-openvuplus/recipes-extended/smartmontools/smartmontools_5.42.bb @@ -0,0 +1,6 @@ +PR = "${INC_PR}.0" + +SRC_URI[md5sum] = "4460bf9a79a1252ff5c00ba52cf76b2a" +SRC_URI[sha256sum] = "b664d11e814e114ce3a32a4fa918c9e649c684e2897c007b2a8b92574decc374" + +require smartmontools.inc diff --git a/meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/Makefile.in.patch b/meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/Makefile.in.patch new file mode 100644 index 0000000..40cf4ad --- /dev/null +++ b/meta-openvuplus/recipes-multimedia/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-multimedia/cdparanoia/cdparanoia/cdparanoia-III-10.2-privatefix.patch b/meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/cdparanoia-III-10.2-privatefix.patch new file mode 100644 index 0000000..55f39b2 --- /dev/null +++ b/meta-openvuplus/recipes-multimedia/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_len<out_size){ + long i,flag=0; + for(i=in_size;i<out_size;i++) +- if(d->private->sg_buffer[i]!=bytefill){ ++ if(d->impl->sg_buffer[i]!=bytefill){ + flag=1; + break; + } +@@ -326,9 +326,9 @@ + + errno=0; + if(tret1<0 || tret2<0){ +- d->private->last_milliseconds=-1; ++ d->impl->last_milliseconds=-1; + }else{ +- d->private->last_milliseconds = (tv2.tv_sec-tv1.tv_sec)*1000 + (tv2.tv_nsec-tv1.tv_nsec)/1000000; ++ d->impl->last_milliseconds = (tv2.tv_sec-tv1.tv_sec)*1000 + (tv2.tv_nsec-tv1.tv_nsec)/1000000; + } + return(0); + } +@@ -347,7 +347,7 @@ + + memset(&hdr,0,sizeof(hdr)); + memset(sense,0,sizeof(sense)); +- memcpy(d->private->sg_buffer,cmd+cmd_len,in_size); ++ memcpy(d->impl->sg_buffer,cmd+cmd_len,in_size); + + hdr.cmdp = cmd; + hdr.cmd_len = cmd_len; +@@ -355,7 +355,7 @@ + hdr.mx_sb_len = SG_MAX_SENSE; + hdr.timeout = 50000; + hdr.interface_id = 'S'; +- hdr.dxferp = d->private->sg_buffer; ++ hdr.dxferp = d->impl->sg_buffer; + hdr.flags = SG_FLAG_DIRECT_IO; /* direct IO if we can get it */ + + /* scary buffer fill hack */ +@@ -400,7 +400,7 @@ + if(bytecheck && in_size<out_size){ + long i,flag=0; + for(i=in_size;i<out_size;i++) +- if(d->private->sg_buffer[i]!=bytefill){ ++ if(d->impl->sg_buffer[i]!=bytefill){ + flag=1; + break; + } +@@ -412,7 +412,7 @@ + } + + /* Can't rely on .duration because we can't be certain kernel has HZ set to something useful */ +- /* d->private->last_milliseconds = hdr.duration; */ ++ /* d->impl->last_milliseconds = hdr.duration; */ + + errno = 0; + return 0; +@@ -445,9 +445,9 @@ + + handle_scsi_cmd(d, cmd, 6, 0, 56, 0,0, sense); + +- key = d->private->sg_buffer[2] & 0xf; +- ASC = d->private->sg_buffer[12]; +- ASCQ = d->private->sg_buffer[13]; ++ key = d->impl->sg_buffer[2] & 0xf; ++ ASC = d->impl->sg_buffer[12]; ++ ASCQ = d->impl->sg_buffer[13]; + + if(key == 2 && ASC == 4 && ASCQ == 1) return 0; + return 1; +@@ -492,7 +492,7 @@ + if (handle_scsi_cmd (d, cmd, 10, 0, size+4,'\377',1,sense)) return(1); + + { +- unsigned char *b=d->private->sg_buffer; ++ unsigned char *b=d->impl->sg_buffer; + if(b[0])return(1); /* Handles only up to 256 bytes */ + if(b[6])return(1); /* Handles only up to 256 bytes */ + +@@ -604,8 +604,8 @@ + static unsigned int get_orig_sectorsize(cdrom_drive *d){ + if(mode_sense(d,12,0x01))return(-1); + +- d->orgdens = d->private->sg_buffer[4]; +- return(d->orgsize = ((int)(d->private->sg_buffer[10])<<8)+d->private->sg_buffer[11]); ++ d->orgdens = d->impl->sg_buffer[4]; ++ return(d->orgsize = ((int)(d->impl->sg_buffer[10])<<8)+d->impl->sg_buffer[11]); + } + + /* switch CDROM scsi drives to given sector size */ +@@ -664,8 +664,8 @@ + return(-4); + } + +- first=d->private->sg_buffer[2]; +- last=d->private->sg_buffer[3]; ++ first=d->impl->sg_buffer[2]; ++ last=d->impl->sg_buffer[3]; + tracks=last-first+1; + + if (last > MAXTRK || first > MAXTRK || last<0 || first<0) { +@@ -683,7 +683,7 @@ + return(-5); + } + { +- scsi_TOC *toc=(scsi_TOC *)(d->private->sg_buffer+4); ++ scsi_TOC *toc=(scsi_TOC *)(d->impl->sg_buffer+4); + + d->disc_toc[i-first].bFlags=toc->bFlags; + d->disc_toc[i-first].bTrack=i; +@@ -704,7 +704,7 @@ + return(-2); + } + { +- scsi_TOC *toc=(scsi_TOC *)(d->private->sg_buffer+4); ++ scsi_TOC *toc=(scsi_TOC *)(d->impl->sg_buffer+4); + + d->disc_toc[i-first].bFlags=toc->bFlags; + d->disc_toc[i-first].bTrack=0xAA; +@@ -738,7 +738,7 @@ + } + + /* copy to our structure and convert start sector */ +- tracks = d->private->sg_buffer[1]; ++ tracks = d->impl->sg_buffer[1]; + if (tracks > MAXTRK) { + cderror(d,"003: CDROM reporting illegal number of tracks\n"); + return(-3); +@@ -754,33 +754,33 @@ + return(-5); + } + +- d->disc_toc[i].bFlags = d->private->sg_buffer[10]; ++ d->disc_toc[i].bFlags = d->impl->sg_buffer[10]; + d->disc_toc[i].bTrack = i + 1; + + d->disc_toc[i].dwStartSector= d->adjust_ssize * +- (((signed char)(d->private->sg_buffer[2])<<24) | +- (d->private->sg_buffer[3]<<16)| +- (d->private->sg_buffer[4]<<8)| +- (d->private->sg_buffer[5])); ++ (((signed char)(d->impl->sg_buffer[2])<<24) | ++ (d->impl->sg_buffer[3]<<16)| ++ (d->impl->sg_buffer[4]<<8)| ++ (d->impl->sg_buffer[5])); + } + + d->disc_toc[i].bFlags = 0; + d->disc_toc[i].bTrack = i + 1; +- memcpy (&foo, d->private->sg_buffer+2, 4); +- memcpy (&bar, d->private->sg_buffer+6, 4); ++ memcpy (&foo, d->impl->sg_buffer+2, 4); ++ memcpy (&bar, d->impl->sg_buffer+6, 4); + d->disc_toc[i].dwStartSector = d->adjust_ssize * (be32_to_cpu(foo) + + be32_to_cpu(bar)); + + d->disc_toc[i].dwStartSector= d->adjust_ssize * +- ((((signed char)(d->private->sg_buffer[2])<<24) | +- (d->private->sg_buffer[3]<<16)| +- (d->private->sg_buffer[4]<<8)| +- (d->private->sg_buffer[5]))+ ++ ((((signed char)(d->impl->sg_buffer[2])<<24) | ++ (d->impl->sg_buffer[3]<<16)| ++ (d->impl->sg_buffer[4]<<8)| ++ (d->impl->sg_buffer[5]))+ + +- ((((signed char)(d->private->sg_buffer[6])<<24) | +- (d->private->sg_buffer[7]<<16)| +- (d->private->sg_buffer[8]<<8)| +- (d->private->sg_buffer[9])))); ++ ((((signed char)(d->impl->sg_buffer[6])<<24) | ++ (d->impl->sg_buffer[7]<<16)| ++ (d->impl->sg_buffer[8]<<8)| ++ (d->impl->sg_buffer[9])))); + + + d->cd_extra = FixupTOC(d,tracks+1); +@@ -817,7 +817,7 @@ + cmd[8] = sectors; + if((ret=handle_scsi_cmd(d,cmd,10,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -836,7 +836,7 @@ + cmd[9] = sectors; + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -854,7 +854,7 @@ + cmd[8] = sectors; + if((ret=handle_scsi_cmd(d,cmd,10,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -872,7 +872,7 @@ + cmd[9] = sectors; + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -890,7 +890,7 @@ + cmd[8] = sectors; + if((ret=handle_scsi_cmd(d,cmd,10,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -908,7 +908,7 @@ + cmd[9] = sectors; + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -922,7 +922,7 @@ + cmd[8] = sectors; + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -936,7 +936,7 @@ + cmd[8] = sectors; + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -950,7 +950,7 @@ + cmd[8] = sectors; + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -964,7 +964,7 @@ + cmd[8] = sectors; + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -978,7 +978,7 @@ + cmd[8] = sectors; + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -992,7 +992,7 @@ + cmd[8] = sectors; + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -1026,7 +1026,7 @@ + + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -1039,7 +1039,7 @@ + + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -1052,7 +1052,7 @@ + + if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense))) + return(ret); +- if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW); ++ if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW); + return(0); + } + +@@ -1275,7 +1275,7 @@ + static int count_2352_bytes(cdrom_drive *d){ + long i; + for(i=2351;i>=0;i--) +- if(d->private->sg_buffer[i]!=(unsigned char)'\177') ++ if(d->impl->sg_buffer[i]!=(unsigned char)'\177') + return(((i+3)>>2)<<2); + + return(0); +@@ -1284,7 +1284,7 @@ + static int verify_nonzero(cdrom_drive *d){ + long i,flag=0; + for(i=0;i<2352;i++) +- if(d->private->sg_buffer[i]!=0){ ++ if(d->impl->sg_buffer[i]!=0){ + flag=1; + break; + } +@@ -1625,7 +1625,7 @@ + d->is_mmc=0; + if(mode_sense(d,22,0x2A)==0){ + +- b=d->private->sg_buffer; ++ b=d->impl->sg_buffer; + b+=b[3]+4; + + if((b[0]&0x3F)==0x2A){ +@@ -1673,7 +1673,7 @@ + cderror(d,"008: Unable to identify CDROM model\n"); + return(NULL); + } +- return (d->private->sg_buffer); ++ return (d->impl->sg_buffer); + } + + int scsi_init_drive(cdrom_drive *d){ +@@ -1742,8 +1742,8 @@ + check_cache(d); + + d->error_retry=1; +- d->private->sg_hd=realloc(d->private->sg_hd,d->nsectors*CD_FRAMESIZE_RAW + SG_OFF + 128); +- d->private->sg_buffer=((unsigned char *)d->private->sg_hd)+SG_OFF; ++ d->impl->sg_hd=realloc(d->impl->sg_hd,d->nsectors*CD_FRAMESIZE_RAW + SG_OFF + 128); ++ d->impl->sg_buffer=((unsigned char *)d->impl->sg_hd)+SG_OFF; + d->report_all=1; + return(0); + } diff --git a/meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/configure.in.patch b/meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/configure.in.patch new file mode 100644 index 0000000..2ca2516 --- /dev/null +++ b/meta-openvuplus/recipes-multimedia/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-multimedia/cdparanoia/cdparanoia/fixes10.patch b/meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/fixes10.patch new file mode 100644 index 0000000..414ff39 --- /dev/null +++ b/meta-openvuplus/recipes-multimedia/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-multimedia/cdparanoia/cdparanoia/interface_Makefile.in.patch b/meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/interface_Makefile.in.patch new file mode 100644 index 0000000..4dbd2bb --- /dev/null +++ b/meta-openvuplus/recipes-multimedia/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-multimedia/cdparanoia/cdparanoia/paranoia_Makefile.in.patch b/meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia/paranoia_Makefile.in.patch new file mode 100644 index 0000000..962a43a --- /dev/null +++ b/meta-openvuplus/recipes-multimedia/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-multimedia/cdparanoia/cdparanoia_svn.bb b/meta-openvuplus/recipes-multimedia/cdparanoia/cdparanoia_svn.bb new file mode 100644 index 0000000..b88c74b --- /dev/null +++ b/meta-openvuplus/recipes-multimedia/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-multimedia/dvbtools/dvb-apps-1.1.1/update-to-tip.diff b/meta-openvuplus/recipes-multimedia/dvbtools/dvb-apps-1.1.1/update-to-tip.diff new file mode 100644 index 0000000..b91a750 --- /dev/null +++ b/meta-openvuplus/recipes-multimedia/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 <pfister@linuxtv.org> +date Sun Nov 28 21:24:42 2010 +0100 (3 weeks ago) +parents ce1c094b9636 + + +Make.rules | 2 + README | 7 + a/util/scan/dvb-t/be-Brussels | 5 + a/util/scan/dvb-t/be-Libramont | 10 + a/util/scan/dvb-t/be-Schoten | 3 + a/util/scan/dvb-t/be-St_Pieters_Leeuw | 3 + a/util/scan/dvb-t/be-Tournai | 3 + a/util/scan/dvb-t/cz-Brno | 10 + a/util/scan/dvb-t/cz-Domazlice | 3 + a/util/scan/dvb-t/cz-Klet | 4 + a/util/scan/dvb-t/cz-Ostrava | 3 + a/util/scan/dvb-t/cz-Plzen | 8 + a/util/scan/dvb-t/cz-Praha | 7 + a/util/scan/dvb-t/fr-Lille | 30 + a/util/scan/dvb-t/fr-LilleT2 | 13 + a/util/scan/dvb-t/hr-Zagreb | 3 + b/util/alevt/COPYRIGHT | 297 + + b/util/alevt/ChangeLog | 535 ++ + b/util/alevt/EXPORT.HOWTO | 84 + b/util/alevt/Makefile | 130 + b/util/alevt/README | 72 + b/util/alevt/README.OLD | 78 + b/util/alevt/ReadmeGR | 28 + b/util/alevt/TODO | 12 + b/util/alevt/alevt-cap.1 | 53 + b/util/alevt/alevt-cap.c | 280 + + b/util/alevt/alevt-date.1 | 41 + b/util/alevt/alevt-date.c | 225 + + b/util/alevt/alevt.1 | 60 + b/util/alevt/alevt.desktop | 9 + b/util/alevt/bdf2xbm.c | 212 + + b/util/alevt/cache.c | 229 + + b/util/alevt/cache.h | 41 + b/util/alevt/dllist.h | 55 + b/util/alevt/exp-gfx.c | 258 + + b/util/alevt/exp-html.c | 299 + + b/util/alevt/exp-txt.c | 226 + + b/util/alevt/export.c | 364 + + b/util/alevt/export.h | 66 + b/util/alevt/fdset.c | 97 + b/util/alevt/fdset.h | 28 + b/util/alevt/font.c | 5 + b/util/alevt/font.h | 19 + b/util/alevt/hamm.c | 229 + + b/util/alevt/hamm.h | 7 + b/util/alevt/help.c | 83 + b/util/alevt/help.h | 8 + b/util/alevt/icon.xbm | 17 + b/util/alevt/lang.c | 393 + + b/util/alevt/lang.h | 28 + b/util/alevt/main.c | 221 + + b/util/alevt/misc.c | 66 + b/util/alevt/misc.h | 32 + b/util/alevt/os.h | 7 + b/util/alevt/search.c | 127 + b/util/alevt/search.h | 16 + b/util/alevt/ui.c | 721 +++ + b/util/alevt/ui.h | 35 + b/util/alevt/vbi.c | 942 ++++ + b/util/alevt/vbi.h | 47 + b/util/alevt/vt.h | 62 + b/util/alevt/vt900.out | 29 + b/util/alevt/vt901.out | 29 + b/util/alevt/vt902.out | 29 + b/util/alevt/vt903.out | 29 + b/util/alevt/vt904.out | 29 + b/util/alevt/vt905.out | 29 + b/util/alevt/vt906.out | 29 + b/util/alevt/vt907.out | 29 + b/util/alevt/vt908.out | 29 + b/util/alevt/vt909.out | 29 + b/util/alevt/vt910.out | 29 + b/util/alevt/vt911.out | 29 + b/util/alevt/vt912.out | 29 + b/util/alevt/vt913.out | 29 + b/util/alevt/vt914.out | 29 + b/util/alevt/vt915.out | 29 + b/util/alevt/vtxt-iso8859-7.bdf | 5768 ++++++++++++++++++++++++++++ + b/util/alevt/vtxt-koi8.bdf | 5906 +++++++++++++++++++++++++++++ + b/util/alevt/vtxt-latin-1.bdf | 5906 +++++++++++++++++++++++++++++ + b/util/alevt/vtxt-latin-2.bdf | 5906 +++++++++++++++++++++++++++++ + b/util/alevt/xio.c | 1156 +++++ + b/util/alevt/xio.h | 80 + b/util/gotox/Makefile | 17 + b/util/gotox/gotox.c | 145 + b/util/scan/dvb-c/at-Kabel-Braunau | 26 + b/util/scan/dvb-c/at-Kabelsignal | 38 + b/util/scan/dvb-c/de-komro-Rosenheim | 30 + b/util/scan/dvb-c/fi-Oulu | 19 + b/util/scan/dvb-c/hu-Digikabel | 21 + b/util/scan/dvb-c/nl-REKAM-CAIW_Gouda | 4 + b/util/scan/dvb-s/Agila2_C-146.0E | 60 + b/util/scan/dvb-s/Apstar6_C-134.0E | 15 + b/util/scan/dvb-s/AsiaSat2_C-100.5E | 51 + b/util/scan/dvb-s/Asiasat4_C-122.2E | 27 + b/util/scan/dvb-s/Astra-23.5E | 66 + b/util/scan/dvb-s/Atlantic-Bird-3-5.0W | 4 + b/util/scan/dvb-s/Chinastar1_C-87.5E | 15 + b/util/scan/dvb-s/Insat2E_C-83.0E | 93 + b/util/scan/dvb-s/Insat3A_C-93.5E | 66 + b/util/scan/dvb-s/Insat4A_C-83.0E | 93 + b/util/scan/dvb-s/Insat4B_C-93.5E | 51 + b/util/scan/dvb-s/Intelsat8_C-166.0E | 39 + b/util/scan/dvb-s/JCSat3A_C-128.0E | 18 + b/util/scan/dvb-s/Measat3_C-91.5E | 54 + b/util/scan/dvb-s/PalapaC2_C-113.0E | 39 + b/util/scan/dvb-s/ST1_C-80.0E | 27 + b/util/scan/dvb-s/Telkom1_C-108.0E | 48 + b/util/scan/dvb-s/Telstar10_C-76.5E | 63 + b/util/scan/dvb-s/Telstar18_C-138.0E | 18 + b/util/scan/dvb-s/Thaicom1A_C-120.0E | 24 + b/util/scan/dvb-s/Thaicom2_C-78.5E | 33 + b/util/scan/dvb-s/Thaicom5_C-78.5E | 69 + b/util/scan/dvb-s/Vinasat1_C-132.0E | 12 + b/util/scan/dvb-t/au-AdelaideFoothills | 12 + b/util/scan/dvb-t/au-Ballarat | 12 + b/util/scan/dvb-t/au-Bendigo | 41 + b/util/scan/dvb-t/au-Devonport | 19 + b/util/scan/dvb-t/au-FraserCoast-Bundaberg | 12 + b/util/scan/dvb-t/au-Goulburn-Rocky_Hill | 19 + b/util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill | 16 + b/util/scan/dvb-t/au-Sutherland | 20 + b/util/scan/dvb-t/be-All | 8 + b/util/scan/dvb-t/ch-Geneva | 16 + b/util/scan/dvb-t/cz-All | 41 + b/util/scan/dvb-t/es-BaixoMinho | 16 + b/util/scan/dvb-t/es-Granada | 8 + b/util/scan/dvb-t/es-Pamplona | 9 + b/util/scan/dvb-t/es-SC_Tenerife | 18 + b/util/scan/dvb-t/es-Vitoria-Gasteiz | 8 + b/util/scan/dvb-t/fi-Smedsbole | 13 + b/util/scan/dvb-t/fr-Lille-Bouvigny | 26 + b/util/scan/dvb-t/fr-Rochefort-sur-mer | 14 + b/util/scan/dvb-t/hr-All | 30 + b/util/scan/dvb-t/hu-Budapest | 8 + b/util/scan/dvb-t/hu-Debrecen | 8 + b/util/scan/dvb-t/hu-Gyor | 8 + b/util/scan/dvb-t/hu-Kabhegy | 8 + b/util/scan/dvb-t/hu-Kekes | 8 + b/util/scan/dvb-t/hu-Kiskoros | 8 + b/util/scan/dvb-t/hu-Nagykanizsa-Ujudvar | 8 + b/util/scan/dvb-t/hu-Pecs | 8 + b/util/scan/dvb-t/hu-Szeged | 8 + b/util/scan/dvb-t/hu-Szentes | 8 + b/util/scan/dvb-t/hu-Tokaj | 8 + b/util/scan/dvb-t/hu-Uzd | 8 + b/util/scan/dvb-t/hu-Vasvar-Hegyhatsal | 8 + b/util/scan/dvb-t/il-All | 5 + b/util/scan/dvb-t/ir-Tehran | 4 + b/util/scan/dvb-t/it-Montevergine | 18 + b/util/scan/dvb-t/lt-All | 39 + b/util/scan/dvb-t/ro-Bucharest | 5 + b/util/scan/dvb-t/si-Ljubljana | 5 + b/util/scan/dvb-t/sk-Bardejov | 11 + b/util/scan/dvb-t/sk-Michalovce | 11 + b/util/scan/dvb-t/sk-Namestovo | 11 + b/util/scan/dvb-t/sk-Poprad | 11 + b/util/scan/dvb-t/sk-RimavskaSobota | 11 + b/util/scan/dvb-t/sk-Trencin | 12 + b/util/scan/dvb-t/sk-VelkyKrtis | 11 + b/util/scan/dvb-t/sk-Zilina | 11 + b/util/scan/dvb-t/vn-Thaibinh | 5 + b/util/szap/util.c | 126 + b/util/szap/util.h | 24 + lib/libdvben50221/en50221_stdcam_llci.c | 19 + lib/libdvbsec/dvbsec_api.c | 17 + test/Makefile | 1 + test/README | 2 + test/test_video.c | 53 + util/Makefile | 1 + util/femon/femon.c | 57 + util/scan/dvb-c/at-KarrerNet | 18 + util/scan/dvb-c/de-Primacom | 5 + util/scan/dvb-c/de-Unitymedia | 17 + util/scan/dvb-c/fi-Turku | 8 + util/scan/dvb-c/se-comhem | 22 + util/scan/dvb-s/AsiaSat3S_C-105.5E | 164 + util/scan/dvb-t/au-Adelaide | 2 + util/scan/dvb-t/au-Brisbane | 2 + util/scan/dvb-t/au-SunshineCoast | 2 + util/scan/dvb-t/ch-All | 1 + util/scan/dvb-t/de-Baden-Wuerttemberg | 23 + util/scan/dvb-t/de-Bayern | 56 + util/scan/dvb-t/de-Berlin | 13 + util/scan/dvb-t/de-Brandenburg | 4 + util/scan/dvb-t/de-Bremen | 8 + util/scan/dvb-t/de-Hamburg | 20 + util/scan/dvb-t/de-Hessen | 26 + util/scan/dvb-t/de-Mecklenburg-Vorpommern | 10 + util/scan/dvb-t/de-Niedersachsen | 33 + util/scan/dvb-t/de-Nordrhein-Westfalen | 16 + util/scan/dvb-t/de-Rheinland-Pfalz | 10 + util/scan/dvb-t/de-Saarland | 6 + util/scan/dvb-t/de-Sachsen | 14 + util/scan/dvb-t/de-Sachsen-Anhalt | 8 + util/scan/dvb-t/de-Schleswig-Holstein | 26 + util/scan/dvb-t/de-Thueringen | 8 + util/scan/dvb-t/dk-All | 16 + util/scan/dvb-t/es-Albacete | 20 + util/scan/dvb-t/es-Alfabia | 3 + util/scan/dvb-t/es-Collserola | 16 + util/scan/dvb-t/es-Las_Palmas | 22 + util/scan/dvb-t/es-Sevilla | 17 + util/scan/dvb-t/fr-Boulogne | 17 + util/scan/dvb-t/fr-Brest | 10 + util/scan/dvb-t/fr-Chambery | 42 + util/scan/dvb-t/fr-Laval | 12 + util/scan/dvb-t/fr-Montbeliard | 28 + util/scan/dvb-t/fr-Nantes | 13 + util/scan/dvb-t/fr-Poitiers | 12 + util/scan/dvb-t/fr-Reims | 18 + util/scan/dvb-t/fr-Tours | 32 + util/scan/dvb-t/gr-Athens | 2 + util/scan/dvb-t/is-Reykjavik | 42 + util/scan/dvb-t/it-Milano | 38 + util/scan/dvb-t/se-Horby_Sallerup | 2 + util/scan/dvb-t/se-Ornskoldsvik_As | 1 + util/scan/dvb-t/se-Skelleftea | 1 + util/scan/dvb-t/sk-BanskaBystrica | 9 + util/scan/dvb-t/sk-Bratislava | 9 + util/scan/dvb-t/sk-Kosice | 9 + util/scan/dvb-t/uk-Aberdare | 17 + util/scan/dvb-t/uk-Redruth | 13 + util/scan/dvb-t/uk-StocklandHill | 15 + util/scan/dvb-t/uk-Storeton | 15 + util/scan/dvb-t/uk-WinterHill | 18 + util/scan/scan.c | 11 + util/szap/Makefile | 2 + util/szap/azap.c | 27 + util/szap/czap.c | 91 + util/szap/szap.c | 97 + util/szap/tzap.c | 73 + 232 files changed, 34875 insertions(+), 778 deletions(-) +diff -r af23d23c278b Make.rules +--- a/Make.rules Sat Jun 20 16:47:55 2009 +0200 ++++ b/Make.rules Tue Dec 21 12:13:28 2010 +0100 +@@ -35,7 +35,7 @@ + sharedir ?= $(prefix)/share + + ifneq ($(DESTDIR),) +-DESTDIR = $(DESTDIR)/ ++DESTDIR := $(DESTDIR)/ + endif + + ifeq ($(V),1) +diff -r af23d23c278b README +--- a/README Sat Jun 20 16:47:55 2009 +0200 ++++ b/README Tue Dec 21 12:13:28 2010 +0100 +@@ -15,6 +15,8 @@ + util/dvbtraffic - Monitor traffic on a digital device. + util/femon - Monitor the tuning on a digital TV device. + util/zap - *Just* tunes a digital device - really intended for developers. ++util/gotox - Simple Rotor control utility ++util/alevt - Teletext capture and display utility + + Hardware Specific Utilities: + util/av7110_loadkeys - Load remote keys into an av7110 based card +@@ -36,5 +38,10 @@ + files as they are contained in the linuxtv-dvb-1.? release + and the 2.6.x Linux kernel. + ++AleVT is not compiled by the main Makefile, because it depends on external ++libraries which might not be available in your system (see util/alevt/README for ++details). If you have the required libraries, to compile AleVT go to util/alevt/ ++and type "make". ++ + Johannes Stezenbach <js@convergence.de> + Andrew de Quincey <adq_dvb@lidskialf.net> +diff -r af23d23c278b lib/libdvben50221/en50221_stdcam_llci.c +--- a/lib/libdvben50221/en50221_stdcam_llci.c Sat Jun 20 16:47:55 2009 +0200 ++++ b/lib/libdvben50221/en50221_stdcam_llci.c Tue Dec 21 12:13:28 2010 +0100 +@@ -374,14 +374,21 @@ + } else if (resource_id == EN50221_APP_MMI_RESOURCEID) { + llci->stdcam.mmi_session_number = session_number; + } ++ break; + ++ case S_SCALLBACK_REASON_CLOSE: ++ if (resource_id == EN50221_APP_MMI_RESOURCEID) { ++ llci->stdcam.mmi_session_number = -1; ++ } else if (resource_id == EN50221_APP_DATETIME_RESOURCEID) { ++ llci->datetime_session_number = -1; ++ } else if (resource_id == EN50221_APP_AI_RESOURCEID) { ++ llci->stdcam.ai_session_number = -1; ++ } else if (resource_id == EN50221_APP_CA_RESOURCEID) { ++ llci->stdcam.ca_session_number = -1; ++ } else if (resource_id == EN50221_APP_MMI_RESOURCEID) { ++ llci->stdcam.mmi_session_number = -1; ++ } + break; +- case S_SCALLBACK_REASON_CLOSE: +- if (resource_id == EN50221_APP_MMI_RESOURCEID) { +- llci->stdcam.mmi_session_number = -1; +- } +- +- break; + } + return 0; + } +diff -r af23d23c278b lib/libdvbsec/dvbsec_api.c +--- a/lib/libdvbsec/dvbsec_api.c Sat Jun 20 16:47:55 2009 +0200 ++++ b/lib/libdvbsec/dvbsec_api.c Tue Dec 21 12:13:28 2010 +0100 +@@ -537,19 +537,12 @@ + } + + // generate the command +- if (integer < -256) { +- return -EINVAL; +- } else if (integer < 0) { +- integer = -integer; +- data[3] = 0xf0; +- } else if (integer < 256) { +- data[3] = 0x00; +- } else if (integer < 512) { +- integer -= 256; +- data[3] = 0x10; +- } else { +- return -EINVAL; ++ if (integer < 0.0) { ++ data[3] = 0xD0; // West is a negative angle value ++ } else if (integer >= 0.0) { ++ data[3] = 0xE0; // East is a positive angle value + } ++ integer = abs(integer); + data[3] |= ((integer / 16) & 0x0f); + integer = integer % 16; + data[4] |= ((integer & 0x0f) << 4) | fraction; +diff -r af23d23c278b test/Makefile +--- a/test/Makefile Sat Jun 20 16:47:55 2009 +0200 ++++ b/test/Makefile Tue Dec 21 12:13:28 2010 +0100 +@@ -18,6 +18,7 @@ + test_stillimage \ + test_tt \ + test_vevent \ ++ test_video \ + evtest \ + video \ + szap2 +diff -r af23d23c278b test/README +--- a/test/README Sat Jun 20 16:47:55 2009 +0200 ++++ b/test/README Tue Dec 21 12:13:28 2010 +0100 +@@ -47,4 +47,4 @@ + test_dvr : + test_front : + test_switch : +-test_video : ++test_video : Play video-only file on /dev/dvb/adapter0/video0 +diff -r af23d23c278b test/test_video.c +--- a/test/test_video.c Sat Jun 20 16:47:55 2009 +0200 ++++ b/test/test_video.c Tue Dec 21 12:13:28 2010 +0100 +@@ -23,6 +23,7 @@ + + #include <sys/ioctl.h> + #include <stdio.h> ++#include <stdlib.h> + #include <stdint.h> + #include <sys/types.h> + #include <sys/stat.h> +@@ -31,8 +32,7 @@ + #include <unistd.h> + + #include <linux/dvb/dmx.h> +-#include <linux/dvb/frontend_old.h> +-#include <linux/dvb/sec.h> ++#include <linux/dvb/frontend.h> + #include <linux/dvb/video.h> + #include <sys/poll.h> + +@@ -100,7 +100,7 @@ + + + +-int videoSetBlank(int fd, boolean state) ++int videoSetBlank(int fd, int state) + { + int ans; + +@@ -138,72 +138,72 @@ + + int videoGetStatus(int fd) + { +- struct video_status stat; ++ struct video_status vstat; + int ans; + +- if ((ans = ioctl(fd,VIDEO_GET_STATUS, &stat)) < 0) { ++ if ((ans = ioctl(fd,VIDEO_GET_STATUS, &vstat)) < 0) { + perror("VIDEO GET STATUS: "); + return -1; + } + + printf("Video Status:\n"); + printf(" Blank State : %s\n", +- (stat.video_blank ? "BLANK" : "STILL")); ++ (vstat.video_blank ? "BLANK" : "STILL")); + printf(" Play State : "); +- switch ((int)stat.play_state){ ++ switch ((int)vstat.play_state){ + case VIDEO_STOPPED: +- printf("STOPPED (%d)\n",stat.play_state); ++ printf("STOPPED (%d)\n",vstat.play_state); + break; + case VIDEO_PLAYING: +- printf("PLAYING (%d)\n",stat.play_state); ++ printf("PLAYING (%d)\n",vstat.play_state); + break; + case VIDEO_FREEZED: +- printf("FREEZED (%d)\n",stat.play_state); ++ printf("FREEZED (%d)\n",vstat.play_state); + break; + default: +- printf("unknown (%d)\n",stat.play_state); ++ printf("unknown (%d)\n",vstat.play_state); + break; + } + + printf(" Stream Source : "); +- switch((int)stat.stream_source){ ++ switch((int)vstat.stream_source){ + case VIDEO_SOURCE_DEMUX: +- printf("DEMUX (%d)\n",stat.stream_source); ++ printf("DEMUX (%d)\n",vstat.stream_source); + break; + case VIDEO_SOURCE_MEMORY: +- printf("MEMORY (%d)\n",stat.stream_source); ++ printf("MEMORY (%d)\n",vstat.stream_source); + break; + default: +- printf("unknown (%d)\n",stat.stream_source); ++ printf("unknown (%d)\n",vstat.stream_source); + break; + } + + printf(" Format (Aspect Ratio): "); +- switch((int)stat.video_format){ ++ switch((int)vstat.video_format){ + case VIDEO_FORMAT_4_3: +- printf("4:3 (%d)\n",stat.video_format); ++ printf("4:3 (%d)\n",vstat.video_format); + break; + case VIDEO_FORMAT_16_9: +- printf("16:9 (%d)\n",stat.video_format); ++ printf("16:9 (%d)\n",vstat.video_format); + break; + default: +- printf("unknown (%d)\n",stat.video_format); ++ printf("unknown (%d)\n",vstat.video_format); + break; + } + + printf(" Display Format : "); +- switch((int)stat.display_format){ ++ switch((int)vstat.display_format){ + case VIDEO_PAN_SCAN: +- printf("Pan&Scan (%d)\n",stat.display_format); ++ printf("Pan&Scan (%d)\n",vstat.display_format); + break; + case VIDEO_LETTER_BOX: +- printf("Letterbox (%d)\n",stat.display_format); ++ printf("Letterbox (%d)\n",vstat.display_format); + break; + case VIDEO_CENTER_CUT_OUT: +- printf("Center cutout (%d)\n",stat.display_format); ++ printf("Center cutout (%d)\n",vstat.display_format); + break; + default: +- printf("unknown (%d)\n",stat.display_format); ++ printf("unknown (%d)\n",vstat.display_format); + break; + } + return 0; +@@ -230,7 +230,6 @@ + int written; + struct pollfd pfd[NFD]; + int stopped = 0; +- int ch; + + pfd[0].fd = STDIN_FILENO; + pfd[0].events = POLLIN; +@@ -327,7 +326,7 @@ + videoPlay(fd); + } + +-main(int argc, char **argv) ++int main(int argc, char **argv) + { + int fd; + int filefd; +@@ -338,7 +337,7 @@ + perror("File open:"); + return -1; + } +- if ((fd = open("/dev/ost/video1",O_RDWR|O_NONBLOCK)) < 0){ ++ if ((fd = open("/dev/dvb/adapter0/video0",O_RDWR|O_NONBLOCK)) < 0){ + perror("VIDEO DEVICE: "); + return -1; + } +diff -r af23d23c278b util/Makefile +--- a/util/Makefile Sat Jun 20 16:47:55 2009 +0200 ++++ b/util/Makefile Tue Dec 21 12:13:28 2010 +0100 +@@ -16,4 +16,5 @@ + $(MAKE) -C szap $@ + $(MAKE) -C ttusb_dec_reset $@ + $(MAKE) -C gnutv $@ ++ $(MAKE) -C gotox $@ + $(MAKE) -C zap $@ +diff -r af23d23c278b util/alevt/COPYRIGHT +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/util/alevt/COPYRIGHT Tue Dec 21 12:13:28 2010 +0100 +@@ -0,0 +1,297 @@ ++This message applies to all files within the archive: ++ ++ Copyright (C) 1998,1999,2000 Edgar Toernig (froese@gmx.de) ++ All rights reserved. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License Version 2 as ++ published by the Free Software Foundation. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ ++And here's the GNU GPL V2: ++ ++ GNU GENERAL PUBLIC LICENSE ++ Version 2, June 1991 ++ ++ Copyright (C) 1989, 1991 Free Software Foundation, Inc. ++ 675 Mass Ave, Cambridge, MA 02139, USA ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The licenses for most software are designed to take away your ++freedom to share and change it. By contrast, the GNU General Public ++License is intended to guarantee your freedom to share and change free ++software--to make sure the software is free for all its users. This ++General Public License applies to most of the Free Software ++Foundation's software and to any other program whose authors commit to ++using it. (Some other Free Software Foundation software is covered by ++the GNU Library General Public License instead.) You can apply it to ++your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Our General Public Licenses are designed to make sure that you ++have the freedom to distribute copies of free software (and charge for ++this service if you wish), that you receive source code or can get it ++if you want it, that you can change the software or use pieces of it ++in new free programs; and that you know you can do these things. ++ ++ To protect your rights, we need to make restrictions that forbid ++anyone to deny you these rights or to ask you to surrender the rights. ++These restrictions translate to certain responsibilities for you if you ++distribute copies of the software, or if you modify it. ++ ++ For example, if you distribute copies of such a program, whether ++gratis or for a fee, you must give the recipients all the rights that ++you have. You must make sure that they, too, receive or can get the ++source code. And you must show them these terms so they know their ++rights. ++ ++ We protect your rights with two steps: (1) copyright the software, and ++(2) offer you this license which gives you legal permission to copy, ++distribute and/or modify the software. ++ ++ Also, for each author's protection and ours, we want to make certain ++that everyone understands that there is no warranty for this free ++software. If the software is modified by someone else and passed on, we ++want its recipients to know that what they have is not the original, so ++that any problems introduced by others will not reflect on the original ++authors' reputations. ++ ++ Finally, any free program is threatened constantly by software ++patents. We wish to avoid the danger that redistributors of a free ++program will individually obtain patent licenses, in effect making the ++program proprietary. To prevent this, we have made it clear that any ++patent must be licensed for everyone's free use or not licensed at all. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ GNU GENERAL PUBLIC LICENSE ++ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ++ ++ 0. This License applies to any program or other work which contains ++a notice placed by the copyright holder saying it may be distributed ++under the terms of this General Public License. The "Program", below, ++refers to any such program or work, and a "work based on the Program" ++means either the Program or any derivative work under copyright law: ++that is to say, a work containing the Program or a portion of it, ++either verbatim or with modifications and/or translated into another ++language. (Hereinafter, translation is included without limitation in ++the term "modification".) Each licensee is addressed as "you". ++ ++Activities other than copying, distribution and modification are not ++covered by this License; they are outside its scope. The act of ++running the Program is not restricted, and the output from the Program ++is covered only if its contents constitute a work based on the ++Program (independent of having been made by running the Program). ++Whether that is true depends on what the Program does. ++ ++ 1. You may copy and distribute verbatim copies of the Program's ++source code as you receive it, in any medium, provided that you ++conspicuously and appropriately publish on each copy an appropriate ++copyright notice and disclaimer of warranty; keep intact all the ++notices that refer to this License and to the absence of any warranty; ++and give any other recipients of the Program a copy of this License ++along with the Program. ++ ++You may charge a fee for the physical act of transferring a copy, and ++you may at your option offer warranty protection in exchange for a fee. ++ ++ 2. You may modify your copy or copies of the Program or any portion ++of it, thus forming a work based on the Program, and copy and ++distribute such modifications or work under the terms of Section 1 ++above, provided that you also meet all of these conditions: ++ ++ a) You must cause the modified files to carry prominent notices ++ stating that you changed the files and the date of any change. ++ ++ b) You must cause any work that you distribute or publish, that in ++ whole or in part contains or is derived from the Program or any ++ part thereof, to be licensed as a whole at no charge to all third ++ parties under the terms of this License. ++ ++ c) If the modified program normally reads commands interactively ++ when run, you must cause it, when started running for such ++ interactive use in the most ordinary way, to print or display an ++ announcement including an appropriate copyright notice and a ++ notice that there is no warranty (or else, saying that you provide ++ a warranty) and that users may redistribute the program under ++ these conditions, and telling the user how to view a copy of this ++ License. (Exception: if the Program itself is interactive but ++ does not normally print such an announcement, your work based on ++ the Program is not required to print an announcement.) ++ ++These requirements apply to the modified work as a whole. If ++identifiable sections of that work are not derived from the Program, ++and can be reasonably considered independent and separate works in ++themselves, then this License, and its terms, do not apply to those ++sections when you distribute them as separate works. But when you ++distribute the same sections as part of a whole which is a work based ++on the Program, the distribution of the whole must be on the terms of ++this License, whose permissions for other licensees extend to the ++entire whole, and thus to each and every part regardless of who wrote it. ++ ++Thus, it is not the intent of this section to claim rights or contest ++your rights to work written entirely by you; rather, the intent is to ++exercise the right to control the distribution of derivative or ++collective works based on the Program. ++ ++In addition, mere aggregation of another work not based on the Program ++with the Program (or with a work based on the Program) on a volume of ++a storage or distribution medium does not bring the other work under ++the scope of this License. ++ ++ 3. You may copy and distribute the Program (or a work based on it, ++under Section 2) in object code or executable form under the terms of ++Sections 1 and 2 above provided that you also do one of the following: ++ ++ a) Accompany it with the complete corresponding machine-readable ++ source code, which must be distributed under the terms of Sections ++ 1 and 2 above on a medium customarily used for software interchange; or, ++ ++ b) Accompany it with a written offer, valid for at least three ++ years, to give any third party, for a charge no more than your ++ cost of physically performing source distribution, a complete ++ machine-readable copy of the corresponding source code, to be ++ distributed under the terms of Sections 1 and 2 above on a medium ++ customarily used for software interchange; or, ++ ++ c) Accompany it with the information you received as to the offer ++ to distribute corresponding source code. (This alternative is ++ allowed only for noncommercial distribution and only if you ++ received the program in object code or executable form with such ++ an offer, in accord with Subsection b above.) ++ ++The source code for a work means the preferred form of the work for ++making modifications to it. For an executable work, complete source ++code means all the source code for all modules it contains, plus any ++associated interface definition files, plus the scripts used to ++control compilation and installation of the executable. However, as a ++special exception, the source code distributed need not include ++anything that is normally distributed (in either source or binary ++form) with the major components (compiler, kernel, and so on) of the ++operating system on which the executable runs, unless that component ++itself accompanies the executable. ++ ++If distribution of executable or object code is made by offering ++access to copy from a designated place, then offering equivalent ++access to copy the source code from the same place counts as ++distribution of the source code, even though third parties are not ++compelled to copy the source along with the object code. ++ ++ 4. You may not copy, modify, sublicense, or distribute the Program ++except as expressly provided under this License. Any attempt ++otherwise to copy, modify, sublicense or distribute the Program is ++void, and will automatically terminate your rights under this License. ++However, parties who have received copies, or rights, from you under ++this License will not have their licenses terminated so long as such ++parties remain in full compliance. ++ ++ 5. You are not required to accept this License, since you have not ++signed it. However, nothing else grants you permission to modify or ++distribute the Program or its derivative works. These actions are ++prohibited by law if you do not accept this License. Therefore, by ++modifying or distributing the Program (or any work based on the ++Program), you indicate your acceptance of this License to do so, and ++all its terms and conditions for copying, distributing or modifying ++the Program or works based on it. ++ ++ 6. Each time you redistribute the Program (or any work based on the ++Program), the recipient automatically receives a license from the ++original licensor to copy, distribute or modify the Program subject to ++these terms and conditions. You may not impose any further ++restrictions on the recipients' exercise of the rights granted herein. ++You are not responsible for enforcing compliance by third parties to ++this License. ++ ++ 7. If, as a consequence of a court judgment or allegation of patent ++infringement or for any other reason (not limited to patent issues), ++conditions are imposed on you (whether by court order, agreement or ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot ++distribute so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you ++may not distribute the Program at all. For example, if a patent ++license would not permit royalty-free redistribution of the Program by ++all those who receive copies directly or indirectly through you, then ++the only way you could satisfy both it and this License would be to ++refrain entirely from distribution of the Program. ++ ++If any portion of this section is held invalid or unenforceable under ++any particular circumstance, the balance of the section is intended to ++apply and the section as a whole is intended to apply in other ++circumstances. ++ ++It is not the purpose of this section to induce you to infringe any ++patents or other property right claims or to contest validity of any ++such claims; this section has the sole purpose of protecting the ++integrity of the free software distribution system, which is ++implemented by public license practices. Many people have made ++generous contributions to the wide range of software distributed ++through that system in reliance on consistent application of that ++system; it is up to the author/donor to decide if he or she is willing ++to distribute software through any other system and a licensee cannot ++impose that choice. ++ ++This section is intended to make thoroughly clear what is believed to ++be a consequence of the rest of this License. ++ ++ 8. If the distribution and/or use of the Program is restricted in ++certain countries either by patents or by copyrighted interfaces, the ++original copyright holder who places the Program under this License ++may add an explicit geographical distribution limitation excluding ++those countries, so that distribution is permitted only in or among ++countries not thus excluded. In such case, this License incorporates ++the limitation as if written in the body of this License. ++ ++ 9. The Free Software Foundation may publish revised and/or new versions ++of the General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++Each version is given a distinguishing version number. If the Program ++specifies a version number of this License which applies to it and "any ++later version", you have the option of following the terms and conditions ++either of that version or of any later version published by the Free ++Software Foundation. If the Program does not specify a version number of ++this License, you may choose any version ever published by the Free Software ++Foundation. ++ ++ 10. If you wish to incorporate parts of the Program into other free ++programs whose distribution conditions are different, write to the author ++to ask for permission. For software which is copyrighted by the Free ++Software Foundation, write to the Free Software Foundation; we sometimes ++make exceptions for this. Our decision will be guided by the two goals ++of preserving the free status of all derivatives of our free software and ++of promoting the sharing and reuse of software generally. ++ ++ NO WARRANTY ++ ++ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY ++FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN ++OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES ++PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED ++OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ++MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS ++TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE ++PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, ++REPAIR OR CORRECTION. ++ ++ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR ++REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, ++INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING ++OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED ++TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY ++YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER ++PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE ++POSSIBILITY OF SUCH DAMAGES. ++ ++ END OF TERMS AND CONDITIONS +diff -r af23d23c278b util/alevt/ChangeLog +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/util/alevt/ChangeLog Tue Dec 21 12:13:28 2010 +0100 +@@ -0,0 +1,535 @@ ++Thu Feb 11 22:05:00 MET 2010 (1.7.0) ++ ++ - redesigned version: ++ - outfile, new starting methods, libzvbi implementation ++ - lots of bug fixes, all patches available in the Internet applied ++ - extensive code cleanup ++ ++Mon Dec 3 03:11:07 MET 2007 (1.6.2) ++ ++ - compilation fixes for newer gcc ++ - makefile tweaks (man vs share/man, /usr/X11R6 vs /usr, etc) ++ - default device changed to /dev/vbi0 ++ - adapt to current v4l2 api ++ - some minor fixes collected during the past years ++ ++ This is a build-time update to conform to newer compilers and ++ system environments. If you have a running AleVT there's no ++ reason to update. The only real fix is in the html-exporter ++ which was producing broken html (missing double-quotes). ++ ++Thu Jan 23 01:53:10 MET 2003 ++ ++ - Fixed a bug in contrib/cap-all.c (fdset_init before vbi_open) ++ - Expaned cap-all.c to show how to save in two formats simultaneously. ++ ++Tue Aug 20 05:22:16 MEST 2002 (1.6.1) ++ ++ - Removed the bttv-warning from the help pages ;-) ++ ++Mon Jul 23 18:34:32 MEST 2001 ++ ++ - Fixed bug in ui.c - found by <pawel@sakowski.eu.org>. ++ - When clicking on page numbers accept sub-page numbers too. ++ ++Sat Dec 23 15:12:11 MET 2000 ++ ++ - Fixed 'double height last line' bug in export.c reported by ++ <Matthias.Kleinmann@urz.uni-heidelberg.de> ++ ++Thu Oct 12 02:19:31 MEST 2000 ++ ++ - The   fix was wrong. Removed it. ++ ++Wed Oct 11 19:41:38 MEST 2000 (1.6.0) ++ ++ - Some documentation tweaks. ++ - Release. Made it 1.6 because of V4l2 API. ++ ++Thu Sep 21 21:07:12 MEST 2000 ++ ++ - Removed old bttv-only decoder. Only the v4l2-based stays. ++ If the device does not support v4l2, default parameters ++ appropriate for the bttv-driver are taken. ++ - Subpage cycling (up/down and 2nd wheel) stays in the current ++ page. ++ ++Sat Sep 16 23:52:12 MEST 2000 ++ ++ - Experimental v4l2 interface added. ++ - Finetune defaults to 1 now. Works best for me. Tell me ++ if you don't like it. ++ - Russian patch still not added :-/ ++ - Fixed the bug in xio.c that Ben Smithurst ++ <ben@scientia.demon.co.uk> found. ++ - Added the dual-wheel-mouse patch from Holger Fitzner. ++ ++Tue May 30 03:09:24 MEST 2000 ++ ++ - As Matto Fransen <matto@matto.nl> reported: the ; after   ++ in exp-html is missing. fixed that. ++ ++Tue May 9 20:21:52 MEST 2000 ++ ++ - Removed the -oldbttv/-newbttv options. If your driver has ++ a buffer size different from that in the current bttv you ++ either have to support the VBISIZE ioctl or change the source. ++ (Tried to implement an autodetect by non-blocking reads but ++ that confuses the driver that much that it no longers gives ++ reasonable data.) ++ - Added a compression option to the png export filter and ++ changed the default compression level to the lib's default. ++ The prev default of 9 was way to slow. ++ ++Wed May 3 19:18:55 MEST 2000 ++ ++ - Added a smaller font. Made out of the neep9 font from ++ the really great jmk-fonts (http://www.pobox.com/~jmknoble). ++ ++Sat Apr 29 02:36:41 MEST 2000 ++ ++ - Fixed SEGV in export.c:adjust. ++ - Fixed a possible buffer overrun in exp-txt.c ++ ++Thu Nov 4 21:18:52 MET 1999 (1.5.1) ++ ++ - Added os.h. That way alevt compiles right out of the ++ box on all BSD systems (I hope *g*). ++ - Fixed the DST bug in alevt-date. ++ - Put vtwiz.pl in contrib, a perl/tk/set-tv script to ++ launch alevt written by Joern Borgert. ++ ++Tue Oct 26 23:55:09 MEST 1999 (1.5.1-pre1) ++ ++ - Added timeout option to alevt-cap. ++ - Use install instead of cp in the Makefile. ++ - Added -I/usr/local/include and -L/usr/local/lib ++ in the Makefile. ++ - Changed #ifdef FREEBSD to #ifdef BSD. ++ - exchanged contrib/paul-export.patch with ++ paul.fmt_page.c (a replacement for export.c:fmt_page()) ++ and paul.fmt_page.patch (the same in form of a ++ patch file). ++ - Some doc corrections. ++ ++Thu Oct 14 02:49:48 MEST 1999 ++ ++ - Added FREEBSD patches. ++ ++Fri Oct 8 23:36:45 MEST 1999 (1.5.0) ++ ++ - Updated the documentation. ++ ++ So, what's new since 1.4.9 (nearly 4 months ago)? ++ Two major things: full latin-2 support and export ++ filters for alevt-cap and alevt itself. ++ ++ For the latin-2 support page enhancement packets ++ have to be decoded and some latin-1 pages may ++ benefit from that, too. Note: if you select ++ latin-2 everything is latin-2, even cut'n paste. ++ (new cmdline option -charset latin-1|2) ++ ++ The export filters allow saving pages in different ++ formats. At the moment there's ascii (with and with- ++ out color), html, png, and ppm. The png filter ++ requires libpng. If you don't have it (or don't want ++ png support) just remove the WITH_PNG from the ++ Makefile. To save the currently displayed page just ++ press 's'. See alevt-cap(1) for the format string. ++ ++ Preview: 1.5.1 will have the FreeBSD patches and ++ any bug fixes. (But not more *g*). ++ ++Fri Oct 8 02:06:35 MEST 1999 (1.5.0-pre4) ++ ++ Finally I could get away from my Playstation and ++ work a little bit on alevt *g* ++ ++ - Tried to change alevt-date with freebsd patches from ++ Thomas Runge <runge@rostock.zgdv.de>. They do not ++ have the timezone and daylight variables. But I do ++ not have tm_gmtoff. So it's commented out for the ++ moment. ++ - Made font.[ch] so that only one copy of the fonts is ++ in the executable when including export modules ++ (exp-gfx.c uses them). Had to tweak the makefile. ++ - Added 's' for saving pages to files. Prompts for ++ a format string and a filename and saves the ++ currently displayed page. ++ (Formerly, 's' and 'S' were aliases for '/' and '?' ++ (searching)) ++ - Found a bug in export.c regarding double height lines. ++ - Added a patch to the contrib dir to pass the URL you ++ click on to netscape. ++ ++ The documentation updates are still missing. That's ++ the last thing to do for 1.5.0. But that's so boring... ++ ++Fri Aug 20 21:28:18 MEST 1999 ++ ++ Back from holidays and time for alevt... ++ ++ - Added html, png, and ppm export modules from Paul. ++ - Fixed the return status for export_output. ++ - Tweaked the makefile for libpng support. ++ - Added the export howto to the contrib dir. ++ - Added Paul's fmt_page routine to contrib as a patch ++ to export.c ++ - Added "-format help" to list all output formats and ++ its options. ++ ++ Still to do: update man page of alevt-cap, add export ++ to alevt, add erc to alevt-cap. ++ ++ Oh, btw, alevt is running on FreeBSD with the bt848 ++ driver from Roger Hardiman <roger@cs.strath.ac.uk> *g*. ++ I wonder if it's possible to port his driver to linux. ++ Maybe it runs better then bttv... (I still get reports ++ with stuck xawtvs ...) ++ ++Mon Jul 19 01:15:50 MEST 1999 (1.5.0-pre3) ++ ++ - Added export modules. It's gotten much to complex. ++ ++ A lot of things still to do: add other formats [Paul?], ++ add documentation, add format-help, add export to alevt, ++ add erc to alevt-cap, ... ++ ++Mon Jul 12 00:09:03 MEST 1999 ++ ++ - Added an incomplete 20x24 font to the contrib dir. ++ ++Tue Jun 29 00:46:03 MEST 1999 (1.5.0-pre2) ++ ++ - Added lanugage tables from Radoslaw. ++ - Added new latin-2 font from Radoslaw. ++ - Fixed a bug with hold graphics. There's still one bug ++ on CNN's page 100 (has to do with set-after behaviour of ++ color select in hold graphics mode). The last line of the ++ earth should be blue-blue-green not blue-green-green. ++ AleVT always uses set-at behaviour. Afaik, this combination ++ (hold + set-after) is the only way to see the difference ++ between set-at and set-after. Set-after will blow up the ++ code so I will leave it as it is. ++ - vbi now collects all pkt26 and enhances the page before ++ it is passed on. Seem's to work. ++ ++Tue Jun 22 22:13:45 MEST 1999 (1.5.0-pre1) ++ ++ - Fixed hamm24. And, it should be fast now *g* ++ - Moved the language conversion parts to lang.c ++ - Added additional lang_chars for use with the latin-2 charset. ++ - Added -charset latin-1/2 option. ++ - Added pkt x/26 decoding. ... and noticed, that these packets ++ are sent between line 0 and 1. FUCK. Now I have to save ++ all x/26 until the page is complete. But not today... :-( ++ ++ Things are getting more and more uglier. The right thing ++ to do would be to make a big font with all possible chars ++ (including cyrillic, arabic, smoothed graphics, ...). ++ That would mean to make each char in vtp->data 16 bit. ++ And then add an attribute word for each char so that the ++ enhanced attributes work, too. Searching and cut & paste ++ would be more complicated... but the worst, the pages ++ will be much bigger (4 times larger). Really bad for ++ the cache and god knows for what else... ++ Is it worth all the trouble??? I don't need that! ++ ++Tue Jun 15 01:25:40 MEST 1999 ++ ++ - Changed .specs file again. I previously changed alevt.spec ++ instead of alevt.spec.in :-( ++ ++Mon Jun 14 23:45:48 MEST 1999 (1.4.9) ++ ++ - Made a very simple capture program (alevt-cap). Just collects ++ the given pages and writes them to disk in ASCII. ++ I will only accept bug reports/fixes, no enhancement requests ++ at the moment *g* ++ (I can't believe it; I even wrote a man page...) ++ - Changed the subpage delimiter on the command line from '/' to '.' ++ The old one ('/') is still accepted. (Reason: alevt-cap uses ++ the page number as part of the filename and a / is inconvenient. ++ And I already wanted to let you enter subpages with the keypad ++ and the '.' would be a nice key for that.) ++ - Tweaked the .specs file... (Btw, alevt-date and alevt-cap should ++ not be installed in the X11 tree.) ++ ++Thu Jun 10 22:13:40 MEST 1999 ++ ++ - moved the hamming decoding and associated table to hamm.c ++ - played with pkt26 to support polish stations. not finished. ++ ++Tue Jun 8 21:00:42 MEST 1999 ++ ++ - Added -[no]bell option. And the 'b' key. ++ - Replaced all xio_bell calls with appropriate status messages. ++ ++Sat Jun 5 00:42:19 MEST 1999 (1.4.8) ++ ++ - Shit. Just after the release I found a bug. The header line ++ isn't updated as it should :-( (Just affects parallel mode ++ transmission, so no new version, yet.) ++ - Created mailing list. Either go to http://alevt.listbot.com/ ++ or write mail to alevt-subscribe@listbot.com. ++ - Added bttv-patch to the contrib dir for those who don't want ++ to wait for bttv-0.6.5. ++ ++Fri Jun 4 17:19:41 MEST 1999 (1.4.7) ++ ++ - Added autodetection of VBIBUF_SIZE (only with newer bttv, 0.6.5). ++ - Forgot to close vbi_fd in vbi_close :-/ ++ - Made ERC on by default. If the page has no errors it ++ costs nothing and if it has you'll turn it on anyway. ++ - Changed parameters of EV_HEADER. ++ - Removed XAWTV_HACKS. ++ - Updated some docu. ++ - Modified the contrib samples to reflect previous API changes. ++ ++Fri May 28 20:16:44 MEST 1999 ++ ++ - Added status messages. ++ - Added EV_TIMER event. ++ - Added channel change detection (only with newer bttv, 0.6.5). ++ Sends EV_RESET event. The XAWTV_HACKS can be removed *phww*. ++ Now the cache is automatically cleared if you switch to a ++ new channel. It even works with a SAT receiver connected to ++ Video-In. ++ ++Thu May 27 23:54:32 MEST 1999 (1.4.6 unofficial) ++ ++ - Cache reset didn't reset npages and hi_subno. ++ - Added XAWTV_HACKS, that is: alevt scans for a window with ++ the _XAWTV_STATION property and registers for property changes. ++ Result: when switching channels in xawtv, the cache is cleared. ++ (This is just an ugly hack. Xawtv must already be running ++ when alevt is started. If you quit and restart xawtv, it no ++ longer works. There's no method to detect if the monitored ++ xawtv is really the one controlling our /dev/vbi, etc...) ++ Added on request of Paul Ortyl <ortylp@key.net.pl>. ++ - Added error reduction circuit. It's part of the cache. ++ Errors in a new page are replaced by characters/lines from ++ an already cached (older) page. May be toggled by pressing ++ 'e' (editor is now on 'E'). It's not enabled by default ++ because it takes some CPU time. Idea by Paul Ortyl. ++ - TODO: clean up. document new features. add status messages. ++ ++Sun May 23 19:13:07 MEST 1999 (1.4.5) ++ ++ - New spec file from Karsten Hopp <karsten.hopp@delix.de> ++ - Changed it even further *g* ++ - Fixed a bug with graphics selection of double height lines. ++ - Documented the -oldbttv option in the man page. Now it's in ++ every page. This should finally halve the mails I get. ++ (For the other halve I have to write alevt-capture *g*) ++ ++Sat May 8 02:41:21 MEST 1999 ++ ++ - Ehhh, changed u32 typedef from unsigned long to unsigned int. ++ Same for s32. The Alpha's longs are 64 bits. ++ Thanks to Sdruddin Rejeb <rejeb@dpmail.epfl.ch>. ++ (There's something strange with this in the X libs. They are ++ sometimes very lazy about ints and longs. Someone with an ++ Alpha should check the cut & paste, both, text and graphics ++ selections.) ++ ++Thu Apr 29 22:38:37 MEST 1999 ++ ++ - Updated contrib/t1.c ++ - Added ':' as a subpage delimiter for clicking (2:7 is the same as 2/7) ++ ++Mon Apr 19 19:40:09 MEST 1999 ++ ++ - Switched the scrolling direction of the wheel ++ ++Mon Mar 29 01:23:06 MEST 1999 (1.4.4) ++ ++ - fixed DST bug in alevt-date ++ - added crude latin-2 support. 'make FONT=latin-2' should be enough. ++ (found the stuff on the website http://www.penguin.cz/~marvin/ of ++ Daniel Smolik <smolikdan@email.cz>. I don't know if he is the one ++ who made the font). ++ ++Wed Mar 17 20:53:59 MET 1999 ++ ++ - added timeout to alevt-date ++ ++Fri Feb 19 18:22:53 MET 1999 (1.4.3> ++ ++ - Makefile changes. ++ ++Fri Jan 29 18:01:27 MET 1999 ++ ++ - fixed bug in dllist.h. dl_insert_first(h, dl_remove(n)) was only ++ working due to gcc implementation details. ++ ++Mon Jan 25 18:33:42 MET 1999 (1.4.2) ++ ++ - fixed 'clear cache'. no longer removes the help pages. ++ - made next/prev key/button to skip missing pages. ++ - added support for wheeled mice. (I heard it's really cool *g*) ++ - problem with subpages > 0xff fixed. ++ ++Thu Jan 21 17:31:46 MET 1999 (1.4.1) ++ ++ - added man pages from Thomas Schoepf <schoepf@usa.net>. ++ - added rpm-spec file from Mario Mikocevic <mozgy@times.hr>. ++ (looks a little bit odd, but I don't know very much about rpms) ++ - minor option fix in alevt-date (people are really using it!?!) ++ ++Tue Jan 5 03:50:08 MET 1999 (1.4.0) ++ ++ - should be 1.3.10 but that gives problems with the help pages :-( ++ - fixed varargs for alpha ++ - default is now -newbttv (aka -fuckbttv). use -oldbttv for v<0.5.20. ++ ++Sat Jan 2 21:40:54 MET 1999 ++ ++ - small patches to alevt-date (-vbi options and tzset fix) ++ - played with pkt8/30. what a mess. MTV is 25:13 ahead *g* ++ ++Wed Dec 30 19:30:14 MET 1998 (1.3.9) ++ ++ - slightly modified the pll (may need further tuning) ++ ++Wed Dec 30 05:27:26 MET 1998 (1.3.8) ++ ++ - added pll (-finetune auto). try -debug for status msgs. ++ ++Tue Dec 29 05:15:53 MET 1998 (1.3.7) ++ ++ - added finetune option (see README) ++ - you may now type -newbttv instead of -fuckbttv *g* ++ ++Mon Dec 28 19:36:32 MET 1998 (1.3.6) ++ ++ - Makefile: R5 -> R6 :-( ++ - vbi.c now works without cache.c ++ - added alevt-date (set system time from teletext) ++ - bug in option parsing (error reporting) ++ ++Thu Dec 17 19:56:16 MET 1998 (1.3.5) ++ ++ - added -L/usr/X11R6/lib in Makefile ++ - put some blurb (in german) in contrib. ++ ++Thu Dec 17 05:01:34 MET 1998 (1.3.4) ++ ++ - added class hints on (invisible) leader window to make docking ++ in wmaker easier. instant name for leader is "VTLeader" and for ++ the viewing windows "VTPage" ++ - made the icon a little bit smaller ++ ++Mon Dec 14 23:05:41 MET 1998 (1.3.3) ++ ++ Release 1.3.3 ++ ++ - added spanish/portuguese charset decoding ++ - added similar looking glyphs for czech ++ - minor changes on the font ++ - middle click on current page number opens new parent window ++ - case dependant search if the pattern begins with a '!' ++ - line editing may be aborted with ^C ++ ++Sun Dec 13 17:55:32 MET 1998 (1.3.2) ++ ++ - when there were multiple windows of the same page, cycling through ++ the subpages changed all windows. fixed. ++ - hilight the found text (make it the selection). ++ - slightly modified the hilight colors. ++ - default window size set to 41x25 (looks better). ++ - rewrote the editor. ++ ++Sun Dec 13 07:03:10 MET 1998 (1.3.1) ++ ++ - fixed one command line option ++ - corrected bug in searching ++ ++Sat Dec 12 20:27:03 MET 1998 (1.3.0) ++ ++ Release 1.3.0 ++ ++ - searching is now ready (still need a status line for error msgs). ++ - set SIGPIPE to SIG_DFL. some shells (KDE) set it to SIG_IGN and then ++ the timer task won't be killed on exit. ++ - updated the help pages. ++ - I'm frustrated! BTTV_VERSION doesn't work on /dev/vbi. So no ++ autodetection of driver version. Added -fuckbttv option instead. ++ ++Fri Dec 11 19:36:03 MET 1998 (1.2.5) ++ ++ - reworked national charset (lang) handling. everthing now done in vbi.c. ++ the rest just deals with latin-1. ++ - first version of searching (functional, but dirty. needs more work.) ++ ++Thu Dec 10 20:06:27 MET 1998 (1.2.4) ++ ++ - new file edline.c (line editor for the menu line. start for searching...) ++ - blinking cursor ++ - added an 48x48 icon from Ulf Rompe ++ - added pasting into the line editor (insert key). ++ - release ownership of XA_PRIMARY when deselecting selection. ++ ++Tue Dec 8 21:26:26 MET 1998 (1.2.3) ++ ++ - new file ui.c (most user interface stuff from main.c) ++ - rewrote option parsing ++ - allow specification of child windows on command line. now ++ it's possible to regenerate the complete window layout by ++ the commandline (may be of some use for session management). ++ - some spelling fixes in the help pages from Mark Bryars ++ ++Mon Dec 7 16:59:28 MET 1998 (1.2.2) ++ ++ - reworked hidden handling in xio.c ++ ++Sun Dec 6 19:54:10 MET 1998 (1.2.1) ++ ++ - class name changed! from Alevt to AleVT. ++ - window/icon title shows current page number ++ - changed the icon to a 64 pixel width one. not nice but ... ++ - added a small mini icon for the title bar. is there a property I can set? ++ - pressing on the CPN puts the page on hold ++ - pressing on the violet * reveals concealed text ++ - added simple menu if no FastText menu is present ++ - allow subpages to be specified on the command line (eg 100/4) ++ ++Sat Dec 5 20:59:51 MET 1998 (1.2.0) ++ ++ Release 1.2.0 ++ ++ - finished the help pages. ++ - added command line handling ++ - added user geometry handling in xio.c ++ ++Sat Dec 5 02:28:16 MET 1998 (1.1.2) ++ ++ - allow magazin 9 (help system) ++ - start box char after a pagenumber selects subpage 1 (hack) ++ - added a crude page editor (just to create the help pages. not for users.) ++ - started with the online help system (sounds great, hehe) ++ ++Tue Dec 1 20:19:53 MET 1998 (1.1.1) ++ ++ - added concept of parent and child windows. now, the middle mouse ++ button changes the contens of the child window. if there isn't ++ one, it is created. ++ - Middle mouse button on x/y (subpage cycling) selects the previous ++ subpage. (updating the child with subpages is hairy...) ++ ++Sun Nov 29 23:34:18 MET 1998 (1.1.0) ++ ++ Release 1.1.0 ++ ++ - removed most of the recovery for single bad lines (does too much harm) ++ - changed handling of parallel mode transmission (untested. unused in .de) ++ - added selection (text & graphic!). try pasting into xpaint :-) ++ - added cache-clear function ('c') ++ - click on x/y selects the next subpage ++ - some minor tweaks ++ - added an icon bitmap. ++ ++Wed Nov 24 23:33:34 MET 1998 (1.0.0) ++ ++ First Release 1.0.0 +diff -r af23d23c278b util/alevt/EXPORT.HOWTO +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/util/alevt/EXPORT.HOWTO Tue Dec 21 12:13:28 2010 +0100 +@@ -0,0 +1,84 @@ ++HOW TO IMPLEMENT A NEW EXPORT MODULE: ++ ++As an example look at exp-txt.c (it implements two modules which ++are pretty similar). ++ ++You have to create one exported structure (struct export_module). ++This structure holds the following data: ++ ++1. The name of the format (example: "ascii"). ++ ++2. The default extension to use for building filenames ("txt"). ++ ++3. A list of module options. It's a 0 terminated array of char ++pointers, one for each option (similar to argv of main). ++If an option string contains a '=', it is an option that ++requires an argument. The part after the '=' is ignored at ++the moment. Later, I want to add help messages that show ++these options strings and then the part after the '=' becomes ++useful. ++If you do not have local options, set this field to 0. ++ ++4. The number of bytes for local data in the export structure. ++There you may store data collected during option parsing or ++for whatever you want. ++Don't use global variables for storing this data! With ++alevt-cap you may give: ++ ++alevt-cap -format ascii,color 100 -format ascii 100 ++ ++to save the page in two different formats. Using global ++vars would inhibit this. The data area in struct export ++starts at the 'data' field. You have to cast it to the ++appropriate type (see the D macro in exp-txt.c). ++If you do not need local data, set this field to 0. ++ ++5. An open function (or call it constructor). It is called ++when your module is needed and it is passed a struct export ++(the instance). This function may be used to initialize ++the local data in the export struct. ++If all goes well return 0. Else call export_error (see ++below) and return -1. ++If you do not need an open function, set this field to 0. ++ ++6. A close function (or call it destructor). It is called ++when your module is no longer needed. If you allocated ++memory in the open func, this is the place to free it. ++If you do not need a close function, set it to 0. ++ ++7. An option function. It is called for each module option ++the user has given. It is passed an option number (first ++option in the option-array gives 1, ...) and a char pointer ++to the argument for that option (0 if the option does not ++need an arg). The argument pointer keeps valid until the ++close function is called. ++If all goes well, return 0. Else call export_error and ++return -1. ++If you gave an option list at point 3 you have to specify ++this function. Else set it to 0. ++ ++8. An output function. It is called to produce the output. ++It is given the file name to use and a fmt_page pointer. ++The fmt_page contains an interpreted image of the page. ++There are no control chars in it. It uses the character ++set defined by the two fonts. ++These function may be called consecutive for multiple ++pages. Don't expect one output for one open/close. ++Return codes as above... (0: ok, -1: error). ++ ++The export_error function: If one of your functions wants to ++report an error, it has to use the export_error function. ++It's a printf like function to set error messages. In alevt-cap ++these messages are printed to stderr, in alevt they will be ++shown in the status line (so don't make them too long). ++ ++The last step is to add your export_module structure to the ++list of modules in export.c (at the top). ++Please, make sure that this structure is the only exported ++symbol. All other things should be static. ++ ++That's all. A structure describing your module and 4 functions ++(open, close, option, output) to implement it. Shouldn't be too ++complicated. ++ ++Ciao, ET. +diff -r af23d23c278b util/alevt/Makefile +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/util/alevt/Makefile Tue Dec 21 12:13:28 2010 +0100 +@@ -0,0 +1,130 @@ ++VER=1.7.0 ++OPT=-O -g -w ++DEFS=-DWITH_PNG ++DEFS+=-DUSE_LIBZVBI ++FONT=vtxt ++MAN_DIR=man ++DESTDIR= ++PREFIX=/usr ++HOSTCC=$(CC) ++CFLAGS=$(OPT) -DVERSION=\"$(VER)\" $(DEFS) -I$(USR_X11R6)/include ++EXPOBJS=export.o exp-txt.o exp-html.o exp-gfx.o font.o ++OBJS=main.o ui.o xio.o fdset.o vbi.o cache.o help.o search.o misc.o hamm.o lang.o $(EXPOBJS) ++TOBJS=alevt-date.o vbi.o fdset.o misc.o hamm.o lang.o ++COBJS=alevt-cap.o vbi.o fdset.o misc.o hamm.o lang.o $(EXPOBJS) ++ ++ifneq ($(findstring WITH_PNG,$(DEFS)),) ++EXPLIBS=-lpng -lz -lm ++endif ++ ++ifneq ($(findstring USE_LIBZVBI,$(DEFS)),) ++ZVBILIB=-lzvbi -lpthread ++EXPLIBS+=$(ZVBILIB) ++endif ++ ++all: alevt alevt-date alevt-cap alevt.1 alevt-date.1 alevt-cap.1 ++ ++alevt: $(OBJS) ++ $(CC) $(OPT) $(OBJS) -o alevt -L$(PREFIX)/lib -L$(PREFIX)/lib64 -lX11 $(EXPLIBS) ++ ++alevt-date: $(TOBJS) ++ $(CC) $(OPT) $(TOBJS) -o alevt-date $(ZVBILIB) ++ ++alevt-cap: $(COBJS) ++ $(CC) $(OPT) $(COBJS) -o alevt-cap $(EXPLIBS) ++ ++font.o: font1.xbm font2.xbm font3.xbm font4.xbm ++fontsize.h: font1.xbm font2.xbm font3.xbm font4.xbm ++ fgrep -h "#define" font1.xbm font2.xbm font3.xbm font4.xbm >fontsize.h ++ ++font1.xbm: bdf2xbm $(FONT)-latin-1.bdf ++ ./bdf2xbm font1 <$(FONT)-latin-1.bdf >font1.xbm ++ ++font2.xbm: bdf2xbm $(FONT)-latin-2.bdf ++ ./bdf2xbm font2 <$(FONT)-latin-2.bdf >font2.xbm ++ ++font3.xbm: bdf2xbm vtxt-koi8.bdf ++ ./bdf2xbm font3 <vtxt-koi8.bdf >font3.xbm ++ ++font4.xbm: bdf2xbm vtxt-iso8859-7.bdf ++ ./bdf2xbm font4 <vtxt-iso8859-7.bdf >font4.xbm ++ ++bdf2xbm: bdf2xbm.c ++ $(HOSTCC) bdf2xbm.c -o bdf2xbm ++ ++clean: ++ rm -f *.o page*.txt a.out core bdf2xbm font?.xbm fontsize.h ++ rm -f alevt alevt-date alevt-cap ++ ++rpm-install: all ++ install -m 0755 alevt ${RPM_BUILD_ROOT}$(USR_X11R6)/bin ++ install -m 0755 alevt-date ${RPM_BUILD_ROOT}$(USR_X11R6)/bin ++ install -m 0755 alevt-cap ${RPM_BUILD_ROOT}$(USR_X11R6)/bin ++ install -m 0644 alevt.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1 ++ install -m 0644 alevt-date.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1 ++ install -m 0644 alevt-cap.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1 ++ install -d 0755 $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps ++ install -m 0644 alevt.png $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps ++ ++install: all ++ install -m 0755 alevt $(DESTDIR)$(PREFIX)/bin ++ install -m 0755 alevt-date $(DESTDIR)$(PREFIX)/bin ++ install -m 0755 alevt-cap $(DESTDIR)$(PREFIX)/bin ++ install -m 0644 alevt.1 $(DESTDIR)$(PREFIX)/share/man/man1 ++ install -m 0644 alevt-date.1 $(DESTDIR)$(PREFIX)/share/man/man1 ++ install -m 0644 alevt-cap.1 $(DESTDIR)$(PREFIX)/share/man/man1 ++ install -m 0644 alevt.png $(DESTDIR)$(PREFIX)/share/pixmaps ++ install -m 0644 alevt.desktop $(DESTDIR)$(PREFIX)/share/applications ++ ++uninstall: clean ++ rm -f /usr/bin/alevt /usr/bin/alevt-cap /usr/bin/alevt-date \ ++ /usr/share/pixmaps/alevt.png /usr/share/applications/alevt.desktop \ ++ /usr/share/man/man1/alevt.1 /usr/share/man/man1/alevt-cap.1 \ ++ /usr/share/man/man1/alevt-date.1 ++ ++depend: ++ makedepend -Y -- $(CFLAGS_none) -- *.c 2>/dev/null ++ ++tar-html: alevt.1 alevt-date.1 alevt-cap.1 ++ for i in alevt.1 alevt-date.1 alevt-cap.1 ; do \ ++ j=`basename $$i .1` ; \ ++ j=`basename $$j .1x` ; \ ++ nroff -man $$i | { \ ++ echo "<HTML><HEAD><TITLE>AleVT" ; \ ++ 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-multimedia/dvbtools/dvb-apps-1.1.1/update-to-trunk.diff b/meta-openvuplus/recipes-multimedia/dvbtools/dvb-apps-1.1.1/update-to-trunk.diff new file mode 100644 index 0000000..55c3419 --- /dev/null +++ b/meta-openvuplus/recipes-multimedia/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