Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 38 additions & 12 deletions source/osh/ui/view/video/FFMPEGView.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ class FFMPEGView extends View {
document.addEventListener(visibilityChange, handleVisibilityChange, false);
this.buf = [];
this.bufferingTime = 2 * 1000;
this.configured = false;
}

createCanvas(width, height, domNode) {
Expand Down Expand Up @@ -320,6 +321,17 @@ class FFMPEGView extends View {

}

getSPSValue() {
let result;

switch (this.codec) {
case 'h264': result = { idx:4, hexaValue:0x67};break;
case 'h265': result = { idx:4, hexaValue:0x40};break;
case 'vp9': result = { idx: 0,hexaValue:0x82};break;
case 'vp8': result = null; break;
}
return result;
}
/**
* @private
* @param pktSize
Expand All @@ -328,18 +340,32 @@ class FFMPEGView extends View {
*/
decode(pktSize, pktData, timeStamp, roll) {
if(pktSize > 0) {
let arrayBuffer = pktData.buffer;

this.decodeWorker.postMessage({
pktSize: pktSize,
pktData: arrayBuffer,
roll: roll,
byteOffset: pktData.byteOffset,
codec: this.codec,
timeStamp: timeStamp,
dataSourceId: this.dataSourceId
}, [arrayBuffer]);
pktData = null;
if(!this.configured) {
// 0x67 = h264 on idx 4
// 0x40 = HEVC on idx 4
// 0x82 = VP9 on idx 0
// 0x9d = VP8 on idx 3
// skip until find SPS to start the sequence
const sps = this.getSPSValue();
if(sps === null || pktData[sps.idx] === sps.hexaValue) {
this.configured = true;
}
}

if(this.configured) {
let arrayBuffer = pktData.buffer;

this.decodeWorker.postMessage({
pktSize: pktSize,
pktData: arrayBuffer,
roll: roll,
byteOffset: pktData.byteOffset,
codec: this.codec,
timeStamp: timeStamp,
dataSourceId: this.dataSourceId
}, [arrayBuffer]);
pktData = null;
}
}
}

Expand Down
14 changes: 7 additions & 7 deletions source/osh/ui/view/video/workers/ffmpeg.decode.worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ instance.ready
instance.writeArrayToMemory(pktData, self.av_pktData);

// decode next frame
var len = instance._avcodec_decode_video2(self.av_ctx, self.av_frame, self.got_frame, self.av_pkt);
const len = instance._avcodec_decode_video2(self.av_ctx, self.av_frame, self.got_frame, self.av_pkt);
if (len < 0) {
console.log("Error while decoding frame");
return;
Expand All @@ -113,15 +113,15 @@ instance.ready
return;
}

var decoded_frame = self.av_frame;
var frame_width = instance.getValue(decoded_frame + 68, 'i32');
var frame_height = instance.getValue(decoded_frame + 72, 'i32');
const decoded_frame = self.av_frame;
const frame_width = instance.getValue(decoded_frame + 68, 'i32');
const frame_height = instance.getValue(decoded_frame + 72, 'i32');
//console.log("Decoded Frame, W=" + frame_width + ", H=" + frame_height);

// copy Y channel to canvas
var frameYDataPtr = instance.getValue(decoded_frame, '*');
var frameUDataPtr = instance.getValue(decoded_frame + 4, '*');
var frameVDataPtr = instance.getValue(decoded_frame + 8, '*');
const frameYDataPtr = instance.getValue(decoded_frame, '*');
const frameUDataPtr = instance.getValue(decoded_frame + 4, '*');
const frameVDataPtr = instance.getValue(decoded_frame + 8, '*');

return {
frame_width: frame_width,
Expand Down