Skip to content

Commit

Permalink
add check of SMAPLE-AES in transmuxer
Browse files Browse the repository at this point in the history
  • Loading branch information
Bryan Yao committed Jul 31, 2020
1 parent 7ccd854 commit 3fac20d
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 20 deletions.
6 changes: 3 additions & 3 deletions src/demux/mp4demuxer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ class MP4Demuxer implements Demuxer {
};
}

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

destroy () {}
}
Expand Down
44 changes: 28 additions & 16 deletions src/demux/transmuxer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import ChunkCache from './chunk-cache';
import { appendUint8Array } from '../utils/mp4-tools';

import { logger } from '../utils/logger';
import { HlsConfig } from '../config';
import { HlsConfig, EMEControllerConfig, KeyidValue } from '../config';

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

constructor (observer: HlsEventEmitter, typeSupported, config: HlsConfig, vendor) {
this.observer = observer;
this.typeSupported = typeSupported;
this.config = config;
this.vendor = vendor;
this.emeEnabled = this.config.emeEnabled;
this.clearkeyServerUrl = this.config.clearkeyServerUrl;
this.clearkeyPair = this.config.clearkeyPair;
}

configure (transmuxConfig: TransmuxConfig, state: TransmuxState) {
Expand Down Expand Up @@ -238,13 +244,19 @@ export default class Transmuxer {
}

private transmux (data: Uint8Array, decryptData: Uint8Array, encryptionType: string | null, timeOffset: number, accurateTimeOffset: boolean, chunkMeta: ChunkMetadata): TransmuxerResult | Promise<TransmuxerResult> {
// let result: TransmuxerResult | Promise<TransmuxerResult>;
// if (encryptionType === 'SAMPLE-AES') {
// result = this.transmuxSampleAes(data, decryptData, timeOffset, accurateTimeOffset, chunkMeta);
// } else {
// result = this.transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta);
// }
return this.transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta);
let result: TransmuxerResult | Promise<TransmuxerResult>;
if (encryptionType === 'SAMPLE-AES') {
// May Get the URI from the manifest
logger.log('Check if the clearkeyPair or clearkeyServerUrl is specified to play SAMPLE-AES cbcs fMP4');
if (this.emeEnabled && (this.clearkeyPair || this.clearkeyServerUrl)) {
result = this.transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta);
} else {
result = this.transmuxSampleAes(data, decryptData, timeOffset, accurateTimeOffset, chunkMeta);
}
} else {
result = this.transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta);
}
return result;
}

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

// TODO: Handle flush with Sample-AES
// private transmuxSampleAes (data: Uint8Array, decryptData: any, timeOffset: number, accurateTimeOffset: boolean, chunkMeta: ChunkMetadata) : Promise<TransmuxerResult> {
// return this.demuxer!.demuxSampleAes(data, decryptData, timeOffset)
// .then(demuxResult => ({
// remuxResult: this.remuxer!.remux(demuxResult.audioTrack, demuxResult.avcTrack, demuxResult.id3Track, demuxResult.textTrack, timeOffset, accurateTimeOffset),
// chunkMeta
// })
// );
// }
private transmuxSampleAes (data: Uint8Array, decryptData: any, timeOffset: number, accurateTimeOffset: boolean, chunkMeta: ChunkMetadata) : Promise<TransmuxerResult> {
return this.demuxer!.demuxSampleAes(data, decryptData, timeOffset)
.then(demuxResult => ({
remuxResult: this.remuxer!.remux(demuxResult.audioTrack, demuxResult.avcTrack, demuxResult.id3Track, demuxResult.textTrack, timeOffset, accurateTimeOffset),
chunkMeta
})
);
}

private configureTransmuxer (data: Uint8Array, transmuxConfig: TransmuxConfig) {
const { config, observer, typeSupported, vendor } = this;
Expand Down
2 changes: 1 addition & 1 deletion src/types/demuxer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export interface Demuxer {
demux (data: Uint8Array, timeOffset: number, isSampleAes?: boolean) : DemuxerResult
// demuxSampleAes (data: Uint8Array, decryptData: Uint8Array, timeOffset: number) : Promise<DemuxerResult>
demuxSampleAes (data: Uint8Array, decryptData: Uint8Array, timeOffset: number) : Promise<DemuxerResult>
flush(timeOffset?: number): DemuxerResult
destroy() : void
resetInitSegment(audioCodec: string | undefined, videoCodec: string | undefined, duration: number);
Expand Down

0 comments on commit 3fac20d

Please sign in to comment.