OK, done...

this time the code  became really much shorter/clearer! :-)

The new picture_lookup_table just contains one entry per exported 
picture range... and no more export_flag! 

The logic in scanning the event list remained nearly the same
(but with fixed zero-START Bug) and the table is also used for file 
export. The only draw back is that we now also have to fill the capterlist
when updating the table, although it's only needed in FileExport(). But I 
don't wanted to duplicate the code for the filling of the chapterlist... 

ciao
Ralph



--- svn/ChangeLog	2007-10-30 15:14:10.000000000 +0100
+++ r98-exporttable/ChangeLog	2007-10-30 18:36:52.000000000 +0100
@@ -1,6 +1,12 @@
 2007-10-30  Ralph Glasstetter  <[EMAIL PROTECTED]>  (mr)
 
 	* src/dvbcut.cpp:
+	* src/dvbcut.h:
+        New quick_picture_lookup_table (also used for export)!
+        
+2007-10-30  Ralph Glasstetter  <[EMAIL PROTECTED]>  (mr)
+
+	* src/dvbcut.cpp:
 	* src/settings.cpp:
 	* src/settings.h:
 		Automatically add missing start/stop markers at BOF/EOF, 
@@ -22,7 +28,7 @@
 
 	* src/pts.cpp:
 	* src/pts.h:
-		Function to convert formatted timestamps to pts_t
+		Function to convert formatted timestamps to pts_t.
 
 2007-10-25  Michael Riepe  <[EMAIL PROTECTED]>
 
diff -Naur svn/src/dvbcut.cpp r98-exporttable/src/dvbcut.cpp
--- svn/src/dvbcut.cpp	2007-10-30 15:14:10.000000000 +0100
+++ r98-exporttable/src/dvbcut.cpp	2007-10-30 18:36:28.000000000 +0100
@@ -456,98 +456,21 @@
   // starting export, switch source to sequential mode
   buf.setsequential(true);
 
-  int startpic, stoppic;
-  int totalpics=0;
-  
-  if(settings().start_bof) 
-    startpic=0;
-  else
-    startpic=-1;
-
-  for(QListBoxItem *lbi=eventlist->firstItem();lbi;lbi=lbi->next())
-    if (lbi->rtti()==EventListItem::RTTI()) {
-      EventListItem &eli=(EventListItem&)*lbi;
-      switch (eli.geteventtype()) {
-	case EventListItem::start:
-	  if ((settings().start_bof && startpic<=0) || 
-          (!settings().start_bof && startpic<0)) {
-	    startpic=eli.getpicture();
-	  }
-	  break;
-	case EventListItem::stop:
-	  if (startpic>=0) {
-	    stoppic=eli.getpicture();
-	    totalpics+=stoppic-startpic;
-	    startpic=-1;
-	  }
-	  break;
-	default:
-	  break;
-      }
-    }
-  // stop event missing after start (or no start/stop at all)
-  if(settings().stop_eof && startpic>=0) {
-    stoppic=pictures-1;
-    totalpics+=stoppic-startpic;
-  }
+  int startpic, stoppic, savedpic=0;
+  pts_t startpts=(*mpg)[0].getpts(), stoppts, savedtime=0;
 
-  int savedpic=0;
-  long long savedtime=0;
-  pts_t startpts=(*mpg)[0].getpts(), stoppts;
-  std::list<pts_t> chapterlist;
-  chapterlist.push_back(0);
+  for(unsigned int num=0; num<quick_picture_lookup.size(); num++) {
+      startpic=quick_picture_lookup[num].startpicture;
+      startpts=quick_picture_lookup[num].startpts;
+      stoppic=quick_picture_lookup[num].stoppicture;
+      stoppts=quick_picture_lookup[num].stoppts;
+      
+      log->printheading("%d. Exporting %d pictures: %s .. %s",
+			num+1,stoppic-startpic,ptsstring(startpts).c_str(),ptsstring(stoppts).c_str());
+      mpg->savempg(*mux,startpic,stoppic,savedpic,quick_picture_lookup.back().outpicture,log);
 
-  if (totalpics > 0) {
-    if(settings().start_bof) 
-      startpic=0;
-    else
-      startpic=-1;
-
-    for(QListBoxItem *lbi=eventlist->firstItem();lbi && (nogui || !prgwin->cancelled());lbi=lbi->next())
-      if (lbi->rtti()==EventListItem::RTTI()) {
-	EventListItem &eli=(EventListItem&)*lbi;
-
-	switch (eli.geteventtype()) {
-	  case EventListItem::start:
-	    if ((settings().start_bof && startpic<=0) || 
-            (!settings().start_bof && startpic<0)) {
-	      startpic=eli.getpicture();
-	      startpts=(*mpg)[startpic].getpts();
-	    }
-	    break;
-	  case EventListItem::stop:
-	    if (startpic>=0) {
-	      stoppic=eli.getpicture();
-	      stoppts=(*mpg)[stoppic].getpts();
-	      log->printheading("Exporting %d pictures: %s .. %s",
-				stoppic-startpic,ptsstring(startpts-firstpts).c_str(),ptsstring(stoppts-firstpts).c_str());
-	      mpg->savempg(*mux,startpic,stoppic,savedpic,totalpics,log);
-	      savedpic+=stoppic-startpic;
-	      savedtime+=stoppts-startpts;
-	      startpic=-1;
-	    }
-	    break;
-	  case EventListItem::chapter:
-	    if (startpic==-1)
-	      chapterlist.push_back(savedtime);
-	    else
-	      chapterlist.push_back((*mpg)[eli.getpicture()].getpts()-startpts+savedtime);
-	    break;
-	  case EventListItem::none:
-	  case EventListItem::bookmark:
-	    break;
-	}
-      }
-
-    if(settings().stop_eof && startpic>=0) {
-      stoppic=pictures-1;
-      stoppts=(*mpg)[stoppic].getpts();
-      log->printheading("Exporting %d pictures: %s .. %s",
-			stoppic-startpic,ptsstring(startpts-firstpts).c_str(),ptsstring(stoppts-firstpts).c_str());
-      mpg->savempg(*mux,startpic,stoppic,savedpic,totalpics,log);
-      savedpic+=stoppic-startpic;
-      savedtime+=stoppts-startpts;
-    }
+      savedpic=quick_picture_lookup[num].outpicture;
+      savedtime=quick_picture_lookup[num].outpts;
   }
 
   mux.reset();
@@ -650,6 +573,7 @@
 void dvbcut::editChapter()
 {
   addEventListItem(curpic, EventListItem::chapter);
+  update_quick_picture_lookup_table();
 }
 
 
@@ -704,7 +628,6 @@
     } 
   if(found) {
     addStartStopItems(cutlist);
-    update_quick_picture_lookup_table();
 
     if(found%2) 
       statusBar()->message(QString("*** No matching stop marker!!! ***"));
@@ -1042,8 +965,7 @@
       {
       EventListItem::eventtype type=eli.geteventtype();
       delete lbi;
-      if (type==EventListItem::start || type==EventListItem::stop)
-        update_quick_picture_lookup_table();
+      if (type!=EventListItem::bookmark) update_quick_picture_lookup_table();
       }
       break;
 
@@ -1077,7 +999,7 @@
           delete current;
         current=next;
       }       
-      if (cmptype==EventListItem::start) update_quick_picture_lookup_table();
+      if (cmptype!=EventListItem::bookmark) update_quick_picture_lookup_table();
       break;
 
     case 8:
@@ -1092,6 +1014,7 @@
 
     case 10:
       eli.seteventtype(EventListItem::chapter);
+      update_quick_picture_lookup_table();
       break;
 
     case 11: 
@@ -1148,7 +1071,7 @@
     quick_picture_lookup_t::iterator it=
       std::upper_bound(quick_picture_lookup.begin(),quick_picture_lookup.end(),outpic,quick_picture_lookup_s::cmp_outpicture());
     --it;
-    inpic=outpic-it->outpicture+it->picture;   
+    inpic=outpic-it->outpicture+it->stoppicture;   
     fine=true;
     linslider->setValue(inpic);
     fine=false;
@@ -1882,18 +1805,16 @@
    {
      // curpic is not before the first entry of the table
      --it;
-     if (it->export_flag && it!=(quick_picture_lookup.end()-1))
+     if (curpic < it->stoppicture)
      {
-       // the corresponding entry says export_flag==true,
-       // so this pic is after a START entry and is going to
-       // be exported (But ONLY if it's not the last entry!).
-       
-       outpic=curpic-it->picture+it->outpicture;
-       outpts=pts-it->pts+it->outpts;
+       // curpic is between (START and STOP[ pics of the current entry
+       outpic=curpic-it->stoppicture+it->outpicture;
+       outpts=pts-it->stoppts+it->outpts;
        mark = '*';
      }
      else
      {
+       // curpic is after the STOP-1 pic of the current entry
        outpic=it->outpicture;
        outpts=it->outpts;
      }
@@ -1912,10 +1833,16 @@
   }
 
 void dvbcut::update_quick_picture_lookup_table() {
-  quick_picture_lookup.clear();
+  // that's the (only) place where the event list should be scanned for  
+  // the exported pictures ranges, i.e. for START/STOP/CHAPTER markers!
+  quick_picture_lookup.clear(); 
+  chapterlist.clear();
+  
+  chapterlist.push_back(0);
     
   int startpic, stoppic, outpics=0;
   pts_t startpts, stoppts, outpts=0;
+  bool realzero=false;
   
   if(settings().start_bof) {
     startpic=0;
@@ -1931,44 +1858,44 @@
     const EventListItem &eli=*static_cast<const EventListItem*>(item);
     switch (eli.geteventtype()) {
       case EventListItem::start:
-	    if ((settings().start_bof && startpic<=0) || 
-            (!settings().start_bof && startpic<0)) {
+	    if (startpic<0 || (settings().start_bof && startpic==0 && !realzero)) {
           startpic=eli.getpicture();
           startpts=eli.getpts();
-          
-          quick_picture_lookup.push_back(quick_picture_lookup_s(startpic,true,startpts,outpics,outpts));
+          if(startpic==0) realzero=true;        
         }
         break;
       case EventListItem::stop:
         if (startpic>=0) {
-          // add a virtual START marker at BOF if missing
-          if(quick_picture_lookup.empty()) 
-            quick_picture_lookup.push_back(quick_picture_lookup_s(startpic,true,startpts,outpics,outpts));
-
           stoppic=eli.getpicture();
-          stoppts=eli.getpts();
-          
+          stoppts=eli.getpts();        
           outpics+=stoppic-startpic;
           outpts+=stoppts-startpts;
-          quick_picture_lookup.push_back(quick_picture_lookup_s(stoppic,false,stoppts,outpics,outpts));
+          
+          quick_picture_lookup.push_back(quick_picture_lookup_s(startpic,startpts,stoppic,stoppts,outpics,outpts));
+
           startpic=-1;
         }
         break;
+	  case EventListItem::chapter:
+	    if (startpic<=0)
+	      chapterlist.push_back(outpts);
+	    else
+	      chapterlist.push_back(eli.getpts()-startpts+outpts);
+	    break;
       default:
         break;
       }
     }
 
+  // last item in list was a (real or virtual) START
   if(settings().stop_eof && startpic>=0) {
-    if(quick_picture_lookup.empty())  // also missing START marker!
-      quick_picture_lookup.push_back(quick_picture_lookup_s(startpic,true,startpts,outpics,outpts));
-
-    // add a virtual STOP marker at EOF if missing
-    stoppic=pictures-1;
-    stoppts=(*mpg)[stoppic].getpts()-firstpts;
-    outpics+=stoppic-startpic;
-    outpts+=stoppts-startpts;
-    quick_picture_lookup.push_back(quick_picture_lookup_s(stoppic,false,stoppts,outpics,outpts)); 
+      // create a new export range by adding a virtual STOP marker at EOF 
+      stoppic=pictures-1;
+      stoppts=(*mpg)[stoppic].getpts()-firstpts;
+      outpics+=stoppic-startpic;
+      outpts+=stoppts-startpts;
+      
+      quick_picture_lookup.push_back(quick_picture_lookup_s(startpic,startpts,stoppic,stoppts,outpics,outpts)); 
   }
   
   update_time_display();
diff -Naur svn/src/dvbcut.h r98-exporttable/src/dvbcut.h
--- svn/src/dvbcut.h	2007-10-29 15:29:59.000000000 +0100
+++ r98-exporttable/src/dvbcut.h	2007-10-30 17:49:29.000000000 +0100
@@ -39,14 +39,15 @@
 public:
   struct quick_picture_lookup_s
   {
-    int picture;
-    bool export_flag;
-    pts_t pts;
+    int startpicture;
+    pts_t startpts;
+    int stoppicture;
+    pts_t stoppts;
     int outpicture;
     pts_t outpts;
 
-    quick_picture_lookup_s(int _picture, bool _export_flag, pts_t _pts, int _outpicture, pts_t _outpts) :
-      picture(_picture), export_flag(_export_flag), pts(_pts), outpicture(_outpicture), outpts(_outpts)
+    quick_picture_lookup_s(int _startpicture, pts_t _startpts, int _stoppicture, pts_t _stoppts, int _outpicture, pts_t _outpts) :
+      startpicture(_startpicture), startpts(_startpts), stoppicture(_stoppicture), stoppts(_stoppts), outpicture(_outpicture), outpts(_outpts)
     {
     }
 
@@ -54,7 +55,7 @@
     {
       bool operator()(int lhs, const quick_picture_lookup_s &rhs) const
       {
-        return lhs<rhs.picture;
+        return lhs<rhs.startpicture;
       }
     };
     struct cmp_outpicture
@@ -69,6 +70,7 @@
   
 protected:
   quick_picture_lookup_t quick_picture_lookup;
+  std::list<pts_t> chapterlist;
 
   QPopupMenu *audiotrackpopup,*recentfilespopup;
   int audiotrackmenuid;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
DVBCUT-user mailing list
DVBCUT-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dvbcut-user

Reply via email to