[Avidemux-svn-commit] r5441 - branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor

mean at BerliOS mean at mail.berlios.de
Wed Nov 4 07:47:54 CET 2009


Author: mean
Date: 2009-11-04 07:47:54 +0100 (Wed, 04 Nov 2009)
New Revision: 5441

Modified:
   branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_edSearch.cpp
   branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_edVideoCopy.cpp
   branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_segment.cpp
   branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_segment.h
Log:
[Editor] Also switch segment when DTS limit is reached

Modified: branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_edSearch.cpp
===================================================================
--- branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_edSearch.cpp	2009-11-04 06:47:52 UTC (rev 5440)
+++ branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_edSearch.cpp	2009-11-04 06:47:54 UTC (rev 5441)
@@ -221,7 +221,7 @@
     // Search the frame with correct PTS
     uint64_t pts=segTime+s->_refStartTimeUs;
     uint64_t dts;
-    if(false==_segments.ptsFromDts(s->_reference,pts,&dts))
+    if(false==_segments.dtsFromPts(s->_reference,pts,&dts))
     {
         ADM_warning("Cannot get DTS from PTS=%"LLU"ms\n",pts/1000);
         return false;

Modified: branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_edVideoCopy.cpp
===================================================================
--- branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_edVideoCopy.cpp	2009-11-04 06:47:52 UTC (rev 5440)
+++ branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_edVideoCopy.cpp	2009-11-04 06:47:54 UTC (rev 5441)
@@ -74,15 +74,35 @@
     }
     // Need to switch seg ?
     tail=seg->_refStartTimeUs+seg->_durationUs;
-    ADM_info("Frame : Flags :%X, DTS:%"LLD" PTS=%"LLD" tail=%"LLD"\n",img->flags,img->demuxerDts/1000,img->demuxerPts/1000,tail);
+   // ADM_info("Frame : Flags :%X, DTS:%"LLD" PTS=%"LLD" tail=%"LLD"\n",img->flags,img->demuxerDts/1000,img->demuxerPts/1000,tail);
     if(img->demuxerDts!= ADM_NO_PTS && img->demuxerDts>=tail) goto nextSeg;
     if(img->demuxerPts!= ADM_NO_PTS && img->demuxerPts>=tail) goto nextSeg;
     {
-    // Recalibrate PTS & DTS...
-    recalibrate(&(img->demuxerPts),seg);
-    recalibrate(&(img->demuxerDts),seg);
+        // Recalibrate PTS & DTS...
+        recalibrate(&(img->demuxerPts),seg);
+        recalibrate(&(img->demuxerDts),seg);
     }
-    ADM_info("Frame after RECAL: Flags :%X, DTS:%"LLD" PTS=%"LLD" tail=%"LLD"\n",img->flags,img->demuxerDts/1000,img->demuxerPts/1000,tail);
+    // Check the DTS is not too late compared to next seg beginning...
+    if(_currentSegment+1<_segments.getNbSegments() && img->demuxerDts!=ADM_NO_PTS)
+    {
+        _SEGMENT *nextSeg=_segments.getSegment(_currentSegment+1);
+        int64_t nextDts=nextSeg->_startTimeUs+nextSeg->_refStartDts;
+        if(nextDts<nextSeg->_refStartTimeUs)
+        {
+            ADM_warning("next DTS is negative %"LLU" %"LLU" ms\n",nextDts,nextSeg->_refStartTimeUs);
+        }else       
+        {
+            nextDts-=nextSeg->_refStartTimeUs;
+            if(img->demuxerDts>=nextDts)
+            {
+                ADM_warning("have to switch segment, DTS limit reached %"LLU" %"LLU"\n",img->demuxerDts/1000,nextDts/1000);
+                goto nextSeg;
+            }
+        }
+
+
+    }
+   // ADM_info("Frame after RECAL: Flags :%X, DTS:%"LLD" PTS=%"LLD" tail=%"LLD"\n",img->flags,img->demuxerDts/1000,img->demuxerPts/1000,tail);
     return true;
 
 nextSeg:

Modified: branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_segment.cpp
===================================================================
--- branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_segment.cpp	2009-11-04 06:47:52 UTC (rev 5440)
+++ branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_segment.cpp	2009-11-04 06:47:54 UTC (rev 5441)
@@ -231,6 +231,18 @@
         segments[i]._startTimeUs=t;
         t+=segments[i]._durationUs;
     }
+    // Now set the _refStartDts field
+    for(int i=0;i<n;i++)
+    {
+        _VIDEOS *vid=getRefVideo(segments[i]._reference);
+        _SEGMENT *seg=getSegment(i);
+
+        uint64_t pts,dts;
+        pts=seg->_refStartTimeUs;
+        dtsFromPts(seg->_reference,pts,&dts);
+        seg->_refStartDts=dts;
+    }
+
     return true;
 }
 /**
@@ -451,15 +463,17 @@
         printf("\tReference    :%"LU"\n",s->_reference,us2plain(s->_reference));
         printf("\tstartLinear  :%08"LLU" %s\n",s->_startTimeUs,us2plain(s->_startTimeUs));
         printf("\tduration     :%08"LLU" %s\n",s->_durationUs,us2plain(s->_durationUs));
-        printf("\trefStart     :%08"LLU" %s\n",s->_refStartTimeUs,us2plain(s->_refStartTimeUs));
+        printf("\trefStartPts  :%08"LLU" %s\n",s->_refStartTimeUs,us2plain(s->_refStartTimeUs));
+        printf("\trefStartDts  :%08"LLU" %s\n",s->_refStartTimeUs,us2plain(s->_refStartDts));
 
     }
 }
+
 /**
-    \fn ptsFromDts
+    \fn dtsFromPts
     \brief guestimate DTS from PTS
 */
- bool        ADM_EditorSegment::ptsFromDts(uint32_t refVideo,uint64_t pts,uint64_t *dts)
+ bool        ADM_EditorSegment::dtsFromPts(uint32_t refVideo,uint64_t pts,uint64_t *dts)
 {
     uint32_t frame,flags;
     _VIDEOS *vid=getRefVideo(refVideo);

Modified: branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_segment.h
===================================================================
--- branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_segment.h	2009-11-04 06:47:52 UTC (rev 5440)
+++ branches/avidemux_2.6_branch_mean/avidemux/common/ADM_editor/ADM_segment.h	2009-11-04 06:47:54 UTC (rev 5441)
@@ -81,6 +81,7 @@
         uint64_t _startTimeUs; /// Start time in current (=sum(_duration of previous seg))
         uint64_t _durationUs; ///
         uint32_t _dropBframes;
+        uint64_t _refStartDts;
         
 } _SEGMENT;
 /*
@@ -133,7 +134,7 @@
             bool        isKeyFrameByTime(uint32_t refVideo,uint64_t seekTime);
 
             bool        removeChunk(uint64_t from, uint64_t to);
-            bool        ptsFromDts(uint32_t refVideo,uint64_t pts,uint64_t *dts);
+            bool        dtsFromPts(uint32_t refVideo,uint64_t pts,uint64_t *dts);
 };
 
 #endif




More information about the Avidemux-svn-commit mailing list