diff options
| -rw-r--r-- | abs/core-testing/mythtv/stable/mythtv/PKGBUILD | 21 | ||||
| -rw-r--r-- | abs/core-testing/mythtv/stable/mythtv/changeset-20877.patch | 5910 | 
2 files changed, 8 insertions, 5923 deletions
| diff --git a/abs/core-testing/mythtv/stable/mythtv/PKGBUILD b/abs/core-testing/mythtv/stable/mythtv/PKGBUILD index 3d7a7ad..3c11345 100644 --- a/abs/core-testing/mythtv/stable/mythtv/PKGBUILD +++ b/abs/core-testing/mythtv/stable/mythtv/PKGBUILD @@ -1,18 +1,16 @@  pkgname=mythtv  pkgver=0.21 -pkgrel=78 +pkgrel=79  pkgdesc="A Homebrew PVR project"  arch=('i686' 'x86_64') -depends=('bash' 'mysql-clients>=5.0' 'qt3' 'lame' 'lirc-utils' 'ffmpeg' \ -	'libxvmc' 'libavc1394' 'libdc1394' 'libiec61883' 'perl-net-upnp' 'perl-time-format') +depends=('bash' 'mysql-clients>=5.0' 'qt3' 'lame' 'lirc-utils' 'ffmpeg' +	'libxvmc' 'libavc1394' 'libdc1394' 'libiec61883' 'perl-net-upnp'  +	'perl-time-format')  backup=(etc/mythtv/mythbackend.conf etc/mythtv/mysql.txt usr/share/mythtv/is.xmlusr/share/mythtv/media_settings.xml )  -source=(ftp://ftp.knoppmyth.net/R6/sources/${pkgname}-${pkgver}-fixes.tar.bz2 \ -	mythbackend myththemedmenu.cpp.patch myththemedmenu.h.patch  smolt_jump.patch pretty gnome_screensaver.patch mpegpspatch mythbackend.lr mythfrontend.lr -	changeset-20877.patch) - - -#md5sums=('e316ed18d7ac837cf8c4af54b1478793' '7ef6de58240e7aad389a0b13d91b1cf6'\ -#         'a0ecb7f476cb71c0c1ac90d349fc7695') +source=(ftp://ftp.knoppmyth.net/R6/sources/${pkgname}-${pkgver}-fixes.tar.bz2 +	mythbackend myththemedmenu.cpp.patch myththemedmenu.h.patch   +	smolt_jump.patch pretty gnome_screensaver.patch mpegpspatch  +	mythbackend.lr mythfrontend.lr)  license=('GPL2')  makedepends=(libgl subversion python perl) @@ -36,9 +34,6 @@ build() {  #	 patch -p0 < $startdir/src/mpegpspatch  #	 cd - -#	Remove the hdhomerun changeset 20877 that prevents things from compiling. -#	patch -p3 < ../changeset-20877.patch -     . /etc/profile.d/qt3.sh     # use QT3 qmake diff --git a/abs/core-testing/mythtv/stable/mythtv/changeset-20877.patch b/abs/core-testing/mythtv/stable/mythtv/changeset-20877.patch deleted file mode 100644 index b92f0c1..0000000 --- a/abs/core-testing/mythtv/stable/mythtv/changeset-20877.patch +++ /dev/null @@ -1,5910 +0,0 @@ -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/Makefile src/mythtv-0.21/libs/libmythtv/hdhomerun/Makefile ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/Makefile	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/Makefile	2009-01-09 13:14:56.000000000 +1030 -@@ -1,52 +1,21 @@ --LIBSRCS += hdhomerun_pkt.c --LIBSRCS += hdhomerun_debug.c --LIBSRCS += hdhomerun_discover.c --LIBSRCS += hdhomerun_channels.c --LIBSRCS += hdhomerun_channelscan.c --LIBSRCS += hdhomerun_control.c --LIBSRCS += hdhomerun_video.c --LIBSRCS += hdhomerun_device.c --LIBSRCS += hdhomerun_device_selector.c -  --CC    := $(CROSS_COMPILE)gcc --STRIP := $(CROSS_COMPILE)strip -+SRCS += hdhomerun_pkt.c -+SRCS += hdhomerun_discover.c -+SRCS += hdhomerun_control.c -+SRCS += hdhomerun_video.c -+SRCS += hdhomerun_device.c -+SRCS += hdhomerun_config.c -  - CFLAGS += -Wall -O2 -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wpointer-arith --LDFLAGS += -lpthread --SHARED = -shared -Wl,-soname,libhdhomerun$(LIBEXT) -  --ifeq ($(OS),Windows_NT) --  BINEXT := .exe --  LIBEXT := .dll --  LDFLAGS += -liphlpapi --else --  LIBEXT := .so --  ifneq ($(findstring solaris,$(shell echo $$OSTYPE)),) --    LDFLAGS += -lns -lsocket --  endif --  ifneq ($(findstring darwin,$(shell echo $$OSTYPE)),) --    CFLAGS += -arch i386 -arch ppc --    LIBEXT := .dylib --    SHARED := -dynamiclib -install_name libhdhomerun$(LIBEXT) --  endif --endif -- --all : hdhomerun_config$(BINEXT) libhdhomerun$(LIBEXT) -- --hdhomerun_config$(BINEXT) : hdhomerun_config.c $(LIBSRCS) --	$(CC) $(CFLAGS) $+ $(LDFLAGS) -o $@ --	$(STRIP) $@ -- --libhdhomerun$(LIBEXT) : $(LIBSRCS) --	$(CC) $(CFLAGS) -fPIC -DDLL_EXPORT $(SHARED) $+ $(LDFLAGS) -o $@ -+hdhomerun_config : $(SRCS) -+	gcc $(CFLAGS) $(SRCS) -lpthread -o $@ -+	strip $@ -+ -+hdhomerun_config.exe : $(SRCS) -+	gcc $(CFLAGS) $(SRCS) -lpthread -liphlpapi -o $@ -+	strip $@ -  - clean : --	-rm -f hdhomerun_config$(BINEXT) --	-rm -f libhdhomerun$(LIBEXT) -- --distclean : clean -- --%: --	@echo "(ignoring request to make $@)" -- --.PHONY: all list clean distclean -+	rm -f hdhomerun_config -+	rm -f hdhomerun_config.exe -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun.h src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun.h ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun.h	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun.h	2009-01-09 13:14:56.000000000 +1030 -@@ -1,14 +1,12 @@ --#ifndef __HDHOMERUN_INCLUDES__ --#define __HDHOMERUN_INCLUDES__ - /* -- * hdhomerun.h -+ * hdhomerun_device.h -  * -- * Copyright © 2006-2008 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -16,33 +14,13 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ -  - #include "hdhomerun_os.h" --#include "hdhomerun_types.h" - #include "hdhomerun_pkt.h" --#include "hdhomerun_debug.h" - #include "hdhomerun_discover.h" - #include "hdhomerun_control.h" - #include "hdhomerun_video.h" --#include "hdhomerun_channels.h" --#include "hdhomerun_channelscan.h" - #include "hdhomerun_device.h" --#include "hdhomerun_device_selector.h" -- --#endif /* __HDHOMERUN_INCLUDES__ */ -- -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_channels.c -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_channels.h -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_channelscan.c -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_channelscan.h -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_config.c src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_config.c ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_config.c	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_config.c	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_config.c -  * -- * Copyright © 2006-2008 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,34 +14,12 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ -  - #include "hdhomerun.h" -  --/* -- * The console output format should be set to UTF-8, however in XP and Vista this breaks batch file processing. -- * Attempting to restore on exit fails to restore if the program is terminated by the user. -- * Solution - set the output format each printf. -- */ --#if defined(__WINDOWS__) --#define printf console_printf --#define vprintf console_vprintf --#endif -- - static const char *appname; -  - struct hdhomerun_device_t *hd; -@@ -53,8 +31,7 @@ - 	printf("\t%s <id> get help\n", appname); - 	printf("\t%s <id> get <item>\n", appname); - 	printf("\t%s <id> set <item> <value>\n", appname); --	printf("\t%s <id> scan <tuner> [<filename>]\n", appname); --	printf("\t%s <id> save <tuner> <filename>\n", appname); -+	printf("\t%s <id> scan <tuner> <starting channel>\n", appname); - 	printf("\t%s <id> upgrade <filename>\n", appname); - 	return -1; - } -@@ -91,29 +68,10 @@ - 	return FALSE; - } -  --static uint32_t parse_ip_addr(const char *str) --{ --	unsigned long a[4]; --	if (sscanf(str, "%lu.%lu.%lu.%lu", &a[0], &a[1], &a[2], &a[3]) != 4) { --		return 0; --	} -- --	return (uint32_t)((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | (a[3] << 0)); --} -- --static int discover_print(char *target_ip_str) -+static int discover_print(void) - { --	uint32_t target_ip = 0; --	if (target_ip_str) { --		target_ip = parse_ip_addr(target_ip_str); --		if (target_ip == 0) { --			fprintf(stderr, "invalid ip address: %s\n", target_ip_str); --			return -1; --		} --	} -- - 	struct hdhomerun_discover_device_t result_list[64]; --	int count = hdhomerun_discover_find_devices_custom(target_ip, HDHOMERUN_DEVICE_TYPE_TUNER, HDHOMERUN_DEVICE_ID_WILDCARD, result_list, 64); -+	int count = hdhomerun_discover_find_devices(HDHOMERUN_DEVICE_TYPE_TUNER, result_list, 64); - 	if (count < 0) { - 		fprintf(stderr, "error sending discover request\n"); - 		return -1; -@@ -136,6 +94,32 @@ - 	return count; - } -  -+static bool_t parse_device_id_str(const char *s, uint32_t *pdevice_id, uint32_t *pdevice_ip) -+{ -+	unsigned long a[4]; -+	if (sscanf(s, "%lu.%lu.%lu.%lu", &a[0], &a[1], &a[2], &a[3]) == 4) { -+		*pdevice_id = HDHOMERUN_DEVICE_ID_WILDCARD; -+		*pdevice_ip = (uint32_t)((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | (a[3] << 0)); -+		return TRUE; -+	} -+ -+	unsigned long device_id_raw; -+	if (sscanf(s, "%lx", &device_id_raw) != 1) { -+		fprintf(stderr, "invalid device id: %s\n", s); -+		return FALSE; -+	} -+ -+	uint32_t device_id = (uint32_t)device_id_raw; -+	if (!hdhomerun_discover_validate_device_id(device_id)) { -+		fprintf(stderr, "invalid device id: %s\n", s); -+		return FALSE; -+	} -+ -+	*pdevice_id = device_id; -+	*pdevice_ip = 0; -+	return TRUE; -+} -+ - static int cmd_get(const char *item) - { - 	char *ret_value; -@@ -154,7 +138,7 @@ - 	return 1; - } -  --static int cmd_set_internal(const char *item, const char *value) -+static int cmd_set(const char *item, const char *value) - { - 	char *ret_error; - 	if (hdhomerun_device_set_var(hd, item, value, NULL, &ret_error) < 0) { -@@ -170,260 +154,118 @@ - 	return 1; - } -  --static int cmd_set(const char *item, const char *value) -+static int cmd_streaminfo(const char *tuner_str) - { --	if (strcmp(value, "-") == 0) { --		char *buffer = NULL; --		size_t pos = 0; -- --		while (1) { --			buffer = (char *)realloc(buffer, pos + 1024); --			if (!buffer) { --				fprintf(stderr, "out of memory\n"); --				return -1; --			} -- --			size_t size = fread(buffer + pos, 1, 1024, stdin); --			pos += size; -- --			if (size < 1024) { --				break; --			} --		} -- --		buffer[pos] = 0; -- --		int ret = cmd_set_internal(item, buffer); -- --		free(buffer); --		return ret; --	} -- --	return cmd_set_internal(item, value); --} -- --static bool_t sigabort = FALSE; -- --static void signal_abort(int arg) --{ --	sigabort = TRUE; --} -- --static void cmd_scan_printf(FILE *fp, const char *fmt, ...) --{ --	va_list ap; --	va_start(ap, fmt); -- --	if (fp) { --		va_list apc; --		va_copy(apc, ap); -- --		vfprintf(fp, fmt, apc); --		fflush(fp); -- --		va_end(apc); --	} -- --	vprintf(fmt, ap); --	fflush(stdout); -- --	va_end(ap); -+	fprintf(stderr, "streaminfo: use \"get /tuner<n>/streaminfo\"\n"); -+	return -1; - } -  --static int cmd_scan(const char *tuner_str, const char *filename) -+static int cmd_scan(const char *tuner_str, const char *start_value) - { --	if (hdhomerun_device_set_tuner_from_str(hd, tuner_str) <= 0) { -+	unsigned int tuner; -+	if (sscanf(tuner_str, "%u", &tuner) != 1) { - 		fprintf(stderr, "invalid tuner number\n"); - 		return -1; - 	} -  --	char *ret_error; --	if (hdhomerun_device_tuner_lockkey_request(hd, &ret_error) <= 0) { --		fprintf(stderr, "failed to lock tuner\n"); --		if (ret_error) { --			fprintf(stderr, "%s\n", ret_error); --		} --		return -1; --	} -+	hdhomerun_device_set_tuner(hd, tuner); -  --	hdhomerun_device_set_tuner_target(hd, "none"); -- --	char *channelmap; --	if (hdhomerun_device_get_tuner_channelmap(hd, &channelmap) <= 0) { --		fprintf(stderr, "failed to query channelmap from device\n"); --		return -1; -+	char channel_str[64]; -+	strncpy(channel_str, start_value, sizeof(channel_str)); -+	channel_str[sizeof(channel_str) - 8] = 0; -+ -+	char *channel_number_ptr = strrchr(channel_str, ':'); -+	if (!channel_number_ptr) { -+		channel_number_ptr = channel_str; -+	} else { -+		channel_number_ptr++; - 	} -  --	const char *channelmap_scan_group = hdhomerun_channelmap_get_channelmap_scan_group(channelmap); --	if (!channelmap_scan_group) { --		fprintf(stderr, "unknown channelmap '%s'\n", channelmap); -+	unsigned int channel_number = atol(channel_number_ptr); -+	if (channel_number == 0) { -+		fprintf(stderr, "invalid starting channel\n"); - 		return -1; - 	} -  --	if (hdhomerun_device_channelscan_init(hd, channelmap_scan_group) <= 0) { --		fprintf(stderr, "failed to initialize channel scan\n"); -+	/* Test starting channel. */ -+	int ret = hdhomerun_device_set_tuner_channel(hd, channel_str); -+	if (ret < 0) { -+		fprintf(stderr, "communication error sending request to hdhomerun device\n"); - 		return -1; - 	} -- --	FILE *fp = NULL; --	if (filename) { --		fp = fopen(filename, "w"); --		if (!fp) { --			fprintf(stderr, "unable to create file: %s\n", filename); --			return -1; --		} -+	if (ret == 0) { -+		fprintf(stderr, "invalid starting channel\n"); -+		return -1; - 	} -  --	signal(SIGINT, signal_abort); --	signal(SIGPIPE, signal_abort); -+	while (1) { -+		/* Update channel value */ -+		sprintf(channel_number_ptr, "%u", channel_number); -  --	int ret = 0; --	while (!sigabort) { --		struct hdhomerun_channelscan_result_t result; --		ret = hdhomerun_device_channelscan_advance(hd, &result); --		if (ret <= 0) { --			break; -+		/* Set channel. */ -+		ret = hdhomerun_device_set_tuner_channel(hd, channel_str); -+		if (ret < 0) { -+			fprintf(stderr, "communication error sending request to hdhomerun device\n"); -+			return -1; - 		} -- --		cmd_scan_printf(fp, "SCANNING: %lu (%s)\n", --			result.frequency, result.channel_str --		); -- --		ret = hdhomerun_device_channelscan_detect(hd, &result); --		if (ret <= 0) { --			break; -+		if (ret == 0) { -+			return 0; - 		} -  --		cmd_scan_printf(fp, "LOCK: %s (ss=%u snq=%u seq=%u)\n", --			result.status.lock_str, result.status.signal_strength, --			result.status.signal_to_noise_quality, result.status.symbol_error_quality --		); -+		/* Wait 1.5s for lock (qam auto is the slowest to lock). */ -+		usleep(HDHOMERUN_DEVICE_MAX_TUNE_TO_LOCK_TIME * 1000); -  --		if (result.transport_stream_id_detected) { --			cmd_scan_printf(fp, "TSID: 0x%04X\n", result.transport_stream_id); -+		/* Get status to check for signal. Quality numbers will not be valid yet. */ -+		struct hdhomerun_tuner_status_t status; -+		if (hdhomerun_device_get_tuner_status(hd, &status) < 0) { -+			fprintf(stderr, "communication error sending request to hdhomerun device\n"); -+			return -1; - 		} -  --		int i; --		for (i = 0; i < result.program_count; i++) { --			struct hdhomerun_channelscan_program_t *program = &result.programs[i]; --			cmd_scan_printf(fp, "PROGRAM %s\n", program->program_str); -+		/* If no signal then advance to next channel. */ -+		if (status.signal_strength == 0) { -+			printf("%s: no signal\n", channel_str); -+			channel_number++; -+			continue; - 		} --	} -- --	hdhomerun_device_tuner_lockkey_release(hd); -  --	if (fp) { --		fclose(fp); --	} --	if (ret < 0) { --		fprintf(stderr, "communication error sending request to hdhomerun device\n"); --	} --	return ret; --} -- --static int cmd_save(const char *tuner_str, const char *filename) --{ --	if (hdhomerun_device_set_tuner_from_str(hd, tuner_str) <= 0) { --		fprintf(stderr, "invalid tuner number\n"); --		return -1; --	} -+		/* Wait for 2s. */ -+		usleep(HDHOMERUN_DEVICE_MAX_LOCK_TO_DATA_TIME * 1000); -  --	FILE *fp; --	if (strcmp(filename, "null") == 0) { --		fp = NULL; --	} else if (strcmp(filename, "-") == 0) { --		fp = stdout; --	} else { --		fp = fopen(filename, "wb"); --		if (!fp) { --			fprintf(stderr, "unable to create file %s\n", filename); -+		/* Get status to check quality numbers. */ -+		if (hdhomerun_device_get_tuner_status(hd, &status) < 0) { -+			fprintf(stderr, "communication error sending request to hdhomerun device\n"); - 			return -1; - 		} --	} -- --	int ret = hdhomerun_device_stream_start(hd); --	if (ret <= 0) { --		fprintf(stderr, "unable to start stream\n"); --		if (fp && fp != stdout) { --			fclose(fp); --		} --		return ret; --	} -- --	signal(SIGINT, signal_abort); --	signal(SIGPIPE, signal_abort); -- --	struct hdhomerun_video_stats_t stats_old, stats_cur; --	hdhomerun_device_get_video_stats(hd, &stats_old); -- --	uint64_t next_progress = getcurrenttime() + 1000; -- --	while (!sigabort) { --		uint64_t loop_start_time = getcurrenttime(); -- --		size_t actual_size; --		uint8_t *ptr = hdhomerun_device_stream_recv(hd, VIDEO_DATA_BUFFER_SIZE_1S, &actual_size); --		if (!ptr) { --			msleep(64); -+		if (status.signal_strength == 0) { -+			printf("%s: no signal\n", channel_str); -+			channel_number++; - 			continue; - 		} -+		printf("%s: ss=%u snq=%u seq=%u\n", channel_str, status.signal_strength, status.signal_to_noise_quality, status.symbol_error_quality); -  --		if (fp) { --			if (fwrite(ptr, 1, actual_size, fp) != actual_size) { --				fprintf(stderr, "error writing output\n"); --				return -1; --			} -+		/* Detect sub channels. */ -+		usleep(4 * 1000000); -+		char *streaminfo; -+		if (hdhomerun_device_get_tuner_streaminfo(hd, &streaminfo) <= 0) { -+			channel_number++; -+			continue; - 		} -- --		if (loop_start_time >= next_progress) { --			next_progress += 1000; --			if (loop_start_time >= next_progress) { --				next_progress = loop_start_time + 1000; --			} -- --			hdhomerun_device_get_video_stats(hd, &stats_cur); -- --			if (stats_cur.overflow_error_count > stats_old.overflow_error_count) { --				fprintf(stderr, "o"); --			} else if (stats_cur.network_error_count > stats_old.network_error_count) { --				fprintf(stderr, "n"); --			} else if (stats_cur.transport_error_count > stats_old.transport_error_count) { --				fprintf(stderr, "t"); --			} else if (stats_cur.sequence_error_count > stats_old.sequence_error_count) { --				fprintf(stderr, "s"); --			} else { --				fprintf(stderr, "."); -+		while (1) { -+			char *end = strchr(streaminfo, '\n'); -+			if (!end) { -+				break; - 			} -  --			stats_old = stats_cur; --			fflush(stderr); --		} -+			*end++ = 0; -+			printf("program %s\n", streaminfo); -  --		int32_t delay = 64 - (int32_t)(getcurrenttime() - loop_start_time); --		if (delay <= 0) { --			continue; -+			streaminfo = end; - 		} -  --		msleep(delay); --	} -- --	if (fp) { --		fclose(fp); -+		/* Advance to next channel. */ -+		channel_number++; - 	} -- --	hdhomerun_device_stream_stop(hd); --	hdhomerun_device_get_video_stats(hd, &stats_cur); -- --	fprintf(stderr, "\n"); --	fprintf(stderr, "-- Video statistics --\n"); --	fprintf(stderr, "%u packets received, %u overflow errors, %u network errors, %u transport errors, %u sequence errors\n", --		(unsigned int)stats_cur.packet_count,  --		(unsigned int)stats_cur.overflow_error_count, --		(unsigned int)stats_cur.network_error_count,  --		(unsigned int)stats_cur.transport_error_count,  --		(unsigned int)stats_cur.sequence_error_count); -- --	return 0; - } -  - static int cmd_upgrade(const char *filename) -@@ -434,98 +276,16 @@ - 		return -1; - 	} -  --	printf("uploading firmware...\n"); - 	if (hdhomerun_device_upgrade(hd, fp) <= 0) { - 		fprintf(stderr, "error sending upgrade file to hdhomerun device\n"); - 		fclose(fp); - 		return -1; - 	} --	sleep(2); -- --	printf("upgrading firmware...\n"); --	sleep(8); -- --	printf("rebooting...\n"); --	int count = 0; --	char *version_str; --	while (1) { --		if (hdhomerun_device_get_version(hd, &version_str, NULL) >= 0) { --			break; --		} -- --		count++; --		if (count > 30) { --			fprintf(stderr, "error finding device after firmware upgrade\n"); --			fclose(fp); --			return -1; --		} -  --		sleep(1); --	} -- --	printf("upgrade complete - now running firmware %s\n", version_str); -+	printf("upgrade complete\n"); - 	return 0; - } -  --static int cmd_execute(void) --{ --	char *ret_value; --	char *ret_error; --	if (hdhomerun_device_get_var(hd, "/sys/boot", &ret_value, &ret_error) < 0) { --		fprintf(stderr, "communication error sending request to hdhomerun device\n"); --		return -1; --	} -- --	if (ret_error) { --		printf("%s\n", ret_error); --		return 0; --	} -- --	char *end = ret_value + strlen(ret_value); --	char *pos = ret_value; -- --	while (1) { --		if (pos >= end) { --			break; --		} -- --		char *eol_r = strchr(pos, '\r'); --		if (!eol_r) { --			eol_r = end; --		} -- --		char *eol_n = strchr(pos, '\n'); --		if (!eol_n) { --			eol_n = end; --		} -- --		char *eol = eol_r; --		if (eol_n < eol) { --			eol = eol_n; --		} -- --		char *sep = strchr(pos, ' '); --		if (!sep || sep > eol) { --			pos = eol + 1; --			continue; --		} -- --		*sep = 0; --		*eol = 0; -- --		char *item = pos; --		char *value = sep + 1; -- --		printf("set %s \"%s\"\n", item, value); -- --		cmd_set_internal(item, value); -- --		pos = eol + 1; --	} -- --	return 1; --} -- - static int main_cmd(int argc, char *argv[]) - { - 	if (argc < 1) { -@@ -534,17 +294,6 @@ -  - 	char *cmd = *argv++; argc--; -  --	if (contains(cmd, "key")) { --		if (argc < 2) { --			return help(); --		} --		uint32_t lockkey = strtoul(argv[0], NULL, 0); --		hdhomerun_device_tuner_lockkey_use_value(hd, lockkey); -- --		cmd = argv[1]; --		argv+=2; argc-=2; --	} -- - 	if (contains(cmd, "get")) { - 		if (argc < 1) { - 			return help(); -@@ -559,22 +308,18 @@ - 		return cmd_set(argv[0], argv[1]); - 	} -  --	if (contains(cmd, "scan")) { -+	if (contains(cmd, "streaminfo")) { - 		if (argc < 1) { - 			return help(); - 		} --		if (argc < 2) { --			return cmd_scan(argv[0], NULL); --		} else { --			return cmd_scan(argv[0], argv[1]); --		} -+		return cmd_streaminfo(argv[0]); - 	} -  --	if (contains(cmd, "save")) { -+	if (contains(cmd, "scan")) { - 		if (argc < 2) { - 			return help(); - 		} --		return cmd_save(argv[0], argv[1]); -+		return cmd_scan(argv[0], argv[1]); - 	} -  - 	if (contains(cmd, "upgrade")) { -@@ -584,17 +329,16 @@ - 		return cmd_upgrade(argv[0]); - 	} -  --	if (contains(cmd, "execute")) { --		return cmd_execute(); --	} -- - 	return help(); - } -  - static int main_internal(int argc, char *argv[]) - { - #if defined(__WINDOWS__) --	/* Initialize network socket support. */ -+	//Start pthreads -+	pthread_win32_process_attach_np(); -+ -+	// Start WinSock - 	WORD wVersionRequested = MAKEWORD(2, 0); - 	WSADATA wsaData; - 	WSAStartup(wVersionRequested, &wsaData); -@@ -613,36 +357,35 @@ - 		return help(); - 	} - 	if (contains(id_str, "discover")) { --		if (argc < 1) { --			return discover_print(NULL); --		} else { --			return discover_print(argv[0]); --		} -+		return discover_print(); - 	} -  --	/* Device object. */ --	hd = hdhomerun_device_create_from_str(id_str, NULL); --	if (!hd) { --		fprintf(stderr, "invalid device id: %s\n", id_str); -+	/* Device ID. */ -+	uint32_t device_id, device_ip; -+	if (!parse_device_id_str(id_str, &device_id, &device_ip)) { - 		return -1; - 	} -  --	/* Device ID check. */ --	uint32_t device_id_requested = hdhomerun_device_get_device_id_requested(hd); --	if (!hdhomerun_discover_validate_device_id(device_id_requested)) { --		fprintf(stderr, "invalid device id: %08lX\n", (unsigned long)device_id_requested); -+	/* Device object. */ -+	hd = hdhomerun_device_create(device_id, device_ip, 0); -+	if (!hd) { -+		fprintf(stderr, "unable to create device\n"); -+		return -1; - 	} -  --	/* Connect to device and check model. */ --	const char *model = hdhomerun_device_get_model_str(hd); --	if (!model) { -+	/* Connect to device and check firmware version. */ -+	int ret = hdhomerun_device_firmware_version_check(hd, 0); -+	if (ret < 0) { - 		fprintf(stderr, "unable to connect to device\n"); - 		hdhomerun_device_destroy(hd); - 		return -1; - 	} -+	if (ret == 0) { -+		fprintf(stderr, "WARNING: firmware upgrade needed for all operations to function\n"); -+	} -  - 	/* Command. */ --	int ret = main_cmd(argc, argv); -+	ret = main_cmd(argc, argv); -  - 	/* Cleanup. */ - 	hdhomerun_device_destroy(hd); -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_control.c src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_control.c ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_control.c	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_control.c	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_control.c -  * -- * Copyright © 2006 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,119 +14,83 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ -  --#include "hdhomerun.h" -- --#define HDHOMERUN_CONTROL_SEND_TIMEOUT 5000 --#define HDHOMERUN_CONTROL_RECV_TIMEOUT 5000 --#define HDHOMERUN_CONTROL_UPGRADE_TIMEOUT 20000 -+#include "hdhomerun_os.h" -+#include "hdhomerun_pkt.h" -+#include "hdhomerun_discover.h" -+#include "hdhomerun_control.h" -  - struct hdhomerun_control_sock_t { --	uint32_t desired_device_id; --	uint32_t desired_device_ip; --	uint32_t actual_device_id; --	uint32_t actual_device_ip; -+	uint32_t device_id; -+	uint32_t device_ip; - 	int sock; --	struct hdhomerun_debug_t *dbg; --	struct hdhomerun_pkt_t tx_pkt; --	struct hdhomerun_pkt_t rx_pkt; -+	uint8_t buffer[16384]; - }; -  --static void hdhomerun_control_close_sock(struct hdhomerun_control_sock_t *cs) --{ --	if (cs->sock == -1) { --		return; --	} -- --	close(cs->sock); --	cs->sock = -1; --} -- --void hdhomerun_control_set_device(struct hdhomerun_control_sock_t *cs, uint32_t device_id, uint32_t device_ip) --{ --	hdhomerun_control_close_sock(cs); -- --	cs->desired_device_id = device_id; --	cs->desired_device_ip = device_ip; --	cs->actual_device_id = 0; --	cs->actual_device_ip = 0; --} -- --struct hdhomerun_control_sock_t *hdhomerun_control_create(uint32_t device_id, uint32_t device_ip, struct hdhomerun_debug_t *dbg) -+struct hdhomerun_control_sock_t *hdhomerun_control_create(uint32_t device_id, uint32_t device_ip) - { --	struct hdhomerun_control_sock_t *cs = (struct hdhomerun_control_sock_t *)calloc(1, sizeof(struct hdhomerun_control_sock_t)); -+	struct hdhomerun_control_sock_t *cs = (struct hdhomerun_control_sock_t *)malloc(sizeof(struct hdhomerun_control_sock_t)); - 	if (!cs) { --		hdhomerun_debug_printf(dbg, "hdhomerun_control_create: failed to allocate control object\n"); - 		return NULL; - 	} -- --	cs->dbg = dbg; -+	 -+	cs->device_id = device_id; -+	cs->device_ip = device_ip; - 	cs->sock = -1; --	hdhomerun_control_set_device(cs, device_id, device_ip); -  - 	return cs; - } -  - void hdhomerun_control_destroy(struct hdhomerun_control_sock_t *cs) - { --	hdhomerun_control_close_sock(cs); -+	if (cs->sock != -1) { -+		close(cs->sock); -+	} - 	free(cs); - } -  -+static void hdhomerun_control_close_sock(struct hdhomerun_control_sock_t *cs) -+{ -+	close(cs->sock); -+	cs->sock = -1; -+} -+ - static bool_t hdhomerun_control_connect_sock(struct hdhomerun_control_sock_t *cs) - { - 	if (cs->sock != -1) { - 		return TRUE; - 	} -  --	if ((cs->desired_device_id == 0) && (cs->desired_device_ip == 0)) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_connect_sock: no device specified\n"); --		return FALSE; --	} -- --	/* Find device. */ --	struct hdhomerun_discover_device_t result; --	if (hdhomerun_discover_find_devices_custom(cs->desired_device_ip, HDHOMERUN_DEVICE_TYPE_WILDCARD, cs->desired_device_id, &result, 1) <= 0) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_connect_sock: device not found\n"); --		return FALSE; -+	/* Find ip address. */ -+	uint32_t device_ip = cs->device_ip; -+	if (device_ip == 0) { -+		struct hdhomerun_discover_device_t result; -+		if (hdhomerun_discover_find_device(cs->device_id, &result) <= 0) { -+			return FALSE; -+		} -+		device_ip = result.ip_addr; - 	} --	cs->actual_device_ip = result.ip_addr; --	cs->actual_device_id = result.device_id; -  - 	/* Create socket. */ - 	cs->sock = (int)socket(AF_INET, SOCK_STREAM, 0); - 	if (cs->sock == -1) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_connect_sock: failed to create socket (%d)\n", sock_getlasterror); - 		return FALSE; - 	} -  - 	/* Set timeouts. */ --	setsocktimeout(cs->sock, SOL_SOCKET, SO_SNDTIMEO, HDHOMERUN_CONTROL_SEND_TIMEOUT); --	setsocktimeout(cs->sock, SOL_SOCKET, SO_RCVTIMEO, HDHOMERUN_CONTROL_RECV_TIMEOUT); -+	setsocktimeout(cs->sock, SOL_SOCKET, SO_SNDTIMEO, 1000); -+	setsocktimeout(cs->sock, SOL_SOCKET, SO_RCVTIMEO, 1000); -  - 	/* Initiate connection. */ - 	struct sockaddr_in sock_addr; - 	memset(&sock_addr, 0, sizeof(sock_addr)); - 	sock_addr.sin_family = AF_INET; --	sock_addr.sin_addr.s_addr = htonl(cs->actual_device_ip); -+	sock_addr.sin_addr.s_addr = htonl(device_ip); - 	sock_addr.sin_port = htons(HDHOMERUN_CONTROL_TCP_PORT); - 	if (connect(cs->sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != 0) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_connect_sock: failed to connect (%d)\n", sock_getlasterror); - 		hdhomerun_control_close_sock(cs); - 		return FALSE; - 	} -@@ -135,215 +99,125 @@ - 	return TRUE; - } -  --uint32_t hdhomerun_control_get_device_id(struct hdhomerun_control_sock_t *cs) --{ --	if (!hdhomerun_control_connect_sock(cs)) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_device_id: connect failed\n"); --		return 0; --	} -- --	return cs->actual_device_id; --} -- --uint32_t hdhomerun_control_get_device_ip(struct hdhomerun_control_sock_t *cs) --{ --	if (!hdhomerun_control_connect_sock(cs)) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_device_ip: connect failed\n"); --		return 0; --	} -- --	return cs->actual_device_ip; --} -- --uint32_t hdhomerun_control_get_device_id_requested(struct hdhomerun_control_sock_t *cs) --{ --	return cs->desired_device_id; --} -- --uint32_t hdhomerun_control_get_device_ip_requested(struct hdhomerun_control_sock_t *cs) --{ --	return cs->desired_device_ip; --} -- - uint32_t hdhomerun_control_get_local_addr(struct hdhomerun_control_sock_t *cs) - { - 	if (!hdhomerun_control_connect_sock(cs)) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_local_addr: connect failed\n"); - 		return 0; - 	} -  - 	struct sockaddr_in sock_addr; - 	socklen_t sockaddr_size = sizeof(sock_addr); - 	if (getsockname(cs->sock, (struct sockaddr*)&sock_addr, &sockaddr_size) != 0) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_local_addr: getsockname failed (%d)\n", sock_getlasterror); - 		return 0; - 	} -  - 	return ntohl(sock_addr.sin_addr.s_addr); - } -  --static int hdhomerun_control_send_sock(struct hdhomerun_control_sock_t *cs, struct hdhomerun_pkt_t *tx_pkt) -+static int hdhomerun_control_send(struct hdhomerun_control_sock_t *cs, uint8_t *start, uint8_t *end) - { --	int length = (int)(tx_pkt->end - tx_pkt->start); --	if (send(cs->sock, (char *)tx_pkt->start, (int)length, 0) != length) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_send_sock: send failed (%d)\n", sock_getlasterror); --		hdhomerun_control_close_sock(cs); -+	int length = (int)(end - start); -+	if (send(cs->sock, (char *)start, (int)length, 0) != length) { - 		return -1; - 	} -  --	return 1; -+	return length; - } -  --static int hdhomerun_control_recv_sock(struct hdhomerun_control_sock_t *cs, struct hdhomerun_pkt_t *rx_pkt, uint16_t *ptype, uint64_t recv_timeout) -+static int hdhomerun_control_recv_sock(struct hdhomerun_control_sock_t *cs, uint8_t *buffer, uint8_t *limit) - { --	uint64_t stop_time = getcurrenttime() + recv_timeout; --	hdhomerun_pkt_reset(rx_pkt); -+	struct timeval t; -+	t.tv_sec = 0; -+	t.tv_usec = 250000; -  --	while (getcurrenttime() < stop_time) { --		struct timeval t; --		t.tv_sec = 0; --		t.tv_usec = 250000; --	 --		fd_set readfds; --		FD_ZERO(&readfds); --		FD_SET(cs->sock, &readfds); --	 --		if (select(cs->sock+1, &readfds, NULL, NULL, &t) < 0) { --			hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_recv_sock: select failed (%d)\n", sock_getlasterror); --			hdhomerun_control_close_sock(cs); --			return -1; --		} --	 --		if (!FD_ISSET(cs->sock, &readfds)) { --			continue; --		} --	 --		int rx_length = recv(cs->sock, (char *)rx_pkt->end, (int)(rx_pkt->limit - rx_pkt->end), 0); --		if (rx_length <= 0) { --			hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_recv_sock: recv failed (%d)\n", sock_getlasterror); --			hdhomerun_control_close_sock(cs); --			return -1; --		} --		rx_pkt->end += rx_length; -+	fd_set readfds; -+	FD_ZERO(&readfds); -+	FD_SET(cs->sock, &readfds); -  --		int ret = hdhomerun_pkt_open_frame(rx_pkt, ptype); --		if (ret < 0) { --			hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_recv_sock: frame error\n"); --			hdhomerun_control_close_sock(cs); --			return -1; --		} --		if (ret == 0) { --			continue; --		} -+	if (select(cs->sock+1, &readfds, NULL, NULL, &t) < 0) { -+		return -1; -+	} -  --		return 1; -+	if (!FD_ISSET(cs->sock, &readfds)) { -+		return 0; - 	} -  --	hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_recv_sock: timeout\n"); --	hdhomerun_control_close_sock(cs); --	return -1; -+	int length = recv(cs->sock, (char *)buffer, (int)(limit - buffer), 0); -+	if (length <= 0) { -+		return -1; -+	} -+ -+	return length; - } -  --static int hdhomerun_control_send_recv_internal(struct hdhomerun_control_sock_t *cs, struct hdhomerun_pkt_t *tx_pkt, struct hdhomerun_pkt_t *rx_pkt, uint16_t type, uint64_t recv_timeout) -+static int hdhomerun_control_recv(struct hdhomerun_control_sock_t *cs, uint8_t *buffer, uint8_t *limit) - { --	hdhomerun_pkt_seal_frame(tx_pkt, type); -+	uint64_t timeout = getcurrenttime() + 1000; -+	uint8_t *ptr = buffer; -  --	int i; --	for (i = 0; i < 2; i++) { --		if (cs->sock == -1) { --			if (!hdhomerun_control_connect_sock(cs)) { --				hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_send_recv: connect failed\n"); --				return -1; --			} -+	while (getcurrenttime() < timeout) { -+		int length = hdhomerun_control_recv_sock(cs, ptr, limit); -+		if (length < 0) { -+			return -1; - 		} -- --		if (hdhomerun_control_send_sock(cs, tx_pkt) < 0) { -+		if (length == 0) { - 			continue; - 		} --		if (!rx_pkt) { --			return 1; --		} -+		ptr += length; -  --		uint16_t rsp_type; --		if (hdhomerun_control_recv_sock(cs, rx_pkt, &rsp_type, recv_timeout) < 0) { -+		if (buffer + HDHOMERUN_MIN_PEEK_LENGTH > limit) { - 			continue; - 		} --		if (rsp_type != type + 1) { --			hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_send_recv: unexpected frame type\n"); --			hdhomerun_control_close_sock(cs); -+ -+		length = (int)hdhomerun_peek_packet_length(buffer); -+		if (buffer + length > limit) { - 			continue; - 		} -  --		return 1; -+		return length; - 	} -  --	hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_send_recv: failed\n"); - 	return -1; - } -  --int hdhomerun_control_send_recv(struct hdhomerun_control_sock_t *cs, struct hdhomerun_pkt_t *tx_pkt, struct hdhomerun_pkt_t *rx_pkt, uint16_t type) -+static int hdhomerun_control_get_set(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, char **pvalue, char **perror) - { --	return hdhomerun_control_send_recv_internal(cs, tx_pkt, rx_pkt, type, HDHOMERUN_CONTROL_RECV_TIMEOUT); --} -- --static int hdhomerun_control_get_set(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, uint32_t lockkey, char **pvalue, char **perror) --{ --	struct hdhomerun_pkt_t *tx_pkt = &cs->tx_pkt; --	struct hdhomerun_pkt_t *rx_pkt = &cs->rx_pkt; -- --	/* Request. */ --	hdhomerun_pkt_reset(tx_pkt); -- --	int name_len = (int)strlen(name) + 1; --	if (tx_pkt->end + 3 + name_len > tx_pkt->limit) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: request too long\n"); -+	/* Send request. */ -+	uint8_t *ptr = cs->buffer; -+	hdhomerun_write_get_set_request(&ptr, name, value); -+	if (hdhomerun_control_send(cs, cs->buffer, ptr) < 0) { - 		return -1; - 	} --	hdhomerun_pkt_write_u8(tx_pkt, HDHOMERUN_TAG_GETSET_NAME); --	hdhomerun_pkt_write_var_length(tx_pkt, name_len); --	hdhomerun_pkt_write_mem(tx_pkt, (void *)name, name_len); -  --	if (value) { --		int value_len = (int)strlen(value) + 1; --		if (tx_pkt->end + 3 + value_len > tx_pkt->limit) { --			hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: request too long\n"); --			return -1; --		} --		hdhomerun_pkt_write_u8(tx_pkt, HDHOMERUN_TAG_GETSET_VALUE); --		hdhomerun_pkt_write_var_length(tx_pkt, value_len); --		hdhomerun_pkt_write_mem(tx_pkt, (void *)value, value_len); -+	/* Receive response. */ -+	int length = hdhomerun_control_recv(cs, cs->buffer, cs->buffer + sizeof(cs->buffer)); -+	if (length <= 0) { -+		return -1; - 	} -  --	if (lockkey != 0) { --		if (tx_pkt->end + 6 > tx_pkt->limit) { --			hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: request too long\n"); --			return -1; --		} --		hdhomerun_pkt_write_u8(tx_pkt, HDHOMERUN_TAG_GETSET_LOCKKEY); --		hdhomerun_pkt_write_var_length(tx_pkt, 4); --		hdhomerun_pkt_write_u32(tx_pkt, lockkey); -+	/* Parse response. */ -+	ptr = cs->buffer; -+	uint8_t *end = ptr + length; -+	int type = hdhomerun_process_packet(&ptr, &end); -+	if (type < 0) { -+		return -1; - 	} -- --	/* Send/Recv. */ --	if (hdhomerun_control_send_recv_internal(cs, tx_pkt, rx_pkt, HDHOMERUN_TYPE_GETSET_REQ, HDHOMERUN_CONTROL_RECV_TIMEOUT) < 0) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: send/recv error\n"); -+	if (type != HDHOMERUN_TYPE_GETSET_RPY) { - 		return -1; - 	} -  --	/* Response. */ --	while (1) { -+	while (ptr < end) { - 		uint8_t tag; - 		size_t len; --		uint8_t *next = hdhomerun_pkt_read_tlv(rx_pkt, &tag, &len); --		if (!next) { -+		uint8_t *val; -+		if (hdhomerun_read_tlv(&ptr, end, &tag, &len, &val) < 0) { - 			break; - 		} -- - 		switch (tag) { - 		case HDHOMERUN_TAG_GETSET_VALUE: - 			if (pvalue) { --				*pvalue = (char *)rx_pkt->pos; --				rx_pkt->pos[len] = 0; -+				*pvalue = (char *)val; -+				val[len] = 0; - 			} - 			if (perror) { - 				*perror = NULL; -@@ -351,48 +225,59 @@ - 			return 1; -  - 		case HDHOMERUN_TAG_ERROR_MESSAGE: --			rx_pkt->pos[len] = 0; --			hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: %s\n", rx_pkt->pos); -- - 			if (pvalue) { - 				*pvalue = NULL; - 			} - 			if (perror) { --				*perror = (char *)rx_pkt->pos; -+				*perror = (char *)val; -+				val[len] = 0; - 			} -- - 			return 0; - 		} -- --		rx_pkt->pos = next; - 	} -  --	hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: missing response tags\n"); - 	return -1; - } -  - int hdhomerun_control_get(struct hdhomerun_control_sock_t *cs, const char *name, char **pvalue, char **perror) - { --	return hdhomerun_control_get_set(cs, name, NULL, 0, pvalue, perror); -+	if (!hdhomerun_control_connect_sock(cs)) { -+		return -1; -+	} -+ -+	int ret = hdhomerun_control_get_set(cs, name, NULL, pvalue, perror); -+	if (ret < 0) { -+		hdhomerun_control_close_sock(cs); -+		return -1; -+	} -+ -+	return ret; - } -  - int hdhomerun_control_set(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, char **pvalue, char **perror) - { --	return hdhomerun_control_get_set(cs, name, value, 0, pvalue, perror); --} -+	if (!hdhomerun_control_connect_sock(cs)) { -+		return -1; -+	} -  --int hdhomerun_control_set_with_lockkey(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, uint32_t lockkey, char **pvalue, char **perror) --{ --	return hdhomerun_control_get_set(cs, name, value, lockkey, pvalue, perror); -+	int ret = hdhomerun_control_get_set(cs, name, value, pvalue, perror); -+	if (ret < 0) { -+		hdhomerun_control_close_sock(cs); -+		return -1; -+	} -+ -+	return ret; - } -  - int hdhomerun_control_upgrade(struct hdhomerun_control_sock_t *cs, FILE *upgrade_file) - { --	struct hdhomerun_pkt_t *tx_pkt = &cs->tx_pkt; --	struct hdhomerun_pkt_t *rx_pkt = &cs->rx_pkt; -+	if (!hdhomerun_control_connect_sock(cs)) { -+		return -1; -+	} -+ - 	uint32_t sequence = 0; -+	uint8_t *ptr; -  --	/* Upload. */ - 	while (1) { - 		uint8_t data[256]; - 		size_t length = fread(data, 1, 256, upgrade_file); -@@ -400,12 +285,10 @@ - 			break; - 		} -  --		hdhomerun_pkt_reset(tx_pkt); --		hdhomerun_pkt_write_u32(tx_pkt, sequence); --		hdhomerun_pkt_write_mem(tx_pkt, data, length); -- --		if (hdhomerun_control_send_recv_internal(cs, tx_pkt, NULL, HDHOMERUN_TYPE_UPGRADE_REQ, 0) < 0) { --			hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_upgrade: send/recv failed\n"); -+		ptr = cs->buffer; -+		hdhomerun_write_upgrade_request(&ptr, sequence, data, length); -+		if (hdhomerun_control_send(cs, cs->buffer, ptr) < 0) { -+			hdhomerun_control_close_sock(cs); - 			return -1; - 		} -  -@@ -414,40 +297,15 @@ -  - 	if (sequence == 0) { - 		/* No data in file. Error, but no need to close connection. */ --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_upgrade: zero length file\n"); - 		return 0; - 	} -  --	/* Execute upgrade. */ --	hdhomerun_pkt_reset(tx_pkt); --	hdhomerun_pkt_write_u32(tx_pkt, 0xFFFFFFFF); -- --	if (hdhomerun_control_send_recv_internal(cs, tx_pkt, rx_pkt, HDHOMERUN_TYPE_UPGRADE_REQ, HDHOMERUN_CONTROL_UPGRADE_TIMEOUT) < 0) { --		hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_upgrade: send/recv failed\n"); -+	ptr = cs->buffer; -+	hdhomerun_write_upgrade_request(&ptr, 0xFFFFFFFF, NULL, 0); -+	if (hdhomerun_control_send(cs, cs->buffer, ptr) < 0) { -+		hdhomerun_control_close_sock(cs); - 		return -1; - 	} -  --	/* Check response. */ --	while (1) { --		uint8_t tag; --		size_t len; --		uint8_t *next = hdhomerun_pkt_read_tlv(rx_pkt, &tag, &len); --		if (!next) { --			break; --		} -- --		switch (tag) { --		case HDHOMERUN_TAG_ERROR_MESSAGE: --			rx_pkt->pos[len] = 0; --			hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_upgrade: %s\n", (char *)rx_pkt->pos); --			return 0; -- --		default: --			break; --		} -- --		rx_pkt->pos = next; --	} -- - 	return 1; - } -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_control.h src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_control.h ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_control.h	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_control.h	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_control.h -  * -- * Copyright © 2006 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,20 +14,8 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ - #ifdef __cplusplus - extern "C" { -@@ -43,26 +31,13 @@ -  * -  * uint32_t device_id = 32-bit device id of device. Set to HDHOMERUN_DEVICE_ID_WILDCARD to match any device ID. -  * uint32_t device_ip = IP address of device. Set to 0 to auto-detect. -- * struct hdhomerun_debug_t *dbg: Pointer to debug logging object. May be NULL. -  * -  * Returns a pointer to the newly created control socket. -  * -  * When no longer needed, the socket should be destroyed by calling hdhomerun_control_destroy. -  */ --extern LIBTYPE struct hdhomerun_control_sock_t *hdhomerun_control_create(uint32_t device_id, uint32_t device_ip, struct hdhomerun_debug_t *dbg); --extern LIBTYPE void hdhomerun_control_destroy(struct hdhomerun_control_sock_t *cs); -- --/* -- * Get the actual device id or ip of the device. -- * -- * Returns 0 if the device id cannot be determined. -- */ --extern LIBTYPE uint32_t hdhomerun_control_get_device_id(struct hdhomerun_control_sock_t *cs); --extern LIBTYPE uint32_t hdhomerun_control_get_device_ip(struct hdhomerun_control_sock_t *cs); --extern LIBTYPE uint32_t hdhomerun_control_get_device_id_requested(struct hdhomerun_control_sock_t *cs); --extern LIBTYPE uint32_t hdhomerun_control_get_device_ip_requested(struct hdhomerun_control_sock_t *cs); -- --extern LIBTYPE void hdhomerun_control_set_device(struct hdhomerun_control_sock_t *cs, uint32_t device_id, uint32_t device_ip); -+extern struct hdhomerun_control_sock_t *hdhomerun_control_create(uint32_t device_id, uint32_t device_ip); -+extern void hdhomerun_control_destroy(struct hdhomerun_control_sock_t *cs); -  - /* -  * Get the local machine IP address used when communicating with the device. -@@ -71,12 +46,7 @@ -  * -  * Returns 32-bit IP address with native endianness, or 0 on error. -  */ --extern LIBTYPE uint32_t hdhomerun_control_get_local_addr(struct hdhomerun_control_sock_t *cs); -- --/* -- * Low-level communication. -- */ --extern LIBTYPE int hdhomerun_control_send_recv(struct hdhomerun_control_sock_t *cs, struct hdhomerun_pkt_t *tx_pkt, struct hdhomerun_pkt_t *rx_pkt, uint16_t type); -+extern uint32_t hdhomerun_control_get_local_addr(struct hdhomerun_control_sock_t *cs); -  - /* -  * Get/set a control variable on the device. -@@ -95,9 +65,8 @@ -  * Returns 0 if the operation was rejected (pvalue NULL, perror set). -  * Returns -1 if a communication error occurs. -  */ --extern LIBTYPE int hdhomerun_control_get(struct hdhomerun_control_sock_t *cs, const char *name, char **pvalue, char **perror); --extern LIBTYPE int hdhomerun_control_set(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, char **pvalue, char **perror); --extern LIBTYPE int hdhomerun_control_set_with_lockkey(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, uint32_t lockkey, char **pvalue, char **perror); -+extern int hdhomerun_control_get(struct hdhomerun_control_sock_t *cs, const char *name, char **pvalue, char **perror); -+extern int hdhomerun_control_set(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, char **pvalue, char **perror); -  - /* -  * Upload new firmware to the device. -@@ -108,7 +77,7 @@ -  * Returns 0 if the upload was rejected. -  * Returns -1 if an error occurs. -  */ --extern LIBTYPE int hdhomerun_control_upgrade(struct hdhomerun_control_sock_t *cs, FILE *upgrade_file); -+extern int hdhomerun_control_upgrade(struct hdhomerun_control_sock_t *cs, FILE *upgrade_file); -  - #ifdef __cplusplus - } -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_debug.c -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_debug.h -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_device.c src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_device.c ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_device.c	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_device.c	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -- * hdhomerun_device.c -+ * hdhomerun_record.c -  * -- * Copyright © 2006-2008 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,92 +14,43 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ -  --#include "hdhomerun.h" -+#include "hdhomerun_os.h" -+#include "hdhomerun_pkt.h" -+#include "hdhomerun_control.h" -+#include "hdhomerun_video.h" -+#include "hdhomerun_device.h" -  - struct hdhomerun_device_t { - 	struct hdhomerun_control_sock_t *cs; - 	struct hdhomerun_video_sock_t *vs; --	struct hdhomerun_debug_t *dbg; --	struct hdhomerun_channelscan_t *scan; --	uint32_t device_id; - 	unsigned int tuner; --	uint32_t lockkey; --	char name[32]; --	char model[32]; -+	char result_buffer[1024]; - }; -  --static void hdhomerun_device_set_update(struct hdhomerun_device_t *hd) --{ --	/* Clear cached information. */ --	*hd->model = 0; -- --	/* New name. */ --	sprintf(hd->name, "%08lX-%u", (unsigned long)hd->device_id, hd->tuner); --} -- --void hdhomerun_device_set_device(struct hdhomerun_device_t *hd, uint32_t device_id, uint32_t device_ip) --{ --	hdhomerun_control_set_device(hd->cs, device_id, device_ip); -- --	if ((device_id == 0) || (device_id == HDHOMERUN_DEVICE_ID_WILDCARD)) { --		device_id = hdhomerun_control_get_device_id(hd->cs); --	} -- --	hd->device_id = device_id; --	hdhomerun_device_set_update(hd); --} -- --void hdhomerun_device_set_tuner(struct hdhomerun_device_t *hd, unsigned int tuner) --{ --	hd->tuner = tuner; --	hdhomerun_device_set_update(hd); --} -- --struct hdhomerun_device_t *hdhomerun_device_create(uint32_t device_id, uint32_t device_ip, unsigned int tuner, struct hdhomerun_debug_t *dbg) -+struct hdhomerun_device_t *hdhomerun_device_create(uint32_t device_id, uint32_t device_ip, unsigned int tuner) - { - 	struct hdhomerun_device_t *hd = (struct hdhomerun_device_t *)calloc(1, sizeof(struct hdhomerun_device_t)); - 	if (!hd) { --		hdhomerun_debug_printf(dbg, "hdhomerun_device_create: failed to allocate device object\n"); - 		return NULL; - 	} -  --	hd->dbg = dbg; -+	hd->tuner = tuner; -  --	hd->cs = hdhomerun_control_create(0, 0, hd->dbg); -+	hd->cs = hdhomerun_control_create(device_id, device_ip); - 	if (!hd->cs) { --		hdhomerun_debug_printf(hd->dbg, "hdhomerun_device_create: failed to create control object\n"); - 		free(hd); - 		return NULL; - 	} -  --	hdhomerun_device_set_device(hd, device_id, device_ip); --	hdhomerun_device_set_tuner(hd, tuner); -- - 	return hd; - } -  - void hdhomerun_device_destroy(struct hdhomerun_device_t *hd) - { --	if (hd->scan) { --		channelscan_destroy(hd->scan); --	} -- - 	if (hd->vs) { - 		hdhomerun_video_destroy(hd->vs); - 	} -@@ -109,152 +60,9 @@ - 	free(hd); - } -  --static bool_t is_hex_char(char c) --{ --	if ((c >= '0') && (c <= '9')) { --		return TRUE; --	} --	if ((c >= 'A') && (c <= 'F')) { --		return TRUE; --	} --	if ((c >= 'a') && (c <= 'f')) { --		return TRUE; --	} --	return FALSE; --} -- --static struct hdhomerun_device_t *hdhomerun_device_create_from_str_device_id(const char *device_str, struct hdhomerun_debug_t *dbg) --{ --	int i; --	const char *ptr = device_str; --	for (i = 0; i < 8; i++) { --		if (!is_hex_char(*ptr++)) { --			return NULL; --		} --	} -- --	if (*ptr == 0) { --		unsigned long device_id; --		if (sscanf(device_str, "%lx", &device_id) != 1) { --			return NULL; --		} --		return hdhomerun_device_create((uint32_t)device_id, 0, 0, dbg); --	} -- --	if (*ptr == '-') { --		unsigned long device_id; --		unsigned int tuner; --		if (sscanf(device_str, "%lx-%u", &device_id, &tuner) != 2) { --			return NULL; --		} --		return hdhomerun_device_create((uint32_t)device_id, 0, tuner, dbg); --	} -- --	return NULL; --} -- --static struct hdhomerun_device_t *hdhomerun_device_create_from_str_ip(const char *device_str, struct hdhomerun_debug_t *dbg) --{ --	unsigned long a[4]; --	if (sscanf(device_str, "%lu.%lu.%lu.%lu", &a[0], &a[1], &a[2], &a[3]) != 4) { --		return NULL; --	} -- --	unsigned long device_ip = (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | (a[3] << 0); --	return hdhomerun_device_create(HDHOMERUN_DEVICE_ID_WILDCARD, (uint32_t)device_ip, 0, dbg); --} -- --static struct hdhomerun_device_t *hdhomerun_device_create_from_str_dns(const char *device_str, struct hdhomerun_debug_t *dbg) --{ --#if defined(__CYGWIN__) --	return NULL; --#else --	struct addrinfo hints; --	memset(&hints, 0, sizeof(hints)); --	hints.ai_family = AF_INET; --	hints.ai_socktype = SOCK_STREAM; --	hints.ai_protocol = IPPROTO_TCP; -- --	struct addrinfo *sock_info; --	if (getaddrinfo(device_str, "65001", &hints, &sock_info) != 0) { --		return NULL; --	} -- --	struct sockaddr_in *sock_addr = (struct sockaddr_in *)sock_info->ai_addr; --	uint32_t device_ip = ntohl(sock_addr->sin_addr.s_addr); --	freeaddrinfo(sock_info); -- --	if (device_ip == 0) { --		return NULL; --	} -- --	return hdhomerun_device_create(HDHOMERUN_DEVICE_ID_WILDCARD, (uint32_t)device_ip, 0, dbg); --#endif --} -- --struct hdhomerun_device_t *hdhomerun_device_create_from_str(const char *device_str, struct hdhomerun_debug_t *dbg) --{ --	struct hdhomerun_device_t *device = hdhomerun_device_create_from_str_device_id(device_str, dbg); --	if (device) { --		return device; --	} -- --	device = hdhomerun_device_create_from_str_ip(device_str, dbg); --	if (device) { --		return device; --	} -- --	device = hdhomerun_device_create_from_str_dns(device_str, dbg); --	if (device) { --		return device; --	} -- --	return NULL; --} -- --int hdhomerun_device_set_tuner_from_str(struct hdhomerun_device_t *hd, const char *tuner_str) --{ --	unsigned int tuner; --	if (sscanf(tuner_str, "%u", &tuner) == 1) { --		hdhomerun_device_set_tuner(hd, tuner); --		return 1; --	} --	if (sscanf(tuner_str, "/tuner%u", &tuner) == 1) { --		hdhomerun_device_set_tuner(hd, tuner); --		return 1; --	} -- --	return -1; --} -- --const char *hdhomerun_device_get_name(struct hdhomerun_device_t *hd) --{ --	return hd->name; --} -- --uint32_t hdhomerun_device_get_device_id(struct hdhomerun_device_t *hd) --{ --	return hdhomerun_control_get_device_id(hd->cs); --} -- --uint32_t hdhomerun_device_get_device_ip(struct hdhomerun_device_t *hd) --{ --	return hdhomerun_control_get_device_ip(hd->cs); --} -- --uint32_t hdhomerun_device_get_device_id_requested(struct hdhomerun_device_t *hd) --{ --	return hdhomerun_control_get_device_id_requested(hd->cs); --} -- --uint32_t hdhomerun_device_get_device_ip_requested(struct hdhomerun_device_t *hd) --{ --	return hdhomerun_control_get_device_ip_requested(hd->cs); --} -- --unsigned int hdhomerun_device_get_tuner(struct hdhomerun_device_t *hd) -+void hdhomerun_device_set_tuner(struct hdhomerun_device_t *hd, unsigned int tuner) - { --	return hd->tuner; -+	hd->tuner = tuner; - } -  - struct hdhomerun_control_sock_t *hdhomerun_device_get_control_sock(struct hdhomerun_device_t *hd) -@@ -264,16 +72,9 @@ -  - struct hdhomerun_video_sock_t *hdhomerun_device_get_video_sock(struct hdhomerun_device_t *hd) - { --	if (hd->vs) { --		return hd->vs; --	} -- --	hd->vs = hdhomerun_video_create(0, VIDEO_DATA_BUFFER_SIZE_1S * 2, hd->dbg); - 	if (!hd->vs) { --		hdhomerun_debug_printf(hd->dbg, "hdhomerun_device_get_video_sock: failed to create video object\n"); --		return NULL; -+		hd->vs = hdhomerun_video_create(0, VIDEO_DATA_BUFFER_SIZE_1S); - 	} -- - 	return hd->vs; - } -  -@@ -295,73 +96,7 @@ - 	return (uint32_t)value; - } -  --static bool_t hdhomerun_device_get_tuner_status_lock_is_bcast(struct hdhomerun_tuner_status_t *status) --{ --	if (strcmp(status->lock_str, "8vsb") == 0) { --		return TRUE; --	} --	if (strncmp(status->lock_str, "t8", 2) == 0) { --		return TRUE; --	} --	if (strncmp(status->lock_str, "t7", 2) == 0) { --		return TRUE; --	} --	if (strncmp(status->lock_str, "t6", 2) == 0) { --		return TRUE; --	} -- --	return FALSE; --} -- --uint32_t hdhomerun_device_get_tuner_status_ss_color(struct hdhomerun_tuner_status_t *status) --{ --	unsigned int ss_yellow_min; --	unsigned int ss_green_min; -- --	if (!status->lock_supported) { --		return HDHOMERUN_STATUS_COLOR_NEUTRAL; --	} -- --	if (hdhomerun_device_get_tuner_status_lock_is_bcast(status)) { --		ss_yellow_min = 50;	/* -30dBmV */ --		ss_green_min = 75;	/* -15dBmV */ --	} else { --		ss_yellow_min = 80;	/* -12dBmV */ --		ss_green_min = 90;	/* -6dBmV */ --	} -- --	if (status->signal_strength >= ss_green_min) { --		return HDHOMERUN_STATUS_COLOR_GREEN; --	} --	if (status->signal_strength >= ss_yellow_min) { --		return HDHOMERUN_STATUS_COLOR_YELLOW; --	} -- --	return HDHOMERUN_STATUS_COLOR_RED; --} -- --uint32_t hdhomerun_device_get_tuner_status_snq_color(struct hdhomerun_tuner_status_t *status) --{ --	if (status->signal_to_noise_quality >= 70) { --		return HDHOMERUN_STATUS_COLOR_GREEN; --	} --	if (status->signal_to_noise_quality >= 50) { --		return HDHOMERUN_STATUS_COLOR_YELLOW; --	} -- --	return HDHOMERUN_STATUS_COLOR_RED; --} -- --uint32_t hdhomerun_device_get_tuner_status_seq_color(struct hdhomerun_tuner_status_t *status) --{ --	if (status->symbol_error_quality >= 100) { --		return HDHOMERUN_STATUS_COLOR_GREEN; --	} -- --	return HDHOMERUN_STATUS_COLOR_RED; --} -- --int hdhomerun_device_get_tuner_status(struct hdhomerun_device_t *hd, char **pstatus_str, struct hdhomerun_tuner_status_t *status) -+int hdhomerun_device_get_tuner_status(struct hdhomerun_device_t *hd, struct hdhomerun_tuner_status_t *status) - { - 	memset(status, 0, sizeof(struct hdhomerun_tuner_status_t)); -  -@@ -374,18 +109,9 @@ - 		return ret; - 	} -  --	if (pstatus_str) { --		*pstatus_str = status_str; --	} -- - 	char *channel = strstr(status_str, "ch="); - 	if (channel) { --		sscanf(channel + 3, "%31s", status->channel); --	} -- --	char *lock = strstr(status_str, "lock="); --	if (lock) { --		sscanf(lock + 5, "%31s", status->lock_str); -+		sscanf(channel + 3, "%s", status->channel); - 	} -  - 	status->signal_strength = (unsigned int)hdhomerun_device_get_status_parse(status_str, "ss="); -@@ -394,16 +120,6 @@ - 	status->raw_bits_per_second = hdhomerun_device_get_status_parse(status_str, "bps="); - 	status->packets_per_second = hdhomerun_device_get_status_parse(status_str, "pps="); -  --	status->signal_present = status->signal_strength >= 45; -- --	if (strcmp(status->lock_str, "none") != 0) { --		if (status->lock_str[0] == '(') { --			status->lock_unsupported = TRUE; --		} else { --			status->lock_supported = TRUE; --		} --	} -- - 	return 1; - } -  -@@ -435,74 +151,26 @@ - 	return hdhomerun_control_get(hd->cs, name, pfilter, NULL); - } -  --int hdhomerun_device_get_tuner_program(struct hdhomerun_device_t *hd, char **pprogram) -+int hdhomerun_device_get_tuner_program(struct hdhomerun_device_t *hd, uint16_t *pprogram_number) - { - 	char name[32]; - 	sprintf(name, "/tuner%u/program", hd->tuner); --	return hdhomerun_control_get(hd->cs, name, pprogram, NULL); --} -- --int hdhomerun_device_get_tuner_target(struct hdhomerun_device_t *hd, char **ptarget) --{ --	char name[32]; --	sprintf(name, "/tuner%u/target", hd->tuner); --	return hdhomerun_control_get(hd->cs, name, ptarget, NULL); --} -- --int hdhomerun_device_get_tuner_plotsample(struct hdhomerun_device_t *hd, struct hdhomerun_plotsample_t **psamples, size_t *pcount) --{ --	char name[32]; --	sprintf(name, "/tuner%u/plotsample", hd->tuner); -  --	char *result; --	int ret = hdhomerun_control_get(hd->cs, name, &result, NULL); -+	char *program_str; -+	int ret = hdhomerun_control_get(hd->cs, name, &program_str, NULL); - 	if (ret <= 0) { - 		return ret; - 	} -  --	struct hdhomerun_plotsample_t *samples = (struct hdhomerun_plotsample_t *)result; --	*psamples = samples; --	size_t count = 0; -- --	while (1) { --		char *ptr = strchr(result, ' '); --		if (!ptr) { --			break; --		} --		*ptr++ = 0; -- --		unsigned long raw; --		if (sscanf(result, "%lx", &raw) != 1) { --			break; --		} -- --		uint16_t real = (raw >> 12) & 0x0FFF; --		if (real & 0x0800) { --			real |= 0xF000; --		} -- --		uint16_t imag = (raw >> 0) & 0x0FFF; --		if (imag & 0x0800) { --			imag |= 0xF000; --		} -- --		samples->real = (int16_t)real; --		samples->imag = (int16_t)imag; --		samples++; --		count++; -- --		result = ptr; --	} -- --	*pcount = count; -+	*pprogram_number = (uint16_t)atol(program_str); - 	return 1; - } -  --int hdhomerun_device_get_tuner_lockkey_owner(struct hdhomerun_device_t *hd, char **powner) -+int hdhomerun_device_get_tuner_target(struct hdhomerun_device_t *hd, char **ptarget) - { - 	char name[32]; --	sprintf(name, "/tuner%u/lockkey", hd->tuner); --	return hdhomerun_control_get(hd->cs, name, powner, NULL); -+	sprintf(name, "/tuner%u/target", hd->tuner); -+	return hdhomerun_control_get(hd->cs, name, ptarget, NULL); - } -  - int hdhomerun_device_get_ir_target(struct hdhomerun_device_t *hd, char **ptarget) -@@ -510,11 +178,6 @@ - 	return hdhomerun_control_get(hd->cs, "/ir/target", ptarget, NULL); - } -  --int hdhomerun_device_get_lineup_location(struct hdhomerun_device_t *hd, char **plocation) --{ --	return hdhomerun_control_get(hd->cs, "/lineup/location", plocation, NULL); --} -- - int hdhomerun_device_get_version(struct hdhomerun_device_t *hd, char **pversion_str, uint32_t *pversion_num) - { - 	char *version_str; -@@ -543,119 +206,44 @@ - { - 	char name[32]; - 	sprintf(name, "/tuner%u/channel", hd->tuner); --	return hdhomerun_control_set_with_lockkey(hd->cs, name, channel, hd->lockkey, NULL, NULL); -+	return hdhomerun_control_set(hd->cs, name, channel, NULL, NULL); - } -  - int hdhomerun_device_set_tuner_channelmap(struct hdhomerun_device_t *hd, const char *channelmap) - { - 	char name[32]; - 	sprintf(name, "/tuner%u/channelmap", hd->tuner); --	return hdhomerun_control_set_with_lockkey(hd->cs, name, channelmap, hd->lockkey, NULL, NULL); -+	return hdhomerun_control_set(hd->cs, name, channelmap, NULL, NULL); - } -  - int hdhomerun_device_set_tuner_filter(struct hdhomerun_device_t *hd, const char *filter) - { - 	char name[32]; - 	sprintf(name, "/tuner%u/filter", hd->tuner); --	return hdhomerun_control_set_with_lockkey(hd->cs, name, filter, hd->lockkey, NULL, NULL); --} -- --static int hdhomerun_device_set_tuner_filter_by_array_append(char **pptr, char *end, uint16_t range_begin, uint16_t range_end) --{ --	char *ptr = *pptr; -- --	size_t available = end - ptr; --	size_t required; -- --	if (range_begin == range_end) { --		required = snprintf(ptr, available, "0x%04x ", range_begin) + 1; --	} else { --		required = snprintf(ptr, available, "0x%04x-0x%04x ", range_begin, range_end) + 1; --	} -- --	if (required > available) { --		return FALSE; --	} -- --	*pptr = strchr(ptr, 0); --	return TRUE; --} -- --int hdhomerun_device_set_tuner_filter_by_array(struct hdhomerun_device_t *hd, unsigned char filter_array[0x2000]) --{ --	char filter[1024]; --	char *ptr = filter; --	char *end = filter + sizeof(filter); -- --	uint16_t range_begin = 0xFFFF; --	uint16_t range_end = 0xFFFF; -- --	uint16_t i; --	for (i = 0; i <= 0x1FFF; i++) { --		if (!filter_array[i]) { --			if (range_begin == 0xFFFF) { --				continue; --			} --			if (!hdhomerun_device_set_tuner_filter_by_array_append(&ptr, end, range_begin, range_end)) { --				return 0; --			} --			range_begin = 0xFFFF; --			range_end = 0xFFFF; --			continue; --		} -- --		if (range_begin == 0xFFFF) { --			range_begin = i; --			range_end = i; --			continue; --		} -- --		range_end = i; --	} -- --	if (range_begin != 0xFFFF) { --		if (!hdhomerun_device_set_tuner_filter_by_array_append(&ptr, end, range_begin, range_end)) { --			return 0; --		} --	} -- --	/* Remove trailing space. */ --	if (ptr > filter) { --		ptr--; --	} --	*ptr = 0; -- --	return hdhomerun_device_set_tuner_filter(hd, filter); -+	return hdhomerun_control_set(hd->cs, name, filter, NULL, NULL); - } -  --int hdhomerun_device_set_tuner_program(struct hdhomerun_device_t *hd, const char *program) -+int hdhomerun_device_set_tuner_program(struct hdhomerun_device_t *hd, uint16_t program_number) - { --	char name[32]; -+	char name[32], value[32]; - 	sprintf(name, "/tuner%u/program", hd->tuner); --	return hdhomerun_control_set_with_lockkey(hd->cs, name, program, hd->lockkey, NULL, NULL); -+	sprintf(value, "%u", program_number); -+	return hdhomerun_control_set(hd->cs, name, value, NULL, NULL); - } -  --int hdhomerun_device_set_tuner_target(struct hdhomerun_device_t *hd, const char *target) -+int hdhomerun_device_set_tuner_target(struct hdhomerun_device_t *hd, char *target) - { - 	char name[32]; - 	sprintf(name, "/tuner%u/target", hd->tuner); --	return hdhomerun_control_set_with_lockkey(hd->cs, name, target, hd->lockkey, NULL, NULL); -+	return hdhomerun_control_set(hd->cs, name, target, NULL, NULL); - } -  --int hdhomerun_device_set_tuner_target_to_local_protocol(struct hdhomerun_device_t *hd, const char *protocol) -+static int hdhomerun_device_set_tuner_target_to_local(struct hdhomerun_device_t *hd) - { --	/* Create video socket. */ --	hdhomerun_device_get_video_sock(hd); --	if (!hd->vs) { --		return -1; --	} -- --	/* Set target. */ - 	char target[64]; - 	uint32_t local_ip = hdhomerun_control_get_local_addr(hd->cs); - 	uint16_t local_port = hdhomerun_video_get_local_port(hd->vs); --	sprintf(target, "%s://%u.%u.%u.%u:%u", --		protocol, -+	sprintf(target, "%u.%u.%u.%u:%u", - 		(unsigned int)(local_ip >> 24) & 0xFF, (unsigned int)(local_ip >> 16) & 0xFF, - 		(unsigned int)(local_ip >> 8) & 0xFF, (unsigned int)(local_ip >> 0) & 0xFF, - 		(unsigned int)local_port -@@ -664,21 +252,11 @@ - 	return hdhomerun_device_set_tuner_target(hd, target); - } -  --int hdhomerun_device_set_tuner_target_to_local(struct hdhomerun_device_t *hd) --{ --	return hdhomerun_device_set_tuner_target_to_local_protocol(hd, HDHOMERUN_TARGET_PROTOCOL_UDP);  --} -- - int hdhomerun_device_set_ir_target(struct hdhomerun_device_t *hd, const char *target) - { - 	return hdhomerun_control_set(hd->cs, "/ir/target", target, NULL, NULL); - } -  --int hdhomerun_device_set_lineup_location(struct hdhomerun_device_t *hd, const char *location) --{ --	return hdhomerun_control_set(hd->cs, "/lineup/location", location, NULL, NULL); --} -- - int hdhomerun_device_get_var(struct hdhomerun_device_t *hd, const char *name, char **pvalue, char **perror) - { - 	return hdhomerun_control_get(hd->cs, name, pvalue, perror); -@@ -686,183 +264,41 @@ -  - int hdhomerun_device_set_var(struct hdhomerun_device_t *hd, const char *name, const char *value, char **pvalue, char **perror) - { --	return hdhomerun_control_set_with_lockkey(hd->cs, name, value, hd->lockkey, pvalue, perror); --} -- --int hdhomerun_device_tuner_lockkey_request(struct hdhomerun_device_t *hd, char **perror) --{ --	uint32_t new_lockkey = (uint32_t)getcurrenttime(); -- --	char name[32]; --	sprintf(name, "/tuner%u/lockkey", hd->tuner); -- --	char new_lockkey_str[64]; --	sprintf(new_lockkey_str, "%u", (unsigned int)new_lockkey); -- --	int ret = hdhomerun_control_set_with_lockkey(hd->cs, name, new_lockkey_str, hd->lockkey, NULL, perror); --	if (ret <= 0) { --		hd->lockkey = 0; --		return ret; --	} -- --	hd->lockkey = new_lockkey; --	return ret; --} -- --int hdhomerun_device_tuner_lockkey_release(struct hdhomerun_device_t *hd) --{ --	if (hd->lockkey == 0) { --		return 1; --	} -- --	char name[32]; --	sprintf(name, "/tuner%u/lockkey", hd->tuner); --	int ret = hdhomerun_control_set_with_lockkey(hd->cs, name, "none", hd->lockkey, NULL, NULL); -- --	hd->lockkey = 0; --	return ret; --} -- --int hdhomerun_device_tuner_lockkey_force(struct hdhomerun_device_t *hd) --{ --	char name[32]; --	sprintf(name, "/tuner%u/lockkey", hd->tuner); --	int ret = hdhomerun_control_set(hd->cs, name, "force", NULL, NULL); -- --	hd->lockkey = 0; --	return ret; --} -- --void hdhomerun_device_tuner_lockkey_use_value(struct hdhomerun_device_t *hd, uint32_t lockkey) --{ --	hd->lockkey = lockkey; -+	return hdhomerun_control_set(hd->cs, name, value, pvalue, perror); - } -  --int hdhomerun_device_wait_for_lock(struct hdhomerun_device_t *hd, struct hdhomerun_tuner_status_t *status) -+int hdhomerun_device_stream_start(struct hdhomerun_device_t *hd) - { --	/* Delay for SS reading to be valid (signal present). */ --	msleep(250); -- --	/* Wait for up to 2.5 seconds for lock. */ --	uint64_t timeout = getcurrenttime() + 2500; --	while (1) { --		/* Get status to check for lock. Quality numbers will not be valid yet. */ --		int ret = hdhomerun_device_get_tuner_status(hd, NULL, status); --		if (ret <= 0) { --			return ret; --		} -- --		if (!status->signal_present) { --			return 1; --		} --		if (status->lock_supported || status->lock_unsupported) { --			return 1; --		} -- --		if (getcurrenttime() >= timeout) { --			return 1; --		} -- --		msleep(250); -+	/* Create video socket. */ -+	hdhomerun_device_get_video_sock(hd); -+	if (!hd->vs) { -+		return -1; - 	} --} -  --int hdhomerun_device_stream_start(struct hdhomerun_device_t *hd) --{ - 	/* Set target. */ --	int ret = hdhomerun_device_stream_refresh_target(hd); -+	int ret = hdhomerun_device_set_tuner_target_to_local(hd); - 	if (ret <= 0) { - 		return ret; - 	} -  - 	/* Flush video buffer. */ --	msleep(64); -+	usleep(64000); - 	hdhomerun_video_flush(hd->vs); -  - 	/* Success. */ - 	return 1; - } -  --int hdhomerun_device_stream_refresh_target(struct hdhomerun_device_t *hd) --{ --	int ret = hdhomerun_device_set_tuner_target_to_local_protocol(hd, HDHOMERUN_TARGET_PROTOCOL_RTP); --	if (ret == 0) { --		ret = hdhomerun_device_set_tuner_target_to_local_protocol(hd, HDHOMERUN_TARGET_PROTOCOL_UDP); --	} --	return ret; --} -- - uint8_t *hdhomerun_device_stream_recv(struct hdhomerun_device_t *hd, size_t max_size, size_t *pactual_size) - { --	if (!hd->vs) { --		return NULL; --	} - 	return hdhomerun_video_recv(hd->vs, max_size, pactual_size); - } -  --void hdhomerun_device_stream_flush(struct hdhomerun_device_t *hd) --{ --	hdhomerun_video_flush(hd->vs); --} -- - void hdhomerun_device_stream_stop(struct hdhomerun_device_t *hd) - { - 	hdhomerun_device_set_tuner_target(hd, "none"); - } -  --int hdhomerun_device_channelscan_init(struct hdhomerun_device_t *hd, const char *channelmap) --{ --	if (hd->scan) { --		channelscan_destroy(hd->scan); --	} -- --	hd->scan = channelscan_create(hd, channelmap); --	if (!hd->scan) { --		return -1; --	} -- --	return 1; --} -- --int hdhomerun_device_channelscan_advance(struct hdhomerun_device_t *hd, struct hdhomerun_channelscan_result_t *result) --{ --	if (!hd->scan) { --		return 0; --	} -- --	int ret = channelscan_advance(hd->scan, result); --	if (ret <= 0) { --		channelscan_destroy(hd->scan); --		hd->scan = NULL; --	} -- --	return ret; --} -- --int hdhomerun_device_channelscan_detect(struct hdhomerun_device_t *hd, struct hdhomerun_channelscan_result_t *result) --{ --	if (!hd->scan) { --		return 0; --	} -- --	int ret = channelscan_detect(hd->scan, result); --	if (ret <= 0) { --		channelscan_destroy(hd->scan); --		hd->scan = NULL; --	} -- --	return ret; --} -- --uint8_t hdhomerun_device_channelscan_get_progress(struct hdhomerun_device_t *hd) --{ --	if (!hd->scan) { --		return 0; --	} -- --	return channelscan_get_progress(hd->scan); --} -- - int hdhomerun_device_firmware_version_check(struct hdhomerun_device_t *hd, uint32_t features) - { - 	uint32_t version; -@@ -870,74 +306,16 @@ - 		return -1; - 	} -  --	if (version < 20070219) { --		return 0; -+	if (version >= 20061213) { -+		return 1; - 	} -  --	return 1; --} -- --const char *hdhomerun_device_get_model_str(struct hdhomerun_device_t *hd) --{ --	if (*hd->model) { --		return hd->model; --	} -- --	char *model_str; --	int ret = hdhomerun_control_get(hd->cs, "/sys/model", &model_str, NULL); --	if (ret < 0) { --		return NULL; --	} --	if (ret == 0) { --		model_str = "hdhomerun_atsc"; --	} -- --	strncpy(hd->model, model_str, sizeof(hd->model) - 1); --	hd->model[sizeof(hd->model) - 1] = 0; -- --	return hd->model; -+	return 0; - } -  - int hdhomerun_device_upgrade(struct hdhomerun_device_t *hd, FILE *upgrade_file) - { --	hdhomerun_control_set(hd->cs, "/tuner0/lockkey", "force", NULL, NULL); - 	hdhomerun_control_set(hd->cs, "/tuner0/channel", "none", NULL, NULL); -- --	hdhomerun_control_set(hd->cs, "/tuner1/lockkey", "force", NULL, NULL); - 	hdhomerun_control_set(hd->cs, "/tuner1/channel", "none", NULL, NULL); -- - 	return hdhomerun_control_upgrade(hd->cs, upgrade_file); - } -- --void hdhomerun_device_debug_print_video_stats(struct hdhomerun_device_t *hd) --{ --	if (!hdhomerun_debug_enabled(hd->dbg)) { --		return; --	} -- --	char name[32]; --	sprintf(name, "/tuner%u/debug", hd->tuner); -- --	char *debug_str; --	char *error_str; --	int ret = hdhomerun_control_get(hd->cs, name, &debug_str, &error_str); --	if (ret < 0) { --		hdhomerun_debug_printf(hd->dbg, "video dev: communication error getting debug stats\n"); --		return; --	} -- --	if (error_str) { --		hdhomerun_debug_printf(hd->dbg, "video dev: %s\n", error_str); --	} else { --		hdhomerun_debug_printf(hd->dbg, "video dev: %s\n", debug_str); --	} -- --	if (hd->vs) { --		hdhomerun_video_debug_print_stats(hd->vs); --	} --} -- --void hdhomerun_device_get_video_stats(struct hdhomerun_device_t *hd, struct hdhomerun_video_stats_t *stats) --{ --	hdhomerun_video_get_stats(hd->vs, stats); --} -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_device.h src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_device.h ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_device.h	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_device.h	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_device.h -  * -- * Copyright © 2006-2008 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,20 +14,8 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ -  - #ifdef __cplusplus -@@ -38,8 +26,16 @@ - #define HDHOMERUN_DEVICE_MAX_LOCK_TO_DATA_TIME 2000 - #define HDHOMERUN_DEVICE_MAX_TUNE_TO_DATA_TIME (HDHOMERUN_DEVICE_MAX_TUNE_TO_LOCK_TIME + HDHOMERUN_DEVICE_MAX_LOCK_TO_DATA_TIME) -  --#define HDHOMERUN_TARGET_PROTOCOL_UDP "udp" --#define HDHOMERUN_TARGET_PROTOCOL_RTP "rtp" -+struct hdhomerun_device_t; -+ -+struct hdhomerun_tuner_status_t { -+	char channel[32]; -+	unsigned int signal_strength; -+	unsigned int signal_to_noise_quality; -+	unsigned int symbol_error_quality; -+	uint32_t raw_bits_per_second; -+	uint32_t packets_per_second; -+}; -  - /* -  * Create a device object. -@@ -49,49 +45,22 @@ -  * -  * For example, a threaded application that streams video from 4 tuners (2 HDHomeRun devices) and has -  * GUI feedback to the user of the selected tuner might use 5 device objects: 4 for streaming video -- * (one per thread) and one for the GUI display that can switch between tuners. -+ * (one per thread) and one for the GUI display that can just between tuners. -  * -- * This function will not attempt to connect to the device. The connection will be established when first used. -+ * This function will not attempt to connect to the device. -+ * The connection will be established when first used. -  * -  * uint32_t device_id = 32-bit device id of device. Set to HDHOMERUN_DEVICE_ID_WILDCARD to match any device ID. -  * uint32_t device_ip = IP address of device. Set to 0 to auto-detect. -  * unsigned int tuner = tuner index (0 or 1). Can be changed later by calling hdhomerun_device_set_tuner. -- * struct hdhomerun_debug_t *dbg: Pointer to debug logging object. May be NULL. -  * -  * Returns a pointer to the newly created device object. -  * -  * When no longer needed, the socket should be destroyed by calling hdhomerun_device_destroy. -- * -- * The hdhomerun_device_create_from_str function creates a device object from the given device_str. -- * The device_str parameter can be any of the following forms: -- *     <device id> -- *     <device id>-<tuner index> -- *     <ip address> -- * If the tuner index is not included in the device_str then it is set to zero. Use hdhomerun_device_set_tuner -- * or hdhomerun_device_set_tuner_from_str to set the tuner. -- * -- * The hdhomerun_device_set_tuner_from_str function sets the tuner from the given tuner_str. -- * The tuner_str parameter can be any of the following forms: -- *     <tuner index> -- *     /tuner<tuner index> -  */ --extern LIBTYPE struct hdhomerun_device_t *hdhomerun_device_create(uint32_t device_id, uint32_t device_ip, unsigned int tuner, struct hdhomerun_debug_t *dbg); --extern LIBTYPE struct hdhomerun_device_t *hdhomerun_device_create_from_str(const char *device_str, struct hdhomerun_debug_t *dbg); --extern LIBTYPE void hdhomerun_device_destroy(struct hdhomerun_device_t *hd); -- --/* -- * Get the device id, ip, or tuner of the device instance. -- */ --extern LIBTYPE const char *hdhomerun_device_get_name(struct hdhomerun_device_t *hd); --extern LIBTYPE uint32_t hdhomerun_device_get_device_id(struct hdhomerun_device_t *hd); --extern LIBTYPE uint32_t hdhomerun_device_get_device_ip(struct hdhomerun_device_t *hd); --extern LIBTYPE uint32_t hdhomerun_device_get_device_id_requested(struct hdhomerun_device_t *hd); --extern LIBTYPE uint32_t hdhomerun_device_get_device_ip_requested(struct hdhomerun_device_t *hd); --extern LIBTYPE unsigned int hdhomerun_device_get_tuner(struct hdhomerun_device_t *hd); -- --extern LIBTYPE void hdhomerun_device_set_device(struct hdhomerun_device_t *hd, uint32_t device_id, uint32_t device_ip); --extern LIBTYPE void hdhomerun_device_set_tuner(struct hdhomerun_device_t *hd, unsigned int tuner); --extern LIBTYPE int hdhomerun_device_set_tuner_from_str(struct hdhomerun_device_t *hd, const char *tuner_str); -+extern struct hdhomerun_device_t *hdhomerun_device_create(uint32_t device_id, uint32_t device_ip, unsigned int tuner); -+extern void hdhomerun_device_destroy(struct hdhomerun_device_t *hd); -+extern void hdhomerun_device_set_tuner(struct hdhomerun_device_t *hd, unsigned int tuner); -  - /* -  * Get the local machine IP address used when communicating with the device. -@@ -100,7 +69,7 @@ -  * -  * Returns 32-bit IP address with native endianness, or 0 on error. -  */ --extern LIBTYPE uint32_t hdhomerun_device_get_local_machine_addr(struct hdhomerun_device_t *hd); -+extern uint32_t hdhomerun_device_get_local_machine_addr(struct hdhomerun_device_t *hd); -  - /* -  * Get operations. -@@ -113,24 +82,15 @@ -  * Returns 0 if the operation was rejected. -  * Returns -1 if a communication error occurred. -  */ --extern LIBTYPE int hdhomerun_device_get_tuner_status(struct hdhomerun_device_t *hd, char **pstatus_str, struct hdhomerun_tuner_status_t *status); --extern LIBTYPE int hdhomerun_device_get_tuner_streaminfo(struct hdhomerun_device_t *hd, char **pstreaminfo); --extern LIBTYPE int hdhomerun_device_get_tuner_channel(struct hdhomerun_device_t *hd, char **pchannel); --extern LIBTYPE int hdhomerun_device_get_tuner_channelmap(struct hdhomerun_device_t *hd, char **pchannelmap); --extern LIBTYPE int hdhomerun_device_get_tuner_filter(struct hdhomerun_device_t *hd, char **pfilter); --extern LIBTYPE int hdhomerun_device_get_tuner_program(struct hdhomerun_device_t *hd, char **pprogram); --extern LIBTYPE int hdhomerun_device_get_tuner_target(struct hdhomerun_device_t *hd, char **ptarget); --extern LIBTYPE int hdhomerun_device_get_tuner_plotsample(struct hdhomerun_device_t *hd, struct hdhomerun_plotsample_t **psamples, size_t *pcount); --extern LIBTYPE int hdhomerun_device_get_tuner_lockkey_owner(struct hdhomerun_device_t *hd, char **powner); --extern LIBTYPE int hdhomerun_device_get_ir_target(struct hdhomerun_device_t *hd, char **ptarget); --extern LIBTYPE int hdhomerun_device_get_lineup_location(struct hdhomerun_device_t *hd, char **plocation); --extern LIBTYPE int hdhomerun_device_get_version(struct hdhomerun_device_t *hd, char **pversion_str, uint32_t *pversion_num); -- --extern LIBTYPE uint32_t hdhomerun_device_get_tuner_status_ss_color(struct hdhomerun_tuner_status_t *status); --extern LIBTYPE uint32_t hdhomerun_device_get_tuner_status_snq_color(struct hdhomerun_tuner_status_t *status); --extern LIBTYPE uint32_t hdhomerun_device_get_tuner_status_seq_color(struct hdhomerun_tuner_status_t *status); -- --extern LIBTYPE const char *hdhomerun_device_get_model_str(struct hdhomerun_device_t *hd); -+extern int hdhomerun_device_get_tuner_status(struct hdhomerun_device_t *hd, struct hdhomerun_tuner_status_t *status); -+extern int hdhomerun_device_get_tuner_streaminfo(struct hdhomerun_device_t *hd, char **pstreaminfo); -+extern int hdhomerun_device_get_tuner_channel(struct hdhomerun_device_t *hd, char **pchannel); -+extern int hdhomerun_device_get_tuner_channelmap(struct hdhomerun_device_t *hd, char **pchannelmap); -+extern int hdhomerun_device_get_tuner_filter(struct hdhomerun_device_t *hd, char **pfilter); -+extern int hdhomerun_device_get_tuner_program(struct hdhomerun_device_t *hd, uint16_t *pprogram_number); -+extern int hdhomerun_device_get_tuner_target(struct hdhomerun_device_t *hd, char **ptarget); -+extern int hdhomerun_device_get_ir_target(struct hdhomerun_device_t *hd, char **ptarget); -+extern int hdhomerun_device_get_version(struct hdhomerun_device_t *hd, char **pversion_str, uint32_t *pversion_num); -  - /* -  * Set operations. -@@ -141,16 +101,12 @@ -  * Returns 0 if the operation was rejected. -  * Returns -1 if a communication error occurred. -  */ --extern LIBTYPE int hdhomerun_device_set_tuner_channel(struct hdhomerun_device_t *hd, const char *channel); --extern LIBTYPE int hdhomerun_device_set_tuner_channelmap(struct hdhomerun_device_t *hd, const char *channelmap); --extern LIBTYPE int hdhomerun_device_set_tuner_filter(struct hdhomerun_device_t *hd, const char *filter); --extern LIBTYPE int hdhomerun_device_set_tuner_filter_by_array(struct hdhomerun_device_t *hd, unsigned char filter_array[0x2000]); --extern LIBTYPE int hdhomerun_device_set_tuner_program(struct hdhomerun_device_t *hd, const char *program); --extern LIBTYPE int hdhomerun_device_set_tuner_target(struct hdhomerun_device_t *hd, const char *target); --extern LIBTYPE int hdhomerun_device_set_tuner_target_to_local_protocol(struct hdhomerun_device_t *hd, const char *protocol); --extern LIBTYPE int hdhomerun_device_set_tuner_target_to_local(struct hdhomerun_device_t *hd); --extern LIBTYPE int hdhomerun_device_set_ir_target(struct hdhomerun_device_t *hd, const char *target); --extern LIBTYPE int hdhomerun_device_set_lineup_location(struct hdhomerun_device_t *hd, const char *location); -+extern int hdhomerun_device_set_tuner_channel(struct hdhomerun_device_t *hd, const char *channel); -+extern int hdhomerun_device_set_tuner_channelmap(struct hdhomerun_device_t *hd, const char *channelmap); -+extern int hdhomerun_device_set_tuner_filter(struct hdhomerun_device_t *hd, const char *filter); -+extern int hdhomerun_device_set_tuner_program(struct hdhomerun_device_t *hd, uint16_t program_number); -+extern int hdhomerun_device_set_tuner_target(struct hdhomerun_device_t *hd, char *target); -+extern int hdhomerun_device_set_ir_target(struct hdhomerun_device_t *hd, const char *target); -  - /* -  * Get/set a named control variable on the device. -@@ -169,42 +125,8 @@ -  * Returns 0 if the operation was rejected (pvalue NULL, perror set). -  * Returns -1 if a communication error occurs. -  */ --extern LIBTYPE int hdhomerun_device_get_var(struct hdhomerun_device_t *hd, const char *name, char **pvalue, char **perror); --extern LIBTYPE int hdhomerun_device_set_var(struct hdhomerun_device_t *hd, const char *name, const char *value, char **pvalue, char **perror); -- --/* -- * Tuner locking. -- * -- * The hdhomerun_device_tuner_lockkey_request function is used to obtain a lock -- * or to verify that the hdhomerun_device object still holds the lock. -- * Returns 1 if the lock request was successful and the lock was obtained. -- * Returns 0 if the lock request was rejected. -- * Returns -1 if a communication error occurs. -- * -- * The hdhomerun_device_tuner_lockkey_release function is used to release a -- * previously held lock. If locking is used then this function must be called -- * before destroying the hdhomerun_device object. -- */ --extern LIBTYPE int hdhomerun_device_tuner_lockkey_request(struct hdhomerun_device_t *hd, char **perror); --extern LIBTYPE int hdhomerun_device_tuner_lockkey_release(struct hdhomerun_device_t *hd); --extern LIBTYPE int hdhomerun_device_tuner_lockkey_force(struct hdhomerun_device_t *hd); -- --/* -- * Intended only for non persistent connections; eg, hdhomerun_config. -- */ --extern LIBTYPE void hdhomerun_device_tuner_lockkey_use_value(struct hdhomerun_device_t *hd, uint32_t lockkey); -- --/* -- * Wait for tuner lock after channel change. -- * -- * The hdhomerun_device_wait_for_lock function is used to detect/wait for a lock vs no lock indication -- * after a channel change. -- * -- * It will return quickly if a lock is aquired. -- * It will return quickly if there is no signal detected. -- * Worst case it will time out after 1.5 seconds - the case where there is signal but no lock. -- */ --extern LIBTYPE int hdhomerun_device_wait_for_lock(struct hdhomerun_device_t *hd, struct hdhomerun_tuner_status_t *status); -+extern int hdhomerun_device_get_var(struct hdhomerun_device_t *hd, const char *name, char **pvalue, char **perror); -+extern int hdhomerun_device_set_var(struct hdhomerun_device_t *hd, const char *name, const char *value, char **pvalue, char **perror); -  - /* -  * Stream a filtered program or the unfiltered stream. -@@ -222,19 +144,9 @@ -  * -  * The hdhomerun_device_stream_stop function tells the device to stop streaming data. -  */ --extern LIBTYPE int hdhomerun_device_stream_start(struct hdhomerun_device_t *hd); --extern LIBTYPE int hdhomerun_device_stream_refresh_target(struct hdhomerun_device_t *hd); --extern LIBTYPE uint8_t *hdhomerun_device_stream_recv(struct hdhomerun_device_t *hd, size_t max_size, size_t *pactual_size); --extern LIBTYPE void hdhomerun_device_stream_flush(struct hdhomerun_device_t *hd); --extern LIBTYPE void hdhomerun_device_stream_stop(struct hdhomerun_device_t *hd); -- --/* -- * Channel scan API. -- */ --extern LIBTYPE int hdhomerun_device_channelscan_init(struct hdhomerun_device_t *hd, const char *channelmap); --extern LIBTYPE int hdhomerun_device_channelscan_advance(struct hdhomerun_device_t *hd, struct hdhomerun_channelscan_result_t *result); --extern LIBTYPE int hdhomerun_device_channelscan_detect(struct hdhomerun_device_t *hd, struct hdhomerun_channelscan_result_t *result); --extern LIBTYPE uint8_t hdhomerun_device_channelscan_get_progress(struct hdhomerun_device_t *hd); -+extern int hdhomerun_device_stream_start(struct hdhomerun_device_t *hd); -+extern uint8_t *hdhomerun_device_stream_recv(struct hdhomerun_device_t *hd, size_t max_size, size_t *pactual_size); -+extern void hdhomerun_device_stream_stop(struct hdhomerun_device_t *hd); -  - /* -  * Check that the device is running the recommended firmware. -@@ -245,7 +157,7 @@ -  * Returns 0 if th firmware does not meet the minimum requriements for all operations. -  * Returns -1 if an error occurs. -  */ --extern LIBTYPE int hdhomerun_device_firmware_version_check(struct hdhomerun_device_t *hd, uint32_t features); -+extern int hdhomerun_device_firmware_version_check(struct hdhomerun_device_t *hd, uint32_t features); -  - /* -  * Upload new firmware to the device. -@@ -256,19 +168,13 @@ -  * Returns 0 if the upload was rejected. -  * Returns -1 if an error occurs. -  */ --extern LIBTYPE int hdhomerun_device_upgrade(struct hdhomerun_device_t *hd, FILE *upgrade_file); -+extern int hdhomerun_device_upgrade(struct hdhomerun_device_t *hd, FILE *upgrade_file); -  - /* -  * Low level accessor functions.  -  */ --extern LIBTYPE struct hdhomerun_control_sock_t *hdhomerun_device_get_control_sock(struct hdhomerun_device_t *hd); --extern LIBTYPE struct hdhomerun_video_sock_t *hdhomerun_device_get_video_sock(struct hdhomerun_device_t *hd); -- --/* -- * Debug print internal stats. -- */ --extern LIBTYPE void hdhomerun_device_debug_print_video_stats(struct hdhomerun_device_t *hd); --extern LIBTYPE void hdhomerun_device_get_video_stats(struct hdhomerun_device_t *hd, struct hdhomerun_video_stats_t *stats); -+extern struct hdhomerun_control_sock_t *hdhomerun_device_get_control_sock(struct hdhomerun_device_t *hd); -+extern struct hdhomerun_video_sock_t *hdhomerun_device_get_video_sock(struct hdhomerun_device_t *hd); -  - #ifdef __cplusplus - } -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_device_selector.c -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_device_selector.h -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_dhcp.c -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_dhcp.h -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_discover.c src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_discover.c ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_discover.c	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_discover.c	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_discover.c -  * -- * Copyright © 2006-2007 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,93 +14,206 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ -  --#include "hdhomerun.h" -+#include "hdhomerun_os.h" -+#include "hdhomerun_pkt.h" -+#include "hdhomerun_discover.h" -  - #if defined(__CYGWIN__) || defined(__WINDOWS__) - #include <windows.h> -+#include <iptypes.h> - #include <iphlpapi.h> --#define USE_IPHLPAPI 1 --#else --#include <net/if.h> --#include <sys/ioctl.h> --#ifndef _SIZEOF_ADDR_IFREQ --#define _SIZEOF_ADDR_IFREQ(x) sizeof(x) --#endif - #endif -  --#define HDHOMERUN_DISOCVER_MAX_SOCK_COUNT 16 -+// for OSX -+#include <unistd.h>    // execl, pipe, sysconf -+#include <sys/types.h> // waitpid -+#include <sys/wait.h>  // waitpid -  - struct hdhomerun_discover_sock_t { - 	int sock; --	uint32_t local_ip; --	uint32_t subnet_mask; - }; -  --struct hdhomerun_discover_t { --	struct hdhomerun_discover_sock_t socks[HDHOMERUN_DISOCVER_MAX_SOCK_COUNT]; --	unsigned int sock_count; --	struct hdhomerun_pkt_t tx_pkt; --	struct hdhomerun_pkt_t rx_pkt; --}; -- --static bool_t hdhomerun_discover_sock_create(struct hdhomerun_discover_t *ds, uint32_t local_ip, uint32_t subnet_mask) -+static struct hdhomerun_discover_sock_t *hdhomerun_discover_create(void) - { --	if (ds->sock_count >= HDHOMERUN_DISOCVER_MAX_SOCK_COUNT) { --		return FALSE; -+	struct hdhomerun_discover_sock_t *ds = (struct hdhomerun_discover_sock_t *)malloc(sizeof(struct hdhomerun_discover_sock_t)); -+	if (!ds) { -+		return NULL; - 	} -- -+	 - 	/* Create socket. */ --	int sock = (int)socket(AF_INET, SOCK_DGRAM, 0); --	if (sock == -1) { --		return FALSE; -+	ds->sock = (int)socket(AF_INET, SOCK_DGRAM, 0); -+	if (ds->sock == -1) { -+		free(ds); -+		return NULL; - 	} -  - 	/* Set timeouts. */ --	setsocktimeout(sock, SOL_SOCKET, SO_SNDTIMEO, 1000); --	setsocktimeout(sock, SOL_SOCKET, SO_RCVTIMEO, 1000); -+	setsocktimeout(ds->sock, SOL_SOCKET, SO_SNDTIMEO, 1000); -+	setsocktimeout(ds->sock, SOL_SOCKET, SO_RCVTIMEO, 1000); -  - 	/* Allow broadcast. */ - 	int sock_opt = 1; --	setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&sock_opt, sizeof(sock_opt)); -+	setsockopt(ds->sock, SOL_SOCKET, SO_BROADCAST, (char *)&sock_opt, sizeof(sock_opt)); -  - 	/* Bind socket. */ - 	struct sockaddr_in sock_addr; - 	memset(&sock_addr, 0, sizeof(sock_addr)); - 	sock_addr.sin_family = AF_INET; --	sock_addr.sin_addr.s_addr = htonl(local_ip); -+	sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); - 	sock_addr.sin_port = htons(0); --	if (bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != 0) { --		close(sock); --		return FALSE; -+	if (bind(ds->sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != 0) { -+		close(ds->sock); -+		free(ds); -+		return NULL; - 	} -  --	/* Write sock entry. */ --	struct hdhomerun_discover_sock_t *dss = &ds->socks[ds->sock_count++]; --	dss->sock = sock; --	dss->local_ip = local_ip; --	dss->subnet_mask = subnet_mask; -+	/* Success. */ -+	return ds; -+} -  --	return TRUE; -+static void hdhomerun_discover_destroy(struct hdhomerun_discover_sock_t *ds) -+{ -+	close(ds->sock); -+	free(ds); - } -  --#if defined(USE_IPHLPAPI) --static void hdhomerun_discover_sock_detect(struct hdhomerun_discover_t *ds) -+static int hdhomerun_discover_send_packet(struct hdhomerun_discover_sock_t *ds, uint32_t ip_addr, uint32_t device_type, uint32_t device_id) -+{ -+	uint8_t buffer[1024]; -+	uint8_t *ptr = buffer; -+	hdhomerun_write_discover_request(&ptr, device_type, device_id); -+ -+	struct sockaddr_in sock_addr; -+	memset(&sock_addr, 0, sizeof(sock_addr)); -+	sock_addr.sin_family = AF_INET; -+	sock_addr.sin_addr.s_addr = htonl(ip_addr); -+	sock_addr.sin_port = htons(HDHOMERUN_DISCOVER_UDP_PORT); -+ -+	int length = (int)(ptr - buffer); -+	if (sendto(ds->sock, (char *)buffer, (int)length, 0, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != length) { -+		return -1; -+	} -+ -+	return 0; -+} -+ -+#if defined(__APPLE__) -+static int hdhomerun_discover_send_internal(struct hdhomerun_discover_sock_t *ds, unsigned long device_type, unsigned long device_id) -+{ -+    /* printf("Looking for 0x%lx with id 0x%lx\n", device_type, device_id); */ -+    int fds[2]; -+    if (pipe(fds) < 0) -+    { -+        printf("Pipe Failed\n"); -+        return -1; -+    } -+ -+    pid_t child = fork(); -+    if (child < 0) -+    { -+        printf("Fork Failed\n"); -+        return -1; -+    } -+    else if (child == 0) -+    { -+        /* Child */ -+        int i = 0; -+ -+        /* Attach stdout to pipe */ -+        close(1); -+        dup2(fds[1], 1); -+ -+        /* Close all open file descriptors except stdout/stderr */ -+        for (i = sysconf(_SC_OPEN_MAX) - 1; i > 2; i--) -+            close(i); -+ -+        /* Run command */ -+        execl("/bin/sh", "sh", "-c", "ifconfig", NULL); -+ -+        /* Failed to exec */ -+        _exit(1); /* this exit is ok */ -+    } -+    else -+    { -+        /* Parent */ -+        int send_count = 0; -+        int status; -+        FILE *fp; -+        char line[1024]; -+        char adaptor[1024]; -+ -+        close(fds[1]); -+ -+        if (waitpid(child, &status, 0) < 0) -+            return -1; -+ -+        if (WEXITSTATUS(status)) -+            return -1; -+ -+        fp = fdopen(fds[0], "r"); -+        while (1) -+        { -+            char *ptr = NULL; -+            int netmask, broadcast; -+            int a,b,c,d; -+ -+            if (!fgets(line, sizeof(line) - 1, fp)) -+            { -+                break; -+            } -+ -+            line[1023] = 0; -+ -+            /* find ": flags" */ -+            ptr = strnstr(line, ": flags", 1024 - 1); -+            if (ptr >= line) -+            { -+                /* grab adaptor before that */ -+                strncpy(adaptor, line, ptr-line); -+                adaptor[ptr-line] = 0; -+            } -+ -+            /* find "netmask " */ -+            ptr = strnstr(line, "netmask ", 1024 - 1); -+            if (ptr <= line) -+                continue; -+            ptr += strlen("netmask "); -+            sscanf(ptr, "%x", &netmask); -+ -+            /* find "broadcast " */ -+            ptr = strnstr(ptr, "broadcast ", 1024 - 1); -+            if (ptr <= line) -+                continue; -+            ptr += strlen("broadcast "); -+            sscanf(ptr, "%i.%i.%i.%i", &a, &b, &c, &d); -+            broadcast = a<<24 | b<<16 | c<<8 | d; -+            /* -+            printf("Adaptor: '%s' 0x%08x %i.%i.%i.%i\n", -+                   adaptor, broadcast, a,b,c,d); -+            */ -+ -+            /* send discover packet this adaptor */ -+            if (hdhomerun_discover_send_packet( -+                    ds, broadcast, device_type, device_id) >= 0) -+            { -+                send_count++; -+            } -+        } -+ -+        fclose(fp); /* this closes fds[0] as well */ -+ -+        /* printf("send_count: %i\n\n", send_count); */ -+        return (send_count == 0) ? -1 : 0; -+    } -+} -+ -+#elif defined(__CYGWIN__) || defined(__WINDOWS__) -+ -+static int hdhomerun_discover_send_internal(struct hdhomerun_discover_sock_t *ds, uint32_t device_type, uint32_t device_id) - { - 	PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO)); - 	ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); -@@ -109,29 +222,37 @@ - 	if (Ret != NO_ERROR) { - 		free(pAdapterInfo); - 		if (Ret != ERROR_BUFFER_OVERFLOW) { --			return; -+			return -1; - 		} - 		pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);  - 		Ret = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen); - 		if (Ret != NO_ERROR) { - 			free(pAdapterInfo); --			return; -+			return -1; - 		} - 	} -  -+	unsigned int send_count = 0; - 	PIP_ADAPTER_INFO pAdapter = pAdapterInfo; - 	while (pAdapter) { - 		IP_ADDR_STRING *pIPAddr = &pAdapter->IpAddressList; - 		while (pIPAddr) { --			uint32_t local_ip = ntohl(inet_addr(pIPAddr->IpAddress.String)); -+			uint32_t addr = ntohl(inet_addr(pIPAddr->IpAddress.String)); - 			uint32_t mask = ntohl(inet_addr(pIPAddr->IpMask.String)); -+			 -+			uint32_t broadcast = addr | ~mask; -+			if ((broadcast == 0x00000000) || (broadcast == 0xFFFFFFFF)) { -+				pIPAddr = pIPAddr->Next; -+				continue; -+			} -  --			if (local_ip == 0) { -+			if (hdhomerun_discover_send_packet(ds, broadcast, device_type, device_id) < 0) { - 				pIPAddr = pIPAddr->Next; - 				continue; - 			} -  --			hdhomerun_discover_sock_create(ds, local_ip, mask); -+			send_count++; -+ - 			pIPAddr = pIPAddr->Next; - 		} -  -@@ -139,198 +260,111 @@ - 	} -  - 	free(pAdapterInfo); --} -- --#else -  --static void hdhomerun_discover_sock_detect(struct hdhomerun_discover_t *ds) --{ --	int fd = socket(AF_INET, SOCK_DGRAM, 0); --	if (fd == -1) { --		return; -+	if (send_count == 0) { -+		return -1; - 	} -+	return 0; -+} -  --	struct ifconf ifc; --	uint8_t buf[8192]; --	ifc.ifc_len = sizeof(buf); --	ifc.ifc_buf = (char *)buf; -- --	memset(buf, 0, sizeof(buf)); -+#elif defined(__linux__) -  --	if (ioctl(fd, SIOCGIFCONF, &ifc) != 0) { --		close(fd); --		return; -+static int hdhomerun_discover_send_internal(struct hdhomerun_discover_sock_t *ds, uint32_t device_type, uint32_t device_id) -+{ -+	FILE *fp = fopen("/proc/net/route", "r"); -+	if (!fp) { -+		return -1; - 	} -  --	uint8_t *ptr = (uint8_t *)ifc.ifc_req; --	uint8_t	*end = (uint8_t *)&ifc.ifc_buf[ifc.ifc_len]; -- --	while (ptr <= end) { --		struct ifreq *ifr = (struct ifreq *)ptr; --		ptr += _SIZEOF_ADDR_IFREQ(*ifr); -+	unsigned int send_count = 0; -+	while (1) { -+		char line[256]; -+		if (!fgets(line, sizeof(line), fp)) { -+			break; -+		} -+		line[255] = 0; -  --		if (ioctl(fd, SIOCGIFADDR, ifr) != 0) { -+		uint32_t dest; -+		uint32_t mask; -+		if (sscanf(line, "%*s %x %*x %*x %*d %*d %*d %x", &dest, &mask) != 2) { - 			continue; - 		} --		struct sockaddr_in *addr_in = (struct sockaddr_in *)&(ifr->ifr_addr); --		uint32_t local_ip = ntohl(addr_in->sin_addr.s_addr); --		if (local_ip == 0) { -+		dest = ntohl(dest); -+		mask = ntohl(mask); -+		 -+		uint32_t broadcast = dest | ~mask; -+ -+		if ((broadcast == 0x00000000) || (broadcast == 0xFFFFFFFF)) { - 			continue; - 		} -  --		if (ioctl(fd, SIOCGIFNETMASK, ifr) != 0) { -+		if (hdhomerun_discover_send_packet(ds, broadcast, device_type, device_id) < 0) { - 			continue; - 		} --		struct sockaddr_in *mask_in = (struct sockaddr_in *)&(ifr->ifr_addr); --		uint32_t mask = ntohl(mask_in->sin_addr.s_addr); -  --		hdhomerun_discover_sock_create(ds, local_ip, mask); -+		send_count++; - 	} --} --#endif -  --static struct hdhomerun_discover_t *hdhomerun_discover_create(void) --{ --	struct hdhomerun_discover_t *ds = (struct hdhomerun_discover_t *)calloc(1, sizeof(struct hdhomerun_discover_t)); --	if (!ds) { --		return NULL; --	} -- --	/* Create a routable socket. */ --	if (!hdhomerun_discover_sock_create(ds, 0, 0)) { --		free(ds); --		return NULL; -+	fclose(fp); -+	if (send_count == 0) { -+		return -1; - 	} -- --	/* Detect & create local sockets. */ --	hdhomerun_discover_sock_detect(ds); -- --	/* Success. */ --	return ds; -+	return 0; - } -  --static void hdhomerun_discover_destroy(struct hdhomerun_discover_t *ds) --{ --	unsigned int i; --	for (i = 0; i < ds->sock_count; i++) { --		struct hdhomerun_discover_sock_t *dss = &ds->socks[i]; --		close(dss->sock); --	} -- --	free(ds); --} -+#else -  --static bool_t hdhomerun_discover_send_internal(struct hdhomerun_discover_t *ds, struct hdhomerun_discover_sock_t *dss, uint32_t target_ip, uint32_t device_type, uint32_t device_id) -+static int hdhomerun_discover_send_internal(struct hdhomerun_discover_sock_t *ds, uint32_t device_type, uint32_t device_id) - { --	struct hdhomerun_pkt_t *tx_pkt = &ds->tx_pkt; --	hdhomerun_pkt_reset(tx_pkt); -- --	hdhomerun_pkt_write_u8(tx_pkt, HDHOMERUN_TAG_DEVICE_TYPE); --	hdhomerun_pkt_write_var_length(tx_pkt, 4); --	hdhomerun_pkt_write_u32(tx_pkt, device_type); --	hdhomerun_pkt_write_u8(tx_pkt, HDHOMERUN_TAG_DEVICE_ID); --	hdhomerun_pkt_write_var_length(tx_pkt, 4); --	hdhomerun_pkt_write_u32(tx_pkt, device_id); --	hdhomerun_pkt_seal_frame(tx_pkt, HDHOMERUN_TYPE_DISCOVER_REQ); -- --	struct sockaddr_in sock_addr; --	memset(&sock_addr, 0, sizeof(sock_addr)); --	sock_addr.sin_family = AF_INET; --	sock_addr.sin_addr.s_addr = htonl(target_ip); --	sock_addr.sin_port = htons(HDHOMERUN_DISCOVER_UDP_PORT); -- --	int length = (int)(tx_pkt->end - tx_pkt->start); --	if (sendto(dss->sock, (char *)tx_pkt->start, length, 0, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != length) { --		return FALSE; --	} -- --	return TRUE; -+	return -1; - } -+#endif -  --static bool_t hdhomerun_discover_send_wildcard_ip(struct hdhomerun_discover_t *ds, uint32_t device_type, uint32_t device_id) -+static int hdhomerun_discover_send(struct hdhomerun_discover_sock_t *ds, uint32_t device_type, uint32_t device_id) - { --	bool_t result = FALSE; -- --	/* --	 * Send subnet broadcast using each local ip socket. --	 * This will work with multiple separate 169.254.x.x interfaces. --	 */ --	unsigned int i; --	for (i = 1; i < ds->sock_count; i++) { --		struct hdhomerun_discover_sock_t *dss = &ds->socks[i]; --		uint32_t target_ip = dss->local_ip | ~dss->subnet_mask; --		result |= hdhomerun_discover_send_internal(ds, dss, target_ip, device_type, device_id); --	} -- --	/* --	 * If no local ip sockets then fall back to sending a global broadcast letting the OS choose the interface. --	 */ --	if (!result) { --		struct hdhomerun_discover_sock_t *dss = &ds->socks[0]; --		result = hdhomerun_discover_send_internal(ds, dss, 0xFFFFFFFF, device_type, device_id); -+	if (hdhomerun_discover_send_internal(ds, device_type, device_id) < 0) { -+		return hdhomerun_discover_send_packet(ds, 0xFFFFFFFF, device_type, device_id); - 	} -- --	return result; -+	return 0; - } -  --static bool_t hdhomerun_discover_send_target_ip(struct hdhomerun_discover_t *ds, uint32_t target_ip, uint32_t device_type, uint32_t device_id) -+static int hdhomerun_discover_recv(struct hdhomerun_discover_sock_t *ds, struct hdhomerun_discover_device_t *result) - { --	bool_t result = FALSE; -- --	/* --	 * Send targeted packet from any local ip that is in the same subnet. --	 * This will work with multiple separate 169.254.x.x interfaces. --	 */ --	unsigned int i; --	for (i = 1; i < ds->sock_count; i++) { --		struct hdhomerun_discover_sock_t *dss = &ds->socks[i]; --		if ((target_ip & dss->subnet_mask) != (dss->local_ip & dss->subnet_mask)) { --			continue; --		} -+	struct timeval t; -+	t.tv_sec = 0; -+	t.tv_usec = 250000; -  --		result |= hdhomerun_discover_send_internal(ds, dss, target_ip, device_type, device_id); --	} -+	fd_set readfds; -+	FD_ZERO(&readfds); -+	FD_SET(ds->sock, &readfds); -  --	/* --	 * If target IP does not match a local subnet then fall back to letting the OS choose the gateway interface. --	 */ --	if (!result) { --		struct hdhomerun_discover_sock_t *dss = &ds->socks[0]; --		result = hdhomerun_discover_send_internal(ds, dss, target_ip, device_type, device_id); -+	if (select(ds->sock+1, &readfds, NULL, NULL, &t) < 0) { -+		return -1; - 	} -- --	return result; --} -- --static bool_t hdhomerun_discover_send(struct hdhomerun_discover_t *ds, uint32_t target_ip, uint32_t device_type, uint32_t device_id) --{ --	if (target_ip != 0) { --		return hdhomerun_discover_send_target_ip(ds, target_ip, device_type, device_id); -+	if (!FD_ISSET(ds->sock, &readfds)) { -+		return 0; - 	} -  --	return hdhomerun_discover_send_wildcard_ip(ds, device_type, device_id); --} -- --static int hdhomerun_discover_recv_internal(struct hdhomerun_discover_t *ds, struct hdhomerun_discover_sock_t *dss, struct hdhomerun_discover_device_t *result) --{ --	struct hdhomerun_pkt_t *rx_pkt = &ds->rx_pkt; --	hdhomerun_pkt_reset(rx_pkt); -- -+	uint8_t buffer[1024]; - 	struct sockaddr_in sock_addr; --	memset(&sock_addr, 0, sizeof(sock_addr)); - 	socklen_t sockaddr_size = sizeof(sock_addr); -- --	int rx_length = recvfrom(dss->sock, (char *)rx_pkt->end, (int)(rx_pkt->limit - rx_pkt->end), 0, (struct sockaddr *)&sock_addr, &sockaddr_size); -+	int rx_length = recvfrom(ds->sock, (char *)buffer, sizeof(buffer), 0, (struct sockaddr *)&sock_addr, &sockaddr_size); - 	if (rx_length <= 0) { - 		/* Don't return error - windows machine on VPN can sometimes cause a sock error here but otherwise works. */ - 		return 0; - 	} --	rx_pkt->end += rx_length; -+	if (rx_length < HDHOMERUN_MIN_PEEK_LENGTH) { -+		return 0; -+	} -  --	uint16_t type; --	if (hdhomerun_pkt_open_frame(rx_pkt, &type) <= 0) { -+	size_t length = hdhomerun_peek_packet_length(buffer); -+	if (length > (size_t)rx_length) { - 		return 0; - 	} -+ -+	uint8_t *ptr = buffer; -+	uint8_t *end = buffer + length; -+	int type = hdhomerun_process_packet(&ptr, &end); - 	if (type != HDHOMERUN_TYPE_DISCOVER_RPY) { - 		return 0; - 	} -@@ -338,12 +372,11 @@ - 	result->ip_addr = ntohl(sock_addr.sin_addr.s_addr); - 	result->device_type = 0; - 	result->device_id = 0; -- - 	while (1) { - 		uint8_t tag; - 		size_t len; --		uint8_t *next = hdhomerun_pkt_read_tlv(rx_pkt, &tag, &len); --		if (!next) { -+		uint8_t *value; -+		if (hdhomerun_read_tlv(&ptr, end, &tag, &len, &value) < 0) { - 			break; - 		} -  -@@ -352,71 +385,28 @@ - 			if (len != 4) { - 				break; - 			} --			result->device_type = hdhomerun_pkt_read_u32(rx_pkt); -+			result->device_type = hdhomerun_read_u32(&value); - 			break; -- - 		case HDHOMERUN_TAG_DEVICE_ID: - 			if (len != 4) { - 				break; - 			} --			result->device_id = hdhomerun_pkt_read_u32(rx_pkt); -+			result->device_id = hdhomerun_read_u32(&value); - 			break; -- - 		default: - 			break; - 		} -- --		rx_pkt->pos = next; - 	} -  - 	return 1; - } -  --static int hdhomerun_discover_recv(struct hdhomerun_discover_t *ds, struct hdhomerun_discover_device_t *result) --{ --	struct timeval t; --	t.tv_sec = 0; --	t.tv_usec = 250000; -- --	fd_set readfds; --	FD_ZERO(&readfds); --	int max_sock = -1; -- --	unsigned int i; --	for (i = 0; i < ds->sock_count; i++) { --		struct hdhomerun_discover_sock_t *dss = &ds->socks[i]; --		FD_SET(dss->sock, &readfds); --		if (dss->sock > max_sock) { --			max_sock = dss->sock; --		} --	} -- --	if (select(max_sock+1, &readfds, NULL, NULL, &t) < 0) { --		return -1; --	} -- --	for (i = 0; i < ds->sock_count; i++) { --		struct hdhomerun_discover_sock_t *dss = &ds->socks[i]; --		if (!FD_ISSET(dss->sock, &readfds)) { --			continue; --		} -- --		if (hdhomerun_discover_recv_internal(ds, dss, result) <= 0) { --			continue; --		} -- --		return 1; --	} -- --	return 0; --} -- --static struct hdhomerun_discover_device_t *hdhomerun_discover_find_in_list(struct hdhomerun_discover_device_t result_list[], int count, uint32_t ip_addr) -+static struct hdhomerun_discover_device_t *hdhomerun_discover_find_in_list(struct hdhomerun_discover_device_t result_list[], int count, uint32_t device_id) - { - 	int index; - 	for (index = 0; index < count; index++) { - 		struct hdhomerun_discover_device_t *result = &result_list[index]; --		if (result->ip_addr == ip_addr) { -+		if (result->device_id == device_id) { - 			return result; - 		} - 	} -@@ -424,12 +414,13 @@ - 	return NULL; - } -  --static int hdhomerun_discover_find_devices_internal(struct hdhomerun_discover_t *ds, uint32_t target_ip, uint32_t device_type, uint32_t device_id, struct hdhomerun_discover_device_t result_list[], int max_count) -+static int hdhomerun_discover_find_devices_internal(struct hdhomerun_discover_sock_t *ds, uint32_t device_type, uint32_t device_id, struct hdhomerun_discover_device_t result_list[], int max_count) - { - 	int count = 0; -+ - 	int attempt; - 	for (attempt = 0; attempt < 4; attempt++) { --		if (!hdhomerun_discover_send(ds, target_ip, device_type, device_id)) { -+		if (hdhomerun_discover_send(ds, device_type, device_id) < 0) { - 			return -1; - 		} -  -@@ -442,7 +433,7 @@ - 				return -1; - 			} - 			if (ret == 0) { --				continue; -+				break; - 			} -  - 			/* Filter. */ -@@ -458,7 +449,7 @@ - 			} -  - 			/* Ensure not already in list. */ --			if (hdhomerun_discover_find_in_list(result_list, count, result->ip_addr)) { -+			if (hdhomerun_discover_find_in_list(result_list, count, result->device_id)) { - 				continue; - 			} -  -@@ -473,14 +464,27 @@ - 	return count; - } -  --int hdhomerun_discover_find_devices_custom(uint32_t target_ip, uint32_t device_type, uint32_t device_id, struct hdhomerun_discover_device_t result_list[], int max_count) -+int hdhomerun_discover_find_device(uint32_t device_id, struct hdhomerun_discover_device_t *result) -+{ -+	struct hdhomerun_discover_sock_t *ds = hdhomerun_discover_create(); -+	if (!ds) { -+		return -1; -+	} -+ -+	int ret = hdhomerun_discover_find_devices_internal(ds, HDHOMERUN_DEVICE_TYPE_WILDCARD, device_id, result, 1); -+ -+	hdhomerun_discover_destroy(ds); -+	return ret; -+} -+ -+int hdhomerun_discover_find_devices(uint32_t device_type, struct hdhomerun_discover_device_t result_list[], int max_count) - { --	struct hdhomerun_discover_t *ds = hdhomerun_discover_create(); -+	struct hdhomerun_discover_sock_t *ds = hdhomerun_discover_create(); - 	if (!ds) { - 		return -1; - 	} -  --	int ret = hdhomerun_discover_find_devices_internal(ds, target_ip, device_type, device_id, result_list, max_count); -+	int ret = hdhomerun_discover_find_devices_internal(ds, device_type, HDHOMERUN_DEVICE_ID_WILDCARD, result_list, max_count); -  - 	hdhomerun_discover_destroy(ds); - 	return ret; -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_discover.h src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_discover.h ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_discover.h	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_discover.h	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_discover.h -  * -- * Copyright © 2006-2007 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,20 +14,8 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ - #ifdef __cplusplus - extern "C" { -@@ -40,18 +28,29 @@ - }; -  - /* -- * Find devices. -+ * Find a device by device ID. -+ * -+ * The device information is stored in caller-supplied hdhomerun_discover_device_t var. -+ * Multiple attempts are made to find the device. -+ * Worst-case execution time is 1 second. -+ * -+ * Returns 1 on success. -+ * Returns 0 if not found. -+ * Retruns -1 on error. -+ */ -+extern int hdhomerun_discover_find_device(uint32_t device_id, struct hdhomerun_discover_device_t *result); -+ -+/* -+ * Find all devices of a given type. -  * -  * The device information is stored in caller-supplied array of hdhomerun_discover_device_t vars. -  * Multiple attempts are made to find devices. -  * Execution time is 1 second. -  * -- * Set target_ip to zero to auto-detect IP address. -- * -  * Returns the number of devices found. -  * Retruns -1 on error. -  */ --extern LIBTYPE int hdhomerun_discover_find_devices_custom(uint32_t target_ip, uint32_t device_type, uint32_t device_id, struct hdhomerun_discover_device_t result_list[], int max_count); -+extern int hdhomerun_discover_find_devices(uint32_t device_type, struct hdhomerun_discover_device_t result_list[], int max_count); -  - /* -  * Verify that the device ID given is valid. -@@ -62,7 +61,7 @@ -  * Returns TRUE if valid. -  * Returns FALSE if not valid. -  */ --extern LIBTYPE bool_t hdhomerun_discover_validate_device_id(uint32_t device_id); -+extern bool_t hdhomerun_discover_validate_device_id(uint32_t device_id); -  - #ifdef __cplusplus - } -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_os.h src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_os.h ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_os.h	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_os.h	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_os.h -  * -- * Copyright © 2006-2008 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,36 +14,97 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ -  --#if defined(_WIN32) || defined(_WIN64) -+#include <stdlib.h> -+#include <stdio.h> -+#include <string.h> -+ -+#if defined(WIN32) - #define __WINDOWS__ - #endif -  - #if defined(__WINDOWS__) --#include "hdhomerun_os_windows.h" -+#include <windows.h> -+#include <sys/types.h> -+#include <sys/timeb.h> - #else --#include "hdhomerun_os_posix.h" -+#include <unistd.h> -+#include <errno.h> -+#include <sys/types.h> -+#include <sys/socket.h> -+#include <netinet/in.h> -+#include <arpa/inet.h> -+#include <netdb.h> -+#include <sys/time.h> -+#include <sys/timeb.h> -+#include <fcntl.h> - #endif -  -+#include <pthread.h> -+ - #if !defined(TRUE) - #define TRUE 1 - #endif -- - #if !defined(FALSE) - #define FALSE 0 - #endif -+ -+#if defined(__WINDOWS__) -+ -+typedef int bool_t; -+typedef unsigned __int8 uint8_t; -+typedef unsigned __int16 uint16_t; -+typedef unsigned __int32 uint32_t; -+typedef unsigned __int64 uint64_t; -+ -+#define socklen_t int -+#define close closesocket -+#define sock_getlasterror WSAGetLastError() -+#define sock_getlasterror_socktimeout (WSAGetLastError() == WSAETIMEDOUT) -+#define atoll _atoi64 -+#define strcasecmp _stricmp -+#define fseeko _fseeki64 -+#define ftello _ftelli64 -+#define usleep(us) Sleep((us)/1000) -+#define sleep(sec) Sleep((sec)*1000) -+ -+static inline uint64_t getcurrenttime(void) -+{ -+	struct timeb tb; -+	ftime(&tb); -+	return ((uint64_t)tb.time * 1000) + tb.millitm; -+} -+ -+static inline int setsocktimeout(int s, int level, int optname, uint64_t timeout) -+{ -+	int t = (int)timeout; -+	return setsockopt(s, level, optname, (char *)&t, sizeof(t)); -+} -+ -+#else -+ -+typedef int bool_t; -+ -+#define sock_getlasterror errno -+#define sock_getlasterror_socktimeout (errno == EAGAIN) -+ -+static inline uint64_t getcurrenttime(void) -+{ -+	struct timeval t; -+	gettimeofday(&t, NULL); -+	return ((uint64_t)t.tv_sec * 1000) + (t.tv_usec / 1000); -+} -+ -+static inline int setsocktimeout(int s, int level, int optname, uint64_t timeout) -+{ -+	struct timeval t; -+	t.tv_sec = timeout / 1000; -+	t.tv_usec = (timeout % 1000) * 1000; -+	return setsockopt(s, level, optname, (char *)&t, sizeof(t)); -+} -+ -+#endif -+ -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_os_posix.h -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_os_windows.h -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_pkt.c src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_pkt.c ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_pkt.c	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_pkt.c	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_pkt.c -  * -- * Copyright © 2005-2006 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2005-2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,232 +14,255 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ -  --#include "hdhomerun.h" -+#include "hdhomerun_os.h" -+#include "hdhomerun_pkt.h" -  --struct hdhomerun_pkt_t *hdhomerun_pkt_create(void) -+uint8_t hdhomerun_read_u8(uint8_t **pptr) - { --	struct hdhomerun_pkt_t *pkt = (struct hdhomerun_pkt_t *)calloc(1, sizeof(struct hdhomerun_pkt_t)); --	if (!pkt) { --		return NULL; --	} -- --	hdhomerun_pkt_reset(pkt); -- --	return pkt; --} -- --void hdhomerun_pkt_destroy(struct hdhomerun_pkt_t *pkt) --{ --	free(pkt); --} -- --void hdhomerun_pkt_reset(struct hdhomerun_pkt_t *pkt) --{ --	pkt->limit = pkt->buffer + sizeof(pkt->buffer) - 4; --	pkt->start = pkt->buffer + 1024; --	pkt->end = pkt->start; --	pkt->pos = pkt->start; --} -- --static uint32_t hdhomerun_pkt_calc_crc(uint8_t *start, uint8_t *end) --{ --	uint8_t *pos = start; --	uint32_t crc = 0xFFFFFFFF; --	while (pos < end) { --		uint8_t x = (uint8_t)(crc) ^ *pos++; --		crc >>= 8; --		if (x & 0x01) crc ^= 0x77073096; --		if (x & 0x02) crc ^= 0xEE0E612C; --		if (x & 0x04) crc ^= 0x076DC419; --		if (x & 0x08) crc ^= 0x0EDB8832; --		if (x & 0x10) crc ^= 0x1DB71064; --		if (x & 0x20) crc ^= 0x3B6E20C8; --		if (x & 0x40) crc ^= 0x76DC4190; --		if (x & 0x80) crc ^= 0xEDB88320; --	} --	return crc ^ 0xFFFFFFFF; --} -- --uint8_t hdhomerun_pkt_read_u8(struct hdhomerun_pkt_t *pkt) --{ --	uint8_t v = *pkt->pos++; -+	uint8_t *ptr = *pptr; -+	uint8_t v = *ptr++; -+	*pptr = ptr; - 	return v; - } -  --uint16_t hdhomerun_pkt_read_u16(struct hdhomerun_pkt_t *pkt) -+uint16_t hdhomerun_read_u16(uint8_t **pptr) - { -+	uint8_t *ptr = *pptr; - 	uint16_t v; --	v =  (uint16_t)*pkt->pos++ << 8; --	v |= (uint16_t)*pkt->pos++ << 0; -+	v =  (uint16_t)*ptr++ << 8; -+	v |= (uint16_t)*ptr++ << 0; -+	*pptr = ptr; - 	return v; - } -  --uint32_t hdhomerun_pkt_read_u32(struct hdhomerun_pkt_t *pkt) -+uint32_t hdhomerun_read_u32(uint8_t **pptr) - { -+	uint8_t *ptr = *pptr; - 	uint32_t v; --	v =  (uint32_t)*pkt->pos++ << 24; --	v |= (uint32_t)*pkt->pos++ << 16; --	v |= (uint32_t)*pkt->pos++ << 8; --	v |= (uint32_t)*pkt->pos++ << 0; -+	v =  (uint32_t)*ptr++ << 24; -+	v |= (uint32_t)*ptr++ << 16; -+	v |= (uint32_t)*ptr++ << 8; -+	v |= (uint32_t)*ptr++ << 0; -+	*pptr = ptr; - 	return v; - } -  --size_t hdhomerun_pkt_read_var_length(struct hdhomerun_pkt_t *pkt) -+size_t hdhomerun_read_var_length(uint8_t **pptr, uint8_t *end) - { -+	uint8_t *ptr = *pptr; - 	size_t length; - 	 --	if (pkt->pos + 1 > pkt->end) { --		return (size_t)-1; -+	if (ptr + 1 > end) { -+		return -1; - 	} -  --	length = (size_t)*pkt->pos++; -+	length = (size_t)*ptr++; - 	if (length & 0x0080) { --		if (pkt->pos + 1 > pkt->end) { --			return (size_t)-1; -+		if (ptr + 1 > end) { -+			return -1; - 		} -  - 		length &= 0x007F; --		length |= (size_t)*pkt->pos++ << 7; -+		length |= (size_t)*ptr++ << 7; - 	} - 	 -+	*pptr = ptr; - 	return length;  - } -  --uint8_t *hdhomerun_pkt_read_tlv(struct hdhomerun_pkt_t *pkt, uint8_t *ptag, size_t *plength) -+int hdhomerun_read_tlv(uint8_t **pptr, uint8_t *end, uint8_t *ptag, size_t *plength, uint8_t **pvalue) - { --	if (pkt->pos + 2 > pkt->end) { --		return NULL; -+	if (end - *pptr < 2) { -+		return -1; - 	} - 	 --	*ptag = hdhomerun_pkt_read_u8(pkt); --	*plength = hdhomerun_pkt_read_var_length(pkt); -- --	if (pkt->pos + *plength > pkt->end) { --		return NULL; -+	*ptag = hdhomerun_read_u8(pptr); -+	*plength = hdhomerun_read_var_length(pptr, end); -+	*pvalue = *pptr; -+	 -+	if ((size_t)(end - *pptr) < *plength) { -+		return -1; - 	} - 	 --	return pkt->pos + *plength; -+	*pptr += *plength; -+	return 0; - } -  --void hdhomerun_pkt_write_u8(struct hdhomerun_pkt_t *pkt, uint8_t v) -+void hdhomerun_write_u8(uint8_t **pptr, uint8_t v) - { --	*pkt->pos++ = v; -+	uint8_t *ptr = *pptr; -+	*ptr++ = v; -+	*pptr = ptr; -+} -  --	if (pkt->pos > pkt->end) { --		pkt->end = pkt->pos; --	} -+void hdhomerun_write_u16(uint8_t **pptr, uint16_t v) -+{ -+	uint8_t *ptr = *pptr; -+	*ptr++ = (uint8_t)(v >> 8); -+	*ptr++ = (uint8_t)(v >> 0); -+	*pptr = ptr; - } -  --void hdhomerun_pkt_write_u16(struct hdhomerun_pkt_t *pkt, uint16_t v) -+void hdhomerun_write_u32(uint8_t **pptr, uint32_t v) - { --	*pkt->pos++ = (uint8_t)(v >> 8); --	*pkt->pos++ = (uint8_t)(v >> 0); -+	uint8_t *ptr = *pptr; -+	*ptr++ = (uint8_t)(v >> 24); -+	*ptr++ = (uint8_t)(v >> 16); -+	*ptr++ = (uint8_t)(v >> 8); -+	*ptr++ = (uint8_t)(v >> 0); -+	*pptr = ptr; -+} -  --	if (pkt->pos > pkt->end) { --		pkt->end = pkt->pos; -+void hdhomerun_write_var_length(uint8_t **pptr, size_t v) -+{ -+	uint8_t *ptr = *pptr; -+	if (v <= 127) { -+		*ptr++ = (uint8_t)v; -+	} else { -+		*ptr++ = (uint8_t)(v | 0x80); -+		*ptr++ = (uint8_t)(v >> 7); - 	} -+	*pptr = ptr; - } -  --void hdhomerun_pkt_write_u32(struct hdhomerun_pkt_t *pkt, uint32_t v) -+static void hdhomerun_write_mem(uint8_t **pptr, void *mem, size_t length) - { --	*pkt->pos++ = (uint8_t)(v >> 24); --	*pkt->pos++ = (uint8_t)(v >> 16); --	*pkt->pos++ = (uint8_t)(v >> 8); --	*pkt->pos++ = (uint8_t)(v >> 0); -+	uint8_t *ptr = *pptr; -+	memcpy(ptr, mem, length); -+	ptr += length; -+	*pptr = ptr; -+} -  --	if (pkt->pos > pkt->end) { --		pkt->end = pkt->pos; -+static uint32_t hdhomerun_calc_crc(uint8_t *start, uint8_t *end) -+{ -+	uint8_t *ptr = start; -+	uint32_t crc = 0xFFFFFFFF; -+	while (ptr < end) { -+		uint8_t x = (uint8_t)(crc) ^ *ptr++; -+		crc >>= 8; -+		if (x & 0x01) crc ^= 0x77073096; -+		if (x & 0x02) crc ^= 0xEE0E612C; -+		if (x & 0x04) crc ^= 0x076DC419; -+		if (x & 0x08) crc ^= 0x0EDB8832; -+		if (x & 0x10) crc ^= 0x1DB71064; -+		if (x & 0x20) crc ^= 0x3B6E20C8; -+		if (x & 0x40) crc ^= 0x76DC4190; -+		if (x & 0x80) crc ^= 0xEDB88320; - 	} -+	return crc ^ 0xFFFFFFFF; - } -  --void hdhomerun_pkt_write_var_length(struct hdhomerun_pkt_t *pkt, size_t v) -+static int hdhomerun_check_crc(uint8_t *start, uint8_t *end) - { --	if (v <= 127) { --		*pkt->pos++ = (uint8_t)v; --	} else { --		*pkt->pos++ = (uint8_t)(v | 0x80); --		*pkt->pos++ = (uint8_t)(v >> 7); -+	if (end - start < 8) { -+		return -1; - 	} -- --	if (pkt->pos > pkt->end) { --		pkt->end = pkt->pos; -+	uint8_t *ptr = end -= 4; -+	uint32_t actual_crc = hdhomerun_calc_crc(start, ptr); -+	uint32_t packet_crc; -+	packet_crc =  (uint32_t)*ptr++ << 0; -+	packet_crc |= (uint32_t)*ptr++ << 8; -+	packet_crc |= (uint32_t)*ptr++ << 16; -+	packet_crc |= (uint32_t)*ptr++ << 24; -+	if (actual_crc != packet_crc) { -+		return -1; - 	} -+	return 0; - } -  --void hdhomerun_pkt_write_mem(struct hdhomerun_pkt_t *pkt, const void *mem, size_t length) -+static void hdhomerun_write_header_length(uint8_t *ptr, size_t length) - { --	memcpy(pkt->pos, mem, length); --	pkt->pos += length; -+	hdhomerun_write_u16(&ptr, (uint16_t)length); -+} -  --	if (pkt->pos > pkt->end) { --		pkt->end = pkt->pos; --	} -+void hdhomerun_write_crc(uint8_t **pptr, uint8_t *start) -+{ -+	uint8_t *ptr = *pptr; -+	uint32_t crc = hdhomerun_calc_crc(start, ptr); -+	*ptr++ = (uint8_t)(crc >> 0); -+	*ptr++ = (uint8_t)(crc >> 8); -+	*ptr++ = (uint8_t)(crc >> 16); -+	*ptr++ = (uint8_t)(crc >> 24); -+	*pptr = ptr; - } -  --int hdhomerun_pkt_open_frame(struct hdhomerun_pkt_t *pkt, uint16_t *ptype) -+void hdhomerun_write_discover_request(uint8_t **pptr, uint32_t device_type, uint32_t device_id) - { --	pkt->pos = pkt->start; -+	uint8_t *start = *pptr; -+	hdhomerun_write_u16(pptr, HDHOMERUN_TYPE_DISCOVER_REQ); -+	hdhomerun_write_u16(pptr, 0); -  --	if (pkt->pos + 4 > pkt->end) { --		return 0; --	} -+	hdhomerun_write_u8(pptr, HDHOMERUN_TAG_DEVICE_TYPE); -+	hdhomerun_write_var_length(pptr, 4); -+	hdhomerun_write_u32(pptr, device_type); -+	hdhomerun_write_u8(pptr, HDHOMERUN_TAG_DEVICE_ID); -+	hdhomerun_write_var_length(pptr, 4); -+	hdhomerun_write_u32(pptr, device_id); -  --	*ptype = hdhomerun_pkt_read_u16(pkt); --	size_t length = hdhomerun_pkt_read_u16(pkt); --	pkt->pos += length; -+	hdhomerun_write_header_length(start + 2, (int)(*pptr - start - 4)); -+	hdhomerun_write_crc(pptr, start); -+} -  --	if (pkt->pos + 4 > pkt->end) { --		pkt->pos = pkt->start; --		return 0; --	} -+void hdhomerun_write_get_set_request(uint8_t **pptr, const char *name, const char *value) -+{ -+	uint8_t *start = *pptr; -+	hdhomerun_write_u16(pptr, HDHOMERUN_TYPE_GETSET_REQ); -+	hdhomerun_write_u16(pptr, 0); -  --	uint32_t calc_crc = hdhomerun_pkt_calc_crc(pkt->start, pkt->pos); -+	int name_len = (int)strlen(name) + 1; -+	hdhomerun_write_u8(pptr, HDHOMERUN_TAG_GETSET_NAME); -+	hdhomerun_write_var_length(pptr, name_len); -+	hdhomerun_write_mem(pptr, (void *)name, name_len); -  --	uint32_t packet_crc; --	packet_crc =  (uint32_t)*pkt->pos++ << 0; --	packet_crc |= (uint32_t)*pkt->pos++ << 8; --	packet_crc |= (uint32_t)*pkt->pos++ << 16; --	packet_crc |= (uint32_t)*pkt->pos++ << 24; --	if (calc_crc != packet_crc) { --		return -1; -+	if (value) { -+		int value_len = (int)strlen(value) + 1; -+		hdhomerun_write_u8(pptr, HDHOMERUN_TAG_GETSET_VALUE); -+		hdhomerun_write_var_length(pptr, value_len); -+		hdhomerun_write_mem(pptr, (void *)value, value_len); - 	} -  --	pkt->start += 4; --	pkt->end = pkt->start + length; --	pkt->pos = pkt->start; --	return 1; -+	hdhomerun_write_header_length(start + 2, (int)(*pptr - start - 4)); -+	hdhomerun_write_crc(pptr, start); - } -  --void hdhomerun_pkt_seal_frame(struct hdhomerun_pkt_t *pkt, uint16_t frame_type) -+void hdhomerun_write_upgrade_request(uint8_t **pptr, uint32_t sequence, void *data, size_t length) - { --	size_t length = pkt->end - pkt->start; -+	uint8_t *start = *pptr; -+	hdhomerun_write_u16(pptr, HDHOMERUN_TYPE_UPGRADE_REQ); -+	hdhomerun_write_u16(pptr, 0); -  --	pkt->start -= 4; --	pkt->pos = pkt->start; --	hdhomerun_pkt_write_u16(pkt, frame_type); --	hdhomerun_pkt_write_u16(pkt, (uint16_t)length); -+	hdhomerun_write_u32(pptr, sequence); -+	if (length > 0) { -+		hdhomerun_write_mem(pptr, data, length); -+	} -  --	uint32_t crc = hdhomerun_pkt_calc_crc(pkt->start, pkt->end); --	*pkt->end++ = (uint8_t)(crc >> 0); --	*pkt->end++ = (uint8_t)(crc >> 8); --	*pkt->end++ = (uint8_t)(crc >> 16); --	*pkt->end++ = (uint8_t)(crc >> 24); -+	hdhomerun_write_header_length(start + 2, *pptr - start - 4); -+	hdhomerun_write_crc(pptr, start); -+} -  --	pkt->pos = pkt->start; -+size_t hdhomerun_peek_packet_length(uint8_t *ptr) -+{ -+	ptr += 2; -+	return (size_t)hdhomerun_read_u16(&ptr) + 8; - } -+ -+int hdhomerun_process_packet(uint8_t **pptr, uint8_t **pend) -+{ -+	if (hdhomerun_check_crc(*pptr, *pend) < 0) { -+		return -1; -+	} -+	*pend -= 4; -+	 -+	uint16_t type = hdhomerun_read_u16(pptr); -+	uint16_t length = hdhomerun_read_u16(pptr); -+	if ((*pend - *pptr) < length) { -+		return -1; -+	} -+	*pend = *pptr + length; -+	return (int)type; -+} -+ -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_pkt.h src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_pkt.h ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_pkt.h	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_pkt.h	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_pkt.h -  * -- * Copyright © 2005-2006 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2005-2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,20 +14,8 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ - #ifdef __cplusplus - extern "C" { -@@ -122,9 +110,6 @@ - #define HDHOMERUN_DISCOVER_UDP_PORT 65001 - #define HDHOMERUN_CONTROL_TCP_PORT 65001 -  --#define HDHOMERUN_MAX_PACKET_SIZE 1460 --#define HDHOMERUN_MAX_PAYLOAD_SIZE 1452 -- - #define HDHOMERUN_TYPE_DISCOVER_REQ 0x0002 - #define HDHOMERUN_TYPE_DISCOVER_RPY 0x0003 - #define HDHOMERUN_TYPE_GETSET_REQ 0x0004 -@@ -136,7 +121,6 @@ - #define HDHOMERUN_TAG_DEVICE_ID 0x02 - #define HDHOMERUN_TAG_GETSET_NAME 0x03 - #define HDHOMERUN_TAG_GETSET_VALUE 0x04 --#define HDHOMERUN_TAG_GETSET_LOCKKEY 0x15 - #define HDHOMERUN_TAG_ERROR_MESSAGE 0x05 -  - #define HDHOMERUN_DEVICE_TYPE_WILDCARD 0xFFFFFFFF -@@ -145,33 +129,25 @@ -  - #define HDHOMERUN_MIN_PEEK_LENGTH 4 -  --struct hdhomerun_pkt_t { --	uint8_t *pos; --	uint8_t *start; --	uint8_t *end; --	uint8_t *limit; --	uint8_t buffer[3074]; --}; -- --extern LIBTYPE struct hdhomerun_pkt_t *hdhomerun_pkt_create(void); --extern LIBTYPE void hdhomerun_pkt_destroy(struct hdhomerun_pkt_t *pkt); --extern LIBTYPE void hdhomerun_pkt_reset(struct hdhomerun_pkt_t *pkt); -- --extern LIBTYPE uint8_t hdhomerun_pkt_read_u8(struct hdhomerun_pkt_t *pkt); --extern LIBTYPE uint16_t hdhomerun_pkt_read_u16(struct hdhomerun_pkt_t *pkt); --extern LIBTYPE uint32_t hdhomerun_pkt_read_u32(struct hdhomerun_pkt_t *pkt); --extern LIBTYPE size_t hdhomerun_pkt_read_var_length(struct hdhomerun_pkt_t *pkt); --extern LIBTYPE uint8_t *hdhomerun_pkt_read_tlv(struct hdhomerun_pkt_t *pkt, uint8_t *ptag, size_t *plength); -- --extern LIBTYPE void hdhomerun_pkt_write_u8(struct hdhomerun_pkt_t *pkt, uint8_t v); --extern LIBTYPE void hdhomerun_pkt_write_u16(struct hdhomerun_pkt_t *pkt, uint16_t v); --extern LIBTYPE void hdhomerun_pkt_write_u32(struct hdhomerun_pkt_t *pkt, uint32_t v); --extern LIBTYPE void hdhomerun_pkt_write_var_length(struct hdhomerun_pkt_t *pkt, size_t v); --extern LIBTYPE void hdhomerun_pkt_write_mem(struct hdhomerun_pkt_t *pkt, const void *mem, size_t length); -- --extern LIBTYPE bool_t hdhomerun_pkt_open_frame(struct hdhomerun_pkt_t *pkt, uint16_t *ptype); --extern LIBTYPE void hdhomerun_pkt_seal_frame(struct hdhomerun_pkt_t *pkt, uint16_t frame_type); -+extern uint8_t hdhomerun_read_u8(uint8_t **pptr); -+extern uint16_t hdhomerun_read_u16(uint8_t **pptr); -+extern uint32_t hdhomerun_read_u32(uint8_t **pptr); -+extern size_t hdhomerun_read_var_length(uint8_t **pptr, uint8_t *end); -+extern void hdhomerun_write_u8(uint8_t **pptr, uint8_t v); -+extern void hdhomerun_write_u16(uint8_t **pptr, uint16_t v); -+extern void hdhomerun_write_u32(uint8_t **pptr, uint32_t v); -+extern void hdhomerun_write_var_length(uint8_t **pptr, size_t v); -+extern void hdhomerun_write_crc(uint8_t **pptr, uint8_t *start); -+ -+extern size_t hdhomerun_peek_packet_length(uint8_t *ptr); -+extern int hdhomerun_process_packet(uint8_t **pptr, uint8_t **pend); -+extern int hdhomerun_read_tlv(uint8_t **pptr, uint8_t *end, uint8_t *ptag, size_t *plength, uint8_t **pvalue); -+ -+extern void hdhomerun_write_discover_request(uint8_t **pptr, uint32_t device_type, uint32_t device_id); -+extern void hdhomerun_write_get_set_request(uint8_t **pptr, const char *name, const char *value); -+extern void hdhomerun_write_upgrade_request(uint8_t **pptr, uint32_t sequence, void *data, size_t length); -  - #ifdef __cplusplus - } - #endif -+ -Only in branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun: hdhomerun_types.h -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.c src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_video.c ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.c	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_video.c	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_video.c -  * -- * Copyright © 2006 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,82 +14,93 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ -  --#include "hdhomerun.h" -+#include "hdhomerun_os.h" -+#include "hdhomerun_pkt.h" -+#include "hdhomerun_video.h" -  - struct hdhomerun_video_sock_t { --	pthread_mutex_t lock; - 	uint8_t *buffer; - 	size_t buffer_size; - 	volatile size_t head; - 	volatile size_t tail; - 	size_t advance; -+	volatile bool_t running; - 	volatile bool_t terminate; - 	pthread_t thread; - 	int sock; --	uint32_t rtp_sequence; --	struct hdhomerun_debug_t *dbg; --	volatile uint32_t packet_count; --	volatile uint32_t transport_error_count; --	volatile uint32_t network_error_count; --	volatile uint32_t sequence_error_count; --	volatile uint32_t overflow_error_count; --	volatile uint8_t sequence[0x2000]; - }; -  --static THREAD_FUNC_PREFIX hdhomerun_video_thread_execute(void *arg); -+static void *hdhomerun_video_thread(void *arg); -  --struct hdhomerun_video_sock_t *hdhomerun_video_create(uint16_t listen_port, size_t buffer_size, struct hdhomerun_debug_t *dbg) -+static bool_t hdhomerun_video_bind_sock_internal(struct hdhomerun_video_sock_t *vs, uint16_t listen_port) -+{ -+	struct sockaddr_in sock_addr; -+	memset(&sock_addr, 0, sizeof(sock_addr)); -+	sock_addr.sin_family = AF_INET; -+	sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); -+	sock_addr.sin_port = htons(listen_port); -+	if (bind(vs->sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != 0) { -+		return FALSE; -+	} -+	return TRUE; -+} -+ -+static bool_t hdhomerun_video_bind_sock(struct hdhomerun_video_sock_t *vs, uint16_t listen_port) -+{ -+	if (listen_port != 0) { -+		return hdhomerun_video_bind_sock_internal(vs, listen_port); -+	} -+ -+#if defined(__CYGWIN__) || defined(__WINDOWS__) -+	/* Windows firewall silently blocks a listening port if the port number is not explicitly given. */ -+	/* Workaround - pick a random port number. The port may already be in use to try multiple port numbers. */ -+	srand((int)getcurrenttime()); -+	int retry; -+	for (retry = 8; retry > 0; retry--) { -+		uint16_t listen_port = (uint16_t)((rand() % 32768) + 32768); -+		if (hdhomerun_video_bind_sock_internal(vs, listen_port)) { -+			return TRUE; -+		} -+	} -+	return FALSE; -+#else -+	return hdhomerun_video_bind_sock_internal(vs, listen_port); -+#endif -+} -+ -+struct hdhomerun_video_sock_t *hdhomerun_video_create(uint16_t listen_port, size_t buffer_size) - { - 	/* Create object. */ - 	struct hdhomerun_video_sock_t *vs = (struct hdhomerun_video_sock_t *)calloc(1, sizeof(struct hdhomerun_video_sock_t)); - 	if (!vs) { --		hdhomerun_debug_printf(dbg, "hdhomerun_video_create: failed to allocate video object\n"); - 		return NULL; - 	} -  --	vs->dbg = dbg; --	vs->sock = -1; --	pthread_mutex_init(&vs->lock, NULL); -- --	/* Reset sequence tracking. */ --	hdhomerun_video_flush(vs); -- - 	/* Buffer size. */ - 	vs->buffer_size = (buffer_size / VIDEO_DATA_PACKET_SIZE) * VIDEO_DATA_PACKET_SIZE; - 	if (vs->buffer_size == 0) { --		hdhomerun_debug_printf(dbg, "hdhomerun_video_create: invalid buffer size (%lu bytes)\n", (unsigned long)buffer_size); --		goto error; -+		free(vs); -+		return NULL; - 	} - 	vs->buffer_size += VIDEO_DATA_PACKET_SIZE; -  - 	/* Create buffer. */ - 	vs->buffer = (uint8_t *)malloc(vs->buffer_size); - 	if (!vs->buffer) { --		hdhomerun_debug_printf(dbg, "hdhomerun_video_create: failed to allocate buffer (%lu bytes)\n", (unsigned long)vs->buffer_size); --		goto error; -+		free(vs); -+		return NULL; - 	} - 	 - 	/* Create socket. */ - 	vs->sock = (int)socket(AF_INET, SOCK_DGRAM, 0); - 	if (vs->sock == -1) { --		hdhomerun_debug_printf(dbg, "hdhomerun_video_create: failed to allocate socket\n"); --		goto error; -+		free(vs->buffer); -+		free(vs); -+		return NULL; - 	} -  - 	/* Expand socket buffer size. */ -@@ -101,44 +112,30 @@ - 	setsocktimeout(vs->sock, SOL_SOCKET, SO_RCVTIMEO, 1000); -  - 	/* Bind socket. */ --	struct sockaddr_in sock_addr; --	memset(&sock_addr, 0, sizeof(sock_addr)); --	sock_addr.sin_family = AF_INET; --	sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); --	sock_addr.sin_port = htons(listen_port); --	if (bind(vs->sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != 0) { --		hdhomerun_debug_printf(dbg, "hdhomerun_video_create: failed to bind socket (port %u)\n", listen_port); --		goto error; -+	if (!hdhomerun_video_bind_sock(vs, listen_port)) { -+		hdhomerun_video_destroy(vs); -+		return NULL; - 	} -  - 	/* Start thread. */ --	if (pthread_create(&vs->thread, NULL, &hdhomerun_video_thread_execute, vs) != 0) { --		hdhomerun_debug_printf(dbg, "hdhomerun_video_create: failed to start thread\n"); --		goto error; -+	if (pthread_create(&vs->thread, NULL, &hdhomerun_video_thread, vs) != 0) { -+		hdhomerun_video_destroy(vs); -+		return NULL; - 	} -+	vs->running = 1; -  - 	/* Success. */ - 	return vs; -- --error: --	if (vs->sock != -1) { --		close(vs->sock); --	} --	if (vs->buffer) { --		free(vs->buffer); --	} --	free(vs); --	return NULL; - } -  - void hdhomerun_video_destroy(struct hdhomerun_video_sock_t *vs) - { --	vs->terminate = TRUE; --	pthread_join(vs->thread, NULL); -- -+	if (vs->running) { -+		vs->terminate = 1; -+		pthread_join(vs->thread, NULL); -+	} - 	close(vs->sock); - 	free(vs->buffer); -- - 	free(vs); - } -  -@@ -147,85 +144,25 @@ - 	struct sockaddr_in sock_addr; - 	socklen_t sockaddr_size = sizeof(sock_addr); - 	if (getsockname(vs->sock, (struct sockaddr*)&sock_addr, &sockaddr_size) != 0) { --		hdhomerun_debug_printf(vs->dbg, "hdhomerun_video_get_local_port: getsockname failed (%d)\n", sock_getlasterror); - 		return 0; - 	} -- - 	return ntohs(sock_addr.sin_port); - } -  --static void hdhomerun_video_stats_ts_pkt(struct hdhomerun_video_sock_t *vs, uint8_t *ptr) --{ --	uint16_t packet_identifier = ((uint16_t)(ptr[1] & 0x1F) << 8) | (uint16_t)ptr[2]; --	if (packet_identifier == 0x1FFF) { --		return; --	} -- --	bool_t transport_error = ptr[1] >> 7; --	if (transport_error) { --		vs->transport_error_count++; --		vs->sequence[packet_identifier] = 0xFF; --		return; --	} -- --	uint8_t continuity_counter = ptr[3] & 0x0F; --	uint8_t previous_sequence = vs->sequence[packet_identifier]; -- --	if (continuity_counter == ((previous_sequence + 1) & 0x0F)) { --		vs->sequence[packet_identifier] = continuity_counter; --		return; --	} --	if (previous_sequence == 0xFF) { --		vs->sequence[packet_identifier] = continuity_counter; --		return; --	} --	if (continuity_counter == previous_sequence) { --		return; --	} -- --	vs->sequence_error_count++; --	vs->sequence[packet_identifier] = continuity_counter; --} -- --static void hdhomerun_video_parse_rtp(struct hdhomerun_video_sock_t *vs, struct hdhomerun_pkt_t *pkt) -+int hdhomerun_video_get_sock(struct hdhomerun_video_sock_t *vs) - { --	pkt->pos += 2; --	uint32_t rtp_sequence = hdhomerun_pkt_read_u16(pkt); --	pkt->pos += 8; -- --	if (rtp_sequence != ((vs->rtp_sequence + 1) & 0xFFFF)) { --		if (vs->rtp_sequence != 0xFFFFFFFF) { --			vs->network_error_count++; -- --			/* restart pid sequence check */ --			/* can't use memset bcs sequence is volatile */ --			int i; --			for (i = 0; i < sizeof(vs->sequence) / sizeof(uint8_t) ; i++) --				vs->sequence[i] = 0xFF; --		} --	} -- --	vs->rtp_sequence = rtp_sequence; -+	return vs->sock; - } -  --static THREAD_FUNC_PREFIX hdhomerun_video_thread_execute(void *arg) -+static void *hdhomerun_video_thread(void *arg) - { - 	struct hdhomerun_video_sock_t *vs = (struct hdhomerun_video_sock_t *)arg; --	struct hdhomerun_pkt_t pkt_inst; -  - 	while (!vs->terminate) { --		struct hdhomerun_pkt_t *pkt = &pkt_inst; --		hdhomerun_pkt_reset(pkt); -+		size_t head = vs->head; -  - 		/* Receive. */ --		int length = recv(vs->sock, (char *)pkt->end, VIDEO_RTP_DATA_PACKET_SIZE, 0); --		pkt->end += length; -- --		if (length == VIDEO_RTP_DATA_PACKET_SIZE) { --			hdhomerun_video_parse_rtp(vs, pkt); --			length = (int)(pkt->end - pkt->pos); --		} -- -+		int length = recv(vs->sock, (char *)vs->buffer + head, VIDEO_DATA_PACKET_SIZE, 0); - 		if (length != VIDEO_DATA_PACKET_SIZE) { - 			if (length > 0) { - 				/* Data received but not valid - ignore. */ -@@ -235,27 +172,10 @@ - 				/* Wait for more data. */ - 				continue; - 			} --			vs->terminate = TRUE; -+			vs->terminate = 1; - 			return NULL; - 		} -  --		pthread_mutex_lock(&vs->lock); -- --		/* Store in ring buffer. */ --		size_t head = vs->head; --		uint8_t *ptr = vs->buffer + head; --		memcpy(ptr, pkt->pos, length); -- --		/* Stats. */ --		vs->packet_count++; --		hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 0); --		hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 1); --		hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 2); --		hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 3); --		hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 4); --		hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 5); --		hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 6); -- - 		/* Calculate new head. */ - 		head += length; - 		if (head >= vs->buffer_size) { -@@ -264,15 +184,11 @@ -  - 		/* Check for buffer overflow. */ - 		if (head == vs->tail) { --			vs->overflow_error_count++; --			pthread_mutex_unlock(&vs->lock); - 			continue; - 		} -  - 		/* Atomic update. */ - 		vs->head = head; -- --		pthread_mutex_unlock(&vs->lock); - 	} -  - 	return NULL; -@@ -280,8 +196,6 @@ -  - uint8_t *hdhomerun_video_recv(struct hdhomerun_video_sock_t *vs, size_t max_size, size_t *pactual_size) - { --	pthread_mutex_lock(&vs->lock); -- - 	size_t head = vs->head; - 	size_t tail = vs->tail; -  -@@ -298,7 +212,6 @@ - 	if (head == tail) { - 		vs->advance = 0; - 		*pactual_size = 0; --		pthread_mutex_unlock(&vs->lock); - 		return NULL; - 	} -  -@@ -306,7 +219,6 @@ - 	if (size == 0) { - 		vs->advance = 0; - 		*pactual_size = 0; --		pthread_mutex_unlock(&vs->lock); - 		return NULL; - 	} -  -@@ -321,58 +233,13 @@ - 	} - 	vs->advance = size; - 	*pactual_size = size; --	uint8_t *result = vs->buffer + tail; -- --	pthread_mutex_unlock(&vs->lock); --	return result; -+	return vs->buffer + tail; - } -  - void hdhomerun_video_flush(struct hdhomerun_video_sock_t *vs) - { --	pthread_mutex_lock(&vs->lock); -- -+	/* Atomic update of tail. */ - 	vs->tail = vs->head; - 	vs->advance = 0; -- --	/* can't use memset bcs sequence is volatile */ --	int i; --	for (i = 0; i < sizeof(vs->sequence) / sizeof(uint8_t) ; i++) --		vs->sequence[i] = 0xFF; -- --	vs->rtp_sequence = 0xFFFFFFFF; -- --	vs->packet_count = 0; --	vs->transport_error_count = 0; --	vs->network_error_count = 0; --	vs->sequence_error_count = 0; --	vs->overflow_error_count = 0; -- --	pthread_mutex_unlock(&vs->lock); - } -  --void hdhomerun_video_debug_print_stats(struct hdhomerun_video_sock_t *vs) --{ --	struct hdhomerun_video_stats_t stats; --	hdhomerun_video_get_stats(vs, &stats); -- --	hdhomerun_debug_printf(vs->dbg, "video sock: pkt=%ld net=%ld te=%ld miss=%ld drop=%ld\n", --		stats.packet_count, stats.network_error_count, --		stats.transport_error_count, stats.sequence_error_count, --		stats.overflow_error_count --	); --} -- --void hdhomerun_video_get_stats(struct hdhomerun_video_sock_t *vs, struct hdhomerun_video_stats_t *stats) --{ --	memset(stats, 0, sizeof(struct hdhomerun_video_stats_t)); -- --	pthread_mutex_lock(&vs->lock); -- --	stats->packet_count = vs->packet_count; --	stats->network_error_count = vs->network_error_count; --	stats->transport_error_count = vs->transport_error_count; --	stats->sequence_error_count = vs->sequence_error_count; --	stats->overflow_error_count = vs->overflow_error_count; -- --	pthread_mutex_unlock(&vs->lock); --} -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.h src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_video.h ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.h	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/hdhomerun_video.h	2009-01-09 13:14:56.000000000 +1030 -@@ -1,12 +1,12 @@ - /* -  * hdhomerun_video.h -  * -- * Copyright © 2006 Silicondust USA Inc. <www.silicondust.com>. -+ * Copyright © 2006 Silicondust Engineering Ltd. <www.silicondust.com>. -  * -- * This library is free software; you can redistribute it and/or  -+ * This library is free software; you can redistribute it and/or -  * modify it under the terms of the GNU Lesser General Public -  * License as published by the Free Software Foundation; either -- * version 3 of the License, or (at your option) any later version. -+ * version 2.1 of the License, or (at your option) any later version. -  * -  * This library is distributed in the hope that it will be useful, -  * but WITHOUT ANY WARRANTY; without even the implied warranty of -@@ -14,20 +14,8 @@ -  * Lesser General Public License for more details. -  * -  * You should have received a copy of the GNU Lesser General Public -- * License along with this library.  If not, see <http://www.gnu.org/licenses/>. -- *  -- * As a special exception to the GNU Lesser General Public License, -- * you may link, statically or dynamically, an application with a -- * publicly distributed version of the Library to produce an -- * executable file containing portions of the Library, and -- * distribute that executable file under terms of your choice, -- * without any of the additional requirements listed in clause 4 of -- * the GNU Lesser General Public License. -- *  -- * By "a publicly distributed version of the Library", we mean -- * either the unmodified Library as distributed by Silicondust, or a -- * modified version of the Library that is distributed under the -- * conditions defined in the GNU Lesser General Public License. -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA -  */ - #ifdef __cplusplus - extern "C" { -@@ -35,40 +23,34 @@ -  - struct hdhomerun_video_sock_t; -  --struct hdhomerun_video_stats_t { --	uint32_t packet_count; --	uint32_t network_error_count; --	uint32_t transport_error_count; --	uint32_t sequence_error_count; --	uint32_t overflow_error_count; --}; -- - #define TS_PACKET_SIZE 188 - #define VIDEO_DATA_PACKET_SIZE (188 * 7) - #define VIDEO_DATA_BUFFER_SIZE_1S (20000000 / 8) -  --#define VIDEO_RTP_DATA_PACKET_SIZE ((188 * 7) + 12) -- - /* -  * Create a video/data socket. -  * -  * uint16_t listen_port: Port number to listen on. Set to 0 to auto-select. -  * size_t buffer_size: Size of receive buffer. For 1 second of buffer use VIDEO_DATA_BUFFER_SIZE_1S.  -- * struct hdhomerun_debug_t *dbg: Pointer to debug logging object. May be NULL. -  * -  * Returns a pointer to the newly created control socket. -  * -  * When no longer needed, the socket should be destroyed by calling hdhomerun_control_destroy. -  */ --extern LIBTYPE struct hdhomerun_video_sock_t *hdhomerun_video_create(uint16_t listen_port, size_t buffer_size, struct hdhomerun_debug_t *dbg); --extern LIBTYPE void hdhomerun_video_destroy(struct hdhomerun_video_sock_t *vs); -+extern struct hdhomerun_video_sock_t *hdhomerun_video_create(uint16_t listen_port, size_t buffer_size); -+extern void hdhomerun_video_destroy(struct hdhomerun_video_sock_t *vs); -  - /* -  * Get the port the socket is listening on. -  * -  * Returns 16-bit port with native endianness, or 0 on error. -  */ --extern LIBTYPE uint16_t hdhomerun_video_get_local_port(struct hdhomerun_video_sock_t *vs); -+extern uint16_t hdhomerun_video_get_local_port(struct hdhomerun_video_sock_t *vs); -+ -+/* -+ * Get the low-level socket handle. -+ */ -+extern int hdhomerun_video_get_sock(struct hdhomerun_video_sock_t *vs); -  - /* -  * Read data from buffer. -@@ -87,18 +69,12 @@ -  * The buffer is implemented as a ring buffer. It is possible for this function to return a small -  * amount of data when more is available due to the wrap-around case. -  */ --extern LIBTYPE uint8_t *hdhomerun_video_recv(struct hdhomerun_video_sock_t *vs, size_t max_size, size_t *pactual_size); -+extern uint8_t *hdhomerun_video_recv(struct hdhomerun_video_sock_t *vs, size_t max_size, size_t *pactual_size); -  - /* -  * Flush the buffer. -  */ --extern LIBTYPE void hdhomerun_video_flush(struct hdhomerun_video_sock_t *vs); -- --/* -- * Debug print internal stats. -- */ --extern LIBTYPE void hdhomerun_video_debug_print_stats(struct hdhomerun_video_sock_t *vs); --extern LIBTYPE void hdhomerun_video_get_stats(struct hdhomerun_video_sock_t *vs, struct hdhomerun_video_stats_t *stats); -+extern void hdhomerun_video_flush(struct hdhomerun_video_sock_t *vs); -  - #ifdef __cplusplus - } -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/lgpl.txt src/mythtv-0.21/libs/libmythtv/hdhomerun/lgpl.txt ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhomerun/lgpl.txt	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhomerun/lgpl.txt	2009-01-09 13:14:56.000000000 +1030 -@@ -1,165 +1,504 @@ --		   GNU LESSER GENERAL PUBLIC LICENSE --                       Version 3, 29 June 2007 -+		  GNU LESSER GENERAL PUBLIC LICENSE -+		       Version 2.1, February 1999 -  -- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> -+ 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 version of the GNU Lesser General Public License incorporates --the terms and conditions of version 3 of the GNU General Public --License, supplemented by the additional permissions listed below. -- --  0. Additional Definitions.  -- --  As used herein, "this License" refers to version 3 of the GNU Lesser --General Public License, and the "GNU GPL" refers to version 3 of the GNU --General Public License. -- --  "The Library" refers to a covered work governed by this License, --other than an Application or a Combined Work as defined below. -- --  An "Application" is any work that makes use of an interface provided --by the Library, but which is not otherwise based on the Library. --Defining a subclass of a class defined by the Library is deemed a mode --of using an interface provided by the Library. -- --  A "Combined Work" is a work produced by combining or linking an --Application with the Library.  The particular version of the Library --with which the Combined Work was made is also called the "Linked --Version". -- --  The "Minimal Corresponding Source" for a Combined Work means the --Corresponding Source for the Combined Work, excluding any source code --for portions of the Combined Work that, considered in isolation, are --based on the Application, and not on the Linked Version. -- --  The "Corresponding Application Code" for a Combined Work means the --object code and/or source code for the Application, including any data --and utility programs needed for reproducing the Combined Work from the --Application, but excluding the System Libraries of the Combined Work. -- --  1. Exception to Section 3 of the GNU GPL. -- --  You may convey a covered work under sections 3 and 4 of this License --without being bound by section 3 of the GNU GPL. -- --  2. Conveying Modified Versions. -- --  If you modify a copy of the Library, and, in your modifications, a --facility refers to a function or data to be supplied by an Application --that uses the facility (other than as an argument passed when the --facility is invoked), then you may convey a copy of the modified --version: -- --   a) under this License, provided that you make a good faith effort to --   ensure that, in the event an Application does not supply the --   function or data, the facility still operates, and performs --   whatever part of its purpose remains meaningful, or -- --   b) under the GNU GPL, with none of the additional permissions of --   this License applicable to that copy. -- --  3. Object Code Incorporating Material from Library Header Files. -- --  The object code form of an Application may incorporate material from --a header file that is part of the Library.  You may convey such object --code under terms of your choice, provided that, if the incorporated --material is not limited to numerical parameters, data structure --layouts and accessors, or small macros, inline functions and templates --(ten or fewer lines in length), you do both of the following: -- --   a) Give prominent notice with each copy of the object code that the --   Library is used in it and that the Library and its use are --   covered by this License. -- --   b) Accompany the object code with a copy of the GNU GPL and this license --   document. -- --  4. Combined Works. -- --  You may convey a Combined Work under terms of your choice that, --taken together, effectively do not restrict modification of the --portions of the Library contained in the Combined Work and reverse --engineering for debugging such modifications, if you also do each of --the following: -- --   a) Give prominent notice with each copy of the Combined Work that --   the Library is used in it and that the Library and its use are --   covered by this License. -- --   b) Accompany the Combined Work with a copy of the GNU GPL and this license --   document. -- --   c) For a Combined Work that displays copyright notices during --   execution, include the copyright notice for the Library among --   these notices, as well as a reference directing the user to the --   copies of the GNU GPL and this license document. -- --   d) Do one of the following: -- --       0) Convey the Minimal Corresponding Source under the terms of this --       License, and the Corresponding Application Code in a form --       suitable for, and under terms that permit, the user to --       recombine or relink the Application with a modified version of --       the Linked Version to produce a modified Combined Work, in the --       manner specified by section 6 of the GNU GPL for conveying --       Corresponding Source. -- --       1) Use a suitable shared library mechanism for linking with the --       Library.  A suitable mechanism is one that (a) uses at run time --       a copy of the Library already present on the user's computer --       system, and (b) will operate properly with a modified version --       of the Library that is interface-compatible with the Linked --       Version.  -- --   e) Provide Installation Information, but only if you would otherwise --   be required to provide such information under section 6 of the --   GNU GPL, and only to the extent that such information is --   necessary to install and execute a modified version of the --   Combined Work produced by recombining or relinking the --   Application with a modified version of the Linked Version. (If --   you use option 4d0, the Installation Information must accompany --   the Minimal Corresponding Source and Corresponding Application --   Code. If you use option 4d1, you must provide the Installation --   Information in the manner specified by section 6 of the GNU GPL --   for conveying Corresponding Source.) -- --  5. Combined Libraries. -- --  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 that are not Applications and are not covered by this --License, and convey such a combined library under terms of your --choice, if you do both of the following: -- --   a) Accompany the combined library with a copy of the same work based --   on the Library, uncombined with any other library facilities, --   conveyed under the terms of this License. -- --   b) Give prominent notice with the combined library that part of it --   is a work based on the Library, and explaining where to find the --   accompanying uncombined form of the same work. -- --  6. Revised Versions of the GNU Lesser General Public License. -- --  The Free Software Foundation may publish revised and/or new versions --of the GNU 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 as you received it specifies that a certain numbered version --of the GNU Lesser General Public License "or any later version" --applies to it, you have the option of following the terms and --conditions either of that published version or of any later version --published by the Free Software Foundation. If the Library as you --received it does not specify a version number of the GNU Lesser --General Public License, you may choose any version of the GNU Lesser --General Public License ever published by the Free Software Foundation. -- --  If the Library as you received it specifies that a proxy can decide --whether future versions of the GNU Lesser General Public License shall --apply, that proxy's public statement of acceptance of any version is --permanent authorization for you to choose that version for the -+[This is the first released version of the Lesser GPL.  It also counts -+ as the successor of the GNU Library Public License, version 2, hence -+ the version number 2.1.] -+ -+			    Preamble -+ -+  The licenses for most software are designed to take away your -+freedom to share and change it.  By contrast, the GNU General Public -+Licenses are intended to guarantee your freedom to share and change -+free software--to make sure the software is free for all its users. -+ -+  This license, the Lesser General Public License, applies to some -+specially designated software packages--typically libraries--of the -+Free Software Foundation and other authors who decide to use it.  You -+can use it too, but we suggest you first think carefully about whether -+this license or the ordinary General Public License is the better -+strategy to use in any particular case, based on the explanations below. -+ -+  When we speak of free software, we are referring to freedom of use, -+not price.  Our General Public Licenses are designed to make sure that -+you have the freedom to distribute copies of free software (and charge -+for this service if you wish); that you receive source code or can get -+it if you want it; that you can change the software and use pieces of -+it in new free programs; and that you are informed that you can do -+these things. -+ -+  To protect your rights, we need to make restrictions that forbid -+distributors to deny you these rights or to ask you to surrender these -+rights.  These restrictions translate to certain responsibilities for -+you if you distribute copies of the library or if you modify it. -+ -+  For example, if you distribute copies of the library, whether gratis -+or for a fee, you must give the recipients all the rights that we gave -+you.  You must make sure that they, too, receive or can get the source -+code.  If you link other code with the library, you must provide -+complete object files to the recipients, so that they can relink them -+with the library after making changes to the library and recompiling -+it.  And you must show them these terms so they know their rights. -+ -+  We protect your rights with a two-step method: (1) we copyright the -+library, and (2) we offer you this license, which gives you legal -+permission to copy, distribute and/or modify the library. -+ -+  To protect each distributor, we want to make it very clear that -+there is no warranty for the free library.  Also, if the library is -+modified by someone else and passed on, the recipients should know -+that what they have is not the original version, so that the original -+author's reputation will not be affected by problems that might be -+introduced by others. -+ -+  Finally, software patents pose a constant threat to the existence of -+any free program.  We wish to make sure that a company cannot -+effectively restrict the users of a free program by obtaining a -+restrictive license from a patent holder.  Therefore, we insist that -+any patent license obtained for a version of the library must be -+consistent with the full freedom of use specified in this license. -+ -+  Most GNU software, including some libraries, is covered by the -+ordinary GNU General Public License.  This license, the GNU Lesser -+General Public License, applies to certain designated libraries, and -+is quite different from the ordinary General Public License.  We use -+this license for certain libraries in order to permit linking those -+libraries into non-free programs. -+ -+  When a program is linked with a library, whether statically or using -+a shared library, the combination of the two is legally speaking a -+combined work, a derivative of the original library.  The ordinary -+General Public License therefore permits such linking only if the -+entire combination fits its criteria of freedom.  The Lesser General -+Public License permits more lax criteria for linking other code with -+the library. -+ -+  We call this license the "Lesser" General Public License because it -+does Less to protect the user's freedom than the ordinary General -+Public License.  It also provides other free software developers Less -+of an advantage over competing non-free programs.  These disadvantages -+are the reason we use the ordinary General Public License for many -+libraries.  However, the Lesser license provides advantages in certain -+special circumstances. -+ -+  For example, on rare occasions, there may be a special need to -+encourage the widest possible use of a certain library, so that it becomes -+a de-facto standard.  To achieve this, non-free programs must be -+allowed to use the library.  A more frequent case is that a free -+library does the same job as widely used non-free libraries.  In this -+case, there is little to gain by limiting the free library to free -+software only, so we use the Lesser General Public License. -+ -+  In other cases, permission to use a particular library in non-free -+programs enables a greater number of people to use a large body of -+free software.  For example, permission to use the GNU C Library in -+non-free programs enables many more people to use the whole GNU -+operating system, as well as its variant, the GNU/Linux operating -+system. -+ -+  Although the Lesser General Public License is Less protective of the -+users' freedom, it does ensure that the user of a program that is -+linked with the Library has the freedom and the wherewithal to run -+that program using a modified version of the Library. -+ -+  The precise terms and conditions for copying, distribution and -+modification follow.  Pay close attention to the difference between a -+"work based on the library" and a "work that uses the library".  The -+former contains code derived from the library, whereas the latter must -+be combined with the library in order to run. -+ -+		  GNU LESSER GENERAL PUBLIC LICENSE -+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -+ -+  0. This License Agreement applies to any software library or other -+program which contains a notice placed by the copyright holder or -+other authorized party saying it may be distributed under the terms of -+this Lesser General Public License (also called "this License"). -+Each licensee is addressed as "you". -+ -+  A "library" means a collection of software functions and/or data -+prepared so as to be conveniently linked with application programs -+(which use some of those functions and data) to form executables. -+ -+  The "Library", below, refers to any such software library or work -+which has been distributed under these terms.  A "work based on the -+Library" means either the Library or any derivative work under -+copyright law: that is to say, a work containing the Library or a -+portion of it, either verbatim or with modifications and/or translated -+straightforwardly into another language.  (Hereinafter, translation is -+included without limitation in the term "modification".) -+ -+  "Source code" for a work means the preferred form of the work for -+making modifications to it.  For a library, complete source code means -+all the source code for all modules it contains, plus any associated -+interface definition files, plus the scripts used to control compilation -+and installation of the library. -+ -+  Activities other than copying, distribution and modification are not -+covered by this License; they are outside its scope.  The act of -+running a program using the Library is not restricted, and output from -+such a program is covered only if its contents constitute a work based -+on the Library (independent of the use of the Library in a tool for -+writing it).  Whether that is true depends on what the Library does -+and what the program that uses the Library does. -+   -+  1. You may copy and distribute verbatim copies of the Library's -+complete source code as you receive it, in any medium, provided that -+you conspicuously and appropriately publish on each copy an -+appropriate copyright notice and disclaimer of warranty; keep intact -+all the notices that refer to this License and to the absence of any -+warranty; and distribute a copy of this License along with the - Library. -+ -+  You may charge a fee for the physical act of transferring a copy, -+and you may at your option offer warranty protection in exchange for a -+fee. -+ -+  2. You may modify your copy or copies of the Library or any portion -+of it, thus forming a work based on the Library, and copy and -+distribute such modifications or work under the terms of Section 1 -+above, provided that you also meet all of these conditions: -+ -+    a) The modified work must itself be a software library. -+ -+    b) You must cause the files modified to carry prominent notices -+    stating that you changed the files and the date of any change. -+ -+    c) You must cause the whole of the work to be licensed at no -+    charge to all third parties under the terms of this License. -+ -+    d) If a facility in the modified Library refers to a function or a -+    table of data to be supplied by an application program that uses -+    the facility, other than as an argument passed when the facility -+    is invoked, then you must make a good faith effort to ensure that, -+    in the event an application does not supply such function or -+    table, the facility still operates, and performs whatever part of -+    its purpose remains meaningful. -+ -+    (For example, a function in a library to compute square roots has -+    a purpose that is entirely well-defined independent of the -+    application.  Therefore, Subsection 2d requires that any -+    application-supplied function or table used by this function must -+    be optional: if the application does not supply it, the square -+    root function must still compute square roots.) -+ -+These requirements apply to the modified work as a whole.  If -+identifiable sections of that work are not derived from the Library, -+and can be reasonably considered independent and separate works in -+themselves, then this License, and its terms, do not apply to those -+sections when you distribute them as separate works.  But when you -+distribute the same sections as part of a whole which is a work based -+on the Library, the distribution of the whole must be on the terms of -+this License, whose permissions for other licensees extend to the -+entire whole, and thus to each and every part regardless of who wrote -+it. -+ -+Thus, it is not the intent of this section to claim rights or contest -+your rights to work written entirely by you; rather, the intent is to -+exercise the right to control the distribution of derivative or -+collective works based on the Library. -+ -+In addition, mere aggregation of another work not based on the Library -+with the Library (or with a work based on the Library) on a volume of -+a storage or distribution medium does not bring the other work under -+the scope of this License. -+ -+  3. You may opt to apply the terms of the ordinary GNU General Public -+License instead of this License to a given copy of the Library.  To do -+this, you must alter all the notices that refer to this License, so -+that they refer to the ordinary GNU General Public License, version 2, -+instead of to this License.  (If a newer version than version 2 of the -+ordinary GNU General Public License has appeared, then you can specify -+that version instead if you wish.)  Do not make any other change in -+these notices. -+ -+  Once this change is made in a given copy, it is irreversible for -+that copy, so the ordinary GNU General Public License applies to all -+subsequent copies and derivative works made from that copy. -+ -+  This option is useful when you wish to copy part of the code of -+the Library into a program that is not a library. -+ -+  4. You may copy and distribute the Library (or a portion or -+derivative of it, under Section 2) in object code or executable form -+under the terms of Sections 1 and 2 above provided that you accompany -+it with the complete corresponding machine-readable source code, which -+must be distributed under the terms of Sections 1 and 2 above on a -+medium customarily used for software interchange. -+ -+  If distribution of object code is made by offering access to copy -+from a designated place, then offering equivalent access to copy the -+source code from the same place satisfies the requirement to -+distribute the source code, even though third parties are not -+compelled to copy the source along with the object code. -+ -+  5. A program that contains no derivative of any portion of the -+Library, but is designed to work with the Library by being compiled or -+linked with it, is called a "work that uses the Library".  Such a -+work, in isolation, is not a derivative work of the Library, and -+therefore falls outside the scope of this License. -+ -+  However, linking a "work that uses the Library" with the Library -+creates an executable that is a derivative of the Library (because it -+contains portions of the Library), rather than a "work that uses the -+library".  The executable is therefore covered by this License. -+Section 6 states terms for distribution of such executables. -+ -+  When a "work that uses the Library" uses material from a header file -+that is part of the Library, the object code for the work may be a -+derivative work of the Library even though the source code is not. -+Whether this is true is especially significant if the work can be -+linked without the Library, or if the work is itself a library.  The -+threshold for this to be true is not precisely defined by law. -+ -+  If such an object file uses only numerical parameters, data -+structure layouts and accessors, and small macros and small inline -+functions (ten lines or less in length), then the use of the object -+file is unrestricted, regardless of whether it is legally a derivative -+work.  (Executables containing this object code plus portions of the -+Library will still fall under Section 6.) -+ -+  Otherwise, if the work is a derivative of the Library, you may -+distribute the object code for the work under the terms of Section 6. -+Any executables containing that work also fall under Section 6, -+whether or not they are linked directly with the Library itself. -+ -+  6. As an exception to the Sections above, you may also combine or -+link a "work that uses the Library" with the Library to produce a -+work containing portions of the Library, and distribute that work -+under terms of your choice, provided that the terms permit -+modification of the work for the customer's own use and reverse -+engineering for debugging such modifications. -+ -+  You must give prominent notice with each copy of the work that the -+Library is used in it and that the Library and its use are covered by -+this License.  You must supply a copy of this License.  If the work -+during execution displays copyright notices, you must include the -+copyright notice for the Library among them, as well as a reference -+directing the user to the copy of this License.  Also, you must do one -+of these things: -+ -+    a) Accompany the work with the complete corresponding -+    machine-readable source code for the Library including whatever -+    changes were used in the work (which must be distributed under -+    Sections 1 and 2 above); and, if the work is an executable linked -+    with the Library, with the complete machine-readable "work that -+    uses the Library", as object code and/or source code, so that the -+    user can modify the Library and then relink to produce a modified -+    executable containing the modified Library.  (It is understood -+    that the user who changes the contents of definitions files in the -+    Library will not necessarily be able to recompile the application -+    to use the modified definitions.) -+ -+    b) Use a suitable shared library mechanism for linking with the -+    Library.  A suitable mechanism is one that (1) uses at run time a -+    copy of the library already present on the user's computer system, -+    rather than copying library functions into the executable, and (2) -+    will operate properly with a modified version of the library, if -+    the user installs one, as long as the modified version is -+    interface-compatible with the version that the work was made with. -+ -+    c) Accompany the work with a written offer, valid for at -+    least three years, to give the same user the materials -+    specified in Subsection 6a, above, for a charge no more -+    than the cost of performing this distribution. -+ -+    d) If distribution of the work is made by offering access to copy -+    from a designated place, offer equivalent access to copy the above -+    specified materials from the same place. -+ -+    e) Verify that the user has already received a copy of these -+    materials or that you have already sent this user a copy. -+ -+  For an executable, the required form of the "work that uses the -+Library" must include any data and utility programs needed for -+reproducing the executable from it.  However, as a special exception, -+the materials to be distributed need not include anything that is -+normally distributed (in either source or binary form) with the major -+components (compiler, kernel, and so on) of the operating system on -+which the executable runs, unless that component itself accompanies -+the executable. -+ -+  It may happen that this requirement contradicts the license -+restrictions of other proprietary libraries that do not normally -+accompany the operating system.  Such a contradiction means you cannot -+use both them and the Library together in an executable that you -+distribute. -+ -+  7. You may place library facilities that are a work based on the -+Library side-by-side in a single library together with other library -+facilities not covered by this License, and distribute such a combined -+library, provided that the separate distribution of the work based on -+the Library and of the other library facilities is otherwise -+permitted, and provided that you do these two things: -+ -+    a) Accompany the combined library with a copy of the same work -+    based on the Library, uncombined with any other library -+    facilities.  This must be distributed under the terms of the -+    Sections above. -+ -+    b) Give prominent notice with the combined library of the fact -+    that part of it is a work based on the Library, and explaining -+    where to find the accompanying uncombined form of the same work. -+ -+  8. You may not copy, modify, sublicense, link with, or distribute -+the Library except as expressly provided under this License.  Any -+attempt otherwise to copy, modify, sublicense, link with, or -+distribute the Library is void, and will automatically terminate your -+rights under this License.  However, parties who have received copies, -+or rights, from you under this License will not have their licenses -+terminated so long as such parties remain in full compliance. -+ -+  9. You are not required to accept this License, since you have not -+signed it.  However, nothing else grants you permission to modify or -+distribute the Library or its derivative works.  These actions are -+prohibited by law if you do not accept this License.  Therefore, by -+modifying or distributing the Library (or any work based on the -+Library), you indicate your acceptance of this License to do so, and -+all its terms and conditions for copying, distributing or modifying -+the Library or works based on it. -+ -+  10. Each time you redistribute the Library (or any work based on the -+Library), the recipient automatically receives a license from the -+original licensor to copy, distribute, link with or modify the Library -+subject to these terms and conditions.  You may not impose any further -+restrictions on the recipients' exercise of the rights granted herein. -+You are not responsible for enforcing compliance by third parties with -+this License. -+ -+  11. If, as a consequence of a court judgment or allegation of patent -+infringement or for any other reason (not limited to patent issues), -+conditions are imposed on you (whether by court order, agreement or -+otherwise) that contradict the conditions of this License, they do not -+excuse you from the conditions of this License.  If you cannot -+distribute so as to satisfy simultaneously your obligations under this -+License and any other pertinent obligations, then as a consequence you -+may not distribute the Library at all.  For example, if a patent -+license would not permit royalty-free redistribution of the Library by -+all those who receive copies directly or indirectly through you, then -+the only way you could satisfy both it and this License would be to -+refrain entirely from distribution of the Library. -+ -+If any portion of this section is held invalid or unenforceable under any -+particular circumstance, the balance of the section is intended to apply, -+and the section as a whole is intended to apply in other circumstances. -+ -+It is not the purpose of this section to induce you to infringe any -+patents or other property right claims or to contest validity of any -+such claims; this section has the sole purpose of protecting the -+integrity of the free software distribution system which is -+implemented by public license practices.  Many people have made -+generous contributions to the wide range of software distributed -+through that system in reliance on consistent application of that -+system; it is up to the author/donor to decide if he or she is willing -+to distribute software through any other system and a licensee cannot -+impose that choice. -+ -+This section is intended to make thoroughly clear what is believed to -+be a consequence of the rest of this License. -+ -+  12. If the distribution and/or use of the Library is restricted in -+certain countries either by patents or by copyrighted interfaces, the -+original copyright holder who places the Library under this License may add -+an explicit geographical distribution limitation excluding those countries, -+so that distribution is permitted only in or among countries not thus -+excluded.  In such case, this License incorporates the limitation as if -+written in the body of this License. -+ -+  13. The Free Software Foundation may publish revised and/or new -+versions of the Lesser General Public License from time to time. -+Such new versions will be similar in spirit to the present version, -+but may differ in detail to address new problems or concerns. -+ -+Each version is given a distinguishing version number.  If the Library -+specifies a version number of this License which applies to it and -+"any later version", you have the option of following the terms and -+conditions either of that version or of any later version published by -+the Free Software Foundation.  If the Library does not specify a -+license version number, you may choose any version ever published by -+the Free Software Foundation. -+ -+  14. If you wish to incorporate parts of the Library into other free -+programs whose distribution conditions are incompatible with these, -+write to the author to ask for permission.  For software which is -+copyrighted by the Free Software Foundation, write to the Free -+Software Foundation; we sometimes make exceptions for this.  Our -+decision will be guided by the two goals of preserving the free status -+of all derivatives of our free software and of promoting the sharing -+and reuse of software generally. -+ -+			    NO WARRANTY -+ -+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -+ -+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -+DAMAGES. -+ -+		     END OF TERMS AND CONDITIONS -+ -+           How to Apply These Terms to Your New Libraries -+ -+  If you develop a new library, and you want it to be of the greatest -+possible use to the public, we recommend making it free software that -+everyone can redistribute and change.  You can do so by permitting -+redistribution under these terms (or, alternatively, under the terms of the -+ordinary General Public License). -+ -+  To apply these terms, attach the following notices to the library.  It is -+safest to attach them to the start of each source file to most effectively -+convey the exclusion of warranty; and each file should have at least the -+"copyright" line and a pointer to where the full notice is found. -+ -+    <one line to give the library's name and a brief idea of what it does.> -+    Copyright (C) <year>  <name of author> -+ -+    This library is free software; you can redistribute it and/or -+    modify it under the terms of the GNU Lesser General Public -+    License as published by the Free Software Foundation; either -+    version 2.1 of the License, or (at your option) any later version. -+ -+    This library is distributed in the hope that it will be useful, -+    but WITHOUT ANY WARRANTY; without even the implied warranty of -+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -+    Lesser General Public License for more details. -+ -+    You should have received a copy of the GNU Lesser General Public -+    License along with this library; if not, write to the Free Software -+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA -+ -+Also add information on how to contact you by electronic and paper mail. -+ -+You should also get your employer (if you work as a programmer) or your -+school, if any, to sign a "copyright disclaimer" for the library, if -+necessary.  Here is a sample; alter the names: -+ -+  Yoyodyne, Inc., hereby disclaims all copyright interest in the -+  library `Frob' (a library for tweaking knobs) written by James Random Hacker. -+ -+  <signature of Ty Coon>, 1 April 1990 -+  Ty Coon, President of Vice -+ -+That's all there is to it! -+ -+ -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhrchannel.cpp src/mythtv-0.21/libs/libmythtv/hdhrchannel.cpp ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhrchannel.cpp	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhrchannel.cpp	2009-01-09 13:14:58.000000000 +1030 -@@ -1,6 +1,6 @@ - /** -- *  HDHRChannel -- *  Copyright (c) 2006-2009 by Silicondust Engineering Ltd. -+ *  DBox2Channel -+ *  Copyright (c) 2006 by Silicondust Engineering Ltd. -  *  Distributed as part of MythTV under GPL v2 and later. -  */ -  -@@ -24,6 +24,7 @@ - #include "hdhrchannel.h" - #include "videosource.h" - #include "channelutil.h" -+#include "frequencytables.h" -  - #define DEBUG_PID_FILTERS -  -@@ -31,7 +32,7 @@ - #define LOC_ERR QString("HDHRChan(%1), Error: ").arg(GetDevice()) -  - HDHRChannel::HDHRChannel(TVRec *parent, const QString &device, uint tuner) --    : DTVChannel(parent),       _hdhomerun_device(NULL), -+    : DTVChannel(parent),       _control_socket(NULL), -       _device_id(0),            _device_ip(0), -       _tuner(tuner),            _lock(true) - { -@@ -41,8 +42,6 @@ -     if (valid && hdhomerun_discover_validate_device_id(_device_id)) - 	return; -  --    _device_id = HDHOMERUN_DEVICE_ID_WILDCARD; -- -     /* Otherwise, is it a valid IP address? */ -     struct in_addr address; -     if (inet_aton(device, &address))  -@@ -55,6 +54,7 @@ -     VERBOSE(VB_IMPORTANT, LOC_ERR + QString("Invalid DeviceID '%1'") - 	    .arg(device)); -  -+    _device_id = HDHOMERUN_DEVICE_ID_WILDCARD; - } -  - HDHRChannel::~HDHRChannel(void) -@@ -67,38 +67,77 @@ -     if (IsOpen()) -         return true; -  -+    if (!FindDevice()) -+        return false; -+ -     if (!InitializeInputs()) -         return false; -  --    return Connect(); -+    return (_device_ip != 0) && Connect(); - } -  - void HDHRChannel::Close(void) - { --    if (_hdhomerun_device) -+    if (_control_socket) -     { --        hdhomerun_device_destroy(_hdhomerun_device); --        _hdhomerun_device = NULL; -+        hdhomerun_control_destroy(_control_socket); -+        _control_socket = NULL; -     } - } -  - bool HDHRChannel::EnterPowerSavingMode(void) - { --    return hdhomerun_device_set_tuner_channel(_hdhomerun_device, "none") > 0; -+    return QString::null != TunerSet("channel", "none", false); -+} -+ -+bool HDHRChannel::FindDevice(void) -+{ -+    if (!_device_id) -+        return _device_ip; -+ -+    _device_ip = 0; -+ -+    /* Discover. */ -+    struct hdhomerun_discover_device_t result; -+    int ret = hdhomerun_discover_find_device(_device_id, &result); -+    if (ret < 0) -+    { -+        VERBOSE(VB_IMPORTANT, LOC_ERR + "Unable to send discovery request" + ENO); -+        return false; -+    } -+    if (ret == 0) -+    { -+        VERBOSE(VB_IMPORTANT, LOC_ERR + QString("device not found")); -+        return false; -+    } -+ -+    /* Found. */ -+    _device_ip = result.ip_addr; -+ -+    VERBOSE(VB_IMPORTANT, LOC + -+            QString("device found at address %1.%2.%3.%4") -+            .arg((_device_ip>>24) & 0xFF).arg((_device_ip>>16) & 0xFF) -+            .arg((_device_ip>> 8) & 0xFF).arg((_device_ip>> 0) & 0xFF)); -+ -+    return true; - } -  - bool HDHRChannel::Connect(void) - { --    _hdhomerun_device = hdhomerun_device_create( --        _device_id, _device_ip, _tuner, NULL); -+    _control_socket = hdhomerun_control_create(_device_id, _device_ip); -+    if (!_control_socket) -+    { -+        VERBOSE(VB_IMPORTANT, LOC_ERR + "Unable to create control socket"); -+        return false; -+    } -  --    if (!_hdhomerun_device) -+    if (hdhomerun_control_get_local_addr(_control_socket) == 0) -     { --        VERBOSE(VB_IMPORTANT, --                LOC_ERR + "Unable to create hdhomerun device object"); -+        VERBOSE(VB_IMPORTANT, LOC_ERR + "Unable to connect to device"); -         return false; -     } -  -+    VERBOSE(VB_CHANNEL, LOC + "Successfully connected to device"); -     return true; - } -  -@@ -106,7 +145,7 @@ - { -     QMutexLocker locker(&_lock); -  --    if (!_hdhomerun_device) -+    if (!_control_socket) -     { -         VERBOSE(VB_IMPORTANT, LOC_ERR + "Get request failed (not connected)"); -         return QString::null; -@@ -114,7 +153,7 @@ -  -     char *value = NULL; -     char *error = NULL; --    if (hdhomerun_device_get_var(_hdhomerun_device, name, &value, &error) < 0) -+    if (hdhomerun_control_get(_control_socket, name, &value, &error) < 0) -     { -         VERBOSE(VB_IMPORTANT, LOC_ERR + "Get request failed" + ENO); -         return QString::null; -@@ -136,7 +175,7 @@ - { -     QMutexLocker locker(&_lock); -  --    if (!_hdhomerun_device) -+    if (!_control_socket) -     { -         VERBOSE(VB_IMPORTANT, LOC_ERR + "Set request failed (not connected)"); -         return QString::null; -@@ -144,8 +183,7 @@ -  -     char *value = NULL; -     char *error = NULL; --    if (hdhomerun_device_set_var( --            _hdhomerun_device, name, val, &value, &error) < 0) -+    if (hdhomerun_control_set(_control_socket, name, val, &value, &error) < 0) -     { -         VERBOSE(VB_IMPORTANT, LOC_ERR + "Set request failed" + ENO); -  -@@ -163,11 +201,6 @@ -     return QString(value); - } -  --struct hdhomerun_device_t *HDHRChannel::GetHDHRDevice(void) --{ --	return _hdhomerun_device; --} -- - QString HDHRChannel::TunerGet(const QString &name, bool report_error_return) - { -     return DeviceGet(QString("/tuner%1/%2").arg(_tuner).arg(name), -@@ -188,8 +221,7 @@ -         return false; -     } -  --    unsigned long localIP = hdhomerun_device_get_local_machine_addr( --        _hdhomerun_device); -+    unsigned long localIP = hdhomerun_control_get_local_addr(_control_socket); -     if (localIP == 0) -     { -         return false; -@@ -200,7 +232,7 @@ -         .arg((localIP >>  8) & 0xFF).arg((localIP >>  0) & 0xFF) -         .arg(localPort); -  --    if (hdhomerun_device_set_tuner_target(_hdhomerun_device, configValue) <= 0)  -+    if (!TunerSet("target", configValue)) -     { -         return false; -     } -@@ -208,9 +240,9 @@ -     return true; - } -  --bool HDHRChannel::DeviceClearTarget(void) -+bool HDHRChannel::DeviceClearTarget() - { --    return hdhomerun_device_set_tuner_target(_hdhomerun_device, "none") > 0; -+    return TunerSet("target", "0.0.0.0:0"); - } -  - bool HDHRChannel::SetChannelByString(const QString &channum) -@@ -316,8 +348,7 @@ -     if (mpeg_prog_num && (GetTuningMode() == "mpeg")) -     { -         QString pnum = QString::number(mpeg_prog_num); --        _ignore_filters = (hdhomerun_device_set_tuner_program( --                               _hdhomerun_device, pnum) > 0); -+        _ignore_filters = QString::null != TunerSet("program", pnum, false); -     } -  -     return true; -@@ -360,27 +391,22 @@ - bool HDHRChannel::Tune(uint frequency, QString /*input*/, -                        QString modulation, QString si_std) - { --    // Convert dtv_multiplex.modulation strings to something the HDHR can use: --    modulation.replace("qam_", "qam");  // e.g. qam_256 -> qam256 --#if 0 --    if (modulation == "qamauto") --        modulation = "qam";             // "auto" works just as well? --#endif -- --    if (modulation.isEmpty()) --        modulation = "auto"; -+    bool ok = false; -  --    QString chan = modulation + ':' + QString::number(frequency); -+    VERBOSE(VB_CHANNEL, LOC + -+            QString("TuneTo(%1,%2)").arg(frequency).arg(modulation)); -  --    VERBOSE(VB_CHANNEL, LOC + "Tune()ing to " + chan); -+    if (modulation == "8vsb") -+        ok = TunerSet("channel", QString("8vsb:%1").arg(frequency)); -+    else if (modulation == "qam_64") -+        ok = TunerSet("channel", QString("qam64:%1").arg(frequency)); -+    else if (modulation == "qam_256") -+        ok = TunerSet("channel", QString("qam256:%1").arg(frequency)); -  --    if (hdhomerun_device_set_tuner_channel(_hdhomerun_device, chan) > 0) --    { -+    if (ok) -         SetSIStandard(si_std); --        return true; --    } -  --    return false; -+    return ok; - } -  - bool HDHRChannel::AddPID(uint pid, bool do_update) -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhrchannel.h src/mythtv-0.21/libs/libmythtv/hdhrchannel.h ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhrchannel.h	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhrchannel.h	2009-01-09 13:14:58.000000000 +1030 -@@ -39,7 +39,7 @@ -     bool SetChannelByString(const QString &chan); -  -     // Gets --    bool IsOpen(void) const { return (_hdhomerun_device != NULL); } -+    bool IsOpen(void) const { return (_control_socket != NULL); } -     QString GetDevice(void) const -         { return QString("%1/%2").arg(_device_id, 8, 16).arg(_tuner); } -     vector<uint> GetPIDs(void) const -@@ -57,13 +57,11 @@ -     bool Tune(const DTVMultiplex &tuning, QString inputname); -  -   private: -+    bool FindDevice(void); -     bool Connect(void); -     bool Tune(uint frequency, QString inputname, -               QString modulation, QString si_std); -  -- --    struct hdhomerun_device_t *GetHDHRDevice(void); -- -     bool DeviceSetTarget(unsigned short localPort); -     bool DeviceClearTarget(void); -  -@@ -76,7 +74,7 @@ -                      bool report_error_return = true); -  -   private: --    struct hdhomerun_device_t *_hdhomerun_device; -+    hdhr_socket_t  *_control_socket; -     uint            _device_id; -     uint            _device_ip; -     uint            _tuner; -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhrrecorder.cpp src/mythtv-0.21/libs/libmythtv/hdhrrecorder.cpp ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhrrecorder.cpp	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhrrecorder.cpp	2009-01-22 18:52:43.000000000 +1030 -@@ -1,6 +1,6 @@ - /** -*- Mode: c++ -*- -  *  HDHRRecorder -- *  Copyright (c) 2006-2009 by Silicondust Engineering Ltd, and -+ *  Copyright (c) 2006 by Silicondust Engineering Ltd, and -  *    Daniel Thor Kristjansson -  *  Distributed as part of MythTV under GPL v2 and later. -  */ -@@ -27,7 +27,6 @@ - #include "hdhrrecorder.h" - #include "atsctables.h" - #include "atscstreamdata.h" --#include "dvbstreamdata.h" - #include "eithelper.h" - #include "tv_rec.h" -  -@@ -110,7 +109,7 @@ -     buffersize = max(49 * TSPacket::SIZE * 128, buffersize); -  -     /* Create TS socket. */ --    _video_socket = hdhomerun_video_create(0, buffersize, NULL); -+    _video_socket = hdhomerun_video_create(0, buffersize); -     if (!_video_socket) -     { -         VERBOSE(VB_IMPORTANT, LOC + "Open() failed to open socket"); -@@ -177,13 +176,10 @@ -         data->AddMPEGListener(this); -  -         ATSCStreamData *atsc = dynamic_cast<ATSCStreamData*>(data); --        DVBStreamData  *dvb  = dynamic_cast<DVBStreamData*>(data); -  -         if (atsc && atsc->DesiredMinorChannel()) -             atsc->SetDesiredChannel(atsc->DesiredMajorChannel(), -                                     atsc->DesiredMinorChannel()); --        else if (dvb) --            dvb->AddDVBMainListener(this); -         else if (data->DesiredProgram() >= 0) -             data->SetDesiredProgram(data->DesiredProgram()); -     } -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhrsignalmonitor.cpp src/mythtv-0.21/libs/libmythtv/hdhrsignalmonitor.cpp ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/hdhrsignalmonitor.cpp	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/hdhrsignalmonitor.cpp	2009-01-09 13:14:58.000000000 +1030 -@@ -139,17 +139,19 @@ - { -     dtvMonitorRunning = true; -  --    HDHRChannel *hdrc = dynamic_cast<HDHRChannel*>(channel); --    struct hdhomerun_device_t *_hdhomerun_device = hdrc->GetHDHRDevice(); -- --    if (!_hdhomerun_device) -+    struct hdhomerun_video_sock_t *_video_socket; -+    _video_socket = hdhomerun_video_create(0, VIDEO_DATA_BUFFER_SIZE_1S); -+    if (!_video_socket) -     { --        VERBOSE(VB_IMPORTANT, "Failed to get HDHomeRun device handle"); -+        VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to get video socket"); -         return; -     } -  --    if (!hdhomerun_device_stream_start(_hdhomerun_device)) -+    HDHRChannel *hdrc = dynamic_cast<HDHRChannel*>(channel); -+    uint localPort = hdhomerun_video_get_local_port(_video_socket); -+    if (!hdrc->DeviceSetTarget(localPort)) -     { -+        hdhomerun_video_destroy(_video_socket); -         VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to set target"); -         return; -     } -@@ -164,7 +166,7 @@ -  -         size_t data_length; -         unsigned char *data_buffer = --            hdhomerun_device_stream_recv(_hdhomerun_device, -+            hdhomerun_video_recv(_video_socket, -                                          VIDEO_DATA_BUFFER_SIZE_1S / 5, -                                          &data_length); -  -@@ -177,7 +179,8 @@ -         usleep(2500); -     } -  --    hdhomerun_device_stream_stop(_hdhomerun_device); -+    hdrc->DeviceClearTarget(); -+    hdhomerun_video_destroy(_video_socket); -  -     VERBOSE(VB_CHANNEL, LOC + "RunTableMonitor(): -- shutdown"); -  -@@ -212,15 +215,16 @@ -         return; -     } -  --    HDHRChannel *hdrc = dynamic_cast<HDHRChannel*>(channel); --    struct hdhomerun_device_t *_hdhomerun_device = hdrc->GetHDHRDevice(); --    struct hdhomerun_tuner_status_t status; --    hdhomerun_device_get_tuner_status(_hdhomerun_device, NULL, &status); -- --    uint sig = status.signal_strength; --    uint snq = status.signal_to_noise_quality; --    uint seq = status.symbol_error_quality; -- -+    QString msg = ((HDHRChannel*)channel)->TunerGet("status"); -+    //ss  = signal strength,        [0,100] -+    //snq = signal to noise quality [0,100] -+    //seq = signal error quality    [0,100] -+    int loc_sig = msg.find("ss="),  loc_snq = msg.find("snq="); -+    int loc_seq = msg.find("seq="), loc_end = msg.length(); -+    bool ok0, ok1, ok2; -+    uint sig = msg.mid(loc_sig + 3, loc_snq - loc_sig - 4).toUInt(&ok0); -+    uint snq = msg.mid(loc_snq + 4, loc_seq - loc_snq - 5).toUInt(&ok1); -+    uint seq = msg.mid(loc_seq + 4, loc_end - loc_seq - 4).toUInt(&ok2); -     (void) snq; // TODO should convert to S/N -     (void) seq; // TODO should report this... -  -@@ -232,8 +236,9 @@ -     bool isLocked = false; -     { -         QMutexLocker locker(&statusLock); --        signalStrength.SetValue(sig); --        signalLock.SetValue(status.lock_supported); -+        if (loc_sig > 0 && loc_snq > 0 && ok0) -+            signalStrength.SetValue(sig); -+        signalLock.SetValue(signalStrength.IsGood() ? 1 : 0); -         isLocked = signalLock.IsGood(); -     } -  -diff -aur branches/release-0-21-fixes/mythtv/libs/libmythtv/libmythtv.pro src/mythtv-0.21/libs/libmythtv/libmythtv.pro ---- branches/release-0-21-fixes/mythtv/libs/libmythtv/libmythtv.pro	2009-07-13 15:44:12.000000000 +0930 -+++ src/mythtv-0.21/libs/libmythtv/libmythtv.pro	2009-01-09 13:14:58.000000000 +1030 -@@ -459,28 +459,12 @@ -         DEFINES += USING_HDHOMERUN -  -         # HDHomeRun library --        HEADERS += hdhomerun/hdhomerun.h -+        HEADERS += hdhomerun/hdhomerun_pkt.h   hdhomerun/hdhomerun_discover.h -+        HEADERS += hdhomerun/hdhomerun_video.h hdhomerun/hdhomerun_control.h -         HEADERS += hdhomerun/hdhomerun_os.h --        HEADERS += hdhomerun/hdhomerun_os_posix.h --        HEADERS += hdhomerun/hdhomerun_os_windows.h --        HEADERS += hdhomerun/hdhomerun_channelscan.h --        HEADERS += hdhomerun/hdhomerun_channels.h --        HEADERS += hdhomerun/hdhomerun_control.h --        HEADERS += hdhomerun/hdhomerun_debug.h --        HEADERS += hdhomerun/hdhomerun_pkt.h --        HEADERS += hdhomerun/hdhomerun_device.h --        HEADERS += hdhomerun/hdhomerun_types.h --        HEADERS += hdhomerun/hdhomerun_discover.h --        HEADERS += hdhomerun/hdhomerun_video.h -- --        SOURCES += hdhomerun/hdhomerun_pkt.c --        SOURCES += hdhomerun/hdhomerun_debug.c --        SOURCES += hdhomerun/hdhomerun_discover.c --        SOURCES += hdhomerun/hdhomerun_channels.c --        SOURCES += hdhomerun/hdhomerun_channelscan.c --        SOURCES += hdhomerun/hdhomerun_control.c --        SOURCES += hdhomerun/hdhomerun_video.c --        SOURCES += hdhomerun/hdhomerun_device.c -+ -+        SOURCES += hdhomerun/hdhomerun_pkt.c   hdhomerun/hdhomerun_discover.c -+        SOURCES += hdhomerun/hdhomerun_video.c hdhomerun/hdhomerun_control.c -     } -  -     # Support for PVR-150/250/350/500, etc. on Linux | 
