@@ -488,17 +488,58 @@ bool dv_merge_private::AppendFrameToList(size_t InputPos, const MediaInfo_Event_
488
488
CurrentFrame.AbstBf = abst_bf (FrameData->AbstBf );
489
489
CurrentFrame.Speed = GetDvSpeed (*FrameData);
490
490
CurrentFrame.FullConcealed = coherency_flags (FrameData->Coherency_Flags ).full_conceal ();
491
-
492
- // Time code jumps - after first frame
493
491
timecode TC_Temp (FrameData);
494
492
if (TC_Temp.HasValue ())
495
493
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
496
532
if (!Frames.empty () && Frames.back ().TC .HasValue ())
497
533
{
498
534
TimeCode TC_Previous (Frames.back ().TC );
499
535
if (CurrentFrame.TC .HasValue ())
500
536
{
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
+ )
502
543
{
503
544
Input->Segments .resize (Input->Segments .size () + 1 );
504
545
Input->Segments .back ().Frames .emplace_back (move (CurrentFrame));
0 commit comments