contrib/mythtv/mythtv-0.19-fixes.diff
2006-11-14 09:01:22 +10:00

5247 lines
186 KiB
Diff
Raw Blame History

diff -pruN mythtv-0.19/contrib/mythrename.pl mythtv/contrib/mythrename.pl
--- mythtv-0.19/contrib/mythrename.pl 2006-02-07 13:05:03.000000000 +1000
+++ mythtv/contrib/mythrename.pl 2006-02-07 13:05:03.000000000 +1000
@@ -1,6 +1,6 @@
#!/usr/bin/perl -w
#
-# $Date: 2006-02-06 22:05:03 -0500 (Mon, 06 Feb 2006) $
+# $Date: 2006-02-07 13:05:03 +1000 (Tue, 07 Feb 2006) $
# $Revision: 8888 $
# $Author: xris $
#
diff -pruN mythtv-0.19/contrib/optimize_mythdb.pl mythtv/contrib/optimize_mythdb.pl
--- mythtv-0.19/contrib/optimize_mythdb.pl 2005-08-21 06:21:40.000000000 +1000
+++ mythtv/contrib/optimize_mythdb.pl 2005-08-21 06:21:40.000000000 +1000
@@ -1,6 +1,6 @@
#!/usr/bin/perl -w
#
-# $Date: 2005-08-20 16:21:40 -0400 (Sat, 20 Aug 2005) $
+# $Date: 2005-08-21 06:21:40 +1000 (Sun, 21 Aug 2005) $
# $Revision: 7095 $
# $Author: xris $
#
diff -pruN mythtv-0.19/libs/libavcodec/libavcodec.pro mythtv/libs/libavcodec/libavcodec.pro
--- mythtv-0.19/libs/libavcodec/libavcodec.pro 2006-01-16 17:14:43.000000000 +1000
+++ mythtv/libs/libavcodec/libavcodec.pro 2006-04-16 17:27:30.000000000 +1000
@@ -430,4 +430,5 @@ macx {
LIBS += -lz
QMAKE_LFLAGS_SHLIB += -single_module
QMAKE_LFLAGS_SHLIB += -seg1addr 0xC3000000
+ QMAKE_LFLAGS_SHLIB += -read_only_relocs warning
}
diff -pruN mythtv-0.19/libs/libavformat/aviobuf.c mythtv/libs/libavformat/aviobuf.c
--- mythtv-0.19/libs/libavformat/aviobuf.c 2006-01-16 17:14:43.000000000 +1000
+++ mythtv/libs/libavformat/aviobuf.c 2006-02-23 17:54:05.000000000 +1000
@@ -164,7 +164,13 @@ offset_t url_fseek(ByteIOContext *s, off
void url_fskip(ByteIOContext *s, offset_t offset)
{
- url_fseek(s, offset, SEEK_CUR);
+ if (offset < 16384)
+ {
+ static unsigned char fskipbuf[16384];
+ get_buffer(s, fskipbuf, offset);
+ }
+ else
+ url_fseek(s, offset, SEEK_CUR);
}
offset_t url_ftell(ByteIOContext *s)
diff -pruN mythtv-0.19/libs/libmyth/audiooutputca.cpp mythtv/libs/libmyth/audiooutputca.cpp
--- mythtv-0.19/libs/libmyth/audiooutputca.cpp 2005-10-11 10:30:51.000000000 +1000
+++ mythtv/libs/libmyth/audiooutputca.cpp 2006-04-16 17:23:48.000000000 +1000
@@ -7,7 +7,7 @@
* This plays MythTV audio through the default output device on OS X.
*
* = REVISION
- * $Id: audiooutputca.cpp 7441 2005-10-11 00:30:51Z ijr $
+ * $Id: audiooutputca.cpp 9721 2006-04-16 07:23:48Z nigel $
*
* = AUTHORS
* Jeremiah Morris
@@ -107,8 +107,10 @@ bool AudioOutputCA::OpenDevice()
bzero(&conv_in_desc, sizeof(AudioStreamBasicDescription));
conv_in_desc.mSampleRate = audio_samplerate;
conv_in_desc.mFormatID = kAudioFormatLinearPCM;
- conv_in_desc.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger
- | kLinearPCMFormatFlagIsBigEndian;
+ conv_in_desc.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger;
+#ifdef WORDS_BIGENDIAN
+ conv_in_desc.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
+#endif
conv_in_desc.mBytesPerPacket = audio_bytes_per_sample;
conv_in_desc.mFramesPerPacket = 1;
conv_in_desc.mBytesPerFrame = audio_bytes_per_sample;
diff -pruN mythtv-0.19/libs/libmyth/lcddevice.cpp mythtv/libs/libmyth/lcddevice.cpp
--- mythtv-0.19/libs/libmyth/lcddevice.cpp 2006-01-26 03:11:56.000000000 +1000
+++ mythtv/libs/libmyth/lcddevice.cpp 2006-04-10 06:00:15.000000000 +1000
@@ -150,7 +150,7 @@ bool LCD::connectToHost(const QString &l
if (!connected)
{
- QTextStream os(socket);
+ QTextStream os(socket->socketDevice());
int count = 0;
do
@@ -213,7 +213,7 @@ void LCD::sendToServer(const QString &so
return;
}
- QTextStream os(socket);
+ QTextStream os(socket->socketDevice());
last_command = someText;
@@ -224,7 +224,7 @@ void LCD::sendToServer(const QString &so
#endif
// Just stream the text out the socket
- os << someText << "\n" << flush;
+ os << someText << "\n";
}
else
{
diff -pruN mythtv-0.19/libs/libmyth/mythcontext.cpp mythtv/libs/libmyth/mythcontext.cpp
--- mythtv-0.19/libs/libmyth/mythcontext.cpp 2006-01-25 20:22:57.000000000 +1000
+++ mythtv/libs/libmyth/mythcontext.cpp 2006-03-17 17:06:55.000000000 +1000
@@ -2621,9 +2621,13 @@ void MythContext::LogEntry(const QString
d->LoadLogSettings();
if (d->m_logenable == 1)
{
+ QString fullMsg = message;
+ if (!details.isEmpty())
+ fullMsg += ": " + details;
+
if (message.left(21) != "Last message repeated")
{
- if (message == d->lastLogStrings[module])
+ if (fullMsg == d->lastLogStrings[module])
{
d->lastLogCounts[module] += 1;
return;
@@ -2639,7 +2643,7 @@ void MythContext::LogEntry(const QString
}
d->lastLogCounts[module] = 0;
- d->lastLogStrings[module] = message;
+ d->lastLogStrings[module] = fullMsg;
}
}
@@ -2693,7 +2697,7 @@ void MythContext::LogEntry(const QString
}
if (priority <= d->m_logprintlevel)
- VERBOSE(VB_IMPORTANT, module + ": " + message);
+ VERBOSE(VB_IMPORTANT, module + ": " + fullMsg);
}
}
diff -pruN mythtv-0.19/libs/libmyth/mythdialogs.cpp mythtv/libs/libmyth/mythdialogs.cpp
--- mythtv-0.19/libs/libmyth/mythdialogs.cpp 2006-01-16 16:45:15.000000000 +1000
+++ mythtv/libs/libmyth/mythdialogs.cpp 2006-02-22 13:44:43.000000000 +1000
@@ -2617,6 +2617,7 @@ MythPasswordDialog::MythPasswordDialog(Q
password_editor->setEchoMode(QLineEdit::Password);
password_editor->setGeometry(textWidth + 20,10,135,30);
password_editor->setBackgroundOrigin(ParentOrigin);
+ password_editor->setAllowVirtualKeyboard(false);
connect(password_editor, SIGNAL(textChanged(const QString &)),
this, SLOT(checkPassword(const QString &)));
diff -pruN mythtv-0.19/libs/libmyth/mythwidgets.cpp mythtv/libs/libmyth/mythwidgets.cpp
--- mythtv-0.19/libs/libmyth/mythwidgets.cpp 2005-11-22 18:51:53.000000000 +1000
+++ mythtv/libs/libmyth/mythwidgets.cpp 2006-03-17 17:32:14.000000000 +1000
@@ -353,7 +353,8 @@ void MythLineEdit::keyPressEvent(QKeyEve
(e->key() == Qt::Key_Enter) ||
(e->key() == Qt::Key_Return)))
{
- if (gContext->GetNumSetting("UseVirtualKeyboard", 1) == 1)
+ if ((allowVirtualKeyboard) &&
+ (gContext->GetNumSetting("UseVirtualKeyboard", 1) == 1))
{
popup = new VirtualKeyboard(gContext->GetMainWindow(), this);
gContext->GetMainWindow()->detach(popup);
@@ -726,10 +727,11 @@ void MythRemoteLineEdit::keyPressEvent(Q
QWidget::focusNextPrevChild(true);
emit tryingToLooseFocus(true);
}
- else if (action == "SELECT" &&
- (e->text().isNull() ||
- (e->key() == Qt::Key_Enter) ||
- (e->key() == Qt::Key_Return)))
+ else if ((action == "SELECT") &&
+ (!active_cycle) &&
+ ((e->text().isNull()) ||
+ (e->key() == Qt::Key_Enter) ||
+ (e->key() == Qt::Key_Return)))
{
if (gContext->GetNumSetting("UseVirtualKeyboard", 1) == 1)
{
@@ -749,7 +751,7 @@ void MythRemoteLineEdit::keyPressEvent(Q
if (handled)
return;
- if (!handled && popup && popup->isShown())
+ if (popup && popup->isShown())
{
endCycle();
QTextEdit::keyPressEvent(e);
diff -pruN mythtv-0.19/libs/libmyth/mythwidgets.h mythtv/libs/libmyth/mythwidgets.h
--- mythtv-0.19/libs/libmyth/mythwidgets.h 2005-10-30 21:41:09.000000000 +1000
+++ mythtv/libs/libmyth/mythwidgets.h 2006-02-22 13:44:43.000000000 +1000
@@ -122,17 +122,21 @@ class MythLineEdit : public QLineEdit
Q_OBJECT
public:
MythLineEdit(QWidget *parent=NULL, const char* widgetName=0) :
- QLineEdit(parent, widgetName) { rw = true; Init(); };
+ QLineEdit(parent, widgetName)
+ { rw = true; allowVirtualKeyboard = true; Init(); };
MythLineEdit(const QString& contents, QWidget *parent=NULL,
const char* widgetName=0) :
- QLineEdit(contents, parent, widgetName) { rw = true; Init(); };
+ QLineEdit(contents, parent, widgetName)
+ { rw = true; allowVirtualKeyboard = true; Init(); };
virtual ~MythLineEdit();
void setHelpText(QString help) { helptext = help; };
void setRW(bool readwrite = true) { rw = readwrite; };
void setRO() { rw = false; };
+ void setAllowVirtualKeyboard(bool allowKbd = true)
+ { allowVirtualKeyboard = allowKbd; }
void setPopupPosition(PopupPosition pos) { popupPosition = pos; }
PopupPosition getPopupPosition(void) { return popupPosition; }
@@ -154,6 +158,7 @@ class MythLineEdit : public QLineEdit
VirtualKeyboard *popup;
QString helptext;
bool rw;
+ bool allowVirtualKeyboard;
PopupPosition popupPosition;
};
diff -pruN mythtv-0.19/libs/libmyth/remotefile.cpp mythtv/libs/libmyth/remotefile.cpp
--- mythtv-0.19/libs/libmyth/remotefile.cpp 2005-12-08 06:49:24.000000000 +1000
+++ mythtv/libs/libmyth/remotefile.cpp 2006-02-23 17:54:05.000000000 +1000
@@ -15,6 +15,7 @@ RemoteFile::RemoteFile(const QString &ur
path = url;
readposition = 0;
filesize = -1;
+ timeoutisfast = false;
query = "QUERY_FILETRANSFER %1";
@@ -295,4 +296,34 @@ bool RemoteFile::SaveAs(QByteArray &data
Read(data.data(), filesize);
return true;
-}
+}
+
+void RemoteFile::SetTimeout(bool fast)
+{
+ if (timeoutisfast == fast)
+ return;
+
+ if (!sock)
+ {
+ VERBOSE(VB_NETWORK, "RemoteFile::Seek(): Called with no socket");
+ return;
+ }
+
+ if (!sock->isOpen() || sock->error())
+ return;
+
+ if (!controlSock->isOpen() || controlSock->error())
+ return;
+
+ QStringList strlist = QString(query).arg(recordernum);
+ strlist << "SET_TIMEOUT";
+ strlist << QString::number((int)fast);
+
+ lock.lock();
+ WriteStringList(controlSock, strlist);
+ ReadStringList(controlSock, strlist);
+ lock.unlock();
+
+ timeoutisfast = fast;
+}
+
diff -pruN mythtv-0.19/libs/libmyth/remotefile.h mythtv/libs/libmyth/remotefile.h
--- mythtv-0.19/libs/libmyth/remotefile.h 2005-12-08 06:49:24.000000000 +1000
+++ mythtv/libs/libmyth/remotefile.h 2006-02-23 17:54:05.000000000 +1000
@@ -27,6 +27,8 @@ class RemoteFile
long long GetFileSize(void);
+ void SetTimeout(bool fast);
+
private:
QSocketDevice *openSocket(bool control);
@@ -43,6 +45,7 @@ class RemoteFile
QMutex lock;
long long filesize;
+ bool timeoutisfast;
};
#endif
diff -pruN mythtv-0.19/libs/libmyth/util.cpp mythtv/libs/libmyth/util.cpp
--- mythtv-0.19/libs/libmyth/util.cpp 2006-02-08 07:52:26.000000000 +1000
+++ mythtv/libs/libmyth/util.cpp 2006-03-19 05:32:52.000000000 +1000
@@ -1006,16 +1006,20 @@ long long getDiskSpace(const QString &fi
long long freespace = -1;
QCString cstr = file_on_disk.local8Bit();
- if (statfs(cstr, &statbuf) == 0)
+ total = used = -1;
+
+ // there are cases where statfs will return 0 (good), but f_blocks and
+ // others are invalid and set to 0 (such as when an automounted directory
+ // is not mounted but still visible because --ghost was used),
+ // so check to make sure we can have a total size > 0
+ if ((statfs(cstr, &statbuf) == 0) &&
+ (statbuf.f_blocks > 0) &&
+ (statbuf.f_bsize > 0))
{
freespace = statbuf.f_bsize * (statbuf.f_bavail >> 10);
total = statbuf.f_bsize * (statbuf.f_blocks >> 10);
used = total - freespace;
}
- else
- {
- freespace = total = used = -1;
- }
return freespace;
}
diff -pruN mythtv-0.19/libs/libmythsoundtouch/AAFilter.cpp mythtv/libs/libmythsoundtouch/AAFilter.cpp
--- mythtv-0.19/libs/libmythsoundtouch/AAFilter.cpp 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/AAFilter.cpp 2004-11-14 08:29:45.000000000 +1000
@@ -12,7 +12,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: AAFilter.cpp 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/AAFilter.h mythtv/libs/libmythsoundtouch/AAFilter.h
--- mythtv-0.19/libs/libmythsoundtouch/AAFilter.h 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/AAFilter.h 2004-11-14 08:29:45.000000000 +1000
@@ -13,7 +13,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: AAFilter.h 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/BPMDetect.h mythtv/libs/libmythsoundtouch/BPMDetect.h
--- mythtv-0.19/libs/libmythsoundtouch/BPMDetect.h 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/BPMDetect.h 2004-11-14 08:29:45.000000000 +1000
@@ -26,7 +26,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: BPMDetect.h 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/cpu_detect.h mythtv/libs/libmythsoundtouch/cpu_detect.h
--- mythtv-0.19/libs/libmythsoundtouch/cpu_detect.h 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/cpu_detect.h 2004-11-14 08:29:45.000000000 +1000
@@ -12,7 +12,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: cpu_detect.h 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/cpu_detect_x86_gcc.cpp mythtv/libs/libmythsoundtouch/cpu_detect_x86_gcc.cpp
--- mythtv-0.19/libs/libmythsoundtouch/cpu_detect_x86_gcc.cpp 2005-01-24 16:42:19.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/cpu_detect_x86_gcc.cpp 2005-01-24 16:42:19.000000000 +1000
@@ -12,7 +12,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2005-01-24 01:42:19 -0500 (Mon, 24 Jan 2005) $
+// Last changed : $Date: 2005-01-24 16:42:19 +1000 (Mon, 24 Jan 2005) $
// File revision : $Revision: 5151 $
//
// $Id: cpu_detect_x86_gcc.cpp 5151 2005-01-24 06:42:19Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/FIFOSampleBuffer.cpp mythtv/libs/libmythsoundtouch/FIFOSampleBuffer.cpp
--- mythtv-0.19/libs/libmythsoundtouch/FIFOSampleBuffer.cpp 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/FIFOSampleBuffer.cpp 2004-11-14 08:29:45.000000000 +1000
@@ -15,7 +15,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: FIFOSampleBuffer.cpp 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/FIFOSampleBuffer.h mythtv/libs/libmythsoundtouch/FIFOSampleBuffer.h
--- mythtv-0.19/libs/libmythsoundtouch/FIFOSampleBuffer.h 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/FIFOSampleBuffer.h 2004-11-14 08:29:45.000000000 +1000
@@ -15,7 +15,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: FIFOSampleBuffer.h 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/FIFOSamplePipe.h mythtv/libs/libmythsoundtouch/FIFOSamplePipe.h
--- mythtv-0.19/libs/libmythsoundtouch/FIFOSamplePipe.h 2005-05-24 06:39:12.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/FIFOSamplePipe.h 2005-05-24 06:39:12.000000000 +1000
@@ -17,7 +17,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2005-05-23 16:39:12 -0400 (Mon, 23 May 2005) $
+// Last changed : $Date: 2005-05-24 06:39:12 +1000 (Tue, 24 May 2005) $
// File revision : $Revision: 6468 $
//
// $Id: FIFOSamplePipe.h 6468 2005-05-23 20:39:12Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/FIRFilter.cpp mythtv/libs/libmythsoundtouch/FIRFilter.cpp
--- mythtv-0.19/libs/libmythsoundtouch/FIRFilter.cpp 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/FIRFilter.cpp 2004-11-14 08:29:45.000000000 +1000
@@ -11,7 +11,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: FIRFilter.cpp 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/FIRFilter.h mythtv/libs/libmythsoundtouch/FIRFilter.h
--- mythtv-0.19/libs/libmythsoundtouch/FIRFilter.h 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/FIRFilter.h 2004-11-14 08:29:45.000000000 +1000
@@ -11,7 +11,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: FIRFilter.h 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/mmx_gcc.cpp mythtv/libs/libmythsoundtouch/mmx_gcc.cpp
--- mythtv-0.19/libs/libmythsoundtouch/mmx_gcc.cpp 2005-06-30 07:41:57.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/mmx_gcc.cpp 2005-06-30 07:41:57.000000000 +1000
@@ -15,7 +15,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2005-06-29 17:41:57 -0400 (Wed, 29 Jun 2005) $
+// Last changed : $Date: 2005-06-30 07:41:57 +1000 (Thu, 30 Jun 2005) $
// File revision : $Revision: 6741 $
//
// $Id: mmx_gcc.cpp 6741 2005-06-29 21:41:57Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/RateTransposer.cpp mythtv/libs/libmythsoundtouch/RateTransposer.cpp
--- mythtv-0.19/libs/libmythsoundtouch/RateTransposer.cpp 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/RateTransposer.cpp 2004-11-14 08:29:45.000000000 +1000
@@ -10,7 +10,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: RateTransposer.cpp 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/RateTransposer.h mythtv/libs/libmythsoundtouch/RateTransposer.h
--- mythtv-0.19/libs/libmythsoundtouch/RateTransposer.h 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/RateTransposer.h 2004-11-14 08:29:45.000000000 +1000
@@ -14,7 +14,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: RateTransposer.h 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/SoundTouch.cpp mythtv/libs/libmythsoundtouch/SoundTouch.cpp
--- mythtv-0.19/libs/libmythsoundtouch/SoundTouch.cpp 2005-11-12 09:19:13.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/SoundTouch.cpp 2005-11-12 09:19:13.000000000 +1000
@@ -41,7 +41,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2005-11-11 18:19:13 -0500 (Fri, 11 Nov 2005) $
+// Last changed : $Date: 2005-11-12 09:19:13 +1000 (Sat, 12 Nov 2005) $
// File revision : $Revision: 7850 $
//
// $Id: SoundTouch.cpp 7850 2005-11-11 23:19:13Z danielk $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/SoundTouch.h mythtv/libs/libmythsoundtouch/SoundTouch.h
--- mythtv-0.19/libs/libmythsoundtouch/SoundTouch.h 2005-11-12 09:19:13.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/SoundTouch.h 2005-11-12 09:19:13.000000000 +1000
@@ -41,7 +41,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2005-11-11 18:19:13 -0500 (Fri, 11 Nov 2005) $
+// Last changed : $Date: 2005-11-12 09:19:13 +1000 (Sat, 12 Nov 2005) $
// File revision : $Revision: 7850 $
//
// $Id: SoundTouch.h 7850 2005-11-11 23:19:13Z danielk $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/STTypes.h mythtv/libs/libmythsoundtouch/STTypes.h
--- mythtv-0.19/libs/libmythsoundtouch/STTypes.h 2005-01-21 16:08:36.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/STTypes.h 2005-01-21 16:08:36.000000000 +1000
@@ -8,7 +8,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2005-01-21 01:08:36 -0500 (Fri, 21 Jan 2005) $
+// Last changed : $Date: 2005-01-21 16:08:36 +1000 (Fri, 21 Jan 2005) $
// File revision : $Revision: 5097 $
//
// $Id: STTypes.h 5097 2005-01-21 06:08:36Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/TDStretch.cpp mythtv/libs/libmythsoundtouch/TDStretch.cpp
--- mythtv-0.19/libs/libmythsoundtouch/TDStretch.cpp 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/TDStretch.cpp 2004-11-14 08:29:45.000000000 +1000
@@ -13,7 +13,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: TDStretch.cpp 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythsoundtouch/TDStretch.h mythtv/libs/libmythsoundtouch/TDStretch.h
--- mythtv-0.19/libs/libmythsoundtouch/TDStretch.h 2004-11-14 08:29:45.000000000 +1000
+++ mythtv/libs/libmythsoundtouch/TDStretch.h 2004-11-14 08:29:45.000000000 +1000
@@ -13,7 +13,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//
-// Last changed : $Date: 2004-11-13 17:29:45 -0500 (Sat, 13 Nov 2004) $
+// Last changed : $Date: 2004-11-14 08:29:45 +1000 (Sun, 14 Nov 2004) $
// File revision : $Revision: 4714 $
//
// $Id: TDStretch.h 4714 2004-11-13 22:29:45Z ijr $
diff -pruN mythtv-0.19/libs/libmythtv/avformatdecoder.cpp mythtv/libs/libmythtv/avformatdecoder.cpp
--- mythtv-0.19/libs/libmythtv/avformatdecoder.cpp 2006-02-07 04:09:58.000000000 +1000
+++ mythtv/libs/libmythtv/avformatdecoder.cpp 2006-03-31 11:55:22.000000000 +1000
@@ -725,7 +725,12 @@ int AvFormatDecoder::OpenFile(RingBuffer
return -1;
}
+ /* av_find_stream_info() eventually makes calls to avcodec_open() and avcodec_close()
+ so we have to use the avcodeclock */
+ avcodeclock.lock();
int ret = av_find_stream_info(ic);
+ avcodeclock.unlock();
+
if (ret < 0)
{
VERBOSE(VB_IMPORTANT, LOC_ERR + "Could not find codec parameters. " +
diff -pruN mythtv-0.19/libs/libmythtv/dummydtvrecorder.cpp mythtv/libs/libmythtv/dummydtvrecorder.cpp
--- mythtv-0.19/libs/libmythtv/dummydtvrecorder.cpp 2005-12-15 01:54:48.000000000 +1000
+++ mythtv/libs/libmythtv/dummydtvrecorder.cpp 2006-04-20 23:52:51.000000000 +1000
@@ -125,7 +125,8 @@ void DummyDTVRecorder::StartRecording(vo
// TRANSFER DATA
while (_request_recording || _frames_seen_count <= 5)
{
- len = read(_stream_fd, &(_buffer[remainder]), _buffer_size - remainder);
+ len = read(_stream_fd, &(_buffer[remainder]),
+ _buffer_size - remainder);
if (len == 0)
{
@@ -137,9 +138,8 @@ void DummyDTVRecorder::StartRecording(vo
len += remainder;
remainder = ProcessData(_buffer, len);
- if (remainder > 0) // leftover bytes
- memmove(_buffer, &(_buffer[_buffer_size - remainder]),
- remainder);
+ if (remainder > 0 && (len > remainder)) // leftover bytes
+ memmove(_buffer, &(_buffer[len - remainder]), remainder);
}
FinishRecording();
diff -pruN mythtv-0.19/libs/libmythtv/dvbconfparser.cpp mythtv/libs/libmythtv/dvbconfparser.cpp
--- mythtv-0.19/libs/libmythtv/dvbconfparser.cpp 2006-02-08 07:56:06.000000000 +1000
+++ mythtv/libs/libmythtv/dvbconfparser.cpp 2006-03-12 14:33:39.000000000 +1000
@@ -1,5 +1,5 @@
/*
- * $Id: dvbconfparser.cpp 8901 2006-02-07 21:56:06Z danielk $
+ * $Id: dvbconfparser.cpp 9335 2006-03-12 04:33:39Z danielk $
* vim: set expandtab tabstop=4 shiftwidth=4:
*
* Original Project
@@ -193,10 +193,10 @@ bool DVBConfParser::parseConfQPSK(QStrin
QStringList::Iterator end = tokens.end();
if (i != end) c.name = *i++; else return false;
- if (i != end) c.frequency = (*i++).toInt(); else return false;
+ if (i != end) c.frequency = (*i++).toUInt()*1000; else return false;
if (i == end || !c.polarity.parseConf(*i++)) return false;
if (i == end ) return false; else i++; //Sat num
- if (i != end) c.symbolrate = (*i++).toInt(); else return false;
+ if (i != end) c.symbolrate = (*i++).toUInt()*1000; else return false;
if (i == end ) return false; else i++;
if (i == end ) return false; else i++;
if (i != end) c.serviceid = (*i++).toInt(); else return false;
diff -pruN mythtv-0.19/libs/libmythtv/dvbsignalmonitor.cpp mythtv/libs/libmythtv/dvbsignalmonitor.cpp
--- mythtv-0.19/libs/libmythtv/dvbsignalmonitor.cpp 2006-02-08 07:56:06.000000000 +1000
+++ mythtv/libs/libmythtv/dvbsignalmonitor.cpp 2006-04-20 23:46:13.000000000 +1000
@@ -348,8 +348,8 @@ void DVBSignalMonitor::RunTableMonitorTS
len += remainder;
remainder = GetStreamData()->ProcessData(buffer, len);
- if (remainder > 0) // leftover bytes
- memmove(buffer, &(buffer[buffer_size - remainder]), remainder);
+ if (remainder > 0 && (len > remainder)) // leftover bytes
+ memmove(buffer, &(buffer[len - remainder]), remainder);
}
VERBOSE(VB_CHANNEL, LOC + "RunTableMonitorTS(): " + "shutdown");
diff -pruN mythtv-0.19/libs/libmythtv/dvbtypes.cpp mythtv/libs/libmythtv/dvbtypes.cpp
--- mythtv-0.19/libs/libmythtv/dvbtypes.cpp 2005-12-16 10:23:00.000000000 +1000
+++ mythtv/libs/libmythtv/dvbtypes.cpp 2006-02-17 08:41:02.000000000 +1000
@@ -202,7 +202,7 @@ DVBParamHelper<fe_transmit_mode_t>::Tabl
{
{"TRANSMISSION_MODE_AUTO",TRANSMISSION_MODE_AUTO},
{"TRANSMISSION_MODE_2K",TRANSMISSION_MODE_2K},
- {"TRANSMISSION_MODE_8K",TRANSMISSION_MODE_2K},
+ {"TRANSMISSION_MODE_8K",TRANSMISSION_MODE_8K},
{NULL,TRANSMISSION_MODE_AUTO},
};
@@ -210,7 +210,7 @@ DVBParamHelper<fe_transmit_mode_t>::Tabl
{
{"999",TRANSMISSION_MODE_AUTO},
{"2",TRANSMISSION_MODE_2K},
- {"8",TRANSMISSION_MODE_2K},
+ {"8",TRANSMISSION_MODE_8K},
{NULL,TRANSMISSION_MODE_AUTO},
};
@@ -218,7 +218,7 @@ DVBParamHelper<fe_transmit_mode_t>::Tabl
{
{"auto",TRANSMISSION_MODE_AUTO},
{"2",TRANSMISSION_MODE_2K},
- {"8",TRANSMISSION_MODE_2K},
+ {"8",TRANSMISSION_MODE_8K},
{NULL,TRANSMISSION_MODE_AUTO},
};
diff -pruN mythtv-0.19/libs/libmythtv/frequencytables.cpp mythtv/libs/libmythtv/frequencytables.cpp
--- mythtv-0.19/libs/libmythtv/frequencytables.cpp 2006-01-19 02:46:14.000000000 +1000
+++ mythtv/libs/libmythtv/frequencytables.cpp 2006-04-13 00:21:41.000000000 +1000
@@ -283,104 +283,52 @@ static void init_freq_tables(freq_table_
"ATSC Channel %1", 70, 809000000, 887000000, 6000000, VSB_8);
#endif // USING_DVB
- // USA Cable, QAM 256
- fmap["atsc_qam256_uscable0"] = new FrequencyTable(
- "QAM-256 Channel %1", 1, 75000000,1005000000, 6000000, QAM_256);
- fmap["atsc_qam256_uscable1"] = new FrequencyTable(
- "QAM-256 Channel T-%1", 7, 10000000, 52000000, 6000000, QAM_256);
-
- // USA Cable, QAM 256 ch 78+
- fmap["atsc_qam256_uscablehigh0"] = new FrequencyTable(
- "QAM-256 Channel %1", 78,472000000,1005000000, 6000000, QAM_256);
-
- // USA Cable HRC, QAM 256
- fmap["atsc_qam256_ushrc0"] = new FrequencyTable(
- "QAM-256 HRC %1", 1, 73750000, 73750001, 6000000, QAM_256);
- fmap["atsc_qam256_ushrc1"] = new FrequencyTable(
- "QAM-256 HRC %1", 2, 55750000, 67750000, 6000000, QAM_256);
- fmap["atsc_qam256_ushrc2"] = new FrequencyTable(
- "QAM-256 HRC %1", 5, 79750000, 85750000, 6000000, QAM_256);
- fmap["atsc_qam256_ushrc3"] = new FrequencyTable(
- "QAM-256 HRC %1", 7, 175750000, 643750000, 6000000, QAM_256);
- fmap["atsc_qam256_ushrc4"] = new FrequencyTable(
- "QAM-256 HRC %1", 95, 91750000, 114000000, 6000000, QAM_256);
- fmap["atsc_qam256_ushrc5"] = new FrequencyTable(
- "QAM-256 HRC %1", 100, 649750000, 799750000, 6000000, QAM_256);
- fmap["atsc_qam256_ushrc6"] = new FrequencyTable(
- "QAM-256 HRC T-%1", 7, 8175000, 50750000, 6000000, QAM_256);
-
- // USA Cable HRC, QAM 256 ch 78+
- fmap["atsc_qam256_ushrchigh0"] = new FrequencyTable(
- "QAM-256 HRC %1", 78, 601750000, 643750000, 6000000, QAM_256);
- fmap["atsc_qam256_ushrchigh1"] = new FrequencyTable(
- "QAM-256 HRC %1", 100, 649750000, 799750000, 6000000, QAM_256);
-
-
-
- // USA Cable, QAM 128
- fmap["atsc_qam128_uscable0"] = new FrequencyTable(
- "QAM-128 Channel %1", 1, 75000000,1005000000, 6000000, QAM_128);
- fmap["atsc_qam128_uscable1"] = new FrequencyTable(
- "QAM-128 Channel T-%1", 7, 10000000, 52000000, 6000000, QAM_128);
-
- // USA Cable, QAM 128 ch 78+
- fmap["atsc_qam128_uscablehigh0"] = new FrequencyTable(
- "QAM-128 Channel %1", 78,472000000,1005000000, 6000000, QAM_128);
-
- // USA Cable HRC, QAM 128
- fmap["atsc_qam128_ushrc0"] = new FrequencyTable(
- "QAM-128 HRC %1", 1, 73750000, 73750001, 6000000, QAM_128);
- fmap["atsc_qam128_ushrc1"] = new FrequencyTable(
- "QAM-128 HRC %1", 2, 55750000, 67750000, 6000000, QAM_128);
- fmap["atsc_qam128_ushrc2"] = new FrequencyTable(
- "QAM-128 HRC %1", 5, 79750000, 85750000, 6000000, QAM_128);
- fmap["atsc_qam128_ushrc3"] = new FrequencyTable(
- "QAM-128 HRC %1", 7, 175750000, 643750000, 6000000, QAM_128);
- fmap["atsc_qam128_ushrc4"] = new FrequencyTable(
- "QAM-128 HRC %1", 95, 91750000, 114000000, 6000000, QAM_128);
- fmap["atsc_qam128_ushrc5"] = new FrequencyTable(
- "QAM-128 HRC %1", 100, 649750000, 799750000, 6000000, QAM_128);
- fmap["atsc_qam128_ushrc6"] = new FrequencyTable(
- "QAM-128 HRC T-%1", 7, 8175000, 50750000, 6000000, QAM_128);
-
- // USA Cable HRC, QAM 128 ch 78+
- fmap["atsc_qam128_ushrchigh0"] = new FrequencyTable(
- "QAM-128 HRC %1", 78, 601750000, 643750000, 6000000, QAM_128);
- fmap["atsc_qam128_ushrchigh1"] = new FrequencyTable(
- "QAM-128 HRC %1", 100, 649750000, 799750000, 6000000, QAM_128);
-
-
-
-
- // USA Cable, QAM 64
- fmap["atsc_qam64_uscable0"] = new FrequencyTable(
- "QAM-64 Channel %1", 1, 75000000,1005000000, 6000000, QAM_64);
- fmap["atsc_qam64_uscable1"] = new FrequencyTable(
- "QAM-64 Channel T-%1", 7, 10000000, 52000000, 6000000, QAM_64);
-
- // USA Cable, QAM 64 ch 78+
- fmap["atsc_qam64_uscablehigh0"] = new FrequencyTable(
- "QAM-64 Channel %1", 78,472000000,1005000000, 6000000, QAM_64);
-
- // USA Cable HRC, QAM 64
- fmap["atsc_qam64_ushrc0"] = new FrequencyTable(
- "QAM-64 HRC %1", 1, 73750000, 73750001, 6000000, QAM_64);
- fmap["atsc_qam64_ushrc1"] = new FrequencyTable(
- "QAM-64 HRC %1", 2, 55750000, 67750000, 6000000, QAM_64);
- fmap["atsc_qam64_ushrc2"] = new FrequencyTable(
- "QAM-64 HRC %1", 5, 79750000, 85750000, 6000000, QAM_64);
- fmap["atsc_qam64_ushrc3"] = new FrequencyTable(
- "QAM-64 HRC %1", 7, 175750000, 643750000, 6000000, QAM_64);
- fmap["atsc_qam64_ushrc4"] = new FrequencyTable(
- "QAM-64 HRC %1", 95, 91750000, 114000000, 6000000, QAM_64);
- fmap["atsc_qam64_ushrc5"] = new FrequencyTable(
- "QAM-64 HRC %1", 100, 649750000, 799750000, 6000000, QAM_64);
- fmap["atsc_qam64_ushrc6"] = new FrequencyTable(
- "QAM-64 HRC T-%1", 7, 8175000, 50750000, 6000000, QAM_64);
-
- // USA Cable HRC, QAM 64 ch 78+
- fmap["atsc_qam64_ushrchigh0"] = new FrequencyTable(
- "QAM-64 HRC %1", 78, 601750000, 643750000, 6000000, QAM_64);
- fmap["atsc_qam64_ushrchigh1"] = new FrequencyTable(
- "QAM-64 HRC %1", 100, 649750000, 799750000, 6000000, QAM_64);
+ QString modStr[] = { "vsb8", "qam256", "qam128", "qam64", };
+ uint mod[] = { VSB_8, QAM_256, QAM_128, QAM_64, };
+ QString desc[] = { "ATSC ", "QAM-256 ", "QAM-128 ", "QAM-64 ", };
+
+#define FREQ(A,B, C,D, E,F,G, H) \
+ fmap[QString("atsc_%1_us%2").arg(A).arg(B)] = \
+ new FrequencyTable(C+D, E, F, G, 6000000, H);
+
+ for (uint i = 0; i < 3; i++)
+ {
+ // USA Cable, ch 1 to 155 and T.7 to T.14
+ FREQ(modStr[i], "cable0", desc[i], "Channel %1",
+ 1, 75000000, 1005000000, mod[i]);
+ FREQ(modStr[i], "cable1", desc[i], "Channel T-%1",
+ 7, 10000000, 52000000, mod[i]);
+ // USA Cable, QAM 256 ch 78 to 155
+ FREQ(modStr[i], "cablehigh0", desc[i], "Channel %1",
+ 78, 537000000,1005000000, mod[i]);
+
+ QString std[] = { "hrc", "irc" };
+ QString sdesc[] = { "HRC ", "IRC " };
+ int off[] = { 0, 1250000 };
+
+ for (uint j = 0; j < 2; j++)
+ {
+ // USA Cable HRC/IRC, ch 1 to 125
+ FREQ(modStr[i], std[j] + "0", desc[i], sdesc[j] + "%1",
+ 1, 73750000 + off[j], 73750001 + off[j], mod[i]);
+ FREQ(modStr[i], std[j] + "1", desc[i], sdesc[j] + "%1",
+ 2, 55750000 + off[j], 67750000 + off[j], mod[i]);
+ FREQ(modStr[i], std[j] + "2", desc[i], sdesc[j] + "%1",
+ 5, 79750000 + off[j], 85750000 + off[j], mod[i]);
+ FREQ(modStr[i], std[j] + "3", desc[i], sdesc[j] + "%1",
+ 7, 175750000 + off[j], 643750000 + off[j], mod[i]);
+ FREQ(modStr[i], std[j] + "4", desc[i], sdesc[j] + "%1",
+ 95, 91750000 + off[j], 114000000 + off[j], mod[i]);
+ FREQ(modStr[i], std[j] + "5", desc[i], sdesc[j] + "%1",
+ 100, 649750000 + off[j], 799750000 + off[j], mod[i]);
+ FREQ(modStr[i], std[j] + "6", desc[i], sdesc[j] + "T-%1",
+ 7, 8175000 + off[j], 50750000 + off[j], mod[i]);
+
+ // USA Cable HRC/IRC, ch 67-125
+ FREQ(modStr[i], std[j] + "high0", desc[i], sdesc[j] + "%1",
+ 67, 535750000 + off[j], 643750000 + off[j], mod[i]);
+ FREQ(modStr[i], std[j] + "high1", desc[i], sdesc[j] + "%1",
+ 100, 649750000 + off[j], 799750000 + off[j], mod[i]);
+ }
+ }
}
diff -pruN mythtv-0.19/libs/libmythtv/hdtvrecorder.cpp mythtv/libs/libmythtv/hdtvrecorder.cpp
--- mythtv-0.19/libs/libmythtv/hdtvrecorder.cpp 2005-12-24 00:59:28.000000000 +1000
+++ mythtv/libs/libmythtv/hdtvrecorder.cpp 2006-04-20 23:46:13.000000000 +1000
@@ -627,9 +627,8 @@ void HDTVRecorder::StartRecording(void)
len += remainder;
remainder = ProcessData(_buffer, len);
- if (remainder > 0) // leftover bytes
- memmove(_buffer, &(_buffer[_buffer_size - remainder]),
- remainder);
+ if (remainder > 0 && (len > remainder)) // leftover bytes
+ memmove(_buffer, &(_buffer[len - remainder]), remainder);
}
FinishRecording();
diff -pruN mythtv-0.19/libs/libmythtv/ivtvdecoder.cpp mythtv/libs/libmythtv/ivtvdecoder.cpp
--- mythtv-0.19/libs/libmythtv/ivtvdecoder.cpp 2006-02-09 01:40:42.000000000 +1000
+++ mythtv/libs/libmythtv/ivtvdecoder.cpp 2006-03-23 00:35:05.000000000 +1000
@@ -270,7 +270,9 @@ int IvtvDecoder::OpenFile(RingBuffer *rb
GetNVP()->SetVideoParams(720 /*width*/, (ntsc) ? 480 : 576 /*height*/,
(ntsc) ? 29.97f : 25.0f, keyframedist, 1.33);
-
+
+ fps = (ntsc) ? 29.97f : 25.0f; // save for later length calculations
+
ringBuffer->UpdateRawBitrate(8000);
if (m_playbackinfo || livetv || watchingrecording)
diff -pruN mythtv-0.19/libs/libmythtv/jobqueue.cpp mythtv/libs/libmythtv/jobqueue.cpp
--- mythtv-0.19/libs/libmythtv/jobqueue.cpp 2005-12-16 15:17:00.000000000 +1000
+++ mythtv/libs/libmythtv/jobqueue.cpp 2006-02-19 05:58:41.000000000 +1000
@@ -275,6 +275,11 @@ void JobQueue::ProcessQueue(void)
(hostname != "") &&
(hostname != m_hostname))
{
+ // Setting the status here will prevent us from processing
+ // any other jobs for this recording until this one is
+ // completed on the remote host.
+ jobStatus[key] = status;
+
message = QString("JobQueue: Skipping '%1' job for chanid "
"%2 @ %3, should run on '%4' instead")
.arg(JobText(type))
diff -pruN mythtv-0.19/libs/libmythtv/libmythtv.pro mythtv/libs/libmythtv/libmythtv.pro
--- mythtv-0.19/libs/libmythtv/libmythtv.pro 2006-01-13 18:11:45.000000000 +1000
+++ mythtv/libs/libmythtv/libmythtv.pro 2006-03-15 05:52:59.000000000 +1000
@@ -144,10 +144,10 @@ using_frontend {
# On screen display (video output overlay)
HEADERS += osd.h osdtypes.h
HEADERS += osdsurface.h osdlistbtntype.h
- HEADERS += udpnotify.h
+ HEADERS += osdimagecache.h udpnotify.h
SOURCES += osd.cpp osdtypes.cpp
SOURCES += osdsurface.cpp osdlistbtntype.cpp
- SOURCES += udpnotify.cpp
+ SOURCES += osdimagecache.cpp udpnotify.cpp
# Video output
HEADERS += videooutbase.h videoout_null.h
diff -pruN mythtv-0.19/libs/libmythtv/mpegrecorder.cpp mythtv/libs/libmythtv/mpegrecorder.cpp
--- mythtv-0.19/libs/libmythtv/mpegrecorder.cpp 2005-12-24 00:59:28.000000000 +1000
+++ mythtv/libs/libmythtv/mpegrecorder.cpp 2006-05-11 15:51:20.000000000 +1000
@@ -363,9 +363,9 @@ bool MpegRecorder::OpenV4L2DeviceAsInput
if (ioctl(chanfd, VIDIOC_S_CTRL, &ctrl) < 0)
{
- cerr << "Error setting codec params\n";
+ cerr << "Warning, unable to set recording volume\n";
+ cerr << "This is normal if you have an AVerMedia M179 card.\n";
perror("VIDIOC_S_CTRL:");
- return false;
}
if (vbimode) {
@@ -481,6 +481,9 @@ void MpegRecorder::StartRecording(void)
continue;
case 0:
printf("select timeout - ivtv driver has stopped responding\n");
+ if(close(readfd) != 0)
+ perror("close");
+ readfd = -1; // Force PVR card to be reopened on next iteration
continue;
default: break;
}
diff -pruN mythtv-0.19/libs/libmythtv/NuppelVideoPlayer.cpp mythtv/libs/libmythtv/NuppelVideoPlayer.cpp
--- mythtv-0.19/libs/libmythtv/NuppelVideoPlayer.cpp 2006-02-08 07:56:06.000000000 +1000
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.cpp 2006-04-27 01:23:01.000000000 +1000
@@ -147,6 +147,7 @@ NuppelVideoPlayer::NuppelVideoPlayer(QSt
hascommbreaktable(false),
deleteIter(deleteMap.end()), blankIter(blankMap.end()),
commBreakIter(commBreakMap.end()),
+ forcePositionMapSync(false),
// Playback (output) speed control
decoder_lock(true),
next_play_speed(1.0f), next_normal_speed(true),
@@ -747,6 +748,8 @@ int NuppelVideoPlayer::OpenFile(bool ski
SetDecoder(new IvtvDecoder(this, m_playbackinfo));
no_audio_out = true; // no audio with ivtv.
audio_bits = 16;
+ audio_samplerate = 44100;
+ audio_channels = 2;
}
else if (forceVideoOutput == kVideoOutput_IVTV)
{
@@ -1113,7 +1116,7 @@ void NuppelVideoPlayer::ShutdownYUVResiz
const unsigned char *NuppelVideoPlayer::GetScaledFrame(QSize &size)
{
QMutexLocker locker(&yuv_lock);
- yuv_desired_size = size = QSize(size.width() & ~0x3, size.height() & ~0x3);
+ yuv_desired_size = size = QSize(size.width() & ~0x7, size.height() & ~0x7);
if ((size.width() > 0) && (size.height() > 0))
{
@@ -1920,7 +1923,7 @@ void NuppelVideoPlayer::DisplayNormalFra
ShowText();
DisplaySubtitles();
}
- else if (osdHasSubtitles || nonDisplayedSubtitles.size() > 20)
+ else if (osdHasSubtitles)
{
ClearSubtitles();
}
@@ -2176,7 +2179,10 @@ void NuppelVideoPlayer::SwitchToProgram(
}
if (eof)
+ {
discontinuity = true;
+ ClearSubtitles();
+ }
livetvchain->SetProgram(pginfo);
@@ -2199,6 +2205,7 @@ void NuppelVideoPlayer::SwitchToProgram(
}
if (IsErrored())
{
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "SwitchToProgram failed.");
eof = true;
return;
}
@@ -2265,6 +2272,8 @@ void NuppelVideoPlayer::JumpToProgram(vo
ringBuffer->Pause();
ringBuffer->WaitForPause();
+ ClearSubtitles();
+
livetvchain->SetProgram(pginfo);
ringBuffer->Reset(true);
@@ -2284,6 +2293,7 @@ void NuppelVideoPlayer::JumpToProgram(vo
if (errored || !GetDecoder())
{
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "JumpToProgram failed.");
errored = true;
return;
}
@@ -2471,6 +2481,12 @@ void NuppelVideoPlayer::StartPlaying(voi
JumpToProgram();
}
+ if (forcePositionMapSync)
+ {
+ forcePositionMapSync = false;
+ GetDecoder()->SyncPositionMap();
+ }
+
if (IsErrored() || (nvr_enc && nvr_enc->GetErrorStatus()))
{
VERBOSE(VB_IMPORTANT, LOC_ERR + "Unknown error, exiting decoder");
@@ -4398,6 +4414,8 @@ void NuppelVideoPlayer::SetCommBreakMap(
hascommbreaktable = !commBreakMap.isEmpty();
SetCommBreakIter();
commBreakMapLock.unlock();
+
+ forcePositionMapSync = true;
}
bool NuppelVideoPlayer::RebuildSeekTable(bool showPercentage, StatusCallback cb, void* cbData)
@@ -4541,7 +4559,8 @@ int NuppelVideoPlayer::GetSecondsBehind(
return (int)((float)(written - played) / video_frame_rate);
}
-void NuppelVideoPlayer::calcSliderPos(struct StatusPosInfo &posInfo)
+void NuppelVideoPlayer::calcSliderPos(struct StatusPosInfo &posInfo,
+ bool paddedFields)
{
posInfo.desc = "";
posInfo.position = 0;
@@ -4588,15 +4607,23 @@ void NuppelVideoPlayer::calcSliderPos(st
int ssecs = (playbackLen - shours * 3600 - smins * 60);
QString text1, text2;
- if (shours > 0)
+ if (paddedFields)
{
- text1.sprintf("%d:%02d:%02d", phours, pmins, psecs);
- text2.sprintf("%d:%02d:%02d", shours, smins, ssecs);
+ text1.sprintf("%02d:%02d:%02d", phours, pmins, psecs);
+ text2.sprintf("%02d:%02d:%02d", shours, smins, ssecs);
}
else
{
- text1.sprintf("%d:%02d", pmins, psecs);
- text2.sprintf("%d:%02d", smins, ssecs);
+ if (shours > 0)
+ {
+ text1.sprintf("%d:%02d:%02d", phours, pmins, psecs);
+ text2.sprintf("%d:%02d:%02d", shours, smins, ssecs);
+ }
+ else
+ {
+ text1.sprintf("%d:%02d", pmins, psecs);
+ text2.sprintf("%d:%02d", smins, ssecs);
+ }
}
posInfo.desc = QObject::tr("%1 of %2").arg(text1).arg(text2);
@@ -4654,6 +4681,7 @@ void NuppelVideoPlayer::AutoCommercialSk
if (commBreakIter.key() == totalFrames)
{
+ VERBOSE(VB_IMPORTANT, LOC + "Skipping commercial to end of file");
eof = true;
}
else
@@ -4721,7 +4749,7 @@ bool NuppelVideoPlayer::DoSkipCommercial
QString message = "COMMFLAG_REQUEST ";
message += m_playbackinfo->chanid + " " +
- m_playbackinfo->startts.toString(Qt::ISODate);
+ m_playbackinfo->recstartts.toString(Qt::ISODate);
RemoteSendMessage(message);
return false;
@@ -5018,7 +5046,7 @@ void NuppelVideoPlayer::DisplaySubtitles
QImage scaledImage = qImage.smoothScale(rect->w, rect->h);
OSDTypeImage* image = new OSDTypeImage();
- image->SetPosition(QPoint(rect->x, rect->y));
+ image->SetPosition(QPoint(rect->x, rect->y), hmult, vmult);
image->LoadFromQImage(scaledImage);
subtitleOSD->AddType(image);
diff -pruN mythtv-0.19/libs/libmythtv/NuppelVideoPlayer.h mythtv/libs/libmythtv/NuppelVideoPlayer.h
--- mythtv-0.19/libs/libmythtv/NuppelVideoPlayer.h 2006-02-03 04:06:32.000000000 +1000
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.h 2006-03-18 08:22:45.000000000 +1000
@@ -150,7 +150,8 @@ class NuppelVideoPlayer
// Complicated gets
long long CalcMaxFFTime(long long ff, bool setjump = true) const;
long long CalcRWTime(long long rw) const;
- void calcSliderPos(struct StatusPosInfo &posInfo);
+ void calcSliderPos(struct StatusPosInfo &posInfo,
+ bool paddedFields = false);
/// Non-const gets
OSD *GetOSD(void) { return osd; }
@@ -543,6 +544,7 @@ class NuppelVideoPlayer
QMap<long long, int>::Iterator deleteIter;
QMap<long long, int>::Iterator blankIter;
QMap<long long, int>::Iterator commBreakIter;
+ bool forcePositionMapSync;
// Playback (output) speed control
/// Lock for next_play_speed and next_normal_speed
diff -pruN mythtv-0.19/libs/libmythtv/NuppelVideoRecorder.cpp mythtv/libs/libmythtv/NuppelVideoRecorder.cpp
--- mythtv-0.19/libs/libmythtv/NuppelVideoRecorder.cpp 2006-01-21 02:31:04.000000000 +1000
+++ mythtv/libs/libmythtv/NuppelVideoRecorder.cpp 2006-03-31 11:55:22.000000000 +1000
@@ -216,7 +216,10 @@ NuppelVideoRecorder::~NuppelVideoRecorde
}
if (mpa_codec)
+ {
+ QMutexLocker locker(&avcodeclock);
avcodec_close(mpa_ctx);
+ }
if (mpa_ctx)
av_free(mpa_ctx);
@@ -453,8 +456,11 @@ bool NuppelVideoRecorder::SetupAVCodec(v
useavcodec = true;
if (mpa_codec)
+ {
+ QMutexLocker locker(&avcodeclock);
avcodec_close(mpa_ctx);
-
+ }
+
if (mpa_ctx)
av_free(mpa_ctx);
mpa_ctx = NULL;
@@ -626,13 +632,14 @@ int NuppelVideoRecorder::AudioInit(bool
int frag, blocksize = 4096;
int tmp;
-#if !defined (HAVE_SYS_SOUNDCARD_H) && !defined(HAVE_SOUNDCARD_H)
- VERBOSE(VB_IMPORTANT, QString("NVR::AudioInit() This Unix doesn't support"
- " device files for audio access. Skipping"));
- return 1;
-#else
if (!skipdevice)
{
+#if !defined (HAVE_SYS_SOUNDCARD_H) && !defined(HAVE_SOUNDCARD_H)
+ VERBOSE(VB_IMPORTANT,
+ QString("NVR::AudioInit() This Unix doesn't support"
+ " device files for audio access. Skipping"));
+ return 1;
+#else
if (-1 == (afd = open(audiodevice.ascii(), O_RDONLY | O_NONBLOCK)))
{
VERBOSE(VB_IMPORTANT, QString("NVR: Error, cannot open DSP '%1'").
@@ -678,8 +685,8 @@ int NuppelVideoRecorder::AudioInit(bool
}
close(afd);
- }
#endif
+ }
audio_bytes_per_sample = audio_channels * audio_bits / 8;
blocksize *= 4;
diff -pruN mythtv-0.19/libs/libmythtv/osd.cpp mythtv/libs/libmythtv/osd.cpp
--- mythtv-0.19/libs/libmythtv/osd.cpp 2006-01-27 14:55:51.000000000 +1000
+++ mythtv/libs/libmythtv/osd.cpp 2006-02-19 07:26:06.000000000 +1000
@@ -154,7 +154,8 @@ void OSD::SetDefaults(void)
}
OSDTypeCC *ccpage = new OSDTypeCC(name, ccfont, sub_xoff, sub_yoff,
- sub_dispw, sub_disph);
+ sub_dispw, sub_disph,
+ wmult, hmult);
container->AddType(ccpage);
}
@@ -517,7 +518,7 @@ void OSD::parseBox(OSDSet *container, QD
}
}
- OSDTypeBox *box = new OSDTypeBox(name, area);
+ OSDTypeBox *box = new OSDTypeBox(name, area, wmult, hmult);
container->AddType(box);
}
@@ -658,7 +659,7 @@ void OSD::parseTextArea(OSDSet *containe
return;
}
- OSDTypeText *text = new OSDTypeText(name, ttffont, "", area);
+ OSDTypeText *text = new OSDTypeText(name, ttffont, "", area, wmult, hmult);
container->AddType(text);
text->SetMultiLine(multiline);
@@ -875,7 +876,7 @@ void OSD::parsePositionRects(OSDSet *con
QRect area = parseRect(getFirstText(info));
normalizeRect(area);
- rects->AddPosition(area);
+ rects->AddPosition(area, wmult, hmult);
}
else
{
@@ -919,7 +920,7 @@ void OSD::parsePositionImage(OSDSet *con
pos.setX((int)(pos.x() * wmult + xoffset));
pos.setY((int)(pos.y() * hmult + yoffset));
- image->AddPosition(pos);
+ image->AddPosition(pos, wmult, hmult);
}
else if (info.tagName() == "staticsize")
{
@@ -1925,7 +1926,7 @@ void OSD::ShowEditArrow(long long number
image = new OSDTypeImage(*editarrowright);
}
- image->SetPosition(QPoint(xpos, ypos));
+ image->SetPosition(QPoint(xpos, ypos), wmult, hmult);
set->AddType(image);
set->Display();
diff -pruN mythtv-0.19/libs/libmythtv/osdimagecache.cpp mythtv/libs/libmythtv/osdimagecache.cpp
--- mythtv-0.19/libs/libmythtv/osdimagecache.cpp 1970-01-01 10:00:00.000000000 +1000
+++ mythtv/libs/libmythtv/osdimagecache.cpp 2006-05-10 09:54:43.000000000 +1000
@@ -0,0 +1,296 @@
+// -*- Mode: c++ -*-
+/** OSDImageCache
+ * Copyright (c) 2006 by Pekka J<><4A>skel<65>inen, Daniel Thor Kristjansson
+ * Distributed as part of MythTV under GPL v2 and later.
+ */
+
+// POSIX headers
+#include <stdint.h>
+
+// Qt headers
+#include <qdir.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qdatastream.h>
+#include <qdeepcopy.h>
+
+// MythTV headers
+#include "mythcontext.h"
+#include "osdimagecache.h"
+
+// Print statistics of OSD image access in the destructor of OSDImageCache
+//#define PRINT_OSD_IMAGE_CACHE_STATS
+
+#define LOC QString("OSDImgCache: ")
+#define LOC_ERR QString("OSDImgCache, Error: ")
+
+uint OSDImageCache::kMaximumMemoryCacheSize = 5 * 1024 * 1024;
+
+/** \fn OSDImageCacheValue::OSDImageCacheValue(unsigned char*,unsigned char*,unsighed char*,unsigned char*,unsighed char*, QRect)
+ * \brief The main constructor that takes the image data as arguments.
+ *
+ * The image data becomes property of the OSDImageCacheValue
+ * and will be deleted by it.
+ */
+OSDImageCacheValue::OSDImageCacheValue(
+ QString cacheKey,
+ unsigned char *yuv, unsigned char *ybuffer,
+ unsigned char *ubuffer, unsigned char *vbuffer,
+ unsigned char *alpha, QRect imagesize) :
+ m_yuv(yuv), m_ybuffer(ybuffer),
+ m_ubuffer(ubuffer), m_vbuffer(vbuffer),
+ m_alpha(alpha), m_imagesize(imagesize),
+ m_cacheKey(QDeepCopy<QString>(cacheKey))
+{
+ uint yuv_size = m_imagesize.width() * m_imagesize.height() * 3 / 2;
+ m_size_in_bytes =
+ (sizeof(OSDImageCacheValue)) + yuv_size +
+ (m_imagesize.width() * m_imagesize.height());
+}
+
+/** \fn OSDImageCacheValue::~OSDImageCacheValue()
+ * \brief Destructor, frees the cached bitmaps.
+ */
+OSDImageCacheValue::~OSDImageCacheValue()
+{
+ delete [] m_yuv;
+ m_yuv = NULL;
+ delete [] m_alpha;
+ m_alpha = NULL;
+}
+
+/** \fn OSDImageCache::OSDImageCache()
+ * \brief Constructor, initializes the internal cache structures.
+ */
+OSDImageCache::OSDImageCache() :
+ m_cacheLock(true), m_imageCache(kMaximumMemoryCacheSize, 50),
+ m_memHits(0), m_diskHits(0), m_misses(0)
+{
+ // When the cache gets too large, items are
+ // automatically deleted from it in LRU order.
+ m_imageCache.setAutoDelete(true);
+}
+
+/** \fn OSDImageCache::~OSDImageCache()
+ * \brief Destructor, frees all cached OSD images.
+ */
+OSDImageCache::~OSDImageCache()
+{
+#ifdef PRINT_OSD_IMAGE_CACHE_STATS
+ int totalAccess = m_memHits + m_diskHits + m_misses;
+ if (totalAccess == 0)
+ return;
+
+#define LOG_PREFIX "OSDImageCache: "
+ VERBOSE(VB_IMPORTANT, LOC << " Statistics: " << endl
+ << LOG_PREFIX << m_imageCache.totalCost() << " bytes in cache\n"
+ << LOG_PREFIX << " memory hits: "
+ << m_memHits << ", " << m_memHits*100.0/totalAccess << "%\n"
+ << LOG_PREFIX << " disk hits: "
+ << m_diskHits << ", " << m_diskHits*100.0/totalAccess << "%\n"
+ << LOG_PREFIX << " misses: "
+ << m_misses << ", " << m_misses*100.0/totalAccess << "%");
+#undef LOC_PREFIX
+#endif
+ Reset();
+}
+
+/** \fn OSDImageCache::Contains(const QString&,bool)
+ * \brief Returns true if cached OSD image was found in the cache.
+ *
+ * \param key The key for this image.
+ * \param useFile If true, also look from the disk cache.
+ */
+bool OSDImageCache::Contains(const QString &key, bool useFile) const
+{
+ QMutexLocker locker(&m_cacheLock);
+
+ if (m_imageCache.find(key) != NULL)
+ return true;
+
+ if (!useFile)
+ return false;
+
+ return InFileCache(key);
+}
+
+bool OSDImageCache::InFileCache(const QString &key) const
+{
+ // check if cache file exists
+ QDir dir(MythContext::GetConfDir() + "/osdcache/");
+ QFileInfo cFile(dir.path() + "/" + key);
+ if (!cFile.exists() || !cFile.isReadable())
+ return false;
+
+ // check if backing file exists
+ QString orig = ExtractOriginal(key);
+ if (orig.isEmpty())
+ return false;
+
+ QFileInfo oFile(orig);
+ if (!oFile.exists())
+ {
+ VERBOSE(VB_IMPORTANT, LOC + QString("Can't find '%1'").arg(orig));
+ return false;
+ }
+
+ // if cache file is older than backing file, delete cache file
+ if (cFile.lastModified() < oFile.lastModified())
+ {
+ cFile.dir().remove(cFile.baseName(true));
+ return false;
+ }
+
+ return true;
+}
+
+/** \fn OSDImageCache::Get(const QString&,bool)
+ * \brief Returns OSD image data from cache.
+ *
+ * This also removes the image from the cache so it won't be deleted
+ * while in use. The deletion of the taken item becomes responsibility
+ * of the client. Returns NULL if item with the given key is not found.
+ *
+ * \param key The key for this image.
+ * \param useFile If true, also check the disk cache.
+ */
+OSDImageCacheValue *OSDImageCache::Get(const QString &key, bool useFile)
+{
+ QMutexLocker locker(&m_cacheLock);
+ OSDImageCacheValue* item = m_imageCache.find(key);
+ if (item)
+ {
+ m_memHits++;
+ return m_imageCache.take(key);
+ }
+
+ if (!useFile || !InFileCache(key))
+ {
+ m_misses++;
+ return NULL;
+ }
+
+ QDir dir(MythContext::GetConfDir() + "/osdcache/");
+ QFile cacheFile(dir.path() + "/" + key);
+ cacheFile.open(IO_ReadOnly);
+ uint32_t imwidth = 0;
+ uint32_t imheight = 0;
+
+ QDataStream stream(&cacheFile);
+ stream >> imwidth >> imheight;
+
+ uint yuv_size = imwidth * imheight * 3 / 2;
+ uint tot_size = (sizeof(imwidth) * 2) + yuv_size + (imwidth * imheight);
+
+ if (cacheFile.size() != tot_size)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + key + " wrong cache file size!"
+ << cacheFile.size() << " != " << tot_size);
+ return NULL;
+ }
+
+ unsigned char *yuv = new unsigned char[yuv_size];
+ unsigned char *alpha = new unsigned char[imwidth * imheight];
+ stream.readRawBytes((char*)yuv, yuv_size);
+ stream.readRawBytes((char*)alpha, imwidth * imheight);
+ cacheFile.close();
+
+ OSDImageCacheValue* value =
+ new OSDImageCacheValue(
+ key,
+ yuv, yuv,
+ yuv + (imwidth * imheight),
+ yuv + (imwidth * imheight * 5 / 4),
+ alpha, QRect(0, 0, imwidth, imheight));
+
+ m_diskHits++;
+ return value;
+}
+
+/** \fn OSDImageCache::Insert(OSDImageCacheValue*)
+ * \brief Inserts OSD image data to memory cache.
+ *
+ * The item becomes property of the OSDImageCache and may be
+ * deleted any time by it.
+ *
+ * \param value The cache item.
+ */
+void OSDImageCache::Insert(OSDImageCacheValue *value)
+{
+ if (!value)
+ return;
+
+ QMutexLocker locker(&m_cacheLock);
+ if (!m_imageCache.insert(value->GetKey(), value, value->GetSize()))
+ {
+ VERBOSE(VB_IMPORTANT,
+ LOC_ERR + QString("inserting image to memory cache failed"));
+ }
+}
+
+
+/** \fn OSDImageCache::SaveToDisk(const OSDImageCacheValue*)
+ * \brief Saves OSD image data to disk cache.
+ *
+ * Item is not written to the memory cache, i.e., it stays as
+ * property of the client.
+ *
+ * \param value The cached OSD image to save.
+ */
+void OSDImageCache::SaveToDisk(const OSDImageCacheValue *value)
+{
+ if (InFileCache(value->GetKey()))
+ return;
+
+ QDir dir(MythContext::GetConfDir() + "/osdcache/");
+ if (!dir.exists() && !dir.mkdir(dir.path()))
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Creating osdcache directory failed.");
+ return;
+ }
+
+ QFile cacheFile(dir.path() + "/" + value->GetKey());
+ if (!cacheFile.open(IO_WriteOnly | IO_Truncate))
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Creating osdcache file failed.");
+ return;
+ }
+
+ uint32_t imwidth = value->m_imagesize.width();
+ uint32_t imheight = value->m_imagesize.height();
+ uint yuv_size = imwidth * imheight * 3 / 2;
+
+ QDataStream stream(&cacheFile);
+ stream << imwidth << imheight;
+ stream.writeRawBytes((const char*)value->m_yuv, yuv_size);
+ stream.writeRawBytes((const char*)value->m_alpha, imwidth * imheight);
+ cacheFile.close();
+}
+
+/** \fn OSDImageCache::CreateKey(const QString&,float,float,int,int)
+ * \brief Generates a cache key from the given OSD image parameters.
+ *
+ * The returned key is a string that can be safely used as a file name.
+ */
+QString OSDImageCache::CreateKey(const QString &filename, float wmult,
+ float hmult, int scalew, int scaleh)
+{
+ QString tmp = filename;
+ return QString("cache_%1@%2_%3_%4_%5").arg(tmp.replace(QChar('/'), "+"))
+ .arg(wmult).arg(hmult).arg(scalew).arg(scaleh);
+}
+
+QString OSDImageCache::ExtractOriginal(const QString &key)
+{
+ QString tmp0 = key.mid(6);
+ QString tmp1 = tmp0.left(tmp0.find("@"));
+ QString tmp2 = tmp1.replace(QChar('+'), "/");
+ return tmp2;
+}
+
+void OSDImageCache::Reset(void)
+{
+ QMutexLocker locker(&m_cacheLock);
+ // this also deletes the images due to setAutoDelete(true)
+ m_imageCache.clear();
+}
diff -pruN mythtv-0.19/libs/libmythtv/osdimagecache.h mythtv/libs/libmythtv/osdimagecache.h
--- mythtv-0.19/libs/libmythtv/osdimagecache.h 1970-01-01 10:00:00.000000000 +1000
+++ mythtv/libs/libmythtv/osdimagecache.h 2006-05-10 09:54:43.000000000 +1000
@@ -0,0 +1,74 @@
+// -*- Mode: c++ -*-
+
+// POSIX headers
+#include <stdint.h>
+
+// Qt headers
+#include <qmap.h>
+#include <qrect.h>
+#include <qmutex.h>
+#include <qstring.h>
+#include <qasciicache.h>
+
+class OSDImageCacheValue
+{
+ public:
+ OSDImageCacheValue(QString cacheKey,
+ unsigned char *yuv, unsigned char *ybuffer,
+ unsigned char *ubuffer, unsigned char *vbuffer,
+ unsigned char *alpha, QRect imagesize);
+
+ virtual ~OSDImageCacheValue();
+
+ uint GetSize(void) const { return m_size_in_bytes; }
+ QString GetKey(void) const { return m_cacheKey; }
+
+ public:
+ unsigned char *m_yuv;
+ unsigned char *m_ybuffer;
+ unsigned char *m_ubuffer;
+ unsigned char *m_vbuffer;
+ unsigned char *m_alpha;
+ QRect m_imagesize;
+
+ private:
+ uint m_size_in_bytes;
+ QString m_cacheKey;
+};
+
+typedef QAsciiCache<OSDImageCacheValue> img_cache_t;
+
+class OSDImageCache
+{
+ public:
+ OSDImageCache();
+ virtual ~OSDImageCache();
+
+ bool InFileCache(const QString &key) const;
+
+ bool Contains(const QString &key, bool useFile) const;
+
+ OSDImageCacheValue *Get(const QString &key, bool useFile);
+
+ void Insert(OSDImageCacheValue* value);
+
+ void SaveToDisk(const OSDImageCacheValue *value);
+
+ void Reset(void);
+
+ static QString CreateKey(const QString &filename,
+ float wmult, float hmult,
+ int scalew, int scaleh);
+
+ static QString ExtractOriginal(const QString &key);
+
+ private:
+ mutable QMutex m_cacheLock;
+ img_cache_t m_imageCache;
+ int m_memHits;
+ int m_diskHits;
+ int m_misses;
+
+ /// Limit on the maximum total size of OSD images cached in *memory*.
+ static uint kMaximumMemoryCacheSize;
+};
diff -pruN mythtv-0.19/libs/libmythtv/osdlistbtntype.cpp mythtv/libs/libmythtv/osdlistbtntype.cpp
--- mythtv-0.19/libs/libmythtv/osdlistbtntype.cpp 2005-12-05 11:39:09.000000000 +1000
+++ mythtv/libs/libmythtv/osdlistbtntype.cpp 2006-02-19 07:26:06.000000000 +1000
@@ -19,206 +19,148 @@
*
* ============================================================ */
-#include <iostream>
+// ANSI C headers
+#include <cmath>
+// C++ headers
+#include <algorithm>
+using namespace std;
+
+// Qt headers
#include <qapplication.h>
#include <qpixmap.h>
#include <qpainter.h>
#include <qimage.h>
#include <qcolor.h>
+// MythTV headers
#include "mythcontext.h"
#include "mythdialogs.h"
-
#include "osdlistbtntype.h"
+#define LOC QString("OSDListTreeType: ")
+#define LOC_ERR QString("OSDListTreeType, Error: ")
-OSDGenericTree::OSDGenericTree(OSDGenericTree *parent, const QString &name,
- const QString &action, int check,
- OSDTypeImage *image, QString group)
- : GenericTree(name)
-{
- m_checkable = check;
- m_action = action;
- m_image = image;
- m_parentButton = NULL;
-
- if (group != "")
- m_group = group;
- else
- m_group = action;
-
- if (!action.isEmpty() && !action.isNull())
- setSelectable(true);
-
- if (parent)
- parent->addNode(this);
-}
-
-////////////////////////////////////////////////////////////////////////////
-
-OSDListTreeType::OSDListTreeType(const QString &name, const QRect &area,
- const QRect &levelsize, int levelspacing,
- float wmult, float hmult)
- : OSDType(name)
+static QRect unbias(QRect rect, float wmult, float hmult)
{
- m_wmult = wmult;
- m_hmult = hmult;
-
- m_totalarea = area;
- m_levelsize = levelsize;
- m_levelspacing = levelspacing;
-
- if (gContext->GetNumSetting("UseArrowAccels", 1))
- m_arrowAccel = true;
- else
- m_arrowAccel = false;
-
- levels = 0;
- curlevel = -1;
-
- treetop = NULL;
- currentpos = NULL;
-
- currentlevel = NULL;
-
- listLevels.setAutoDelete(true);
-
- m_active = NULL;
- m_inactive = NULL;
+ return QRect((int)round(rect.x() / wmult),
+ (int)round(rect.y() / hmult),
+ (int)ceil( rect.width() / wmult),
+ (int)ceil( rect.height() / hmult));
+}
+
+static QRect bias(QRect rect, float wmult, float hmult)
+{
+ return QRect((int)round(rect.x() * wmult),
+ (int)round(rect.y() * hmult),
+ (int)ceil( rect.width() * wmult),
+ (int)ceil( rect.height() * hmult));
+}
+
+OSDListTreeType::OSDListTreeType(
+ const QString &name, const QRect &area,
+ const QRect &levelsize, int levelspacing,
+ float wmult, float hmult)
+ : OSDType(name),
+ treetop(NULL), currentpos(NULL),
+ m_active(NULL), m_inactive(NULL),
+ m_itemRegBeg(Qt::black), m_itemRegEnd(QColor(80,80,80)),
+ m_itemSelBeg(QColor(82,202,56)), m_itemSelEnd(QColor(52,152,56)),
+ m_itemRegAlpha(100), m_itemSelAlpha(255),
+ m_spacing(0), m_margin(0),
+ m_levelspacing(levelspacing),
+ m_totalarea(area), m_levelsize(levelsize),
+ m_unbiasedspacing(1.0f), m_unbiasedmargin(1.0f),
+ m_unbiasedarea(0,0,0,0), m_unbiasedsize(0,0,0,0),
+ m_wmult(wmult), m_hmult(hmult),
+ m_depth(0), m_levelnum(-1),
+ m_visible(true),
+ m_arrowAccel(gContext->GetNumSetting("UseArrowAccels", 1))
+{
+ m_wmult = (wmult == 0.0f) ? 1.0f : wmult;
+ m_hmult = (hmult == 0.0f) ? 1.0f : hmult;
+ m_unbiasedarea = unbias(area, wmult, hmult);
+ m_unbiasedsize = unbias(levelsize, wmult, hmult);
+}
+
+OSDListTreeType::~OSDListTreeType()
+{
+ OSDListBtnList::iterator it = listLevels.begin();
+ for (; it != listLevels.end(); ++it)
+ delete *it;
+}
+
+void OSDListTreeType::Reinit(float wmult, float hmult)
+{
+ m_wmult = (wmult == 0.0f) ? 1.0f : wmult;
+ m_hmult = (hmult == 0.0f) ? 1.0f : hmult;
+ m_spacing = (uint) round(m_unbiasedspacing * wmult);
+ m_margin = (uint) round(m_unbiasedmargin * wmult);
+ m_totalarea = bias(m_unbiasedarea, wmult, hmult);
+ m_levelsize = bias(m_unbiasedsize, wmult, hmult);
+
+ if (!treetop || m_levelnum < 0)
+ return;
+
+ // Save item indices
+ vector<uint> list;
+ for (uint i = 0; i <= (uint)m_levelnum; i++)
+ list.push_back(listLevels[i]->GetItemCurrentPos());
+
+ // Delete old OSD items
+ OSDListBtnList clone = listLevels;
+ listLevels.clear();
+ OSDListBtnList::iterator it = clone.begin();
+ for (; it != clone.end(); ++it)
+ delete *it;
- SetItemRegColor(Qt::black,QColor(80,80,80),100);
- SetItemSelColor(QColor(82,202,56),QColor(52,152,56),255);
-
- m_spacing = 0;
- m_margin = 0;
-}
-
-void OSDListTreeType::Reinit(float wchange, float hchange, float wmult,
- float hmult)
-{
- m_wmult = wmult;
- m_hmult = hmult;
-
- m_spacing = (int)(m_spacing * wchange);
- m_margin = (int)(m_margin * wchange);
-
- int width = (int)(m_totalarea.width() * wchange);
- int height = (int)(m_totalarea.height() * hchange);
- int x = (int)(m_totalarea.x() * wchange);
- int y = (int)(m_totalarea.y() * hchange);
-
- m_totalarea = QRect(x, y, width, height);
-
- width = (int)(m_levelsize.width() * wchange);
- height = (int)(m_levelsize.height() * hchange);
- x = (int)(m_levelsize.x() * wchange);
- y = (int)(m_levelsize.y() * hchange);
-
- m_levelsize = QRect(x, y, width, height);
-
- QPtrListIterator<OSDListBtnType> it(listLevels);
- OSDListBtnType *child;
-
- while ((child = it.current()) != 0)
- {
- child->Reinit(wchange, hchange, wmult, hmult);
- ++it;
- }
+ // Create new OSD items
+ SetAsTree(treetop, &list);
}
void OSDListTreeType::SetGroupCheckState(QString group, int newState)
{
- QPtrListIterator<OSDListBtnType> it(listLevels);
- OSDListBtnType *child;
- while ((child = it.current()) != 0)
- {
- child->SetGroupCheckState(group, newState);
- ++it;
- }
+ OSDListBtnList::iterator it = listLevels.begin();
+ for (; it != listLevels.end(); ++it)
+ (*it)->SetGroupCheckState(group, newState);
}
-void OSDListTreeType::SetItemRegColor(const QColor& beg, const QColor& end,
- uint alpha)
-{
- m_itemRegBeg = beg;
- m_itemRegEnd = end;
- m_itemRegAlpha = alpha;
-}
-
-void OSDListTreeType::SetItemSelColor(const QColor& beg, const QColor& end,
- uint alpha)
-{
- m_itemSelBeg = beg;
- m_itemSelEnd = end;
- m_itemSelAlpha = alpha;
-}
-
-void OSDListTreeType::SetFontActive(TTFFont *font)
-{
- m_active = font;
-}
-
-void OSDListTreeType::SetFontInactive(TTFFont *font)
-{
- m_inactive = font;
-}
-
-void OSDListTreeType::SetSpacing(int spacing)
-{
- m_spacing = spacing;
-}
-
-void OSDListTreeType::SetMargin(int margin)
-{
- m_margin = margin;
-}
-
-void OSDListTreeType::SetAsTree(OSDGenericTree *toplevel)
+void OSDListTreeType::SetAsTree(OSDGenericTree *toplevel,
+ vector<uint> *select_list)
{
if (treetop)
{
listLevels.clear();
- currentlevel = NULL;
- treetop = NULL;
- currentpos = NULL;
- levels = 0;
- curlevel = -1;
+ treetop = NULL;
+ currentpos = NULL;
+ m_depth = 0;
+ m_levelnum = -1;
}
- levels = toplevel->calculateDepth(0) - 1;
-
- if (levels <= 0)
+ m_depth = toplevel->calculateDepth(0) - 1;
+ if (m_depth <= 0)
{
- cerr << "Need at least one level\n";
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "SetAsTree: Need at least one level");
return;
}
- currentpos = (OSDGenericTree *)toplevel->getChildAt(0);
-
+ currentpos = (OSDGenericTree*) toplevel->getChildAt(0);
if (!currentpos)
{
- cerr << "No top-level children?\n";
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "SetAsTree: Need top-level children");
return;
}
- treetop = toplevel;
-
- // just for now, remove later
- if (levels > 2)
- levels = 3;
-
- for (int i = 0; i < levels; i++)
+ // Create OSD buttons for all levels
+ for (uint i = 0; i < (uint)m_depth; i++)
{
QString levelname = QString("level%1").arg(i + 1);
-
QRect curlevelarea = m_levelsize;
curlevelarea.moveBy(m_totalarea.x(), m_totalarea.y());
-
curlevelarea.moveBy((m_levelsize.width() + m_levelspacing) * i, 0);
- OSDListBtnType *newlevel = new OSDListBtnType(levelname, curlevelarea,
- m_wmult, m_hmult, true);
+ OSDListBtnType *newlevel = new OSDListBtnType(
+ levelname, curlevelarea, m_wmult, m_hmult, true);
newlevel->SetFontActive(m_active);
newlevel->SetFontInactive(m_inactive);
@@ -227,229 +169,200 @@ void OSDListTreeType::SetAsTree(OSDGener
newlevel->SetSpacing(m_spacing);
newlevel->SetMargin(m_margin);
- listLevels.append(newlevel);
+ listLevels.push_back(newlevel);
}
- currentlevel = GetLevel(0);
+ // Set up needed levels and selects
+ vector<uint> slist;
+ slist.push_back(0);
+ if (select_list)
+ slist = *select_list;
- if (!currentlevel)
+ currentpos = treetop = toplevel;
+ for (m_levelnum = 0; m_levelnum < (int)slist.size(); m_levelnum++)
{
- cerr << "Something is seriously wrong (currentlevel = NULL)\n";
- return;
+ FillLevelFromTree(currentpos, m_levelnum);
+ GetLevel(m_levelnum)->SetActive(true);
+ GetLevel(m_levelnum)->SetVisible(true);
+ if (slist[m_levelnum])
+ GetLevel(m_levelnum)->SetItemCurrent(slist[m_levelnum]);
+ EnterItem(); // updates currentpos
}
-
- FillLevelFromTree(toplevel, currentlevel);
-
- currentlevel->SetVisible(true);
- currentlevel->SetActive(true);
-
- currentpos = (OSDGenericTree *)(currentlevel->GetItemFirst()->getData());
- curlevel = 0;
-
- emit itemEntered(this, currentpos);
+ m_levelnum--;
}
-OSDGenericTree *OSDListTreeType::GetCurrentPosition(void)
+static bool has_action(QString action, const QStringList &actions)
{
- return currentpos;
+ QStringList::const_iterator it;
+ for (it = actions.begin(); it != actions.end(); ++it)
+ {
+ if (action == *it)
+ return true;
+ }
+ return false;
}
bool OSDListTreeType::HandleKeypress(QKeyEvent *e)
{
- if (!currentlevel)
+ QStringList actions;
+ bool ok = gContext->GetMainWindow()->TranslateKeyPress(
+ "TV Playback", e, actions);
+
+ if (!ok || ((uint)m_levelnum >= listLevels.size()))
return false;
+ else if (has_action("UP", actions))
+ {
+ GetLevel(m_levelnum)->MoveUp();
+ EnterItem();
+ }
+ else if (has_action("DOWN", actions))
+ {
+ GetLevel(m_levelnum)->MoveDown();
+ EnterItem();
+ }
+ else if (has_action("LEFT", actions) && (m_levelnum > 0))
+ {
+ GetLevel(m_levelnum)->Reset();
+ GetLevel(m_levelnum)->SetVisible(false);
- bool handled = false;
- QStringList actions;
- if (gContext->GetMainWindow()->TranslateKeyPress("TV Playback", e,
- actions))
+ m_levelnum--;
+ EnterItem();
+ }
+ else if ((has_action("LEFT", actions) && m_arrowAccel) ||
+ has_action("ESCAPE", actions) ||
+ has_action("CLEAROSD", actions) ||
+ has_action("MENU", actions))
{
- for (unsigned int i = 0; i < actions.size() && !handled; i++)
- {
- QString action = actions[i];
- handled = true;
+ m_visible = false;
+ }
+ else if (has_action("RIGHT", actions) &&
+ (m_levelnum + 1 < m_depth) &&
+ (currentpos->childCount() > 0))
+ {
+ GetLevel(m_levelnum)->SetActive(false);
+ m_levelnum++;
- if (action == "UP")
- {
- currentlevel->MoveUp();
- SetCurrentPosition();
- }
- else if (action == "DOWN")
- {
- currentlevel->MoveDown();
- SetCurrentPosition();
- }
- else if (action == "LEFT")
- {
- if (curlevel > 0)
- {
- currentlevel->Reset();
- currentlevel->SetVisible(false);
-
- curlevel--;
-
- currentlevel = GetLevel(curlevel);
- currentlevel->SetActive(true);
- SetCurrentPosition();
- }
- else if (m_arrowAccel)
- {
- m_visible = false;
- }
- }
- else if (action == "RIGHT")
- {
- // FIXME: create new levels if needed..
- if (curlevel + 1 < levels && currentpos->childCount() > 0)
- {
- currentlevel->SetActive(false);
-
- curlevel++;
-
- currentlevel = GetLevel(curlevel);
-
- FillLevelFromTree(currentpos, currentlevel);
-
- currentlevel->SetVisible(true);
- currentlevel->SetActive(true);
- SetCurrentPosition();
- }
- else if (m_arrowAccel)
- {
- SetGroupCheckState(currentpos->getGroup(),
- OSDListBtnTypeItem::NotChecked);
- currentpos->getParentButton()->setChecked(
- OSDListBtnTypeItem::FullChecked);
- emit itemSelected(this, currentpos);
- }
- }
- else if (action == "ESCAPE" || action == "MENU" ||
- action == "CLEAROSD")
- m_visible = false;
- else if (action == "SELECT")
- {
- SetGroupCheckState(currentpos->getGroup(),
- OSDListBtnTypeItem::NotChecked);
- currentpos->getParentButton()->setChecked(
- OSDListBtnTypeItem::FullChecked);
- emit itemSelected(this, currentpos);
- }
- else
- handled = false;
- }
+ FillLevelFromTree(currentpos, m_levelnum);
+ GetLevel(m_levelnum)->SetVisible(true);
+ EnterItem();
+ }
+ else if ((has_action("RIGHT", actions) && m_arrowAccel) ||
+ has_action("SELECT", actions))
+ {
+ SelectItem();
+ }
+ else
+ {
+ return false;
}
- return handled;
+ return true;
}
void OSDListTreeType::Draw(OSDSurface *surface, int fade, int maxfade,
int xoff, int yoff)
{
- QPtrListIterator<OSDListBtnType> it(listLevels);
- OSDListBtnType *child;
-
- while ((child = it.current()) != 0)
- {
- child->Draw(surface, fade, maxfade, xoff, yoff);
- ++it;
- }
+ OSDListBtnList::iterator it = listLevels.begin();
+ for (; it != listLevels.end(); ++it)
+ (*it)->Draw(surface, fade, maxfade, xoff, yoff);
}
void OSDListTreeType::FillLevelFromTree(OSDGenericTree *item,
- OSDListBtnType *list)
+ uint level_num)
{
+ OSDListBtnType *list = GetLevel(level_num);
if (!list)
{
- VERBOSE(VB_IMPORTANT, "OSDListTreeType::FillLevelFromTree() "
- "called with no list. Ignoring call.");
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "FillLevelFromTree() "
+ "called with no list, ignoring.");
return;
}
list->Reset();
QPtrList<GenericTree> *itemlist = item->getAllChildren();
-
QPtrListIterator<GenericTree> it(*itemlist);
- GenericTree *child;
- while ((child = it.current()) != 0)
- {
- OSDGenericTree *osdchild = (OSDGenericTree *)child;
+ OSDGenericTree *child = (OSDGenericTree*) it.current();
+ OSDListBtnTypeItem *newitem = NULL;
+ for (;(child = (OSDGenericTree*) it.current()); ++it)
+ {
+ OSDTypeImage *im = child->getImage();
+ QString label = child->getString();
+ QString group = child->getGroup();
+ bool canCheck = child->getCheckable() >= 0;
+ bool hasCheck = child->getCheckable() == 1;
+ bool hasChild = child->childCount() > 0;
- OSDListBtnTypeItem *newitem;
- newitem = new OSDListBtnTypeItem(list, child->getString(),
- osdchild->getImage(),
- (osdchild->getCheckable() >= 0),
- (child->childCount() > 0));
- if (osdchild->getCheckable() == 1)
+ newitem = new OSDListBtnTypeItem(list, label, im, canCheck, hasChild);
+
+ if (hasCheck)
newitem->setChecked(OSDListBtnTypeItem::FullChecked);
- newitem->setGroup(osdchild->getGroup());
- newitem->setData(osdchild);
- osdchild->setParentButton(newitem);
+ newitem->setGroup(group);
+ newitem->setData(child);
- ++it;
+ child->setParentButton(newitem);
}
}
-OSDListBtnType *OSDListTreeType::GetLevel(int levelnum)
+OSDListBtnType *OSDListTreeType::GetLevel(uint levelnum)
{
- if ((uint)levelnum > listLevels.count())
- {
- cerr << "OOB GetLevel call\n";
- return NULL;
- }
+ if (levelnum < listLevels.size())
+ return listLevels[levelnum];
- return listLevels.at(levelnum);
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "GetLevel("<<levelnum<<") "
+ "listLevels.size() is only "<<listLevels.size());
+ return NULL;
}
-void OSDListTreeType::SetCurrentPosition(void)
+void OSDListTreeType::EnterItem(void)
{
- if (!currentlevel)
+ if ((uint)m_levelnum >= listLevels.size())
return;
- OSDListBtnTypeItem *lbt = currentlevel->GetItemCurrent();
+ listLevels[m_levelnum]->SetActive(true);
+ OSDListBtnTypeItem *lbt = listLevels[m_levelnum]->GetItemCurrent();
+ if (lbt)
+ {
+ currentpos = (OSDGenericTree*) (lbt->getData());
+ emit itemEntered(this, currentpos);
+ }
+}
- if (!lbt)
+void OSDListTreeType::SelectItem(void)
+{
+ if (!currentpos)
return;
- currentpos = (OSDGenericTree *)(lbt->getData());
- emit itemEntered(this, currentpos);
+ SetGroupCheckState(currentpos->getGroup(), OSDListBtnTypeItem::NotChecked);
+ currentpos->getParentButton()->setChecked(OSDListBtnTypeItem::FullChecked);
+ emit itemSelected(this, currentpos);
}
-
+
+#undef LOC_ERR
+#undef LOC
+
//////////////////////////////////////////////////////////////////////////
OSDListBtnType::OSDListBtnType(const QString &name, const QRect &area,
float wmult, float hmult,
bool showScrollArrows)
- : OSDType(name)
+ : OSDType(name),
+ m_order(0), m_rect(area),
+ m_contentsRect(0,0,0,0), m_arrowsRect(0,0,0,0),
+ m_wmult(wmult), m_hmult(hmult),
+ m_itemHeight(0), m_itemSpacing(0),
+ m_itemMargin(0), m_itemsVisible(0),
+ m_active(false), m_showScrollArrows(showScrollArrows),
+ m_showUpArrow(false), m_showDnArrow(false),
+ m_initialized(false), m_clearing(false),
+ m_visible(false),
+ m_itemRegBeg(Qt::black), m_itemRegEnd(QColor(80,80,80)),
+ m_itemSelBeg(QColor(82,202,56)), m_itemSelEnd(QColor(52,152,56)),
+ m_itemRegAlpha(100), m_itemSelAlpha(255),
+ m_fontActive(NULL), m_fontInactive(NULL),
+ m_topIndx(0), m_selIndx(0),
+ m_update(true)
{
- m_rect = area;
-
- m_wmult = wmult;
- m_hmult = hmult;
-
- m_showScrollArrows = showScrollArrows;
-
- m_active = false;
- m_showUpArrow = false;
- m_showDnArrow = false;
-
- m_itemList.setAutoDelete(false);
- m_topItem = 0;
- m_selItem = 0;
-
- m_initialized = false;
- m_clearing = false;
- m_itemSpacing = 0;
- m_itemMargin = 0;
- m_itemHeight = 0;
- m_itemsVisible = 0;
- m_fontActive = 0;
- m_fontInactive = 0;
-
- SetItemRegColor(Qt::black,QColor(80,80,80),100);
- SetItemSelColor(QColor(82,202,56),QColor(52,152,56),255);
-
- m_visible = false;
}
OSDListBtnType::~OSDListBtnType()
@@ -457,316 +370,198 @@ OSDListBtnType::~OSDListBtnType()
Reset();
}
-void OSDListBtnType::Reinit(float wchange, float hchange, float wmult,
- float hmult)
-{
- m_wmult = wmult;
- m_hmult = hmult;
-
- m_itemHeight = (int)(m_itemHeight * hchange);
- m_itemSpacing = (int)(m_itemSpacing * wchange);
- m_itemMargin = (int)(m_itemMargin * wchange);
-
- int width = (int)(m_rect.width() * wchange);
- int height = (int)(m_rect.height() * hchange);
- int x = (int)(m_rect.x() * wchange);
- int y = (int)(m_rect.y() * hchange);
-
- m_rect = QRect(x, y, width, height);
-
- Init();
-
- OSDListBtnTypeItem* item = 0;
- for (item = m_itemList.first(); item; item = m_itemList.next()) {
- item->Reinit(wchange, hchange, wmult, hmult);
- }
-
-}
-
void OSDListBtnType::SetGroupCheckState(QString group, int newState)
{
- OSDListBtnTypeItem* item = 0;
- for (item = m_itemList.first(); item; item = m_itemList.next()) {
- if (item->getGroup() == group)
- item->setChecked((OSDListBtnTypeItem::CheckState)newState);
- }
-}
-
-void OSDListBtnType::SetItemRegColor(const QColor& beg, const QColor& end,
- uint alpha)
-{
- m_itemRegBeg = beg;
- m_itemRegEnd = end;
- m_itemRegAlpha = alpha;
-}
-
-void OSDListBtnType::SetItemSelColor(const QColor& beg, const QColor& end,
- uint alpha)
-{
- m_itemSelBeg = beg;
- m_itemSelEnd = end;
- m_itemSelAlpha = alpha;
-}
-
-void OSDListBtnType::SetFontActive(TTFFont *font)
-{
- m_fontActive = font;
-}
-
-void OSDListBtnType::SetFontInactive(TTFFont *font)
-{
- m_fontInactive = font;
-}
-
-void OSDListBtnType::SetSpacing(int spacing)
-{
- m_itemSpacing = spacing;
-}
-
-void OSDListBtnType::SetMargin(int margin)
-{
- m_itemMargin = margin;
+ OSDListBtnItemList::iterator it;
+ for (it = m_itemList.begin(); it != m_itemList.end(); ++it)
+ if ((*it)->getGroup() == group)
+ (*it)->setChecked((OSDListBtnTypeItem::CheckState) newState);
}
-void OSDListBtnType::SetActive(bool active)
-{
- m_active = active;
-}
-
-void OSDListBtnType::Reset()
+void OSDListBtnType::Reset(void)
{
QMutexLocker lock(&m_update);
m_clearing = true;
-
- OSDListBtnTypeItem* item = 0;
- for (item = m_itemList.first(); item; item = m_itemList.next()) {
- delete item;
- }
-
- m_clearing = false;
+ OSDListBtnItemList::iterator it;
+ OSDListBtnItemList clone = m_itemList;
m_itemList.clear();
-
- m_topItem = 0;
- m_selItem = 0;
+ for (it = clone.begin(); it != clone.end(); ++it)
+ delete (*it);
+ m_clearing = false;
+
+ m_topIndx = 0;
+ m_selIndx = 0;
m_showUpArrow = false;
m_showDnArrow = false;
}
void OSDListBtnType::InsertItem(OSDListBtnTypeItem *item)
{
- OSDListBtnTypeItem* lastItem = m_itemList.last();
- m_itemList.append(item);
-
- if (m_showScrollArrows && m_itemList.count() > m_itemsVisible)
- m_showDnArrow = true;
- else
- m_showDnArrow = false;
-
- if (!lastItem)
- {
- m_topItem = item;
- m_selItem = item;
+ QMutexLocker lock(&m_update);
+ m_itemList.push_back(item);
+ m_showDnArrow = m_showScrollArrows && m_itemList.size() > m_itemsVisible;
+ if (m_itemList.size() == 1)
emit itemSelected(item);
- }
+}
+
+int find(const OSDListBtnItemList &list, const OSDListBtnTypeItem *item)
+{
+ for (uint i = 0; i < list.size(); i++)
+ if (list[i] == item)
+ return i;
+ return -1;
}
void OSDListBtnType::RemoveItem(OSDListBtnTypeItem *item)
{
+ QMutexLocker lock(&m_update);
if (m_clearing)
return;
-
- if (m_itemList.find(item) == -1)
- return;
- m_topItem = m_itemList.first();
- m_selItem = m_itemList.first();
+ int i = find(m_itemList, item);
+ if (i < 0)
+ return;
- m_itemList.remove(item);
+ m_itemList.erase(m_itemList.begin()+i);
m_showUpArrow = false;
-
- if (m_showScrollArrows && m_itemList.count() > m_itemsVisible)
- m_showDnArrow = true;
- else
- m_showDnArrow = false;
+ m_showDnArrow = m_itemList.size() > m_itemsVisible;
+ m_selIndx = 0;
+ m_topIndx = 0;
- if (m_selItem) {
- emit itemSelected(m_selItem);
- }
+ if (m_itemList.size())
+ emit itemSelected(m_itemList[m_selIndx]);
}
-void OSDListBtnType::SetItemCurrent(OSDListBtnTypeItem* item)
+void OSDListBtnType::SetItemCurrent(const OSDListBtnTypeItem* item)
{
- bool locked = m_update.tryLock();
+ QMutexLocker lock(&m_update);
+ int i = find(m_itemList, item);
+ if (i >= 0)
+ SetItemCurrent(i);
+}
- if (m_itemList.find(item) == -1)
+void OSDListBtnType::SetItemCurrent(uint current)
+{
+ QMutexLocker lock(&m_update);
+ if (current >= m_itemList.size())
return;
- m_topItem = item;
- m_selItem = item;
-
- if (m_showScrollArrows && m_itemList.count() > m_itemsVisible)
- m_showDnArrow = true;
- else
- m_showDnArrow = false;
-
- emit itemSelected(m_selItem);
-
- if (locked)
- m_update.unlock();
+ m_selIndx = current;
+ m_topIndx = max(m_selIndx - (int)m_itemsVisible, 0);
+ m_showUpArrow = m_topIndx;
+ m_showDnArrow = m_topIndx + m_itemsVisible < m_itemList.size();
+ emit itemSelected(m_itemList[m_selIndx]);
}
-void OSDListBtnType::SetItemCurrent(int current)
+int OSDListBtnType::GetItemCurrentPos(void) const
{
QMutexLocker lock(&m_update);
-
- OSDListBtnTypeItem* item = m_itemList.at(current);
- if (!item)
- item = m_itemList.first();
-
- SetItemCurrent(item);
+ return (m_itemList.size()) ? m_selIndx : -1;
}
-OSDListBtnTypeItem* OSDListBtnType::GetItemCurrent()
+OSDListBtnTypeItem* OSDListBtnType::GetItemCurrent(void)
{
- return m_selItem;
+ QMutexLocker lock(&m_update);
+ if (!m_itemList.size())
+ return NULL;
+ return m_itemList[m_selIndx];
}
-OSDListBtnTypeItem* OSDListBtnType::GetItemFirst()
+OSDListBtnTypeItem* OSDListBtnType::GetItemFirst(void)
{
- return m_itemList.first();
+ QMutexLocker lock(&m_update);
+ if (!m_itemList.size())
+ return NULL;
+ return m_itemList[0];
}
-OSDListBtnTypeItem* OSDListBtnType::GetItemNext(OSDListBtnTypeItem *item)
+OSDListBtnTypeItem* OSDListBtnType::GetItemNext(const OSDListBtnTypeItem *item)
{
QMutexLocker lock(&m_update);
-
- if (m_itemList.find(item) == -1)
- return 0;
-
- return m_itemList.next();
+ int i = find(m_itemList, item) + 1;
+ if (i <= 0 || i >= (int)m_itemList.size())
+ return NULL;
+ return m_itemList[i];
}
-int OSDListBtnType::GetCount()
+int OSDListBtnType::GetCount(void) const
{
- return m_itemList.count();
+ QMutexLocker lock(&m_update);
+ return m_itemList.size();
}
OSDListBtnTypeItem* OSDListBtnType::GetItemAt(int pos)
{
- return m_itemList.at(pos);
+ QMutexLocker lock(&m_update);
+ return m_itemList[pos];
}
-int OSDListBtnType::GetItemPos(OSDListBtnTypeItem* item)
+int OSDListBtnType::GetItemPos(const OSDListBtnTypeItem *item) const
{
QMutexLocker lock(&m_update);
-
- return m_itemList.find(item);
+ return find(m_itemList, item);
}
-void OSDListBtnType::MoveUp()
+void OSDListBtnType::MoveUp(void)
{
QMutexLocker lock(&m_update);
-
- if (m_itemList.find(m_selItem) == -1)
+ if (!m_itemList.size())
return;
- OSDListBtnTypeItem *item = m_itemList.prev();
- if (!item)
+ if (--m_selIndx < 0)
{
- item = m_itemList.last();
- if (!item)
- return;
-
- if (m_itemList.count() > m_itemsVisible)
- m_topItem = m_itemList.at(m_itemList.count() - m_itemsVisible);
- else
- m_topItem = m_itemList.first();
+ m_selIndx = m_itemList.size() - 1;
+ m_topIndx = (m_itemList.size() > m_itemsVisible) ?
+ m_itemList.size() - m_itemsVisible : 0;
}
- m_selItem = item;
-
- if (m_itemList.find(m_selItem) < m_itemList.find(m_topItem))
- m_topItem = m_selItem;
-
- if (m_topItem != m_itemList.first())
- m_showUpArrow = true;
- else
- m_showUpArrow = false;
-
- if (m_itemList.find(m_topItem) + m_itemsVisible < m_itemList.count())
- m_showDnArrow = true;
- else
- m_showDnArrow = false;
+ m_topIndx = (m_selIndx < m_topIndx) ? m_selIndx : m_topIndx;
+ m_showUpArrow = m_topIndx;
+ m_showDnArrow = m_topIndx + m_itemsVisible < m_itemList.size();
- emit itemSelected(m_selItem);
+ emit itemSelected(m_itemList[m_selIndx]);
}
-void OSDListBtnType::MoveDown()
+void OSDListBtnType::MoveDown(void)
{
QMutexLocker lock(&m_update);
-
- if (m_itemList.find(m_selItem) == -1)
+ if (!m_itemList.size())
return;
- OSDListBtnTypeItem *item = m_itemList.next();
- if (!item)
- {
- item = m_itemList.first();
- if (!item)
- return;
-
- m_topItem = item;
- }
-
- m_selItem = item;
+ if (++m_selIndx >= (int)m_itemList.size())
+ m_selIndx = m_topIndx = 0;
- if (m_itemList.find(m_topItem) + m_itemsVisible <=
- (unsigned int)m_itemList.find(m_selItem))
- {
- m_topItem = m_itemList.at(m_itemList.find(m_topItem) + 1);
- }
-
- if (m_topItem != m_itemList.first())
- m_showUpArrow = true;
- else
- m_showUpArrow = false;
-
- if (m_itemList.find(m_topItem) + m_itemsVisible < m_itemList.count())
- m_showDnArrow = true;
- else
- m_showDnArrow = false;
+ bool scroll_down = m_topIndx + (int)m_itemsVisible <= m_selIndx;
+ m_topIndx = (scroll_down) ? m_topIndx + 1 : m_topIndx;
+
+ m_showUpArrow = m_topIndx;
+ m_showDnArrow = m_topIndx + m_itemsVisible < m_itemList.size();
- emit itemSelected(m_selItem);
+ emit itemSelected(m_itemList[m_selIndx]);
}
-void OSDListBtnType::Draw(OSDSurface *surface, int fade, int maxfade, int xoff,
- int yoff)
+void OSDListBtnType::Draw(OSDSurface *surface,
+ int fade, int maxfade,
+ int xoff, int yoff)
{
- (void)xoff;
- (void)yoff;
-
+ QMutexLocker lock(&m_update);
if (!m_visible)
return;
-
- QMutexLocker lock(&m_update);
-
if (!m_initialized)
Init();
TTFFont *font = m_active ? m_fontActive : m_fontInactive;
int y = m_rect.y();
- m_itemList.find(m_topItem);
- OSDListBtnTypeItem *it = m_itemList.current();
- while (it && (y - m_rect.y()) <= (m_contentsRect.height() - m_itemHeight))
+ for (uint i = m_topIndx; i < m_itemList.size(); i++)
{
- it->paint(surface, font, fade, maxfade, m_rect.x()+ xoff, y + yoff);
-
+ if (!((y - m_rect.y()) <= (m_contentsRect.height() - m_itemHeight)))
+ break;
+ m_itemList[i]->paint(surface, font, fade, maxfade,
+ m_rect.x() + xoff, y + yoff);
y += m_itemHeight + m_itemSpacing;
-
- it = m_itemList.next();
}
if (m_showScrollArrows)
@@ -792,13 +587,12 @@ void OSDListBtnType::Draw(OSDSurface *su
}
}
-void OSDListBtnType::Init()
+void OSDListBtnType::Init(void)
{
int sz1 = m_fontActive->Size() * 3 / 2;
int sz2 = m_fontInactive->Size() * 3 / 2;
- m_itemHeight = QMAX(sz1, sz2) + (int)(2 * m_itemMargin);
-
- m_itemHeight = (m_itemHeight / 2) * 2;
+ m_itemHeight = max(sz1, sz2) + (int)(2 * m_itemMargin);
+ m_itemHeight = m_itemHeight & ~0x1;
if (m_showScrollArrows)
{
@@ -838,11 +632,7 @@ void OSDListBtnType::Init()
InitItem(m_itemSelActPix, itemWidth, m_itemHeight,
m_itemSelBeg, m_itemSelEnd, 255);
- if (m_itemList.count() > m_itemsVisible && m_showScrollArrows)
- m_showDnArrow = true;
- else
- m_showDnArrow = false;
-
+ m_showDnArrow = m_itemList.size() > m_itemsVisible && m_showScrollArrows;
m_initialized = true;
}
@@ -885,68 +675,57 @@ void OSDListBtnType::InitItem(
void OSDListBtnType::LoadPixmap(OSDTypeImage& pix, const QString& fileName)
{
- QString file = gContext->GetThemesParentDir() + "default/lb-" + fileName + ".png";
- pix.LoadImage(file, m_wmult, m_hmult);
+ QString path = gContext->GetThemesParentDir() + "default/lb-";
+ pix.LoadImage(path + fileName + ".png", m_wmult, m_hmult);
}
/////////////////////////////////////////////////////////////////////////////
-OSDListBtnTypeItem::OSDListBtnTypeItem(OSDListBtnType* lbtype,
- const QString& text,
- OSDTypeImage *pixmap, bool checkable,
- bool showArrow, CheckState state)
-{
- m_parent = lbtype;
- m_text = text;
- m_pixmap = pixmap;
- m_checkable = checkable;
- m_state = state;
- m_showArrow = showArrow;
- m_data = 0;
-
+OSDListBtnTypeItem::OSDListBtnTypeItem(
+ OSDListBtnType *lbtype, const QString &text,
+ OSDTypeImage *pixmap, bool checkable,
+ bool showArrow, CheckState state)
+ : m_parent(lbtype), m_pixmap(pixmap),
+ m_data(NULL), m_text(text),
+ m_group(QString::null), m_state(state),
+ m_showArrow(showArrow), m_checkable(checkable),
+ m_checkRect(0,0,0,0), m_arrowRect(0,0,0,0),
+ m_pixmapRect(0,0,0,0), m_textRect(0,0,0,0)
+{
if (!m_parent->m_initialized)
m_parent->Init();
- int margin = m_parent->m_itemMargin;
- int width = m_parent->m_rect.width();
- int height = m_parent->m_itemHeight;
+ OSDTypeImage &checkPix = m_parent->m_checkNonePix;
+ OSDTypeImage &arrowPix = m_parent->m_arrowPix;
+
+ int margin = m_parent->m_itemMargin;
+ int width = m_parent->m_rect.width();
+ int height = m_parent->m_itemHeight;
+ int cw = checkPix.ImageSize().width();
+ int ch = checkPix.ImageSize().height();
+ int aw = arrowPix.ImageSize().width();
+ int ah = arrowPix.ImageSize().height();
+ int pw = m_pixmap ? m_pixmap->ImageSize().width() : 0;
+ int ph = m_pixmap ? m_pixmap->ImageSize().height() : 0;
- OSDTypeImage& checkPix = m_parent->m_checkNonePix;
- OSDTypeImage& arrowPix = m_parent->m_arrowPix;
-
- int cw = checkPix.ImageSize().width();
- int ch = checkPix.ImageSize().height();
- int aw = arrowPix.ImageSize().width();
- int ah = arrowPix.ImageSize().height();
- int pw = m_pixmap ? m_pixmap->ImageSize().width() : 0;
- int ph = m_pixmap ? m_pixmap->ImageSize().height() : 0;
-
if (m_checkable)
- m_checkRect = QRect(margin, (height - ch)/2, cw, ch);
- else
- m_checkRect = QRect(0,0,0,0);
+ m_checkRect = QRect(margin, (height - ch)/2, cw, ch);
if (m_showArrow)
- m_arrowRect = QRect(width - aw - margin, (height - ah)/2,
- aw, ah);
- else
- m_arrowRect = QRect(0,0,0,0);
+ m_arrowRect = QRect(width - aw - margin, (height - ah)/2, aw, ah);
- if (m_pixmap)
- m_pixmapRect = QRect(m_checkable ? (2*margin + m_checkRect.width()) :
- margin, (height - ph)/2,
- pw, ph);
- else
- m_pixmapRect = QRect(0,0,0,0);
+ if (m_pixmap)
+ {
+ int tmp = (m_checkable) ? (2 * margin + m_checkRect.width()) : margin;
+ m_pixmapRect = QRect(tmp, (height - ph)/2, pw, ph);
+ }
- m_textRect = QRect(margin +
- (m_checkable ? m_checkRect.width() + margin : 0) +
- (m_pixmap ? m_pixmapRect.width() + margin : 0),
- 0,
- width - 2*margin -
- (m_checkable ? m_checkRect.width() + margin : 0) -
- (m_showArrow ? m_arrowRect.width() + margin : 0) -
- (m_pixmap ? m_pixmapRect.width() + margin : 0),
- height);
+ int tx = margin, tw = width - (2 * margin);
+ tx += (m_checkable) ? m_checkRect.width() + margin : 0;
+ tx += (m_pixmap) ? m_pixmapRect.width() + margin : 0;
+ tw -= (m_checkable) ? m_checkRect.width() + margin : 0;
+ tw -= (m_showArrow) ? m_arrowRect.width() + margin : 0;
+ tw -= (m_pixmap) ? m_pixmapRect.width() + margin : 0;
+ m_textRect = QRect(tx, 0, tw, height);
m_parent->InsertItem(this);
}
@@ -957,52 +736,10 @@ OSDListBtnTypeItem::~OSDListBtnTypeItem(
m_parent->RemoveItem(this);
}
-QString OSDListBtnTypeItem::text() const
-{
- return m_text;
-}
-
-const OSDTypeImage* OSDListBtnTypeItem::pixmap() const
-{
- return m_pixmap;
-}
-
-bool OSDListBtnTypeItem::checkable() const
-{
- return m_checkable;
-}
-
-OSDListBtnTypeItem::CheckState OSDListBtnTypeItem::state() const
-{
- return m_state;
-}
-
-OSDListBtnType* OSDListBtnTypeItem::parent() const
-{
- return m_parent;
-}
-
-void OSDListBtnTypeItem::setChecked(CheckState state)
-{
- if (!m_checkable)
- return;
- m_state = state;
-}
-
-void OSDListBtnTypeItem::setData(void *data)
-{
- m_data = data;
-}
-
-void* OSDListBtnTypeItem::getData()
-{
- return m_data;
-}
-
void OSDListBtnTypeItem::paint(OSDSurface *surface, TTFFont *font,
int fade, int maxfade, int x, int y)
{
- if (this == m_parent->m_selItem)
+ if (this == m_parent->GetItemCurrent())
{
if (m_parent->m_active)
m_parent->m_itemSelActPix.Draw(surface, fade, maxfade, x, y);
@@ -1030,11 +767,14 @@ void OSDListBtnTypeItem::paint(OSDSurfac
cr.moveBy(x, y);
if (m_state == HalfChecked)
- m_parent->m_checkHalfPix.Draw(surface, fade, maxfade, cr.x(), cr.y());
+ m_parent->m_checkHalfPix.Draw(surface, fade, maxfade,
+ cr.x(), cr.y());
else if (m_state == FullChecked)
- m_parent->m_checkFullPix.Draw(surface, fade, maxfade, cr.x(), cr.y());
+ m_parent->m_checkFullPix.Draw(surface, fade, maxfade,
+ cr.x(), cr.y());
else
- m_parent->m_checkNonePix.Draw(surface, fade, maxfade, cr.x(), cr.y());
+ m_parent->m_checkNonePix.Draw(surface, fade, maxfade,
+ cr.x(), cr.y());
}
if (m_pixmap)
@@ -1049,39 +789,3 @@ void OSDListBtnTypeItem::paint(OSDSurfac
tr.moveBy(0, font->Size() / 4);
font->DrawString(surface, tr.x(), tr.y(), m_text, tr.right(), tr.bottom());
}
-
-void OSDListBtnTypeItem::Reinit(float wchange, float hchange,
- float wmult, float hmult)
-{
- (void)wmult;
- (void)hmult;
-
- int width = (int)(m_checkRect.width() * wchange);
- int height = (int)(m_checkRect.height() * hchange);
- int x = (int)(m_checkRect.x() * wchange);
- int y = (int)(m_checkRect.y() * hchange);
-
- m_checkRect = QRect(x, y, width, height);
-
- width = (int)(m_pixmapRect.width() * wchange);
- height = (int)(m_pixmapRect.height() * hchange);
- x = (int)(m_pixmapRect.x() * wchange);
- y = (int)(m_pixmapRect.y() * hchange);
-
- m_pixmapRect = QRect(x, y, width, height);
-
- width = (int)(m_textRect.width() * wchange);
- height = (int)(m_textRect.height() * hchange);
- x = (int)(m_textRect.x() * wchange);
- y = (int)(m_textRect.y() * hchange);
-
- m_textRect = QRect(x, y, width, height);
-
- width = (int)(m_arrowRect.width() * wchange);
- height = (int)(m_arrowRect.height() * hchange);
- x = (int)(m_arrowRect.x() * wchange);
- y = (int)(m_arrowRect.y() * hchange);
-
- m_arrowRect = QRect(x, y, width, height);
-}
-
diff -pruN mythtv-0.19/libs/libmythtv/osdlistbtntype.h mythtv/libs/libmythtv/osdlistbtntype.h
--- mythtv-0.19/libs/libmythtv/osdlistbtntype.h 2005-12-05 11:39:09.000000000 +1000
+++ mythtv/libs/libmythtv/osdlistbtntype.h 2006-02-19 07:26:06.000000000 +1000
@@ -1,3 +1,4 @@
+// -*- Mode: c++ -*-
/* ============================================================
* File : uilistbtntype.h
* Author: Renchi Raju <renchi@pooh.tam.uiuc.edu>
@@ -22,38 +23,57 @@
#ifndef OSDLISTBTNTYPE_H
#define OSDLISTBTNTYPE_H
-#include "osdtypes.h"
-#include "ttfont.h"
+#include <vector>
+using namespace std;
+
+// Qt headers
#include <qcolor.h>
#include <qptrlist.h>
#include <qevent.h>
#include <qmutex.h>
+#include <qptrvector.h>
+
+// MythTV headers
+#include "osdtypes.h"
+#include "ttfont.h"
#include "generictree.h"
-class OSDListBtnTypeItem;
class OSDListBtnType;
+class OSDListBtnTypeItem;
+typedef vector<OSDListBtnType*> OSDListBtnList;
+typedef vector<OSDListBtnTypeItem*> OSDListBtnItemList;
class OSDGenericTree : public GenericTree
{
public:
// This class will _not_ delete the image it's given, if any.
- OSDGenericTree(OSDGenericTree *parent, const QString &name,
- const QString &action = "", int check = -1,
- OSDTypeImage *image = NULL, QString group = "");
-
- OSDTypeImage *getImage(void) { return m_image; }
- QString getAction(void) { return m_action; }
- int getCheckable(void) { return m_checkable; }
- QString getGroup(void) { return m_group; }
+ OSDGenericTree(OSDGenericTree *parent, const QString &name,
+ const QString &action = "", int check = -1,
+ OSDTypeImage *image = NULL, QString group = "") :
+ GenericTree(name), m_image(image), m_action(action),
+ m_group(group), m_checkable(check), m_parentButton(NULL)
+ {
+ m_group = (m_group.isEmpty()) ? action : m_group;
+ setSelectable(!action.isEmpty());
+ if (parent)
+ parent->addNode(this);
+ }
+
+ QString getAction(void) const { return m_action; }
+ QString getGroup(void) const { return m_group; }
+ int getCheckable(void) const { return m_checkable; }
+
+ OSDTypeImage *getImage(void) { return m_image; }
+ OSDListBtnTypeItem *getParentButton(void) { return m_parentButton; }
+
void setParentButton(OSDListBtnTypeItem *button)
- { m_parentButton = button; };
- OSDListBtnTypeItem *getParentButton(void) { return m_parentButton; };
+ { m_parentButton = button; }
private:
- OSDTypeImage *m_image;
- QString m_action;
- int m_checkable;
- QString m_group;
+ OSDTypeImage *m_image;
+ QString m_action;
+ QString m_group;
+ int m_checkable;
OSDListBtnTypeItem *m_parentButton;
};
@@ -62,52 +82,48 @@ class OSDListTreeType : public OSDType
{
Q_OBJECT
public:
- OSDListTreeType(const QString &name, const QRect &area,
- const QRect &levelsize, int levelspacing,
- float wmult, float hmult);
+ OSDListTreeType(const QString &name, const QRect &area,
+ const QRect &levelsize, int levelspacing,
+ float wmult, float hmult);
+ ~OSDListTreeType();
- void Reinit(float wchange, float hchange, float wmult, float hmult);
- void SetGroupCheckState(QString group, int newState = 0);
-
- void SetFontActive(TTFFont *font);
- void SetFontInactive(TTFFont *font);
- void SetSpacing(int spacing);
- void SetMargin(int margin);
- void SetItemRegColor(const QColor& beg, const QColor& end, uint alpha);
- void SetItemSelColor(const QColor& beg, const QColor& end, uint alpha);
+ bool IsVisible(void) const { return m_visible; }
+
+ void SetFontActive(TTFFont *font) { m_active = font; }
+ void SetFontInactive(TTFFont *font) { m_inactive = font; }
- void SetAsTree(OSDGenericTree *toplevel);
+ void SetGroupCheckState(QString group, int newState = 0);
+ void SetSpacing(uint spacing)
+ { m_unbiasedspacing = (m_spacing = spacing) / m_wmult; }
+ void SetMargin(uint margin)
+ { m_unbiasedmargin = (m_margin = margin) / m_wmult; }
+ void SetItemRegColor(const QColor& beg, const QColor& end, uint alpha)
+ { m_itemRegBeg = beg; m_itemRegEnd = end; m_itemRegAlpha = alpha; }
+ void SetItemSelColor(const QColor& beg, const QColor& end, uint alpha)
+ { m_itemSelBeg = beg; m_itemSelEnd = end; m_itemSelAlpha = alpha; }
+ void SetVisible(bool visible) { m_visible = visible; }
+ void SetAsTree(OSDGenericTree *toplevel, vector<uint> *select = NULL);
- OSDGenericTree *GetCurrentPosition(void);
-
+ void Reinit(float wmult, float hmult);
bool HandleKeypress(QKeyEvent *e);
-
void Draw(OSDSurface *surface, int fade, int maxfade, int xoff, int yoff);
- bool IsVisible(void) { return m_visible; }
- void SetVisible(bool visible) { m_visible = visible; }
-
signals:
void itemSelected(OSDListTreeType *parent, OSDGenericTree *item);
void itemEntered(OSDListTreeType *parent, OSDGenericTree *item);
private:
- void FillLevelFromTree(OSDGenericTree *item, OSDListBtnType *list);
- OSDListBtnType *GetLevel(int levelnum);
- void SetCurrentPosition(void);
-
- int levels;
- int curlevel;
+ void FillLevelFromTree(OSDGenericTree *item, uint levelnum);
+ OSDListBtnType *GetLevel(uint levelnum);
+ void EnterItem(void);
+ void SelectItem(void);
OSDGenericTree *treetop;
OSDGenericTree *currentpos;
+ TTFFont *m_active;
+ TTFFont *m_inactive;
- QPtrList<OSDListBtnType> listLevels;
-
- OSDListBtnType *currentlevel;
-
- TTFFont *m_active;
- TTFFont *m_inactive;
+ OSDListBtnList listLevels;
QColor m_itemRegBeg;
QColor m_itemRegEnd;
@@ -116,62 +132,76 @@ class OSDListTreeType : public OSDType
uint m_itemRegAlpha;
uint m_itemSelAlpha;
- int m_spacing;
- int m_margin;
-
- QRect m_totalarea;
- QRect m_levelsize;
- int m_levelspacing;
+ uint m_spacing;
+ uint m_margin;
+ int m_levelspacing;
+
+ QRect m_totalarea;
+ QRect m_levelsize;
+
+ float m_unbiasedspacing;
+ float m_unbiasedmargin;
+ QRect m_unbiasedarea;
+ QRect m_unbiasedsize;
- float m_wmult;
- float m_hmult;
+ float m_wmult;
+ float m_hmult;
- bool m_visible;
- bool m_arrowAccel;
+ int m_depth;
+ int m_levelnum;
+ bool m_visible;
+ bool m_arrowAccel;
};
class OSDListBtnType : public OSDType
{
+ friend class OSDListBtnTypeItem;
Q_OBJECT
+
public:
OSDListBtnType(const QString &name, const QRect& area,
float wmult, float hmult,
bool showScrollArrows = false);
~OSDListBtnType();
- void Reinit(float wchange, float hchange, float wmult, float hmult);
- void SetGroupCheckState(QString group, int newState = 0);
+ // General Gets
+ bool IsVisible() const { return m_visible; }
- void SetFontActive(TTFFont *font);
- void SetFontInactive(TTFFont *font);
- void SetSpacing(int spacing);
- void SetMargin(int margin);
- void SetItemRegColor(const QColor& beg, const QColor& end, uint alpha);
- void SetItemSelColor(const QColor& beg, const QColor& end, uint alpha);
-
- void Draw(OSDSurface *surface, int fade, int maxfade, int xoff, int yoff);
-
- void SetActive(bool active);
- void Reset();
+ // General Sets
+ void SetFontActive(TTFFont *font) { m_fontActive = font; }
+ void SetFontInactive(TTFFont *font) { m_fontInactive = font; }
+ void SetSpacing(int spacing) { m_itemSpacing = spacing; }
+ void SetMargin(int margin) { m_itemMargin = margin; }
+ void SetActive(bool active) { m_active = active; }
+ void SetVisible(bool vis) { m_visible = vis; }
+ void SetItemRegColor(const QColor& beg, const QColor& end, uint alpha)
+ { m_itemRegBeg = beg; m_itemRegEnd = end; m_itemRegAlpha = alpha; }
+ void SetItemSelColor(const QColor& beg, const QColor& end, uint alpha)
+ { m_itemSelBeg = beg; m_itemSelEnd = end; m_itemSelAlpha = alpha; }
+ void SetGroupCheckState(QString group, int newState = 0);
+ void SetItemCurrent(const OSDListBtnTypeItem* item);
+ void SetItemCurrent(uint pos);
- void SetItemCurrent(OSDListBtnTypeItem* item);
- void SetItemCurrent(int pos);
- OSDListBtnTypeItem* GetItemCurrent();
- OSDListBtnTypeItem* GetItemFirst();
- OSDListBtnTypeItem* GetItemNext(OSDListBtnTypeItem *item);
+ // Item Gets
+ int GetCount(void) const;
+ int GetItemPos(const OSDListBtnTypeItem* item) const;
+ int GetItemCurrentPos() const;
+ OSDListBtnTypeItem* GetItemCurrent(void);
+ OSDListBtnTypeItem* GetItemFirst(void);
+ OSDListBtnTypeItem* GetItemNext(const OSDListBtnTypeItem *item);
OSDListBtnTypeItem* GetItemAt(int pos);
- int GetItemPos(OSDListBtnTypeItem* item);
- int GetCount();
- void MoveDown();
- void MoveUp();
+ // Item Sets/Commands
+ void MoveDown(void);
+ void MoveUp(void);
- bool IsVisible() { return m_visible; }
- void SetVisible(bool vis) { m_visible = vis; }
+ // General Commands
+ void Draw(OSDSurface *surface, int fade, int maxfade, int xoff, int yoff);
+ void Reinit(float,float) {}
+ void Reset(void);
private:
-
- void Init();
+ void Init(void);
void InitItem(OSDTypeImage &osdImg, uint width, uint height,
QColor beg, QColor end, int alpha);
void LoadPixmap(OSDTypeImage& pix, const QString& fileName);
@@ -179,23 +209,34 @@ class OSDListBtnType : public OSDType
void InsertItem(OSDListBtnTypeItem *item);
void RemoveItem(OSDListBtnTypeItem *item);
- int m_order;
- QRect m_rect;
- QRect m_contentsRect;
- QRect m_arrowsRect;
-
- float m_wmult;
- float m_hmult;
-
- int m_itemHeight;
- int m_itemSpacing;
- int m_itemMargin;
- uint m_itemsVisible;
-
- bool m_active;
- bool m_showScrollArrows;
- bool m_showUpArrow;
- bool m_showDnArrow;
+ private:
+ int m_order;
+ QRect m_rect;
+ QRect m_contentsRect;
+ QRect m_arrowsRect;
+
+ float m_wmult;
+ float m_hmult;
+
+ int m_itemHeight;
+ int m_itemSpacing;
+ int m_itemMargin;
+ uint m_itemsVisible;
+
+ bool m_active;
+ bool m_showScrollArrows;
+ bool m_showUpArrow;
+ bool m_showDnArrow;
+ bool m_initialized;
+ bool m_clearing;
+ bool m_visible;
+
+ QColor m_itemRegBeg;
+ QColor m_itemRegEnd;
+ QColor m_itemSelBeg;
+ QColor m_itemSelEnd;
+ uint m_itemRegAlpha;
+ uint m_itemSelAlpha;
OSDTypeImage m_itemRegPix;
OSDTypeImage m_itemSelActPix;
@@ -209,43 +250,30 @@ class OSDListBtnType : public OSDType
OSDTypeImage m_checkHalfPix;
OSDTypeImage m_checkFullPix;
- QColor m_itemRegBeg;
- QColor m_itemRegEnd;
- QColor m_itemSelBeg;
- QColor m_itemSelEnd;
- uint m_itemRegAlpha;
- uint m_itemSelAlpha;
-
- TTFFont* m_fontActive;
- TTFFont* m_fontInactive;
-
- bool m_initialized;
- bool m_clearing;
+ TTFFont *m_fontActive;
+ TTFFont *m_fontInactive;
- OSDListBtnTypeItem* m_topItem;
- OSDListBtnTypeItem* m_selItem;
- QPtrList<OSDListBtnTypeItem> m_itemList;
+ int m_topIndx;
+ int m_selIndx;
- QMutex m_update;
+ OSDListBtnItemList m_itemList;
- bool m_visible;
+ mutable QMutex m_update;
- friend class OSDListBtnTypeItem;
-
signals:
-
void itemSelected(OSDListBtnTypeItem* item);
};
class OSDListBtnTypeItem
{
+ friend class OSDListBtnType;
public:
-
- enum CheckState {
- NotChecked=0,
+ enum CheckState
+ {
+ NotChecked = 0,
HalfChecked,
- FullChecked
+ FullChecked,
};
OSDListBtnTypeItem(OSDListBtnType* lbtype, const QString& text,
@@ -253,41 +281,36 @@ class OSDListBtnTypeItem
bool showArrow = false, CheckState state = NotChecked);
~OSDListBtnTypeItem();
- OSDListBtnType* parent() const;
- QString text() const;
- const OSDTypeImage* pixmap() const;
- bool checkable() const;
- CheckState state() const;
-
- void setChecked(CheckState state);
- void setData(void *data);
- void* getData();
- void setGroup(QString group) { m_group = group; };
- QString getGroup(void) { return m_group; }
+ OSDListBtnType* parent(void) const { return m_parent; }
+ QString text(void) const { return m_text; }
+ const OSDTypeImage* pixmap(void) const { return m_pixmap; }
+ bool checkable(void) const { return m_checkable; }
+ CheckState state(void) const { return m_state; }
+ QString getGroup(void) const { return m_group; }
+ void *getData(void) { return m_data; }
+
+ void setData(void *data) { m_data = data; }
+ void setGroup(QString grp) { m_group = grp; }
+ void setChecked(CheckState state)
+ { m_state = (m_checkable) ? state : m_state; }
- void Reinit(float wchange, float hchange, float wmult, float hmult);
-
+ void Reinit(float,float) {}
void paint(OSDSurface *surface, TTFFont *font, int fade, int maxfade,
int x, int y);
protected:
-
OSDListBtnType *m_parent;
- QString m_text;
- OSDTypeImage *m_pixmap;
- bool m_checkable;
- CheckState m_state;
- void *m_data;
- QString m_group;
-
- QRect m_checkRect;
- QRect m_pixmapRect;
- QRect m_textRect;
- QRect m_arrowRect;
-
- bool m_showArrow;
-
- friend class OSDListBtnType;
+ OSDTypeImage *m_pixmap;
+ void *m_data;
+ QString m_text;
+ QString m_group;
+ CheckState m_state;
+ bool m_showArrow;
+ bool m_checkable;
+ QRect m_checkRect;
+ QRect m_arrowRect;
+ QRect m_pixmapRect;
+ QRect m_textRect;
};
diff -pruN mythtv-0.19/libs/libmythtv/osdtypes.cpp mythtv/libs/libmythtv/osdtypes.cpp
--- mythtv-0.19/libs/libmythtv/osdtypes.cpp 2005-12-05 16:40:28.000000000 +1000
+++ mythtv/libs/libmythtv/osdtypes.cpp 2006-05-14 01:45:17.000000000 +1000
@@ -14,6 +14,9 @@ using namespace std;
#include "mythcontext.h"
+/// Shared OSD image cache
+OSDImageCache OSDTypeImage::c_cache;
+
OSDSet::OSDSet(const QString &name, bool cache, int screenwidth,
int screenheight, float wmult, float hmult, int frint)
: QObject()
@@ -160,9 +163,6 @@ void OSDSet::Reinit(int screenwidth, int
int displaywidth, int displayheight,
float wmult, float hmult, int frint)
{
- float wchange = wmult / m_wmult;
- float hchange = hmult / m_hmult;
-
m_frameint = frint;
m_screenwidth = screenwidth;
@@ -175,57 +175,12 @@ void OSDSet::Reinit(int screenwidth, int
vector<OSDType *>::iterator iter = allTypes->begin();
for (;iter != allTypes->end(); iter++)
{
- OSDType *type = (*iter);
- if (OSDTypeText *item = dynamic_cast<OSDTypeText*>(type))
- {
- item->Reinit(wchange, hchange);
- }
- else if (OSDTypePositionImage *item =
- dynamic_cast<OSDTypePositionImage*>(type))
- {
- item->Reinit(wchange, hchange, wmult, hmult);
- }
- else if (OSDTypePosSlider *item = dynamic_cast<OSDTypePosSlider*>(type))
- {
- item->Reinit(wchange, hchange, wmult, hmult);
- }
- else if (OSDTypeFillSlider *item =
- dynamic_cast<OSDTypeFillSlider*>(type))
- {
- item->Reinit(wchange, hchange, wmult, hmult);
- }
- else if (OSDTypeEditSlider *item =
- dynamic_cast<OSDTypeEditSlider*>(type))
- {
- item->Reinit(wchange, hchange, wmult, hmult);
- }
- else if (OSDTypeImage *item = dynamic_cast<OSDTypeImage*>(type))
- {
- item->Reinit(wchange, hchange, wmult, hmult);
- }
- else if (OSDTypeBox *item = dynamic_cast<OSDTypeBox*>(type))
- {
- item->Reinit(wchange, hchange);
- }
- else if (OSDTypePositionRectangle *item =
- dynamic_cast<OSDTypePositionRectangle*>(type))
- {
- item->Reinit(wchange, hchange);
- }
- else if (OSDTypeCC *item = dynamic_cast<OSDTypeCC*>(type))
- {
- item->Reinit(xoff, yoff, displaywidth, displayheight);
- }
- else if (OSDListTreeType *item = dynamic_cast<OSDListTreeType*>(type))
- {
- item->Reinit(wchange, hchange, wmult, hmult);
- }
+ if (OSDTypeCC *cc608 = dynamic_cast<OSDTypeCC*>(*iter))
+ cc608->Reinit(xoff, yoff, displaywidth, displayheight,
+ wmult, hmult);
else
- {
- cerr << "Unknown conversion\n";
- }
+ (*iter)->Reinit(wmult, hmult);
}
-
}
OSDType *OSDSet::GetType(const QString &name)
@@ -443,7 +398,8 @@ OSDType::~OSDType()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OSDTypeText::OSDTypeText(const QString &name, TTFFont *font,
- const QString &text, QRect displayrect)
+ const QString &text, QRect displayrect,
+ float wmult, float hmult)
: OSDType(name)
{
m_message = text;
@@ -464,6 +420,12 @@ OSDTypeText::OSDTypeText(const QString &
m_scrollinit = false;
m_linespacing = 1.5;
+
+ m_unbiasedsize =
+ QRect((int)round(m_screensize.x() / wmult),
+ (int)round(m_screensize.y() / hmult),
+ (int)ceil( m_screensize.width() / wmult),
+ (int)ceil( m_screensize.height() / hmult));
}
OSDTypeText::OSDTypeText(const OSDTypeText &other)
@@ -507,14 +469,13 @@ void OSDTypeText::SetDefaultText(const Q
m_scrollinit = false;
}
-void OSDTypeText::Reinit(float wchange, float hchange)
+void OSDTypeText::Reinit(float wmult, float hmult)
{
- int width = (int)(m_screensize.width() * wchange);
- int height = (int)(m_screensize.height() * hchange);
- int x = (int)(m_screensize.x() * wchange);
- int y = (int)(m_screensize.y() * hchange);
-
- m_displaysize = m_screensize = QRect(x, y, width, height);
+ m_displaysize = m_screensize =
+ QRect((int)round(m_unbiasedsize.x() * wmult),
+ (int)round(m_unbiasedsize.y() * hmult),
+ (int)ceil( m_unbiasedsize.width() * wmult),
+ (int)ceil( m_unbiasedsize.height() * hmult));
}
void OSDTypeText::Draw(OSDSurface *surface, int fade, int maxfade, int xoff,
@@ -708,7 +669,7 @@ OSDTypeImage::OSDTypeImage(const QString
m_onlyusefirst = false;
m_filename = filename;
- m_displaypos = displaypos;
+ SetPosition(displaypos, wmult, hmult);
m_yuv = m_alpha = NULL;
m_isvalid = false;
@@ -716,6 +677,7 @@ OSDTypeImage::OSDTypeImage(const QString
m_scalew = scalew;
m_scaleh = scaleh;
+ m_cacheitem = NULL;
LoadImage(filename, wmult, hmult, scalew, scaleh);
}
@@ -733,6 +695,7 @@ OSDTypeImage::OSDTypeImage(const OSDType
m_name = other.m_name;
m_scalew = other.m_scalew;
m_scaleh = other.m_scaleh;
+ m_cacheitem = NULL;
m_alpha = m_yuv = NULL;
if (m_isvalid)
@@ -760,6 +723,8 @@ OSDTypeImage::OSDTypeImage(const QString
m_onlyusefirst = false;
m_displaypos = QPoint(0, 0);
+ m_unbiasedpos = QPoint(0, 0);
+ m_cacheitem = NULL;
m_yuv = NULL;
m_alpha = NULL;
@@ -778,6 +743,8 @@ OSDTypeImage::OSDTypeImage(void)
m_onlyusefirst = false;
m_displaypos = QPoint(0, 0);
+ m_unbiasedpos = QPoint(0, 0);
+ m_cacheitem = NULL;
m_yuv = NULL;
m_alpha = NULL;
@@ -790,10 +757,14 @@ OSDTypeImage::OSDTypeImage(void)
OSDTypeImage::~OSDTypeImage()
{
- if (m_yuv)
- delete [] m_yuv;
- if (m_alpha)
- delete [] m_alpha;
+ // In case we have a cache item in hand, it's safe to delete it,
+ // as it should not be in OSDImageCache anymore and it should have
+ // been written to the file cache for faster access in the future.
+ if (m_cacheitem)
+ {
+ delete m_cacheitem;
+ m_cacheitem = NULL;
+ }
}
void OSDTypeImage::SetName(const QString &name)
@@ -801,13 +772,19 @@ void OSDTypeImage::SetName(const QString
m_name = name;
}
-void OSDTypeImage::Reinit(float wchange, float hchange, float wmult, float hmult)
+void OSDTypeImage::SetPosition(QPoint pos, float wmult, float hmult)
{
- int x = (int)(m_displaypos.x() * wchange);
- int y = (int)(m_displaypos.y() * hchange);
+ m_displaypos = pos;
+ m_unbiasedpos =
+ QPoint((int)round(pos.x() / wmult),
+ (int)round(pos.y() / hmult));
+}
- m_displaypos.setX(x);
- m_displaypos.setY(y);
+void OSDTypeImage::Reinit(float wmult, float hmult)
+{
+ m_displaypos =
+ QPoint((int)round(m_unbiasedpos.x() * wmult),
+ (int)round(m_unbiasedpos.y() * hmult));
LoadImage(m_filename, wmult, hmult, m_scalew, m_scaleh);
}
@@ -815,20 +792,44 @@ void OSDTypeImage::Reinit(float wchange,
void OSDTypeImage::LoadImage(const QString &filename, float wmult, float hmult,
int scalew, int scaleh)
{
- if (m_isvalid)
+ QString ckey;
+
+ if (!filename.isEmpty() && filename.length() >= 2)
{
- if (m_yuv)
- delete [] m_yuv;
- if (m_alpha)
- delete [] m_alpha;
-
- m_isvalid = false;
- m_yuv = NULL;
- m_alpha = NULL;
+ ckey = OSDImageCache::CreateKey(
+ filename, wmult, hmult, scalew, scaleh);
+ }
+ else
+ {
+ // this method requires a backing file
+ return;
}
+
+ // Get the item from the cache so it's not freed while in use
+ OSDImageCacheValue* value = c_cache.Get(ckey, true);
+
+ if (value != NULL)
+ {
+ m_yuv = value->m_yuv;
+ m_ybuffer = value->m_ybuffer;
+ m_ubuffer = value->m_ubuffer;
+ m_vbuffer = value->m_vbuffer;
+ m_alpha = value->m_alpha;
+ m_imagesize = value->m_imagesize;
+ m_isvalid = true;
+
+ // Put the old image back to the cache so it can be reused in the
+ // future, and possibly freed by the cache system if the size limit
+ // is reached
+ if (!m_cacheitem)
+ c_cache.Insert(m_cacheitem);
+ m_cacheitem = value;
- if (filename.length() < 2)
return;
+ }
+
+ // scaled image was not found in cache, have to create it
+
QImage tmpimage(filename);
@@ -867,17 +868,32 @@ void OSDTypeImage::LoadImage(const QStri
imwidth, imheight, tmp2.width());
m_imagesize = QRect(0, 0, imwidth, imheight);
+
+ // put the old image back to the cache so it can be reused in the
+ // future, and possibly freed by the cache system if the size limit
+ // is reached
+ if (m_cacheitem)
+ c_cache.Insert(m_cacheitem);
+
+ m_cacheitem = new OSDImageCacheValue(
+ ckey,
+ m_yuv, m_ybuffer, m_ubuffer,
+ m_vbuffer, m_alpha, m_imagesize);
+
+ // save the new cache item to the file cache
+ if (!filename.isEmpty())
+ c_cache.SaveToDisk(m_cacheitem);
}
void OSDTypeImage::LoadFromQImage(const QImage &img)
{
+ // this method is not cached as it's used mostly for
+ // subtitles which are displayed only once anyways, caching
+ // would probably only slow things down overall
if (m_isvalid)
{
- if (m_yuv)
- delete [] m_yuv;
- if (m_alpha)
- delete [] m_alpha;
-
+ delete m_cacheitem;
+ m_cacheitem = NULL;
m_isvalid = false;
m_yuv = NULL;
m_alpha = NULL;
@@ -1043,23 +1059,25 @@ OSDTypePosSlider::OSDTypePosSlider(const
m_maxval = 1000;
m_curval = 0;
m_displayrect = displayrect;
+ m_unbiasedrect =
+ QRect((int)round(m_displayrect.x() / wmult),
+ (int)round(m_displayrect.y() / hmult),
+ (int)ceil( m_displayrect.width() / wmult),
+ (int)ceil( m_displayrect.height() / hmult));
}
OSDTypePosSlider::~OSDTypePosSlider()
{
}
-void OSDTypePosSlider::Reinit(float wchange, float hchange, float wmult,
- float hmult)
+void OSDTypePosSlider::Reinit(float wmult, float hmult)
{
- int width = (int)(m_displayrect.width() * wchange);
- int height = (int)(m_displayrect.height() * hchange);
- int x = (int)(m_displayrect.x() * wchange);
- int y = (int)(m_displayrect.y() * hchange);
-
- m_displayrect = QRect(x, y, width, height);
-
- OSDTypeImage::Reinit(wchange, hchange, wmult, hmult);
+ m_displayrect =
+ QRect((int)round(m_unbiasedrect.x() * wmult),
+ (int)round(m_unbiasedrect.y() * hmult),
+ (int)ceil( m_unbiasedrect.width() * wmult),
+ (int)ceil( m_unbiasedrect.height() * hmult));
+ OSDTypeImage::Reinit(wmult, hmult);
}
void OSDTypePosSlider::SetPosition(int pos)
@@ -1092,23 +1110,25 @@ OSDTypeFillSlider::OSDTypeFillSlider(con
m_drawwidth = 0;
m_onlyusefirst = true;
m_displayrect = displayrect;
+ m_unbiasedrect =
+ QRect((int)round(m_displayrect.x() / wmult),
+ (int)round(m_displayrect.y() / hmult),
+ (int)ceil( m_displayrect.width() / wmult),
+ (int)ceil( m_displayrect.height() / hmult));
}
OSDTypeFillSlider::~OSDTypeFillSlider()
{
}
-void OSDTypeFillSlider::Reinit(float wchange, float hchange, float wmult,
- float hmult)
+void OSDTypeFillSlider::Reinit(float wmult, float hmult)
{
- int width = (int)(m_displayrect.width() * wchange);
- int height = (int)(m_displayrect.height() * hchange);
- int x = (int)(m_displayrect.x() * wchange);
- int y = (int)(m_displayrect.y() * hchange);
-
- m_displayrect = QRect(x, y, width, height);
-
- OSDTypeImage::Reinit(wchange, hchange, wmult, hmult);
+ m_displayrect =
+ QRect((int)round(m_unbiasedrect.x() * wmult),
+ (int)round(m_unbiasedrect.y() * hmult),
+ (int)ceil( m_unbiasedrect.width() * wmult),
+ (int)ceil( m_unbiasedrect.height() * hmult));
+ OSDTypeImage::Reinit(wmult, hmult);
}
void OSDTypeFillSlider::SetPosition(int pos)
@@ -1143,6 +1163,11 @@ OSDTypeEditSlider::OSDTypeEditSlider(con
m_maxval = 1000;
m_curval = 0;
m_displayrect = displayrect;
+ m_unbiasedrect =
+ QRect((int)round(m_displayrect.x() / wmult),
+ (int)round(m_displayrect.y() / hmult),
+ (int)ceil( m_displayrect.width() / wmult),
+ (int)ceil( m_displayrect.height() / hmult));
m_drawwidth = displayrect.width();
m_drawMap = new unsigned char[m_drawwidth + 1];
@@ -1162,6 +1187,7 @@ OSDTypeEditSlider::OSDTypeEditSlider(con
m_scalew = scalew;
m_scaleh = scaleh;
+ m_cacheitem = NULL;
LoadImage(m_redname, wmult, hmult, scalew, scaleh);
if (m_isvalid)
@@ -1184,22 +1210,16 @@ OSDTypeEditSlider::OSDTypeEditSlider(con
OSDTypeEditSlider::~OSDTypeEditSlider()
{
delete [] m_drawMap;
-
- if (m_ryuv)
- delete [] m_ryuv;
- if (m_ralpha)
- delete [] m_ralpha;
}
-void OSDTypeEditSlider::Reinit(float wchange, float hchange, float wmult,
- float hmult)
+void OSDTypeEditSlider::Reinit(float wmult, float hmult)
{
- int width = (int)(m_displayrect.width() * wchange);
- int height = (int)(m_displayrect.height() * hchange);
- int x = (int)(m_displayrect.x() * wchange);
- int y = (int)(m_displayrect.y() * hchange);
+ m_displayrect =
+ QRect((int)round(m_unbiasedrect.x() * wmult),
+ (int)round(m_unbiasedrect.y() * hmult),
+ (int)ceil( m_unbiasedrect.width() * wmult),
+ (int)ceil( m_unbiasedrect.height() * hmult));
- m_displayrect = QRect(x, y, width, height);
m_drawwidth = m_displayrect.width();
delete [] m_drawMap;
@@ -1210,11 +1230,6 @@ void OSDTypeEditSlider::Reinit(float wch
m_displaypos = m_displayrect.topLeft();
- if (m_ryuv)
- delete [] m_ryuv;
- if (m_ralpha)
- delete [] m_ralpha;
-
LoadImage(m_redname, wmult, hmult, m_scalew, m_scaleh);
if (m_isvalid)
{
@@ -1360,30 +1375,46 @@ void OSDTypeEditSlider::Draw(OSDSurface
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSDTypeBox::OSDTypeBox(const QString &name, QRect displayrect)
- : OSDType(name)
+OSDTypeBox::OSDTypeBox(const QString &name, QRect displayrect,
+ float wmult, float hmult)
+ : OSDType(name)
{
size = displayrect;
+ m_unbiasedsize =
+ QRect((int)round(size.x() / wmult),
+ (int)round(size.y() / hmult),
+ (int)ceil( size.width() / wmult),
+ (int)ceil( size.height() / hmult));
+}
+
+void OSDTypeBox::SetRect(QRect newrect, float wmult, float hmult)
+{
+ size = newrect;
+ m_unbiasedsize =
+ QRect((int)round(size.x() / wmult),
+ (int)round(size.y() / hmult),
+ (int)ceil( size.width() / wmult),
+ (int)ceil( size.height() / hmult));
}
OSDTypeBox::OSDTypeBox(const OSDTypeBox &other)
: OSDType(other.m_name)
{
size = other.size;
+ m_unbiasedsize = other.m_unbiasedsize;
}
OSDTypeBox::~OSDTypeBox()
{
}
-void OSDTypeBox::Reinit(float wchange, float hchange)
+void OSDTypeBox::Reinit(float wmult, float hmult)
{
- int width = (int)(size.width() * wchange);
- int height = (int)(size.height() * hchange);
- int x = (int)(size.x() * wchange);
- int y = (int)(size.y() * hchange);
-
- size = QRect(x, y, width, height);
+ size =
+ QRect((int)round(m_unbiasedsize.x() * wmult),
+ (int)round(m_unbiasedsize.y() * hmult),
+ (int)ceil( m_unbiasedsize.width() * wmult),
+ (int)ceil( m_unbiasedsize.height() * hmult));
}
void OSDTypeBox::Draw(OSDSurface *surface, int fade, int maxfade, int xoff,
@@ -1498,44 +1529,52 @@ OSDTypePositionRectangle::OSDTypePositio
}
OSDTypePositionRectangle::OSDTypePositionRectangle(
- const OSDTypePositionRectangle &other)
- : OSDType(other.m_name), OSDTypePositionIndicator(other)
+ const OSDTypePositionRectangle &other)
+ : OSDType(other.m_name), OSDTypePositionIndicator(other)
{
for (int i = 0; i < m_numpositions; i++)
{
QRect tmp = other.positions[i];
positions.push_back(tmp);
}
+ for (int i = 0; i < m_numpositions; i++)
+ {
+ QRect tmp = other.unbiasedpos[i];
+ unbiasedpos.push_back(tmp);
+ }
}
OSDTypePositionRectangle::~OSDTypePositionRectangle()
{
}
-void OSDTypePositionRectangle::Reinit(float wchange, float hchange)
+void OSDTypePositionRectangle::Reinit(float wmult, float hmult)
{
for (int i = 0; i < m_numpositions; i++)
{
- QRect tmp = positions[i];
-
- int width = (int)(tmp.width() * wchange);
- int height = (int)(tmp.height() * hchange);
- int x = (int)(tmp.x() * wchange);
- int y = (int)(tmp.y() * hchange);
-
- tmp = QRect(x, y, width, height);
- positions[i] = tmp;
+ QRect tmp = unbiasedpos[i];
+ positions[i] =
+ QRect((int)round(tmp.x() * wmult),
+ (int)round(tmp.y() * hmult),
+ (int)ceil( tmp.width() * wmult),
+ (int)ceil( tmp.height() * hmult));
}
}
-void OSDTypePositionRectangle::AddPosition(QRect rect)
+void OSDTypePositionRectangle::AddPosition(
+ QRect rect, float wmult, float hmult)
{
positions.push_back(rect);
+ unbiasedpos.push_back(
+ QRect((int)round(rect.x() / wmult),
+ (int)round(rect.y() / hmult),
+ (int)ceil( rect.width() / wmult),
+ (int)ceil( rect.height() / hmult)));
m_numpositions++;
}
-void OSDTypePositionRectangle::Draw(OSDSurface *surface, int fade, int maxfade,
- int xoff, int yoff)
+void OSDTypePositionRectangle::Draw(
+ OSDSurface *surface, int fade, int maxfade, int xoff, int yoff)
{
fade = fade;
maxfade = maxfade;
@@ -1618,17 +1657,21 @@ void OSDTypePositionRectangle::Draw(OSDS
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OSDTypePositionImage::OSDTypePositionImage(const QString &name)
- : OSDTypeImage(name), OSDTypePositionIndicator()
+ : OSDTypeImage(name), OSDTypePositionIndicator(),
+ m_wmult(0.0f), m_hmult(0.0f)
{
}
OSDTypePositionImage::OSDTypePositionImage(const OSDTypePositionImage &other)
: OSDTypeImage(other), OSDTypePositionIndicator(other)
{
+ m_wmult = other.m_wmult;
+ m_hmult = other.m_hmult;
+
for (int i = 0; i < m_numpositions; i++)
{
- QPoint tmp = other.positions[i];
- positions.push_back(tmp);
+ positions.push_back(other.positions[i]);
+ unbiasedpos.push_back(other.unbiasedpos[i]);
}
}
@@ -1636,45 +1679,61 @@ OSDTypePositionImage::~OSDTypePositionIm
{
}
-void OSDTypePositionImage::Reinit(float wchange, float hchange, float wmult,
- float hmult)
+void OSDTypePositionImage::Reinit(float wmult, float hmult)
{
- OSDTypeImage::Reinit(wchange, hchange, wmult, hmult);
+ m_wmult = wmult;
+ m_hmult = hmult;
+
+ OSDTypeImage::Reinit(wmult, hmult);
for (int i = 0; i < m_numpositions; i++)
{
- QPoint tmp = positions[i];
-
- int x = (int)(tmp.x() * wchange);
- int y = (int)(tmp.y() * hchange);
-
- positions[i].setX(x);
- positions[i].setY(y);
+ positions[i] =
+ QPoint((int)round(unbiasedpos[i].x() * wmult),
+ (int)round(unbiasedpos[i].y() * hmult));
}
}
-void OSDTypePositionImage::AddPosition(QPoint pos)
+void OSDTypePositionImage::AddPosition(QPoint pos, float wmult, float hmult)
{
+ if (m_wmult == 0.0f || m_hmult == 0.0f)
+ {
+ m_wmult = wmult;
+ m_hmult = hmult;
+ }
positions.push_back(pos);
+ unbiasedpos.push_back(
+ QPoint((int)round(pos.x() / wmult),
+ (int)round(pos.y() / hmult)));
+
+ VERBOSE(VB_IMPORTANT,
+ "OSDTypePositionImage::AddPosition["<<m_numpositions<<"]("
+ <<pos.x()<<"x"<<pos.y()
+ <<" "<<wmult<<", "<<hmult<<")");
+
m_numpositions++;
}
void OSDTypePositionImage::Draw(OSDSurface *surface, int fade, int maxfade,
int xoff, int yoff)
{
+ VERBOSE(VB_IMPORTANT,
+ "OSDTypePositionImage::Draw["<<m_curposition<<"]("
+ <<m_wmult<<", "<<m_hmult<<")");
+
if (m_curposition < 0 || m_curposition >= m_numpositions)
return;
QPoint pos = positions[m_curposition];
- OSDTypeImage::SetPosition(pos);
+ OSDTypeImage::SetPosition(pos, m_wmult, m_hmult);
OSDTypeImage::Draw(surface, fade, maxfade, xoff, yoff);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OSDTypeCC::OSDTypeCC(const QString &name, TTFFont *font, int xoff, int yoff,
- int dispw, int disph)
+ int dispw, int disph, float wmult, float hmult)
: OSDType(name)
{
m_font = font;
@@ -1683,9 +1742,11 @@ OSDTypeCC::OSDTypeCC(const QString &name
yoffset = yoff;
displaywidth = dispw;
displayheight = disph;
+ m_wmult = wmult;
+ m_hmult = hmult;
QRect rect = QRect(0, 0, 0, 0);
- m_box = new OSDTypeBox("cc_background", rect);
+ m_box = new OSDTypeBox("cc_background", rect, wmult, hmult);
m_ccbackground = gContext->GetNumSetting("CCBackground", 0);
}
@@ -1695,12 +1756,23 @@ OSDTypeCC::~OSDTypeCC()
delete m_box;
}
-void OSDTypeCC::Reinit(int x, int y, int dispw, int disph)
+void OSDTypeCC::Reinit(float wmult, float hmult)
+{
+ (void) wmult;
+ (void) hmult;
+ VERBOSE(VB_IMPORTANT, "Programmer error: "
+ "Call to OSDTypeCC::Reinit(float,float)");
+}
+
+void OSDTypeCC::Reinit(int x, int y, int dispw, int disph,
+ float wmult, float hmult)
{
xoffset = x;
yoffset = y;
displaywidth = dispw;
displayheight = disph;
+ m_wmult = wmult;
+ m_hmult = hmult;
}
void OSDTypeCC::AddCCText(const QString &text, int x, int y, int color,
@@ -1875,7 +1947,7 @@ void OSDTypeCC::Draw(OSDSurface *surface
{
QRect rect = QRect(0, 0, textlength + 4,
(m_font->Size() * 3 / 2) + 3);
- m_box->SetRect(rect);
+ m_box->SetRect(rect, m_wmult, m_hmult);
m_box->Draw(surface, 0, 0, x - 2, y - 2);
}
diff -pruN mythtv-0.19/libs/libmythtv/osdtypes.h mythtv/libs/libmythtv/osdtypes.h
--- mythtv-0.19/libs/libmythtv/osdtypes.h 2005-12-05 16:40:28.000000000 +1000
+++ mythtv/libs/libmythtv/osdtypes.h 2006-05-10 09:54:43.000000000 +1000
@@ -8,6 +8,7 @@
#include <vector>
#include <qobject.h>
#include <qregexp.h>
+#include "osdimagecache.h"
using namespace std;
@@ -137,6 +138,8 @@ class OSDType : public QObject
QString Name() { return m_name; }
+ virtual void Reinit(float wmult, float hmult) = 0;
+
virtual void Draw(OSDSurface *surface, int fade, int maxfade, int xoff,
int yoff) = 0;
@@ -150,11 +153,11 @@ class OSDTypeText : public OSDType
{
public:
OSDTypeText(const QString &name, TTFFont *font, const QString &text,
- QRect displayrect);
+ QRect displayrect, float wmult, float hmult);
OSDTypeText(const OSDTypeText &text);
~OSDTypeText();
- void Reinit(float wchange, float hchange);
+ void Reinit(float wmult, float hmult);
void SetAltFont(TTFFont *font);
void SetUseAlt(bool usealt) { m_usingalt = usealt; }
@@ -190,6 +193,7 @@ class OSDTypeText : public OSDType
QRect m_displaysize;
QRect m_screensize;
+ QRect m_unbiasedsize;
QString m_message;
QString m_default_msg;
@@ -231,7 +235,7 @@ class OSDTypeImage : public OSDType
virtual ~OSDTypeImage();
void SetName(const QString &name);
- void Reinit(float wchange, float hchange, float wmult, float hmult);
+ void Reinit(float wmult, float hmult);
void LoadImage(const QString &filename, float wmult, float hmult,
int scalew = -1, int scaleh = -1);
@@ -239,14 +243,12 @@ class OSDTypeImage : public OSDType
void SetStaticSize(int scalew, int scaleh) { m_scalew = scalew;
m_scaleh = scaleh; }
+ void SetPosition(QPoint pos, float wmult, float hmult);
- QPoint DisplayPos() { return m_displaypos; }
- void SetPosition(QPoint pos) { m_displaypos = pos; }
-
- QRect ImageSize() { return m_imagesize; }
-
- int width() { return m_imagesize.width(); }
- int height() { return m_imagesize.height(); }
+ QPoint DisplayPos() const { return m_displaypos; }
+ QRect ImageSize() const { return m_imagesize; }
+ int width() const { return m_imagesize.width(); }
+ int height() const { return m_imagesize.height(); }
virtual void Draw(OSDSurface *surface, int fade, int maxfade, int xoff,
int yoff);
@@ -254,6 +256,7 @@ class OSDTypeImage : public OSDType
protected:
QRect m_imagesize;
QPoint m_displaypos;
+ QPoint m_unbiasedpos;
QString m_filename;
@@ -270,6 +273,9 @@ class OSDTypeImage : public OSDType
int m_drawwidth;
bool m_onlyusefirst;
+
+ static OSDImageCache c_cache;
+ OSDImageCacheValue *m_cacheitem;
};
class OSDTypePosSlider : public OSDTypeImage
@@ -280,7 +286,7 @@ class OSDTypePosSlider : public OSDTypeI
int scalew = -1, int scaleh = -1);
~OSDTypePosSlider();
- void Reinit(float wchange, float hchange, float wmult, float hmult);
+ void Reinit(float wmult, float hmult);
void SetRectangle(QRect rect) { m_displayrect = rect; }
QRect ImageSize() { return m_imagesize; }
@@ -290,6 +296,7 @@ class OSDTypePosSlider : public OSDTypeI
private:
QRect m_displayrect;
+ QRect m_unbiasedrect;
int m_maxval;
int m_curval;
};
@@ -302,7 +309,7 @@ class OSDTypeFillSlider : public OSDType
int scalew = -1, int scaleh = -1);
~OSDTypeFillSlider();
- void Reinit(float wchange, float hchange, float wmult, float hmult);
+ void Reinit(float wmult, float hmult);
void SetRectangle(QRect rect) { m_displayrect = rect; }
QRect ImageSize() { return m_imagesize; }
@@ -314,6 +321,7 @@ class OSDTypeFillSlider : public OSDType
private:
QRect m_displayrect;
+ QRect m_unbiasedrect;
int m_maxval;
int m_curval;
};
@@ -327,7 +335,7 @@ class OSDTypeEditSlider : public OSDType
int scalew = -1, int scaleh = -1);
~OSDTypeEditSlider();
- void Reinit(float wchange, float hchange, float wmult, float hmult);
+ void Reinit(float wmult, float hmult);
void SetRectangle(QRect rect) { m_displayrect = rect; }
QRect ImageSize() { return m_imagesize; }
@@ -339,6 +347,7 @@ class OSDTypeEditSlider : public OSDType
private:
QRect m_displayrect;
+ QRect m_unbiasedrect;
int m_maxval;
int m_curval;
@@ -360,17 +369,19 @@ class OSDTypeEditSlider : public OSDType
class OSDTypeBox : public OSDType
{
public:
- OSDTypeBox(const QString &name, QRect displayrect);
+ OSDTypeBox(const QString &name, QRect displayrect,
+ float wmult, float hmult);
OSDTypeBox(const OSDTypeBox &other);
~OSDTypeBox();
- void Reinit(float wchange, float hchange);
- void SetRect(QRect newrect) { size = newrect; }
+ void Reinit(float wmult, float hmult);
+ void SetRect(QRect newrect, float wmult, float hmult);
void Draw(OSDSurface *surface, int fade, int maxfade, int xoff, int yoff);
private:
QRect size;
+ QRect m_unbiasedsize;
};
class OSDTypePositionIndicator
@@ -403,14 +414,15 @@ class OSDTypePositionRectangle : public
OSDTypePositionRectangle(const OSDTypePositionRectangle &other);
~OSDTypePositionRectangle();
- void AddPosition(QRect rect);
+ void AddPosition(QRect rect, float wmult, float hmult);
- void Reinit(float wchange, float hchange);
+ void Reinit(float wmult, float hmult);
void Draw(OSDSurface *surface, int fade, int maxfade, int xoff, int yoff);
private:
- vector<QRect> positions;
+ vector<QRect> positions;
+ vector<QRect> unbiasedpos;
};
class OSDTypePositionImage : public virtual OSDTypeImage,
@@ -421,14 +433,17 @@ class OSDTypePositionImage : public virt
OSDTypePositionImage(const OSDTypePositionImage &other);
~OSDTypePositionImage();
- void Reinit(float wchange, float hchange, float wmult, float hmult);
+ void Reinit(float wmult, float hmult);
- void AddPosition(QPoint pos);
+ void AddPosition(QPoint pos, float wmult, float hmult);
void Draw(OSDSurface *surface, int fade, int maxfade, int xoff, int yoff);
private:
vector<QPoint> positions;
+ vector<QPoint> unbiasedpos;
+ float m_wmult;
+ float m_hmult;
};
class ccText
@@ -445,10 +460,14 @@ class OSDTypeCC : public OSDType
{
public:
OSDTypeCC(const QString &name, TTFFont *font, int xoff, int yoff,
- int dispw, int disph);
+ int dispw, int disph, float wmult, float hmult);
~OSDTypeCC();
- void Reinit(int xoff, int yoff, int dispw, int disph);
+ void Reinit(float wmult, float hmult);
+
+ void Reinit(int xoff, int yoff,
+ int dispw, int disph,
+ float wmult, float hmult);
void AddCCText(const QString &text, int x, int y, int color,
bool teletextmode = false);
@@ -464,7 +483,7 @@ class OSDTypeCC : public OSDType
vector<ccText *> *m_textlist;
OSDTypeBox *m_box;
int m_ccbackground;
-
+ float m_wmult, m_hmult;
int xoffset, yoffset, displaywidth, displayheight;
};
diff -pruN mythtv-0.19/libs/libmythtv/pchdtvsignalmonitor.cpp mythtv/libs/libmythtv/pchdtvsignalmonitor.cpp
--- mythtv-0.19/libs/libmythtv/pchdtvsignalmonitor.cpp 2006-02-08 07:56:06.000000000 +1000
+++ mythtv/libs/libmythtv/pchdtvsignalmonitor.cpp 2006-04-20 23:46:13.000000000 +1000
@@ -108,8 +108,8 @@ void pcHDTVSignalMonitor::RunTableMonito
len += remainder;
remainder = GetStreamData()->ProcessData(buffer, len);
- if (remainder > 0) // leftover bytes
- memmove(buffer, &(buffer[buffer_size - remainder]), remainder);
+ if (remainder > 0 && (len > remainder)) // leftover bytes
+ memmove(buffer, &(buffer[len - remainder]), remainder);
}
DBG_SM("RunTableMonitor()", "end");
}
diff -pruN mythtv-0.19/libs/libmythtv/RingBuffer.cpp mythtv/libs/libmythtv/RingBuffer.cpp
--- mythtv-0.19/libs/libmythtv/RingBuffer.cpp 2006-02-08 07:56:06.000000000 +1000
+++ mythtv/libs/libmythtv/RingBuffer.cpp 2006-04-13 11:22:30.000000000 +1000
@@ -145,6 +145,12 @@ void RingBuffer::OpenFile(const QString
VERBOSE(VB_PLAYBACK, LOC + QString("OpenFile(%1, %1)")
.arg(lfilename).arg(retryCount));
+ if ((filename.right(4).lower() == ".png") ||
+ (filename.right(4).lower() == ".gif"))
+ {
+ retryCount = 0;
+ }
+
uint openAttempts = retryCount + 1;
filename = lfilename;
@@ -162,6 +168,7 @@ void RingBuffer::OpenFile(const QString
bool is_local = false;
bool is_dvd = false;
+
if ((filename.left(7) == "myth://") &&
(filename.length() > 7 ))
{
@@ -271,6 +278,11 @@ void RingBuffer::OpenFile(const QString
remotefile = NULL;
}
}
+
+ setswitchtonext = false;
+ ateof = false;
+ commserror = false;
+ numfailures = 0;
}
/** \fn RingBuffer::IsOpen(void) const
@@ -727,7 +739,7 @@ void RingBuffer::ReadAheadThread(void)
loops = 0;
pthread_rwlock_rdlock(&rwlock);
- if (totfree > readblocksize && !commserror)
+ if (totfree > readblocksize && !commserror && !ateof && !setswitchtonext)
{
// limit the read size
totfree = readblocksize;
@@ -737,6 +749,9 @@ void RingBuffer::ReadAheadThread(void)
if (remotefile)
{
+ if (livetvchain && livetvchain->HasNext())
+ remotefile->SetTimeout(true);
+
ret = safe_read(remotefile, readAheadBuffer + rbwpos,
totfree);
internalreadpos += ret;
@@ -785,8 +800,16 @@ void RingBuffer::ReadAheadThread(void)
totfree = 0;
}
- if (!readsallowed && used >= fill_min)
+ if (!readsallowed && (used >= fill_min || setswitchtonext))
+ {
readsallowed = true;
+ VERBOSE(VB_PLAYBACK, QString("reads allowed (%1 %2)").arg(used)
+ .arg(fill_min));
+ }
+ else if (!readsallowed)
+ VERBOSE(VB_PLAYBACK, QString("buffering (%1 %2 %3)").arg(used)
+ .arg(fill_min)
+ .arg(ret));
if (readsallowed && used < fill_min && !ateof && !setswitchtonext)
{
@@ -808,8 +831,11 @@ void RingBuffer::ReadAheadThread(void)
pthread_rwlock_unlock(&rwlock);
- if ((used >= fill_threshold || wantseek) && !pausereadthread)
+ if ((used >= fill_threshold || wantseek || ateof || setswitchtonext) &&
+ !pausereadthread)
+ {
usleep(500);
+ }
}
delete [] readAheadBuffer;
@@ -853,15 +879,15 @@ int RingBuffer::ReadFromBuf(void *buf, i
VERBOSE(VB_IMPORTANT,
LOC + "Taking too long to be allowed to read..");
readErr++;
-
+
// HACK Sometimes the readhead thread gets borked on startup.
- /* if ((readErr % 2) && (rbrpos ==0))
+ if ((readErr > 2 && readErr % 2) && (rbrpos ==0))
{
VERBOSE(VB_IMPORTANT, "restarting readhead thread..");
KillReadAheadThread();
StartupReadAheadThread();
}
- */
+
if (readErr > 10)
{
VERBOSE(VB_IMPORTANT, LOC_ERR + "Took more than "
@@ -895,6 +921,12 @@ int RingBuffer::ReadFromBuf(void *buf, i
VERBOSE(VB_IMPORTANT, LOC + "Waited " +
QString("%1").arg(elapsed/1000) +
" seconds for data to become available...");
+ if (livetvchain)
+ {
+ VERBOSE(VB_IMPORTANT, "Checking to see if there's a "
+ "new livetv program to switch to..");
+ livetvchain->ReloadAll();
+ }
}
bool quit = livetvchain && (livetvchain->NeedsToSwitch() ||
@@ -923,7 +955,7 @@ int RingBuffer::ReadFromBuf(void *buf, i
availWaitMutex.unlock();
avail = ReadBufAvail();
- if (ateof && avail < count)
+ if ((ateof || setswitchtonext) && avail < count)
count = avail;
if (commserror)
diff -pruN mythtv-0.19/libs/libmythtv/RingBuffer.h mythtv/libs/libmythtv/RingBuffer.h
--- mythtv-0.19/libs/libmythtv/RingBuffer.h 2006-02-07 14:31:49.000000000 +1000
+++ mythtv/libs/libmythtv/RingBuffer.h 2006-02-23 17:54:05.000000000 +1000
@@ -91,6 +91,7 @@ class RingBuffer
long long GetTotalReadPosition(void);
long long SetAdjustFilesize(void);
+ void SetTimeout(bool fast) { oldfile = fast; }
protected:
static void *StartReader(void *type);
diff -pruN mythtv-0.19/libs/libmythtv/scanwizard.cpp mythtv/libs/libmythtv/scanwizard.cpp
--- mythtv-0.19/libs/libmythtv/scanwizard.cpp 2005-12-17 05:58:46.000000000 +1000
+++ mythtv/libs/libmythtv/scanwizard.cpp 2006-04-26 05:50:59.000000000 +1000
@@ -1,5 +1,5 @@
/*
- * $Id: scanwizard.cpp 8292 2005-12-16 19:58:46Z danielk $
+ * $Id: scanwizard.cpp 9799 2006-04-25 19:50:59Z danielk $
* vim: set expandtab tabstop=4 shiftwidth=4:
*
* Original Project
@@ -518,7 +518,9 @@ void ScanWizardScanner::scan()
"SELECT dvb_diseqc_type, diseqc_port, diseqc_pos, "
" lnb_lof_switch, lnb_lof_hi, lnb_lof_lo "
"FROM cardinput, capturecard "
- "WHERE capturecard.cardid=%1 and cardinput.sourceid=%2")
+ "WHERE capturecard.cardid = %1 AND "
+ " cardinput.sourceid = %2 AND "
+ " capturecard.cardid = cardinput.cardid")
.arg(parent->captureCard()).arg(nVideoSource));
if (query.exec() && query.isActive() && query.size() > 0)
diff -pruN mythtv-0.19/libs/libmythtv/scanwizardhelpers.h mythtv/libs/libmythtv/scanwizardhelpers.h
--- mythtv-0.19/libs/libmythtv/scanwizardhelpers.h 2006-02-02 02:56:06.000000000 +1000
+++ mythtv/libs/libmythtv/scanwizardhelpers.h 2006-04-13 00:21:41.000000000 +1000
@@ -1,5 +1,5 @@
/* -*- Mode: c++ -*-
- * $Id: scanwizardhelpers.h 8817 2006-02-01 16:56:06Z danielk $
+ * $Id: scanwizardhelpers.h 9685 2006-04-12 14:21:41Z danielk $
* vim: set expandtab tabstop=4 shiftwidth=4:
*
* Original Project
@@ -272,11 +272,13 @@ class ScanFrequencyTable: public ComboBo
public:
ScanFrequencyTable()
{
- addSelection(QObject::tr("Broadcast"), "us", true);
- addSelection(QObject::tr("Cable") +" 78+", "uscablehigh", false);
- addSelection(QObject::tr("Cable HRC")+" 78+", "uscablehrchigh",false);
- addSelection(QObject::tr("Cable"), "uscable", false);
- addSelection(QObject::tr("Cable HRC"), "ushrc", false);
+ addSelection(QObject::tr("Broadcast"), "us", true);
+ addSelection(QObject::tr("Cable") +" 78+", "uscablehigh", false);
+ addSelection(QObject::tr("Cable HRC")+" 67+", "ushrchigh", false);
+ addSelection(QObject::tr("Cable IRC")+" 67+", "usirchigh", false);
+ addSelection(QObject::tr("Cable"), "uscable", false);
+ addSelection(QObject::tr("Cable HRC"), "ushrc", false);
+ addSelection(QObject::tr("Cable IRC"), "usirc", false);
setLabel(QObject::tr("Frequency Table"));
setHelpText(QObject::tr("Frequency table to use.") + " " +
diff -pruN mythtv-0.19/libs/libmythtv/tv_play.cpp mythtv/libs/libmythtv/tv_play.cpp
--- mythtv-0.19/libs/libmythtv/tv_play.cpp 2006-02-08 07:56:06.000000000 +1000
+++ mythtv/libs/libmythtv/tv_play.cpp 2006-04-22 07:08:11.000000000 +1000
@@ -247,7 +247,7 @@ TV::TV(void)
browsechannum(""), browsechanid(""), browsestarttime(""),
// Program Info for currently playing video
recorderPlaybackInfo(NULL),
- playbackinfo(NULL), inputFilename(""), playbackLen(0),
+ playbackinfo(NULL), playbackLen(0),
lastProgram(NULL), jumpToProgram(false),
// Video Players
nvp(NULL), pipnvp(NULL), activenvp(NULL),
@@ -578,19 +578,7 @@ bool TV::RequestNextRecorder(bool showDi
if (!testrec->IsValidRecorder())
{
if (showDialogs)
- {
- QString title = tr("MythTV is already using all available "
- "inputs for recording. If you want to "
- "watch an in-progress recording, select one "
- "from the playback menu. If you want to "
- "watch live TV, cancel one of the "
- "in-progress recordings from the delete "
- "menu.");
-
- DialogBox diag(gContext->GetMainWindow(), title);
- diag.AddButton(tr("Cancel and go back to the TV menu"));
- diag.exec();
- }
+ ShowNoRecorderDialog();
delete testrec;
@@ -659,8 +647,6 @@ int TV::Playback(ProgramInfo *rcinfo)
if (internalState != kState_None)
return 0;
- inputFilename = rcinfo->pathname;
-
playbackLen = rcinfo->CalculateLength();
playbackinfo = new ProgramInfo(*rcinfo);
@@ -844,9 +830,10 @@ void TV::HandleStateChange(void)
}
else
{
- tvchain->SetProgram(playbackinfo);
+ QString playbackURL = playbackinfo->GetPlaybackURL();
- prbuffer = new RingBuffer(playbackinfo->pathname, false);
+ tvchain->SetProgram(playbackinfo);
+ prbuffer = new RingBuffer(playbackURL, false);
prbuffer->SetLiveMode(tvchain);
}
@@ -895,7 +882,14 @@ void TV::HandleStateChange(void)
else if (TRANSITION(kState_None, kState_WatchingPreRecorded) ||
TRANSITION(kState_None, kState_WatchingRecording))
{
- prbuffer = new RingBuffer(inputFilename, false);
+ QString playbackURL;
+ if ((playbackinfo->pathname.left(4) == "dvd:") ||
+ (playbackinfo->isVideo))
+ playbackURL = playbackinfo->pathname;
+ else
+ playbackURL = playbackinfo->GetPlaybackURL();
+
+ prbuffer = new RingBuffer(playbackURL, false);
if (prbuffer->IsOpen())
{
gContext->DisableScreensaver();
@@ -924,7 +918,7 @@ void TV::HandleStateChange(void)
{
QString message = "COMMFLAG_REQUEST ";
message += playbackinfo->chanid + " " +
- playbackinfo->startts.toString(Qt::ISODate);
+ playbackinfo->recstartts.toString(Qt::ISODate);
RemoteSendMessage(message);
}
}
@@ -1222,10 +1216,10 @@ void TV::SetupPlayer(bool isWatchingReco
nvp->SetParentPlayer(this);
nvp->SetRingBuffer(prbuffer);
nvp->SetRecorder(recorder);
- nvp->SetAudioSampleRate(gContext->GetNumSetting("AudioSampleRate"));
+ nvp->SetAudioSampleRate(gContext->GetNumSetting("AudioSampleRate", 44100));
nvp->SetAudioDevice(gContext->GetSetting("AudioOutputDevice"));
nvp->SetLength(playbackLen);
- nvp->SetExactSeeks(gContext->GetNumSetting("ExactSeeking"));
+ nvp->SetExactSeeks(gContext->GetNumSetting("ExactSeeking", 0));
nvp->SetAutoCommercialSkip(autoCommercialSkip);
nvp->SetLiveTVChain(tvchain);
@@ -1296,9 +1290,9 @@ void TV::SetupPipPlayer(void)
pipnvp->SetAsPIP();
pipnvp->SetRingBuffer(piprbuffer);
pipnvp->SetRecorder(piprecorder);
- pipnvp->SetAudioSampleRate(gContext->GetNumSetting("AudioSampleRate"));
+ pipnvp->SetAudioSampleRate(gContext->GetNumSetting("AudioSampleRate", 44100));
pipnvp->SetAudioDevice(gContext->GetSetting("AudioOutputDevice"));
- pipnvp->SetExactSeeks(gContext->GetNumSetting("ExactSeeking"));
+ pipnvp->SetExactSeeks(gContext->GetNumSetting("ExactSeeking", 0));
pipnvp->SetLiveTVChain(piptvchain);
pipnvp->SetLength(playbackLen);
@@ -1454,6 +1448,30 @@ void TV::RunTV(void)
lastSignalMsg.clear();
}
UpdateOSDTimeoutMessage();
+
+ if (!tvchainUpdate.isEmpty())
+ {
+ tvchainUpdateLock.lock();
+ for (QStringList::Iterator it = tvchainUpdate.begin();
+ it != tvchainUpdate.end(); ++it)
+ {
+ if (tvchain && nvp && *it == tvchain->GetID())
+ {
+ tvchain->ReloadAll();
+ if (nvp->GetTVChain())
+ nvp->CheckTVChain();
+ }
+ if (piptvchain && pipnvp && *it == piptvchain->GetID())
+ {
+ piptvchain->ReloadAll();
+ if (pipnvp->GetTVChain())
+ pipnvp->CheckTVChain();
+ }
+ }
+ tvchainUpdate.clear();
+ tvchainUpdateLock.unlock();
+ }
+
osdlock.unlock();
}
@@ -2743,7 +2761,7 @@ void TV::processNetworkControlCommand(QS
speedStr = QString("%1X").arg(normal_speed);
struct StatusPosInfo posInfo;
- nvp->calcSliderPos(posInfo);
+ nvp->calcSliderPos(posInfo, true);
QDateTime respDate = mythCurrentDateTime();
QString infoStr = "";
@@ -2806,8 +2824,10 @@ void TV::TogglePIPView(void)
}
else
{
+ QString playbackURL = playbackinfo->GetPlaybackURL();
+
piptvchain->SetProgram(playbackinfo);
- piprbuffer = new RingBuffer(playbackinfo->pathname, false);
+ piprbuffer = new RingBuffer(playbackURL, false);
piprbuffer->SetLiveMode(piptvchain);
}
@@ -3472,8 +3492,10 @@ void TV::SwitchCards(uint chanid, QStrin
}
else
{
+ QString playbackURL = playbackinfo->GetPlaybackURL();
+
tvchain->SetProgram(playbackinfo);
- prbuffer = new RingBuffer(playbackinfo->pathname, false);
+ prbuffer = new RingBuffer(playbackURL, false);
prbuffer->SetLiveMode(tvchain);
}
@@ -4627,7 +4649,8 @@ void TV::ChangeTimeStretch(int dir, bool
normal_speed = new_normal_speed;
- activenvp->Play(normal_speed, true);
+ if (!paused)
+ activenvp->Play(normal_speed, true);
QString text = QString(tr("Time Stretch %1X")).arg(normal_speed);
@@ -4911,29 +4934,14 @@ void TV::customEvent(QCustomEvent *e)
}
else if (tvchain && message.left(12) == "LIVETV_CHAIN")
{
- // Get osdlock, while intended for the OSD this ensures that
- // the nvp & pipnvp are not deleted while we are using it..
- while (!osdlock.tryLock() && nvp)
- usleep(2500);
-
message = message.simplifyWhiteSpace();
QStringList tokens = QStringList::split(" ", message);
if (tokens[1] == "UPDATE")
{
- if (tvchain && nvp && tokens[2] == tvchain->GetID())
- {
- tvchain->ReloadAll();
- if (nvp->GetTVChain())
- nvp->CheckTVChain();
- }
- if (piptvchain && pipnvp && tokens[2] == piptvchain->GetID())
- {
- piptvchain->ReloadAll();
- if (pipnvp->GetTVChain())
- pipnvp->CheckTVChain();
- }
+ tvchainUpdateLock.lock();
+ tvchainUpdate += QDeepCopy<QString>(tokens[2]);
+ tvchainUpdateLock.unlock();
}
- osdlock.unlock();
}
else if (nvp && message.left(12) == "EXIT_TO_MENU")
{
@@ -4983,7 +4991,7 @@ void TV::customEvent(QCustomEvent *e)
QDateTime evstartts = QDateTime::fromString(tokens[2], Qt::ISODate);
if ((playbackinfo->chanid == evchanid) &&
- (playbackinfo->startts == evstartts))
+ (playbackinfo->recstartts == evstartts))
{
QString msg = "COMMFLAG_REQUEST ";
msg += tokens[1] + " " + tokens[2];
@@ -5000,7 +5008,7 @@ void TV::customEvent(QCustomEvent *e)
QDateTime evstartts = QDateTime::fromString(tokens[2], Qt::ISODate);
if ((playbackinfo->chanid == evchanid) &&
- (playbackinfo->startts == evstartts))
+ (playbackinfo->recstartts == evstartts))
{
QMap<long long, int> newMap;
QStringList mark;
@@ -6067,9 +6075,22 @@ void TV::ShowNoRecorderDialog(void)
"in-progress recordings from the delete "
"menu.");
- MythPopupBox::showOkPopup(
+ if (embedWinID)
+ {
+ VERBOSE(VB_IMPORTANT, errorText);
+ }
+ else if (GetOSD())
+ {
+ dialogname = "infobox";
+ QStringList options("OK");
+ GetOSD()->NewDialogBox(dialogname, errorText, options, 0);
+ }
+ else
+ {
+ MythPopupBox::showOkPopup(
gContext->GetMainWindow(), QObject::tr("Channel Change Error"),
errorText);
+ }
}
/** \fn TV::PauseLiveTV(void)
diff -pruN mythtv-0.19/libs/libmythtv/tv_play.h mythtv/libs/libmythtv/tv_play.h
--- mythtv-0.19/libs/libmythtv/tv_play.h 2006-02-02 02:40:46.000000000 +1000
+++ mythtv/libs/libmythtv/tv_play.h 2006-02-23 17:54:05.000000000 +1000
@@ -456,7 +456,6 @@ class TV : public QObject
ProgramInfo *recorderPlaybackInfo; ///< info requested from recorder
ProgramInfo *playbackinfo; ///< info sent in via Playback()
QMutex pbinfoLock;
- QString inputFilename; ///< playbackinfo->pathname
int playbackLen; ///< initial playbackinfo->CalculateLength()
ProgramInfo *lastProgram; ///< last program played with this player
bool jumpToProgram;
@@ -485,6 +484,8 @@ class TV : public QObject
// LiveTVChain
LiveTVChain *tvchain;
LiveTVChain *piptvchain;
+ QStringList tvchainUpdate;
+ QMutex tvchainUpdateLock;
// RingBuffers
RingBuffer *prbuffer;
diff -pruN mythtv-0.19/libs/libmythtv/videosource.cpp mythtv/libs/libmythtv/videosource.cpp
--- mythtv-0.19/libs/libmythtv/videosource.cpp 2006-02-08 07:56:06.000000000 +1000
+++ mythtv/libs/libmythtv/videosource.cpp 2006-04-13 00:21:41.000000000 +1000
@@ -32,6 +32,7 @@
#include "videosource.h"
#include "datadirect.h"
#include "scanwizard.h"
+#include "frequencies.h"
#ifdef USING_DVB
#include <linux/dvb/frontend.h>
@@ -574,22 +575,10 @@ FreqTableSelector::FreqTableSelector(con
{
setLabel(QObject::tr("Channel frequency table"));
addSelection("default");
- addSelection("us-cable");
- addSelection("us-bcast");
- addSelection("us-cable-hrc");
- addSelection("japan-bcast");
- addSelection("japan-cable");
- addSelection("europe-west");
- addSelection("europe-east");
- addSelection("italy");
- addSelection("newzealand");
- addSelection("australia");
- addSelection("ireland");
- addSelection("france");
- addSelection("china-bcast");
- addSelection("southafrica");
- addSelection("argentina");
- addSelection("australia-optus");
+
+ for (uint i = 0; chanlists[i].name; i++)
+ addSelection(chanlists[i].name);
+
setHelpText(QObject::tr("Use default unless this source uses a "
"different frequency table than the system wide table "
"defined in the General settings."));
diff -pruN mythtv-0.19/programs/mythbackend/autoexpire.cpp mythtv/programs/mythbackend/autoexpire.cpp
--- mythtv-0.19/programs/mythbackend/autoexpire.cpp 2006-02-08 07:53:46.000000000 +1000
+++ mythtv/programs/mythbackend/autoexpire.cpp 2006-03-19 05:32:52.000000000 +1000
@@ -291,7 +291,8 @@ void AutoExpire::ExpireLiveTV(int type)
if ((availFreeKB = getDiskSpace(record_file_prefix, tKB, uKB)) < 0)
{
- QString msg = QString("ERROR: Could not calculate free space.");
+ QString msg = QString("ERROR: Could not calculate free space for %1.")
+ .arg(record_file_prefix);
VERBOSE(VB_IMPORTANT, LOC + msg);
gContext->LogEntry("mythbackend", LP_WARNING,
"Autoexpire Recording", msg);
diff -pruN mythtv-0.19/programs/mythbackend/filetransfer.cpp mythtv/programs/mythbackend/filetransfer.cpp
--- mythtv-0.19/programs/mythbackend/filetransfer.cpp 2006-02-07 01:35:33.000000000 +1000
+++ mythtv/programs/mythbackend/filetransfer.cpp 2006-02-23 17:54:05.000000000 +1000
@@ -131,3 +131,9 @@ long long FileTransfer::GetFileSize(void
return size;
}
+
+void FileTransfer::SetTimeout(bool fast)
+{
+ rbuffer->SetTimeout(fast);
+}
+
diff -pruN mythtv-0.19/programs/mythbackend/filetransfer.h mythtv/programs/mythbackend/filetransfer.h
--- mythtv-0.19/programs/mythbackend/filetransfer.h 2006-02-07 01:35:33.000000000 +1000
+++ mythtv/programs/mythbackend/filetransfer.h 2006-02-23 17:54:05.000000000 +1000
@@ -35,6 +35,8 @@ class FileTransfer
long long GetFileSize(void);
+ void SetTimeout(bool fast);
+
private:
bool readthreadlive;
QMutex readthreadLock;
diff -pruN mythtv-0.19/programs/mythbackend/housekeeper.cpp mythtv/programs/mythbackend/housekeeper.cpp
--- mythtv-0.19/programs/mythbackend/housekeeper.cpp 2005-12-27 15:20:47.000000000 +1000
+++ mythtv/programs/mythbackend/housekeeper.cpp 2006-03-14 03:52:00.000000000 +1000
@@ -138,7 +138,6 @@ void HouseKeeper::RunHouseKeeping(void)
while (1)
{
- VERBOSE(VB_IMPORTANT, "Running HouseKeeping");
gContext->LogEntry("mythbackend", LP_DEBUG,
"Running housekeeping thread", "");
diff -pruN mythtv-0.19/programs/mythbackend/mainserver.cpp mythtv/programs/mythbackend/mainserver.cpp
--- mythtv-0.19/programs/mythbackend/mainserver.cpp 2006-01-29 09:49:24.000000000 +1000
+++ mythtv/programs/mythbackend/mainserver.cpp 2006-03-06 12:41:13.000000000 +1000
@@ -1919,11 +1919,8 @@ void MainServer::HandleGetPendingRecordi
if (m_sched) {
if (table == "") m_sched->getAllPending(strList);
else {
- // We need a different connection from the scheduler proper
- // DDCon exists, although it's designed for other purposes.
- MSqlQueryInfo dbconn = MSqlQuery::DDCon();
- Scheduler *sched = new Scheduler(false, encoderList,
- table, &dbconn, m_sched);
+ Scheduler *sched = new Scheduler(false, encoderList,
+ table, m_sched);
sched->FillRecordListFromDB(recordid);
sched->getAllPending(strList);
delete sched;
@@ -2940,6 +2937,12 @@ void MainServer::HandleFileTransferQuery
long long ret = ft->Seek(curpos, pos, whence);
encodeLongLong(retlist, ret);
}
+ else if (command == "SET_TIMEOUT")
+ {
+ bool fast = slist[2].toInt();
+ ft->SetTimeout(fast);
+ retlist << "ok";
+ }
else
{
VERBOSE(VB_IMPORTANT, QString("Unknown command: %1").arg(command));
diff -pruN mythtv-0.19/programs/mythbackend/scheduler.cpp mythtv/programs/mythbackend/scheduler.cpp
--- mythtv-0.19/programs/mythbackend/scheduler.cpp 2006-02-09 16:27:56.000000000 +1000
+++ mythtv/programs/mythbackend/scheduler.cpp 2006-03-06 14:05:21.000000000 +1000
@@ -35,8 +35,7 @@ using namespace std;
#define LOC_ERR QString("Scheduler, Error: ")
Scheduler::Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList,
- QString recordTbl, MSqlQueryInfo *databaseConnection,
- Scheduler *master_sched)
+ QString recordTbl, Scheduler *master_sched)
{
hasconflicts = false;
m_tvList = tvList;
@@ -48,8 +47,11 @@ Scheduler::Scheduler(bool runthread, QMa
master_sched->getAllPending(&reclist);
}
- if (databaseConnection) dbConn = *databaseConnection;
- else dbConn = MSqlQuery::SchedCon();
+ // Only the master scheduler should use SchedCon()
+ if (runthread)
+ dbConn = MSqlQuery::SchedCon();
+ else
+ dbConn = MSqlQuery::DDCon();
recordTable = recordTbl;
@@ -1136,6 +1138,10 @@ void Scheduler::RunScheduler(void)
if (reschedQueue.count())
{
+ // We might have been inactive for a long time, so make
+ // sure our DB connection is fresh before continuing.
+ dbConn = MSqlQuery::SchedCon();
+
gettimeofday(&fillstart, NULL);
QString msg;
while (reschedQueue.count())
@@ -1827,10 +1833,10 @@ void Scheduler::UpdateMatches(int record
QString query = QString(
"INSERT INTO recordmatch (recordid, chanid, starttime, manualid) "
"SELECT RECTABLE.recordid, program.chanid, program.starttime, "
-" IF(search = %1, recordid, 0) "
-"FROM RECTABLE, program ").arg(kManualSearch) + fromclauses[clause] + QString(
-" INNER JOIN channel ON (channel.chanid = program.chanid) "
-"WHERE ") + whereclauses[clause] + QString(" AND channel.visible = 1 AND "
+" IF(search = %1, recordid, 0) ").arg(kManualSearch) + QString(
+"FROM (RECTABLE, program INNER JOIN channel "
+" ON channel.chanid = program.chanid) ") + fromclauses[clause] + QString(
+" WHERE ") + whereclauses[clause] + QString(" AND channel.visible = 1 AND "
"((RECTABLE.type = %1 " // allrecord
"OR RECTABLE.type = %2 " // findonerecord
"OR RECTABLE.type = %3 " // finddailyrecord
diff -pruN mythtv-0.19/programs/mythbackend/scheduler.h mythtv/programs/mythbackend/scheduler.h
--- mythtv-0.19/programs/mythbackend/scheduler.h 2006-02-08 07:53:46.000000000 +1000
+++ mythtv/programs/mythbackend/scheduler.h 2006-03-06 12:41:13.000000000 +1000
@@ -23,8 +23,7 @@ class Scheduler : public QObject
{
public:
Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList,
- QString recordTbl = "record", MSqlQueryInfo *dbConnUse = NULL,
- Scheduler *master_sched = NULL);
+ QString recordTbl = "record", Scheduler *master_sched = NULL);
~Scheduler();
void Reschedule(int recordid);
diff -pruN mythtv-0.19/programs/mythcommflag/main.cpp mythtv/programs/mythcommflag/main.cpp
--- mythtv-0.19/programs/mythcommflag/main.cpp 2006-02-08 16:42:13.000000000 +1000
+++ mythtv/programs/mythcommflag/main.cpp 2006-02-28 16:58:05.000000000 +1000
@@ -895,9 +895,6 @@ int main(int argc, char *argv[])
return COMMFLAG_EXIT_INVALID_CMDLINE;
}
- if (queueJobInstead)
- return QueueCommFlagJob(chanid, starttime);
-
if (copyToCutlist)
return CopySkipListToCutList(chanid, starttime);
@@ -1009,7 +1006,10 @@ int main(int argc, char *argv[])
if ( allRecorded )
{
- FlagCommercials(chanid, starttime);
+ if (queueJobInstead)
+ QueueCommFlagJob(chanid, starttime);
+ else
+ FlagCommercials(chanid, starttime);
}
else
{
@@ -1063,7 +1063,12 @@ int main(int argc, char *argv[])
if ((flagStatus == COMM_FLAG_NOT_FLAGGED) &&
(marksFound == 0))
- FlagCommercials(chanid, starttime);
+ {
+ if (queueJobInstead)
+ QueueCommFlagJob(chanid, starttime);
+ else
+ FlagCommercials(chanid, starttime);
+ }
}
}
}
diff -pruN mythtv-0.19/programs/mythfilldatabase/filldata.cpp mythtv/programs/mythfilldatabase/filldata.cpp
--- mythtv-0.19/programs/mythfilldatabase/filldata.cpp 2006-02-08 07:53:46.000000000 +1000
+++ mythtv/programs/mythfilldatabase/filldata.cpp 2006-05-12 07:07:54.000000000 +1000
@@ -337,7 +337,7 @@ void UpdateSourceIcons(int sourceid)
MSqlQuery query(MSqlQuery::InitCon());
query.prepare("SELECT ch.chanid, nim.url "
- "FROM channel ch, callsignnetworkmap csm "
+ "FROM (channel ch, callsignnetworkmap csm) "
"RIGHT JOIN networkiconmap nim ON csm.network = nim.network "
"WHERE ch.callsign = csm.callsign AND "
"(icon = :NOICON OR icon = '') AND ch.sourceid = :SOURCEID");
@@ -2174,7 +2174,8 @@ void handleChannels(int id, QValueList<C
0 /*service id*/, major, minor,
false /*use on air guide*/, false /*hidden*/,
false /*hidden in guide*/,
- freqid, localfile, (*i).tvformat))
+ freqid, localfile, (*i).tvformat,
+ (*i).xmltvid))
{
cout << "### " << endl;
cout << "### Channel inserted" << endl;
@@ -3851,7 +3852,6 @@ int main(int argc, char *argv[])
VERBOSE(VB_IMPORTANT, "Failed to fetch some program info");
gContext->LogEntry("mythfilldatabase", LP_WARNING,
"Failed to fetch some program info", "");
- return FILLDB_EXIT_DB_ERROR;
}
else
VERBOSE(VB_IMPORTANT, "Data fetching complete.");
diff -pruN mythtv-0.19/programs/mythfrontend/customrecord.cpp mythtv/programs/mythfrontend/customrecord.cpp
--- mythtv-0.19/programs/mythfrontend/customrecord.cpp 2006-01-22 14:16:48.000000000 +1000
+++ mythtv/programs/mythfrontend/customrecord.cpp 2006-03-06 14:05:21.000000000 +1000
@@ -149,7 +149,7 @@ CustomRecord::CustomRecord(MythMainWindo
m_cfrom << "";
m_csql << "program.stars >= 0.75 ";
- m_clause->insertItem(tr("Person named in the credits"));
+ m_clause->insertItem(tr("Person named in the credits (Data Direct)"));
m_cfrom << ", people, credits";
m_csql << QString("people.name = 'Tom Hanks' \n"
"AND credits.person = people.person \n"
@@ -447,8 +447,8 @@ bool CustomRecord::checkSyntax(void)
else
{
MSqlQuery query(MSqlQuery::InitCon());
- query.prepare(QString("SELECT NULL FROM program,channel %1 WHERE\n%2")
- .arg(from).arg(desc));
+ query.prepare(QString("SELECT NULL FROM (program,channel) "
+ "%1 WHERE\n%2").arg(from).arg(desc));
if (query.exec() && query.isActive())
{
diff -pruN mythtv-0.19/programs/mythfrontend/networkcontrol.cpp mythtv/programs/mythfrontend/networkcontrol.cpp
--- mythtv-0.19/programs/mythfrontend/networkcontrol.cpp 2006-02-10 06:21:59.000000000 +1000
+++ mythtv/programs/mythfrontend/networkcontrol.cpp 2006-03-17 19:17:32.000000000 +1000
@@ -469,7 +469,7 @@ QString NetworkControl::processPlay(QStr
message = "NETWORK_CONTROL SEEK BACKWARD";
else if (tokens[2].contains(QRegExp("^\\d\\d:\\d\\d:\\d\\d$")))
{
- int hours = tokens[2].left(0).toInt();
+ int hours = tokens[2].mid(0, 2).toInt();
int minutes = tokens[2].mid(3, 2).toInt();
int seconds = tokens[2].mid(6, 2).toInt();
message = QString("NETWORK_CONTROL SEEK POSITION %1")
diff -pruN mythtv-0.19/programs/mythfrontend/playbackbox.cpp mythtv/programs/mythfrontend/playbackbox.cpp
--- mythtv-0.19/programs/mythfrontend/playbackbox.cpp 2006-02-08 03:21:33.000000000 +1000
+++ mythtv/programs/mythfrontend/playbackbox.cpp 2006-04-01 02:11:33.000000000 +1000
@@ -17,6 +17,7 @@
#include <qsqldatabase.h>
#include <qmap.h>
+#include <cmath>
#include <unistd.h>
#include <iostream>
@@ -140,6 +141,7 @@ PlaybackBox::PlaybackBox(BoxType ltype,
// Main Recording List support
fillListTimer(new QTimer(this)), connected(false),
titleIndex(0), progIndex(0),
+ progsInDB(0),
// Other state
curitem(NULL), delitem(NULL),
lastProgram(NULL),
@@ -261,7 +263,9 @@ PlaybackBox::PlaybackBox(BoxType ltype,
setNoErase();
gContext->addListener(this);
- if (!recGroupPassword.isEmpty() || (titleList.count() <= 1) || initialFilt)
+ if ((!recGroupPassword.isEmpty()) ||
+ ((titleList.count() <= 1) && (progsInDB > 0)) ||
+ (initialFilt))
showRecGroupChooser();
gContext->addCurrentLocation((type == Delete)? "DeleteBox":"PlaybackBox");
@@ -890,9 +894,13 @@ void PlaybackBox::updateVideo(QPainter *
!playingSomething)
{
QSize size = drawVideoBounds.size();
+ float saspect = ((float)size.width()) / ((float)size.height());
+ float vaspect = previewVideoNVP->GetVideoAspect();
+ size.setHeight((int) ceil(size.height() * (saspect / vaspect)));
+ size.setHeight(((size.height() + 7) / 8) * 8);
+ size.setWidth( ((size.width() + 7) / 8) * 8);
const QImage &img = previewVideoNVP->GetARGBFrame(size);
- uint xoff = max((size.width() - drawVideoBounds.width()) / 2, 0);
- p->drawImage(drawVideoBounds.x() + xoff, drawVideoBounds.y(), img);
+ p->drawImage(drawVideoBounds.x(), drawVideoBounds.y(), img);
}
/* have we timed out waiting for nvp to start? */
@@ -1380,6 +1388,7 @@ bool PlaybackBox::FillList()
asCache[asKey] = p->availableStatus;
}
+ progsInDB = 0;
titleList.clear();
progLists.clear();
// Clear autoDelete for the "all" list since it will share the
@@ -1402,6 +1411,7 @@ bool PlaybackBox::FillList()
vector<ProgramInfo *>::iterator i = infoList->begin();
for ( ; i != infoList->end(); i++)
{
+ progsInDB++;
p = *i;
if ((((p->recgroup == recGroup) ||
((recGroup == "All Programs") &&
@@ -4129,8 +4139,7 @@ void PlaybackBox::recGroupChooserListBox
if (!recGroupListBox)
return;
- QString item =
- recGroupListBox->currentText().section('[', 0, 0).simplifyWhiteSpace();
+ QString item = recGroupListBox->currentText().section(" [", 0, 0);
if (item.left(5) == "-----")
{
@@ -4147,8 +4156,7 @@ void PlaybackBox::recGroupChooserListBox
void PlaybackBox::setGroupFilter(void)
{
- recGroup =
- recGroupListBox->currentText().section('[', 0, 0).simplifyWhiteSpace();
+ recGroup = recGroupListBox->currentText().section(" [", 0, 0);
if (groupnameAsAllProg)
groupDisplayName = recGroup;
diff -pruN mythtv-0.19/programs/mythfrontend/playbackbox.h mythtv/programs/mythfrontend/playbackbox.h
--- mythtv-0.19/programs/mythfrontend/playbackbox.h 2006-02-02 12:43:31.000000000 +1000
+++ mythtv/programs/mythfrontend/playbackbox.h 2006-02-28 11:06:40.000000000 +1000
@@ -337,6 +337,7 @@ class PlaybackBox : public MythDialog
int progIndex; ///< Index of selected item index on page
QStringList titleList; ///< list of pages
ProgramMap progLists; ///< lists of programs by page
+ int progsInDB; ///< total number of recordings in DB
// Play List support
QStringList playList; ///< list of selected items "play list"
diff -pruN mythtv-0.19/programs/mythfrontend/tv_schedule.xml mythtv/programs/mythfrontend/tv_schedule.xml
--- mythtv-0.19/programs/mythfrontend/tv_schedule.xml 2006-02-02 01:28:40.000000000 +1000
+++ mythtv/programs/mythfrontend/tv_schedule.xml 2006-03-11 10:52:28.000000000 +1000
@@ -26,7 +26,7 @@
<alttext lang="CA">Guia</alttext>
<alttext lang="DE">EPG</alttext>
<alttext lang="DK">Guide</alttext>
- <alttext lang="DK">Dagskrá</alttext>
+ <alttext lang="IS">Dagskrá</alttext>
<alttext lang="NL">Gids</alttext>
<alttext lang="SV">Guide</alttext>
<alttext lang="JA">ガイド</alttext>
diff -pruN mythtv-0.19/programs/mythtranscode/mpeg2fix.cpp mythtv/programs/mythtranscode/mpeg2fix.cpp
--- mythtv-0.19/programs/mythtranscode/mpeg2fix.cpp 2006-01-27 02:42:44.000000000 +1000
+++ mythtv/programs/mythtranscode/mpeg2fix.cpp 2006-03-07 11:49:33.000000000 +1000
@@ -1776,6 +1776,7 @@ int MPEG2fixup::Start()
if (vFrame.count() && (file_end || vFrame.getLast()->isSequence))
{
+ MPEG2frame *seqFrame;
if (ptsIncrement != vFrame.first()->mpeg2_seq.frame_period / 300)
{
VERBOSE(MPF_IMPORTANT,
@@ -1786,6 +1787,11 @@ int MPEG2fixup::Start()
}
displayFrame->toFirst();
+ // since we might reorder the frames when coming out of a cutpoint
+ // me need to save the first frame here, as it is gauranteed to
+ // have a sequence header.
+ seqFrame = vFrame.current();
+
while (vFrame.current() != vFrame.getLast())
{
bool ptsorder_eq_dtsorder = false;
@@ -1941,7 +1947,7 @@ int MPEG2fixup::Start()
if (! new_discard_state)
{
- AddSequence(markedFrame, vFrame.first());
+ AddSequence(markedFrame, seqFrame);
RenumberFrames(frame_pos + Lreorder.at(),
- GetFrameNum(markedFrame));
}
diff -pruN mythtv-0.19/programs/mythtv/main.cpp mythtv/programs/mythtv/main.cpp
--- mythtv-0.19/programs/mythtv/main.cpp 2006-01-05 01:45:55.000000000 +1000
+++ mythtv/programs/mythtv/main.cpp 2006-02-19 05:56:39.000000000 +1000
@@ -132,6 +132,7 @@ int main(int argc, char *argv[])
ProgramInfo *pginfo = new ProgramInfo();
pginfo->endts = QDateTime::currentDateTime().addSecs(-180);
pginfo->pathname = filename;
+ pginfo->isVideo = true;
tv->Playback(pginfo);
}
diff -pruN mythtv-0.19/setup/backendsettings.cpp mythtv/setup/backendsettings.cpp
--- mythtv-0.19/setup/backendsettings.cpp 2005-12-30 04:16:07.000000000 +1000
+++ mythtv/setup/backendsettings.cpp 2006-04-13 00:21:41.000000000 +1000
@@ -1,6 +1,7 @@
#include <cstdio>
#include "backendsettings.h"
+#include "frequencies.h"
#include "libmyth/mythcontext.h"
#include "libmyth/settings.h"
#include <unistd.h>
@@ -110,23 +111,10 @@ static GlobalComboBox *FreqTable()
{
GlobalComboBox *gc = new GlobalComboBox("FreqTable");
gc->setLabel(QObject::tr("Channel frequency table"));
- gc->addSelection("us-cable");
- gc->addSelection("us-bcast");
- gc->addSelection("us-cable-hrc");
- gc->addSelection("us-cable-irc");
- gc->addSelection("japan-bcast");
- gc->addSelection("japan-cable");
- gc->addSelection("europe-west");
- gc->addSelection("europe-east");
- gc->addSelection("italy");
- gc->addSelection("newzealand");
- gc->addSelection("australia");
- gc->addSelection("ireland");
- gc->addSelection("france");
- gc->addSelection("china-bcast");
- gc->addSelection("southafrica");
- gc->addSelection("argentina");
- gc->addSelection("australia-optus");
+
+ for (uint i = 0; chanlists[i].name; i++)
+ gc->addSelection(chanlists[i].name);
+
gc->setHelpText(QObject::tr("Select the appropriate frequency table for "
"your system. If you have an antenna, use a \"-bcast\" "
"frequency."));