{"record":{"id":"7cc2b1319ef4dbb5","repo":"remotion-dev/remotion","slug":"invalid-adts-header-too-short","errorCode":null,"errorMessage":"Invalid ADTS header - too short","messagePattern":"Invalid ADTS header - too short","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/media-parser/src/containers/transport-stream/handle-aac-packet.ts","lineNumber":38,"sourceCode":"\toffset,\n\tsampleCallbacks,\n\tlogLevel,\n\tonAudioTrack,\n\ttransportStream,\n\tmakeSamplesStartAtZero,\n}: {\n\tstreamBuffer: TransportStreamPacketBuffer;\n\tprogramId: number;\n\toffset: number;\n\tsampleCallbacks: CallbacksState;\n\tlogLevel: MediaParserLogLevel;\n\tonAudioTrack: MediaParserOnAudioTrack | null;\n\ttransportStream: TransportStreamState;\n\tmakeSamplesStartAtZero: boolean;\n}) => {\n\tconst adtsHeader = readAdtsHeader(streamBuffer.getBuffer());\n\tif (!adtsHeader) {\n\t\tthrow new Error('Invalid ADTS header - too short');\n\t}\n\n\tconst {channelConfiguration, codecPrivate, sampleRate, audioObjectType} =\n\t\tadtsHeader;\n\n\tconst isTrackRegistered = sampleCallbacks.tracks.getTracks().find((t) => {\n\t\treturn t.trackId === programId;\n\t});\n\n\tif (!isTrackRegistered) {\n\t\tconst startOffset = makeSamplesStartAtZero\n\t\t\t? Math.min(\n\t\t\t\t\tstreamBuffer.pesHeader.pts,\n\t\t\t\t\tstreamBuffer.pesHeader.dts ?? Infinity,\n\t\t\t\t)\n\t\t\t: 0;\n\t\ttransportStream.startOffset.setOffset({\n\t\t\ttrackId: programId,","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/media-parser/src/containers/transport-stream/handle-aac-packet.ts#L20-L56","documentation":"Thrown by handle-aac-packet.ts when readAdtsHeader() returns null. readAdtsHeader returns null only when buffer.byteLength < 9 (the minimum ADTS header size), so this throw means the AAC packet buffer was too short to even attempt a header parse.","triggerScenarios":"An AAC PES payload shorter than 9 bytes fed to handleAacPacket — e.g. a truncated TS packet, a fragmented PES that has not been reassembled, or a misrouted non-AAC packet.","commonSituations":"Truncated network reads of TS; partial PES reassembly; corrupt TS where the payload length is wrong; very short padding packets routed as AAC.","solutions":["Ensure the full TS packet (188 bytes) and complete PES payload are buffered before invoking the AAC handler.","Re-mux or re-encode the TS: ffmpeg -i in.ts -c copy out.ts or ffmpeg -i in.ts -c:a aac out.ts.","Add a length pre-check (>= 9 bytes) and skip short packets instead of throwing."],"exampleFix":"// before\nconst adtsHeader = readAdtsHeader(streamBuffer.getBuffer());\nif (!adtsHeader) throw new Error('Invalid ADTS header - too short');\n\n// after: skip short buffers gracefully\nif (streamBuffer.getBuffer().byteLength < 9) return null; // wait for / skip","handlingStrategy":"validation","validationCode":"// Require at least 9 bytes (minimum ADTS header) before invoking the AAC handler.\nconst ADTS_MIN_LEN = 9;\nif (streamBuffer.getBuffer().byteLength < ADTS_MIN_LEN) {\n  // wait for more data / skip the short packet\n  return null;\n}","typeGuard":"function isLongEnoughForAdts(buf: Uint8Array): boolean {\n  return buf.byteLength >= 9;\n}","tryCatchPattern":"try {\n  const hdr = readAdtsHeader(streamBuffer.getBuffer());\n  if (!hdr) throw new Error('Invalid ADTS header - too short');\n} catch (err) {\n  if (err instanceof Error && err.message === 'Invalid ADTS header - too short') {\n    // buffer short: wait for full PES / skip packet\n  } else throw err;\n}","preventionTips":["Buffer the full TS packet and complete PES payload before invoking the AAC handler.","Skip packets shorter than 9 bytes instead of throwing.","Re-mux fragmented TS with ffmpeg before parsing."],"tags":["transport-stream","adts","aac","truncated-data","media-parser"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}