| 50 | } |
| 51 | |
| 52 | void SubtractFromTimeRanges(std::vector<TimeRange>* timeRanges, Frame startTime, Frame endTime) { |
| 53 | if (endTime < startTime) { |
| 54 | SplitTimeRangesAt(timeRanges, startTime); |
| 55 | return; |
| 56 | } |
| 57 | auto size = static_cast<int>(timeRanges->size()); |
| 58 | for (int i = size - 1; i >= 0; i--) { |
| 59 | auto timeRange = (*timeRanges)[i]; |
| 60 | if (timeRange.end < startTime || timeRange.start > endTime) { |
| 61 | // target outside timeRange |
| 62 | continue; |
| 63 | } |
| 64 | if (timeRange.start < startTime && timeRange.end > endTime) { |
| 65 | // target inside timeRange |
| 66 | TargetInsideTimeRange(timeRanges, i, startTime, endTime); |
| 67 | break; |
| 68 | } |
| 69 | if (timeRange.start >= startTime && timeRange.end <= endTime) { |
| 70 | // target contain timeRange |
| 71 | timeRanges->erase(timeRanges->begin() + i); |
| 72 | } else { |
| 73 | // target intersect timeRange |
| 74 | TargetIntersectTimeRange(timeRanges, i, startTime, endTime); |
| 75 | } |
| 76 | } |
| 77 | } |
| 78 | |
| 79 | void SplitTimeRangesAt(std::vector<TimeRange>* timeRanges, Frame startTime) { |
| 80 | auto size = static_cast<int>(timeRanges->size()); |
no test coverage detected