You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

484 lines
14 KiB

// var isWorker = typeof importScripts == "function";
// var bridgeName = "__CODE_BRIDGE__" + +new Date();
// self.Module = {
// onRuntimeInitialized: function () {
// onWasmLoaded();
// },
// // onVideoDataSize: function () {
// // onVideoDataSize();
// // },
// // onVideoData: function () {
// // onVideoData();
// // },
// // onAudioDataSize: function () {
// // onAudioDataSize();
// // },
// // onAudioData: function () {
// // onAudioData();
// // },
// // };
// // var isWorker = typeof importScripts == "function";
// // var bridgeName = "__CODE_BRIDGE__" + +new Date();
// // [bridgeName] = {
// onHeader: function(header) {
// //Module.postMessage({ type: "header", data: header });
// },
// onMediaInfo: function(mediaInfo) {
// console.log("onMediaInfo"+mediaInfo.toString(16));
// //Module.postMessage({ type: "mediaInfo", data: mediaInfo });
// },
// onAudioDataSize: function(data) {
// // Module.audioBufferSize = data.size;
// // Module.audioBuffer = Module._malloc(Module.audioBufferSize);
// // Module._codecSetAudioBuffer(Module.audioBuffer);
// },
// onAudioData: function(data) {
// // var timestamp = data.timestamp;
// // Module.audioTimestamps.push(timestamp);
// // var u8s = Module.HEAPU8.subarray(
// // Module.audioBuffer,
// // Module.audioBuffer + Module.audioBufferSize
// // );
// // var output = null;
// // if (supportSharedBuffer) {
// // output = new Uint8Array(new SharedArrayBuffer(u8s.byteLength));
// // output.set(u8s);
// // } else {
// // output = new Uint8Array(u8s);
// // }
// // Module._free(Module.audioBuffer);
// // Module.audioBuffer = null;
// // Module.postMessage(
// // {
// // type: "audio",
// // data: {
// // buffer: output.buffer,
// // timestamp: timestamp
// // }
// // },
// // supportSharedBuffer ? undefined : [output.buffer]
// // );
// },
// onVideoDataSize: function(data) {
// console.log("onVideoDataSize"+data.toString(16));
// // if (Module.videoBuffer == null) {
// // Module.videoBufferSize = data.size;
// // Module.videoBuffer = Module._malloc(Module.videoBufferSize);
// // if (supportSharedBuffer) {
// // Module.videoSharedBuffer = new SharedArrayBuffer(data.size);
// // }
// // }
// // Module._codecSetVideoBuffer(Module.videoBuffer);
// },
// onVideoData: function(data) {
// console.log("onVideoData"+data.toString(16));
// // var timestamp = data.timestamp;
// // Module.videoTimestamps.push(timestamp);
// // var u8s = Module.HEAPU8.subarray(
// // Module.videoBuffer,
// // Module.videoBuffer + Module.videoBufferSize
// // );
// // var output = null;
// // if (supportSharedBuffer) {
// // output = new Uint8Array(Module.videoSharedBuffer);
// // output.set(u8s);
// // } else {
// // output = new Uint8Array(u8s);
// // }
// // Module.postMessage(
// // {
// // type: "video",
// // data: {
// // buffer: output.buffer,
// // timestamp: timestamp,
// // width: data.width,
// // height: data.height,
// // stride0: data.stride0,
// // stride1: data.stride1
// // }
// // },
// // supportSharedBuffer ? undefined : [output.buffer]
// // );
// },
// onComplete: function() {
// console.log("onComplete");
// // Module.postMessage({ type: "complete" });
// }
// };
var Module = {};
self.importScripts("common.js");
self.importScripts("glue.js");
self.importScripts("prod.h265.wasm.js");
// var decoder_type = DECODER_H265;
var ptsIdx=0;
H265Frame =[];
function Decoder(){
// this.timer=null;
this.decodeTimer = null;
this.rawParserObj = null;
this.wasmLoaded = false;
this.tmpReqQue = [];
this.destroied = false;
// this.poddecoder = null;
// this.supportSharedBuffer = false;
// this.bridgeName = "__CODE_BRIDGE__" + +new Date();
// this.audioTimestamps = []
// this.videoTimestamps = []
// this.audioBufferSize = 0
// this.videoBufferSize = 0
// this.audioBuffer = null
// this.videoBuffer = null
// this.videoSharedBuffer =null;
// this.token = "base64:QXV0aG9yOmNoYW5neWFubG9uZ3xudW1iZXJ3b2xmLEdpdGh1YjpodHRwczovL2dpdGh1Yi5jb20vbnVtYmVyd29sZixFbWFpbDpwb3JzY2hlZ3QyM0Bmb3htYWlsLmNvbSxRUTo1MzEzNjU4NzIsSG9tZVBhZ2U6aHR0cDovL3h2aWRlby52aWRlbyxEaXNjb3JkOm51bWJlcndvbGYjODY5NCx3ZWNoYXI6bnVtYmVyd29sZjExLEJlaWppbmcsV29ya0luOkJhaWR1";
// this.version = '100.2.0';
}
Decoder.prototype.cacheReq = function (req) {
if (req) {
this.tmpReqQue.push(req);
}
};
Decoder.prototype.onWasmLoaded = function () {
console.log("Wasm loaded.");
this.wasmLoaded = true;
while (this.tmpReqQue.length > 0) {
var req = this.tmpReqQue.shift();
this.processReq(req);
}
}
Decoder.prototype.initDecoder = function () {
// var ret = Module._initDecoder(fileSize, this.coreLogLevel);
var ret=0;
console.log("initDecoder return " + ret + ".");
// try {
// this.supportSharedBuffer = !!new SharedArrayBuffer(0);
// } catch (e) {
// // nothing to do...
// }
// // this.bridgeName = "__CODE_BRIDGE__" + +new Date();
// Module._codecInit();
// var callbackStr = bridgeName.split("");
// callbackStr = callbackStr
// .map(function(v) {
// return v.charCodeAt(0);
// })
// .concat(0);
// var callbackStrData = Module._malloc(callbackStr.length - 1);
// Module.HEAPU8.set(callbackStr, callbackStrData);
// Module._codecSetBridgeName(callbackStrData);
var objData = {
t: kInitDecoderRsp,
e: ret
};
self.postMessage(objData);
};
Decoder.prototype.openDecoder = function () {
var objData = {
t: kOpenDecoderRsp,
e: 0
};
self.postMessage(objData);
}
Decoder.prototype.uninitDecoder = function () {
var ret = 0;//Module._uninitDecoder();
// Module._codecFree();
console.log("Uninit ffmpeg decoder return " + ret + ".");
};
// Decoder.prototype.onHeader = function(header) {
// // Module.postMessage({ type: "header", data: header });
// };
// Decoder.prototype.onMediaInfo = function(mediaInfo) {
// // Module.postMessage({ type: "mediaInfo", data: mediaInfo });
// };
// Decoder.prototype.onAudioDataSize = function(data) {
// this.audioBufferSize = data.size;
// this.audioBuffer = Module._malloc(this.audioBufferSize);
// Module._codecSetAudioBuffer(this.audioBuffer);
// };
// Decoder.prototype.onAudioData = function(data) {
// var timestamp = data.timestamp;
// this.audioTimestamps.push(timestamp);
// var u8s = Module.HEAPU8.subarray(
// this.audioBuffer,
// this.audioBuffer +this.audioBufferSize
// );
// var output = null;
// if (supportSharedBuffer) {
// output = new Uint8Array(new SharedArrayBuffer(u8s.byteLength));
// output.set(u8s);
// } else {
// output = new Uint8Array(u8s);
// }
// Module._free(this.audioBuffer);
// this.audioBuffer = null;
// // Module.postMessage(
// // {
// // type: "audio",
// // data: {
// // buffer: output.buffer,
// // timestamp: timestamp
// // }
// // },
// // supportSharedBuffer ? undefined : [output.buffer]
// // );
// };
// Decoder.prototype.onVideoDataSize = function(data){
// if (this.videoBuffer == null) {
// this.videoBufferSize = data.size;
// this.videoBuffer = Module._malloc(this.videoBufferSize);
// if (this.supportSharedBuffer) {
// this.videoSharedBuffer = new SharedArrayBuffer(data.size);
// }
// }
// Module._codecSetVideoBuffer(this.videoBuffer);
// }
// Decoder.prototype.onVideoData = function(data) {
// var timestamp = data.timestamp;
// this.videoTimestamps.push(timestamp);
// var u8s = Module.HEAPU8.subarray(
// this.videoBuffer,
// this.videoBuffer + this.videoBufferSize
// );
// var output = null;
// if (supportSharedBuffer) {
// output = new Uint8Array(this.videoSharedBuffer);
// output.set(u8s);
// } else {
// output = new Uint8Array(u8s);
// }
// // Module.postMessage(
// // {
// // type: "video",
// // data: {
// // buffer: output.buffer,
// // timestamp: timestamp,
// // width: data.width,
// // height: data.height,
// // stride0: data.stride0,
// // stride1: data.stride1
// // }
// // },
// // supportSharedBuffer ? undefined : [output.buffer]
// // );
// var obj = {
// data: output,
// width: data.width,
// height: data.height,
// }
// var objData = {
// t: kprodVideoFrame,
// s: timestamp,
// stride0: data.stride0,
// stride1: data.stride1,
// d: obj
// };
// self.postMessage(objData, [objData.d.data.buffer]);
// };
// Decoder.prototype.onComplete=function() {
// // Module.postMessage({ type: "complete" });
// }
var decodet1=new Date().getTime();
Decoder.prototype.decodeVideo=function(){
if(H265Frame.length>0){
decodet1=new Date().getTime();
var typedArray= H265Frame.shift();//H265Frame[0];//new Uint8Array(H265Frame[0]);
h265decode(typedArray);
// if(Module){
// Module.postMessage({
// type: 'decode',
// buffer: typedArray,
// });
// }
// var size = typedArray.length
// var cacheBuffer = Module._malloc(size);
// Module.HEAPU8.set(typedArray, cacheBuffer);
// this.audioTimestamps = [];
// this.videoTimestamps = [];
// Module._codecDecode(cacheBuffer, size);
// this.decode(typedArray)
// if (cacheBuffer != null) {
// Module._free(cacheBuffer);
// cacheBuffer = null;
// }
}
}
// Decoder.prototype.decodeVideo = function(){ // 对外api,解码一段数据
// }
Decoder.prototype.decode = function(buffer){ // 对外api,解码一段数据
h265decode(buffer);
// if(Module){
// // Module.postMessage({
// // type: 'decode',
// // buffer: buffer,
// // });
// }
}
Decoder.prototype.destroy = function(){ // 对外api,销毁解码器
this.destroied = true;
if(Module){
// window.URL.revokeObjectURL(this.url);
Module.postMessage({type: 'destroy'});
}
}
Decoder.prototype.startDecoding = function (interval) {
console.log("Start decoding.");
if (this.decodeTimer) {
clearInterval(this.decodeTimer);
}
this.decodeTimer = setInterval(this.decodeVideo, 0);//interval);
};
Decoder.prototype.pauseDecoding = function () {
console.log("Pause decoding.");
if (this.decodeTimer) {
clearInterval(this.decodeTimer);
this.decodeTimer = null;
}
};
Decoder.prototype.sendVideoFrame = function(data,len){
var typedArray = new Uint8Array(data);
if(H265Frame.length>MAX_FRAME_SIZE){
H265Frame.shift();
}
H265Frame.push(typedArray)
}
Decoder.prototype.closeDecoder = function () {
console.log("closeDecoder.");
if (this.decodeTimer) {
clearInterval(this.decodeTimer);
this.decodeTimer = null;
console.log("Decode timer stopped.");
}
// var ret = Module._closeDecoder();
console.log("Close ffmpeg decoder return " + ret + ".");
var objData = {
t: kCloseDecoderRsp,
e: 0
};
self.postMessage(objData);
};
Decoder.prototype.processReq = function (req) {
// console.log("processReq " + req.t + ".");
switch (req.t) {
case kInitDecoderReq:
this.initDecoder();
break;
case kUninitDecoderReq:
this.uninitDecoder();
break;
case kOpenDecoderReq:
this.openDecoder();
break;
case kCloseDecoderReq:
this.closeDecoder();
break;
case kStartDecodingReq:
this.startDecoding(req.i);
break;
case kPauseDecodingReq:
this.pauseDecoding();
break;
case kFeedDataReq:
this.sendVideoFrame(req.d);
break;
// case kSeekToReq:
// this.seekTo(req.ms);
// break;
default:
this.logger.logError("Unsupport messsage " + req.t);
}
};
self.decoder = new Decoder;
self.onmessage = function (evt) {
if (!self.decoder) {
console.log("[ER] Decoder not initialized!");
return;
}
var req = evt.data;
if (!self.decoder.wasmLoaded) {
self.decoder.cacheReq(req);
console.log("Temp cache req " + req.t + ".");
return;
}
self.decoder.processReq(req);
};
function onWasmLoaded() {
if (self.decoder) {
self.decoder.onWasmLoaded();
} else {
console.log("[ER] No decoder!");
}
}
// function onVideoDataSize() {
// if (self.decoder) {
// self.decoder.onVideoDataSize();
// } else {
// console.log("[ER] No decoder!");
// }
// }
// function onVideoData() {
// if (self.decoder) {
// self.decoder.onVideoData();
// } else {
// console.log("[ER] No decoder!");
// }
// }
// function onAudioDataSize() {
// if (self.decoder) {
// self.decoder.onAudioDataSize();
// } else {
// console.log("[ER] No decoder!");
// }
// }
// function onAudioData() {
// if (self.decoder) {
// self.decoder.onAudioData();
// } else {
// console.log("[ER] No decoder!");
// }
// }