From 8203006cf9ee68a8e33e30d48ea6b396d1a7b7e4 Mon Sep 17 00:00:00 2001 From: James Meyer Date: Tue, 9 Dec 2008 15:15:29 -0600 Subject: Initial checkin for mythtv-trunk builds --- .../DeviceReadBuffer-polltimeout.2.patch | 219 +++++++ abs/core-testing/mythtv/trunk/mythtv-svn/PKGBUILD | 78 +++ .../mythtv/trunk/mythtv-svn/aacdecoder.cpp.patch | 12 + .../trunk/mythtv-svn/hdpvr-v4lchannel-tweak.patch | 139 +++++ .../trunk/mythtv-svn/menu-xml/HOST_SETTINGS.xml | 87 +++ .../mythtv/trunk/mythtv-svn/menu-xml/is.xml | 33 ++ .../mythtv/trunk/mythtv-svn/menu-xml/knoppmyth.xml | 55 ++ .../trunk/mythtv-svn/menu-xml/library.xml.patch | 13 + .../trunk/mythtv-svn/menu-xml/mainmenu.xml.patch | 16 + .../mythtv/trunk/mythtv-svn/menu-xml/motion.xml | 20 + .../mythtv-svn/menu-xml/optical_menu.xml.patch | 15 + .../mythtv/trunk/mythtv-svn/menu-xml/setup.xml | 111 ++++ .../trunk/mythtv-svn/menu-xml/siriusmenu.xml | 419 +++++++++++++ .../mythtv/trunk/mythtv-svn/menu-xml/xmmenu.xml | 574 ++++++++++++++++++ .../trunk/mythtv-svn/mpegrecorder-hdpvr-v1.1.patch | 658 +++++++++++++++++++++ abs/core-testing/mythtv/trunk/mythtv-svn/myth.sh | 4 + .../mythtv/trunk/mythtv-svn/mythbackend | 37 ++ .../mythtv/trunk/mythtv-svn/mythbackend.sh | 117 ++++ .../trunk/mythtv-svn/mythcommflag-avidemux.2.patch | 179 ++++++ .../mythtv/trunk/mythtv-svn/mythtv.install | 55 ++ .../patches/DeviceReadBuffer-polltimeout.2.patch | 219 +++++++ .../trunk/mythtv-svn/patches/aacdecoder.cpp.patch | 12 + .../patches/hdpvr-v4lchannel-tweak.patch | 139 +++++ .../patches/mpegrecorder-hdpvr-v1.1.patch | 658 +++++++++++++++++++++ .../patches/mythcommflag-avidemux.2.patch | 179 ++++++ .../mythtv/trunk/mythtv-svn/smolt_jump.patch | 30 + .../trunk/mythtv-svn/svn_main_menu_popup.patch | 211 +++++++ 27 files changed, 4289 insertions(+) create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/DeviceReadBuffer-polltimeout.2.patch create mode 100755 abs/core-testing/mythtv/trunk/mythtv-svn/PKGBUILD create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/aacdecoder.cpp.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/hdpvr-v4lchannel-tweak.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/HOST_SETTINGS.xml create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/is.xml create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/knoppmyth.xml create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/library.xml.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/mainmenu.xml.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/motion.xml create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/optical_menu.xml.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/setup.xml create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/siriusmenu.xml create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/xmmenu.xml create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/mpegrecorder-hdpvr-v1.1.patch create mode 100755 abs/core-testing/mythtv/trunk/mythtv-svn/myth.sh create mode 100755 abs/core-testing/mythtv/trunk/mythtv-svn/mythbackend create mode 100755 abs/core-testing/mythtv/trunk/mythtv-svn/mythbackend.sh create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/mythcommflag-avidemux.2.patch create mode 100755 abs/core-testing/mythtv/trunk/mythtv-svn/mythtv.install create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/patches/DeviceReadBuffer-polltimeout.2.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/patches/aacdecoder.cpp.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/patches/hdpvr-v4lchannel-tweak.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/patches/mpegrecorder-hdpvr-v1.1.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/patches/mythcommflag-avidemux.2.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/smolt_jump.patch create mode 100644 abs/core-testing/mythtv/trunk/mythtv-svn/svn_main_menu_popup.patch diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/DeviceReadBuffer-polltimeout.2.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/DeviceReadBuffer-polltimeout.2.patch new file mode 100644 index 0000000..5bb713f --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/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-svn/PKGBUILD b/abs/core-testing/mythtv/trunk/mythtv-svn/PKGBUILD new file mode 100755 index 0000000..b5dc31d --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/PKGBUILD @@ -0,0 +1,78 @@ +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=('DeviceReadBuffer-polltimeout.2.patch' 'hdpvr-v4lchannel-tweak.patch' 'mpegrecorder-hdpvr-v1.1.patch' 'mythcommflag-avidemux.2.patch') +source=('mythbackend' 'myth.sh' 'smolt_jump.patch' 'svn_main_menu_popup.patch' `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 + cd $startdir/src/mythtv + echo "--------------------------applying patches----------------------------------------------------" + patch -Np0 -i $startdir/src/smolt_jump.patch #|| return 1 + patch -Np0 -i $startdir/src/svn_main_menu_popup.patch #||return 1 + + 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 --prefix=/usr --enable-xvmc --enable-xvmc-pro --enable-opengl-vsync --enable-dvb --enable-firewire --compile-type=release --with-bindings=perl --disable-audio-arts --disable-xrandr + . /etc/profile + make + make INSTALL_ROOT=$startdir/pkg install + + #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 + + # mkdir -p $startdir/pkg/usr/share/mythtv/contrib + # mkdir -p $startdir/pkg/etc/rc.d + # mkdir -p $startdir/pkg/var/log/mythtv + # mkdir -p $startdir/pkg/etc/profile.d + # install -m0755 ../myth.sh $startdir/pkg/etc/profile.d/ + + # install contrib + # mkdir -p $startdir/pkg/usr/local/share/mythtv/contrib || return 1 + # cp -rp contrib/* $startdir/pkg/usr/local/share/mythtv/contrib + # echo "-release-fixes" > $startdir/pkg/usr/local/share/mythtv/.releasetype + # install -m0755 themes/*.ttf $startdir/pkg/usr/local/share/mythtv/themes/ + + + # mkdir -p $startdir/pkg/usr/lib/ + # mv $startdir/pkg/usr/local/lib/perl5 $startdir/pkg/usr/lib/perl5 + # cd $startdir/src/mythtv/contrib + # gcc -Wall -o firewire_tester firewire_tester.c -liec61883 -lraw1394 + # install -m0755 firewire_tester $startdir/pkg/usr/local/bin/firewire_tester + #install -m0755 $startdir/pkg/usr/local/share/mythtv/contrib/optimize_mythdb.pl $startdir/pkg/usr/local/bin/optimize_mythdb.pl + # cp $startdir/src/myth.find_orphans.pl $startdir/pkg/usr/local/share/mythtv/contrib/myth.find_orphans.pl + # install -m0755 $startdir/pkg/usr/local/share/mythtv/contrib/myth.find_orphans.pl $startdir/pkg/usr/local/bin/myth.find_orphans.pl + + +} diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/aacdecoder.cpp.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/aacdecoder.cpp.patch new file mode 100644 index 0000000..8796eb4 --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/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 + diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/hdpvr-v4lchannel-tweak.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/hdpvr-v4lchannel-tweak.patch new file mode 100644 index 0000000..3535310 --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/hdpvr-v4lchannel-tweak.patch @@ -0,0 +1,139 @@ +Index: libs/libmythtv/v4lchannel.h +=================================================================== +--- libs/libmythtv/v4lchannel.h (revision 18874) ++++ libs/libmythtv/v4lchannel.h (working copy) +@@ -103,6 +103,8 @@ + VidModV4L2 videomode_v4l2; ///< Current video mode if 'usingv4l2' is true + + int defaultFreqTable; ++ int prev_inputNumV4L; ++ v4l2_std_id prev_vid_mode; + }; + + #endif +Index: libs/libmythtv/v4lchannel.cpp +=================================================================== +--- libs/libmythtv/v4lchannel.cpp (revision 18874) ++++ libs/libmythtv/v4lchannel.cpp (working copy) +@@ -40,7 +40,8 @@ + device_name(QString::null), driver_name(QString::null), + curList(NULL), totalChannels(0), + currentFormat(""), is_dtv(false), +- usingv4l2(false), defaultFreqTable(1) ++ usingv4l2(false), defaultFreqTable(1), ++ prev_inputNumV4L(-1), prev_vid_mode(-1) + { + } + +@@ -795,62 +796,75 @@ + { + VERBOSE(VB_CHANNEL, LOC + msg + "(v4l v2)"); + +- int ioctlval = ioctl(videofd, VIDIOC_S_INPUT, &inputNumV4L); ++ int ioctlval; ++ bool streamingDisabled = false; ++ int streamType = V4L2_BUF_TYPE_VIDEO_CAPTURE; + +- // ConvertX (wis-go7007) requires streaming to be disabled +- // before an input switch, do this if initial switch failed. +- bool streamingDisabled = false; +- int streamType = V4L2_BUF_TYPE_VIDEO_CAPTURE; +- if ((ioctlval < 0) && (errno == EBUSY)) ++ if (prev_inputNumV4L != inputNumV4L) + { +- ioctlval = ioctl(videofd, VIDIOC_STREAMOFF, &streamType); ++ ioctlval = ioctl(videofd, VIDIOC_S_INPUT, &inputNumV4L); ++ ++ // ConvertX (wis-go7007) requires streaming to be disabled ++ // before an input switch, do this if initial switch failed. ++ if ((ioctlval < 0) && (errno == EBUSY)) ++ { ++ ioctlval = ioctl(videofd, VIDIOC_STREAMOFF, &streamType); ++ if (ioctlval < 0) ++ { ++ VERBOSE(VB_IMPORTANT, LOC_ERR + msg + ++ "\n\t\t\twhile disabling streaming (v4l v2)" + ENO); ++ ++ ok = false; ++ ioctlval = 0; ++ } ++ else ++ { ++ streamingDisabled = true; ++ ++ // Resend the input switch ioctl. ++ ioctlval = ioctl(videofd, VIDIOC_S_INPUT, &inputNumV4L); ++ } ++ } ++ + if (ioctlval < 0) + { + VERBOSE(VB_IMPORTANT, LOC_ERR + msg + +- "\n\t\t\twhile disabling streaming (v4l v2)" + ENO); ++ "\n\t\t\twhile setting input (v4l v2)" + ENO); + + ok = false; +- ioctlval = 0; + } +- else +- { +- streamingDisabled = true; + +- // Resend the input switch ioctl. +- ioctlval = ioctl(videofd, VIDIOC_S_INPUT, &inputNumV4L); +- } ++ prev_inputNumV4L = inputNumV4L; + } + +- if (ioctlval < 0) +- { +- VERBOSE(VB_IMPORTANT, LOC_ERR + msg + +- "\n\t\t\twhile setting input (v4l v2)" + ENO); +- +- ok = false; +- } +- + v4l2_std_id vid_mode = format_to_mode(newFmt, 2); +- ioctlval = ioctl(videofd, VIDIOC_S_STD, &vid_mode); +- if (ioctlval < 0) +- { +- VERBOSE(VB_IMPORTANT, LOC_ERR + msg + +- "\n\t\t\twhile setting format (v4l v2)" + ENO); + +- ok = false; +- } +- +- // ConvertX (wis-go7007) requires streaming to be disabled +- // before an input switch, here we try to re-enable streaming. +- if (streamingDisabled) ++ if (prev_vid_mode != vid_mode) + { +- ioctlval = ioctl(videofd, VIDIOC_STREAMON, &streamType); ++ ioctlval = ioctl(videofd, VIDIOC_S_STD, &vid_mode); + if (ioctlval < 0) + { + VERBOSE(VB_IMPORTANT, LOC_ERR + msg + +- "\n\t\t\twhile reenabling streaming (v4l v2)" + ENO); ++ "\n\t\t\twhile setting format (v4l v2)" + ENO); + + ok = false; + } ++ ++ // ConvertX (wis-go7007) requires streaming to be disabled ++ // before an input switch, here we try to re-enable streaming. ++ if (streamingDisabled) ++ { ++ ioctlval = ioctl(videofd, VIDIOC_STREAMON, &streamType); ++ if (ioctlval < 0) ++ { ++ VERBOSE(VB_IMPORTANT, LOC_ERR + msg + ++ "\n\t\t\twhile reenabling streaming (v4l v2)" + ++ ENO); ++ ++ ok = false; ++ } ++ } ++ prev_vid_mode = vid_mode; + } + } + diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/HOST_SETTINGS.xml b/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/HOST_SETTINGS.xml new file mode 100644 index 0000000..f257920 --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/HOST_SETTINGS.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/is.xml b/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/is.xml new file mode 100644 index 0000000..65935cf --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/is.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/knoppmyth.xml b/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/knoppmyth.xml new file mode 100644 index 0000000..8aa6134 --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/knoppmyth.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/library.xml.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/library.xml.patch new file mode 100644 index 0000000..ef08f0c --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/menu-xml/library.xml.patch @@ -0,0 +1,13 @@ +--- library.xml.orig 2008-11-13 11:26:10.000000000 -0500 ++++ library.xml 2008-11-19 11:55:55.000000000 -0500 +@@ -120,9 +120,7 @@ + + + + ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/mpegrecorder-hdpvr-v1.1.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/mpegrecorder-hdpvr-v1.1.patch new file mode 100644 index 0000000..f292b7f --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/mpegrecorder-hdpvr-v1.1.patch @@ -0,0 +1,658 @@ +Index: libs/libmythtv/mpegrecorder.h +=================================================================== +--- libs/libmythtv/mpegrecorder.h (revision 19056) ++++ libs/libmythtv/mpegrecorder.h (working copy) +@@ -80,11 +80,13 @@ + 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 @@ + // 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 @@ + bool cleartimeonpause; + + // Encoding info +- int width, height; ++ uint width, height; + int bitrate, maxbitrate, streamtype, aspectratio; + int audtype, audsamplerate, audbitratel1, audbitratel2, audbitratel3; + int audvolume; +Index: libs/libmythtv/mpegrecorder.cpp +=================================================================== +--- libs/libmythtv/mpegrecorder.cpp (revision 19056) ++++ libs/libmythtv/mpegrecorder.cpp (working copy) +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + + // avlib headers + extern "C" { +@@ -86,7 +87,7 @@ + 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), +@@ -487,13 +488,21 @@ + + 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; + } +@@ -501,8 +510,15 @@ + 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; + } +@@ -513,10 +529,19 @@ + /// 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; + } +@@ -549,8 +574,15 @@ + 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; + } +@@ -561,10 +593,19 @@ + 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 + + "\n\t\t\tusing default range [0,65535]."); +@@ -582,8 +623,15 @@ + 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" + + "If you are using an AverMedia M179 card this is normal."); +@@ -765,6 +813,7 @@ + + for (uint i = 0; i < ext_ctrls.size(); i++) + { ++ uint idx; + struct v4l2_ext_controls ctrls; + bzero(&ctrls, sizeof(struct v4l2_ext_controls)); + +@@ -774,8 +823,15 @@ + 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(): ") + + QString("Could not set %1 to %2") +@@ -814,6 +870,30 @@ + { + 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); + +@@ -837,19 +917,36 @@ + 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."); + } + 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."); + } +@@ -1036,17 +1133,26 @@ + 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) + { +@@ -1090,35 +1196,7 @@ + { + 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()) + { +@@ -1216,6 +1294,8 @@ + } + } + ++ VERBOSE(VB_RECORD, LOC + "StartRecording finishing up"); ++ + if (_device_read_buffer) + { + if (_device_read_buffer->IsRunning()) +@@ -1224,6 +1304,7 @@ + delete _device_read_buffer; + _device_read_buffer = NULL; + } ++ + StopEncoding(readfd); + + FinishRecording(); +@@ -1373,52 +1454,95 @@ + + if (!paused) + { ++ VERBOSE(VB_RECORD, LOC + "PauseAndWait pause"); ++ ++ // Some drivers require streaming to be disabled before ++ // an input switch and other channel format setting. ++ if (requires_special_pause) ++ StopEncoding(readfd); ++ + 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(); +- } + +- // Some drivers require streaming to be disabled before +- // an input switch and other channel format setting. +- if (requires_special_pause) +- StopEncoding(readfd); +- ++ paused = true; + 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); ++ // Sleep any less than 1.5 seconds, and the HD-PVR will ++ // return the old resolution, when the resolution is changing. ++ usleep(1500 * 1000); ++ } + +- if (_stream_data) +- _stream_data->Reset(_stream_data->DesiredProgram()); +- } ++ // 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()); ++ + 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); +@@ -1427,13 +1551,22 @@ + 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; + } +@@ -1444,7 +1577,7 @@ + return false; + } + +- usleep(250 * 1000); ++ usleep(100 * 1000); + } + + VERBOSE(VB_IMPORTANT, LOC_ERR + "StartEncoding - giving up" + ENO); +@@ -1461,9 +1594,8 @@ + + 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"); +@@ -1476,7 +1608,7 @@ + return false; + } + +- usleep(250 * 1000); ++ usleep(100 * 1000); + } + + VERBOSE(VB_IMPORTANT, LOC_ERR + "StopEncoding - giving up" + ENO); +@@ -1544,7 +1676,7 @@ + void MpegRecorder::HandleSingleProgramPMT(ProgramMapTable *pmt) + { + if (!pmt) +-{ ++ { + return; + } + +@@ -1564,27 +1696,89 @@ + DTVRecorder::BufferedWrite(*(reinterpret_cast(&buf[i]))); + } + ++bool MpegRecorder::WaitFor_HDPVR(void) ++{ ++ // 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); ++ ++ 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) + { +- if (!needs_resolution) +- return; +- + 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) +@@ -1609,13 +1803,14 @@ + if (old_max == old_avg) + { + VERBOSE(VB_RECORD, LOC + +- QString("Old bitrate %1 CBR").arg(old_avg)); ++ QString("Old bitrate %1 CBR for %2x%3") ++ .arg(old_avg).arg(width).arg(height)); + } + else + { + VERBOSE(VB_RECORD, LOC + +- QString("Old bitrate %1/%2 VBR") +- .arg(old_avg).arg(old_max)); ++ QString("Old bitrate %1/%2 VBR for %3x%4") ++ .arg(old_avg).arg(old_max).arg(width).arg(height)); + } + + if (maxbitrate == bitrate) +@@ -1642,12 +1837,6 @@ + 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; + } diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/myth.sh b/abs/core-testing/mythtv/trunk/mythtv-svn/myth.sh new file mode 100755 index 0000000..fb7122c --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/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-svn/mythbackend b/abs/core-testing/mythtv/trunk/mythtv-svn/mythbackend new file mode 100755 index 0000000..f96c6b7 --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/mythbackend @@ -0,0 +1,37 @@ +#!/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/local/bin/mythbackend -d -l /var/log/mythbackend.log -v quiet + 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 + $0 start + ;; + *) + echo "usage: $0 {start|stop|restart}" +esac +exit 0 diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/mythbackend.sh b/abs/core-testing/mythtv/trunk/mythtv-svn/mythbackend.sh new file mode 100755 index 0000000..e7a7b70 --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/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 +# With thanks to Stu Tomlinson +# +# 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-svn/mythcommflag-avidemux.2.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/mythcommflag-avidemux.2.patch new file mode 100644 index 0000000..d26645f --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/mythcommflag-avidemux.2.patch @@ -0,0 +1,179 @@ +Index: programs/mythcommflag/main.cpp +=================================================================== +--- programs/mythcommflag/main.cpp (revision 18596) ++++ programs/mythcommflag/main.cpp (working copy) +@@ -300,6 +300,132 @@ + return COMMFLAG_EXIT_NO_ERROR_WITH_NO_BREAKS; + } + ++int GetAviDemux(QString list, QString chanid, QString starttime, const QString &outputfilename) ++{ ++ QMap cutlist; ++ QMap::Iterator it; ++ QString result; ++ int startValue = 0; ++ long long myTotalFrames; ++ long long myFrameRate; ++ ++ ProgramInfo *pginfo = ++ ProgramInfo::GetProgramFromRecorded(chanid, starttime); ++ ++ NuppelVideoPlayer* nvp = new NuppelVideoPlayer("avidemux_export", pginfo); ++ ++ myFrameRate = (long long)(nvp->GetFrameRate() * 1000); ++ myTotalFrames = 1000000; //nvp->GetTotalFrameCount(); ++ ++ if (!pginfo) ++ { ++ VERBOSE(VB_IMPORTANT, ++ QString("No program data exists for channel %1 at %2") ++ .arg(chanid).arg(starttime)); ++ return COMMFLAG_BUGGY_EXIT_NO_CHAN_DATA; ++ } ++ ++ QString filename = pginfo->GetPlaybackURL(TRUE); ++ ++ if (list == "cutlist") ++ pginfo->GetCutList(cutlist); ++ else ++ pginfo->GetCommBreakList(cutlist); ++ ++// Formatting of output data ++ ++ for (it = cutlist.begin(); it != cutlist.end(); ++it) ++ { ++ if ((it.key() == 0) && (startValue == 0)) // Cutlist starts on first frame, ++ { ++ ++it; ++ startValue = it.key(); ++ } ++ ++ if ((it.key() != 0) && (startValue == 0)) // Cutlist starts on non-first frame ++ { ++ result += QString("app.addSegment(0,0,%1);").arg(it.key()); ++ startValue = it.key(); ++ } ++ else ++ { ++ if ((*it == MARK_COMM_END) && (startValue != 0) || ++ (*it == MARK_CUT_END) && (startValue != 0)) ++ { ++ if (result != "") ++ result += "\n"; ++ startValue = it.key(); ++ result += QString("app.addSegment(0,%1,").arg(it.key()); // Value is a start value ++ } ++ else ++ { ++ result += QString("%1);").arg(it.key() - startValue); // Value is an end value ++ } ++ } ++ } ++ ++if (it.key() != myTotalFrames) ++ { ++ result += QString("%1);").arg(myTotalFrames); ++ } ++ ++// Governs the file output: ++ ++ QString tmp = ""; ++ ostream *out = &cout; ++ ++ if (outputfilename != "-"){ ++ QByteArray tmp = outputfilename.toLocal8Bit(); ++ out = new fstream(tmp.constData(), ios::app | ios::out ); ++ } ++ ++ if (outputfilename == ""){ ++ VERBOSE(VB_IMPORTANT, ++ QString("Error: AVIDemux output requires the use of the --outputfile option.")); ++ return COMMFLAG_EXIT_INVALID_CMDLINE; ++ } ++ ++ tmp = QString("//AD <- Needed to identify//\n" ++ "//--automatically built--\n" ++ "//--Project:\n\n" ++ "var app = new Avidemux();\n\n" ++ "//** Video **\n" ++ "// 01 videos source\n" ++ "app.load(\"%1\");\n\n" ++ "app.clearSegments();\n\n" ++ "%2\n" ++ "app.markerA=0;\n" ++ "app.markerB=%3;\n" ++ "app.rebuildIndex();\n\n" ++ "//** Postproc **\n" ++ "app.video.setPostProc(3,3,0);\n\n" ++ "app.video.setFps1000(%4);\n\n" ++ "//** Filters **\n\n" ++ "//** Video Codec conf **\n" ++ "app.video.codec(\"Copy\",\"CQ=4\",\"0 \");\n\n" ++ "//** Audio **\n" ++ "app.audio.reset();\n" ++ "app.audio.codec(\"copy\",128,0,\"\");\n" ++ "app.audio.normalizeMode=0;\n" ++ "app.audio.normalizeValue=0;\n" ++ "app.audio.delay=0;\n" ++ "app.audio.mixer(\"NONE\");\n" ++ "app.setContainer(\"AVI\");\n" ++ "setSuccess(1);\n" ++ "//app.Exit();\n\n" ++ "//End of script\n").arg(filename).arg(result).arg(myTotalFrames).arg(myFrameRate).toLocal8Bit().constData(); ++ ++ const QByteArray tmp2 = tmp.toLocal8Bit(); ++ *out << tmp2.constData() << endl; ++ ++ VERBOSE(VB_IMPORTANT, ++ QString("AVIDemux Project generated for %1 at %2 with filename %3.") ++ .arg(chanid).arg(starttime).arg(outputfilename)); ++ ++ return COMMFLAG_EXIT_NO_ERROR_WITH_NO_BREAKS; ++} ++ ++ + void streamOutCommercialBreakList( + ostream &output, const QMap &commercialBreakList) + { +@@ -811,6 +937,8 @@ + bool clearCutlist = false; + bool getCutlist = false; + bool getSkipList = false; ++ bool getAviDemuxCutlist = false; ++ bool getAviDemuxSkiplist = false; + QString newCutList = QString::null; + QMap settingsOverride; + +@@ -960,6 +1088,10 @@ + getCutlist = true; + else if (!strcmp(a.argv()[argpos], "--getskiplist")) + getSkipList = true; ++ else if (!strcmp(a.argv()[argpos], "--getcutlist-avidemux")) ++ getAviDemuxCutlist = true; ++ else if (!strcmp(a.argv()[argpos], "--getskiplist-avidemux")) ++ getAviDemuxSkiplist = true; + else if (!strcmp(a.argv()[argpos], "--setcutlist")) + newCutList = (a.argv()[++argpos]); + else if (!strcmp(a.argv()[argpos], "-j")) +@@ -1111,6 +1243,8 @@ + " #-#[,#-#]... (ie, 1-100,1520-3012,4091-5094\n" + "--getcutlist Display the current cutlist\n" + "--getskiplist Display the current Commercial Skip list\n" ++ "--getcutlist-avidemux Export cutlist as AVIDemux Project File\n" ++ "--getskiplist-avidemux Export skiplist as AVIDemux Project File\n" + "-v or --verbose debug-level Use '-v help' for level info\n" + "--queue Insert flagging job into the JobQueue rather than\n" + " running flagging in the foreground\n" +@@ -1223,6 +1357,12 @@ + if (!newCutList.isNull()) + return SetCutList(chanid, starttime, newCutList); + ++ if (getAviDemuxCutlist) ++ return GetAviDemux("cutlist", chanid, starttime, outputfilename); ++ ++ if (getAviDemuxSkiplist) ++ return GetAviDemux("commflag", chanid, starttime, outputfilename); ++ + if (getCutlist) + return GetMarkupList("cutlist", chanid, starttime); + diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/mythtv.install b/abs/core-testing/mythtv/trunk/mythtv-svn/mythtv.install new file mode 100755 index 0000000..513852a --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/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-svn/patches/DeviceReadBuffer-polltimeout.2.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/DeviceReadBuffer-polltimeout.2.patch new file mode 100644 index 0000000..5bb713f --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/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-svn/patches/aacdecoder.cpp.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/aacdecoder.cpp.patch new file mode 100644 index 0000000..8796eb4 --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/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 + diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/patches/hdpvr-v4lchannel-tweak.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/hdpvr-v4lchannel-tweak.patch new file mode 100644 index 0000000..3535310 --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/hdpvr-v4lchannel-tweak.patch @@ -0,0 +1,139 @@ +Index: libs/libmythtv/v4lchannel.h +=================================================================== +--- libs/libmythtv/v4lchannel.h (revision 18874) ++++ libs/libmythtv/v4lchannel.h (working copy) +@@ -103,6 +103,8 @@ + VidModV4L2 videomode_v4l2; ///< Current video mode if 'usingv4l2' is true + + int defaultFreqTable; ++ int prev_inputNumV4L; ++ v4l2_std_id prev_vid_mode; + }; + + #endif +Index: libs/libmythtv/v4lchannel.cpp +=================================================================== +--- libs/libmythtv/v4lchannel.cpp (revision 18874) ++++ libs/libmythtv/v4lchannel.cpp (working copy) +@@ -40,7 +40,8 @@ + device_name(QString::null), driver_name(QString::null), + curList(NULL), totalChannels(0), + currentFormat(""), is_dtv(false), +- usingv4l2(false), defaultFreqTable(1) ++ usingv4l2(false), defaultFreqTable(1), ++ prev_inputNumV4L(-1), prev_vid_mode(-1) + { + } + +@@ -795,62 +796,75 @@ + { + VERBOSE(VB_CHANNEL, LOC + msg + "(v4l v2)"); + +- int ioctlval = ioctl(videofd, VIDIOC_S_INPUT, &inputNumV4L); ++ int ioctlval; ++ bool streamingDisabled = false; ++ int streamType = V4L2_BUF_TYPE_VIDEO_CAPTURE; + +- // ConvertX (wis-go7007) requires streaming to be disabled +- // before an input switch, do this if initial switch failed. +- bool streamingDisabled = false; +- int streamType = V4L2_BUF_TYPE_VIDEO_CAPTURE; +- if ((ioctlval < 0) && (errno == EBUSY)) ++ if (prev_inputNumV4L != inputNumV4L) + { +- ioctlval = ioctl(videofd, VIDIOC_STREAMOFF, &streamType); ++ ioctlval = ioctl(videofd, VIDIOC_S_INPUT, &inputNumV4L); ++ ++ // ConvertX (wis-go7007) requires streaming to be disabled ++ // before an input switch, do this if initial switch failed. ++ if ((ioctlval < 0) && (errno == EBUSY)) ++ { ++ ioctlval = ioctl(videofd, VIDIOC_STREAMOFF, &streamType); ++ if (ioctlval < 0) ++ { ++ VERBOSE(VB_IMPORTANT, LOC_ERR + msg + ++ "\n\t\t\twhile disabling streaming (v4l v2)" + ENO); ++ ++ ok = false; ++ ioctlval = 0; ++ } ++ else ++ { ++ streamingDisabled = true; ++ ++ // Resend the input switch ioctl. ++ ioctlval = ioctl(videofd, VIDIOC_S_INPUT, &inputNumV4L); ++ } ++ } ++ + if (ioctlval < 0) + { + VERBOSE(VB_IMPORTANT, LOC_ERR + msg + +- "\n\t\t\twhile disabling streaming (v4l v2)" + ENO); ++ "\n\t\t\twhile setting input (v4l v2)" + ENO); + + ok = false; +- ioctlval = 0; + } +- else +- { +- streamingDisabled = true; + +- // Resend the input switch ioctl. +- ioctlval = ioctl(videofd, VIDIOC_S_INPUT, &inputNumV4L); +- } ++ prev_inputNumV4L = inputNumV4L; + } + +- if (ioctlval < 0) +- { +- VERBOSE(VB_IMPORTANT, LOC_ERR + msg + +- "\n\t\t\twhile setting input (v4l v2)" + ENO); +- +- ok = false; +- } +- + v4l2_std_id vid_mode = format_to_mode(newFmt, 2); +- ioctlval = ioctl(videofd, VIDIOC_S_STD, &vid_mode); +- if (ioctlval < 0) +- { +- VERBOSE(VB_IMPORTANT, LOC_ERR + msg + +- "\n\t\t\twhile setting format (v4l v2)" + ENO); + +- ok = false; +- } +- +- // ConvertX (wis-go7007) requires streaming to be disabled +- // before an input switch, here we try to re-enable streaming. +- if (streamingDisabled) ++ if (prev_vid_mode != vid_mode) + { +- ioctlval = ioctl(videofd, VIDIOC_STREAMON, &streamType); ++ ioctlval = ioctl(videofd, VIDIOC_S_STD, &vid_mode); + if (ioctlval < 0) + { + VERBOSE(VB_IMPORTANT, LOC_ERR + msg + +- "\n\t\t\twhile reenabling streaming (v4l v2)" + ENO); ++ "\n\t\t\twhile setting format (v4l v2)" + ENO); + + ok = false; + } ++ ++ // ConvertX (wis-go7007) requires streaming to be disabled ++ // before an input switch, here we try to re-enable streaming. ++ if (streamingDisabled) ++ { ++ ioctlval = ioctl(videofd, VIDIOC_STREAMON, &streamType); ++ if (ioctlval < 0) ++ { ++ VERBOSE(VB_IMPORTANT, LOC_ERR + msg + ++ "\n\t\t\twhile reenabling streaming (v4l v2)" + ++ ENO); ++ ++ ok = false; ++ } ++ } ++ prev_vid_mode = vid_mode; + } + } + diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/patches/mpegrecorder-hdpvr-v1.1.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/mpegrecorder-hdpvr-v1.1.patch new file mode 100644 index 0000000..f292b7f --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/mpegrecorder-hdpvr-v1.1.patch @@ -0,0 +1,658 @@ +Index: libs/libmythtv/mpegrecorder.h +=================================================================== +--- libs/libmythtv/mpegrecorder.h (revision 19056) ++++ libs/libmythtv/mpegrecorder.h (working copy) +@@ -80,11 +80,13 @@ + 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 @@ + // 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 @@ + bool cleartimeonpause; + + // Encoding info +- int width, height; ++ uint width, height; + int bitrate, maxbitrate, streamtype, aspectratio; + int audtype, audsamplerate, audbitratel1, audbitratel2, audbitratel3; + int audvolume; +Index: libs/libmythtv/mpegrecorder.cpp +=================================================================== +--- libs/libmythtv/mpegrecorder.cpp (revision 19056) ++++ libs/libmythtv/mpegrecorder.cpp (working copy) +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + + // avlib headers + extern "C" { +@@ -86,7 +87,7 @@ + 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), +@@ -487,13 +488,21 @@ + + 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; + } +@@ -501,8 +510,15 @@ + 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; + } +@@ -513,10 +529,19 @@ + /// 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; + } +@@ -549,8 +574,15 @@ + 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; + } +@@ -561,10 +593,19 @@ + 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 + + "\n\t\t\tusing default range [0,65535]."); +@@ -582,8 +623,15 @@ + 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" + + "If you are using an AverMedia M179 card this is normal."); +@@ -765,6 +813,7 @@ + + for (uint i = 0; i < ext_ctrls.size(); i++) + { ++ uint idx; + struct v4l2_ext_controls ctrls; + bzero(&ctrls, sizeof(struct v4l2_ext_controls)); + +@@ -774,8 +823,15 @@ + 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(): ") + + QString("Could not set %1 to %2") +@@ -814,6 +870,30 @@ + { + 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); + +@@ -837,19 +917,36 @@ + 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."); + } + 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."); + } +@@ -1036,17 +1133,26 @@ + 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) + { +@@ -1090,35 +1196,7 @@ + { + 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()) + { +@@ -1216,6 +1294,8 @@ + } + } + ++ VERBOSE(VB_RECORD, LOC + "StartRecording finishing up"); ++ + if (_device_read_buffer) + { + if (_device_read_buffer->IsRunning()) +@@ -1224,6 +1304,7 @@ + delete _device_read_buffer; + _device_read_buffer = NULL; + } ++ + StopEncoding(readfd); + + FinishRecording(); +@@ -1373,52 +1454,95 @@ + + if (!paused) + { ++ VERBOSE(VB_RECORD, LOC + "PauseAndWait pause"); ++ ++ // Some drivers require streaming to be disabled before ++ // an input switch and other channel format setting. ++ if (requires_special_pause) ++ StopEncoding(readfd); ++ + 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(); +- } + +- // Some drivers require streaming to be disabled before +- // an input switch and other channel format setting. +- if (requires_special_pause) +- StopEncoding(readfd); +- ++ paused = true; + 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); ++ // Sleep any less than 1.5 seconds, and the HD-PVR will ++ // return the old resolution, when the resolution is changing. ++ usleep(1500 * 1000); ++ } + +- if (_stream_data) +- _stream_data->Reset(_stream_data->DesiredProgram()); +- } ++ // 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()); ++ + 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); +@@ -1427,13 +1551,22 @@ + 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; + } +@@ -1444,7 +1577,7 @@ + return false; + } + +- usleep(250 * 1000); ++ usleep(100 * 1000); + } + + VERBOSE(VB_IMPORTANT, LOC_ERR + "StartEncoding - giving up" + ENO); +@@ -1461,9 +1594,8 @@ + + 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"); +@@ -1476,7 +1608,7 @@ + return false; + } + +- usleep(250 * 1000); ++ usleep(100 * 1000); + } + + VERBOSE(VB_IMPORTANT, LOC_ERR + "StopEncoding - giving up" + ENO); +@@ -1544,7 +1676,7 @@ + void MpegRecorder::HandleSingleProgramPMT(ProgramMapTable *pmt) + { + if (!pmt) +-{ ++ { + return; + } + +@@ -1564,27 +1696,89 @@ + DTVRecorder::BufferedWrite(*(reinterpret_cast(&buf[i]))); + } + ++bool MpegRecorder::WaitFor_HDPVR(void) ++{ ++ // 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); ++ ++ 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) + { +- if (!needs_resolution) +- return; +- + 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) +@@ -1609,13 +1803,14 @@ + if (old_max == old_avg) + { + VERBOSE(VB_RECORD, LOC + +- QString("Old bitrate %1 CBR").arg(old_avg)); ++ QString("Old bitrate %1 CBR for %2x%3") ++ .arg(old_avg).arg(width).arg(height)); + } + else + { + VERBOSE(VB_RECORD, LOC + +- QString("Old bitrate %1/%2 VBR") +- .arg(old_avg).arg(old_max)); ++ QString("Old bitrate %1/%2 VBR for %3x%4") ++ .arg(old_avg).arg(old_max).arg(width).arg(height)); + } + + if (maxbitrate == bitrate) +@@ -1642,12 +1837,6 @@ + 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; + } diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/patches/mythcommflag-avidemux.2.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/mythcommflag-avidemux.2.patch new file mode 100644 index 0000000..d26645f --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/mythcommflag-avidemux.2.patch @@ -0,0 +1,179 @@ +Index: programs/mythcommflag/main.cpp +=================================================================== +--- programs/mythcommflag/main.cpp (revision 18596) ++++ programs/mythcommflag/main.cpp (working copy) +@@ -300,6 +300,132 @@ + return COMMFLAG_EXIT_NO_ERROR_WITH_NO_BREAKS; + } + ++int GetAviDemux(QString list, QString chanid, QString starttime, const QString &outputfilename) ++{ ++ QMap cutlist; ++ QMap::Iterator it; ++ QString result; ++ int startValue = 0; ++ long long myTotalFrames; ++ long long myFrameRate; ++ ++ ProgramInfo *pginfo = ++ ProgramInfo::GetProgramFromRecorded(chanid, starttime); ++ ++ NuppelVideoPlayer* nvp = new NuppelVideoPlayer("avidemux_export", pginfo); ++ ++ myFrameRate = (long long)(nvp->GetFrameRate() * 1000); ++ myTotalFrames = 1000000; //nvp->GetTotalFrameCount(); ++ ++ if (!pginfo) ++ { ++ VERBOSE(VB_IMPORTANT, ++ QString("No program data exists for channel %1 at %2") ++ .arg(chanid).arg(starttime)); ++ return COMMFLAG_BUGGY_EXIT_NO_CHAN_DATA; ++ } ++ ++ QString filename = pginfo->GetPlaybackURL(TRUE); ++ ++ if (list == "cutlist") ++ pginfo->GetCutList(cutlist); ++ else ++ pginfo->GetCommBreakList(cutlist); ++ ++// Formatting of output data ++ ++ for (it = cutlist.begin(); it != cutlist.end(); ++it) ++ { ++ if ((it.key() == 0) && (startValue == 0)) // Cutlist starts on first frame, ++ { ++ ++it; ++ startValue = it.key(); ++ } ++ ++ if ((it.key() != 0) && (startValue == 0)) // Cutlist starts on non-first frame ++ { ++ result += QString("app.addSegment(0,0,%1);").arg(it.key()); ++ startValue = it.key(); ++ } ++ else ++ { ++ if ((*it == MARK_COMM_END) && (startValue != 0) || ++ (*it == MARK_CUT_END) && (startValue != 0)) ++ { ++ if (result != "") ++ result += "\n"; ++ startValue = it.key(); ++ result += QString("app.addSegment(0,%1,").arg(it.key()); // Value is a start value ++ } ++ else ++ { ++ result += QString("%1);").arg(it.key() - startValue); // Value is an end value ++ } ++ } ++ } ++ ++if (it.key() != myTotalFrames) ++ { ++ result += QString("%1);").arg(myTotalFrames); ++ } ++ ++// Governs the file output: ++ ++ QString tmp = ""; ++ ostream *out = &cout; ++ ++ if (outputfilename != "-"){ ++ QByteArray tmp = outputfilename.toLocal8Bit(); ++ out = new fstream(tmp.constData(), ios::app | ios::out ); ++ } ++ ++ if (outputfilename == ""){ ++ VERBOSE(VB_IMPORTANT, ++ QString("Error: AVIDemux output requires the use of the --outputfile option.")); ++ return COMMFLAG_EXIT_INVALID_CMDLINE; ++ } ++ ++ tmp = QString("//AD <- Needed to identify//\n" ++ "//--automatically built--\n" ++ "//--Project:\n\n" ++ "var app = new Avidemux();\n\n" ++ "//** Video **\n" ++ "// 01 videos source\n" ++ "app.load(\"%1\");\n\n" ++ "app.clearSegments();\n\n" ++ "%2\n" ++ "app.markerA=0;\n" ++ "app.markerB=%3;\n" ++ "app.rebuildIndex();\n\n" ++ "//** Postproc **\n" ++ "app.video.setPostProc(3,3,0);\n\n" ++ "app.video.setFps1000(%4);\n\n" ++ "//** Filters **\n\n" ++ "//** Video Codec conf **\n" ++ "app.video.codec(\"Copy\",\"CQ=4\",\"0 \");\n\n" ++ "//** Audio **\n" ++ "app.audio.reset();\n" ++ "app.audio.codec(\"copy\",128,0,\"\");\n" ++ "app.audio.normalizeMode=0;\n" ++ "app.audio.normalizeValue=0;\n" ++ "app.audio.delay=0;\n" ++ "app.audio.mixer(\"NONE\");\n" ++ "app.setContainer(\"AVI\");\n" ++ "setSuccess(1);\n" ++ "//app.Exit();\n\n" ++ "//End of script\n").arg(filename).arg(result).arg(myTotalFrames).arg(myFrameRate).toLocal8Bit().constData(); ++ ++ const QByteArray tmp2 = tmp.toLocal8Bit(); ++ *out << tmp2.constData() << endl; ++ ++ VERBOSE(VB_IMPORTANT, ++ QString("AVIDemux Project generated for %1 at %2 with filename %3.") ++ .arg(chanid).arg(starttime).arg(outputfilename)); ++ ++ return COMMFLAG_EXIT_NO_ERROR_WITH_NO_BREAKS; ++} ++ ++ + void streamOutCommercialBreakList( + ostream &output, const QMap &commercialBreakList) + { +@@ -811,6 +937,8 @@ + bool clearCutlist = false; + bool getCutlist = false; + bool getSkipList = false; ++ bool getAviDemuxCutlist = false; ++ bool getAviDemuxSkiplist = false; + QString newCutList = QString::null; + QMap settingsOverride; + +@@ -960,6 +1088,10 @@ + getCutlist = true; + else if (!strcmp(a.argv()[argpos], "--getskiplist")) + getSkipList = true; ++ else if (!strcmp(a.argv()[argpos], "--getcutlist-avidemux")) ++ getAviDemuxCutlist = true; ++ else if (!strcmp(a.argv()[argpos], "--getskiplist-avidemux")) ++ getAviDemuxSkiplist = true; + else if (!strcmp(a.argv()[argpos], "--setcutlist")) + newCutList = (a.argv()[++argpos]); + else if (!strcmp(a.argv()[argpos], "-j")) +@@ -1111,6 +1243,8 @@ + " #-#[,#-#]... (ie, 1-100,1520-3012,4091-5094\n" + "--getcutlist Display the current cutlist\n" + "--getskiplist Display the current Commercial Skip list\n" ++ "--getcutlist-avidemux Export cutlist as AVIDemux Project File\n" ++ "--getskiplist-avidemux Export skiplist as AVIDemux Project File\n" + "-v or --verbose debug-level Use '-v help' for level info\n" + "--queue Insert flagging job into the JobQueue rather than\n" + " running flagging in the foreground\n" +@@ -1223,6 +1357,12 @@ + if (!newCutList.isNull()) + return SetCutList(chanid, starttime, newCutList); + ++ if (getAviDemuxCutlist) ++ return GetAviDemux("cutlist", chanid, starttime, outputfilename); ++ ++ if (getAviDemuxSkiplist) ++ return GetAviDemux("commflag", chanid, starttime, outputfilename); ++ + if (getCutlist) + return GetMarkupList("cutlist", chanid, starttime); + diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/smolt_jump.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/smolt_jump.patch new file mode 100644 index 0000000..0fc452a --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/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/svn_main_menu_popup.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/svn_main_menu_popup.patch new file mode 100644 index 0000000..5556683 --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv-svn/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(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. + * -- cgit v0.12