Add language getter to InputTrack

This commit is contained in:
Vanilagy
2025-01-15 20:21:34 +01:00
parent 2bec661985
commit 7b6567fcf0
8 changed files with 49 additions and 3 deletions
+2 -1
View File
@@ -11,6 +11,7 @@ import {
colorSpaceIsComplete,
IDENTITY_MATRIX,
rotationMatrix,
UNDETERMINED_LANGUAGE,
} from '../misc';
import {
AudioCodec,
@@ -429,7 +430,7 @@ export const mdhd = (
const u32OrU64 = needsU64 ? u64 : u32;
let language = 0;
for (const character of (trackData.track.metadata.languageCode ?? 'und')) {
for (const character of (trackData.track.metadata.languageCode ?? UNDETERMINED_LANGUAGE)) {
language <<= 5;
language += character.charCodeAt(0) - 0x60;
}
+18
View File
@@ -34,6 +34,7 @@ import {
last,
AsyncMutex,
findLastIndex,
UNDETERMINED_LANGUAGE,
} from '../misc';
import { Reader } from '../reader';
import { EncodedAudioSample, EncodedVideoSample, PLACEHOLDER_DATA, SampleType } from '../sample';
@@ -47,6 +48,7 @@ type InternalTrack = {
durationInMovieTimescale: number;
durationInMediaTimescale: number;
rotation: Rotation;
languageCode: string;
sampleTableByteOffset: number;
sampleTable: SampleTable | null;
fragmentLookupTable: FragmentLookupTableEntry[] | null;
@@ -557,6 +559,7 @@ export class IsobmffDemuxer extends Demuxer {
durationInMovieTimescale: -1,
durationInMediaTimescale: -1,
rotation: 0,
languageCode: UNDETERMINED_LANGUAGE,
sampleTableByteOffset: -1,
sampleTable: null,
fragmentLookupTable: null,
@@ -642,6 +645,17 @@ export class IsobmffDemuxer extends Demuxer {
track.timescale = this.isobmffReader.readU32();
track.durationInMediaTimescale = this.isobmffReader.readU64();
}
let language = this.isobmffReader.readU16();
if (language > 0) {
track.languageCode = '';
for (let i = 0; i < 3; i++) {
track.languageCode = String.fromCharCode(0x60 + (language & 0b11111)) + track.languageCode;
language >>= 5;
}
}
}; break;
case 'hdlr': {
@@ -1689,6 +1703,10 @@ abstract class IsobmffTrackBacking<
return (lastSample?.timestamp ?? 0) + (lastSample?.duration ?? 0);
}
async getLanguageCode() {
return this.internalTrack.languageCode;
}
async getFirstTimestamp() {
const firstSample = await this.getFirstSample({ metadataOnly: true });
return firstSample?.timestamp ?? 0;