@@ -206,4 +206,89 @@ describe('File Segmentation', () => {
206206 expect ( newMP4 . getBoxes ( 'moof' , false ) . length ) . toBe ( 10 ) ;
207207 expect ( out . getAbsoluteEndPosition ( ) ) . toBe ( 203_175 ) ;
208208 } ) ;
209+
210+ it ( 'resets segmentation state on seek' , async ( ) => {
211+ const { testFile } = getFilePath ( 'isobmff' , '01_simple.mp4' ) ;
212+ const { mp4 } = await loadAndGetInfo ( testFile , true , true ) ;
213+
214+ mp4 . setSegmentOptions ( 201 , undefined , {
215+ nbSamples : 100 ,
216+ nbSamplesPerFragment : 50 ,
217+ rapAlignement : false ,
218+ } ) ;
219+ mp4 . initializeSegmentation ( ) ;
220+ mp4 . onSegment = ( ) => undefined ;
221+
222+ mp4 . start ( ) ;
223+
224+ const fragTrack = mp4 . fragmentedTracks . find ( track => track . id === 201 ) ;
225+ expect ( fragTrack ) . toBeDefined ( ) ;
226+ if ( ! fragTrack ) {
227+ throw new Error ( 'Missing fragmented track #201' ) ;
228+ }
229+
230+ mp4 . seek ( 0 , false ) ;
231+
232+ expect ( fragTrack . state . lastFragmentSampleNumber ) . toBe ( fragTrack . trak . nextSample ) ;
233+ expect ( fragTrack . state . lastSegmentSampleNumber ) . toBe ( fragTrack . trak . nextSample ) ;
234+ expect ( fragTrack . state . accumulatedSize ) . toBe ( 0 ) ;
235+ expect ( fragTrack . segmentStream ) . toBeUndefined ( ) ;
236+ expect ( ( ) => mp4 . start ( ) ) . not . toThrow ( ) ;
237+ } ) ;
238+
239+ it ( 'resets segmentation state on forward seek before processing' , async ( ) => {
240+ const { testFile } = getFilePath ( 'isobmff' , '01_simple.mp4' ) ;
241+ const { mp4 } = await loadAndGetInfo ( testFile , true , true ) ;
242+
243+ mp4 . setSegmentOptions ( 201 , undefined , {
244+ nbSamples : 100 ,
245+ nbSamplesPerFragment : 50 ,
246+ rapAlignement : false ,
247+ } ) ;
248+ mp4 . initializeSegmentation ( ) ;
249+
250+ const fragTrack = mp4 . fragmentedTracks . find ( track => track . id === 201 ) ;
251+ expect ( fragTrack ) . toBeDefined ( ) ;
252+ if ( ! fragTrack ) {
253+ throw new Error ( 'Missing fragmented track #201' ) ;
254+ }
255+
256+ mp4 . seek ( 3 , false ) ;
257+
258+ expect ( fragTrack . trak . nextSample ) . toBeGreaterThan ( 0 ) ;
259+ expect ( fragTrack . state . lastFragmentSampleNumber ) . toBe ( fragTrack . trak . nextSample ) ;
260+ expect ( fragTrack . state . lastSegmentSampleNumber ) . toBe ( fragTrack . trak . nextSample ) ;
261+ expect ( fragTrack . state . accumulatedSize ) . toBe ( 0 ) ;
262+ expect ( fragTrack . segmentStream ) . toBeUndefined ( ) ;
263+ } ) ;
264+
265+ it ( 'resets segmentation state on backward seek after a forward seek' , async ( ) => {
266+ const { testFile } = getFilePath ( 'isobmff' , '01_simple.mp4' ) ;
267+ const { mp4 } = await loadAndGetInfo ( testFile , true , true ) ;
268+
269+ mp4 . setSegmentOptions ( 201 , undefined , {
270+ nbSamples : 100 ,
271+ nbSamplesPerFragment : 50 ,
272+ rapAlignement : false ,
273+ } ) ;
274+ mp4 . initializeSegmentation ( ) ;
275+
276+ const fragTrack = mp4 . fragmentedTracks . find ( track => track . id === 201 ) ;
277+ expect ( fragTrack ) . toBeDefined ( ) ;
278+ if ( ! fragTrack ) {
279+ throw new Error ( 'Missing fragmented track #201' ) ;
280+ }
281+
282+ mp4 . seek ( 3 , false ) ;
283+ const forwardSample = fragTrack . trak . nextSample ;
284+ expect ( forwardSample ) . toBeGreaterThan ( 0 ) ;
285+
286+ mp4 . seek ( 0 , false ) ;
287+
288+ expect ( fragTrack . trak . nextSample ) . toBeLessThan ( forwardSample ) ;
289+ expect ( fragTrack . state . lastFragmentSampleNumber ) . toBe ( fragTrack . trak . nextSample ) ;
290+ expect ( fragTrack . state . lastSegmentSampleNumber ) . toBe ( fragTrack . trak . nextSample ) ;
291+ expect ( fragTrack . state . accumulatedSize ) . toBe ( 0 ) ;
292+ expect ( fragTrack . segmentStream ) . toBeUndefined ( ) ;
293+ } ) ;
209294} ) ;
0 commit comments