Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

SegmentTemplate@endNumber is treated as a segment count, ignoring startNumber

Aperta Adatta ai principianti
#193 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
85/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
javascript
Ambito
backend

Direzione di ricerca

Inizia da src/segment/durationTimeParser.js, in particolare da segmentRange.static, segmentRange.dynamic e parseByDuration; l’issue descrive come viene usato l’intervallo restituito. Poi trova il test chiamato "parseByDuration uses endNumber and has correct duration" e aggiungi copertura per un startNumber non predefinito. Il lavoro è terminato quando il numero di segmenti generati e i numeri del primo e dell’ultimo segmento corrispondono ai risultati attesi per quel caso.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Description

segmentRange.static and segmentRange.dynamic (src/segment/durationTimeParser.js) return
end: endNumber. parseByDuration then generates range(start, end) and numbers each segment
startNumber + i.

DASH defines @endNumber as the number of the last segment, so the segment count is
endNumber - startNumber + 1. With a non-default startNumber, the parser generates the wrong
number of segments. With a large startNumber, it generates far too many.

The behaviour came in with endNumber support in #120. Its tests only use the default
startNumber of 1, where endNumber happens to equal the count.

Real-world impact: our packager numbers a thumbnail track in epoch seconds
(startNumber="179120790" endNumber="179121419", 630 segments). The parser tries to build 179
million segments.

  • Firefox: the page freezes for about 20 s and then the script dies from running out of memory.
  • Chrome: a RangeError is thrown.

We hit this through a third-party SDK that bundles mpd-parser.

Steps to reproduce

mpd-parser 1.4.0:

const { parse } = require('mpd-parser');
const mpd = (start, end) => `<?xml version="1.0"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" type="static" mediaPresentationDuration="PT100S" profiles="urn:mpeg:dash:profile:isoff-live:2011">
  <Period id="1" start="PT0S">
    <AdaptationSet mimeType="video/mp4" contentType="video">
      <SegmentTemplate timescale="1" duration="10" media="seg-$Number$.m4s" initialization="init.mp4" startNumber="${start}" endNumber="${end}"/>
      <Representation id="v1" bandwidth="1000000" width="640" height="360" codecs="avc1.4d401e"/>
    </AdaptationSet>
  </Period>
</MPD>`;
for (const [s, e] of [[1, 10], [1000, 1009]]) {
  const segs = parse(mpd(s, e), { manifestUri: 'https://example.com/manifest.mpd' }).playlists[0].segments;
  console.log(`startNumber=${s} endNumber=${e}: ${segs.length} segments, ${segs[0].uri} .. ${segs.at(-1).uri}`);
}

Results

Expected:

startNumber=1 endNumber=10: 10 segments, seg-1.m4s .. seg-10.m4s
startNumber=1000 endNumber=1009: 10 segments, seg-1000.m4s .. seg-1009.m4s

Actual:

startNumber=1 endNumber=10: 10 segments, seg-1.m4s .. seg-10.m4s
startNumber=1000 endNumber=1009: 1009 segments, seg-1000.m4s .. seg-2008.m4s

Suggested fix

static(attributes) {
  const { duration, timescale = 1, sourceDuration, periodDuration, startNumber = 1 } = attributes;
  const endNumber = parseEndNumber(attributes.endNumber);
  // ...
  if (typeof endNumber === 'number') {
    return { start: 0, end: endNumber - startNumber + 1 };
  }

Apply the same change in dynamic:
end: typeof endNumber === 'number' ? endNumber - startNumber + 1 : Math.min(...).

Also add a test with a non-default startNumber next to "parseByDuration uses endNumber and has
correct duration". Happy to open a PR.

Lingua principale
JavaScript
Stelle
89
Fork
60
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di videojs/mpd-parser

Tutte le issue di videojs/mpd-parser

Issue simili

Altre issue su JavaScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.