63 lines
1.4 KiB
JavaScript
63 lines
1.4 KiB
JavaScript
'use strict';
|
|
|
|
let { Driver } = require( './driver' );
|
|
let http = require( 'http' );
|
|
let mjpegServer = require( 'mjpeg-server' );
|
|
let jpeg = require( 'jpeg-js' );
|
|
|
|
let mjpegReqHandler = undefined;
|
|
let httpServer = undefined;
|
|
|
|
class MotionJPEG extends Driver {
|
|
constructor() {
|
|
super();
|
|
|
|
httpServer = http.createServer( function( req, res ) {
|
|
mjpegReqHandler = mjpegServer.createReqHandler( req, res );
|
|
} ).listen( 8081, '0.0.0.0' );
|
|
}
|
|
|
|
/**
|
|
* Writes the current buffer to the motionjpeg stream
|
|
*/
|
|
write( buffer = false ) {
|
|
if ( mjpegReqHandler === undefined) {
|
|
return;
|
|
}
|
|
|
|
buffer = new Buffer( this.width * this.height * 4 );
|
|
|
|
let i = 0;
|
|
let size = this.getSize();
|
|
|
|
for ( let y = 0; y < size.height; y++ ) {
|
|
for ( let x = 0; x < size.width; x++ ) {
|
|
buffer[ i++ ] = this.matrix[ x ][ y ].r * this.matrix[ x ][ y ].a * this.brightness;
|
|
buffer[ i++ ] = this.matrix[ x ][ y ].g * this.matrix[ x ][ y ].a * this.brightness;
|
|
buffer[ i++ ] = this.matrix[ x ][ y ].b * this.matrix[ x ][ y ].a * this.brightness;
|
|
buffer[ i++ ] = 0xFF;
|
|
}
|
|
}
|
|
|
|
// Buffor should be complete here
|
|
var imageData = {
|
|
data: buffer,
|
|
width: this.width,
|
|
height: this.height
|
|
};
|
|
|
|
var dt = jpeg.encode( imageData, 100 );
|
|
mjpegReqHandler.write( dt.data );
|
|
}
|
|
|
|
/**
|
|
* Close all http server requests
|
|
*/
|
|
cleanup() {
|
|
if ( httpServer !== undefined ) {
|
|
httpServer.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
exports.MotionJPEG = MotionJPEG; |