Merge remote-tracking branch 'origin/main' into prores

This commit is contained in:
Vanilagy
2026-06-29 17:15:24 +02:00
2 changed files with 28 additions and 16 deletions
+27 -15
View File
@@ -54,6 +54,7 @@ import {
AudioSample, AudioSample,
clampCropRectangle, clampCropRectangle,
CropRectangle, CropRectangle,
getBytesPerSample,
validateCropRectangle, validateCropRectangle,
VideoSample, VideoSample,
VideoSampleResource, VideoSampleResource,
@@ -1442,7 +1443,7 @@ export class Conversion {
let sampleRate = trackOptions.sampleRate ?? originalSampleRate; let sampleRate = trackOptions.sampleRate ?? originalSampleRate;
const needsTrimming = firstTimestamp < this._startTimestamp; const needsTrimming = firstTimestamp < this._startTimestamp;
const needsPadding = firstTimestamp > this._startTimestamp && !this.output.format.supportsTimestampedMediaData; let needsPadding = firstTimestamp > this._startTimestamp && !this.output.format.supportsTimestampedMediaData;
let audioCodecs = this.output.format.getSupportedAudioCodecs(); let audioCodecs = this.output.format.getSupportedAudioCodecs();
if ( if (
@@ -1589,20 +1590,6 @@ export class Conversion {
this._trackPromises.push((async () => { this._trackPromises.push((async () => {
await this._started; await this._started;
if (needsPadding) {
const paddingLength = firstTimestamp - this._startTimestamp;
const paddingLengthSamples = Math.round(paddingLength * originalSampleRate);
const silentSample = new AudioSample({
data: new Float32Array(paddingLengthSamples * originalNumberOfChannels),
format: 'f32-planar',
numberOfChannels: originalNumberOfChannels,
sampleRate: originalSampleRate,
timestamp: 0,
});
await this._registerAudioSample(silentSample, source, outputTrackId, () => lastSampleTimestamp);
}
const sink = new AudioSampleSink(track); const sink = new AudioSampleSink(track);
for await (let sample of sink.samples(this._startTimestamp, this._endTimestamp)) { for await (let sample of sink.samples(this._startTimestamp, this._endTimestamp)) {
if (this._canceled) { if (this._canceled) {
@@ -1610,6 +1597,31 @@ export class Conversion {
return; return;
} }
if (needsPadding) {
// Add one padding sample at the beginning
const paddingLength = firstTimestamp - this._startTimestamp;
const paddingLengthSamples = Math.round(paddingLength * originalSampleRate);
const bytesPerSample = getBytesPerSample(sample.format);
const data = new Uint8Array(bytesPerSample * paddingLengthSamples * originalNumberOfChannels);
if (sample.format === 'u8' || sample.format === 'u8-planar') {
data.fill(2 ** 7); // Fill it with the silent value
}
const silentSample = new AudioSample({
data,
// Use the same format the decoder is spitting out. This avoids feeding changing sample
// formats to the audio encoder.
format: sample.format,
numberOfChannels: originalNumberOfChannels,
sampleRate: originalSampleRate,
timestamp: 0,
});
await this._registerAudioSample(silentSample, source, outputTrackId, () => lastSampleTimestamp);
needsPadding = false;
}
let startFrame = 0; let startFrame = 0;
let endFrame = sample.numberOfFrames; let endFrame = sample.numberOfFrames;
+1 -1
View File
@@ -3048,7 +3048,7 @@ export class AudioSample implements Disposable {
} }
} }
const getBytesPerSample = (format: AudioSampleFormat): number => { export const getBytesPerSample = (format: AudioSampleFormat): number => {
switch (format) { switch (format) {
case 'u8': case 'u8':
case 'u8-planar': case 'u8-planar':