[mythtv] Some bugs (0.15) A.K.A. SetPositionMapDelta_v2.diff
Chris Pinkham
cpinkham at bc2va.org
Thu May 27 00:33:43 EDT 2004
> On Tue, May 25, 2004 at 10:41:48PM -0400, Chris Pinkham wrote:
> > been working on. If someone else wants to give this a good
> > runthrough or test though, a patch is attached.
>
> Oscar would probably be a good candidate. He emailed my privately
> today about the back-to-back delays. I brainstormed a little about
> adding a new scheduler thread to do the potentially slow task of
> querying the DB and rescheduling. That would leave the existing
> thread to just dispatch recordings. The trick would be to reconcile
> any state changes made by the dispatcher while the rescheduling is
> being done.
>
> David
This should be a full version of that patch. I forgot to include
the changes to programinfo when I did the diff.
--
Chris
-------------- next part --------------
Index: libs/libmythtv/dvbrecorder.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/dvbrecorder.cpp,v
retrieving revision 1.30
diff -u -r1.30 dvbrecorder.cpp
--- a/libs/libmythtv/dvbrecorder.cpp 30 Mar 2004 06:06:53 -0000 1.30
+++ b/libs/libmythtv/dvbrecorder.cpp 27 May 2004 04:30:32 -0000
@@ -170,7 +170,6 @@
channel_changed = true;
framesWritten = 0;
- prev_gop_save_pos = -1;
memset(prvpkt, 0, 3);
}
@@ -597,7 +596,8 @@
{
pthread_mutex_lock(db_lock);
MythContext::KickDatabase(db_conn);
- curRecording->SetPositionMap(positionMap, MARK_GOP_BYFRAME, db_conn);
+ curRecording->SetPositionMapDelta(positionMapDelta, MARK_GOP_BYFRAME,
+ db_conn);
pthread_mutex_unlock(db_lock);
}
}
@@ -665,18 +665,18 @@
long long startpos = ringBuffer->GetFileWritePosition();
positionMap[framesWritten] = startpos;
+ positionMapDelta[framesWritten] = startpos;
if (curRecording && db_lock && db_conn &&
- ((positionMap.size() % 30) == 0))
+ ((positionMapDelta.size() % 30) == 0))
{
pthread_mutex_lock(db_lock);
MythContext::KickDatabase(db_conn);
- curRecording->SetPositionMap(
- positionMap, MARK_GOP_BYFRAME,
- db_conn, prev_gop_save_pos,
- framesWritten);
+ curRecording->SetPositionMapDelta(
+ positionMapDelta, MARK_GOP_BYFRAME,
+ db_conn);
pthread_mutex_unlock(db_lock);
- prev_gop_save_pos = framesWritten + 1;
+ positionMapDelta.clear();
}
}
break;
@@ -707,6 +707,7 @@
framesWritten = 0;
positionMap.clear();
+ positionMapDelta.clear();
}
void DVBRecorder::Pause(bool clear)
Index: libs/libmythtv/hdtvrecorder.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/hdtvrecorder.cpp,v
retrieving revision 1.21
diff -u -r1.21 hdtvrecorder.cpp
--- a/libs/libmythtv/hdtvrecorder.cpp 10 Feb 2004 22:08:29 -0000 1.21
+++ b/libs/libmythtv/hdtvrecorder.cpp 27 May 2004 04:30:32 -0000
@@ -268,8 +268,6 @@
bool HDTVRecorder::SetupRecording(void)
{
- prev_gop_save_pos = -1;
-
return true;
}
@@ -279,7 +277,8 @@
{
pthread_mutex_lock(db_lock);
MythContext::KickDatabase(db_conn);
- curRecording->SetPositionMap(positionMap, MARK_GOP_BYFRAME, db_conn);
+ curRecording->SetPositionMapDelta(positionMapDelta, MARK_GOP_BYFRAME,
+ db_conn);
pthread_mutex_unlock(db_lock);
}
}
@@ -399,18 +398,17 @@
ringBuffer->GetFileWritePosition();
positionMap[frameNum] = startpos;
+ positionMapDelta[frameNum] = startpos;
if (curRecording && db_lock && db_conn &&
- ((positionMap.size() % 30) == 0))
+ ((positionMapDelta.size() % 30) == 0))
{
pthread_mutex_lock(db_lock);
MythContext::KickDatabase(db_conn);
- curRecording->SetPositionMap(
- positionMap, MARK_GOP_BYFRAME,
- db_conn, prev_gop_save_pos,
- frameNum);
+ curRecording->SetPositionMapDelta(
+ positionMapDelta, MARK_GOP_BYFRAME,
+ db_conn);
pthread_mutex_unlock(db_lock);
- prev_gop_save_pos = frameNum + 1;
}
}
@@ -825,9 +823,8 @@
lowest_video_pid = 0x1fff;
video_pid_packets = 0;
- prev_gop_save_pos = -1;
-
positionMap.clear();
+ positionMapDelta.clear();
if (chanfd > 0)
{
Index: libs/libmythtv/mpegrecorder.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/mpegrecorder.cpp,v
retrieving revision 1.33
diff -u -r1.33 mpegrecorder.cpp
--- a/libs/libmythtv/mpegrecorder.cpp 21 May 2004 05:30:58 -0000 1.33
+++ b/libs/libmythtv/mpegrecorder.cpp 27 May 2004 04:30:32 -0000
@@ -437,8 +437,6 @@
ic->build_index = 0;
- prev_gop_save_pos = -1;
-
return true;
}
@@ -448,7 +446,8 @@
{
pthread_mutex_lock(db_lock);
MythContext::KickDatabase(db_conn);
- curRecording->SetPositionMap(positionMap, MARK_GOP_START, db_conn);
+ curRecording->SetPositionMapDelta(positionMapDelta, MARK_GOP_START,
+ db_conn);
pthread_mutex_unlock(db_lock);
}
}
@@ -536,16 +535,16 @@
long long keyCount = frameNum / keyframedist;
positionMap[keyCount] = startpos;
+ positionMapDelta[keyCount] = startpos;
if (curRecording && db_lock && db_conn &&
- ((positionMap.size() % 30) == 0))
+ ((positionMapDelta.size() % 30) == 0))
{
pthread_mutex_lock(db_lock);
MythContext::KickDatabase(db_conn);
- curRecording->SetPositionMap(positionMap, MARK_GOP_START,
- db_conn, prev_gop_save_pos, keyCount);
+ curRecording->SetPositionMapDelta(positionMapDelta,
+ MARK_GOP_START, db_conn);
pthread_mutex_unlock(db_lock);
- prev_gop_save_pos = keyCount + 1;
}
}
}
@@ -578,6 +577,7 @@
framesWritten = 0;
positionMap.clear();
+ positionMapDelta.clear();
}
void MpegRecorder::Pause(bool clear)
Index: libs/libmythtv/NuppelVideoRecorder.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/NuppelVideoRecorder.cpp,v
retrieving revision 1.168
diff -u -r1.168 NuppelVideoRecorder.cpp
--- a/libs/libmythtv/NuppelVideoRecorder.cpp 10 Apr 2004 19:31:57 -0000 1.168
+++ b/libs/libmythtv/NuppelVideoRecorder.cpp 27 May 2004 04:30:33 -0000
@@ -148,7 +148,6 @@
usingv4l2 = false;
prev_bframe_save_pos = -1;
- prev_keyframe_save_pos = -1;
volume = 100;
}
@@ -834,6 +833,12 @@
StreamAllocate();
positionMap.clear();
+ positionMapDelta.clear();
+
+ pthread_mutex_lock(db_lock);
+ MythContext::KickDatabase(db_conn);
+ curRecording->ClearPositionMap(MARK_KEYFRAME, db_conn);
+ pthread_mutex_unlock(db_lock);
if (codec.lower() == "rtjpeg")
useavcodec = false;
@@ -1752,12 +1757,15 @@
ringBuffer->WriterSeek(0, SEEK_END);
- if (curRecording && positionMap.size() && db_lock && db_conn)
+ if (curRecording && positionMapDelta.size() && db_lock && db_conn)
{
pthread_mutex_lock(db_lock);
MythContext::KickDatabase(db_conn);
- curRecording->SetPositionMap(positionMap, MARK_KEYFRAME, db_conn);
+ curRecording->SetPositionMapDelta(positionMapDelta, MARK_KEYFRAME,
+ db_conn);
pthread_mutex_unlock(db_lock);
+
+ positionMapDelta.clear();
}
delete [] seekbuf;
}
@@ -1808,19 +1816,19 @@
ste.file_offset = position;
ste.keyframe_number = frame_num;
positionMap[ste.keyframe_number] = position;
+ positionMapDelta[ste.keyframe_number] = position;
seektable->push_back(ste);
if (use_db && curRecording && db_lock && db_conn &&
- (positionMap.size() % 15) == 0)
+ (positionMapDelta.size() % 15) == 0)
{
pthread_mutex_lock(db_lock);
MythContext::KickDatabase(db_conn);
- curRecording->SetPositionMap(positionMap, MARK_KEYFRAME, db_conn,
- prev_keyframe_save_pos,
- (long long)ste.keyframe_number);
+ curRecording->SetPositionMapDelta(positionMapDelta, MARK_KEYFRAME,
+ db_conn);
pthread_mutex_unlock(db_lock);
- prev_keyframe_save_pos = ste.keyframe_number + 1;
+ positionMapDelta.clear();
}
}
@@ -1895,6 +1903,12 @@
seektable->clear();
positionMap.clear();
+ positionMapDelta.clear();
+
+ pthread_mutex_lock(db_lock);
+ MythContext::KickDatabase(db_conn);
+ curRecording->ClearPositionMap(MARK_KEYFRAME, db_conn);
+ pthread_mutex_unlock(db_lock);
}
void *NuppelVideoRecorder::WriteThread(void *param)
Index: libs/libmythtv/dvbrecorder.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/dvbrecorder.h,v
retrieving revision 1.20
diff -u -r1.20 dvbrecorder.h
--- a/libs/libmythtv/dvbrecorder.h 30 Mar 2004 06:06:53 -0000 1.20
+++ b/libs/libmythtv/dvbrecorder.h 27 May 2004 04:30:33 -0000
@@ -104,7 +104,7 @@
bool signal_monitor_quit;
QMap<long long, long long> positionMap;
- long long prev_gop_save_pos;
+ QMap<long long, long long> positionMapDelta;
bool dvb_on_demand;
bool isopen;
Index: libs/libmythtv/hdtvrecorder.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/hdtvrecorder.h,v
retrieving revision 1.16
diff -u -r1.16 hdtvrecorder.h
--- a/libs/libmythtv/hdtvrecorder.h 18 Jan 2004 18:39:25 -0000 1.16
+++ b/libs/libmythtv/hdtvrecorder.h 27 May 2004 04:30:33 -0000
@@ -80,8 +80,8 @@
int m_header_sync;
QMap<long long, long long> positionMap;
+ QMap<long long, long long> positionMapDelta;
- long long prev_gop_save_pos;
int firstgoppos;
int desired_program;
Index: libs/libmythtv/mpegrecorder.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/mpegrecorder.h,v
retrieving revision 1.11
diff -u -r1.11 mpegrecorder.h
--- a/libs/libmythtv/mpegrecorder.h 18 Jan 2004 18:39:28 -0000 1.11
+++ b/libs/libmythtv/mpegrecorder.h 27 May 2004 04:30:33 -0000
@@ -70,8 +70,8 @@
bool gopset;
QMap<long long, long long> positionMap;
+ QMap<long long, long long> positionMapDelta;
- long long prev_gop_save_pos;
static const int audRateL1[];
static const int audRateL2[];
static const char* streamType[];
Index: libs/libmythtv/NuppelVideoRecorder.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/NuppelVideoRecorder.h,v
retrieving revision 1.73
diff -u -r1.73 NuppelVideoRecorder.h
--- a/libs/libmythtv/NuppelVideoRecorder.h 10 Apr 2004 19:31:57 -0000 1.73
+++ b/libs/libmythtv/NuppelVideoRecorder.h 27 May 2004 04:30:33 -0000
@@ -203,6 +203,7 @@
int keyframedist;
vector<struct seektable_entry> *seektable;
QMap<long long, long long> positionMap;
+ QMap<long long, long long> positionMapDelta;
long long extendeddataOffset;
@@ -261,7 +262,6 @@
int channelfd;
long long prev_bframe_save_pos;
- long long prev_keyframe_save_pos;
ChannelBase *channelObj;
Index: libs/libmythtv/programinfo.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/programinfo.cpp,v
retrieving revision 1.134
diff -u -r1.134 programinfo.cpp
--- a/libs/libmythtv/programinfo.cpp 22 May 2004 18:37:25 -0000 1.134
+++ b/libs/libmythtv/programinfo.cpp 27 May 2004 04:30:33 -0000
@@ -1450,6 +1450,20 @@
}
}
+void ProgramInfo::ClearPositionMap(int type, QSqlDatabase *db)
+{
+ QString starts = recstartts.toString("yyyyMMddhhmm");
+ starts += "00";
+
+ QString querystr = QString("DELETE FROM recordedmarkup "
+ "WHERE chanid = '%1' AND starttime = '%2' "
+ "AND type = %3;")
+ .arg(chanid).arg(starts).arg(type);
+ QSqlQuery query = db->exec(querystr);
+ if (!query.isActive())
+ MythContext::DBError("clear position map", querystr);
+}
+
void ProgramInfo::SetPositionMap(QMap<long long, long long> &posMap, int type,
QSqlDatabase *db, long long min_frame,
long long max_frame)
@@ -1517,6 +1531,40 @@
}
}
+void ProgramInfo::SetPositionMapDelta(QMap<long long, long long> &posMap, int type,
+ QSqlDatabase *db)
+{
+ QMap<long long, long long>::Iterator i;
+
+ QString starts = recstartts.toString("yyyyMMddhhmm");
+ starts += "00";
+
+ for (i = posMap.begin(); i != posMap.end(); ++i)
+ {
+ long long frame = i.key();
+ char tempc[128];
+ sprintf(tempc, "%lld", frame);
+
+ QString frame_str = tempc;
+
+ long long offset = i.data();
+ sprintf(tempc, "%lld", offset);
+
+ QString offset_str = tempc;
+
+ QString querystr = QString("INSERT INTO recordedmarkup (chanid, starttime, "
+ "mark, type, offset) values "
+ "( '%1', '%2', %3, %4, \"%5\");")
+ .arg(chanid).arg(starts)
+ .arg(frame_str).arg(type)
+ .arg(offset_str);
+
+ QSqlQuery subquery = db->exec(querystr);
+ if (!subquery.isActive())
+ MythContext::DBError("delta position map insert", querystr);
+ }
+}
+
void ProgramInfo::DeleteHistory(QSqlDatabase *db)
{
GetProgramRecordingStatus(db);
Index: libs/libmythtv/programinfo.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/programinfo.h,v
retrieving revision 1.78
diff -u -r1.78 programinfo.h
--- a/libs/libmythtv/programinfo.h 22 May 2004 18:37:25 -0000 1.78
+++ b/libs/libmythtv/programinfo.h 27 May 2004 04:30:33 -0000
@@ -166,9 +171,12 @@
void SetMarkupFlag(int type, bool processing, QSqlDatabase *db);
void GetPositionMap(QMap<long long, long long> &posMap, int type,
QSqlDatabase *db);
+ void ClearPositionMap(int type, QSqlDatabase *db);
void SetPositionMap(QMap<long long, long long> &posMap, int type,
QSqlDatabase *db,
long long min_frame = -1, long long max_frame = -1);
+ void SetPositionMapDelta(QMap<long long, long long> &posMap, int type,
+ QSqlDatabase *db);
void DeleteHistory(QSqlDatabase *db);
QString RecTypeChar(void);
More information about the mythtv-dev
mailing list