SegmentTemplate@endNumber is treated as a segment count, ignoring startNumber
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
RangeErroris 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
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di videojs/mpd-parser
-
The version of @xmldom/xmldom currently relied upon by mpd-parser has a critical vulnerability.Forse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 45/100
videojs/mpd-parser#189 · 1 commento ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 30/100
videojs/mpd-parser#185 · 1 commento ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 45/100
videojs/mpd-parser#183 ·
-
Multi audio trackApertaenhancement
Difficoltà 3/5 1-2 giorni Idoneità per principianti 30/100
videojs/mpd-parser#182 · 6 commenti ·
-
Uncaught TypeError: Cannot set properties of undefined (setting 'discontinuity')Forse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
videojs/mpd-parser#180 ·
Tutte le issue di videojs/mpd-parser
Issue simili
-
[Website] Catalog: unknown sort value and mixed-case technology in the URL break the filtersForse già presa @barbierajput378-pixel l’ha presa oggi. Apertaarea/website framework/jekyll help wanted language/css language/javascript language/markdown
Difficoltà 2/5 1-3 ore Idoneità per principianti 80/100
meshery/meshery.io#3088 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
firecrawl/firecrawl-mcp-server#548 ·
I maintainer di solito rispondono entro 1 giorno
-
Area:WebGL p5.js 2.0+
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
processing/p5.js#9302 ·
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
documentation good first issue hacktoberfest
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
wassim-azi/agy-powerline#47 ·
I maintainer di solito rispondono entro 1 giorno