@norskvideo/moq-hang 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +65 -0
  2. package/catalog/audio.d.ts +139 -0
  3. package/catalog/audio.d.ts.map +1 -0
  4. package/catalog/audio.js +55 -0
  5. package/catalog/audio.js.map +1 -0
  6. package/catalog/consumer.d.ts +34 -0
  7. package/catalog/consumer.d.ts.map +1 -0
  8. package/catalog/consumer.js +30 -0
  9. package/catalog/consumer.js.map +1 -0
  10. package/catalog/container.d.ts +24 -0
  11. package/catalog/container.d.ts.map +1 -0
  12. package/catalog/container.js +30 -0
  13. package/catalog/container.js.map +1 -0
  14. package/catalog/format.d.ts +13 -0
  15. package/catalog/format.d.ts.map +1 -0
  16. package/catalog/format.js +24 -0
  17. package/catalog/format.js.map +1 -0
  18. package/catalog/index.d.ts +18 -0
  19. package/catalog/index.d.ts.map +1 -0
  20. package/catalog/index.js +19 -0
  21. package/catalog/index.js.map +1 -0
  22. package/catalog/integers.d.ts +23 -0
  23. package/catalog/integers.d.ts.map +1 -0
  24. package/catalog/integers.js +24 -0
  25. package/catalog/integers.js.map +1 -0
  26. package/catalog/priority.d.ts +7 -0
  27. package/catalog/priority.d.ts.map +1 -0
  28. package/catalog/priority.js +9 -0
  29. package/catalog/priority.js.map +1 -0
  30. package/catalog/producer.d.ts +31 -0
  31. package/catalog/producer.d.ts.map +1 -0
  32. package/catalog/producer.js +25 -0
  33. package/catalog/producer.js.map +1 -0
  34. package/catalog/root.d.ts +252 -0
  35. package/catalog/root.d.ts.map +1 -0
  36. package/catalog/root.js +17 -0
  37. package/catalog/root.js.map +1 -0
  38. package/catalog/root.test.d.ts +2 -0
  39. package/catalog/root.test.d.ts.map +1 -0
  40. package/catalog/root.test.js +20 -0
  41. package/catalog/root.test.js.map +1 -0
  42. package/catalog/timeline.d.ts +26 -0
  43. package/catalog/timeline.d.ts.map +1 -0
  44. package/catalog/timeline.js +33 -0
  45. package/catalog/timeline.js.map +1 -0
  46. package/catalog/track.d.ts +8 -0
  47. package/catalog/track.d.ts.map +1 -0
  48. package/catalog/track.js +7 -0
  49. package/catalog/track.js.map +1 -0
  50. package/catalog/video.d.ts +171 -0
  51. package/catalog/video.d.ts.map +1 -0
  52. package/catalog/video.js +87 -0
  53. package/catalog/video.js.map +1 -0
  54. package/container/cmaf/decode.d.ts +68 -0
  55. package/container/cmaf/decode.d.ts.map +1 -0
  56. package/container/cmaf/decode.js +303 -0
  57. package/container/cmaf/decode.js.map +1 -0
  58. package/container/cmaf/encode.d.ts +51 -0
  59. package/container/cmaf/encode.d.ts.map +1 -0
  60. package/container/cmaf/encode.js +834 -0
  61. package/container/cmaf/encode.js.map +1 -0
  62. package/container/cmaf/format.d.ts +12 -0
  63. package/container/cmaf/format.d.ts.map +1 -0
  64. package/container/cmaf/format.js +19 -0
  65. package/container/cmaf/format.js.map +1 -0
  66. package/container/cmaf/index.d.ts +9 -0
  67. package/container/cmaf/index.d.ts.map +1 -0
  68. package/container/cmaf/index.js +10 -0
  69. package/container/cmaf/index.js.map +1 -0
  70. package/container/consumer.d.ts +41 -0
  71. package/container/consumer.d.ts.map +1 -0
  72. package/container/consumer.js +424 -0
  73. package/container/consumer.js.map +1 -0
  74. package/container/consumer.test.d.ts +2 -0
  75. package/container/consumer.test.d.ts.map +1 -0
  76. package/container/consumer.test.js +396 -0
  77. package/container/consumer.test.js.map +1 -0
  78. package/container/format.d.ts +12 -0
  79. package/container/format.d.ts.map +1 -0
  80. package/container/format.js +3 -0
  81. package/container/format.js.map +1 -0
  82. package/container/index.d.ts +14 -0
  83. package/container/index.d.ts.map +1 -0
  84. package/container/index.js +18 -0
  85. package/container/index.js.map +1 -0
  86. package/container/legacy.d.ts +39 -0
  87. package/container/legacy.d.ts.map +1 -0
  88. package/container/legacy.js +53 -0
  89. package/container/legacy.js.map +1 -0
  90. package/container/timeline.d.ts +67 -0
  91. package/container/timeline.d.ts.map +1 -0
  92. package/container/timeline.js +87 -0
  93. package/container/timeline.js.map +1 -0
  94. package/container/types.d.ts +22 -0
  95. package/container/types.d.ts.map +1 -0
  96. package/container/types.js +22 -0
  97. package/container/types.js.map +1 -0
  98. package/index.d.ts +13 -0
  99. package/index.d.ts.map +1 -0
  100. package/index.js +18 -0
  101. package/index.js.map +1 -0
  102. package/package.json +37 -0
  103. package/util/aac.d.ts +8 -0
  104. package/util/aac.d.ts.map +1 -0
  105. package/util/aac.js +57 -0
  106. package/util/aac.js.map +1 -0
  107. package/util/aac.test.d.ts +2 -0
  108. package/util/aac.test.d.ts.map +1 -0
  109. package/util/aac.test.js +34 -0
  110. package/util/aac.test.js.map +1 -0
  111. package/util/hacks.d.ts +5 -0
  112. package/util/hacks.d.ts.map +1 -0
  113. package/util/hacks.js +6 -0
  114. package/util/hacks.js.map +1 -0
  115. package/util/hex.d.ts +5 -0
  116. package/util/hex.d.ts.map +1 -0
  117. package/util/hex.js +18 -0
  118. package/util/hex.js.map +1 -0
  119. package/util/index.d.ts +12 -0
  120. package/util/index.d.ts.map +1 -0
  121. package/util/index.js +18 -0
  122. package/util/index.js.map +1 -0
  123. package/util/latency.d.ts +38 -0
  124. package/util/latency.d.ts.map +1 -0
  125. package/util/latency.js +49 -0
  126. package/util/latency.js.map +1 -0
  127. package/util/libav.d.ts +3 -0
  128. package/util/libav.d.ts.map +1 -0
  129. package/util/libav.js +26 -0
  130. package/util/libav.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode.js","sourceRoot":"","sources":["../../../src/container/cmaf/decode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MP4 decoding utilities for parsing fMP4 init and data segments.\n * Used by WebCodecs to extract raw frames from CMAF container.\n */\n\nimport type { Time } from \"@moq/net\";\nimport {\n\ttype MediaHeaderBox,\n\ttype ParsedIsoBox,\n\treadAvc1,\n\treadHev1,\n\treadHvc1,\n\treadIsoBoxes,\n\treadMdat,\n\treadMdhd,\n\treadMfhd,\n\treadMp4a,\n\treadStsd,\n\treadTfdt,\n\treadTfhd,\n\treadTkhd,\n\treadTrex,\n\treadTrun,\n\ttype SampleDescriptionBox,\n\ttype TrackExtendsBox,\n\ttype TrackFragmentBaseMediaDecodeTimeBox,\n\ttype TrackFragmentHeaderBox,\n\ttype TrackRunBox,\n\ttype TrackRunSample,\n} from \"@svta/cml-iso-bmff\";\n\n// Configure readers for specific box types we need to parse\nconst INIT_READERS = {\n\tavc1: readAvc1,\n\tavc3: readAvc1, // avc3 has same structure\n\thvc1: readHvc1,\n\thev1: readHev1,\n\tmp4a: readMp4a,\n\tstsd: readStsd,\n\tmdhd: readMdhd,\n\ttkhd: readTkhd,\n\ttrex: readTrex,\n};\n\nconst DATA_READERS = {\n\tmfhd: readMfhd,\n\ttfhd: readTfhd,\n\ttfdt: readTfdt,\n\ttrun: readTrun,\n\tmdat: readMdat,\n};\n\n/**\n * Recursively find a box by type in the box tree.\n * This is more reliable than the library's findIsoBox which may not traverse all children.\n */\nfunction findBox<T extends ParsedIsoBox>(\n\tboxes: ParsedIsoBox[],\n\tpredicate: (box: ParsedIsoBox) => box is T,\n): T | undefined {\n\tfor (const box of boxes) {\n\t\tif (predicate(box)) {\n\t\t\treturn box;\n\t\t}\n\t\t// Recursively search children - boxes may have a 'boxes' property with children\n\t\t// biome-ignore lint/suspicious/noExplicitAny: ISO box structure varies\n\t\tconst children = (box as any).boxes;\n\t\tif (children && Array.isArray(children)) {\n\t\t\tconst found = findBox(children, predicate);\n\t\t\tif (found) return found;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Result of parsing an init segment.\n */\nexport interface InitSegment {\n\t/** Codec-specific description (avcC, hvcC, esds, dOps, etc.) */\n\tdescription?: Uint8Array;\n\t/** Time units per second */\n\ttimescale: number;\n\t/** Track ID from the init segment */\n\ttrackId: number;\n\t/** Default sample duration from moov/mvex/trex, used when not overridden in tfhd/trun. */\n\tdefaultSampleDuration: number;\n\t/** Default sample size from moov/mvex/trex, used when not overridden in tfhd/trun. */\n\tdefaultSampleSize: number;\n\t/**\n\t * Default sample flags from moov/mvex/trex, used when not overridden in tfhd/trun.\n\t *\n\t * Some encoders (notably gstreamer/ffmpeg passthrough) only set sample flags\n\t * in trex, leaving tfhd defaults and per-sample trun flags zero. Without this\n\t * fallback every sample would appear as a sync sample.\n\t */\n\tdefaultSampleFlags: number;\n}\n\n/**\n * A decoded sample from a data segment.\n */\nexport interface Sample {\n\t/** Raw sample data */\n\tdata: Uint8Array;\n\t/** Timestamp in microseconds */\n\ttimestamp: number;\n\t/** Whether this is a keyframe (sync sample) */\n\tkeyframe: boolean;\n}\n\n// Helper to convert Uint8Array to ArrayBuffer for the library\nfunction toArrayBuffer(data: Uint8Array): ArrayBuffer {\n\t// Create a new ArrayBuffer and copy data to avoid SharedArrayBuffer issues\n\tconst buffer = new ArrayBuffer(data.byteLength);\n\tnew Uint8Array(buffer).set(data);\n\treturn buffer;\n}\n\n// Type guard for finding boxes by type\nfunction isBoxType<T extends ParsedIsoBox>(type: string) {\n\treturn (box: ParsedIsoBox): box is T => box.type === type;\n}\n\n/**\n * Parse an init segment (ftyp + moov) to extract codec description and timescale.\n *\n * @param init - The init segment data\n * @returns Parsed init segment information\n */\nexport function decodeInitSegment(init: Uint8Array): InitSegment {\n\t// Cast to ParsedIsoBox[] since the library's return type changes with readers\n\tconst boxes = readIsoBoxes(toArrayBuffer(init), { readers: INIT_READERS }) as ParsedIsoBox[];\n\n\t// Find moov > trak > mdia > mdhd for timescale\n\tconst mdhd = findBox(boxes, isBoxType<MediaHeaderBox & ParsedIsoBox>(\"mdhd\"));\n\tif (!mdhd) {\n\t\tthrow new Error(\"No mdhd box found in init segment\");\n\t}\n\n\t// Find moov > trak > tkhd for track ID\n\t// biome-ignore lint/suspicious/noExplicitAny: ISO box traversal\n\tconst tkhd = findBox(boxes, isBoxType<any>(\"tkhd\"));\n\tconst trackId = tkhd?.trackId ?? 1;\n\n\t// Find moov > trak > mdia > minf > stbl > stsd for sample description\n\tconst stsd = findBox(boxes, isBoxType<SampleDescriptionBox & ParsedIsoBox>(\"stsd\"));\n\tif (!stsd?.entries || stsd.entries.length === 0) {\n\t\tthrow new Error(\"No stsd box found in init segment\");\n\t}\n\n\t// Extract codec-specific description from the first sample entry\n\tconst entry = stsd.entries[0];\n\tconst description = extractDescription(entry);\n\n\t// Find moov > mvex > trex for this track to extract default sample values.\n\t// These are the bottom of the fallback chain when tfhd/trun don't specify them.\n\tconst trex = findBox(\n\t\tboxes,\n\t\t(box): box is TrackExtendsBox & ParsedIsoBox =>\n\t\t\tbox.type === \"trex\" && (box as TrackExtendsBox).trackId === trackId,\n\t);\n\n\treturn {\n\t\tdescription,\n\t\ttimescale: mdhd.timescale,\n\t\ttrackId,\n\t\tdefaultSampleDuration: trex?.defaultSampleDuration ?? 0,\n\t\tdefaultSampleSize: trex?.defaultSampleSize ?? 0,\n\t\tdefaultSampleFlags: trex?.defaultSampleFlags ?? 0,\n\t};\n}\n\n/**\n * Extract codec-specific description from a sample entry.\n * The description is codec-specific: avcC for H.264, hvcC for H.265, esds for AAC, dOps for Opus.\n */\n// biome-ignore lint/suspicious/noExplicitAny: ISO box types vary\nfunction extractDescription(entry: any): Uint8Array | undefined {\n\tif (!entry.boxes || !Array.isArray(entry.boxes)) {\n\t\treturn undefined;\n\t}\n\n\t// Look for codec config boxes in the sample entry\n\tfor (const box of entry.boxes) {\n\t\t// Handle raw Uint8Array boxes (already serialized)\n\t\tif (box instanceof Uint8Array) {\n\t\t\t// Extract the payload without the box header (8 bytes: 4 size + 4 type)\n\t\t\tif (box.length > 8) {\n\t\t\t\t// Check if this looks like a codec config box by reading the type\n\t\t\t\tconst typeBytes = String.fromCharCode(box[4], box[5], box[6], box[7]);\n\t\t\t\tif (typeBytes === \"avcC\" || typeBytes === \"hvcC\" || typeBytes === \"dOps\") {\n\t\t\t\t\treturn new Uint8Array(box.slice(8));\n\t\t\t\t}\n\t\t\t\tif (typeBytes === \"esds\") {\n\t\t\t\t\t// esds payload has nested descriptors; extract the AudioSpecificConfig (tag 0x05).\n\t\t\t\t\treturn extractAudioSpecificConfig(new Uint8Array(box.slice(8)));\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check for known codec config box types\n\t\tconst boxType = box.type;\n\t\tif (boxType === \"avcC\" || boxType === \"hvcC\" || boxType === \"dOps\") {\n\t\t\tif (box.view) {\n\t\t\t\tconst view = box.view;\n\t\t\t\tconst headerSize = 8;\n\t\t\t\tconst payloadOffset = view.byteOffset + headerSize;\n\t\t\t\tconst payloadLength = box.size - headerSize;\n\t\t\t\treturn new Uint8Array(view.buffer, payloadOffset, payloadLength);\n\t\t\t}\n\t\t\tif (box.data instanceof Uint8Array) {\n\t\t\t\treturn new Uint8Array(box.data);\n\t\t\t}\n\t\t\tif (box.raw instanceof Uint8Array) {\n\t\t\t\treturn new Uint8Array(box.raw.slice(8));\n\t\t\t}\n\t\t}\n\t\tif (boxType === \"esds\") {\n\t\t\tlet payload: Uint8Array | undefined;\n\t\t\tif (box.view) {\n\t\t\t\tconst view = box.view;\n\t\t\t\tconst headerSize = 8;\n\t\t\t\tpayload = new Uint8Array(view.buffer, view.byteOffset + headerSize, box.size - headerSize);\n\t\t\t} else if (box.data instanceof Uint8Array) {\n\t\t\t\tpayload = new Uint8Array(box.data);\n\t\t\t} else if (box.raw instanceof Uint8Array) {\n\t\t\t\tpayload = new Uint8Array(box.raw.slice(8));\n\t\t\t}\n\t\t\tif (payload) return extractAudioSpecificConfig(payload);\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Extract AudioSpecificConfig from an esds box payload.\n * The esds contains nested descriptors: ES_Descriptor (0x03) → DecoderConfigDescriptor (0x04)\n * → DecoderSpecificInfo (0x05). The DecoderSpecificInfo payload is the AudioSpecificConfig\n * that AudioDecoder.configure() expects.\n */\nfunction extractAudioSpecificConfig(esds: Uint8Array): Uint8Array | undefined {\n\t// Skip version + flags (4 bytes)\n\tlet offset = 4;\n\n\t// Scan for DecoderSpecificInfo tag (0x05)\n\twhile (offset < esds.length) {\n\t\tconst tag = esds[offset++];\n\n\t\t// Parse variable-length size (up to 4 bytes, high bit = continuation)\n\t\tlet size = 0;\n\t\tfor (let i = 0; i < 4 && offset < esds.length; i++) {\n\t\t\tconst b = esds[offset++];\n\t\t\tsize = (size << 7) | (b & 0x7f);\n\t\t\tif ((b & 0x80) === 0) break;\n\t\t}\n\n\t\tif (tag === 0x05) {\n\t\t\t// Found DecoderSpecificInfo — payload is the AudioSpecificConfig\n\t\t\tif (offset + size <= esds.length) {\n\t\t\t\treturn new Uint8Array(esds.buffer, esds.byteOffset + offset, size);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// For container descriptors (0x03, 0x04), skip their fixed header fields\n\t\t// but continue scanning their children (don't skip the full size).\n\t\tif (tag === 0x03) {\n\t\t\toffset += 3; // ES_ID (2) + flags (1)\n\t\t} else if (tag === 0x04) {\n\t\t\toffset += 13; // objectTypeIndication (1) + streamType (1) + bufferSizeDB (3) + maxBitrate (4) + avgBitrate (4)\n\t\t} else {\n\t\t\t// Unknown tag — skip its payload entirely\n\t\t\toffset += size;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Extract just the base media decode time from a data segment (moof + mdat).\n * This is a lighter-weight function when you only need the timestamp.\n *\n * @param segment - The moof + mdat data\n * @param init - Parsed init segment (provides timescale)\n * @returns The base media decode time in microseconds\n */\nexport function decodeTimestamp(segment: Uint8Array, init: InitSegment): Time.Micro {\n\tconst boxes = readIsoBoxes(toArrayBuffer(segment), { readers: DATA_READERS }) as ParsedIsoBox[];\n\n\t// Find moof > traf > tfdt for base media decode time\n\tconst tfdt = findBox(boxes, isBoxType<TrackFragmentBaseMediaDecodeTimeBox & ParsedIsoBox>(\"tfdt\"));\n\tconst baseDecodeTime = tfdt?.baseMediaDecodeTime ?? 0;\n\n\t// Convert to microseconds\n\treturn ((baseDecodeTime * 1_000_000) / init.timescale) as Time.Micro;\n}\n\n/**\n * Parse a data segment (moof + mdat) to extract raw samples.\n *\n * Sample duration/size/flags fall back through trun → tfhd → trex (init segment)\n * per ISO/IEC 14496-12 §8.8.7. The init segment's trex defaults are required for\n * fragments where the encoder only set them once in moov (e.g. gstreamer passthrough).\n *\n * @param segment - The moof + mdat data\n * @param init - Parsed init segment (provides timescale and trex defaults)\n * @returns Array of decoded samples\n */\nexport function decodeDataSegment(segment: Uint8Array, init: InitSegment): Sample[] {\n\t// Cast to ParsedIsoBox[] since the library's return type changes with readers\n\tconst boxes = readIsoBoxes(toArrayBuffer(segment), { readers: DATA_READERS }) as ParsedIsoBox[];\n\n\t// Find moof > traf > tfdt for base media decode time\n\tconst tfdt = findBox(boxes, isBoxType<TrackFragmentBaseMediaDecodeTimeBox & ParsedIsoBox>(\"tfdt\"));\n\tconst baseDecodeTime = tfdt?.baseMediaDecodeTime ?? 0;\n\n\t// Find moof > traf > tfhd for default sample values, falling back to trex from the init segment.\n\tconst tfhd = findBox(boxes, isBoxType<TrackFragmentHeaderBox & ParsedIsoBox>(\"tfhd\"));\n\tconst defaultDuration = tfhd?.defaultSampleDuration ?? init.defaultSampleDuration;\n\tconst defaultSize = tfhd?.defaultSampleSize ?? init.defaultSampleSize;\n\tconst defaultFlags = tfhd?.defaultSampleFlags ?? init.defaultSampleFlags;\n\n\t// Find moof > traf > trun for sample info\n\tconst trun = findBox(boxes, isBoxType<TrackRunBox & ParsedIsoBox>(\"trun\"));\n\tif (!trun) {\n\t\tthrow new Error(\"No trun box found in data segment\");\n\t}\n\n\t// Find mdat for sample data\n\t// biome-ignore lint/suspicious/noExplicitAny: mdat box type\n\tconst mdat = findBox(boxes, isBoxType<any>(\"mdat\"));\n\tif (!mdat) {\n\t\tthrow new Error(\"No mdat box found in data segment\");\n\t}\n\n\t// mdat.data contains the raw sample data\n\tconst mdatData = mdat.data as Uint8Array;\n\tif (!mdatData) {\n\t\tthrow new Error(\"No data in mdat box\");\n\t}\n\n\tconst samples: Sample[] = [];\n\n\t// trun.dataOffset is an offset from the base data offset (typically moof start) to the first sample.\n\t// For simple CMAF segments where moof is followed immediately by mdat, this equals moof.size + 8.\n\t// Since mdat.data is the mdat payload (excluding the 8-byte header), we need to compute the\n\t// offset within mdatData. For now, we assume samples start at the beginning of mdat.data\n\t// when dataOffset is not specified or when it points to the start of mdat payload.\n\t// TODO: For complex cases with base_data_offset in tfhd, this needs additional handling.\n\tlet dataOffset = 0;\n\tlet decodeTime = baseDecodeTime;\n\n\tfor (let i = 0; i < trun.sampleCount; i++) {\n\t\tconst sample: TrackRunSample = trun.samples[i] ?? {};\n\n\t\tconst sampleSize = sample.sampleSize ?? defaultSize;\n\t\tconst sampleDuration = sample.sampleDuration ?? defaultDuration;\n\n\t\t// Validate sample size - must be positive to produce valid data\n\t\tif (sampleSize <= 0) {\n\t\t\tthrow new Error(`Invalid sample size ${sampleSize} for sample ${i} in trun`);\n\t\t}\n\n\t\t// Duration 0 is valid for single-sample CMAF fragments where duration\n\t\t// is implicit. Negative duration would indicate corrupt data.\n\t\tif (sampleDuration < 0) {\n\t\t\tthrow new Error(`Invalid sample duration ${sampleDuration} for sample ${i} in trun`);\n\t\t}\n\n\t\t// Bounds check before slicing to prevent reading past mdat data\n\t\tif (dataOffset + sampleSize > mdatData.length) {\n\t\t\tthrow new Error(\n\t\t\t\t`Sample ${i} would overflow mdat: offset=${dataOffset}, size=${sampleSize}, mdatLength=${mdatData.length}`,\n\t\t\t);\n\t\t}\n\n\t\tconst sampleFlags =\n\t\t\ti === 0 && trun.firstSampleFlags !== undefined\n\t\t\t\t? trun.firstSampleFlags\n\t\t\t\t: (sample.sampleFlags ?? defaultFlags);\n\t\tconst compositionOffset = sample.sampleCompositionTimeOffset ?? 0;\n\n\t\t// Extract sample data\n\t\tconst data = new Uint8Array(mdatData.slice(dataOffset, dataOffset + sampleSize));\n\t\tdataOffset += sampleSize;\n\n\t\t// Calculate presentation timestamp in microseconds\n\t\t// PTS = (decode_time + composition_offset) * 1_000_000 / timescale\n\t\tconst pts = decodeTime + compositionOffset;\n\t\tconst timestamp = Math.round((pts * 1_000_000) / init.timescale);\n\n\t\t// Check if keyframe (sample_is_non_sync_sample flag is bit 16)\n\t\t// If flag is 0, treat as keyframe for safety\n\t\tconst keyframe = sampleFlags === 0 || (sampleFlags & 0x00010000) === 0;\n\n\t\tsamples.push({\n\t\t\tdata,\n\t\t\ttimestamp,\n\t\t\tkeyframe,\n\t\t});\n\n\t\tdecodeTime += sampleDuration;\n\t}\n\n\treturn samples;\n}\n"]}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * MP4 encoding utilities for creating fMP4 init and data segments.
3
+ * Used by MSE to create init segments (ftyp+moov) and data segments (moof+mdat).
4
+ */
5
+ import type * as Catalog from "../../catalog";
6
+ /**
7
+ * Creates an MSE-compatible initialization segment (ftyp + moov) for H.264 video.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // From WebCodecs EncodedVideoChunkMetadata
12
+ * const config = await encoder.encode(frame);
13
+ * const metadata = config.decoderConfig;
14
+ *
15
+ * const initSegment = createVideoInitSegment({
16
+ * width: metadata.codedWidth,
17
+ * height: metadata.codedHeight,
18
+ * avcC: new Uint8Array(metadata.description),
19
+ * });
20
+ *
21
+ * sourceBuffer.appendBuffer(initSegment);
22
+ * ```
23
+ */
24
+ export declare function createVideoInitSegment(config: Catalog.VideoConfig): Uint8Array;
25
+ /**
26
+ * Creates an MSE-compatible initialization segment (ftyp + moov) for audio.
27
+ * Supports AAC (mp4a) and Opus codecs.
28
+ */
29
+ export declare function createAudioInitSegment(config: Catalog.AudioConfig): Uint8Array;
30
+ export interface DataSegmentOptions {
31
+ /** Raw frame data */
32
+ data: Uint8Array;
33
+ /** Timestamp in timescale units */
34
+ timestamp: number;
35
+ /** Duration in timescale units */
36
+ duration: number;
37
+ /** Whether this is a keyframe */
38
+ keyframe: boolean;
39
+ /** Sequence number for this fragment */
40
+ sequence: number;
41
+ /** Track ID (default: 1) */
42
+ trackId?: number;
43
+ }
44
+ /**
45
+ * Encode a raw frame into a moof+mdat segment for MSE.
46
+ *
47
+ * @param opts - Options for the data segment
48
+ * @returns The encoded moof+mdat segment
49
+ */
50
+ export declare function encodeDataSegment(opts: DataSegmentOptions): Uint8Array;
51
+ //# sourceMappingURL=encode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../../src/container/cmaf/encode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmDH,OAAO,KAAK,KAAK,OAAO,MAAM,eAAe,CAAC;AAkK9C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,GAAG,UAAU,CA2M9E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,GAAG,UAAU,CAsM9E;AAuPD,MAAM,WAAW,kBAAkB;IAClC,qBAAqB;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,CAkHtE"}