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.
- package/CHANGELOG.md +56 -0
- package/dist/{chunk-CUQD23WO.js → chunk-3AUGRKPY.js} +31 -10
- package/dist/chunk-3AUGRKPY.js.map +1 -0
- package/dist/{chunk-O34444ID.cjs → chunk-DPVIOYGC.cjs} +31 -10
- package/dist/chunk-DPVIOYGC.cjs.map +1 -0
- package/dist/element-browser.js +945 -17
- package/dist/element-browser.js.map +1 -1
- package/dist/element.cjs +7 -3
- package/dist/element.cjs.map +1 -1
- package/dist/element.js +6 -2
- package/dist/element.js.map +1 -1
- package/dist/index.cjs +14 -14
- package/dist/index.d.cts +10 -6
- package/dist/index.d.ts +10 -6
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/src/element/avbridge-video.ts +12 -1
- package/src/probe/index.ts +30 -9
- package/src/strategies/fallback/video-renderer.ts +29 -4
- package/src/strategies/remux/pipeline.ts +10 -1
- package/dist/chunk-CUQD23WO.js.map +0 -1
- package/dist/chunk-O34444ID.cjs.map +0 -1
package/dist/element-browser.js
CHANGED
|
@@ -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
|
-
|
|
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 (
|
|
30151
|
-
|
|
30152
|
-
`mediabunny
|
|
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
|
-
|
|
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 &&
|
|
31016
|
-
parent.
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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 });
|