[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