Skip to content

Commit 3fac20d

Browse files
author
Bryan Yao
committed
add check of SMAPLE-AES in transmuxer
1 parent 7ccd854 commit 3fac20d

File tree

3 files changed

+32
-20
lines changed

3 files changed

+32
-20
lines changed

src/demux/mp4demuxer.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ class MP4Demuxer implements Demuxer {
5959
};
6060
}
6161

62-
// demuxSampleAes (data: Uint8Array, decryptData: Uint8Array, timeOffset: number): Promise<DemuxerResult> {
63-
// return Promise.reject(new Error('The MP4 demuxer does not support SAMPLE-AES decryption'));
64-
// }
62+
demuxSampleAes (data: Uint8Array, decryptData: Uint8Array, timeOffset: number): Promise<DemuxerResult> {
63+
return Promise.reject(new Error('The MP4 demuxer does not support SAMPLE-AES decryption, Please specify DRM'));
64+
}
6565

6666
destroy () {}
6767
}

src/demux/transmuxer.ts

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import ChunkCache from './chunk-cache';
1414
import { appendUint8Array } from '../utils/mp4-tools';
1515

1616
import { logger } from '../utils/logger';
17-
import { HlsConfig } from '../config';
17+
import { HlsConfig, EMEControllerConfig, KeyidValue } from '../config';
1818

1919
let now;
2020
// performance.now() not available on WebWorker, at least on Safari Desktop
@@ -50,12 +50,18 @@ export default class Transmuxer {
5050
private transmuxConfig!: TransmuxConfig;
5151
private currentTransmuxState!: TransmuxState;
5252
private cache: ChunkCache = new ChunkCache();
53+
private emeEnabled: boolean;
54+
private clearkeyServerUrl?: string;
55+
private clearkeyPair: KeyidValue | null;
5356

5457
constructor (observer: HlsEventEmitter, typeSupported, config: HlsConfig, vendor) {
5558
this.observer = observer;
5659
this.typeSupported = typeSupported;
5760
this.config = config;
5861
this.vendor = vendor;
62+
this.emeEnabled = this.config.emeEnabled;
63+
this.clearkeyServerUrl = this.config.clearkeyServerUrl;
64+
this.clearkeyPair = this.config.clearkeyPair;
5965
}
6066

6167
configure (transmuxConfig: TransmuxConfig, state: TransmuxState) {
@@ -238,13 +244,19 @@ export default class Transmuxer {
238244
}
239245

240246
private transmux (data: Uint8Array, decryptData: Uint8Array, encryptionType: string | null, timeOffset: number, accurateTimeOffset: boolean, chunkMeta: ChunkMetadata): TransmuxerResult | Promise<TransmuxerResult> {
241-
// let result: TransmuxerResult | Promise<TransmuxerResult>;
242-
// if (encryptionType === 'SAMPLE-AES') {
243-
// result = this.transmuxSampleAes(data, decryptData, timeOffset, accurateTimeOffset, chunkMeta);
244-
// } else {
245-
// result = this.transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta);
246-
// }
247-
return this.transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta);
247+
let result: TransmuxerResult | Promise<TransmuxerResult>;
248+
if (encryptionType === 'SAMPLE-AES') {
249+
// May Get the URI from the manifest
250+
logger.log('Check if the clearkeyPair or clearkeyServerUrl is specified to play SAMPLE-AES cbcs fMP4');
251+
if (this.emeEnabled && (this.clearkeyPair || this.clearkeyServerUrl)) {
252+
result = this.transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta);
253+
} else {
254+
result = this.transmuxSampleAes(data, decryptData, timeOffset, accurateTimeOffset, chunkMeta);
255+
}
256+
} else {
257+
result = this.transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta);
258+
}
259+
return result;
248260
}
249261

250262
private transmuxUnencrypted (data: Uint8Array, timeOffset: number, accurateTimeOffset: boolean, chunkMeta: ChunkMetadata) {
@@ -256,14 +268,14 @@ export default class Transmuxer {
256268
}
257269

258270
// TODO: Handle flush with Sample-AES
259-
// private transmuxSampleAes (data: Uint8Array, decryptData: any, timeOffset: number, accurateTimeOffset: boolean, chunkMeta: ChunkMetadata) : Promise<TransmuxerResult> {
260-
// return this.demuxer!.demuxSampleAes(data, decryptData, timeOffset)
261-
// .then(demuxResult => ({
262-
// remuxResult: this.remuxer!.remux(demuxResult.audioTrack, demuxResult.avcTrack, demuxResult.id3Track, demuxResult.textTrack, timeOffset, accurateTimeOffset),
263-
// chunkMeta
264-
// })
265-
// );
266-
// }
271+
private transmuxSampleAes (data: Uint8Array, decryptData: any, timeOffset: number, accurateTimeOffset: boolean, chunkMeta: ChunkMetadata) : Promise<TransmuxerResult> {
272+
return this.demuxer!.demuxSampleAes(data, decryptData, timeOffset)
273+
.then(demuxResult => ({
274+
remuxResult: this.remuxer!.remux(demuxResult.audioTrack, demuxResult.avcTrack, demuxResult.id3Track, demuxResult.textTrack, timeOffset, accurateTimeOffset),
275+
chunkMeta
276+
})
277+
);
278+
}
267279

268280
private configureTransmuxer (data: Uint8Array, transmuxConfig: TransmuxConfig) {
269281
const { config, observer, typeSupported, vendor } = this;

src/types/demuxer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export interface Demuxer {
22
demux (data: Uint8Array, timeOffset: number, isSampleAes?: boolean) : DemuxerResult
3-
// demuxSampleAes (data: Uint8Array, decryptData: Uint8Array, timeOffset: number) : Promise<DemuxerResult>
3+
demuxSampleAes (data: Uint8Array, decryptData: Uint8Array, timeOffset: number) : Promise<DemuxerResult>
44
flush(timeOffset?: number): DemuxerResult
55
destroy() : void
66
resetInitSegment(audioCodec: string | undefined, videoCodec: string | undefined, duration: number);

0 commit comments

Comments
 (0)