remotion-dev/remotion · error

Expected length of ${segmentId} to be greater or equal 0

Error message

Expected length of ${segmentId} to be greater or equal 0

What it means

parseSegment throws if the decoded size VInt is negative. VInts in EBML are unsigned, so a negative length indicates either a decoding bug in getVint (sign mishandling) or corrupted size bytes that produced an out-of-range integer. The segmentId is interpolated for diagnosis.

Source

Thrown at packages/media-parser/src/containers/webm/segments.ts:146

};

const parseSegment = async ({
	segmentId,
	length,
	iterator,
	headerReadSoFar,
	statesForProcessing,
	logLevel,
}: {
	segmentId: string;
	length: number;
	iterator: BufferIterator;
	headerReadSoFar: number;
	statesForProcessing: WebmRequiredStatesForProcessing | null;
	logLevel: MediaParserLogLevel;
}): Promise<MatroskaSegment | null> => {
	if (length < 0) {
		throw new Error(`Expected length of ${segmentId} to be greater or equal 0`);
	}

	iterator.counter.decrement(headerReadSoFar);

	const offset = iterator.counter.getOffset();
	const ebml = await parseEbml(iterator, statesForProcessing, logLevel);
	if (ebml === null) {
		return null;
	}

	if (!statesForProcessing) {
		return ebml;
	}

	const remapped = await postprocessEbml({
		offset,
		ebml,
		statesForProcessing,

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Re-download or re-mux the source ('ffmpeg -i in.mkv -c copy out.mkv').
  2. If reproducible only after an upgrade, pin/roll back @remotion/media-parser and report a VInt regression.
  3. Try Mediabunny.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  await parseMedia({src: 'in.mkv'});
} catch (err) {
  if (err instanceof Error && /Expected length of .* to be greater or equal 0/.test(err.message)) {
    throw new Error('Negative EBML size decoded; file is corrupt or reader returned bad bytes.', {cause: err});
  }
  throw err;
}

Prevention

When it happens

Trigger: Corrupted size octets in an EBML element header that decode to a value interpreted as negative by getVint, or a regression in VInt decoding for large widths. Reachable on any element parsed via parseSegment once the size is negative.

Common situations: Bit-flipped size bytes in storage/transfer, or files truncated so a size VInt spans EOF and yields garbage.

Related errors


AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12). Data as JSON: /api/errors/c3daad61f1c2e97e. Report an issue: GitHub.