remotion-dev/remotion · error · Error

Does not PMT table with more than 1 entry, uncommon

Error message

Does not PMT table with more than 1 entry, uncommon

What it means

Thrown at parse-pmt.ts:63 when parsePmtTable produces a tables array whose length is not exactly 1. The loop runs from sectionNumber to lastSectionNumber inclusive, so a multi-section PMT (lastSectionNumber > sectionNumber) yields more than one entry and trips the guard. The library assumes a single-section PMT, which covers the vast majority of real-world streams.

Source

Thrown at packages/media-parser/src/containers/transport-stream/parse-pmt.ts:63

			iterator.getBits(4); // reserved
			const esInfoLength = iterator.getBits(12);
			iterator.getBits(esInfoLength * 8);
			streams.push({streamType, pid: elementaryPid});

			const remaining = sectionLength - (iterator.counter.getOffset() - start);
			if (remaining <= 4) {
				break;
			}
		}

		tables.push({
			type: 'transport-stream-program-map-table',
			streams,
		});
	}

	if (tables.length !== 1) {
		throw new Error('Does not PMT table with more than 1 entry, uncommon');
	}

	iterator.stopReadingBits();

	return {
		type: 'transport-stream-pmt-box',
		tableId,
		streams: tables[0].streams,
	};
};

export const parsePmt = (iterator: BufferIterator): TransportStreamPMTBox => {
	iterator.startReadingBits();

	const tableId = iterator.getBits(8);
	iterator.getBits(1); // syntax indicator
	iterator.getBits(1); // private bit
	iterator.getBits(4);

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Re-mux to a single-section PMT: ffmpeg -i in.ts -c copy out.ts.
  2. If you genuinely need multi-section PMT support, file a feature request on @remotion/media-parser with the sample.
  3. Transcode to a different container (MP4, MKV) that does not segment program maps.
  4. Verify the PMT section_number/last_section_number with dvbsnoop.
Defensive patterns

Strategy: validation

Validate before calling

// Reject multi-section PMTs upstream by checking last_section_number
// Not directly exposed by ffprobe; rely on re-mux to collapse to single-section.
function normalizePmt(src: string): string {
  const out = src + '.remux.ts';
  execSync(`ffmpeg -y -i "${src}" -c copy "${out}"`);
  return out;
}

Try / catch

try { await parseMedia({src}); }
catch (e) { if (e instanceof Error && e.message === 'Does not PMT table with more than 1 entry, uncommon') { const norm = remux(src); await parseMedia({src: norm}); } else throw e; }

Prevention

When it happens

Trigger: parsePmtTable pushes one entry per iteration of the sectionNumber..lastSectionNumber loop; if that range spans more than one value, tables.length > 1 and the guard fires. Triggered by multi-section PMTs (rare in practice) or by corruption that inflates lastSectionNumber.

Common situations: Streams from unusual broadcast muxers that segment the PMT; corrupt PMT section headers; theoretical edge cases the library has chosen not to support yet.

Related errors


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