@remotion/webcodecs 4.0.306 → 4.0.308
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/dist/audio-decoder.d.ts +3 -3
- package/dist/audio-encoder.js +1 -1
- package/dist/can-copy-audio-track.d.ts +3 -1
- package/dist/can-copy-audio-track.js +10 -1
- package/dist/can-copy-video-track.d.ts +3 -1
- package/dist/can-copy-video-track.js +10 -1
- package/dist/create/matroska/matroska-utils.d.ts +1 -1
- package/dist/create-audio-decoder.d.ts +24 -0
- package/dist/create-audio-decoder.js +112 -0
- package/dist/create-video-decoder.d.ts +23 -0
- package/dist/create-video-decoder.js +89 -0
- package/dist/esm/index.mjs +336 -263
- package/dist/get-wave-audio-decoder.d.ts +1 -1
- package/dist/get-wave-audio-decoder.js +13 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +5 -5
- package/dist/io-manager/io-synchronizer.d.ts +0 -1
- package/dist/io-manager/io-synchronizer.js +0 -4
- package/dist/is-different-video-codec.d.ts +11 -0
- package/dist/is-different-video-codec.js +36 -0
- package/dist/on-audio-track.js +1 -0
- package/dist/on-video-track.js +1 -0
- package/dist/processing-queue.d.ts +0 -1
- package/dist/reencode-audio-track.js +4 -4
- package/dist/reencode-video-track.js +4 -4
- package/dist/video-encoder.js +1 -1
- package/package.json +5 -5
- package/dist/select-container-creator.d.ts +0 -2
- package/dist/select-container-creator.js +0 -19
package/dist/esm/index.mjs
CHANGED
|
@@ -432,70 +432,10 @@ var setRemotionImported = () => {
|
|
|
432
432
|
}
|
|
433
433
|
};
|
|
434
434
|
|
|
435
|
-
// src/
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
}
|
|
440
|
-
if (sampleFormat === "s32") {
|
|
441
|
-
return 4;
|
|
442
|
-
}
|
|
443
|
-
if (sampleFormat === "f32") {
|
|
444
|
-
return 4;
|
|
445
|
-
}
|
|
446
|
-
if (sampleFormat === "u8") {
|
|
447
|
-
return 1;
|
|
448
|
-
}
|
|
449
|
-
if (sampleFormat === "f32-planar") {
|
|
450
|
-
return 4;
|
|
451
|
-
}
|
|
452
|
-
if (sampleFormat === "s16-planar") {
|
|
453
|
-
return 2;
|
|
454
|
-
}
|
|
455
|
-
if (sampleFormat === "s32-planar") {
|
|
456
|
-
return 4;
|
|
457
|
-
}
|
|
458
|
-
if (sampleFormat === "u8-planar") {
|
|
459
|
-
return 1;
|
|
460
|
-
}
|
|
461
|
-
throw new Error(`Unsupported sample format: ${sampleFormat}`);
|
|
462
|
-
};
|
|
463
|
-
var getWaveAudioDecoder = ({
|
|
464
|
-
onFrame,
|
|
465
|
-
config,
|
|
466
|
-
sampleFormat,
|
|
467
|
-
ioSynchronizer,
|
|
468
|
-
onError
|
|
469
|
-
}) => {
|
|
470
|
-
const processSample = async (audioSample) => {
|
|
471
|
-
const bytesPerSample = getBytesPerSample(sampleFormat);
|
|
472
|
-
const audioData = new AudioData({
|
|
473
|
-
data: audioSample.data,
|
|
474
|
-
format: sampleFormat,
|
|
475
|
-
numberOfChannels: config.numberOfChannels,
|
|
476
|
-
numberOfFrames: audioSample.data.byteLength / bytesPerSample / config.numberOfChannels,
|
|
477
|
-
sampleRate: config.sampleRate,
|
|
478
|
-
timestamp: audioSample.timestamp
|
|
479
|
-
});
|
|
480
|
-
try {
|
|
481
|
-
await onFrame(audioData);
|
|
482
|
-
} catch (err) {
|
|
483
|
-
audioData.close();
|
|
484
|
-
onError(err);
|
|
485
|
-
}
|
|
486
|
-
};
|
|
487
|
-
return {
|
|
488
|
-
close() {
|
|
489
|
-
return Promise.resolve();
|
|
490
|
-
},
|
|
491
|
-
decode(audioSample) {
|
|
492
|
-
processSample(audioSample);
|
|
493
|
-
},
|
|
494
|
-
flush: () => Promise.resolve(),
|
|
495
|
-
waitForFinish: () => Promise.resolve(),
|
|
496
|
-
waitForQueueToBeLessThan: ioSynchronizer.waitForQueueSize
|
|
497
|
-
};
|
|
498
|
-
};
|
|
435
|
+
// src/audio-encoder.ts
|
|
436
|
+
import {
|
|
437
|
+
MediaParserAbortError
|
|
438
|
+
} from "@remotion/media-parser";
|
|
499
439
|
|
|
500
440
|
// src/create/event-emitter.ts
|
|
501
441
|
class IoEventEmitter {
|
|
@@ -669,120 +609,13 @@ var makeIoSynchronizer = ({
|
|
|
669
609
|
controller._internals._mediaParserController._internals.signal.removeEventListener("abort", clear);
|
|
670
610
|
}
|
|
671
611
|
};
|
|
672
|
-
const waitForFinish = async () => {
|
|
673
|
-
await waitForQueueSize(0);
|
|
674
|
-
};
|
|
675
612
|
return {
|
|
676
613
|
inputItem,
|
|
677
614
|
onOutput,
|
|
678
|
-
waitForFinish,
|
|
679
615
|
waitForQueueSize
|
|
680
616
|
};
|
|
681
617
|
};
|
|
682
618
|
|
|
683
|
-
// src/audio-decoder.ts
|
|
684
|
-
var internalCreateAudioDecoder = ({
|
|
685
|
-
onFrame,
|
|
686
|
-
onError,
|
|
687
|
-
controller,
|
|
688
|
-
config,
|
|
689
|
-
logLevel
|
|
690
|
-
}) => {
|
|
691
|
-
if (controller && controller._internals._mediaParserController._internals.signal.aborted) {
|
|
692
|
-
throw new Error("Not creating audio decoder, already aborted");
|
|
693
|
-
}
|
|
694
|
-
const ioSynchronizer = makeIoSynchronizer({
|
|
695
|
-
logLevel,
|
|
696
|
-
label: "Audio decoder",
|
|
697
|
-
controller
|
|
698
|
-
});
|
|
699
|
-
if (config.codec === "pcm-s16") {
|
|
700
|
-
return getWaveAudioDecoder({
|
|
701
|
-
onFrame,
|
|
702
|
-
config,
|
|
703
|
-
sampleFormat: "s16",
|
|
704
|
-
logLevel,
|
|
705
|
-
ioSynchronizer,
|
|
706
|
-
onError
|
|
707
|
-
});
|
|
708
|
-
}
|
|
709
|
-
const audioDecoder = new AudioDecoder({
|
|
710
|
-
async output(frame) {
|
|
711
|
-
try {
|
|
712
|
-
await onFrame(frame);
|
|
713
|
-
} catch (err) {
|
|
714
|
-
frame.close();
|
|
715
|
-
onError(err);
|
|
716
|
-
}
|
|
717
|
-
ioSynchronizer.onOutput(frame.timestamp + (frame.duration ?? 0));
|
|
718
|
-
},
|
|
719
|
-
error(error) {
|
|
720
|
-
onError(error);
|
|
721
|
-
}
|
|
722
|
-
});
|
|
723
|
-
const close = () => {
|
|
724
|
-
if (controller) {
|
|
725
|
-
controller._internals._mediaParserController._internals.signal.removeEventListener("abort", onAbort);
|
|
726
|
-
}
|
|
727
|
-
if (audioDecoder.state === "closed") {
|
|
728
|
-
return;
|
|
729
|
-
}
|
|
730
|
-
audioDecoder.close();
|
|
731
|
-
};
|
|
732
|
-
const onAbort = () => {
|
|
733
|
-
close();
|
|
734
|
-
};
|
|
735
|
-
if (controller) {
|
|
736
|
-
controller._internals._mediaParserController._internals.signal.addEventListener("abort", onAbort);
|
|
737
|
-
}
|
|
738
|
-
audioDecoder.configure(config);
|
|
739
|
-
const processSample = (audioSample) => {
|
|
740
|
-
if (audioDecoder.state === "closed") {
|
|
741
|
-
return;
|
|
742
|
-
}
|
|
743
|
-
const chunk = audioSample instanceof EncodedAudioChunk ? audioSample : new EncodedAudioChunk(audioSample);
|
|
744
|
-
audioDecoder.decode(chunk);
|
|
745
|
-
if (chunk.byteLength > 16) {
|
|
746
|
-
ioSynchronizer.inputItem(chunk.timestamp);
|
|
747
|
-
}
|
|
748
|
-
};
|
|
749
|
-
return {
|
|
750
|
-
decode: (sample) => {
|
|
751
|
-
processSample(sample);
|
|
752
|
-
},
|
|
753
|
-
waitForFinish: async () => {
|
|
754
|
-
try {
|
|
755
|
-
await audioDecoder.flush();
|
|
756
|
-
} catch {}
|
|
757
|
-
await ioSynchronizer.waitForFinish();
|
|
758
|
-
},
|
|
759
|
-
close,
|
|
760
|
-
flush: async () => {
|
|
761
|
-
await audioDecoder.flush();
|
|
762
|
-
},
|
|
763
|
-
waitForQueueToBeLessThan: ioSynchronizer.waitForQueueSize
|
|
764
|
-
};
|
|
765
|
-
};
|
|
766
|
-
var createAudioDecoder = ({
|
|
767
|
-
onFrame,
|
|
768
|
-
onError,
|
|
769
|
-
controller,
|
|
770
|
-
track,
|
|
771
|
-
logLevel
|
|
772
|
-
}) => {
|
|
773
|
-
return internalCreateAudioDecoder({
|
|
774
|
-
onFrame,
|
|
775
|
-
onError,
|
|
776
|
-
controller: controller ?? null,
|
|
777
|
-
config: track,
|
|
778
|
-
logLevel: logLevel ?? "error"
|
|
779
|
-
});
|
|
780
|
-
};
|
|
781
|
-
// src/audio-encoder.ts
|
|
782
|
-
import {
|
|
783
|
-
MediaParserAbortError
|
|
784
|
-
} from "@remotion/media-parser";
|
|
785
|
-
|
|
786
619
|
// src/audio-data/data-types.ts
|
|
787
620
|
var getDataTypeForAudioFormat = (format) => {
|
|
788
621
|
switch (format) {
|
|
@@ -1007,7 +840,7 @@ var createAudioEncoder = ({
|
|
|
1007
840
|
},
|
|
1008
841
|
waitForFinish: async () => {
|
|
1009
842
|
await encoder.flush();
|
|
1010
|
-
await ioSynchronizer.
|
|
843
|
+
await ioSynchronizer.waitForQueueSize(0);
|
|
1011
844
|
},
|
|
1012
845
|
close,
|
|
1013
846
|
flush: async () => {
|
|
@@ -1016,12 +849,56 @@ var createAudioEncoder = ({
|
|
|
1016
849
|
ioSynchronizer
|
|
1017
850
|
};
|
|
1018
851
|
};
|
|
852
|
+
// src/is-different-video-codec.ts
|
|
853
|
+
var isSameVideoCodec = ({
|
|
854
|
+
inputVideoCodec,
|
|
855
|
+
outputCodec
|
|
856
|
+
}) => {
|
|
857
|
+
if (outputCodec === "h264") {
|
|
858
|
+
return inputVideoCodec === "h264";
|
|
859
|
+
}
|
|
860
|
+
if (outputCodec === "h265") {
|
|
861
|
+
return inputVideoCodec === "h265";
|
|
862
|
+
}
|
|
863
|
+
if (outputCodec === "vp8") {
|
|
864
|
+
return inputVideoCodec === "vp8";
|
|
865
|
+
}
|
|
866
|
+
if (outputCodec === "vp9") {
|
|
867
|
+
return inputVideoCodec === "vp9";
|
|
868
|
+
}
|
|
869
|
+
throw new Error(`Unsupported output codec: ${outputCodec}`);
|
|
870
|
+
};
|
|
871
|
+
var isSameAudioCodec = ({
|
|
872
|
+
inputAudioCodec,
|
|
873
|
+
outputCodec
|
|
874
|
+
}) => {
|
|
875
|
+
if (outputCodec === "aac") {
|
|
876
|
+
return inputAudioCodec === "aac";
|
|
877
|
+
}
|
|
878
|
+
if (outputCodec === "opus") {
|
|
879
|
+
return inputAudioCodec === "opus";
|
|
880
|
+
}
|
|
881
|
+
if (outputCodec === "wav") {
|
|
882
|
+
return inputAudioCodec === "pcm-f32" || inputAudioCodec === "pcm-s16" || inputAudioCodec === "pcm-s24" || inputAudioCodec === "pcm-s32" || inputAudioCodec === "pcm-u8";
|
|
883
|
+
}
|
|
884
|
+
throw new Error(`Unsupported output codec: ${outputCodec}`);
|
|
885
|
+
};
|
|
886
|
+
|
|
1019
887
|
// src/can-copy-audio-track.ts
|
|
1020
888
|
var canCopyAudioTrack = ({
|
|
1021
889
|
inputCodec,
|
|
1022
890
|
outputContainer,
|
|
1023
|
-
inputContainer
|
|
891
|
+
inputContainer,
|
|
892
|
+
outputAudioCodec
|
|
1024
893
|
}) => {
|
|
894
|
+
if (outputAudioCodec) {
|
|
895
|
+
if (!isSameAudioCodec({
|
|
896
|
+
inputAudioCodec: inputCodec,
|
|
897
|
+
outputCodec: outputAudioCodec
|
|
898
|
+
})) {
|
|
899
|
+
return false;
|
|
900
|
+
}
|
|
901
|
+
}
|
|
1025
902
|
if (outputContainer === "webm") {
|
|
1026
903
|
return inputCodec === "opus";
|
|
1027
904
|
}
|
|
@@ -1039,11 +916,20 @@ var canCopyVideoTrack = ({
|
|
|
1039
916
|
rotationToApply,
|
|
1040
917
|
inputContainer,
|
|
1041
918
|
resizeOperation,
|
|
1042
|
-
inputTrack
|
|
919
|
+
inputTrack,
|
|
920
|
+
outputVideoCodec
|
|
1043
921
|
}) => {
|
|
1044
922
|
if (normalizeVideoRotation(inputTrack.rotation) !== normalizeVideoRotation(rotationToApply)) {
|
|
1045
923
|
return false;
|
|
1046
924
|
}
|
|
925
|
+
if (outputVideoCodec) {
|
|
926
|
+
if (!isSameVideoCodec({
|
|
927
|
+
inputVideoCodec: inputTrack.codecEnum,
|
|
928
|
+
outputCodec: outputVideoCodec
|
|
929
|
+
})) {
|
|
930
|
+
return false;
|
|
931
|
+
}
|
|
932
|
+
}
|
|
1047
933
|
const newDimensions = calculateNewDimensionsFromRotateAndScale({
|
|
1048
934
|
height: inputTrack.height,
|
|
1049
935
|
resizeOperation,
|
|
@@ -4249,6 +4135,184 @@ var convertEncodedChunk = (chunk) => {
|
|
|
4249
4135
|
};
|
|
4250
4136
|
};
|
|
4251
4137
|
|
|
4138
|
+
// src/get-wave-audio-decoder.ts
|
|
4139
|
+
var getBytesPerSample = (sampleFormat) => {
|
|
4140
|
+
if (sampleFormat === "s16") {
|
|
4141
|
+
return 2;
|
|
4142
|
+
}
|
|
4143
|
+
if (sampleFormat === "s32") {
|
|
4144
|
+
return 4;
|
|
4145
|
+
}
|
|
4146
|
+
if (sampleFormat === "f32") {
|
|
4147
|
+
return 4;
|
|
4148
|
+
}
|
|
4149
|
+
if (sampleFormat === "u8") {
|
|
4150
|
+
return 1;
|
|
4151
|
+
}
|
|
4152
|
+
if (sampleFormat === "f32-planar") {
|
|
4153
|
+
return 4;
|
|
4154
|
+
}
|
|
4155
|
+
if (sampleFormat === "s16-planar") {
|
|
4156
|
+
return 2;
|
|
4157
|
+
}
|
|
4158
|
+
if (sampleFormat === "s32-planar") {
|
|
4159
|
+
return 4;
|
|
4160
|
+
}
|
|
4161
|
+
if (sampleFormat === "u8-planar") {
|
|
4162
|
+
return 1;
|
|
4163
|
+
}
|
|
4164
|
+
throw new Error(`Unsupported sample format: ${sampleFormat}`);
|
|
4165
|
+
};
|
|
4166
|
+
var getAudioData = (audioSample) => {
|
|
4167
|
+
if (audioSample instanceof EncodedAudioChunk) {
|
|
4168
|
+
const data = new Uint8Array(audioSample.byteLength);
|
|
4169
|
+
audioSample.copyTo(data);
|
|
4170
|
+
return data;
|
|
4171
|
+
}
|
|
4172
|
+
return audioSample.data;
|
|
4173
|
+
};
|
|
4174
|
+
var getWaveAudioDecoder = ({
|
|
4175
|
+
onFrame,
|
|
4176
|
+
config,
|
|
4177
|
+
sampleFormat,
|
|
4178
|
+
ioSynchronizer,
|
|
4179
|
+
onError
|
|
4180
|
+
}) => {
|
|
4181
|
+
const processSample = async (audioSample) => {
|
|
4182
|
+
const bytesPerSample = getBytesPerSample(sampleFormat);
|
|
4183
|
+
const data = getAudioData(audioSample);
|
|
4184
|
+
const audioData = new AudioData({
|
|
4185
|
+
data,
|
|
4186
|
+
format: sampleFormat,
|
|
4187
|
+
numberOfChannels: config.numberOfChannels,
|
|
4188
|
+
numberOfFrames: data.byteLength / bytesPerSample / config.numberOfChannels,
|
|
4189
|
+
sampleRate: config.sampleRate,
|
|
4190
|
+
timestamp: audioSample.timestamp
|
|
4191
|
+
});
|
|
4192
|
+
try {
|
|
4193
|
+
await onFrame(audioData);
|
|
4194
|
+
} catch (err) {
|
|
4195
|
+
audioData.close();
|
|
4196
|
+
onError(err);
|
|
4197
|
+
}
|
|
4198
|
+
};
|
|
4199
|
+
return {
|
|
4200
|
+
close() {
|
|
4201
|
+
return Promise.resolve();
|
|
4202
|
+
},
|
|
4203
|
+
decode(audioSample) {
|
|
4204
|
+
return processSample(audioSample);
|
|
4205
|
+
},
|
|
4206
|
+
flush: () => Promise.resolve(),
|
|
4207
|
+
waitForQueueToBeLessThan: ioSynchronizer.waitForQueueSize,
|
|
4208
|
+
reset: () => {}
|
|
4209
|
+
};
|
|
4210
|
+
};
|
|
4211
|
+
|
|
4212
|
+
// src/create-audio-decoder.ts
|
|
4213
|
+
var internalCreateAudioDecoder = ({
|
|
4214
|
+
onFrame,
|
|
4215
|
+
onError,
|
|
4216
|
+
controller,
|
|
4217
|
+
config,
|
|
4218
|
+
logLevel
|
|
4219
|
+
}) => {
|
|
4220
|
+
if (controller && controller._internals._mediaParserController._internals.signal.aborted) {
|
|
4221
|
+
throw new Error("Not creating audio decoder, already aborted");
|
|
4222
|
+
}
|
|
4223
|
+
const ioSynchronizer = makeIoSynchronizer({
|
|
4224
|
+
logLevel,
|
|
4225
|
+
label: "Audio decoder",
|
|
4226
|
+
controller
|
|
4227
|
+
});
|
|
4228
|
+
if (config.codec === "pcm-s16") {
|
|
4229
|
+
return getWaveAudioDecoder({
|
|
4230
|
+
onFrame,
|
|
4231
|
+
config,
|
|
4232
|
+
sampleFormat: "s16",
|
|
4233
|
+
logLevel,
|
|
4234
|
+
ioSynchronizer,
|
|
4235
|
+
onError
|
|
4236
|
+
});
|
|
4237
|
+
}
|
|
4238
|
+
const audioDecoder = new AudioDecoder({
|
|
4239
|
+
async output(frame) {
|
|
4240
|
+
try {
|
|
4241
|
+
await onFrame(frame);
|
|
4242
|
+
} catch (err) {
|
|
4243
|
+
frame.close();
|
|
4244
|
+
onError(err);
|
|
4245
|
+
}
|
|
4246
|
+
ioSynchronizer.onOutput(frame.timestamp + (frame.duration ?? 0));
|
|
4247
|
+
},
|
|
4248
|
+
error(error) {
|
|
4249
|
+
onError(error);
|
|
4250
|
+
}
|
|
4251
|
+
});
|
|
4252
|
+
const close = () => {
|
|
4253
|
+
if (controller) {
|
|
4254
|
+
controller._internals._mediaParserController._internals.signal.removeEventListener("abort", onAbort);
|
|
4255
|
+
}
|
|
4256
|
+
if (audioDecoder.state === "closed") {
|
|
4257
|
+
return;
|
|
4258
|
+
}
|
|
4259
|
+
audioDecoder.close();
|
|
4260
|
+
};
|
|
4261
|
+
const onAbort = () => {
|
|
4262
|
+
close();
|
|
4263
|
+
};
|
|
4264
|
+
if (controller) {
|
|
4265
|
+
controller._internals._mediaParserController._internals.signal.addEventListener("abort", onAbort);
|
|
4266
|
+
}
|
|
4267
|
+
audioDecoder.configure(config);
|
|
4268
|
+
const decode = async (audioSample) => {
|
|
4269
|
+
if (audioDecoder.state === "closed") {
|
|
4270
|
+
return;
|
|
4271
|
+
}
|
|
4272
|
+
try {
|
|
4273
|
+
await controller?._internals._mediaParserController._internals.checkForAbortAndPause();
|
|
4274
|
+
} catch (err) {
|
|
4275
|
+
onError(err);
|
|
4276
|
+
return;
|
|
4277
|
+
}
|
|
4278
|
+
const chunk = audioSample instanceof EncodedAudioChunk ? audioSample : new EncodedAudioChunk(audioSample);
|
|
4279
|
+
audioDecoder.decode(chunk);
|
|
4280
|
+
if (chunk.byteLength > 16) {
|
|
4281
|
+
ioSynchronizer.inputItem(chunk.timestamp);
|
|
4282
|
+
}
|
|
4283
|
+
};
|
|
4284
|
+
return {
|
|
4285
|
+
decode,
|
|
4286
|
+
close,
|
|
4287
|
+
flush: async () => {
|
|
4288
|
+
try {
|
|
4289
|
+
await audioDecoder.flush();
|
|
4290
|
+
} catch {}
|
|
4291
|
+
await ioSynchronizer.waitForQueueSize(0);
|
|
4292
|
+
},
|
|
4293
|
+
waitForQueueToBeLessThan: ioSynchronizer.waitForQueueSize,
|
|
4294
|
+
reset: () => {
|
|
4295
|
+
audioDecoder.reset();
|
|
4296
|
+
audioDecoder.configure(config);
|
|
4297
|
+
}
|
|
4298
|
+
};
|
|
4299
|
+
};
|
|
4300
|
+
var createAudioDecoder = ({
|
|
4301
|
+
track,
|
|
4302
|
+
onFrame,
|
|
4303
|
+
onError,
|
|
4304
|
+
controller,
|
|
4305
|
+
logLevel
|
|
4306
|
+
}) => {
|
|
4307
|
+
return internalCreateAudioDecoder({
|
|
4308
|
+
onFrame,
|
|
4309
|
+
onError,
|
|
4310
|
+
controller: controller ?? null,
|
|
4311
|
+
config: track,
|
|
4312
|
+
logLevel: logLevel ?? "error"
|
|
4313
|
+
});
|
|
4314
|
+
};
|
|
4315
|
+
|
|
4252
4316
|
// src/processing-queue.ts
|
|
4253
4317
|
function processingQueue({
|
|
4254
4318
|
onOutput,
|
|
@@ -4434,10 +4498,10 @@ var reencodeAudioTrack = async ({
|
|
|
4434
4498
|
logLevel
|
|
4435
4499
|
});
|
|
4436
4500
|
state.addWaitForFinishPromise(async () => {
|
|
4437
|
-
await audioDecoder.
|
|
4501
|
+
await audioDecoder.waitForQueueToBeLessThan(0);
|
|
4438
4502
|
Log.verbose(logLevel, "Audio decoder finished");
|
|
4439
4503
|
audioDecoder.close();
|
|
4440
|
-
await audioProcessingQueue.ioSynchronizer.
|
|
4504
|
+
await audioProcessingQueue.ioSynchronizer.waitForQueueSize(0);
|
|
4441
4505
|
Log.verbose(logLevel, "Audio processing queue finished");
|
|
4442
4506
|
await audioEncoder.waitForFinish();
|
|
4443
4507
|
Log.verbose(logLevel, "Audio encoder finished");
|
|
@@ -4467,7 +4531,8 @@ var makeAudioTrackHandler = ({
|
|
|
4467
4531
|
const canCopyTrack = canCopyAudioTrack({
|
|
4468
4532
|
inputCodec: track.codecEnum,
|
|
4469
4533
|
outputContainer,
|
|
4470
|
-
inputContainer
|
|
4534
|
+
inputContainer,
|
|
4535
|
+
outputAudioCodec: audioCodec
|
|
4471
4536
|
});
|
|
4472
4537
|
const audioOperation = await (onAudioTrack ?? defaultOnAudioTrackHandler)({
|
|
4473
4538
|
defaultAudioCodec: audioCodec ?? getDefaultAudioCodec({ container: outputContainer }),
|
|
@@ -4598,6 +4663,95 @@ var arrayBufferToUint8Array = (buffer) => {
|
|
|
4598
4663
|
return buffer ? new Uint8Array(buffer) : null;
|
|
4599
4664
|
};
|
|
4600
4665
|
|
|
4666
|
+
// src/create-video-decoder.ts
|
|
4667
|
+
var internalCreateVideoDecoder = ({
|
|
4668
|
+
onFrame,
|
|
4669
|
+
onError,
|
|
4670
|
+
controller,
|
|
4671
|
+
config,
|
|
4672
|
+
logLevel
|
|
4673
|
+
}) => {
|
|
4674
|
+
const ioSynchronizer = makeIoSynchronizer({
|
|
4675
|
+
logLevel,
|
|
4676
|
+
label: "Video decoder",
|
|
4677
|
+
controller
|
|
4678
|
+
});
|
|
4679
|
+
const videoDecoder = new VideoDecoder({
|
|
4680
|
+
async output(frame) {
|
|
4681
|
+
try {
|
|
4682
|
+
await onFrame(frame);
|
|
4683
|
+
} catch (err) {
|
|
4684
|
+
onError(err);
|
|
4685
|
+
frame.close();
|
|
4686
|
+
}
|
|
4687
|
+
ioSynchronizer.onOutput(frame.timestamp);
|
|
4688
|
+
},
|
|
4689
|
+
error(error) {
|
|
4690
|
+
onError(error);
|
|
4691
|
+
}
|
|
4692
|
+
});
|
|
4693
|
+
const close = () => {
|
|
4694
|
+
if (controller) {
|
|
4695
|
+
controller._internals._mediaParserController._internals.signal.removeEventListener("abort", onAbort);
|
|
4696
|
+
}
|
|
4697
|
+
if (videoDecoder.state === "closed") {
|
|
4698
|
+
return;
|
|
4699
|
+
}
|
|
4700
|
+
videoDecoder.close();
|
|
4701
|
+
};
|
|
4702
|
+
const onAbort = () => {
|
|
4703
|
+
close();
|
|
4704
|
+
};
|
|
4705
|
+
if (controller) {
|
|
4706
|
+
controller._internals._mediaParserController._internals.signal.addEventListener("abort", onAbort);
|
|
4707
|
+
}
|
|
4708
|
+
videoDecoder.configure(config);
|
|
4709
|
+
const decode = async (sample) => {
|
|
4710
|
+
if (videoDecoder.state === "closed") {
|
|
4711
|
+
return;
|
|
4712
|
+
}
|
|
4713
|
+
try {
|
|
4714
|
+
await controller?._internals._mediaParserController._internals.checkForAbortAndPause();
|
|
4715
|
+
} catch (err) {
|
|
4716
|
+
onError(err);
|
|
4717
|
+
return;
|
|
4718
|
+
}
|
|
4719
|
+
const encodedChunk = sample instanceof EncodedVideoChunk ? sample : new EncodedVideoChunk(sample);
|
|
4720
|
+
videoDecoder.decode(encodedChunk);
|
|
4721
|
+
ioSynchronizer.inputItem(sample.timestamp);
|
|
4722
|
+
};
|
|
4723
|
+
return {
|
|
4724
|
+
decode,
|
|
4725
|
+
close,
|
|
4726
|
+
flush: async () => {
|
|
4727
|
+
try {
|
|
4728
|
+
await videoDecoder.flush();
|
|
4729
|
+
} catch {}
|
|
4730
|
+
await ioSynchronizer.waitForQueueSize(0);
|
|
4731
|
+
},
|
|
4732
|
+
waitForQueueToBeLessThan: ioSynchronizer.waitForQueueSize,
|
|
4733
|
+
reset: () => {
|
|
4734
|
+
videoDecoder.reset();
|
|
4735
|
+
videoDecoder.configure(config);
|
|
4736
|
+
}
|
|
4737
|
+
};
|
|
4738
|
+
};
|
|
4739
|
+
var createVideoDecoder = ({
|
|
4740
|
+
onFrame,
|
|
4741
|
+
onError,
|
|
4742
|
+
controller,
|
|
4743
|
+
track,
|
|
4744
|
+
logLevel
|
|
4745
|
+
}) => {
|
|
4746
|
+
return internalCreateVideoDecoder({
|
|
4747
|
+
onFrame,
|
|
4748
|
+
onError,
|
|
4749
|
+
controller: controller ?? null,
|
|
4750
|
+
config: track,
|
|
4751
|
+
logLevel: logLevel ?? "info"
|
|
4752
|
+
});
|
|
4753
|
+
};
|
|
4754
|
+
|
|
4601
4755
|
// src/convert-to-correct-videoframe.ts
|
|
4602
4756
|
var needsToCorrectVideoFrame = ({
|
|
4603
4757
|
videoFrame,
|
|
@@ -4735,88 +4889,6 @@ var videoFrameSorter = ({
|
|
|
4735
4889
|
};
|
|
4736
4890
|
};
|
|
4737
4891
|
|
|
4738
|
-
// src/video-decoder.ts
|
|
4739
|
-
var internalCreateVideoDecoder = ({
|
|
4740
|
-
onFrame: onFrame2,
|
|
4741
|
-
onError,
|
|
4742
|
-
controller,
|
|
4743
|
-
config,
|
|
4744
|
-
logLevel
|
|
4745
|
-
}) => {
|
|
4746
|
-
const ioSynchronizer = makeIoSynchronizer({
|
|
4747
|
-
logLevel,
|
|
4748
|
-
label: "Video decoder",
|
|
4749
|
-
controller
|
|
4750
|
-
});
|
|
4751
|
-
const videoDecoder = new VideoDecoder({
|
|
4752
|
-
async output(frame) {
|
|
4753
|
-
try {
|
|
4754
|
-
await onFrame2(frame);
|
|
4755
|
-
} catch (err) {
|
|
4756
|
-
onError(err);
|
|
4757
|
-
frame.close();
|
|
4758
|
-
}
|
|
4759
|
-
ioSynchronizer.onOutput(frame.timestamp);
|
|
4760
|
-
},
|
|
4761
|
-
error(error) {
|
|
4762
|
-
onError(error);
|
|
4763
|
-
}
|
|
4764
|
-
});
|
|
4765
|
-
const close = () => {
|
|
4766
|
-
if (controller) {
|
|
4767
|
-
controller._internals._mediaParserController._internals.signal.removeEventListener("abort", onAbort);
|
|
4768
|
-
}
|
|
4769
|
-
if (videoDecoder.state === "closed") {
|
|
4770
|
-
return;
|
|
4771
|
-
}
|
|
4772
|
-
videoDecoder.close();
|
|
4773
|
-
};
|
|
4774
|
-
const onAbort = () => {
|
|
4775
|
-
close();
|
|
4776
|
-
};
|
|
4777
|
-
if (controller) {
|
|
4778
|
-
controller._internals._mediaParserController._internals.signal.addEventListener("abort", onAbort);
|
|
4779
|
-
}
|
|
4780
|
-
videoDecoder.configure(config);
|
|
4781
|
-
const decode = (sample) => {
|
|
4782
|
-
if (videoDecoder.state === "closed") {
|
|
4783
|
-
return;
|
|
4784
|
-
}
|
|
4785
|
-
const encodedChunk = sample instanceof EncodedVideoChunk ? sample : new EncodedVideoChunk(sample);
|
|
4786
|
-
videoDecoder.decode(encodedChunk);
|
|
4787
|
-
ioSynchronizer.inputItem(sample.timestamp);
|
|
4788
|
-
};
|
|
4789
|
-
return {
|
|
4790
|
-
decode,
|
|
4791
|
-
waitForFinish: async () => {
|
|
4792
|
-
await videoDecoder.flush();
|
|
4793
|
-
Log.verbose(logLevel, "Flushed video decoder");
|
|
4794
|
-
await ioSynchronizer.waitForFinish();
|
|
4795
|
-
Log.verbose(logLevel, "IO synchro finished");
|
|
4796
|
-
},
|
|
4797
|
-
close,
|
|
4798
|
-
flush: async () => {
|
|
4799
|
-
await videoDecoder.flush();
|
|
4800
|
-
},
|
|
4801
|
-
waitForQueueToBeLessThan: ioSynchronizer.waitForQueueSize
|
|
4802
|
-
};
|
|
4803
|
-
};
|
|
4804
|
-
var createVideoDecoder = ({
|
|
4805
|
-
onFrame: onFrame2,
|
|
4806
|
-
onError,
|
|
4807
|
-
controller,
|
|
4808
|
-
track,
|
|
4809
|
-
logLevel
|
|
4810
|
-
}) => {
|
|
4811
|
-
return internalCreateVideoDecoder({
|
|
4812
|
-
onFrame: onFrame2,
|
|
4813
|
-
onError,
|
|
4814
|
-
controller: controller ?? null,
|
|
4815
|
-
config: track,
|
|
4816
|
-
logLevel: logLevel ?? "info"
|
|
4817
|
-
});
|
|
4818
|
-
};
|
|
4819
|
-
|
|
4820
4892
|
// src/video-encoder.ts
|
|
4821
4893
|
import {
|
|
4822
4894
|
MediaParserAbortError as MediaParserAbortError2
|
|
@@ -4886,7 +4958,7 @@ var createVideoEncoder = ({
|
|
|
4886
4958
|
},
|
|
4887
4959
|
waitForFinish: async () => {
|
|
4888
4960
|
await encoder.flush();
|
|
4889
|
-
await ioSynchronizer.
|
|
4961
|
+
await ioSynchronizer.waitForQueueSize(0);
|
|
4890
4962
|
},
|
|
4891
4963
|
close,
|
|
4892
4964
|
flush: async () => {
|
|
@@ -5023,12 +5095,12 @@ var reencodeVideoTrack = async ({
|
|
|
5023
5095
|
});
|
|
5024
5096
|
state.addWaitForFinishPromise(async () => {
|
|
5025
5097
|
Log.verbose(logLevel, "Waiting for video decoder to finish");
|
|
5026
|
-
await videoDecoder.
|
|
5098
|
+
await videoDecoder.waitForQueueToBeLessThan(0);
|
|
5027
5099
|
videoDecoder.close();
|
|
5028
5100
|
Log.verbose(logLevel, "Video decoder finished. Waiting for encoder to finish");
|
|
5029
5101
|
await frameSorter.flush();
|
|
5030
5102
|
Log.verbose(logLevel, "Frame sorter flushed");
|
|
5031
|
-
await videoProcessingQueue.ioSynchronizer.
|
|
5103
|
+
await videoProcessingQueue.ioSynchronizer.waitForQueueSize(0);
|
|
5032
5104
|
Log.verbose(logLevel, "Video processing queue finished");
|
|
5033
5105
|
await videoEncoder.waitForFinish();
|
|
5034
5106
|
videoEncoder.close();
|
|
@@ -5068,7 +5140,8 @@ var makeVideoTrackHandler = ({
|
|
|
5068
5140
|
outputContainer,
|
|
5069
5141
|
rotationToApply: rotate,
|
|
5070
5142
|
inputTrack: track,
|
|
5071
|
-
resizeOperation
|
|
5143
|
+
resizeOperation,
|
|
5144
|
+
outputVideoCodec: defaultVideoCodec
|
|
5072
5145
|
});
|
|
5073
5146
|
const videoOperation = await (onVideoTrack ?? defaultOnVideoTrackHandler)({
|
|
5074
5147
|
track,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MediaParserLogLevel } from '@remotion/media-parser';
|
|
2
|
-
import type { CreateAudioDecoderInit, WebCodecsAudioDecoder } from './audio-decoder';
|
|
2
|
+
import type { CreateAudioDecoderInit, WebCodecsAudioDecoder } from './create-audio-decoder';
|
|
3
3
|
import type { IoSynchronizer } from './io-manager/io-synchronizer';
|
|
4
4
|
export declare const getWaveAudioDecoder: ({ onFrame, config, sampleFormat, ioSynchronizer, onError, }: Pick<CreateAudioDecoderInit, "onFrame" | "config"> & {
|
|
5
5
|
sampleFormat: AudioSampleFormat;
|