mirror of
https://github.com/zoriya/v10.git
synced 2026-08-16 02:45:09 +00:00
feat(spf): relocate non-zero-PTS sources to a 0-based timeline (VOD) (#1847)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
5cb93c1701
commit
7fdc255901
@@ -1,6 +1,12 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import type { Segment } from '../../types';
|
||||
import { calculateForwardFlushPoint, DEFAULT_FORWARD_BUFFER_CONFIG, getSegmentsToLoad } from '../forward-buffer';
|
||||
import {
|
||||
calculateForwardFlushPoint,
|
||||
DEFAULT_FORWARD_BUFFER_CONFIG,
|
||||
getSegmentsToLoad,
|
||||
isTimeRangeCovered,
|
||||
mergeTimeRanges,
|
||||
} from '../forward-buffer';
|
||||
|
||||
// Helper to create test segments
|
||||
const createSegment = (startTime: number, duration: number): Segment => ({
|
||||
@@ -10,6 +16,83 @@ const createSegment = (startTime: number, duration: number): Segment => ({
|
||||
duration,
|
||||
});
|
||||
|
||||
describe('mergeTimeRanges', () => {
|
||||
it('merges contiguous ranges into one', () => {
|
||||
expect(
|
||||
mergeTimeRanges([
|
||||
{ start: 0, end: 7.13333 },
|
||||
{ start: 7.13333, end: 15.13333 },
|
||||
])
|
||||
).toEqual([{ start: 0, end: 15.13333 }]);
|
||||
});
|
||||
|
||||
it('merges overlapping ranges, taking the max end', () => {
|
||||
// A misaligned switch leaves overlapping model entries (low 7.13..15.13, high 7.98..15.98).
|
||||
expect(
|
||||
mergeTimeRanges([
|
||||
{ start: 0, end: 7.13333 },
|
||||
{ start: 7.13333, end: 15.13333 },
|
||||
{ start: 7.98333, end: 15.98333 },
|
||||
])
|
||||
).toEqual([{ start: 0, end: 15.98333 }]);
|
||||
});
|
||||
|
||||
it('keeps genuinely disjoint ranges separate (post-seek gap)', () => {
|
||||
expect(
|
||||
mergeTimeRanges([
|
||||
{ start: 0, end: 10 },
|
||||
{ start: 30, end: 40 },
|
||||
])
|
||||
).toEqual([
|
||||
{ start: 0, end: 10 },
|
||||
{ start: 30, end: 40 },
|
||||
]);
|
||||
});
|
||||
|
||||
it('drops empty/inverted ranges and sorts', () => {
|
||||
expect(
|
||||
mergeTimeRanges([
|
||||
{ start: 20, end: 30 },
|
||||
{ start: 5, end: 5 },
|
||||
{ start: 0, end: 10 },
|
||||
])
|
||||
).toEqual([
|
||||
{ start: 0, end: 10 },
|
||||
{ start: 20, end: 30 },
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isTimeRangeCovered', () => {
|
||||
const merged = [{ start: 0, end: 15.13333 }];
|
||||
|
||||
it('true when fully contained', () => {
|
||||
expect(isTimeRangeCovered(0, 7.98333, merged)).toBe(true);
|
||||
});
|
||||
|
||||
it('false when the tail extends past coverage (straddling segment)', () => {
|
||||
// high segment-1 (7.98333..15.98333) against a buffer ending at 15.13333.
|
||||
expect(isTimeRangeCovered(7.98333, 15.98333, merged)).toBe(false);
|
||||
});
|
||||
|
||||
it('false when starting past coverage', () => {
|
||||
expect(isTimeRangeCovered(15.98333, 23.98333, merged)).toBe(false);
|
||||
});
|
||||
|
||||
it('tolerates sub-epsilon overhang at the edges', () => {
|
||||
expect(isTimeRangeCovered(-0.00005, 15.13338, merged)).toBe(true);
|
||||
});
|
||||
|
||||
it('requires a single range to contain it (not spanning a gap)', () => {
|
||||
expect(
|
||||
isTimeRangeCovered(5, 35, [
|
||||
{ start: 0, end: 10 },
|
||||
{ start: 30, end: 40 },
|
||||
])
|
||||
).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('calculateForwardFlushPoint', () => {
|
||||
it('returns Infinity when no segments are buffered', () => {
|
||||
expect(calculateForwardFlushPoint([], 0)).toBe(Infinity);
|
||||
|
||||
Reference in New Issue
Block a user