summaryrefslogtreecommitdiffstats
path: root/abs/core-testing/mythtv/trunk/mythtv
diff options
context:
space:
mode:
authorNathan Harris <nharris@eoimaging.com>2009-02-08 22:20:20 (GMT)
committerNathan Harris <nharris@eoimaging.com>2009-02-08 22:20:20 (GMT)
commitd2cbfc286c25f31f20433e9149a0e62c4aaf900f (patch)
treedf940ae978797d62f346f465b91736b45d096649 /abs/core-testing/mythtv/trunk/mythtv
parent7ee47af1a90327ecdd7ff9d790f2022545366b55 (diff)
downloadlinhes_pkgbuild-d2cbfc286c25f31f20433e9149a0e62c4aaf900f.zip
linhes_pkgbuild-d2cbfc286c25f31f20433e9149a0e62c4aaf900f.tar.gz
linhes_pkgbuild-d2cbfc286c25f31f20433e9149a0e62c4aaf900f.tar.bz2
The new structure... does not work yet.
Diffstat (limited to 'abs/core-testing/mythtv/trunk/mythtv')
-rw-r--r--abs/core-testing/mythtv/trunk/mythtv/DeviceReadBuffer-polltimeout.2.patch219
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/PKGBUILD76
-rw-r--r--abs/core-testing/mythtv/trunk/mythtv/aacdecoder.cpp.patch12
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/compile_mythtv.sh99
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/get_mythtv.sh77
-rw-r--r--abs/core-testing/mythtv/trunk/mythtv/hdpvr-livetv.patch109
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/HOST_SETTINGS.xml87
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/is.xml3
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/library.xml.patch13
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/linhes.xml54
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/mainmenu.xml.patch39
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/mythbackup.xml20
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/mythrestore.xml20
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/optical_menu.xml.patch15
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/original/create_patch.sh5
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/setup.xml111
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/siriusmenu.xml419
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/util_menu.xml.patch17
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/menu-xml/xmmenu.xml574
-rw-r--r--abs/core-testing/mythtv/trunk/mythtv/mpegrecorder-hdpvr-v2a.patch668
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/myth.sh4
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/mythbackend38
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/mythbackend.sh117
-rwxr-xr-xabs/core-testing/mythtv/trunk/mythtv/mythtv.install55
-rw-r--r--abs/core-testing/mythtv/trunk/mythtv/smolt_jump.patch30
-rw-r--r--abs/core-testing/mythtv/trunk/mythtv/svn_main_menu_popup.patch211
26 files changed, 3092 insertions, 0 deletions
diff --git a/abs/core-testing/mythtv/trunk/mythtv/DeviceReadBuffer-polltimeout.2.patch b/abs/core-testing/mythtv/trunk/mythtv/DeviceReadBuffer-polltimeout.2.patch
new file mode 100644
index 0000000..5bb713f
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/DeviceReadBuffer-polltimeout.2.patch
@@ -0,0 +1,219 @@
+Index: libs/libmythtv/DeviceReadBuffer.h
+===================================================================
+--- libs/libmythtv/DeviceReadBuffer.h (revision 18515)
++++ libs/libmythtv/DeviceReadBuffer.h (working copy)
+@@ -59,7 +59,7 @@
+ void IncrReadPointer(uint len);
+
+ bool HandlePausing(void);
+- bool Poll(void) const;
++ bool Poll(void);
+ uint WaitForUnused(uint bytes_needed) const;
+ uint WaitForUsed (uint bytes_needed) const;
+
+Index: libs/libmythtv/DeviceReadBuffer.cpp
+===================================================================
+--- libs/libmythtv/DeviceReadBuffer.cpp (revision 18515)
++++ libs/libmythtv/DeviceReadBuffer.cpp (working copy)
+@@ -90,9 +90,14 @@
+
+ void DeviceReadBuffer::Start(void)
+ {
+- lock.lock();
+- bool was_running = running;
+- lock.unlock();
++ bool was_running;
++
++ {
++ QMutexLocker locker(&lock);
++ was_running = running;
++ error = false;
++ }
++
+ if (was_running)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Start(): Already running.");
+@@ -104,6 +109,8 @@
+ {
+ VERBOSE(VB_IMPORTANT,
+ LOC_ERR + QString("Start(): pthread_create failed.") + ENO);
++
++ QMutexLocker locker(&lock);
+ error = true;
+ }
+ }
+@@ -118,21 +125,25 @@
+ used = 0;
+ readPtr = buffer;
+ writePtr = buffer;
++
++ error = false;
+ }
+
+ void DeviceReadBuffer::Stop(void)
+ {
+ bool was_running = IsRunning();
+- lock.lock();
+- run = false;
+- lock.unlock();
+
+ if (!was_running)
+ {
+- VERBOSE(VB_IMPORTANT, LOC_ERR + "Stop(): Not running.");
++ VERBOSE(VB_IMPORTANT, LOC + "Stop(): Not running.");
+ return;
+ }
+
++ {
++ QMutexLocker locker(&lock);
++ run = false;
++ }
++
+ pthread_join(thread, NULL);
+ }
+
+@@ -229,10 +240,11 @@
+ {
+ uint errcnt = 0;
+
+- lock.lock();
+- run = true;
+- running = true;
+- lock.unlock();
++ {
++ QMutexLocker locker(&lock);
++ run = true;
++ running = true;
++ }
+
+ while (run)
+ {
+@@ -248,6 +260,15 @@
+ if (using_poll && !Poll())
+ continue;
+
++ {
++ QMutexLocker locker(&lock);
++ if (error)
++ {
++ VERBOSE(VB_RECORD, LOC + "fill_ringbuffer: error state");
++ break;
++ }
++ }
++
+ // Limit read size for faster return from read
+ size_t read_size =
+ min(dev_read_size, (size_t) WaitForUnused(TSPacket::SIZE));
+@@ -268,9 +289,10 @@
+ }
+ }
+
+- lock.lock();
+- running = false;
+- lock.unlock();
++ {
++ QMutexLocker locker(&lock);
++ running = false;
++ }
+ }
+
+ bool DeviceReadBuffer::HandlePausing(void)
+@@ -293,7 +315,7 @@
+ return true;
+ }
+
+-bool DeviceReadBuffer::Poll(void) const
++bool DeviceReadBuffer::Poll(void)
+ {
+ #ifdef USING_MINGW
+ #warning mingw DeviceReadBuffer::Poll
+@@ -302,31 +324,53 @@
+ return false;
+ #else
+ bool retval = true;
+- while (true)
++ uint timeout_cnt = 0;
++
++ for (;;)
+ {
+ struct pollfd polls;
+ polls.fd = _stream_fd;
+ polls.events = POLLIN;
+ polls.revents = 0;
+
+- int ret = poll(&polls, 1 /*number of polls*/, 10 /*msec*/);
+- if (IsPauseRequested() || !IsOpen() || !run)
++ int ret = poll(&polls, 1 /*number of polls*/, 250 /*msec*/);
++
++ if (polls.revents & (POLLERR | POLLHUP | POLLNVAL))
+ {
++ VERBOSE(VB_IMPORTANT, LOC + "poll error");
++ error = true;
++ return true;
++ }
++
++ if (!run || !IsOpen() || IsPauseRequested())
++ {
+ retval = false;
+ break; // are we supposed to pause, stop, etc.
+ }
+
+ if (ret > 0)
+ break; // we have data to read :)
+- if ((-1 == ret) && (EOVERFLOW == errno))
+- break; // we have an error to handle
+-
+- if ((-1 == ret) && ((EAGAIN == errno) || (EINTR == errno)))
+- continue; // errors that tell you to try again
+- if (ret == 0)
+- continue; // timed out, try again
+-
+- usleep(2500);
++ if (ret < 0)
++ {
++ if ((EOVERFLOW == errno))
++ break; // we have an error to handle
++ if ((EAGAIN == errno) || (EINTR == errno))
++ continue; // errors that tell you to try again
++ usleep(2500);
++ }
++ else // ret == 0
++ {
++ if (++timeout_cnt > 9)
++ {
++ VERBOSE(VB_RECORD, LOC_ERR + "Poll giving up");
++ QMutexLocker locker(&lock);
++ error = true;
++ return true;
++ }
++ if (timeout_cnt % 2)
++ VERBOSE(VB_RECORD, LOC_ERR + QString("Poll timeout (%1)")
++ .arg(timeout_cnt));
++ }
+ }
+ return retval;
+ #endif //!USING_MINGW
+@@ -360,9 +404,9 @@
+
+ if (++errcnt > 5)
+ {
+- lock.lock();
++ QMutexLocker locker(&lock);
++ VERBOSE(VB_RECORD, LOC + "Too many errors.");
+ error = true;
+- lock.unlock();
+ return false;
+ }
+
+@@ -376,10 +420,8 @@
+ VERBOSE(VB_IMPORTANT, LOC +
+ QString("End-Of-File? fd(%1)").arg(_stream_fd));
+
+- lock.lock();
++ QMutexLocker locker(&lock);
+ eof = true;
+- lock.unlock();
+-
+ return false;
+ }
+ usleep(500);
diff --git a/abs/core-testing/mythtv/trunk/mythtv/PKGBUILD b/abs/core-testing/mythtv/trunk/mythtv/PKGBUILD
new file mode 100755
index 0000000..d5560bd
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/PKGBUILD
@@ -0,0 +1,76 @@
+pkgname=mythtv-svn
+pkgver=19295
+pkgrel=1
+pkgdesc="A personal video recorder for Linux"
+url="http://www.mythtv.org"
+license="GPL"
+depends=('lame' 'libmysqlclient' 'alsa-lib' 'wget' 'qt' 'x-server' 'freetype2' 'libmpeg2' 'libxml2' 'libraw1394' 'lirc' 'perl-date-manip' 'libavc1394' 'libdc1394' 'libiec61883')
+makedepends=('subversion')
+conflicts=(mythtv)
+replaces=()
+backup=()
+options=(!strip)
+MAKEFLAGS="-j6"
+install='mythtv.install'
+
+patchs=('svn_main_menu_popup.patch' 'smolt_jump.patch' 'DeviceReadBuffer-polltimeout.2.patch' 'mpegrecorder-hdpvr-v2a.patch' 'hdpvr-livetv.patch')
+source=('mythbackend' 'myth.sh' `echo ${patchs[@]:0}` )
+arch=('i686')
+md5sums=()
+
+_svntrunk=http://cvs.mythtv.org/svn/trunk/mythtv
+_svnmod=mythtv
+
+build() {
+
+# svn co $_svntrunk --config-dir ./ -r $pkgver $_svnmod
+ svn co $_svntrunk $_svnmod
+ cd $startdir/src/mythtv
+
+ echo "--------------------------applying patches----------------------------------------------------"
+ for i in `echo ${patchs[@]:0} `
+ do
+ echo applying $i
+ echo "-----------------------------"
+ patch -Np0 -i ${startdir}/src/$i #|| return 1
+ done
+ echo "--------------------------done applying patches-----------------------------------------------"
+
+ sed -i -e "s/\`(svnversion \$\${SVNTREEDIR} 2>\/dev\/null) || echo Unknown\`/$pkgver/" version.pro
+ make distclean
+
+ # configure
+ ./configure --prefix=/usr --cpu=${ARCH} \
+ --enable-vdpau --enable-xvmc --enable-xvmc-pro \
+ --enable-opengl-vsync --enable-libfaad --enable-dvb --enable-firewire \
+ --compile-type=release --with-bindings=perl,python \
+ --enable-audio-alsa --disable-audio-jack --disable-audio-arts || return 1
+
+ # build and install
+ . /etc/profile
+ make || return 1
+ make INSTALL_ROOT=$startdir/pkg install || return 1
+
+ # install db schema, scripts and docs
+ install -m0644 database/mc.sql $startdir/pkg/usr/share/mythtv/ || return 1
+ install -D -m0755 ../mythbackend $startdir/pkg/etc/rc.d/mythbackend || return 1
+ cp -r docs $startdir/pkg/usr/share/mythtv/ || return 1
+ # cp ../QUICKSTART.archlinux $startdir/pkg/usr/share/mythtv/ || return 1
+
+ # install contrib
+ mkdir -p $startdir/pkg/usr/share/mythtv/contrib || return 1
+ install -m0755 contrib/* $startdir/pkg/usr/share/mythtv/contrib
+
+ # patch the xml LinHES style
+ cp -r $startdir/menu-xml/*.xml $startdir/pkg/usr/share/mythtv
+ cd $startdir/pkg/usr/share/mythtv
+ patch -p0 < $startdir/menu-xml/mainmenu.xml.patch
+ patch -p0 < $startdir/menu-xml/optical_menu.xml.patch
+ patch -p0 < $startdir/menu-xml/library.xml.patch
+ patch -p0 < $startdir/menu-xml/util_menu.xml.patch
+
+ # make log dir
+ mkdir -p $startdir/pkg/var/log/mythtv
+ chown 1000.1000 $startdir/pkg/var/log/mythtv
+
+}
diff --git a/abs/core-testing/mythtv/trunk/mythtv/aacdecoder.cpp.patch b/abs/core-testing/mythtv/trunk/mythtv/aacdecoder.cpp.patch
new file mode 100644
index 0000000..8796eb4
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/aacdecoder.cpp.patch
@@ -0,0 +1,12 @@
+--- mythmusic/mythmusic/aacdecoder.cpp.orig 2008-11-19 12:51:48.000000000 -0500
++++ mythmusic/mythmusic/aacdecoder.cpp 2008-11-19 12:52:42.000000000 -0500
+@@ -17,6 +17,9 @@
+ #define FAAD_MODIFIED
+ #endif
+
++// LinHES need this undefined
++#undef FAAD_MODIFIED
++
+ // ANSI C headers
+ #include <cstdlib>
+
diff --git a/abs/core-testing/mythtv/trunk/mythtv/compile_mythtv.sh b/abs/core-testing/mythtv/trunk/mythtv/compile_mythtv.sh
new file mode 100755
index 0000000..ca457e3
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/compile_mythtv.sh
@@ -0,0 +1,99 @@
+#!/bin/bash
+# compile_mythtv.sh
+# rev 0.5 - 1Nov2008
+#
+# This script will compile and install MythTV
+#
+
+PKG_MAINTAINER=nharris@eoimaging.com
+echo PKG_MAINTAINER is set to $PKG_MAINTAINER
+
+PKG_VER=0.22-svn`date +%Y%m%d`
+echo PKG_VER is set to $PKG_VER
+
+cd src/mythtv-trunk
+
+#
+# compile mythtv
+#
+echo Compiling mythtv
+cd mythtv
+export QTDIR=/usr/share/qt
+./configure --enable-opengl-vsync --cpu=i686 --enable-vdpau --enable-opengl-vsync --enable-libfaad --prefix=/usr
+#./configure --cpu=i686 --enable-dvb --enable-xvmc --enable-opengl-vsync --enable-xvmc-pro --enable-libfaad --prefix=/usr
+qmake mythtv.pro
+make || return 1
+
+#
+# install mythtv
+#
+#echo "MythTV 0.22 SVN build" > description-pak
+#checkinstall -D --default --pkgname mythtv --pkgversion $PKG_VER --maintainer $PKG_MAINTAINER
+#mv myth*.deb ../..
+sudo make install
+cd ..
+
+#
+# compile mythplugins
+#
+echo Compiling mythplugings
+cd mythplugins
+./configure --enable-all --cpu=i686 --prefix=/usr
+qmake mythplugins.pro
+make || return 1
+
+#
+# install mythplugins
+#
+#echo "MythTV 0.22 SVN build" > description-pak
+#checkinstall -D --default --pkgname mythplugins --pkgversion $PKG_VER --maintainer $PKG_MAINTAINER
+#mv myth*.deb ../..
+sudo make install
+cd ..
+
+#
+# compile myththemes
+#
+echo Compiling myththemes
+cd myththemes
+./configure --prefix=/usr
+qmake myththemes.pro
+make || return 1
+
+#
+# install myththemes
+#
+#echo "MythTV 0.22 SVN build" > description-pak
+#checkinstall -D --default --pkgname myththemes --pkgversion $PKG_VER --maintainer $PKG_MAINTAINER
+#mv myth*.deb ../..
+sudo make install
+cd ..
+
+#
+# compile additional themes
+#
+echo Compiling additional themes
+cd themes
+./configure --prefix=/usr
+qmake themes.pro
+make || return 1
+
+#
+# install additional themes
+#
+#echo "MythTV 0.22 SVN build" > description-pak
+#checkinstall -D --default --pkgname mythtv-themes --pkgversion $PKG_VER --maintainer $PKG_MAINTAINER
+#mv myth*.deb ../..
+sudo make install
+cd ..
+
+#
+# update mythweb
+#
+cd mythplugins/mythweb
+sudo cp -R * /data/srv/httpd/htdocs/mythweb
+sudo chown -R http:users /data/srv/httpd/htdocs/mythweb
+cd ../..
+
+echo "DONE!"
+
diff --git a/abs/core-testing/mythtv/trunk/mythtv/get_mythtv.sh b/abs/core-testing/mythtv/trunk/mythtv/get_mythtv.sh
new file mode 100755
index 0000000..c01ccf1
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/get_mythtv.sh
@@ -0,0 +1,77 @@
+#!/bin/bash
+# get_mythtv.sh
+# rev 0.5 - 1Nov2008
+BUILD_DIR=/home/nharris/mythtv
+
+cd $BUILD_DIR
+
+#
+# get the latest from SVN
+#
+if [ -d src ]
+then
+ cd src
+else
+ mkdir src
+ cd src
+fi
+
+if [ -d mythtv-trunk ]
+then
+ echo Updating mythtv from svn.
+ cd mythtv-trunk
+ cd mythtv
+ svn update
+ make clean
+ cd ../mythplugins
+ svn update
+ make clean
+ cd ../myththemes
+ svn update
+ make clean
+ cd ../themes
+ svn update
+ make clean
+ cd ..
+else
+ echo Creating mythtv from svn.
+ mkdir mythtv-trunk
+ cd mythtv-trunk
+ svn co http://svn.mythtv.org/svn/trunk/mythtv
+ svn co http://svn.mythtv.org/svn/trunk/mythplugins
+ svn co http://svn.mythtv.org/svn/trunk/myththemes
+ svn co http://svn.mythtv.org/svn/trunk/themes
+fi
+
+#
+# install patches
+#
+MYTH_PATCHES=$BUILD_DIR/patches
+cd $BUILD_DIR/src/mythtv-trunk/mythtv
+
+# HD-PVR support
+patch -p0 < $MYTH_PATCHES/DeviceReadBuffer-polltimeout.2.patch
+patch -p0 < $MYTH_PATCHES/mpegrecorder-hdpvr-v2a.patch
+patch -p0 < $MYTH_PATCHES/hdpvr-livetv.patch
+
+# LinHES popup menu
+patch -p0 < $MYTH_PATCHES/svn_main_menu_popup.patch
+
+# Arch build fix
+cd $BUILD_DIR/src/mythtv-trunk/mythplugins
+patch -p0 < $MYTH_PATCHES/aacdecoder.cpp.patch
+
+# Patch the xml LinHES style
+MENU_DIR=$BUILD_DIR/menu-xml
+MYTH_DIR=$BUILD_DIR/src/mythtv-trunk/mythtv/programs/mythfrontend
+cp $MENU_DIR/*.xml $MYTH_DIR
+cd $MYTH_DIR
+patch -p0 < $MENU_DIR/mainmenu.xml.patch
+patch -p0 < $MENU_DIR/optical_menu.xml.patch
+patch -p0 < $MENU_DIR/library.xml.patch
+
+#
+# END
+#
+cd $BUILD_DIR
+echo "DONE!"
diff --git a/abs/core-testing/mythtv/trunk/mythtv/hdpvr-livetv.patch b/abs/core-testing/mythtv/trunk/mythtv/hdpvr-livetv.patch
new file mode 100644
index 0000000..6297ae1
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/hdpvr-livetv.patch
@@ -0,0 +1,109 @@
+Index: libs/libmythtv/mpegrecorder.cpp
+===================================================================
+--- libs/libmythtv/mpegrecorder.cpp.orig
++++ libs/libmythtv/mpegrecorder.cpp
+@@ -1109,6 +1109,14 @@ void MpegRecorder::StartRecording(void)
+
+ if (driver == "hdpvr")
+ {
++ if (curRecording->recgroup == "LiveTV")
++ {
++ // Don't bother checking resolution, always use best bitrate
++ int maxbitrate = std::max(high_mpeg4peakbitrate,
++ high_mpeg4avgbitrate);
++ SetBitrate(high_mpeg4avgbitrate, maxbitrate, "LiveTV");
++ }
++
+ int progNum = 1;
+ MPEGStreamData *sd = new MPEGStreamData(progNum, true);
+ sd->SetRecordingType(_recording_type);
+@@ -1553,7 +1561,7 @@ bool MpegRecorder::StartEncoding(int fd)
+ memset(&command, 0, sizeof(struct v4l2_encoder_cmd));
+ command.cmd = V4L2_ENC_CMD_START;
+
+- if (driver == "hdpvr")
++ if (driver == "hdpvr" && curRecording->recgroup != "LiveTV")
+ HandleResolutionChanges();
+
+ VERBOSE(VB_RECORD, LOC + "StartEncoding");
+@@ -1755,6 +1763,35 @@ bool MpegRecorder::WaitFor_HDPVR(void)
+ return false;
+ }
+
++void MpegRecorder::SetBitrate(int bitrate, int maxbitrate,
++ const QString & reason)
++{
++ if (maxbitrate == bitrate)
++ {
++ VERBOSE(VB_RECORD, LOC + QString("%1 bitrate %2 kbps CBR")
++ .arg(reason).arg(bitrate));
++ }
++ else
++ {
++ VERBOSE(VB_RECORD, LOC + QString("%1 bitrate %2/%3 kbps VBR")
++ .arg(reason).arg(bitrate).arg(maxbitrate));
++ }
++
++ vector<struct v4l2_ext_control> ext_ctrls;
++ add_ext_ctrl(ext_ctrls, V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
++ (maxbitrate == bitrate) ?
++ V4L2_MPEG_VIDEO_BITRATE_MODE_CBR :
++ V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
++
++ add_ext_ctrl(ext_ctrls, V4L2_CID_MPEG_VIDEO_BITRATE,
++ bitrate * 1000);
++
++ add_ext_ctrl(ext_ctrls, V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
++ maxbitrate * 1000);
++
++ set_ctrls(readfd, ext_ctrls);
++}
++
+ void MpegRecorder::HandleResolutionChanges(void)
+ {
+ VERBOSE(VB_RECORD, LOC + "Checking Resolution");
+@@ -1819,30 +1856,7 @@ void MpegRecorder::HandleResolutionChang
+ .arg(old_avg).arg(old_max));
+ }
+
+- if (maxbitrate == bitrate)
+- {
+- VERBOSE(VB_RECORD, LOC + QString("New bitrate %1 kbps CBR")
+- .arg(bitrate));
+- }
+- else
+- {
+- VERBOSE(VB_RECORD, LOC + QString("New bitrate %1/%2 kbps VBR")
+- .arg(bitrate).arg(maxbitrate));
+- }
+-
+- vector<struct v4l2_ext_control> ext_ctrls;
+- add_ext_ctrl(ext_ctrls, V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
+- (maxbitrate == bitrate) ?
+- V4L2_MPEG_VIDEO_BITRATE_MODE_CBR :
+- V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
+-
+- add_ext_ctrl(ext_ctrls, V4L2_CID_MPEG_VIDEO_BITRATE,
+- bitrate * 1000);
+-
+- add_ext_ctrl(ext_ctrls, V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
+- maxbitrate * 1000);
+-
+- set_ctrls(readfd, ext_ctrls);
+-
++ SetBitrate(bitrate, maxbitrate, "New");
+ }
+ }
++
+Index: libs/libmythtv/mpegrecorder.h
+===================================================================
+--- libs/libmythtv/mpegrecorder.h.orig
++++ libs/libmythtv/mpegrecorder.h
+@@ -87,6 +87,7 @@ class MpegRecorder : public DTVRecorder,
+ void ResetForNewFile(void);
+
+ bool WaitFor_HDPVR(void);
++ void SetBitrate(int bitrate, int maxbitrate, const QString & reason);
+ void HandleResolutionChanges(void);
+
+ inline bool CheckCC(uint pid, uint cc);
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/HOST_SETTINGS.xml b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/HOST_SETTINGS.xml
new file mode 100755
index 0000000..f257920
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/HOST_SETTINGS.xml
@@ -0,0 +1,87 @@
+<mythmenu name="HOST_SETTINGS">
+
+ <button>
+ <type>MV_NETWORK_SETUP_MENU</type>
+ <text>Network Settings</text>
+ <action>EXEC mythinstall -s network </action>
+ </button>
+
+ <button>
+ <type>MV_SYSTEM_SETUP_MENU</type>
+ <text>System type</text>
+ <action>EXEC mythinstall -s hostype </action>
+ </button>
+
+ <button>
+ <type>MV_MISC_SETUP_MENU</type>
+ <text>Misc Settings</text>
+ <action>EXEC mythinstall -s misc </action>
+ </button>
+
+ <button>
+ <type>MV_SOFTWARE_MENU</type>
+ <text>Software</text>
+ <action>EXEC mythinstall -s plugins </action>
+ </button>
+
+ <button>
+ <type>MV_SHUTDOWN_SETUP_MENU</type>
+ <text>Shutdown settings</text>
+ <action>EXEC mythinstall -s sleep </action>
+ </button>
+
+
+<button>
+ <type>MV_ADVANCED_X_SETUP_MENU</type>
+ <text>Display</text>
+ <action>EXEC mythinstall -s advancedX</action>
+</button>
+
+<button>
+ <type>MV_ADVANCED_SETUP_MENU</type>
+ <text>Advanced settings</text>
+ <action>EXEC mythinstall -s advanced</action>
+</button>
+
+
+<button>
+ <type>MV_AUDIO_SETUP_MENU</type>
+ <text>Audio settings</text>
+ <action>EXEC mythinstall -s sound </action>
+</button>
+
+
+<button>
+ <type>MV_ACCESS_SETUP_MENU</type>
+ <text>Access</text>
+ <action>EXEC mythinstall -s accesscontrol </action>
+</button>
+
+<button>
+ <type>MV_USER_SETUP_MENU</type>
+ <text>Password </text>
+ <action>EXEC mythinstall -s user </action>
+</button>
+
+<button>
+ <type>MV_WEBACCESS_SETUP_MENU</type>
+ <text>Web security</text>
+ <action>EXEC mythinstall -s webuser </action>
+</button>
+
+
+
+
+ <!--
+ <button>
+ <type>SETUP_MENU</type>
+ <text>Settings profile manager</text>
+ <action>EXEC mythinstall -t </action>
+
+ </button>
+ -->
+
+
+
+
+</mythmenu>
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/is.xml b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/is.xml
new file mode 100755
index 0000000..88b7e6b
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/is.xml
@@ -0,0 +1,3 @@
+<mythmenu name="Internet Steams">
+
+</mythmenu>
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/library.xml.patch b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/library.xml.patch
new file mode 100755
index 0000000..02df082
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/library.xml.patch
@@ -0,0 +1,13 @@
+--- library.xml.orig 2008-08-31 03:27:59.000000000 +0000
++++ library.xml 2009-01-26 15:04:16.000000000 +0000
+@@ -121,8 +121,8 @@
+ <type>STREAM</type>
+ <text>Play online streams</text>
+ <text lang="HE">נגן מדיה מכוונת</text>
+- <action>PLUGIN mythstream</action>
+- <depends>mythstream</depends>
++ <text>Online Streams</text>
++ <action>MENU is.xml</action>
+ </button>
+
+ <button>
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/linhes.xml b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/linhes.xml
new file mode 100755
index 0000000..8bc929f
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/linhes.xml
@@ -0,0 +1,54 @@
+<mythmenu name="LinHES">
+
+ <button>
+ <type>SETUP_GENERAL</type>
+ <text>MythTV Configuration</text>
+ <text lang="IT">Impostazioni</text>
+ <text lang="ES">Configuración</text>
+ <text lang="CA">Configurar</text>
+ <text lang="FR">paramètres</text>
+ <text lang="DE">Zubehör / Konfiguration</text>
+ <text lang="DK">Tilbehør/Indstillinger</text>
+ <text lang="IS">Uppsetning</text>
+ <text lang="NL">Configuratie</text>
+ <text lang="PT">Utensílios</text>
+ <text lang="SV">Verktyg / Inställningar</text>
+ <text lang="JA">設定</text>
+ <text lang="FI">Oheis/Asetukset</text>
+ <text lang="ZH_TW">工具/設定</text>
+ <text lang="SI">Nastavitve</text>
+ <text lang="ET">Utiliidid / sätted</text>
+ <text lang="NB">Verktøy/Oppsett</text>
+ <text lang="CZ">Pomůcky</text>
+ <text lang="RU">Утилиты / Настройки</text>
+ <text lang="AR">تضبيطات</text>
+ <text lang="PL">Narzędzia / ustawienia</text>
+ <text lang="HE">עזרים / הגדרות</text>
+ <alttext lang="DE">Verschiedenes</alttext>
+ <alttext lang="SV">Inställningar</alttext>
+ <alttext lang="ET">Sätted</alttext>
+ <alttext lang="RU">Настройки</alttext>
+ <alttext lang="AR">تضبيطات</alttext>
+ <action>MENU util_menu.xml</action>
+ </button>
+
+ <button>
+ <type>LINHES_SETUP</type>
+ <text>LinHES Configuration</text>
+ <action>MENU HOST_SETTINGS.xml</action>
+ </button>
+
+ <button>
+ <type>BACKUP</type>
+ <text>Backup LinHES</text>
+ <action>MENU mythbackup.xml</action>
+ </button>
+
+ <button>
+ <type>RESTORE</type>
+ <text>Restore LinHES</text>
+ <action>MENU mythrestore.xml</action>
+ </button>
+
+</mythmenu>
+
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/mainmenu.xml.patch b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/mainmenu.xml.patch
new file mode 100755
index 0000000..a299325
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/mainmenu.xml.patch
@@ -0,0 +1,39 @@
+--- mainmenu.xml.orig 2009-01-09 02:45:07.000000000 +0000
++++ mainmenu.xml 2009-01-22 08:04:28.000000000 +0000
+@@ -158,34 +158,8 @@
+
+ <button>
+ <type>MENU_UTILITIES_SETUP</type>
+- <text>Utilities / Setup</text>
+- <text lang="IT">Impostazioni</text>
+- <text lang="ES">Configuración</text>
+- <text lang="CA">Configurar</text>
+- <text lang="FR">paramètres</text>
+- <text lang="DE">Zubehör / Konfiguration</text>
+- <text lang="DK">Tilbehør/Indstillinger</text>
+- <text lang="IS">Uppsetning</text>
+- <text lang="NL">Configuratie</text>
+- <text lang="PT">Utensílios</text>
+- <text lang="SV">Verktyg / Inställningar</text>
+- <text lang="JA">設定</text>
+- <text lang="FI">Oheis/Asetukset</text>
+- <text lang="ZH_TW">工具/設定</text>
+- <text lang="SI">Nastavitve</text>
+- <text lang="ET">Utiliidid / sätted</text>
+- <text lang="NB">Verktøy/Oppsett</text>
+- <text lang="CZ">Pomůcky</text>
+- <text lang="RU">Утилиты / Настройки</text>
+- <text lang="AR">تضبيطات</text>
+- <text lang="PL">Narzędzia / ustawienia</text>
+- <text lang="HE">עזרים / הגדרות</text>
+- <alttext lang="DE">Verschiedenes</alttext>
+- <alttext lang="SV">Inställningar</alttext>
+- <alttext lang="ET">Sätted</alttext>
+- <alttext lang="RU">Настройки</alttext>
+- <alttext lang="AR">تضبيطات</alttext>
+- <action>MENU util_menu.xml</action>
++ <text>Service Menu</text>
++ <action>MENU linhes.xml</action>
+ </button>
+
+ <!-- <button>
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/mythbackup.xml b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/mythbackup.xml
new file mode 100755
index 0000000..656860d
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/mythbackup.xml
@@ -0,0 +1,20 @@
+<mythmenu name="LinHES">
+
+ <button>
+ <type>BACKUP</type>
+ <text>Do you wish to backup?</text>
+ <action>NONE</action>
+ </button>
+
+ <button>
+ <type>BACKUP</type>
+ <text>Yes</text>
+ <action>EXEC sudo /usr/LH/bin/mythbackup</action>
+ </button>
+
+ <button>
+ <type>BACKUP</type>
+ <text>No</text>
+ <action>MENU linhes.xml</action>
+ </button>
+</mythmenu>
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/mythrestore.xml b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/mythrestore.xml
new file mode 100755
index 0000000..05cb0a7
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/mythrestore.xml
@@ -0,0 +1,20 @@
+<mythmenu name="LinHES">
+
+ <button>
+ <type>RESTORE</type>
+ <text>Do you wish to restore?</text>
+ <action>NONE</action>
+ </button>
+
+ <button>
+ <type>RESTORE</type>
+ <text>Yes</text>
+ <action>EXEC sudo /usr/LH/bin/mythrestore</action>
+ </button>
+
+ <button>
+ <type>BACKUP</type>
+ <text>No</text>
+ <action>MENU linhes.xml</action>
+ </button>
+</mythmenu>
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/optical_menu.xml.patch b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/optical_menu.xml.patch
new file mode 100755
index 0000000..d1cb70c
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/optical_menu.xml.patch
@@ -0,0 +1,15 @@
+--- optical_menu.xml.orig 2008-10-02 22:46:30.000000000 +0000
++++ optical_menu.xml 2008-07-02 04:05:15.000000000 +0000
+@@ -129,6 +129,12 @@
+ </button>
+
+ <button>
++ <type>DVD_RIP</type>
++ <text>Import video files from DVD</text>
++ <action>EXEC /usr/LH/bin/importfiles.sh</action>
++ </button>
++
++ <button>
+ <type>EJECT</type>
+ <text>Eject media</text>
+ <text lang="IT">Espelli Media</text>
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/original/create_patch.sh b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/original/create_patch.sh
new file mode 100755
index 0000000..34d8b8c
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/original/create_patch.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+for i in *.xml
+do
+ diff -u $i.orig $i > ../$i.patch
+done
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/setup.xml b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/setup.xml
new file mode 100755
index 0000000..f56bb6f
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/setup.xml
@@ -0,0 +1,111 @@
+<mythmenu name="MAIN">
+
+ <button>
+ <type>SETUP_GENERAL</type>
+ <text>1. General</text>
+ <text lang="IT">1. Generale</text>
+ <text lang="PT">1. Geral</text>
+ <text lang="SV">1. Generellt</text>
+ <text lang="JA">1. 一般</text>
+ <text lang="DE">1. Allgemeines</text>
+ <text lang="FI">1. Yleiset</text>
+ <text lang="FR">1. Général</text>
+ <text lang="SI">1. Splošno</text>
+ <text lang="ET">1. Üldine</text>
+ <text lang="NB">1 Generelt</text>
+ <text lang="DK">1. Generelt</text>
+ <text lang="ES">1. General</text>
+ <text lang="CZ">1. Obecný</text>
+ <text lang="RU">1. Общие</text>
+ <action>GENERAL</action>
+ </button>
+
+ <button>
+ <type>SETUP_CAPTURE_CARDS</type>
+ <text>2. Capture cards</text>
+ <text lang="IT">2. Schede di Acquisizione</text>
+ <text lang="PT">2. Placas de Captura</text>
+ <text lang="SV">2. TV-kort</text>
+ <text lang="JA">2. キャプチャカード</text>
+ <text lang="DE">2. TV-Karten</text>
+ <text lang="FI">2. TV-kortit</text>
+ <text lang="FR">2. Cartes d'acquisition</text>
+ <text lang="SI">2. Kartice za zajem</text>
+ <text lang="ET">2. TV-kaardid</text>
+ <text lang="NB">2 TV-kort</text>
+ <text lang="DK">2. TV-kort</text>
+ <text lang="ES">2. Capturadoras</text>
+ <text lang="CZ">2. Zachytávací karty</text>
+ <text lang="RU">2. Карты захвата</text>
+ <action>CAPTURE CARDS</action>
+ </button>
+
+ <button>
+ <type>SETUP_VIDEO_SOURCES</type>
+ <text>3. Video sources</text>
+ <text lang="IT">3. Fonte Video</text>
+ <text lang="PT">3. Fontes de Vídeo</text>
+ <text lang="SV">3. Videokällor</text>
+ <text lang="JA">3. ビデオソース</text>
+ <text lang="DE">3. Videoquellen</text>
+ <text lang="FI">3. Kuvanlähteet</text>
+ <text lang="FR">3. Sources vidéo</text>
+ <text lang="SI">3. Video viri</text>
+ <text lang="ET">3. Videosisendid</text>
+ <text lang="NB">3 Videokilder</text>
+ <text lang="DK">3. Videokilder</text>
+ <text lang="ES">3. Fuentes de Vídeo</text>
+ <text lang="CZ">3. Zdroje obrazu</text>
+ <text lang="RU">3. Видео источники</text>
+ <action>VIDEO SOURCES</action>
+ </button>
+
+ <button>
+ <type>SETUP_INPUT_CONNECTIONS</type>
+ <text>4. Input connections</text>
+ <text lang="IT">4. Connessioni di Ingresso</text>
+ <text lang="PT">4. Ligações de Entrada</text>
+ <text lang="SV">4. Anslutningar</text>
+ <text lang="JA">4. 入力とソースの接続</text>
+ <text lang="DE">4. Verknüpfungen</text>
+ <text lang="FI">4. Sisääntuloasetukset</text>
+ <text lang="FR">4. Entrées Vidéos</text>
+ <text lang="SI">4. Vhodne povezave</text>
+ <text lang="ET">4. Sisendite ühendused</text>
+ <text lang="NB">4 Inndata</text>
+ <text lang="DK">4. Indgange</text>
+ <text lang="ES">4. Conexiones</text>
+ <text lang="CZ">4. Připojení vstupů</text>
+ <text lang="RU">4. Соединение входов</text>
+ <action>CARD INPUTS</action>
+ </button>
+
+ <button>
+ <type>SETUP_CHANNEL_EDITOR</type>
+ <text>5. Channel Editor</text>
+ <text lang="IT">5. Modifica Canali</text>
+ <text lang="SV">5. Kanaleditor</text>
+ <text lang="JA">5. チャンネル設定</text>
+ <text lang="DE">5. Sender bearbeiten</text>
+ <text lang="FI">5. Kanavanviritys</text>
+ <text lang="FR">5. Editeur de chaînes</text>
+ <text lang="SI">5. Urejanje kanalov</text>
+ <text lang="ET">5. Kanaliredaktor</text>
+ <text lang="NB">5 Kanalredigerer</text>
+ <text lang="DK">5. Kanal opsætning</text>
+ <text lang="ES">5. Editor Canales</text>
+ <text lang="CZ">5. Editor kanálů</text>
+ <text lang="RU">5. Редактор каналов</text>
+ <action>CHANNEL EDITOR</action>
+ </button>
+
+ <button>
+ <type>SETUP_STORAGE_GROUPS</type>
+ <text>6. Storage Directories</text>
+ <text lang="IT">6. Cartelle</text>
+ <text lang="FI">Tallennusryhmät</text>
+ <text lang="SV">Lagringsgrupper</text>
+ <action>STORAGE GROUPS</action>
+ </button>
+
+</mythmenu>
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/siriusmenu.xml b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/siriusmenu.xml
new file mode 100755
index 0000000..e317b36
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/siriusmenu.xml
@@ -0,0 +1,419 @@
+<mythmenu name="SIRIUS">
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Hits 1</text>
+ <action>EXEC /usr/bin/cliSipie siriushits1</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>StarLite</text>
+ <action>EXEC /usr/bin/cliSipie starlite</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Love</text>
+ <action>EXEC /usr/bin/cliSipie siriuslove</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Movin EZ</text>
+ <action>EXEC /usr/bin/cliSipie movineasy</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Gold</text>
+ <action>EXEC /usr/bin/cliSipie siriusgold</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>'60s Vibrations</text>
+ <action>EXEC /usr/bin/cliSipie 60svibrations</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Totally '70s</text>
+ <action>EXEC /usr/bin/cliSipie totally70s</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Big '80s</text>
+ <action>EXEC /usr/bin/cliSipie big80s</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>ThePulse</text>
+ <action>EXEC /usr/bin/cliSipie thepulse</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Bridge</text>
+ <action>EXEC /usr/bin/cliSipie thebridge</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>BBC Radio 1</text>
+ <action>EXEC /usr/bin/cliSipie bbcradio1</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Super Shuffle</text>
+ <action>EXEC /usr/bin/cliSipie supershuffle</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Elvis Radio</text>
+ <action>EXEC /usr/bin/cliSipie elvisradio</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Classic Vinyl</text>
+ <action>EXEC /usr/bin/cliSipie classicvinyl</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Classic Rewind</text>
+ <action>EXEC /usr/bin/cliSipie classicrewind</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>TheVault</text>
+ <action>EXEC /usr/bin/cliSipie thevault</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Jam_ON</text>
+ <action>EXEC /usr/bin/cliSipie jamon</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Spectrum</text>
+ <action>EXEC /usr/bin/cliSipie thespectrum</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>BuzzSaw</text>
+ <action>EXEC /usr/bin/cliSipie buzzsaw</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Octane</text>
+ <action>EXEC /usr/bin/cliSipie octane</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Alt Nation</text>
+ <action>EXEC /usr/bin/cliSipie altnation</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>1st Wave</text>
+ <action>EXEC /usr/bin/cliSipie firstwave</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Hair Nation</text>
+ <action>EXEC /usr/bin/cliSipie hairnation</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>'90s Alternative</text>
+ <action>EXEC /usr/bin/cliSipie 90salternative</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Garage</text>
+ <action>EXEC /usr/bin/cliSipie undergroundgarage</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Left of Center</text>
+ <action>EXEC /usr/bin/cliSipie leftofcenter</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Hard Attack</text>
+ <action>EXEC /usr/bin/cliSipie hardattack</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Faction</text>
+ <action>EXEC /usr/bin/cliSipie faction</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Punk</text>
+ <action>EXEC /usr/bin/cliSipie punk</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>The Coffee House</text>
+ <action>EXEC /usr/bin/cliSipie coffeehouse</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Margaritaville</text>
+ <action>EXEC /usr/bin/cliSipie radiomargaritaville</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Disorder</text>
+ <action>EXEC /usr/bin/cliSipie siriusdisorder</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Reggae</text>
+ <action>EXEC /usr/bin/cliSipie reggaerhythms</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Area 33</text>
+ <action>EXEC /usr/bin/cliSipie area33</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Boombox</text>
+ <action>EXEC /usr/bin/cliSipie boombox</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Chill</text>
+ <action>EXEC /usr/bin/cliSipie chill</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>The Beat</text>
+ <action>EXEC /usr/bin/cliSipie thebeat</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Strobe</text>
+ <action>EXEC /usr/bin/cliSipie thestrobe</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Hip-Hop Nation</text>
+ <action>EXEC /usr/bin/cliSipie hiphopnation</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>BackSpin</text>
+ <action>EXEC /usr/bin/cliSipie backspin</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Shade 45</text>
+ <action>EXEC /usr/bin/cliSipie shade45</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Hot Jamz</text>
+ <action>EXEC /usr/bin/cliSipie hotjamz</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Heart &amp; Soul</text>
+ <action>EXEC /usr/bin/cliSipie heartandsoul</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>SoulTown</text>
+ <action>EXEC /usr/bin/cliSipie soultown</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>New Country</text>
+ <action>EXEC /usr/bin/cliSipie newcountry</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Prime Country</text>
+ <action>EXEC /usr/bin/cliSipie primecountry</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Roadhouse</text>
+ <action>EXEC /usr/bin/cliSipie theroadhouse</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Outlaw Country</text>
+ <action>EXEC /usr/bin/cliSipie outlawcountry</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Bluegrass</text>
+ <action>EXEC /usr/bin/cliSipie bluegrass</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Spirit</text>
+ <action>EXEC /usr/bin/cliSipie spirit</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Praise</text>
+ <action>EXEC /usr/bin/cliSipie praise</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Planet Jazz</text>
+ <action>EXEC /usr/bin/cliSipie planetjazz</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>JazzCafe</text>
+ <action>EXEC /usr/bin/cliSipie jazzcafe</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>PureJazz</text>
+ <action>EXEC /usr/bin/cliSipie purejazz</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Spa 73</text>
+ <action>EXEC /usr/bin/cliSipie spa73</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Blues</text>
+ <action>EXEC /usr/bin/cliSipie siriusblues</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Siriusly Sinatra</text>
+ <action>EXEC /usr/bin/cliSipie siriuslysinatra</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Broadway's Best</text>
+ <action>EXEC /usr/bin/cliSipie broadwaysbest</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Symphony Hall</text>
+ <action>EXEC /usr/bin/cliSipie symphonyhall</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Met Opera Radio</text>
+ <action>EXEC /usr/bin/cliSipie metropolitanopera</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Pops</text>
+ <action>EXEC /usr/bin/cliSipie siriuspops</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Universo Latino</text>
+ <action>EXEC /usr/bin/cliSipie universolatino</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Rumbon</text>
+ <action>EXEC /usr/bin/cliSipie rumbon</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Martha Stewart</text>
+ <action>EXEC /usr/bin/cliSipie marthastewartlivingradio</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Stars</text>
+ <action>EXEC /usr/bin/cliSipie siriusstars</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>OutQ Gay Radio</text>
+ <action>EXEC /usr/bin/cliSipie siriusoutq</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Patriot</text>
+ <action>EXEC /usr/bin/cliSipie siriuspatriot</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Left</text>
+ <action>EXEC /usr/bin/cliSipie siriusleft</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>CNN</text>
+ <action>EXEC /usr/bin/cliSipie cnn</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>wrn</text>
+ <action>EXEC /usr/bin/cliSipie wrn</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Blue Collar Comedy</text>
+ <action>EXEC /usr/bin/cliSipie bluecollarcomedy</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Raw Dog Comedy</text>
+ <action>EXEC /usr/bin/cliSipie rawdog</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Laugh Break Comedy</text>
+ <action>EXEC /usr/bin/cliSipie laughbreak</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>thefoxxhole</text>
+ <action>EXEC /usr/bin/cliSipie thefoxxhole</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>lime</text>
+ <action>EXEC /usr/bin/cliSipie lime</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Kids Stuff</text>
+ <action>EXEC /usr/bin/cliSipie kidsstuff</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Catholic Channel</text>
+ <action>EXEC /usr/bin/cliSipie thecatholicchannel</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>EWTN</text>
+ <action>EXEC /usr/bin/cliSipie ewtnglobal</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>christiantalk</text>
+ <action>EXEC /usr/bin/cliSipie christiantalk</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius NFL Radio</text>
+ <action>EXEC /usr/bin/cliSipie siriusnflradio</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Maxim Radio</text>
+ <action>EXEC /usr/bin/cliSipie maximradio</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Cosmo Radio</text>
+ <action>EXEC /usr/bin/cliSipie cosmopolitanradio</action>
+ </button>
+ <button>
+ <type>TV_DELETE</type>
+ <text>Stop Listening</text>
+ <action>EXEC /usr/bin/sipie_kill</action>
+ </button>
+
+</mythmenu>
+
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/util_menu.xml.patch b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/util_menu.xml.patch
new file mode 100755
index 0000000..26ac863
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/util_menu.xml.patch
@@ -0,0 +1,17 @@
+--- util_menu.xml.orig 2009-01-09 02:45:07.000000000 +0000
++++ util_menu.xml 2009-01-22 08:04:28.000000000 +0000
+@@ -76,7 +76,13 @@
+ <action>PLUGIN mythcontrols</action>
+ <depends>mythcontrols</depends>
+ </button>
+-
++
++ <button>
++ <type>VIDEO_SCREENSHOOTER</type>
++ <text>Thumbnail Generator</text>
++ <action>EXEC /usr/LH/bin/shootscreens-mythtv.sh</action>
++ </button>
++
+ <button>
+ <type>SETUP_MENU</type>
+ <text>Setup</text>
diff --git a/abs/core-testing/mythtv/trunk/mythtv/menu-xml/xmmenu.xml b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/xmmenu.xml
new file mode 100755
index 0000000..6b26d11
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/menu-xml/xmmenu.xml
@@ -0,0 +1,574 @@
+<!-- Current as of April 25, 2007 -->
+<mythmenu name="XM">
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '40s</text>
+ <action>EXEC /usr/bin/xamp kill 4</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '50s</text>
+ <action>EXEC /usr/bin/xamp kill 5</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '60s</text>
+ <action>EXEC /usr/bin/xamp kill 6</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '70s</text>
+ <action>EXEC /usr/bin/xamp kill 7</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '80s</text>
+ <action>EXEC /usr/bin/xamp kill 8</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '90s</text>
+ <action>EXEC /usr/bin/xamp kill 9</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>America</text>
+ <action>EXEC /usr/bin/xamp kill 10</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>X Country</text>
+ <action>EXEC /usr/bin/xamp kill 12</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Willie's Place</text>
+ <action>EXEC /usr/bin/xamp kill 13</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Bluegrass Junction</text>
+ <action>EXEC /usr/bin/xamp kill 14</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Village</text>
+ <action>EXEC /usr/bin/xamp kill 15</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Highway 16</text>
+ <action>EXEC /usr/bin/xamp kill 16</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>US Country</text>
+ <action>EXEC /usr/bin/xamp kill 17</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>20 on 20</text>
+ <action>EXEC /usr/bin/xamp kill 20</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Heart</text>
+ <action>EXEC /usr/bin/xamp kill 23</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Blend</text>
+ <action>EXEC /usr/bin/xamp kill 25</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Flight 26</text>
+ <action>EXEC /usr/bin/xamp kill 26</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Cinemagic</text>
+ <action>EXEC /usr/bin/xamp kill 27</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>On Broadway</text>
+ <action>EXEC /usr/bin/xamp kill 28</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>U-Pop</text>
+ <action>EXEC /usr/bin/xamp kill 29</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Hitlist</text>
+ <action>EXEC /usr/bin/xamp kill 30</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Torch</text>
+ <action>EXEC /usr/bin/xamp kill 31</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Message</text>
+ <action>EXEC /usr/bin/xamp kill 32</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Spirit</text>
+ <action>EXEC /usr/bin/xamp kill 33</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>enLighten</text>
+ <action>EXEC /usr/bin/xamp kill 34</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Deep Tracks</text>
+ <action>EXEC /usr/bin/xamp kill 40</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Boneyard</text>
+ <action>EXEC /usr/bin/xamp kill 41</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Liquid Metal</text>
+ <action>EXEC /usr/bin/xamp kill 42</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XMU</text>
+ <action>EXEC /usr/bin/xamp kill 43</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Fred</text>
+ <action>EXEC /usr/bin/xamp kill 44</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Cafe</text>
+ <action>EXEC /usr/bin/xamp kill 45</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Top Tracks</text>
+ <action>EXEC /usr/bin/xamp kill 46</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Ethel</text>
+ <action>EXEC /usr/bin/xamp kill 47</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Squizz</text>
+ <action>EXEC /usr/bin/xamp kill 48</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Big Tracks</text>
+ <action>EXEC /usr/bin/xamp kill 49</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Loft</text>
+ <action>EXEC /usr/bin/xamp kill 50</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Music Lab</text>
+ <action>EXEC /usr/bin/xamp kill 51</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Verge</text>
+ <action>EXEC /usr/bin/xamp kill 52</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Fungus</text>
+ <action>EXEC /usr/bin/xamp kill 53</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Lucy</text>
+ <action>EXEC /usr/bin/xamp kill 54</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Soul Street</text>
+ <action>EXEC /usr/bin/xamp kill 60</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Flow</text>
+ <action>EXEC /usr/bin/xamp kill 61</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Suite 62</text>
+ <action>EXEC /usr/bin/xamp kill 62</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Groove</text>
+ <action>EXEC /usr/bin/xamp kill 64</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Rhyme</text>
+ <action>EXEC /usr/bin/xamp kill 65</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>RAW</text>
+ <action>EXEC /usr/bin/xamp kill 66</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The City</text>
+ <action>EXEC /usr/bin/xamp kill 67</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Heat</text>
+ <action>EXEC /usr/bin/xamp kill 68</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Real Jazz</text>
+ <action>EXEC /usr/bin/xamp kill 70</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Watercolors</text>
+ <action>EXEC /usr/bin/xamp kill 71</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Beyond Jazz</text>
+ <action>EXEC /usr/bin/xamp kill 72</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>High Standards</text>
+ <action>EXEC /usr/bin/xamp kill 73</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Bluesville</text>
+ <action>EXEC /usr/bin/xamp kill 74</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Hear Music</text>
+ <action>EXEC /usr/bin/xamp kill 75</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Fine Tuning</text>
+ <action>EXEC /usr/bin/xamp kill 76</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Audio Visions</text>
+ <action>EXEC /usr/bin/xamp kill 77</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Escape</text>
+ <action>EXEC /usr/bin/xamp kill 78</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>On The Rocks</text>
+ <action>EXEC /usr/bin/xamp kill 79</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Move</text>
+ <action>EXEC /usr/bin/xamp kill 80</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>BPM</text>
+ <action>EXEC /usr/bin/xamp kill 81</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The System</text>
+ <action>EXEC /usr/bin/xamp kill 82</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Chrome</text>
+ <action>EXEC /usr/bin/xamp kill 83</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM-Chill</text>
+ <action>EXEC /usr/bin/xamp kill 84</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Fuego</text>
+ <action>EXEC /usr/bin/xamp kill 90</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Viva</text>
+ <action>EXEC /usr/bin/xamp kill 91</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Aguila</text>
+ <action>EXEC /usr/bin/xamp kill 92</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Caliente</text>
+ <action>EXEC /usr/bin/xamp kill 94</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Luna</text>
+ <action>EXEC /usr/bin/xamp kill 95</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Air Musique</text>
+ <action>EXEC /usr/bin/xamp kill 100</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Joint</text>
+ <action>EXEC /usr/bin/xamp kill 101</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Sur La Route</text>
+ <action>EXEC /usr/bin/xamp kill 102</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>World Zone</text>
+ <action>EXEC /usr/bin/xamp kill 103</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Ngoma</text>
+ <action>EXEC /usr/bin/xamp kill 104</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Classics</text>
+ <action>EXEC /usr/bin/xamp kill 110</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Vox</text>
+ <action>EXEC /usr/bin/xamp kill 112</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Pops</text>
+ <action>EXEC /usr/bin/xamp kill 113</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Kids</text>
+ <action>EXEC /usr/bin/xamp kill 116</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Bob Edwards Show</text>
+ <action>EXEC /usr/bin/xamp kill 133</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Comedy</text>
+ <action>EXEC /usr/bin/xamp kill 150</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Laugh USA</text>
+ <action>EXEC /usr/bin/xamp kill 151</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Special X</text>
+ <action>EXEC /usr/bin/xamp kill 154</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Agenda</text>
+ <action>EXEC /usr/bin/xamp kill 134</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Oprah and Friends</text>
+ <action>EXEC /usr/bin/xamp kill 156</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Virus</text>
+ <action>EXEC /usr/bin/xamp kill 202</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>1 Hit Wonders</text>
+ <action>EXEC /usr/bin/xamp kill 300</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Metalcore</text>
+ <action>EXEC /usr/bin/xamp kill 301</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>New Indie First</text>
+ <action>EXEC /usr/bin/xamp kill 302</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Late Night Mix</text>
+ <action>EXEC /usr/bin/xamp kill 303</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Sessions@AOL</text>
+ <action>EXEC /usr/bin/xamp kill 304</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Shuffle</text>
+ <action>EXEC /usr/bin/xamp kill 305</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>New Rock First</text>
+ <action>EXEC /usr/bin/xamp kill 306</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>New Country First</text>
+ <action>EXEC /usr/bin/xamp kill 307</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>New Hip Hop First</text>
+ <action>EXEC /usr/bin/xamp kill 308</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>New Pop First</text>
+ <action>EXEC /usr/bin/xamp kill 309</action>
+ </button>
+
+ <button>
+ <type>TV_DELETE</type>
+ <text>Stop Listening</text>
+ <action>EXEC /usr/bin/xamp kill</action>
+ </button>
+
+</mythmenu>
diff --git a/abs/core-testing/mythtv/trunk/mythtv/mpegrecorder-hdpvr-v2a.patch b/abs/core-testing/mythtv/trunk/mythtv/mpegrecorder-hdpvr-v2a.patch
new file mode 100644
index 0000000..dbef933
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/mpegrecorder-hdpvr-v2a.patch
@@ -0,0 +1,668 @@
+Index: libs/libmythtv/DeviceReadBuffer.cpp
+===================================================================
+--- libs/libmythtv/DeviceReadBuffer.cpp.orig
++++ libs/libmythtv/DeviceReadBuffer.cpp
+@@ -169,7 +169,17 @@ bool DeviceReadBuffer::IsPaused(void) co
+ return paused;
+ }
+
+-bool DeviceReadBuffer::WaitForUnpause(int timeout)
++bool DeviceReadBuffer::WaitForPaused(unsigned long timeout)
++{
++ QMutexLocker locker(&lock);
++
++ if (!paused)
++ pauseWait.wait(&lock, timeout);
++
++ return paused;
++}
++
++bool DeviceReadBuffer::WaitForUnpause(unsigned long timeout)
+ {
+ QMutexLocker locker(&lock);
+
+Index: libs/libmythtv/DeviceReadBuffer.h
+===================================================================
+--- libs/libmythtv/DeviceReadBuffer.h.orig
++++ libs/libmythtv/DeviceReadBuffer.h
+@@ -42,7 +42,8 @@ class DeviceReadBuffer
+
+ void SetRequestPause(bool request);
+ bool IsPaused(void) const;
+- bool WaitForUnpause(int timeout);
++ bool WaitForUnpause(unsigned long timeout);
++ bool WaitForPaused(unsigned long timeout);
+
+ bool IsErrored(void) const { return error; }
+ bool IsEOF(void) const { return eof; }
+Index: libs/libmythtv/mpegrecorder.cpp
+===================================================================
+--- libs/libmythtv/mpegrecorder.cpp.orig
++++ libs/libmythtv/mpegrecorder.cpp
+@@ -19,6 +19,7 @@ using namespace std;
+ #include <sys/stat.h>
+ #include <sys/ioctl.h>
+ #include <sys/time.h>
++#include <sys/poll.h>
+
+ // avlib headers
+ extern "C" {
+@@ -86,7 +87,7 @@ MpegRecorder::MpegRecorder(TVRec *rec) :
+ requires_special_pause(false),
+ // State
+ recording(false), encoding(false),
+- needs_resolution(false), start_stop_encoding_lock(QMutex::Recursive),
++ start_stop_encoding_lock(QMutex::Recursive),
+ recording_wait_lock(), recording_wait(),
+ // Pausing state
+ cleartimeonpause(false),
+@@ -493,12 +494,20 @@ bool MpegRecorder::OpenV4L2DeviceAsInput
+
+ bool MpegRecorder::SetFormat(int chanfd)
+ {
++ uint idx;
+ struct v4l2_format vfmt;
+ bzero(&vfmt, sizeof(vfmt));
+
+ vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+
+- if (ioctl(chanfd, VIDIOC_G_FMT, &vfmt) < 0)
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(chanfd, VIDIOC_G_FMT, &vfmt) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 10)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Error getting format" + ENO);
+ return false;
+@@ -507,7 +516,14 @@ bool MpegRecorder::SetFormat(int chanfd)
+ vfmt.fmt.pix.width = width;
+ vfmt.fmt.pix.height = height;
+
+- if (ioctl(chanfd, VIDIOC_S_FMT, &vfmt) < 0)
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(chanfd, VIDIOC_S_FMT, &vfmt) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 20)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Error setting format" + ENO);
+ return false;
+@@ -519,9 +535,18 @@ bool MpegRecorder::SetFormat(int chanfd)
+ /// Set audio language mode
+ bool MpegRecorder::SetLanguageMode(int chanfd)
+ {
++ uint idx;
+ struct v4l2_tuner vt;
+ bzero(&vt, sizeof(struct v4l2_tuner));
+- if (ioctl(chanfd, VIDIOC_G_TUNER, &vt) < 0)
++
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(chanfd, VIDIOC_G_TUNER, &vt) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 20)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_WARN + "Unable to get audio mode" + ENO);
+ return false;
+@@ -555,7 +580,14 @@ bool MpegRecorder::SetLanguageMode(int c
+ success = false;
+ }
+
+- if (ioctl(chanfd, VIDIOC_S_TUNER, &vt) < 0)
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(chanfd, VIDIOC_S_TUNER, &vt) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 20)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_WARN + "Unable to set audio mode" + ENO);
+ success = false;
+@@ -567,9 +599,18 @@ bool MpegRecorder::SetLanguageMode(int c
+ bool MpegRecorder::SetRecordingVolume(int chanfd)
+ {
+ // Get volume min/max values
++ uint idx;
+ struct v4l2_queryctrl qctrl;
+ qctrl.id = V4L2_CID_AUDIO_VOLUME;
+- if (ioctl(chanfd, VIDIOC_QUERYCTRL, &qctrl) < 0)
++
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(chanfd, VIDIOC_QUERYCTRL, &qctrl) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 20)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_WARN +
+ "Unable to get recording volume parameters(max/min)" + ENO +
+@@ -588,7 +629,14 @@ bool MpegRecorder::SetRecordingVolume(in
+ ctrl.id = V4L2_CID_AUDIO_VOLUME;
+ ctrl.value = ctrl_volume;
+
+- if (ioctl(chanfd, VIDIOC_S_CTRL, &ctrl) < 0)
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(chanfd, VIDIOC_S_CTRL, &ctrl) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 20)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_WARN +
+ "Unable to set recording volume" + ENO + "\n\t\t\t" +
+@@ -771,6 +819,7 @@ static void set_ctrls(int fd, vector<str
+
+ for (uint i = 0; i < ext_ctrls.size(); i++)
+ {
++ uint idx;
+ struct v4l2_ext_controls ctrls;
+ bzero(&ctrls, sizeof(struct v4l2_ext_controls));
+
+@@ -780,7 +829,14 @@ static void set_ctrls(int fd, vector<str
+ ctrls.count = 1;
+ ctrls.controls = &ext_ctrls[i];
+
+- if (ioctl(fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(fd, VIDIOC_S_EXT_CTRLS, &ctrls) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 20)
+ {
+ QMutexLocker locker(&control_description_lock);
+ VERBOSE(VB_IMPORTANT, QString("mpegrecorder.cpp:set_ctrls(): ") +
+@@ -820,6 +876,30 @@ bool MpegRecorder::SetV4L2DeviceOptions(
+ {
+ maxbitrate = high_mpeg4peakbitrate;
+ bitrate = high_mpeg4avgbitrate;
++
++ // query supported audio codecs and prefer AC3
++ uint idx;
++ struct v4l2_queryctrl qctrl;
++ qctrl.id = V4L2_CID_MPEG_AUDIO_ENCODING;
++
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(chanfd, VIDIOC_QUERYCTRL, &qctrl) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 20)
++ {
++ VERBOSE(VB_IMPORTANT, LOC_WARN +
++ "Unable to get supported audio codecs." + ENO);
++ }
++ else
++ {
++ if (qctrl.minimum != qctrl.maximum)
++ add_ext_ctrl(ext_ctrls, V4L2_CID_MPEG_AUDIO_ENCODING,
++ qctrl.maximum);
++ }
+ }
+ maxbitrate = std::max(maxbitrate, bitrate);
+
+@@ -843,10 +923,19 @@ bool MpegRecorder::SetV4L2DeviceOptions(
+ int audioinput = audiodevice.toUInt(&ok);
+ if (ok)
+ {
++ uint idx;
+ struct v4l2_audio ain;
+ bzero(&ain, sizeof(ain));
+ ain.index = audioinput;
+- if (ioctl(chanfd, VIDIOC_ENUMAUDIO, &ain) < 0)
++
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(chanfd, VIDIOC_ENUMAUDIO, &ain) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 20)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_WARN +
+ "Unable to get audio input.");
+@@ -854,7 +943,15 @@ bool MpegRecorder::SetV4L2DeviceOptions(
+ else
+ {
+ ain.index = audioinput;
+- if (ioctl(chanfd, VIDIOC_S_AUDIO, &ain) < 0)
++
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(chanfd, VIDIOC_S_AUDIO, &ain) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 20)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_WARN +
+ "Unable to set audio input.");
+@@ -1042,17 +1139,26 @@ void MpegRecorder::StartRecording(void)
+ if (deviceIsMpegFile)
+ elapsedTimer.start();
+ else if (_device_read_buffer)
+- _device_read_buffer->Start();
++ {
++ VERBOSE(VB_RECORD, LOC + "Initial startup of recorder");
+
+- needs_resolution = (driver == "hdpvr");
++ if (StartEncoding(readfd))
++ _device_read_buffer->Start();
++ else
++ {
++ VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to start recording");
++ recording = false;
++ QMutexLocker locker(&recording_wait_lock);
++ recording_wait.wakeAll();
++ _error = true;
++ }
++ }
+
+ QByteArray vdevice = videodevice.toAscii();
+ while (encoding && !_error)
+ {
+ if (PauseAndWait(100))
+ continue;
+-
+- HandleResolutionChanges();
+
+ if (deviceIsMpegFile)
+ {
+@@ -1096,35 +1202,7 @@ void MpegRecorder::StartRecording(void)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Device error detected");
+
+- _device_read_buffer->Stop();
+-
+- QMutexLocker locker(&start_stop_encoding_lock);
+-
+- StopEncoding(readfd);
+-
+- // Make sure the next things in the file are a PAT & PMT
+- if (_stream_data->PATSingleProgram() &&
+- _stream_data->PMTSingleProgram())
+- {
+- bool tmp = _wait_for_keyframe_option;
+- _wait_for_keyframe_option = false;
+- HandleSingleProgramPAT(_stream_data->PATSingleProgram());
+- HandleSingleProgramPMT(_stream_data->PMTSingleProgram());
+- _wait_for_keyframe_option = tmp;
+- }
+-
+- if (StartEncoding(readfd))
+- {
+- _device_read_buffer->Start();
+- }
+- else
+- {
+- if (0 != close(readfd))
+- VERBOSE(VB_IMPORTANT, LOC_ERR + "Close error" + ENO);
+-
+- // Force card to be reopened on next iteration..
+- readfd = -1;
+- }
++ RestartEncoding();
+ }
+ else if (_device_read_buffer->IsEOF())
+ {
+@@ -1222,6 +1300,8 @@ void MpegRecorder::StartRecording(void)
+ }
+ }
+
++ VERBOSE(VB_RECORD, LOC + "StartRecording finishing up");
++
+ if (_device_read_buffer)
+ {
+ if (_device_read_buffer->IsRunning())
+@@ -1230,6 +1310,7 @@ void MpegRecorder::StartRecording(void)
+ delete _device_read_buffer;
+ _device_read_buffer = NULL;
+ }
++
+ StopEncoding(readfd);
+
+ FinishRecording();
+@@ -1379,19 +1460,14 @@ bool MpegRecorder::PauseAndWait(int time
+
+ if (!paused)
+ {
++ VERBOSE(VB_RECORD, LOC + "PauseAndWait pause");
++
+ if (_device_read_buffer)
+ {
+ QMutex drb_lock;
+ drb_lock.lock();
+-
+ _device_read_buffer->SetRequestPause(true);
+-
+- pauseWait.wait(&drb_lock, timeout);
+- }
+- else
+- {
+- paused = true;
+- pauseWait.wakeAll();
++ _device_read_buffer->WaitForPaused(4000);
+ }
+
+ // Some drivers require streaming to be disabled before
+@@ -1399,32 +1475,76 @@ bool MpegRecorder::PauseAndWait(int time
+ if (requires_special_pause)
+ StopEncoding(readfd);
+
++ paused = true;
++ pauseWait.wakeAll();
++
+ if (tvrec)
+ tvrec->RecorderPaused();
+ }
+
+ unpauseWait.wait(&waitlock, timeout);
+ }
+- if (!request_pause)
++
++ if (!request_pause && paused)
+ {
+- if (paused)
++ VERBOSE(VB_RECORD, LOC + "PauseAndWait unpause");
++
++ if (driver == "hdpvr")
+ {
+- // Some drivers require streaming to be disabled before
+- // an input switch and other channel format setting.
+- if (requires_special_pause)
+- StartEncoding(readfd);
++ m_h264_parser.Reset();
++ _wait_for_keyframe_option = true;
++ _seen_sps = false;
++ }
+
+- if (_device_read_buffer)
+- _device_read_buffer->SetRequestPause(false);
++ // Some drivers require streaming to be disabled before
++ // an input switch and other channel format setting.
++ if (requires_special_pause)
++ StartEncoding(readfd);
++
++ if (_device_read_buffer)
++ _device_read_buffer->SetRequestPause(false);
++
++ if (_stream_data)
++ _stream_data->Reset(_stream_data->DesiredProgram());
+
+- if (_stream_data)
+- _stream_data->Reset(_stream_data->DesiredProgram());
+- }
+ paused = false;
+ }
++
+ return paused;
+ }
+
++void MpegRecorder::RestartEncoding(void)
++{
++ VERBOSE(VB_RECORD, LOC + "RestartEncoding");
++
++ _device_read_buffer->Stop();
++
++ QMutexLocker locker(&start_stop_encoding_lock);
++
++ StopEncoding(readfd);
++
++ // Make sure the next things in the file are a PAT & PMT
++ if (_stream_data->PATSingleProgram() &&
++ _stream_data->PMTSingleProgram())
++ {
++ _wait_for_keyframe_option = false;
++ HandleSingleProgramPAT(_stream_data->PATSingleProgram());
++ HandleSingleProgramPMT(_stream_data->PMTSingleProgram());
++ }
++
++ if (StartEncoding(readfd))
++ {
++ _device_read_buffer->Start();
++ }
++ else
++ {
++ if (0 != close(readfd))
++ VERBOSE(VB_IMPORTANT, LOC_ERR + "Close error" + ENO);
++
++ readfd = -1;
++ }
++}
++
+ bool MpegRecorder::StartEncoding(int fd)
+ {
+ QMutexLocker locker(&start_stop_encoding_lock);
+@@ -1433,13 +1553,22 @@ bool MpegRecorder::StartEncoding(int fd)
+ memset(&command, 0, sizeof(struct v4l2_encoder_cmd));
+ command.cmd = V4L2_ENC_CMD_START;
+
++ if (driver == "hdpvr")
++ HandleResolutionChanges();
++
+ VERBOSE(VB_RECORD, LOC + "StartEncoding");
+- needs_resolution = (driver == "hdpvr");
+
+- for (int idx = 0; idx < 10; ++idx)
++ for (int idx = 0; idx < 20; ++idx)
+ {
+ if (ioctl(fd, VIDIOC_ENCODER_CMD, &command) == 0)
+ {
++ if (driver == "hdpvr")
++ {
++ m_h264_parser.Reset();
++ _wait_for_keyframe_option = true;
++ _seen_sps = false;
++ }
++
+ VERBOSE(VB_RECORD, LOC + "Encoding started");
+ return true;
+ }
+@@ -1450,7 +1579,7 @@ bool MpegRecorder::StartEncoding(int fd)
+ return false;
+ }
+
+- usleep(250 * 1000);
++ usleep(100 * 1000);
+ }
+
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "StartEncoding - giving up" + ENO);
+@@ -1467,9 +1596,8 @@ bool MpegRecorder::StopEncoding(int fd)
+
+ VERBOSE(VB_RECORD, LOC + "StopEncoding");
+
+- for (int idx = 0; idx < 10; ++idx)
++ for (int idx = 0; idx < 20; ++idx)
+ {
+-
+ if (ioctl(fd, VIDIOC_ENCODER_CMD, &command) == 0)
+ {
+ VERBOSE(VB_RECORD, LOC + "Encoding stopped");
+@@ -1482,7 +1610,7 @@ bool MpegRecorder::StopEncoding(int fd)
+ return false;
+ }
+
+- usleep(250 * 1000);
++ usleep(100 * 1000);
+ }
+
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "StopEncoding - giving up" + ENO);
+@@ -1550,7 +1678,7 @@ void MpegRecorder::HandleSingleProgramPA
+ void MpegRecorder::HandleSingleProgramPMT(ProgramMapTable *pmt)
+ {
+ if (!pmt)
+-{
++ {
+ return;
+ }
+
+@@ -1570,27 +1698,94 @@ void MpegRecorder::HandleSingleProgramPM
+ DTVRecorder::BufferedWrite(*(reinterpret_cast<TSPacket*>(&buf[i])));
+ }
+
+-void MpegRecorder::HandleResolutionChanges(void)
++bool MpegRecorder::WaitFor_HDPVR(void)
+ {
+- if (!needs_resolution)
+- return;
++ // After a resolution change, it can take the HD-PVR a few
++ // seconds before it is usable again.
++
++ // Tell it to start encoding, then wait for it to actually feed us
++ // some data.
++ QMutexLocker locker(&start_stop_encoding_lock);
++
++
++ // Sleep any less than 1.5 seconds, and the HD-PVR will
++ // return the old resolution, when the resolution is changing.
++ usleep(1500 * 1000);
+
++ struct v4l2_encoder_cmd command;
++ struct pollfd polls;
++ int idx;
++
++ memset(&command, 0, sizeof(struct v4l2_encoder_cmd));
++ command.cmd = V4L2_ENC_CMD_START;
++
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(readfd, VIDIOC_ENCODER_CMD, &command) == 0)
++ break;
++ usleep(100 * 1000);
++ }
++
++ if (idx == 20)
++ return false;
++
++ polls.fd = readfd;
++ polls.events = POLLIN;
++ polls.revents = 0;
++
++ for (idx = 0; idx < 10; ++idx)
++ {
++ if (poll(&polls, 1, 250) > 0)
++ break;
++ }
++
++ if (idx == 10)
++ return false;
++
++ // HD-PVR should now be "ready"
++ command.cmd = V4L2_ENC_CMD_STOP;
++
++ for (idx = 0; idx < 20; ++idx)
++ {
++ if (ioctl(readfd, VIDIOC_ENCODER_CMD, &command) == 0)
++ return true;
++ usleep(100 * 1000);
++ }
++
++ return false;
++}
++
++void MpegRecorder::HandleResolutionChanges(void)
++{
+ VERBOSE(VB_RECORD, LOC + "Checking Resolution");
+ struct v4l2_format vfmt;
+ memset(&vfmt, 0, sizeof(vfmt));
+ vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+
++ if (driver == "hdpvr")
++ WaitFor_HDPVR();
++
++ uint idx;
+ uint pix = 0;
++
++ for (idx = 0; idx < 20; ++idx)
++ {
+ if (0 == ioctl(chanfd, VIDIOC_G_FMT, &vfmt))
+ {
+ VERBOSE(VB_RECORD, LOC + QString("Got Resolution %1x%2")
+ .arg(vfmt.fmt.pix.width).arg(vfmt.fmt.pix.height));
+ pix = vfmt.fmt.pix.width * vfmt.fmt.pix.height;
+- needs_resolution = false;
++ break;
++ }
++ // Typically takes 0.9 seconds after a resolution change
++ usleep(100 * 1000);
+ }
+
+ if (!pix)
++ {
++ VERBOSE(VB_RECORD, LOC + "Giving up detecting resolution");
+ return; // nothing to do, we don't have a resolution yet
++ }
+
+ int old_max = maxbitrate, old_avg = bitrate;
+ if (pix <= 768*568)
+@@ -1648,12 +1843,6 @@ void MpegRecorder::HandleResolutionChang
+ maxbitrate * 1000);
+
+ set_ctrls(readfd, ext_ctrls);
+- }
+
+- // Restart streaming. Shouldn't be needed? seems to be with current driver.
+- QMutexLocker locker(&start_stop_encoding_lock);
+- StopEncoding(readfd);
+- StartEncoding(readfd);
+-
+- needs_resolution = false;
++ }
+ }
+Index: libs/libmythtv/mpegrecorder.h
+===================================================================
+--- libs/libmythtv/mpegrecorder.h.orig
++++ libs/libmythtv/mpegrecorder.h
+@@ -80,11 +80,13 @@ class MpegRecorder : public DTVRecorder,
+ uint GetFilteredAudioLayer(void) const;
+ uint GetFilteredAudioBitRate(uint audio_layer) const;
+
++ void RestartEncoding(void);
+ bool StartEncoding(int fd);
+ bool StopEncoding(int fd);
+
+ void ResetForNewFile(void);
+
++ bool WaitFor_HDPVR(void);
+ void HandleResolutionChanges(void);
+
+ inline bool CheckCC(uint pid, uint cc);
+@@ -104,7 +106,6 @@ class MpegRecorder : public DTVRecorder,
+ // State
+ bool recording;
+ bool encoding;
+- bool needs_resolution;
+ mutable QMutex start_stop_encoding_lock;
+ QMutex recording_wait_lock;
+ QWaitCondition recording_wait;
+@@ -113,7 +114,7 @@ class MpegRecorder : public DTVRecorder,
+ bool cleartimeonpause;
+
+ // Encoding info
+- int width, height;
++ uint width, height;
+ int bitrate, maxbitrate, streamtype, aspectratio;
+ int audtype, audsamplerate, audbitratel1, audbitratel2, audbitratel3;
+ int audvolume;
diff --git a/abs/core-testing/mythtv/trunk/mythtv/myth.sh b/abs/core-testing/mythtv/trunk/mythtv/myth.sh
new file mode 100755
index 0000000..fb7122c
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/myth.sh
@@ -0,0 +1,4 @@
+export PATH=$PATH:/usr/local/bin
+# set core file size to 0
+ulimit -c 0
+export MALLOC_CHECK_=0 \ No newline at end of file
diff --git a/abs/core-testing/mythtv/trunk/mythtv/mythbackend b/abs/core-testing/mythtv/trunk/mythtv/mythbackend
new file mode 100755
index 0000000..93773a2
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/mythbackend
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+. /etc/rc.conf
+. /etc/rc.d/functions
+
+PID=`pidof -o %PPID /usr/bin/mythbackend`
+case "$1" in
+ start)
+ stat_busy "Starting MythTV Backend"
+ [ ! -e /var/run/mysqld.pid ] && echo -n "mysqld not started" && stat_fail && exit
+ [ -z "$PID" ] && /usr/bin/mythbackend -d -l /var/log/mythbackend.log -v important
+ if [ $? -gt 0 ]; then
+ stat_fail
+ else
+ echo $PID > /var/run/mythbackend.pid
+ add_daemon mythbackend
+ stat_done
+ fi
+ ;;
+ stop)
+ stat_busy "Stopping MythTV Backend"
+ [ ! -z "$PID" ] && kill $PID &>/dev/null
+ if [ $? -gt 0 ]; then
+ stat_fail
+ else
+ rm_daemon mythbackend
+ stat_done
+ fi
+ ;;
+ restart)
+ $0 stop
+ sleep 1s
+ $0 start
+ ;;
+ *)
+ echo "usage: $0 {start|stop|restart}"
+esac
+exit 0
diff --git a/abs/core-testing/mythtv/trunk/mythtv/mythbackend.sh b/abs/core-testing/mythtv/trunk/mythtv/mythbackend.sh
new file mode 100755
index 0000000..e7a7b70
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/mythbackend.sh
@@ -0,0 +1,117 @@
+#!/bin/bash
+#
+# /etc/rc.d/init.d/mythbackend
+#
+# Starts the mythbackend as a daemon
+#
+# chkconfig: 345 90 10
+# description: Starts the mythbackend process as a daemon after the XWindows \
+# system is started, in runlevel 5. This allows scheduled \
+# recordings to occur without manual intervention.
+# processname: mythbackend
+
+# Copyright (c) by Michael Thomson <linux at m-thomson dot net>
+# With thanks to Stu Tomlinson <stu at nosnilmot dot com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# Default values to use if none are supplied in the config file.
+# User who should start the mythbackend processes
+MBE_USER="root"
+# Directory holding the mythbackend binary
+MBE_LOCATION="/usr/local/bin/"
+# Name of mythbackend binary
+MBE_PROG="mythbackend"
+# Full path to mythbackend log file
+MBE_LOGFILE="/var/log/mythtv/mythbackend.log"
+
+# Source function library.
+. /etc/init.d/functions
+
+# Source config file if available
+if [ -f "/etc/sysconfig/mythbackend" ]; then
+ . /etc/sysconfig/mythbackend
+fi
+
+test -x ${MBE_LOCATION}${MBE_PROG} || exit 0
+
+RETVAL=0
+
+#
+# See how we were called.
+#
+
+start() {
+ # Check if mythbackend is already running
+ if [ ! -f /var/lock/subsys/${MBE_PROG} ]; then
+ echo -n "Starting ${MBE_PROG}: "
+ # /usr/local/bin/mythbackend -d -l /some/log/file
+ #daemon --user ${MBE_USER} ${MBE_LOCATION}${MBE_PROG} -d -l ${MBE_LOGFILE}
+ ${MBE_LOCATION}${MBE_PROG} -d -l ${MBE_LOGFILE}
+ RETVAL=$?
+ [ $RETVAL -eq 0 ] && touch /var/lock/subsys/${MBE_PROG}
+ echo
+ fi
+ return $RETVAL
+}
+
+stop() {
+ echo -n "Stopping ${MBE_PROG}: "
+ killproc ${MBE_LOCATION}${MBE_PROG}
+ RETVAL=$?
+ [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/${MBE_PROG}
+ echo
+ return $RETVAL
+}
+
+
+restart() {
+ stop
+ start
+}
+
+reload() {
+ restart
+}
+
+status_at() {
+ status ${MBE_LOCATION}${MBE_PROG}
+}
+
+case "$1" in
+start)
+ start
+ ;;
+stop)
+ stop
+ ;;
+reload|restart)
+ restart
+ ;;
+condrestart)
+ if [ -f /var/lock/subsys/${MBE_PROG} ]; then
+ restart
+ fi
+ ;;
+status)
+ status_at
+ ;;
+*)
+ echo "Usage: $0 {start|stop|restart|condrestart|status}"
+ exit 1
+esac
+
+exit $?
+exit $RETVAL
diff --git a/abs/core-testing/mythtv/trunk/mythtv/mythtv.install b/abs/core-testing/mythtv/trunk/mythtv/mythtv.install
new file mode 100755
index 0000000..513852a
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/mythtv.install
@@ -0,0 +1,55 @@
+
+# arg 1: the new package version
+pre_install () {
+ echo "backing up the database"
+ dbver=`pacman -Q mythtv-svn | awk ' { print $2 } '`
+ if [ ! -e /data/databases_backup ]
+ then
+ mkdir -p /data/database_backup
+ fi
+ mysqldump -u mythtv -pmythtv mythconverg -c > /data/database_backup/${dbver}.dump.sql
+}
+
+post_install() {
+ mkdir -p /data/home
+ /usr/sbin/useradd -G users,video,audio,optical -m -d /data/home/mythtv mythtv
+ /usr/sbin/usermod -G users,video,audio,optical mythtv
+# mkdir /var/log/mythtv
+# chown -R mythtv:users /var/log/mythtv
+ dbver=`pacman -Q mythtv-svn | awk ' { print $2 } '`
+ if [ ! -e /data/database_backup ]
+ then
+ mkdir -p /data/database_backup
+ fi
+ chown mythtv:nobody /data/database_backup
+ chmod g+s /data/database_backup
+
+ mysqldump -u mythtv -pmythtv mythconverg -c > /data/database_backup/${dbver}.dump.sql
+
+
+}
+pre_upgrade () {
+ pre_install
+}
+
+# arg 1: the new package version
+# arg 2: the old package version
+post_upgrade() {
+ post_install
+
+ /bin/true
+}
+
+# arg 1: the old package version
+pre_remove() {
+ /bin/true
+}
+
+# arg 1: the old package version
+post_remove() {
+/bint/true
+}
+
+op=$1
+shift
+$op $*
diff --git a/abs/core-testing/mythtv/trunk/mythtv/smolt_jump.patch b/abs/core-testing/mythtv/trunk/mythtv/smolt_jump.patch
new file mode 100644
index 0000000..0fc452a
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/smolt_jump.patch
@@ -0,0 +1,30 @@
+Index: programs/mythfrontend/networkcontrol.cpp
+===================================================================
+--- programs/mythfrontend/networkcontrol.cpp (revision 19291)
++++ programs/mythfrontend/networkcontrol.cpp (working copy)
+@@ -83,6 +83,7 @@
+ jumpMap["zoneminderliveview"] = "ZoneMinder Live View";
+ jumpMap["zoneminderevents"] = "ZoneMinder Events";
+ jumpMap["snapshot"] = "ScreenShot";
++ jumpMap["mythsmolt"] = "MythSmolt";
+
+ // These jump point names match the (lowercased) locations from gContext
+ jumpMap["channelrecpriority"] = "Channel Recording Priorities";
+@@ -191,7 +192,7 @@
+ pthread_create(&command_thread, NULL, CommandThread, this);
+
+ gContext->addListener(this);
+-
++
+ connect(this, SIGNAL(newConnection()), this, SLOT(newConnection()));
+ }
+
+@@ -307,7 +308,7 @@
+ cs = new QTextStream(s);
+ cs->setCodec("UTF-8");
+ }
+-
++
+ if (client)
+ {
+ closedOldConn = true;
diff --git a/abs/core-testing/mythtv/trunk/mythtv/svn_main_menu_popup.patch b/abs/core-testing/mythtv/trunk/mythtv/svn_main_menu_popup.patch
new file mode 100644
index 0000000..5556683
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv/svn_main_menu_popup.patch
@@ -0,0 +1,211 @@
+Index: libs/libmythui/myththemedmenu.h
+===================================================================
+--- libs/libmythui/myththemedmenu.h (revision 19291)
++++ libs/libmythui/myththemedmenu.h (working copy)
+@@ -2,6 +2,7 @@
+ #define MYTHTHEMEDMENU_H_
+
+ #include "mythscreentype.h"
++#include "mythdialogbox.h"
+ #include "mythuistatetype.h"
+ #include "mythuibuttonlist.h"
+ #include "xmlparsebase.h"
+@@ -77,6 +78,11 @@
+ void ReloadExitKey(void);
+ virtual void aboutToShow(void);
+
++ void doMenu();
++ void aboutScreen();
++ MythDialogBox *m_menuPopup;
++ void customEvent(QEvent *event);
++
+ protected:
+ virtual bool keyPressEvent(QKeyEvent *e);
+
+Index: libs/libmythui/myththemedmenu.cpp
+===================================================================
+--- libs/libmythui/myththemedmenu.cpp (revision 19291)
++++ libs/libmythui/myththemedmenu.cpp (working copy)
+@@ -32,6 +32,7 @@
+ m_callbackdata = NULL;
+
+ m_killable = false;
++
+ }
+
+ MythThemedMenuState::~MythThemedMenuState()
+@@ -95,7 +96,7 @@
+ m_exitModifier = -1;
+ m_menumode = "";
+ m_buttonList = NULL;
+-
++ m_menuPopup = NULL;
+ if (!m_state)
+ {
+ m_state = new MythThemedMenuState(parent, "themedmenustate");
+@@ -271,6 +272,10 @@
+ m_wantpop = true;
+ }
+ }
++ else if (action == "MENU")
++ {
++ doMenu();
++ }
+ else
+ handled = false;
+ }
+@@ -292,6 +297,154 @@
+ updateLCD();
+ }
+
++void MythThemedMenu::doMenu()
++{
++
++ if (m_menuPopup)
++ return;
++ int allowsd = GetMythDB()->GetNumSetting("AllowQuitShutdown");
++ int override_menu = GetMythDB()->GetNumSetting("OverRideExitMenu");
++ QString label = "System Menu";
++ MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
++ m_menuPopup = new MythDialogBox(label, mainStack, "menuPopup");
++ if (m_menuPopup->Create())
++ mainStack->AddScreen(m_menuPopup);
++ if ( override_menu == 0 )
++ {
++ if ( allowsd != 0 && allowsd !=4 )
++ {
++ m_menuPopup->SetReturnEvent(this,"popmenu_exit");
++ m_menuPopup->AddButton("Shutdown");
++ m_menuPopup->AddButton("Reboot");
++ }
++ else
++ {
++ m_menuPopup->SetReturnEvent(this,"popmenu_noexit");
++ }
++ }
++ if ( override_menu == 5 )
++ { // reboot
++ m_menuPopup->SetReturnEvent(this,"popmenu_reboot");
++ m_menuPopup->AddButton("Reboot");
++ }
++ else if ( override_menu == 2 || override_menu == 4 )
++ { // shutdown
++ m_menuPopup->SetReturnEvent(this,"popmenu_shutdown");
++ m_menuPopup->AddButton("Shutdown");
++ }
++ else if ( override_menu == 3 || override_menu == 6 )
++ { // both
++ m_menuPopup->SetReturnEvent(this,"popmenu_exit");
++ m_menuPopup->AddButton("Shutdown");
++ m_menuPopup->AddButton("Reboot");
++ }
++ else
++ {
++ m_menuPopup->SetReturnEvent(this,"popmenu_noexit");
++ }
++
++ m_menuPopup->AddButton("About");
++ m_menuPopup->AddButton("Cancel");
++
++}
++void MythThemedMenu::aboutScreen()
++{
++
++ extern const char *myth_source_version;
++ extern const char *myth_source_path;
++ QString distro_line;
++ distro_line="";
++
++ QFile file("/etc/os_myth_release");
++ if ( file.open(QFile::ReadOnly))
++ {
++ QTextStream t( &file ); // use a text stream
++ distro_line = t.readLine();
++ file.close();
++ }
++
++ QString label = "";
++ label.append(QObject::tr("Revision: ") + myth_source_version + " \n Branch:" + myth_source_path + "\n" + distro_line );
++
++ MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
++ m_menuPopup = new MythDialogBox(label, mainStack, "About");
++ if (m_menuPopup->Create())
++ mainStack->AddScreen(m_menuPopup);
++
++ m_menuPopup->SetReturnEvent(this,"About");
++ m_menuPopup->AddButton("OK!");
++
++}
++
++void MythThemedMenu::customEvent(QEvent *event)
++{
++ if (event->type() == kMythDialogBoxCompletionEventType)
++ {
++ DialogCompletionEvent *dce =
++ dynamic_cast<DialogCompletionEvent*>(event);
++ QString resultid= dce->GetId();
++ int buttonnum = dce->GetResult();
++ QString halt_cmd=GetMythDB()->GetSetting("HaltCommand");
++ QString reboot_cmd=GetMythDB()->GetSetting("RebootCommand");
++
++ if (resultid == "popmenu_exit")
++ {
++ if (buttonnum == 0)
++ {
++ if (!halt_cmd.isEmpty() )
++ system(halt_cmd.toAscii());
++ }
++
++ if (buttonnum == 1)
++ {
++ if (!reboot_cmd.isEmpty() )
++ system(reboot_cmd.toAscii());
++ }
++
++ if (buttonnum == 2)
++ {
++ aboutScreen();
++ }
++ }
++
++ if (resultid == "popmenu_noexit")
++ {
++ if (buttonnum == 0)
++ aboutScreen();
++ }
++
++ if (resultid == "popmenu_reboot")
++ {
++ if (buttonnum == 0)
++ {
++ if (!reboot_cmd.isEmpty() )
++ system(reboot_cmd.toAscii());
++ }
++
++ if (buttonnum == 1)
++ {
++ aboutScreen();
++ }
++ }
++
++ if (resultid == "popmenu_shutdown")
++ {
++ if (buttonnum == 0)
++ {
++ if (!halt_cmd.isEmpty() )
++ system(halt_cmd.toAscii());
++ }
++
++ if (buttonnum == 1)
++ {
++ aboutScreen();
++ }
++ }
++
++ m_menuPopup = NULL;
++ }
++}
++
+ /** \brief Parses the element's tags and set the ThemeButton's type,
+ * text, depends, and action, then adds the button.
+ *