SegmentTemplate@endNumber is treated as a segment count, ignoring startNumber
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 85/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- javascript
- Área
- backend
Línea de trabajo
Empieza por src/segment/durationTimeParser.js, especialmente por segmentRange.static, segmentRange.dynamic y parseByDuration; el issue describe cómo se usa el rango devuelto. Luego busca la prueba llamada "parseByDuration uses endNumber and has correct duration" y añade cobertura para un startNumber no predeterminado. La tarea está terminada cuando la cantidad de segmentos generados y los números del primer y último segmento coincidan con los resultados esperados para ese caso.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
- Lenguaje dominante
- JavaScript
- Estrellas
- 89
- Forks
- 60
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de videojs/mpd-parser
-
The version of @xmldom/xmldom currently relied upon by mpd-parser has a critical vulnerability.Posiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 45/100
videojs/mpd-parser#189 · 1 comentario ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 30/100
videojs/mpd-parser#185 · 1 comentario ·
-
Accessing availabilityStartTimeAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 45/100
videojs/mpd-parser#183 ·
-
Multi audio trackAbiertoenhancement
Dificultad 3/5 1-2 días Aptitud para principiantes 30/100
videojs/mpd-parser#182 · 6 comentarios ·
-
Uncaught TypeError: Cannot set properties of undefined (setting 'discontinuity')Quizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
videojs/mpd-parser#180 ·
Todos los issues de videojs/mpd-parser
Issues similares
-
documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
andromarces/agent-loops#886 ·
Los mantenedores suelen responder en 1 día
-
bug effort:low model:light plan planner:gpt-6-1-sol tests
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
B: visual
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
FreeTubeApp/FreeTube#9929 ·
Los mantenedores suelen responder en 1 día
-
🐛 Bug: `--clear-screen` not very useful (at least not for dealing with large test/error output)Abiertostatus: in triage type: bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
mochajs/mocha#6428 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
supabase/supabase-js#2768 ·
Los mantenedores suelen responder en 1 día