mediabunny 1.24.7 → 1.25.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 (87) hide show
  1. package/dist/bundles/mediabunny.cjs +132 -12
  2. package/dist/bundles/mediabunny.min.cjs +7 -7
  3. package/dist/bundles/mediabunny.min.mjs +7 -7
  4. package/dist/bundles/mediabunny.mjs +132 -12
  5. package/dist/mediabunny.d.ts +30 -0
  6. package/dist/modules/src/adts/adts-demuxer.d.ts.map +1 -1
  7. package/dist/modules/src/adts/adts-demuxer.js +6 -0
  8. package/dist/modules/src/codec-data.d.ts +1 -1
  9. package/dist/modules/src/codec-data.d.ts.map +1 -1
  10. package/dist/modules/src/conversion.d.ts +1 -1
  11. package/dist/modules/src/conversion.d.ts.map +1 -1
  12. package/dist/modules/src/conversion.js +5 -3
  13. package/dist/modules/src/demuxer.d.ts +1 -1
  14. package/dist/modules/src/demuxer.d.ts.map +1 -1
  15. package/dist/modules/src/flac/flac-demuxer.d.ts +1 -1
  16. package/dist/modules/src/flac/flac-demuxer.d.ts.map +1 -1
  17. package/dist/modules/src/flac/flac-demuxer.js +6 -0
  18. package/dist/modules/src/flac/flac-muxer.d.ts +1 -1
  19. package/dist/modules/src/flac/flac-muxer.d.ts.map +1 -1
  20. package/dist/modules/src/flac/flac-muxer.js +1 -1
  21. package/dist/modules/src/id3.d.ts +1 -1
  22. package/dist/modules/src/id3.d.ts.map +1 -1
  23. package/dist/modules/src/index.d.ts +1 -1
  24. package/dist/modules/src/index.d.ts.map +1 -1
  25. package/dist/modules/src/index.js +1 -1
  26. package/dist/modules/src/input-track.d.ts +4 -0
  27. package/dist/modules/src/input-track.d.ts.map +1 -1
  28. package/dist/modules/src/input-track.js +4 -0
  29. package/dist/modules/src/input.d.ts +1 -1
  30. package/dist/modules/src/isobmff/isobmff-boxes.d.ts.map +1 -1
  31. package/dist/modules/src/isobmff/isobmff-boxes.js +6 -2
  32. package/dist/modules/src/isobmff/isobmff-demuxer.d.ts +2 -1
  33. package/dist/modules/src/isobmff/isobmff-demuxer.d.ts.map +1 -1
  34. package/dist/modules/src/isobmff/isobmff-demuxer.js +13 -5
  35. package/dist/modules/src/isobmff/isobmff-reader.d.ts +1 -1
  36. package/dist/modules/src/isobmff/isobmff-reader.d.ts.map +1 -1
  37. package/dist/modules/src/isobmff/isobmff-reader.js +1 -1
  38. package/dist/modules/src/matroska/ebml.d.ts +4 -0
  39. package/dist/modules/src/matroska/ebml.d.ts.map +1 -1
  40. package/dist/modules/src/matroska/ebml.js +4 -0
  41. package/dist/modules/src/matroska/matroska-demuxer.d.ts +2 -2
  42. package/dist/modules/src/matroska/matroska-demuxer.d.ts.map +1 -1
  43. package/dist/modules/src/matroska/matroska-demuxer.js +49 -4
  44. package/dist/modules/src/matroska/matroska-muxer.d.ts.map +1 -1
  45. package/dist/modules/src/matroska/matroska-muxer.js +19 -1
  46. package/dist/modules/src/{tags.d.ts → metadata.d.ts} +28 -1
  47. package/dist/modules/src/metadata.d.ts.map +1 -0
  48. package/dist/modules/src/{tags.js → metadata.js} +31 -0
  49. package/dist/modules/src/mp3/mp3-demuxer.d.ts +1 -1
  50. package/dist/modules/src/mp3/mp3-demuxer.d.ts.map +1 -1
  51. package/dist/modules/src/mp3/mp3-demuxer.js +6 -0
  52. package/dist/modules/src/mp3/mp3-muxer.js +1 -1
  53. package/dist/modules/src/ogg/ogg-demuxer.d.ts +1 -1
  54. package/dist/modules/src/ogg/ogg-demuxer.d.ts.map +1 -1
  55. package/dist/modules/src/ogg/ogg-demuxer.js +6 -0
  56. package/dist/modules/src/output.d.ts +3 -1
  57. package/dist/modules/src/output.d.ts.map +1 -1
  58. package/dist/modules/src/output.js +4 -1
  59. package/dist/modules/src/tsconfig.tsbuildinfo +1 -1
  60. package/dist/modules/src/wave/wave-demuxer.d.ts +1 -1
  61. package/dist/modules/src/wave/wave-demuxer.d.ts.map +1 -1
  62. package/dist/modules/src/wave/wave-demuxer.js +6 -0
  63. package/dist/modules/src/wave/wave-muxer.js +1 -1
  64. package/package.json +1 -1
  65. package/src/adts/adts-demuxer.ts +7 -0
  66. package/src/codec-data.ts +1 -1
  67. package/src/conversion.ts +5 -3
  68. package/src/demuxer.ts +1 -1
  69. package/src/flac/flac-demuxer.ts +7 -1
  70. package/src/flac/flac-muxer.ts +1 -1
  71. package/src/id3.ts +1 -1
  72. package/src/index.ts +2 -1
  73. package/src/input-track.ts +7 -0
  74. package/src/isobmff/isobmff-boxes.ts +7 -2
  75. package/src/isobmff/isobmff-demuxer.ts +16 -5
  76. package/src/isobmff/isobmff-reader.ts +1 -1
  77. package/src/matroska/ebml.ts +4 -0
  78. package/src/matroska/matroska-demuxer.ts +41 -5
  79. package/src/matroska/matroska-muxer.ts +19 -1
  80. package/src/{tags.ts → metadata.ts} +59 -0
  81. package/src/mp3/mp3-demuxer.ts +7 -1
  82. package/src/mp3/mp3-muxer.ts +1 -1
  83. package/src/ogg/ogg-demuxer.ts +7 -1
  84. package/src/output.ts +6 -1
  85. package/src/wave/wave-demuxer.ts +7 -1
  86. package/src/wave/wave-muxer.ts +1 -1
  87. package/dist/modules/src/tags.d.ts.map +0 -1
@@ -723,7 +723,7 @@ var Mediabunny = (() => {
723
723
  return typeof x === "number" && !Number.isNaN(x);
724
724
  };
725
725
 
726
- // src/tags.ts
726
+ // src/metadata.ts
727
727
  var RichImageData = class {
728
728
  /** Creates a new {@link RichImageData}. */
729
729
  constructor(data, mimeType) {
@@ -836,6 +836,37 @@ var Mediabunny = (() => {
836
836
  var metadataTagsAreEmpty = (tags) => {
837
837
  return tags.title === void 0 && tags.description === void 0 && tags.artist === void 0 && tags.album === void 0 && tags.albumArtist === void 0 && tags.trackNumber === void 0 && tags.tracksTotal === void 0 && tags.discNumber === void 0 && tags.discsTotal === void 0 && tags.genre === void 0 && tags.date === void 0 && tags.lyrics === void 0 && (!tags.images || tags.images.length === 0) && tags.comment === void 0 && (tags.raw === void 0 || Object.keys(tags.raw).length === 0);
838
838
  };
839
+ var DEFAULT_TRACK_DISPOSITION = {
840
+ default: true,
841
+ forced: false,
842
+ original: false,
843
+ commentary: false,
844
+ hearingImpaired: false,
845
+ visuallyImpaired: false
846
+ };
847
+ var validateTrackDisposition = (disposition) => {
848
+ if (!disposition || typeof disposition !== "object") {
849
+ throw new TypeError("disposition must be an object.");
850
+ }
851
+ if (disposition.default !== void 0 && typeof disposition.default !== "boolean") {
852
+ throw new TypeError("disposition.default must be a boolean.");
853
+ }
854
+ if (disposition.forced !== void 0 && typeof disposition.forced !== "boolean") {
855
+ throw new TypeError("disposition.forced must be a boolean.");
856
+ }
857
+ if (disposition.original !== void 0 && typeof disposition.original !== "boolean") {
858
+ throw new TypeError("disposition.original must be a boolean.");
859
+ }
860
+ if (disposition.commentary !== void 0 && typeof disposition.commentary !== "boolean") {
861
+ throw new TypeError("disposition.commentary must be a boolean.");
862
+ }
863
+ if (disposition.hearingImpaired !== void 0 && typeof disposition.hearingImpaired !== "boolean") {
864
+ throw new TypeError("disposition.hearingImpaired must be a boolean.");
865
+ }
866
+ if (disposition.visuallyImpaired !== void 0 && typeof disposition.visuallyImpaired !== "boolean") {
867
+ throw new TypeError("disposition.visuallyImpaired must be a boolean.");
868
+ }
869
+ };
839
870
 
840
871
  // src/codec.ts
841
872
  var VIDEO_CODECS = [
@@ -6254,6 +6285,10 @@ var Mediabunny = (() => {
6254
6285
  get timeResolution() {
6255
6286
  return this._backing.getTimeResolution();
6256
6287
  }
6288
+ /** The track's disposition, i.e. information about its intended usage. */
6289
+ get disposition() {
6290
+ return this._backing.getDisposition();
6291
+ }
6257
6292
  /**
6258
6293
  * Returns the start timestamp of the first packet of this track, in seconds. While often near zero, this value
6259
6294
  * may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples
@@ -6608,6 +6643,7 @@ var Mediabunny = (() => {
6608
6643
  if (!moovSlice) break;
6609
6644
  this.moovSlice = moovSlice;
6610
6645
  this.readContiguousBoxes(this.moovSlice);
6646
+ this.tracks.sort((a, b) => Number(b.disposition.default) - Number(a.disposition.default));
6611
6647
  for (const track of this.tracks) {
6612
6648
  const previousSegmentDurationsInSeconds = track.editListPreviousSegmentDurations / this.movieTimescale;
6613
6649
  track.editListOffset -= Math.round(previousSegmentDurationsInSeconds * track.timescale);
@@ -6854,6 +6890,9 @@ var Mediabunny = (() => {
6854
6890
  id: -1,
6855
6891
  demuxer: this,
6856
6892
  inputTrack: null,
6893
+ disposition: {
6894
+ ...DEFAULT_TRACK_DISPOSITION
6895
+ },
6857
6896
  info: null,
6858
6897
  timescale: -1,
6859
6898
  durationInMovieTimescale: -1,
@@ -6895,10 +6934,8 @@ var Mediabunny = (() => {
6895
6934
  }
6896
6935
  const version = readU8(slice);
6897
6936
  const flags = readU24Be(slice);
6898
- const trackEnabled = (flags & 1) !== 0;
6899
- if (!trackEnabled) {
6900
- break;
6901
- }
6937
+ const trackEnabled = !!(flags & 1);
6938
+ track.disposition.default = trackEnabled;
6902
6939
  if (version === 0) {
6903
6940
  slice.skip(8);
6904
6941
  track.id = readU32Be(slice);
@@ -8374,6 +8411,9 @@ var Mediabunny = (() => {
8374
8411
  getTimeResolution() {
8375
8412
  return this.internalTrack.timescale;
8376
8413
  }
8414
+ getDisposition() {
8415
+ return this.internalTrack.disposition;
8416
+ }
8377
8417
  async computeDuration() {
8378
8418
  const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });
8379
8419
  return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);
@@ -9597,7 +9637,7 @@ var Mediabunny = (() => {
9597
9637
  this.currentSegment.timestampScale = 1e6;
9598
9638
  this.currentSegment.timestampFactor = 1e9 / 1e6;
9599
9639
  }
9600
- this.currentSegment.tracks.sort((a, b) => Number(b.isDefault) - Number(a.isDefault));
9640
+ this.currentSegment.tracks.sort((a, b) => Number(b.disposition.default) - Number(a.disposition.default));
9601
9641
  const idToTrack = new Map(this.currentSegment.tracks.map((x) => [x.id, x]));
9602
9642
  for (const cuePoint of this.currentSegment.cuePoints) {
9603
9643
  const track = idToTrack.get(cuePoint.trackId);
@@ -9944,7 +9984,9 @@ var Mediabunny = (() => {
9944
9984
  demuxer: this,
9945
9985
  clusterPositionCache: [],
9946
9986
  cuePoints: [],
9947
- isDefault: false,
9987
+ disposition: {
9988
+ ...DEFAULT_TRACK_DISPOSITION
9989
+ },
9948
9990
  inputTrack: null,
9949
9991
  codecId: null,
9950
9992
  codecPrivate: null,
@@ -10088,7 +10130,42 @@ var Mediabunny = (() => {
10088
10130
  case 136 /* FlagDefault */:
10089
10131
  {
10090
10132
  if (!this.currentTrack) break;
10091
- this.currentTrack.isDefault = !!readUnsignedInt(slice, size);
10133
+ this.currentTrack.disposition.default = !!readUnsignedInt(slice, size);
10134
+ }
10135
+ ;
10136
+ break;
10137
+ case 21930 /* FlagForced */:
10138
+ {
10139
+ if (!this.currentTrack) break;
10140
+ this.currentTrack.disposition.forced = !!readUnsignedInt(slice, size);
10141
+ }
10142
+ ;
10143
+ break;
10144
+ case 21934 /* FlagOriginal */:
10145
+ {
10146
+ if (!this.currentTrack) break;
10147
+ this.currentTrack.disposition.original = !!readUnsignedInt(slice, size);
10148
+ }
10149
+ ;
10150
+ break;
10151
+ case 21931 /* FlagHearingImpaired */:
10152
+ {
10153
+ if (!this.currentTrack) break;
10154
+ this.currentTrack.disposition.hearingImpaired = !!readUnsignedInt(slice, size);
10155
+ }
10156
+ ;
10157
+ break;
10158
+ case 21932 /* FlagVisualImpaired */:
10159
+ {
10160
+ if (!this.currentTrack) break;
10161
+ this.currentTrack.disposition.visuallyImpaired = !!readUnsignedInt(slice, size);
10162
+ }
10163
+ ;
10164
+ break;
10165
+ case 21935 /* FlagCommentary */:
10166
+ {
10167
+ if (!this.currentTrack) break;
10168
+ this.currentTrack.disposition.commentary = !!readUnsignedInt(slice, size);
10092
10169
  }
10093
10170
  ;
10094
10171
  break;
@@ -10811,6 +10888,9 @@ var Mediabunny = (() => {
10811
10888
  getTimeResolution() {
10812
10889
  return this.internalTrack.segment.timestampFactor;
10813
10890
  }
10891
+ getDisposition() {
10892
+ return this.internalTrack.disposition;
10893
+ }
10814
10894
  async getFirstPacket(options) {
10815
10895
  return this.performClusterLookup(
10816
10896
  null,
@@ -12588,6 +12668,11 @@ var Mediabunny = (() => {
12588
12668
  assert(this.demuxer.firstFrameHeader);
12589
12669
  return this.demuxer.firstFrameHeader.sampleRate;
12590
12670
  }
12671
+ getDisposition() {
12672
+ return {
12673
+ ...DEFAULT_TRACK_DISPOSITION
12674
+ };
12675
+ }
12591
12676
  async getDecoderConfig() {
12592
12677
  assert(this.demuxer.firstFrameHeader);
12593
12678
  return {
@@ -13105,6 +13190,11 @@ var Mediabunny = (() => {
13105
13190
  getLanguageCode() {
13106
13191
  return UNDETERMINED_LANGUAGE;
13107
13192
  }
13193
+ getDisposition() {
13194
+ return {
13195
+ ...DEFAULT_TRACK_DISPOSITION
13196
+ };
13197
+ }
13108
13198
  async getFirstTimestamp() {
13109
13199
  return 0;
13110
13200
  }
@@ -13845,6 +13935,11 @@ var Mediabunny = (() => {
13845
13935
  getLanguageCode() {
13846
13936
  return UNDETERMINED_LANGUAGE;
13847
13937
  }
13938
+ getDisposition() {
13939
+ return {
13940
+ ...DEFAULT_TRACK_DISPOSITION
13941
+ };
13942
+ }
13848
13943
  async getFirstTimestamp() {
13849
13944
  return 0;
13850
13945
  }
@@ -14100,6 +14195,11 @@ var Mediabunny = (() => {
14100
14195
  assert(sampleRate !== void 0);
14101
14196
  return sampleRate;
14102
14197
  }
14198
+ getDisposition() {
14199
+ return {
14200
+ ...DEFAULT_TRACK_DISPOSITION
14201
+ };
14202
+ }
14103
14203
  async getDecoderConfig() {
14104
14204
  assert(this.demuxer.firstFrameHeader);
14105
14205
  const bytes2 = new Uint8Array(3);
@@ -14680,6 +14780,11 @@ var Mediabunny = (() => {
14680
14780
  assert(this.demuxer.audioInfo);
14681
14781
  return this.demuxer.audioInfo.sampleRate;
14682
14782
  }
14783
+ getDisposition() {
14784
+ return {
14785
+ ...DEFAULT_TRACK_DISPOSITION
14786
+ };
14787
+ }
14683
14788
  async getFirstTimestamp() {
14684
14789
  return 0;
14685
14790
  }
@@ -17090,7 +17195,11 @@ var Mediabunny = (() => {
17090
17195
  } else {
17091
17196
  matrix = IDENTITY_MATRIX;
17092
17197
  }
17093
- return fullBox("tkhd", +needsU64, 3, [
17198
+ let flags = 2;
17199
+ if (trackData.track.metadata.disposition?.default !== false) {
17200
+ flags |= 1;
17201
+ }
17202
+ return fullBox("tkhd", +needsU64, flags, [
17094
17203
  u32OrU64(creationTime),
17095
17204
  // Creation time
17096
17205
  u32OrU64(creationTime),
@@ -19802,6 +19911,12 @@ var Mediabunny = (() => {
19802
19911
  { id: 215 /* TrackNumber */, data: trackData.track.id },
19803
19912
  { id: 29637 /* TrackUID */, data: trackData.track.id },
19804
19913
  { id: 131 /* TrackType */, data: TRACK_TYPE_MAP[trackData.type] },
19914
+ trackData.track.metadata.disposition?.default === false ? { id: 136 /* FlagDefault */, data: 0 } : null,
19915
+ trackData.track.metadata.disposition?.forced ? { id: 21930 /* FlagForced */, data: 1 } : null,
19916
+ trackData.track.metadata.disposition?.hearingImpaired ? { id: 21931 /* FlagHearingImpaired */, data: 1 } : null,
19917
+ trackData.track.metadata.disposition?.visuallyImpaired ? { id: 21932 /* FlagVisualImpaired */, data: 1 } : null,
19918
+ trackData.track.metadata.disposition?.original ? { id: 21934 /* FlagOriginal */, data: 1 } : null,
19919
+ trackData.track.metadata.disposition?.commentary ? { id: 21935 /* FlagCommentary */, data: 1 } : null,
19805
19920
  { id: 156 /* FlagLacing */, data: 0 },
19806
19921
  { id: 2274716 /* Language */, data: trackData.track.metadata.languageCode ?? UNDETERMINED_LANGUAGE },
19807
19922
  { id: 134 /* CodecID */, data: codecId },
@@ -23823,6 +23938,9 @@ ${cue.notes ?? ""}`;
23823
23938
  if (metadata.name !== void 0 && typeof metadata.name !== "string") {
23824
23939
  throw new TypeError("metadata.name, when provided, must be a string.");
23825
23940
  }
23941
+ if (metadata.disposition !== void 0) {
23942
+ validateTrackDisposition(metadata.disposition);
23943
+ }
23826
23944
  if (metadata.maximumPacketCount !== void 0 && (!Number.isInteger(metadata.maximumPacketCount) || metadata.maximumPacketCount < 0)) {
23827
23945
  throw new TypeError("metadata.maximumPacketCount, when provided, must be a non-negative integer.");
23828
23946
  }
@@ -24730,9 +24848,10 @@ The @mediabunny/mp3-encoder extension package provides support for encoding MP3.
24730
24848
  }
24731
24849
  this.output.addVideoTrack(videoSource, {
24732
24850
  frameRate: trackOptions.frameRate,
24733
- // TEMP: This condition can be removed when all demuxers properly homogenize to BCP47 in v2
24851
+ // TODO: This condition can be removed when all demuxers properly homogenize to BCP47 in v2
24734
24852
  languageCode: isIso639Dash2LanguageCode(track.languageCode) ? track.languageCode : void 0,
24735
24853
  name: track.name ?? void 0,
24854
+ disposition: track.disposition,
24736
24855
  rotation: needsRerender ? 0 : totalRotation
24737
24856
  // Rerendering will bake the rotation into the output
24738
24857
  });
@@ -24896,9 +25015,10 @@ The @mediabunny/mp3-encoder extension package provides support for encoding MP3.
24896
25015
  }
24897
25016
  }
24898
25017
  this.output.addAudioTrack(audioSource, {
24899
- // TEMP: This condition can be removed when all demuxers properly homogenize to BCP47 in v2
25018
+ // TODO: This condition can be removed when all demuxers properly homogenize to BCP47 in v2
24900
25019
  languageCode: isIso639Dash2LanguageCode(track.languageCode) ? track.languageCode : void 0,
24901
- name: track.name ?? void 0
25020
+ name: track.name ?? void 0,
25021
+ disposition: track.disposition
24902
25022
  });
24903
25023
  this._addedCounts.audio++;
24904
25024
  this._totalTrackCount++;