---------------------------------------------------------------------------
| 636 | |
| 637 | //--------------------------------------------------------------------------- |
| 638 | int TimeCode::FromFrames(uint64_t Frames) |
| 639 | { |
| 640 | uint64_t Dropped = IsDropFrame() ? (1 + GetFramesMax() / 30) : 0; |
| 641 | uint64_t FrameRate = (uint64_t)GetFramesMax() + 1; |
| 642 | uint64_t Dropped2 = Dropped * 2; |
| 643 | uint64_t Dropped18 = Dropped * 18; |
| 644 | |
| 645 | uint64_t Minutes_Tens = ((uint64_t)Frames) / (600 * FrameRate - Dropped18); //Count of 10 minutes |
| 646 | uint64_t Minutes_Units = (Frames - Minutes_Tens * (600 * FrameRate - Dropped18)) / (60 * FrameRate - Dropped2); |
| 647 | |
| 648 | Frames += Dropped18 * Minutes_Tens + Dropped2 * Minutes_Units; |
| 649 | if (Minutes_Units && !((Frames / FrameRate) % 60) && (Frames % FrameRate) < Dropped2) // If Minutes_Tens is not 0 (drop) but count of remaining seconds is 0 and count of remaining frames is less than 2, 1 additional drop was actually counted, removing it |
| 650 | Frames -= Dropped2; |
| 651 | |
| 652 | int64_t HoursTemp = Frames / (FrameRate * 3600); |
| 653 | if (HoursTemp >= 24 && IsWrapped24Hours()) |
| 654 | HoursTemp %= 24; |
| 655 | else if (HoursTemp > numeric_limits<uint32_t>::max()) |
| 656 | { |
| 657 | *this = TimeCode(); |
| 658 | return 1; |
| 659 | } |
| 660 | SetHours(HoursTemp); |
| 661 | SetNegative(false); |
| 662 | SetValid(); |
| 663 | auto TotalSeconds = Frames / FrameRate; |
| 664 | SetMinutes((TotalSeconds / 60) % 60); |
| 665 | SetSeconds(TotalSeconds % 60); |
| 666 | SetFrames((uint32_t)(Frames % FrameRate)); |
| 667 | |
| 668 | return 0; |
| 669 | } |
| 670 | |
| 671 | //--------------------------------------------------------------------------- |
| 672 | int TimeCode::FromFrames(int64_t Frames) |