forked from video-dev/hls.js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdemuxer.js
85 lines (79 loc) · 2.81 KB
/
demuxer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import Event from '../events';
import TSDemuxer from './tsdemuxer';
import TSDemuxerWorker from './tsdemuxerworker';
import observer from '../observer';
import {logger} from '../utils/logger';
class Demuxer {
constructor(config) {
if(config.enableWorker && (typeof(Worker) !== 'undefined')) {
logger.log('TS demuxing in webworker');
try {
var work = require('webworkify');
this.w = work(TSDemuxerWorker);
this.onwmsg = this.onWorkerMessage.bind(this);
this.w.addEventListener('message', this.onwmsg);
this.w.postMessage({ cmd : 'init'});
} catch(err) {
logger.error('error while initializing TSDemuxerWorker, fallback on regular TSDemuxer');
this.demuxer = new TSDemuxer();
}
} else {
this.demuxer = new TSDemuxer();
}
this.demuxInitialized = true;
}
destroy() {
if(this.w) {
this.w.removeEventListener('message',this.onwmsg);
this.w.terminate();
this.w = null;
} else {
this.demuxer.destroy();
}
}
push(data, audioCodec, videoCodec, timeOffset, cc, level, duration) {
if(this.w) {
// post fragment payload as transferable objects (no copy)
this.w.postMessage({ cmd : 'demux' , data : data, audioCodec : audioCodec, videoCodec: videoCodec, timeOffset : timeOffset, cc: cc, level : level, duration : duration},[data]);
} else {
this.demuxer.push(new Uint8Array(data), audioCodec, videoCodec, timeOffset, cc, level, duration);
this.demuxer.end();
}
}
onWorkerMessage(ev) {
//console.log('onWorkerMessage:' + ev.data.event);
switch(ev.data.event) {
case Event.FRAG_PARSING_INIT_SEGMENT:
var obj = {};
if(ev.data.audioMoov) {
obj.audioMoov = new Uint8Array(ev.data.audioMoov);
obj.audioCodec = ev.data.audioCodec;
obj.audioChannelCount = ev.data.audioChannelCount;
}
if(ev.data.videoMoov) {
obj.videoMoov = new Uint8Array(ev.data.videoMoov);
obj.videoCodec = ev.data.videoCodec;
obj.videoWidth = ev.data.videoWidth;
obj.videoHeight = ev.data.videoHeight;
}
observer.trigger(Event.FRAG_PARSING_INIT_SEGMENT, obj);
break;
case Event.FRAG_PARSING_DATA:
observer.trigger(Event.FRAG_PARSING_DATA,{
moof : new Uint8Array(ev.data.moof),
mdat : new Uint8Array(ev.data.mdat),
startPTS : ev.data.startPTS,
endPTS : ev.data.endPTS,
startDTS : ev.data.startDTS,
endDTS : ev.data.endDTS,
type : ev.data.type,
nb : ev.data.nb
});
break;
default:
observer.trigger(ev.data.event,ev.data.data);
break;
}
}
}
export default Demuxer;