Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Abierto Apto para principiantes
#193 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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 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.

Lenguaje dominante
JavaScript
Estrellas
89
Forks
60
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de videojs/mpd-parser

Todos los issues de videojs/mpd-parser

Issues similares

Más issues de JavaScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.