2015-12-16 00:30:14 -05:00
/ * d e m u x e r w e b w o r k e r .
* - listen to worker message , and trigger DemuxerInline upon reception of Fragments .
* - provides MP4 Boxes back to main thread using [ transferable objects ] ( https : //developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast) in order to minimize message passing overhead.
* /
import DemuxerInline from '../demux/demuxer-inline' ;
import Event from '../events' ;
import EventEmitter from 'events' ;
import MP4Remuxer from '../remux/mp4-remuxer' ;
var DemuxerWorker = function ( self ) {
// observer setup
var observer = new EventEmitter ( ) ;
observer . trigger = function trigger ( event , ... data ) {
observer . emit ( event , event , ... data ) ;
} ;
observer . off = function off ( event , ... data ) {
observer . removeListener ( event , ... data ) ;
} ;
self . addEventListener ( 'message' , function ( ev ) {
//console.log('demuxer cmd:' + ev.data.cmd);
switch ( ev . data . cmd ) {
case 'init' :
self . demuxer = new DemuxerInline ( observer , MP4Remuxer ) ;
break ;
case 'demux' :
var data = ev . data ;
self . demuxer . push ( new Uint8Array ( data . data ) , data . audioCodec , data . videoCodec , data . timeOffset , data . cc , data . level , data . sn , data . duration ) ;
break ;
default :
break ;
}
} ) ;
// listen to events triggered by TS Demuxer
observer . on ( Event . FRAG _PARSING _INIT _SEGMENT , function ( ev , data ) {
var objData = { event : ev } ;
var objTransferable = [ ] ;
if ( data . audioCodec ) {
objData . audioCodec = data . audioCodec ;
objData . audioMoov = data . audioMoov . buffer ;
objData . audioChannelCount = data . audioChannelCount ;
objTransferable . push ( objData . audioMoov ) ;
}
if ( data . videoCodec ) {
objData . videoCodec = data . videoCodec ;
objData . videoMoov = data . videoMoov . buffer ;
objData . videoWidth = data . videoWidth ;
objData . videoHeight = data . videoHeight ;
objTransferable . push ( objData . videoMoov ) ;
}
// pass moov as transferable object (no copy)
self . postMessage ( objData , objTransferable ) ;
} ) ;
observer . on ( Event . FRAG _PARSING _DATA , function ( ev , data ) {
var objData = { event : ev , type : data . type , startPTS : data . startPTS , endPTS : data . endPTS , startDTS : data . startDTS , endDTS : data . endDTS , moof : data . moof . buffer , mdat : data . mdat . buffer , nb : data . nb } ;
// pass moof/mdat data as transferable object (no copy)
self . postMessage ( objData , [ objData . moof , objData . mdat ] ) ;
} ) ;
observer . on ( Event . FRAG _PARSED , function ( event ) {
self . postMessage ( { event : event } ) ;
} ) ;
observer . on ( Event . ERROR , function ( event , data ) {
self . postMessage ( { event : event , data : data } ) ;
} ) ;
observer . on ( Event . FRAG _PARSING _METADATA , function ( event , data ) {
var objData = { event : event , samples : data . samples } ;
self . postMessage ( objData ) ;
} ) ;
2016-02-01 12:02:17 -05:00
observer . on ( Event . FRAG _PARSING _USERDATA , function ( event , data ) {
var objData = { event : event , samples : data . samples } ;
self . postMessage ( objData ) ;
} ) ;
2015-12-16 00:30:14 -05:00
} ;
export default DemuxerWorker ;