All pastes #2087491 Raw Edit

Mine

public text v1 · immutable
#2087491 ·published 2011-10-07 01:29 UTC
rendered paste body
diff --git a/mythtv/libs/libmyth/programinfo.cpp b/mythtv/libs/libmyth/programinfo.cpp
index 8793940..e09f5fb 100644
--- a/mythtv/libs/libmyth/programinfo.cpp
+++ b/mythtv/libs/libmyth/programinfo.cpp
@@ -3559,7 +3559,7 @@ void ProgramInfo::SaveTotalFrames(int64_t frames)
     query.bindValue(":DATA", (uint)(frames));
 
     if (!query.exec())
-        MythDB::DBError("Frames insert", query);
+        MythDB::DBError("Total Frames insert", query);
 }
 
 /// \brief Store the Resolution at frame in the recordedmarkup table
diff --git a/mythtv/libs/libmythtv/dtvrecorder.cpp b/mythtv/libs/libmythtv/dtvrecorder.cpp
index e0a5335..4ea842a 100644
--- a/mythtv/libs/libmythtv/dtvrecorder.cpp
+++ b/mythtv/libs/libmythtv/dtvrecorder.cpp
@@ -75,13 +75,18 @@ DTVRecorder::DTVRecorder(TVRec *rec) :
     // statistics
     _packet_count(0),
     _continuity_error_count(0),
-    _frames_seen_count(0),          _frames_written_count(0)
+    _frames_seen_count(0),          _frames_written_count(0),
+    _duration(0)
 {
     SetPositionMapType(MARK_GOP_BYFRAME);
     _payload_buffer.reserve(TSPacket::kSize * (50 + 1));
     memset(_stream_id, 0, sizeof(_stream_id));
     memset(_pid_status, 0, sizeof(_pid_status));
     memset(_continuity_counter, 0, sizeof(_continuity_counter));
+    pc = new ParseContext1;
+    memset(pc, 0, sizeof(struct ParseContext1));
+    s = new AVCodecParserContext;
+    memset(s, 0, sizeof(struct AVCodecParserContext));
 }
 
 DTVRecorder::~DTVRecorder()
@@ -101,6 +106,12 @@ DTVRecorder::~DTVRecorder()
         delete _input_pmt;
         _input_pmt = NULL;
     }
+
+    if (pc)
+    {
+        delete pc;
+        pc = NULL;
+    }
 }
 
 void DTVRecorder::SetOption(const QString &name, const QString &value)
@@ -155,6 +166,9 @@ void DTVRecorder::FinishRecording(void)
         if (ringBuffer)
             curRecording->SaveFilesize(ringBuffer->GetRealFileSize());
         SavePositionMap(true);
+        LOG(VB_RECORD, LOG_INFO, LOC + "Storing duration and total frames");
+        SetDuration(_duration);
+        SetTotalFrames(_frames_written_count);
     }
 //     positionMapLock.lock();
 //     positionMap.clear();
@@ -339,7 +353,6 @@ bool DTVRecorder::FindMPEG2Keyframes(const TSPacket* tspacket)
     //   (there are others that we don't care about)
     const uint8_t *bufptr = tspacket->data() + tspacket->AFCOffset();
     const uint8_t *bufend = tspacket->data() + TSPacket::kSize;
-    int progressive_sequence = 0;
     int ext_type, bytes_left;
     int picture_structure, top_field_first, repeat_first_field, progressive_frame;
     int repeat_pict = 0;
@@ -384,7 +397,7 @@ bool DTVRecorder::FindMPEG2Keyframes(const TSPacket* tspacket)
                     case 0x1: /* sequence extension */
                         if (bytes_left >= 6)
                         {
-                            progressive_sequence = bufptr[1] & (1 << 3);
+                            pc->progressive_sequence = bufptr[1] & (1 << 3);
                         }
                         break;
                     case 0x8: /* picture coding extension */
@@ -399,7 +412,7 @@ bool DTVRecorder::FindMPEG2Keyframes(const TSPacket* tspacket)
                             repeat_pict = 1;
                             if (repeat_first_field) 
                             {
-                                if (progressive_sequence)
+                                if (pc->progressive_sequence)
                                 {
                                     if (top_field_first)
                                         repeat_pict = 5;
@@ -441,6 +454,11 @@ bool DTVRecorder::FindMPEG2Keyframes(const TSPacket* tspacket)
         _frames_seen_count++;
         if (!_wait_for_keyframe_option || _first_keyframe>=0)
             _frames_written_count++;
+            _duration += (int64_t)((1.0f / frameRate / 1000.0f) + 
+                                   (repeat_pict * 0.5) / (frameRate / 1000.0f)
+                                   * 1000000);
+            LOG(VB_RECORD, LOG_INFO, LOC + QString("Duration = %1 (%2 %3)")
+                .arg(_duration).arg(_frames_written_count).arg(frameRate));
     }
 
     if ((aspectRatio > 0) && (aspectRatio != m_videoAspect))
diff --git a/mythtv/libs/libmythtv/dtvrecorder.h b/mythtv/libs/libmythtv/dtvrecorder.h
index 25b8c7e..64d66df 100644
--- a/mythtv/libs/libmythtv/dtvrecorder.h
+++ b/mythtv/libs/libmythtv/dtvrecorder.h
@@ -18,6 +18,10 @@ using namespace std;
 #include "recorderbase.h"
 #include "H264Parser.h"
 
+extern "C" {
+#include "libavcodec/parser.h"
+}
+
 class MPEGStreamData;
 class TSPacket;
 class QTime;
@@ -132,6 +136,10 @@ class DTVRecorder :
     unsigned int _video_bytes_remaining;
     unsigned int _other_bytes_remaining;
 
+    // used for storing sequence header information
+    ParseContext1        *pc;
+    AVCodecParserContext *s;
+
     // H.264 support
     bool _pes_synced;
     bool _seen_sps;
@@ -169,6 +177,7 @@ class DTVRecorder :
     mutable unsigned long long _continuity_error_count;
     unsigned long long _frames_seen_count;
     unsigned long long _frames_written_count;
+    unsigned long long _duration;
 
     // constants
     /// If the number of regular frames detected since the last
diff --git a/mythtv/libs/libmythtv/mythcommflagplayer.cpp b/mythtv/libs/libmythtv/mythcommflagplayer.cpp
index 4f104b4..dc1a1b7 100644
--- a/mythtv/libs/libmythtv/mythcommflagplayer.cpp
+++ b/mythtv/libs/libmythtv/mythcommflagplayer.cpp
@@ -186,6 +186,7 @@ bool MythCommFlagPlayer::RebuildSeekTable(
         cout << "\r                         \r" << flush;
 
     SaveTotalDuration();
+    SaveTotalFrames();
 
     SetPlaying(false);
     killdecoder = true;
diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp
index 99fd103..297b478 100644
--- a/mythtv/libs/libmythtv/mythplayer.cpp
+++ b/mythtv/libs/libmythtv/mythplayer.cpp
@@ -4808,6 +4808,14 @@ void MythPlayer::ResetTotalDuration(void)
     decoder->ResetTotalDuration();
 }
 
+void MythPlayer::SaveTotalFrames(void)
+{
+    if (!decoder)
+        return;
+
+    decoder->SaveTotalFrames();
+}
+
 static unsigned dbg_ident(const MythPlayer *player)
 {
     static QMutex   dbg_lock;
diff --git a/mythtv/libs/libmythtv/mythplayer.h b/mythtv/libs/libmythtv/mythplayer.h
index 9434d7e..3cd8783 100644
--- a/mythtv/libs/libmythtv/mythplayer.h
+++ b/mythtv/libs/libmythtv/mythplayer.h
@@ -304,6 +304,8 @@ class MTV_PUBLIC MythPlayer
     void SaveTotalDuration(void);
     void ResetTotalDuration(void);
 
+    void SaveTotalFrames(void);
+
   protected:
     // Initialization
     void OpenDummy(void);
diff --git a/mythtv/libs/libmythtv/recorderbase.cpp b/mythtv/libs/libmythtv/recorderbase.cpp
index ed7c0e0..90a95be 100644
--- a/mythtv/libs/libmythtv/recorderbase.cpp
+++ b/mythtv/libs/libmythtv/recorderbase.cpp
@@ -454,6 +454,13 @@ void RecorderBase::SetDuration(uint64_t duration)
         curRecording->SaveTotalDuration(duration);
 }
 
+void RecorderBase::SetTotalFrames(uint64_t total_frames)
+{
+    if (curRecording)
+        curRecording->SaveTotalFrames(total_frames);
+}
+
+
 
 
 RecorderBase *RecorderBase::CreateRecorder(
diff --git a/mythtv/libs/libmythtv/recorderbase.h b/mythtv/libs/libmythtv/recorderbase.h
index 34a444d..c2f8635 100644
--- a/mythtv/libs/libmythtv/recorderbase.h
+++ b/mythtv/libs/libmythtv/recorderbase.h
@@ -248,6 +248,10 @@ class MTV_PUBLIC RecorderBase : public QRunnable
      */
     void SetDuration(uint64_t duration);
 
+    /** \brief Note the total frames in the recordedmark table
+     */
+    void SetTotalFrames(uint64_t total_frames);
+
     TVRec         *tvrec;
     RingBuffer    *ringBuffer;
     bool           weMadeBuffer;