EncodedVideoSample/EncodedAudioSample -> EncodedPacket

This commit is contained in:
David Payr
2025-02-22 19:54:59 +01:00
parent 5d1866653c
commit c2b20ccda5
24 changed files with 650 additions and 628 deletions
+16 -16
View File
@@ -2,9 +2,9 @@ import { AudioCodec } from '../codec';
import { Demuxer } from '../demuxer';
import { Input } from '../input';
import { InputAudioTrack, InputAudioTrackBacking } from '../input-track';
import { SampleRetrievalOptions } from '../media-sink';
import { PacketRetrievalOptions } from '../media-sink';
import { assert, binarySearchExact, binarySearchLessOrEqual, last, UNDETERMINED_LANGUAGE } from '../misc';
import { EncodedAudioSample, PLACEHOLDER_DATA } from '../sample';
import { EncodedPacket, PLACEHOLDER_DATA } from '../packet';
import { FrameHeader, getXingOffset, INFO, XING } from './mp3-misc';
import { Mp3Reader } from './mp3-reader';
@@ -156,7 +156,7 @@ class Mp3AudioTrackBacking implements InputAudioTrackBacking {
};
}
getSampleAtIndex(sampleIndex: number, options: SampleRetrievalOptions) {
getPacketAtIndex(sampleIndex: number, options: PacketRetrievalOptions) {
if (sampleIndex === -1) {
return null;
}
@@ -174,7 +174,7 @@ class Mp3AudioTrackBacking implements InputAudioTrackBacking {
data = this.demuxer.reader.readBytes(rawSample.dataSize);
}
return new EncodedAudioSample(
return new EncodedPacket(
data,
'key',
rawSample.timestamp,
@@ -183,37 +183,37 @@ class Mp3AudioTrackBacking implements InputAudioTrackBacking {
);
}
async getFirstSample(options: SampleRetrievalOptions) {
return this.getSampleAtIndex(0, options);
async getFirstPacket(options: PacketRetrievalOptions) {
return this.getPacketAtIndex(0, options);
}
async getNextSample(sample: EncodedAudioSample, options: SampleRetrievalOptions) {
async getNextPacket(packet: EncodedPacket, options: PacketRetrievalOptions) {
const sampleIndex = binarySearchExact(
this.demuxer.allSamples,
sample.timestamp,
packet.timestamp,
x => x.timestamp,
);
if (sampleIndex === -1) {
throw new Error('Sample was not created from this track.');
throw new Error('Packet was not created from this track.');
}
return this.getSampleAtIndex(sampleIndex + 1, options);
return this.getPacketAtIndex(sampleIndex + 1, options);
}
async getSample(timestamp: number, options: SampleRetrievalOptions) {
async getPacket(timestamp: number, options: PacketRetrievalOptions) {
const index = binarySearchLessOrEqual(
this.demuxer.allSamples,
timestamp,
x => x.timestamp,
);
return this.getSampleAtIndex(index, options);
return this.getPacketAtIndex(index, options);
}
getKeySample(timestamp: number, options: SampleRetrievalOptions) {
return this.getSample(timestamp, options);
getKeyPacket(timestamp: number, options: PacketRetrievalOptions) {
return this.getPacket(timestamp, options);
}
getNextKeySample(sample: EncodedAudioSample, options: SampleRetrievalOptions) {
return this.getNextSample(sample, options);
getNextKeyPacket(packet: EncodedPacket, options: PacketRetrievalOptions) {
return this.getNextPacket(packet, options);
}
}
+7 -7
View File
@@ -1,7 +1,7 @@
import { assert, toDataView } from '../misc';
import { Muxer } from '../muxer';
import { Output, OutputAudioTrack } from '../output';
import { EncodedAudioSample } from '../sample';
import { EncodedPacket } from '../packet';
import { Writer } from '../writer';
import { getXingOffset, INFO, readFrameHeader, XING } from './mp3-misc';
import { Mp3Writer, XingFrameData } from './mp3-writer';
@@ -24,19 +24,19 @@ export class Mp3Muxer extends Muxer {
// Nothing needed here
}
async addEncodedVideoSample() {
async addEncodedVideoPacket() {
throw new Error('MP3 does not support video.');
}
async addEncodedAudioSample(
async addEncodedAudioPacket(
track: OutputAudioTrack,
sample: EncodedAudioSample,
packet: EncodedPacket,
) {
const release = await this.mutex.acquire();
try {
if (!this.xingFrameData) {
const view = toDataView(sample.data);
const view = toDataView(packet.data);
if (view.byteLength < 4) {
throw new Error('Invalid MP3 header in sample.');
}
@@ -80,10 +80,10 @@ export class Mp3Muxer extends Muxer {
this.frameCount++;
}
this.validateAndNormalizeTimestamp(track, sample.timestamp, sample.type === 'key');
this.validateAndNormalizeTimestamp(track, packet.timestamp, packet.type === 'key');
this.framePositions.push(this.writer.getPos());
this.writer.write(sample.data);
this.writer.write(packet.data);
this.frameCount++;
await this.writer.flush();