Skip to content

Commit f851e07

Browse files
JeromeMartinezdericed
authored andcommitted
Fix crash in case of big jumps in time codes
1 parent 28ecbe5 commit f851e07

File tree

1 file changed

+44
-3
lines changed

1 file changed

+44
-3
lines changed

Source/Common/Merge.cpp

+44-3
Original file line numberDiff line numberDiff line change
@@ -488,17 +488,58 @@ bool dv_merge_private::AppendFrameToList(size_t InputPos, const MediaInfo_Event_
488488
CurrentFrame.AbstBf = abst_bf(FrameData->AbstBf);
489489
CurrentFrame.Speed = GetDvSpeed(*FrameData);
490490
CurrentFrame.FullConcealed = coherency_flags(FrameData->Coherency_Flags).full_conceal();
491-
492-
// Time code jumps - after first frame
493491
timecode TC_Temp(FrameData);
494492
if (TC_Temp.HasValue())
495493
CurrentFrame.TC = TimeCode(TC_Temp.TimeInSeconds() / 3600, (TC_Temp.TimeInSeconds() / 60) % 60, TC_Temp.TimeInSeconds() % 60, TC_Temp.Frames(), 30 /*TEMP*/, TC_Temp.DropFrame());
494+
495+
// abst and Time code are missing
496+
if ((CurrentFrame.AbstBf.HasAbsoluteTrackNumberValue() || CurrentFrame.AbstBf.AbsoluteTrackNumber() == -1)
497+
&& (!CurrentFrame.TC.HasValue())
498+
)
499+
{
500+
// Impossible to sync, put all frames without sync elements in one segment
501+
if (!Frames.empty()
502+
&& ((Frames.back().AbstBf.HasAbsoluteTrackNumberValue() && Frames.back().AbstBf.AbsoluteTrackNumber() != -1)
503+
|| (Frames.back().TC.HasValue())
504+
)
505+
)
506+
{
507+
Input->Segments.resize(Input->Segments.size() + 1);
508+
Input->Segments.back().Frames.emplace_back(move(CurrentFrame));
509+
}
510+
else
511+
{
512+
Frames.emplace_back(move(CurrentFrame));
513+
}
514+
return false;
515+
}
516+
517+
// abst jumps - after first frame
518+
if (!Frames.empty()
519+
&& CurrentFrame.AbstBf.HasAbsoluteTrackNumberValue() && Frames.back().AbstBf.HasAbsoluteTrackNumberValue()
520+
&& CurrentFrame.AbstBf.AbsoluteTrackNumber() == -1 && Frames.back().AbstBf.AbsoluteTrackNumber() != -1
521+
&& (CurrentFrame.AbstBf.AbsoluteTrackNumber() < Frames.back().AbstBf.AbsoluteTrackNumber() // Back in the future of abst, very incoherent
522+
// || CurrentFrame.AbstBf.AbsoluteTrackNumber() - Frames.back().AbstBf.AbsoluteTrackNumber() > 300 // Arbitrary choice: if too big difference, we consider that this is very incoherent
523+
)
524+
)
525+
{
526+
Input->Segments.resize(Input->Segments.size() + 1);
527+
Input->Segments.back().Frames.emplace_back(move(CurrentFrame));
528+
return false;
529+
}
530+
531+
// Time code jumps - after first frame
496532
if (!Frames.empty() && Frames.back().TC.HasValue())
497533
{
498534
TimeCode TC_Previous(Frames.back().TC);
499535
if (CurrentFrame.TC.HasValue())
500536
{
501-
if (CurrentFrame.TC.ToFrames() < TC_Previous.ToFrames())
537+
if (CurrentFrame.TC.FramesPerSecond != TC_Previous.FramesPerSecond // Different config so it is another shot
538+
|| CurrentFrame.TC.FramesPerSecond_Is1001 != TC_Previous.FramesPerSecond_Is1001 // Different config so it is another shot
539+
|| CurrentFrame.TC.DropFrame != TC_Previous.DropFrame // Different config so it is another shot
540+
|| CurrentFrame.TC.ToFrames() < TC_Previous.ToFrames() // Back in the future so it is another shot
541+
// || CurrentFrame.TC.ToFrames() - TC_Previous.ToFrames() > 300 // Arbitrary choice: if too big difference, we consider that this is another shot
542+
)
502543
{
503544
Input->Segments.resize(Input->Segments.size() + 1);
504545
Input->Segments.back().Frames.emplace_back(move(CurrentFrame));

0 commit comments

Comments
 (0)