avbridge 2.1.0 → 2.1.2

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.
@@ -1,5 +1,3 @@
1
- import * as bridge from 'libavjs-webcodecs-bridge';
2
-
3
1
  var __create = Object.create;
4
2
  var __defProp = Object.defineProperty;
5
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -29902,6 +29900,910 @@ var init_avi = __esm({
29902
29900
  }
29903
29901
  });
29904
29902
 
29903
+ // node_modules/libavjs-webcodecs-bridge/dist/libavjs-webcodecs-bridge.mjs
29904
+ var libavjs_webcodecs_bridge_exports = {};
29905
+ __export(libavjs_webcodecs_bridge_exports, {
29906
+ audioDataToLAFrame: () => audioDataToLAFrame,
29907
+ audioStreamToConfig: () => audioStreamToConfig,
29908
+ configToAudioStream: () => configToAudioStream,
29909
+ configToVideoStream: () => configToVideoStream,
29910
+ encodedAudioChunkToPacket: () => encodedAudioChunkToPacket,
29911
+ encodedVideoChunkToPacket: () => encodedVideoChunkToPacket,
29912
+ laFrameToAudioData: () => laFrameToAudioData,
29913
+ laFrameToVideoFrame: () => laFrameToVideoFrame,
29914
+ packetToEncodedAudioChunk: () => packetToEncodedAudioChunk,
29915
+ packetToEncodedVideoChunk: () => packetToEncodedVideoChunk,
29916
+ videoFrameToLAFrame: () => videoFrameToLAFrame,
29917
+ videoStreamToConfig: () => videoStreamToConfig
29918
+ });
29919
+ function audioStreamToConfig$1(libav, stream) {
29920
+ return __awaiter$2(this, void 0, void 0, function* () {
29921
+ let codecpar;
29922
+ if (stream.codecpar) {
29923
+ codecpar = yield libav.ff_copyout_codecpar(stream.codecpar);
29924
+ } else {
29925
+ codecpar = stream;
29926
+ }
29927
+ const codecString = yield libav.avcodec_get_name(codecpar.codec_id);
29928
+ const ret = {
29929
+ codec: "unknown",
29930
+ sampleRate: codecpar.sample_rate,
29931
+ numberOfChannels: codecpar.channels
29932
+ };
29933
+ const extradata = codecpar.extradata;
29934
+ switch (codecString) {
29935
+ case "flac":
29936
+ ret.codec = "flac";
29937
+ ret.description = extradata;
29938
+ break;
29939
+ case "mp3":
29940
+ ret.codec = "mp3";
29941
+ break;
29942
+ case "aac": {
29943
+ const profile = codecpar.profile;
29944
+ switch (profile) {
29945
+ case 1:
29946
+ // AAC_LOW
29947
+ default:
29948
+ ret.codec = "mp4a.40.2";
29949
+ break;
29950
+ case 4:
29951
+ ret.codec = "mp4a.40.5";
29952
+ break;
29953
+ case 28:
29954
+ ret.codec = "mp4a.40.29";
29955
+ break;
29956
+ }
29957
+ if (extradata)
29958
+ ret.description = extradata;
29959
+ break;
29960
+ }
29961
+ case "opus":
29962
+ ret.codec = "opus";
29963
+ break;
29964
+ case "vorbis":
29965
+ ret.codec = "vorbis";
29966
+ ret.description = extradata;
29967
+ break;
29968
+ default:
29969
+ if (typeof LibAVWebCodecs !== "undefined") {
29970
+ ret.codec = { libavjs: {
29971
+ codec: codecString,
29972
+ ctx: {
29973
+ channels: codecpar.channels,
29974
+ sample_rate: codecpar.sample_rate
29975
+ }
29976
+ } };
29977
+ if (extradata)
29978
+ ret.description = extradata;
29979
+ }
29980
+ break;
29981
+ }
29982
+ if (ret.codec)
29983
+ return ret;
29984
+ return null;
29985
+ });
29986
+ }
29987
+ function videoStreamToConfig$1(libav, stream) {
29988
+ return __awaiter$2(this, void 0, void 0, function* () {
29989
+ let codecpar;
29990
+ if (stream.codecpar) {
29991
+ codecpar = yield libav.ff_copyout_codecpar(stream.codecpar);
29992
+ } else {
29993
+ codecpar = stream;
29994
+ }
29995
+ const codecString = yield libav.avcodec_get_name(codecpar.codec_id);
29996
+ const ret = {
29997
+ codec: "unknown",
29998
+ codedWidth: codecpar.width,
29999
+ codedHeight: codecpar.height
30000
+ };
30001
+ const extradata = codecpar.extradata;
30002
+ let profile = codecpar.profile;
30003
+ let level = codecpar.level;
30004
+ switch (codecString) {
30005
+ case "av1": {
30006
+ let codec = "av01";
30007
+ if (profile < 0)
30008
+ profile = 0;
30009
+ codec += `.0${profile}`;
30010
+ if (level < 0)
30011
+ level = 0;
30012
+ let levelS = level.toString();
30013
+ if (levelS.length < 2)
30014
+ levelS = `0${level}`;
30015
+ const tier = "M";
30016
+ codec += `.${levelS}${tier}`;
30017
+ const format = codecpar.format;
30018
+ const desc = yield libav.av_pix_fmt_desc_get(format);
30019
+ let bitDepth = (yield libav.AVPixFmtDescriptor_comp_depth(desc, 0)).toString();
30020
+ if (bitDepth.length < 2)
30021
+ bitDepth = `0${bitDepth}`;
30022
+ codec += `.${bitDepth}`;
30023
+ const nbComponents = yield libav.AVPixFmtDescriptor_nb_components(desc);
30024
+ if (nbComponents < 2)
30025
+ codec += ".1";
30026
+ else
30027
+ codec += ".0";
30028
+ let subX = 0, subY = 0, subP = 0;
30029
+ if (nbComponents < 2) {
30030
+ subX = 1;
30031
+ subY = 1;
30032
+ } else {
30033
+ subX = yield libav.AVPixFmtDescriptor_log2_chroma_w(desc);
30034
+ subY = yield libav.AVPixFmtDescriptor_log2_chroma_h(desc);
30035
+ }
30036
+ codec += `.${subX}${subY}${subP}`;
30037
+ ret.codec = codec;
30038
+ break;
30039
+ }
30040
+ case "h264": {
30041
+ let codec = "avc1";
30042
+ if (extradata && (extradata[0] | extradata[1] | extradata[2]) === 0 && extradata[3] === 1 && (extradata[4] & 31) === 7) {
30043
+ codec += ".";
30044
+ for (let i = 5; i <= 7; i++) {
30045
+ let s = extradata[i].toString(16);
30046
+ if (s.length < 2)
30047
+ s = "0" + s;
30048
+ codec += s;
30049
+ }
30050
+ } else {
30051
+ if (profile < 0)
30052
+ profile = 77;
30053
+ const profileB = profile & 255;
30054
+ let profileS = profileB.toString(16);
30055
+ if (profileS.length < 2)
30056
+ profileS = `0${profileS}`;
30057
+ codec += `.${profileS}`;
30058
+ let constraints = 0;
30059
+ if (profile & 256) {
30060
+ if (profileB === 66) {
30061
+ constraints |= 224;
30062
+ } else if (profileB === 77) {
30063
+ constraints |= 96;
30064
+ } else if (profile === 88) {
30065
+ constraints |= 32;
30066
+ } else {
30067
+ break;
30068
+ }
30069
+ }
30070
+ let constraintsS = constraints.toString(16);
30071
+ if (constraintsS.length < 2)
30072
+ constraintsS = `0${constraintsS}`;
30073
+ codec += constraintsS;
30074
+ if (level < 0)
30075
+ level = 10;
30076
+ let levelS = level.toString(16);
30077
+ if (levelS.length < 2)
30078
+ levelS = `0${levelS}`;
30079
+ codec += levelS;
30080
+ }
30081
+ ret.codec = codec;
30082
+ if (extradata && extradata[0])
30083
+ ret.description = extradata;
30084
+ break;
30085
+ }
30086
+ case "hevc": {
30087
+ let codec;
30088
+ if (extradata && extradata.length > 12) {
30089
+ codec = "hvc1";
30090
+ const dv = new DataView(extradata.buffer);
30091
+ ret.description = extradata;
30092
+ codec += ".";
30093
+ const profileSpace = extradata[1] >> 6;
30094
+ switch (profileSpace) {
30095
+ case 1:
30096
+ codec += "A";
30097
+ break;
30098
+ case 2:
30099
+ codec += "B";
30100
+ break;
30101
+ case 3:
30102
+ codec += "C";
30103
+ break;
30104
+ }
30105
+ const profileIDC = extradata[1] & 31;
30106
+ codec += profileIDC + ".";
30107
+ const profileCompatibility = dv.getUint32(2);
30108
+ let val = profileCompatibility;
30109
+ let reversed = 0;
30110
+ for (let i = 0; i < 32; i++) {
30111
+ reversed |= val & 1;
30112
+ if (i === 31)
30113
+ break;
30114
+ reversed <<= 1;
30115
+ val >>= 1;
30116
+ }
30117
+ codec += reversed.toString(16) + ".";
30118
+ const tierFlag = (extradata[1] & 32) >> 5;
30119
+ if (tierFlag === 0)
30120
+ codec += "L";
30121
+ else
30122
+ codec += "H";
30123
+ const levelIDC = extradata[12];
30124
+ codec += levelIDC;
30125
+ let constraintString = "";
30126
+ for (let i = 11; i >= 6; i--) {
30127
+ const b = extradata[i];
30128
+ if (b || constraintString)
30129
+ constraintString = "." + b.toString(16) + constraintString;
30130
+ }
30131
+ codec += constraintString;
30132
+ } else {
30133
+ if (profile < 0)
30134
+ profile = 0;
30135
+ if (level < 0)
30136
+ level = 0;
30137
+ codec = `hev1.${profile}.4.L${level}.B01`;
30138
+ }
30139
+ ret.codec = codec;
30140
+ break;
30141
+ }
30142
+ case "vp8":
30143
+ ret.codec = "vp8";
30144
+ break;
30145
+ case "vp9": {
30146
+ let codec = "vp09";
30147
+ let profileS = profile.toString();
30148
+ if (profile < 0)
30149
+ profileS = "00";
30150
+ if (profileS.length < 2)
30151
+ profileS = `0${profileS}`;
30152
+ codec += `.${profileS}`;
30153
+ let levelS = level.toString();
30154
+ if (level < 0)
30155
+ levelS = "10";
30156
+ if (levelS.length < 2)
30157
+ levelS = `0${levelS}`;
30158
+ codec += `.${levelS}`;
30159
+ const format = codecpar.format;
30160
+ const desc = yield libav.av_pix_fmt_desc_get(format);
30161
+ let bitDepth = (yield libav.AVPixFmtDescriptor_comp_depth(desc, 0)).toString();
30162
+ if (bitDepth === "0")
30163
+ bitDepth = "08";
30164
+ if (bitDepth.length < 2)
30165
+ bitDepth = `0${bitDepth}`;
30166
+ codec += `.${bitDepth}`;
30167
+ const subX = yield libav.AVPixFmtDescriptor_log2_chroma_w(desc);
30168
+ const subY = yield libav.AVPixFmtDescriptor_log2_chroma_h(desc);
30169
+ let chromaSubsampling = 0;
30170
+ if (subX > 0 && subY > 0) {
30171
+ chromaSubsampling = 1;
30172
+ } else if (subX > 0 || subY > 0) {
30173
+ chromaSubsampling = 2;
30174
+ } else {
30175
+ chromaSubsampling = 3;
30176
+ }
30177
+ codec += `.0${chromaSubsampling}`;
30178
+ codec += ".1.1.1.0";
30179
+ ret.codec = codec;
30180
+ break;
30181
+ }
30182
+ default:
30183
+ if (typeof LibAVWebCodecs !== "undefined") {
30184
+ ret.codec = { libavjs: {
30185
+ codec: codecString,
30186
+ ctx: {
30187
+ pix_fmt: codecpar.format,
30188
+ width: codecpar.width,
30189
+ height: codecpar.height
30190
+ }
30191
+ } };
30192
+ if (extradata)
30193
+ ret.description = extradata;
30194
+ }
30195
+ break;
30196
+ }
30197
+ if (ret.codec)
30198
+ return ret;
30199
+ return null;
30200
+ });
30201
+ }
30202
+ function times$1(packet, timeBaseSrc) {
30203
+ let pDuration = (packet.durationhi || 0) * 4294967296 + (packet.duration || 0);
30204
+ let pts = (packet.ptshi || 0) * 4294967296 + (packet.pts || 0);
30205
+ if (typeof LibAV !== "undefined" && LibAV.i64tof64) {
30206
+ pDuration = LibAV.i64tof64(packet.duration || 0, packet.durationhi || 0);
30207
+ pts = LibAV.i64tof64(packet.pts || 0, packet.ptshi || 0);
30208
+ }
30209
+ let tbNum = packet.time_base_num || 0;
30210
+ let tbDen = packet.time_base_den || 1e6;
30211
+ if (!tbNum) {
30212
+ if (timeBaseSrc.length) {
30213
+ const timeBase = timeBaseSrc;
30214
+ tbNum = timeBase[0];
30215
+ tbDen = timeBase[1];
30216
+ } else {
30217
+ const timeBase = timeBaseSrc;
30218
+ tbNum = timeBase.time_base_num;
30219
+ tbDen = timeBase.time_base_den;
30220
+ }
30221
+ }
30222
+ const duration = Math.round(pDuration * tbNum / tbDen * 1e6);
30223
+ let timestamp = Math.round(pts * tbNum / tbDen * 1e6);
30224
+ return { timestamp, duration };
30225
+ }
30226
+ function packetToEncodedAudioChunk$1(packet, timeBaseSrc, opts = {}) {
30227
+ let EAC;
30228
+ if (opts.EncodedAudioChunk)
30229
+ EAC = opts.EncodedAudioChunk;
30230
+ else
30231
+ EAC = EncodedAudioChunk;
30232
+ const { timestamp, duration } = times$1(packet, timeBaseSrc);
30233
+ return new EAC({
30234
+ type: "key",
30235
+ // all audio chunks are keyframes in all audio codecs
30236
+ timestamp,
30237
+ duration,
30238
+ data: packet.data.buffer
30239
+ });
30240
+ }
30241
+ function packetToEncodedVideoChunk$1(packet, timeBaseSrc, opts = {}) {
30242
+ let EVC;
30243
+ if (opts.EncodedVideoChunk)
30244
+ EVC = opts.EncodedVideoChunk;
30245
+ else
30246
+ EVC = EncodedVideoChunk;
30247
+ const { timestamp, duration } = times$1(packet, timeBaseSrc);
30248
+ return new EVC({
30249
+ type: (packet.flags || 0) & 1 ? "key" : "delta",
30250
+ timestamp,
30251
+ duration,
30252
+ data: packet.data.buffer
30253
+ });
30254
+ }
30255
+ function configToAudioStream$1(libav, config) {
30256
+ return __awaiter$1(this, void 0, void 0, function* () {
30257
+ const codecLong = config.codec;
30258
+ let codec;
30259
+ if (typeof codecLong === "object")
30260
+ codec = codecLong.libavjs.codec;
30261
+ else
30262
+ codec = codecLong.replace(/\..*/, "");
30263
+ switch (codec) {
30264
+ case "mp4a":
30265
+ codec = "aac";
30266
+ break;
30267
+ case "pcm-u8":
30268
+ codec = "pcm_u8";
30269
+ break;
30270
+ case "pcm-s16":
30271
+ codec = "pcm_s16le";
30272
+ break;
30273
+ case "pcm-s24":
30274
+ codec = "pcm_s24le";
30275
+ break;
30276
+ case "pcm-s32":
30277
+ codec = "pcm_s32le";
30278
+ break;
30279
+ case "pcm-f32":
30280
+ codec = "pcm_f32le";
30281
+ break;
30282
+ }
30283
+ const desc = yield libav.avcodec_descriptor_get_by_name(codec);
30284
+ const codecpar = yield libav.avcodec_parameters_alloc();
30285
+ if (desc) {
30286
+ yield libav.AVCodecParameters_codec_type_s(codecpar, yield libav.AVCodecDescriptor_type(desc));
30287
+ yield libav.AVCodecParameters_codec_id_s(codecpar, yield libav.AVCodecDescriptor_id(desc));
30288
+ if (config.sampleRate) {
30289
+ yield libav.AVCodecParameters_sample_rate_s(codecpar, config.sampleRate);
30290
+ }
30291
+ if (config.numberOfChannels) {
30292
+ yield libav.AVCodecParameters_channels_s(codecpar, config.numberOfChannels);
30293
+ }
30294
+ }
30295
+ let timebaseNum = 1, timebaseDen = 1e6;
30296
+ if (config.sampleRate)
30297
+ timebaseDen = config.sampleRate;
30298
+ return [codecpar, timebaseNum, timebaseDen];
30299
+ });
30300
+ }
30301
+ function configToVideoStream$1(libav, config) {
30302
+ return __awaiter$1(this, void 0, void 0, function* () {
30303
+ const codecLong = config.codec;
30304
+ let codec;
30305
+ if (typeof codecLong === "object")
30306
+ codec = codecLong.libavjs.codec;
30307
+ else
30308
+ codec = codecLong.replace(/\..*/, "");
30309
+ switch (codec) {
30310
+ case "av01":
30311
+ codec = "av1";
30312
+ break;
30313
+ case "avc1":
30314
+ case "avc3":
30315
+ codec = "h264";
30316
+ break;
30317
+ case "hev1":
30318
+ case "hvc1":
30319
+ codec = "hevc";
30320
+ break;
30321
+ case "vp09":
30322
+ codec = "vp9";
30323
+ break;
30324
+ }
30325
+ const desc = yield libav.avcodec_descriptor_get_by_name(codec);
30326
+ const codecpar = yield libav.avcodec_parameters_alloc();
30327
+ if (desc) {
30328
+ yield libav.AVCodecParameters_codec_type_s(codecpar, yield libav.AVCodecDescriptor_type(desc));
30329
+ yield libav.AVCodecParameters_codec_id_s(codecpar, yield libav.AVCodecDescriptor_id(desc));
30330
+ yield libav.AVCodecParameters_width_s(codecpar, config.width);
30331
+ yield libav.AVCodecParameters_height_s(codecpar, config.height);
30332
+ }
30333
+ let timebaseNum = 1, timebaseDen = 1e6;
30334
+ if (config.framerate) {
30335
+ if (config.framerate === ~~config.framerate) {
30336
+ timebaseDen = config.framerate;
30337
+ } else {
30338
+ const fr1001 = config.framerate * 1001;
30339
+ if (fr1001 === ~~fr1001) {
30340
+ timebaseNum = 1001;
30341
+ timebaseDen = fr1001;
30342
+ } else {
30343
+ timebaseDen = config.framerate;
30344
+ while (timebaseDen !== Math.floor(timebaseDen)) {
30345
+ timebaseNum *= 2;
30346
+ timebaseDen *= 2;
30347
+ }
30348
+ }
30349
+ }
30350
+ }
30351
+ return [codecpar, timebaseNum, timebaseDen];
30352
+ });
30353
+ }
30354
+ function times(chunk, stream) {
30355
+ const num = stream[1];
30356
+ const den = stream[2];
30357
+ return {
30358
+ timestamp: Math.round(chunk.timestamp * den / num / 1e6),
30359
+ duration: Math.round((chunk.duration || 0) * den / num / 1e6)
30360
+ };
30361
+ }
30362
+ function encodedChunkToPacket(chunk, stream, streamIndex) {
30363
+ const { timestamp, duration } = times(chunk, stream);
30364
+ let pts, ptshi, dur, durhi;
30365
+ if (typeof LibAV !== "undefined" && LibAV.f64toi64) {
30366
+ [pts, ptshi] = LibAV.f64toi64(timestamp);
30367
+ [dur, durhi] = LibAV.f64toi64(duration);
30368
+ } else {
30369
+ pts = ~~timestamp;
30370
+ ptshi = Math.floor(timestamp / 4294967296);
30371
+ dur = ~~duration;
30372
+ durhi = Math.floor(duration / 4294967296);
30373
+ }
30374
+ const data = new Uint8Array(chunk.byteLength);
30375
+ chunk.copyTo(data.buffer);
30376
+ return {
30377
+ data,
30378
+ pts,
30379
+ ptshi,
30380
+ dts: pts,
30381
+ dtshi: ptshi,
30382
+ time_base_num: stream[1],
30383
+ time_base_den: stream[2],
30384
+ stream_index: streamIndex,
30385
+ flags: 0,
30386
+ duration: dur,
30387
+ durationhi: durhi
30388
+ };
30389
+ }
30390
+ function encodedAudioChunkToPacket$1(libav, chunk, metadata, stream, streamIndex) {
30391
+ return __awaiter$1(this, void 0, void 0, function* () {
30392
+ return encodedChunkToPacket(chunk, stream, streamIndex);
30393
+ });
30394
+ }
30395
+ function encodedVideoChunkToPacket$1(libav, chunk, metadata, stream, streamIndex) {
30396
+ return __awaiter$1(this, void 0, void 0, function* () {
30397
+ const ret = encodedChunkToPacket(chunk, stream, streamIndex);
30398
+ if (chunk.type === "key")
30399
+ ret.flags = 1;
30400
+ if (stream[0] && metadata && metadata.decoderConfig && metadata.decoderConfig.description) {
30401
+ const codecpar = stream[0];
30402
+ const oldExtradata = yield libav.AVCodecParameters_extradata(codecpar);
30403
+ if (!oldExtradata) {
30404
+ let description = metadata.decoderConfig.description;
30405
+ if (description.buffer)
30406
+ description = description.slice(0);
30407
+ else
30408
+ description = new Uint8Array(description).slice(0);
30409
+ const extradata = yield libav.malloc(description.length);
30410
+ yield libav.copyin_u8(extradata, description);
30411
+ yield libav.AVCodecParameters_extradata_s(codecpar, extradata);
30412
+ yield libav.AVCodecParameters_extradata_size_s(codecpar, description.length);
30413
+ }
30414
+ }
30415
+ return ret;
30416
+ });
30417
+ }
30418
+ function videoFrameToLAFrame$1(frame) {
30419
+ return __awaiter(this, void 0, void 0, function* () {
30420
+ const data = new Uint8Array(frame.allocationSize());
30421
+ yield frame.copyTo(data);
30422
+ let libavjs5 = true;
30423
+ if (typeof LibAV !== "undefined" && LibAV && LibAV.VER && parseInt(LibAV.VER) < 5) {
30424
+ libavjs5 = false;
30425
+ }
30426
+ let libavFormat = 5, bpp = 1, planes = 3, cwlog2 = 0, chlog2 = 0;
30427
+ switch (frame.format) {
30428
+ case "I420":
30429
+ libavFormat = 0;
30430
+ cwlog2 = chlog2 = 1;
30431
+ break;
30432
+ case "I420A":
30433
+ libavFormat = 33;
30434
+ planes = 4;
30435
+ cwlog2 = chlog2 = 1;
30436
+ break;
30437
+ case "I422":
30438
+ libavFormat = 4;
30439
+ cwlog2 = 1;
30440
+ break;
30441
+ case "NV12":
30442
+ libavFormat = 23;
30443
+ planes = 2;
30444
+ chlog2 = 1;
30445
+ break;
30446
+ case "RGBA":
30447
+ case "RGBX":
30448
+ libavFormat = 26;
30449
+ planes = 1;
30450
+ bpp = 4;
30451
+ break;
30452
+ case "BGRA":
30453
+ case "BGRX":
30454
+ libavFormat = 28;
30455
+ planes = 1;
30456
+ bpp = 4;
30457
+ break;
30458
+ }
30459
+ const laFrame = {
30460
+ format: libavFormat,
30461
+ data: null,
30462
+ pts: ~~frame.timestamp,
30463
+ ptshi: Math.floor(frame.timestamp / 4294967296),
30464
+ time_base_num: 1,
30465
+ time_base_den: 1e6,
30466
+ width: frame.visibleRect.width,
30467
+ height: frame.visibleRect.height
30468
+ };
30469
+ if (libavjs5) {
30470
+ const layout = [];
30471
+ let offset = 0;
30472
+ for (let p = 0; p < planes; p++) {
30473
+ let w = frame.visibleRect.width;
30474
+ let h = frame.visibleRect.height;
30475
+ if (p === 1 || p === 2) {
30476
+ w >>= cwlog2;
30477
+ h >>= chlog2;
30478
+ }
30479
+ layout.push({ offset, stride: w * bpp });
30480
+ offset += w * h * bpp;
30481
+ }
30482
+ laFrame.data = data;
30483
+ laFrame.layout = layout;
30484
+ } else {
30485
+ laFrame.data = [];
30486
+ let offset = 0;
30487
+ for (let p = 0; p < planes; p++) {
30488
+ const plane = [];
30489
+ laFrame.data.push(plane);
30490
+ let wlog2 = 0, hlog2 = 0;
30491
+ if (p === 1 || p === 2) {
30492
+ wlog2 = cwlog2;
30493
+ hlog2 = chlog2;
30494
+ }
30495
+ for (let y = 0; y < frame.visibleRect.height >>> hlog2; y++) {
30496
+ const w = frame.visibleRect.width * bpp >>> wlog2;
30497
+ plane.push(data.subarray(offset, offset + w));
30498
+ offset += w;
30499
+ }
30500
+ }
30501
+ }
30502
+ return laFrame;
30503
+ });
30504
+ }
30505
+ function audioDataToLAFrame$1(frame) {
30506
+ return __awaiter(this, void 0, void 0, function* () {
30507
+ let libavFormat = 6;
30508
+ let TypedArray = Int16Array;
30509
+ const planar = /-planar$/.test(frame.format);
30510
+ switch (frame.format) {
30511
+ case "u8":
30512
+ case "u8-planar":
30513
+ libavFormat = planar ? 5 : 0;
30514
+ TypedArray = Uint8Array;
30515
+ break;
30516
+ case "s16":
30517
+ case "s16-planar":
30518
+ libavFormat = planar ? 6 : 1;
30519
+ break;
30520
+ case "s32":
30521
+ case "s32-planar":
30522
+ libavFormat = planar ? 7 : 2;
30523
+ TypedArray = Int32Array;
30524
+ break;
30525
+ case "f32":
30526
+ case "f32-planar":
30527
+ libavFormat = planar ? 8 : 3;
30528
+ TypedArray = Float32Array;
30529
+ break;
30530
+ }
30531
+ const laFrame = {
30532
+ format: libavFormat,
30533
+ data: null,
30534
+ pts: ~~frame.timestamp,
30535
+ ptshi: Math.floor(frame.timestamp / 4294967296),
30536
+ time_base_num: 1,
30537
+ time_base_den: 1e6,
30538
+ sample_rate: frame.sampleRate,
30539
+ nb_samples: frame.numberOfFrames,
30540
+ channels: frame.numberOfChannels
30541
+ };
30542
+ if (planar) {
30543
+ laFrame.data = [];
30544
+ for (let p = 0; p < frame.numberOfChannels; p++) {
30545
+ const plane = new TypedArray(frame.numberOfFrames);
30546
+ laFrame.data.push(plane);
30547
+ yield frame.copyTo(plane.buffer, { planeIndex: p, format: frame.format });
30548
+ }
30549
+ } else {
30550
+ const data = laFrame.data = new TypedArray(frame.numberOfFrames * frame.numberOfChannels);
30551
+ yield frame.copyTo(data.buffer, { planeIndex: 0, format: frame.format });
30552
+ }
30553
+ return laFrame;
30554
+ });
30555
+ }
30556
+ function i64tof64(lo, hi) {
30557
+ if (!hi && lo >= 0)
30558
+ return lo;
30559
+ if (hi === -1 && lo < 0)
30560
+ return lo;
30561
+ return hi * 4294967296 + lo + (lo < 0 ? 4294967296 : 0);
30562
+ }
30563
+ function laTimeToWCTime(lo, hi, timeBase) {
30564
+ let ret = i64tof64(lo, hi);
30565
+ if (timeBase)
30566
+ ret = Math.round(ret * 1e6 * timeBase[0] / timeBase[1]);
30567
+ return ret;
30568
+ }
30569
+ function laFrameToVideoFrame$1(frame, opts = {}) {
30570
+ let VF;
30571
+ if (opts.VideoFrame)
30572
+ VF = opts.VideoFrame;
30573
+ else
30574
+ VF = VideoFrame;
30575
+ let layout;
30576
+ let data;
30577
+ let transfer = [];
30578
+ let timeBase = opts.timeBase;
30579
+ if (!timeBase && frame.time_base_num)
30580
+ timeBase = [frame.time_base_num || 1, frame.time_base_den || 1e6];
30581
+ if (frame.layout) {
30582
+ data = frame.data;
30583
+ layout = frame.layout;
30584
+ if (opts.transfer)
30585
+ transfer.push(data.buffer);
30586
+ } else {
30587
+ layout = [];
30588
+ let size = 0;
30589
+ for (let p = 0; p < frame.data.length; p++) {
30590
+ const plane = frame.data[p];
30591
+ layout.push({
30592
+ offset: size,
30593
+ stride: plane[0].length
30594
+ });
30595
+ size += plane.length * plane[0].length;
30596
+ }
30597
+ data = new Uint8Array(size);
30598
+ let offset = 0;
30599
+ for (let p = 0; p < frame.data.length; p++) {
30600
+ const plane = frame.data[p];
30601
+ const linesize = plane[0].length;
30602
+ for (let y = 0; y < plane.length; y++) {
30603
+ data.set(plane[y], offset);
30604
+ offset += linesize;
30605
+ }
30606
+ }
30607
+ transfer.push(data.buffer);
30608
+ }
30609
+ let format = "I420";
30610
+ switch (frame.format) {
30611
+ case 0:
30612
+ format = "I420";
30613
+ break;
30614
+ case 33:
30615
+ format = "I420A";
30616
+ break;
30617
+ case 4:
30618
+ format = "I422";
30619
+ break;
30620
+ case 23:
30621
+ format = "NV12";
30622
+ break;
30623
+ case 26:
30624
+ format = "RGBA";
30625
+ break;
30626
+ case 28:
30627
+ format = "BGRA";
30628
+ break;
30629
+ default:
30630
+ throw new Error("Unsupported pixel format");
30631
+ }
30632
+ return new VF(data, {
30633
+ format,
30634
+ codedWidth: frame.width,
30635
+ codedHeight: frame.height,
30636
+ timestamp: laTimeToWCTime(frame.pts || 0, frame.ptshi || 0, timeBase),
30637
+ layout,
30638
+ transfer
30639
+ });
30640
+ }
30641
+ function laFrameToAudioData$1(frame, opts = {}) {
30642
+ let AD;
30643
+ if (opts.AudioData)
30644
+ AD = opts.AudioData;
30645
+ else
30646
+ AD = AudioData;
30647
+ let timeBase = opts.timeBase;
30648
+ if (!timeBase && frame.time_base_num)
30649
+ timeBase = [frame.time_base_num || 1, frame.time_base_den || 1e6];
30650
+ let size = 0;
30651
+ if (frame.data.buffer) {
30652
+ size = frame.data.byteLength;
30653
+ } else {
30654
+ for (let p = 0; p < frame.data.length; p++)
30655
+ size += frame.data[p].byteLength;
30656
+ }
30657
+ const data = new Uint8Array(size);
30658
+ if (frame.data.buffer) {
30659
+ const rd = frame.data;
30660
+ data.set(new Uint8Array(rd.buffer, rd.byteOffset, rd.byteLength));
30661
+ } else {
30662
+ let offset = 0;
30663
+ for (let p = 0; p < frame.data.length; p++) {
30664
+ const rp = frame.data[p];
30665
+ const plane = new Uint8Array(rp.buffer, rp.byteOffset, rp.byteLength);
30666
+ data.set(plane, offset);
30667
+ offset += plane.length;
30668
+ }
30669
+ }
30670
+ let format = "s16";
30671
+ switch (frame.format) {
30672
+ case 0:
30673
+ format = "u8";
30674
+ break;
30675
+ case 1:
30676
+ format = "s16";
30677
+ break;
30678
+ case 2:
30679
+ format = "s32";
30680
+ break;
30681
+ case 3:
30682
+ format = "f32";
30683
+ break;
30684
+ case 5:
30685
+ format = "u8-planar";
30686
+ break;
30687
+ case 6:
30688
+ format = "s16-planar";
30689
+ break;
30690
+ case 7:
30691
+ format = "s32-planar";
30692
+ break;
30693
+ case 8:
30694
+ format = "f32-planar";
30695
+ break;
30696
+ default:
30697
+ throw new Error("Unsupported sample format");
30698
+ }
30699
+ return new AD({
30700
+ format,
30701
+ data,
30702
+ sampleRate: frame.sample_rate,
30703
+ numberOfFrames: frame.nb_samples,
30704
+ numberOfChannels: frame.channels,
30705
+ timestamp: laTimeToWCTime(frame.pts || 0, frame.ptshi || 0, timeBase)
30706
+ });
30707
+ }
30708
+ var __awaiter$2, __awaiter$1, __awaiter, audioStreamToConfig, videoStreamToConfig, packetToEncodedAudioChunk, packetToEncodedVideoChunk, configToAudioStream, configToVideoStream, encodedAudioChunkToPacket, encodedVideoChunkToPacket, videoFrameToLAFrame, audioDataToLAFrame, laFrameToVideoFrame, laFrameToAudioData;
30709
+ var init_libavjs_webcodecs_bridge = __esm({
30710
+ "node_modules/libavjs-webcodecs-bridge/dist/libavjs-webcodecs-bridge.mjs"() {
30711
+ __awaiter$2 = function(thisArg, _arguments, P, generator) {
30712
+ function adopt(value) {
30713
+ return value instanceof P ? value : new P(function(resolve) {
30714
+ resolve(value);
30715
+ });
30716
+ }
30717
+ return new (P || (P = Promise))(function(resolve, reject) {
30718
+ function fulfilled(value) {
30719
+ try {
30720
+ step(generator.next(value));
30721
+ } catch (e) {
30722
+ reject(e);
30723
+ }
30724
+ }
30725
+ function rejected(value) {
30726
+ try {
30727
+ step(generator["throw"](value));
30728
+ } catch (e) {
30729
+ reject(e);
30730
+ }
30731
+ }
30732
+ function step(result) {
30733
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
30734
+ }
30735
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
30736
+ });
30737
+ };
30738
+ __awaiter$1 = function(thisArg, _arguments, P, generator) {
30739
+ function adopt(value) {
30740
+ return value instanceof P ? value : new P(function(resolve) {
30741
+ resolve(value);
30742
+ });
30743
+ }
30744
+ return new (P || (P = Promise))(function(resolve, reject) {
30745
+ function fulfilled(value) {
30746
+ try {
30747
+ step(generator.next(value));
30748
+ } catch (e) {
30749
+ reject(e);
30750
+ }
30751
+ }
30752
+ function rejected(value) {
30753
+ try {
30754
+ step(generator["throw"](value));
30755
+ } catch (e) {
30756
+ reject(e);
30757
+ }
30758
+ }
30759
+ function step(result) {
30760
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
30761
+ }
30762
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
30763
+ });
30764
+ };
30765
+ __awaiter = function(thisArg, _arguments, P, generator) {
30766
+ function adopt(value) {
30767
+ return value instanceof P ? value : new P(function(resolve) {
30768
+ resolve(value);
30769
+ });
30770
+ }
30771
+ return new (P || (P = Promise))(function(resolve, reject) {
30772
+ function fulfilled(value) {
30773
+ try {
30774
+ step(generator.next(value));
30775
+ } catch (e) {
30776
+ reject(e);
30777
+ }
30778
+ }
30779
+ function rejected(value) {
30780
+ try {
30781
+ step(generator["throw"](value));
30782
+ } catch (e) {
30783
+ reject(e);
30784
+ }
30785
+ }
30786
+ function step(result) {
30787
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
30788
+ }
30789
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
30790
+ });
30791
+ };
30792
+ audioStreamToConfig = audioStreamToConfig$1;
30793
+ videoStreamToConfig = videoStreamToConfig$1;
30794
+ packetToEncodedAudioChunk = packetToEncodedAudioChunk$1;
30795
+ packetToEncodedVideoChunk = packetToEncodedVideoChunk$1;
30796
+ configToAudioStream = configToAudioStream$1;
30797
+ configToVideoStream = configToVideoStream$1;
30798
+ encodedAudioChunkToPacket = encodedAudioChunkToPacket$1;
30799
+ encodedVideoChunkToPacket = encodedVideoChunkToPacket$1;
30800
+ videoFrameToLAFrame = videoFrameToLAFrame$1;
30801
+ audioDataToLAFrame = audioDataToLAFrame$1;
30802
+ laFrameToVideoFrame = laFrameToVideoFrame$1;
30803
+ laFrameToAudioData = laFrameToAudioData$1;
30804
+ }
30805
+ });
30806
+
29905
30807
  // src/strategies/fallback/libav-import.ts
29906
30808
  var libav_import_exports = {};
29907
30809
  __export(libav_import_exports, {
@@ -29910,7 +30812,8 @@ __export(libav_import_exports, {
29910
30812
  var libavBridge;
29911
30813
  var init_libav_import = __esm({
29912
30814
  "src/strategies/fallback/libav-import.ts"() {
29913
- libavBridge = bridge;
30815
+ init_libavjs_webcodecs_bridge();
30816
+ libavBridge = libavjs_webcodecs_bridge_exports;
29914
30817
  }
29915
30818
  });
29916
30819
 
@@ -30147,10 +31050,21 @@ async function probe(source) {
30147
31050
  if (MEDIABUNNY_CONTAINERS.has(sniffed)) {
30148
31051
  try {
30149
31052
  return await probeWithMediabunny(normalized, sniffed);
30150
- } catch (err) {
30151
- throw new Error(
30152
- `mediabunny failed to probe a ${sniffed} file: ${err.message}`
31053
+ } catch (mediabunnyErr) {
31054
+ console.warn(
31055
+ `[avbridge] mediabunny rejected ${sniffed} file, falling back to libav:`,
31056
+ mediabunnyErr.message
30153
31057
  );
31058
+ try {
31059
+ const { probeWithLibav: probeWithLibav2 } = await Promise.resolve().then(() => (init_avi(), avi_exports));
31060
+ return await probeWithLibav2(normalized, sniffed);
31061
+ } catch (libavErr) {
31062
+ const mbMsg = mediabunnyErr.message || String(mediabunnyErr);
31063
+ const lvMsg = libavErr instanceof Error ? libavErr.message : String(libavErr);
31064
+ throw new Error(
31065
+ `failed to probe ${sniffed} file. mediabunny: ${mbMsg}. libav fallback: ${lvMsg}.`
31066
+ );
31067
+ }
30154
31068
  }
30155
31069
  }
30156
31070
  try {
@@ -30873,7 +31787,8 @@ async function createRemuxPipeline(ctx, video) {
30873
31787
  if (destroyed || pumpToken !== token) break;
30874
31788
  const vTs = !vNext.done ? vNext.value.timestamp : Number.POSITIVE_INFINITY;
30875
31789
  const aTs = !aNext.done ? aNext.value.timestamp : Number.POSITIVE_INFINITY;
30876
- if (!vNext.done && vTs <= aTs) {
31790
+ const forceVideoFirst = firstVideo && !vNext.done;
31791
+ if (!vNext.done && (forceVideoFirst || vTs <= aTs)) {
30877
31792
  await videoSource.add(
30878
31793
  vNext.value,
30879
31794
  firstVideo && videoConfig ? { decoderConfig: videoConfig } : void 0
@@ -31011,11 +31926,20 @@ var VideoRenderer = class {
31011
31926
  });
31012
31927
  this.canvas = document.createElement("canvas");
31013
31928
  this.canvas.style.cssText = "position:absolute;left:0;top:0;width:100%;height:100%;background:black;";
31014
- const parent = target.parentElement;
31015
- if (parent && getComputedStyle(parent).position === "static") {
31016
- parent.style.position = "relative";
31929
+ const parent = target.parentElement ?? target.parentNode;
31930
+ if (parent && parent instanceof HTMLElement) {
31931
+ if (getComputedStyle(parent).position === "static") {
31932
+ parent.style.position = "relative";
31933
+ }
31934
+ }
31935
+ if (parent) {
31936
+ parent.insertBefore(this.canvas, target);
31937
+ } else {
31938
+ console.warn(
31939
+ "[avbridge] fallback renderer: target <video> has no parent; appending canvas to document.body as a fallback."
31940
+ );
31941
+ document.body.appendChild(this.canvas);
31017
31942
  }
31018
- parent?.insertBefore(this.canvas, target);
31019
31943
  target.style.visibility = "hidden";
31020
31944
  const ctx = this.canvas.getContext("2d");
31021
31945
  if (!ctx) throw new Error("video renderer: failed to acquire 2D context");
@@ -31375,7 +32299,7 @@ function pickLibavVariant(ctx) {
31375
32299
  async function startHybridDecoder(opts) {
31376
32300
  const variant = pickLibavVariant(opts.context);
31377
32301
  const libav = await loadLibav(variant);
31378
- const bridge2 = await loadBridge();
32302
+ const bridge = await loadBridge();
31379
32303
  const { prepareLibavInput: prepareLibavInput2 } = await Promise.resolve().then(() => (init_libav_http_reader(), libav_http_reader_exports));
31380
32304
  const inputHandle = await prepareLibavInput2(libav, opts.filename, opts.source);
31381
32305
  const readPkt = await libav.av_packet_alloc();
@@ -31396,7 +32320,7 @@ async function startHybridDecoder(opts) {
31396
32320
  let videoTimeBase;
31397
32321
  if (videoStream) {
31398
32322
  try {
31399
- const config = await bridge2.videoStreamToConfig(libav, videoStream);
32323
+ const config = await bridge.videoStreamToConfig(libav, videoStream);
31400
32324
  if (!config) throw new Error("bridge returned null config");
31401
32325
  const supported = await VideoDecoder.isConfigSupported(config);
31402
32326
  if (!supported.supported) throw new Error(`VideoDecoder does not support config: ${JSON.stringify(config)}`);
@@ -31484,7 +32408,7 @@ async function startHybridDecoder(opts) {
31484
32408
  return ts;
31485
32409
  }, videoTimeBase);
31486
32410
  try {
31487
- const chunk = bridge2.packetToEncodedVideoChunk(pkt, videoStream);
32411
+ const chunk = bridge.packetToEncodedVideoChunk(pkt, videoStream);
31488
32412
  videoDecoder.decode(chunk);
31489
32413
  videoChunksFed++;
31490
32414
  } catch (err) {
@@ -31918,7 +32842,7 @@ init_libav_loader();
31918
32842
  async function startDecoder(opts) {
31919
32843
  const variant = pickLibavVariant(opts.context);
31920
32844
  const libav = await loadLibav(variant);
31921
- const bridge2 = await loadBridge2();
32845
+ const bridge = await loadBridge2();
31922
32846
  const { prepareLibavInput: prepareLibavInput2 } = await Promise.resolve().then(() => (init_libav_http_reader(), libav_http_reader_exports));
31923
32847
  const inputHandle = await prepareLibavInput2(libav, opts.filename, opts.source);
31924
32848
  const readPkt = await libav.av_packet_alloc();
@@ -32062,7 +32986,7 @@ async function startDecoder(opts) {
32062
32986
  videoTimeBase
32063
32987
  );
32064
32988
  try {
32065
- const vf = bridge2.laFrameToVideoFrame(f, bridgeOpts);
32989
+ const vf = bridge.laFrameToVideoFrame(f, bridgeOpts);
32066
32990
  opts.renderer.enqueue(vf);
32067
32991
  videoFramesDecoded++;
32068
32992
  } catch (err) {
@@ -33089,11 +34013,15 @@ var AvbridgeVideoElement = class extends HTMLElementCtor {
33089
34013
  constructor() {
33090
34014
  super();
33091
34015
  const root = this.attachShadow({ mode: "open" });
34016
+ const stage = document.createElement("div");
34017
+ stage.setAttribute("part", "stage");
34018
+ stage.style.cssText = "position:relative;width:100%;height:100%;display:block;";
34019
+ root.appendChild(stage);
33092
34020
  this._videoEl = document.createElement("video");
33093
34021
  this._videoEl.setAttribute("part", "video");
33094
34022
  this._videoEl.style.cssText = "width:100%;height:100%;display:block;background:#000;";
33095
34023
  this._videoEl.playsInline = true;
33096
- root.appendChild(this._videoEl);
34024
+ stage.appendChild(this._videoEl);
33097
34025
  this._videoEl.addEventListener("progress", () => {
33098
34026
  if (this._destroyed) return;
33099
34027
  this._dispatch("progress", { buffered: this._videoEl.buffered });