[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