sexybiggetje/pixdisp

View on GitHub
drivers/motionjpeg.js

Summary

Maintainability
A
3 hrs
Test Coverage
F
50%
'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;