import React from "react";
import PropTypes from "prop-types";
export enum Encoding {
mjpeg = "mjpeg",
ros = "ros_compressed",
png = "png",
vp8 = "vp8",
h264 = "h264",
}
export enum TransportLayer {
raw = "raw",
compressed = "compressed",
theora = "theora",
}
interface ImageViewerProps {
topic: string;
height?: number;
width?: number;
containerHeight?: number;
containerWidth?: number;
host?: string;
port?: number;
encoding?: Encoding;
transportLayer?: TransportLayer;
quality?: number;
disabled?: boolean;
bitrate?: number;
qmin?: number;
qmax?: number;
gop?: number;
vp8Quality?: string;
imageStyle?: object;
}
export function rosImageSrcString(topic: string, height: number = 480, width: number = 640, host: string = "http://localhost", port: number = 8080, encoding : Encoding = Encoding.mjpeg, transportLayer: TransportLayer = TransportLayer.raw, quality : number = 95, bitrate : number = 100000, qmin: number = 10, qmax: number = 42, gop: number = 250, vp8Quality: string = 'realtime') : string {
if (encoding === Encoding.mjpeg) {
return getMjpegSourceString(topic, height, width, host, port, encoding, transportLayer, quality);
} else if (encoding === Encoding.vp8) {
return getVp8SourceString(topic, height, width, host, port, encoding, transportLayer, bitrate, qmin, qmax, gop, vp8Quality);
} else {
return getOtherSourceString(topic, height, width, host, port, encoding, transportLayer);
}
}
function getMjpegSourceString(topic: string, height: number = 480, width: number = 640, host: string = "http://localhost", port: number = 8080, encoding : Encoding = Encoding.mjpeg, transportLayer: TransportLayer = TransportLayer.raw, quality : number = 95) : string {
return `${host}:${port}/stream?topic=${topic}&type=${encoding}&default_transport=${transportLayer}&width=${width}&height=${height}&quality=${quality}`;
}
function getVp8SourceString(topic: string, height: number, width: number, host: string, port: number, encoding : Encoding, transportLayer: TransportLayer, bitrate : number, qmin: number, qmax: number, gop: number, vp8Quality: string) : string {
return `${host}:${port}/stream?topic=${topic}&type=${encoding}&default_transport=${transportLayer}&width=${width}&height=${height}&bitrate=${bitrate}&qmin=${qmin}&qmax=${qmax}&gop=${gop}&quality=${vp8Quality}`;
}
function getOtherSourceString(topic: string, height: number, width: number, host: string, port: number, encoding: Encoding, transportLayer: TransportLayer) : string {
return `${host}:${port}/stream?topic=${topic}&type=${encoding}&default_transport=${transportLayer}&width=${width}&height=${height}`;
}
const defaultImageStyle = {
maxWidth: "100%",
height: "auto",
}
export const ImageViewer = (props : ImageViewerProps) => {
const style = props.imageStyle || ((props.containerWidth && props.containerHeight) ? {} : defaultImageStyle);
if (props.disabled) {
return (
);
} else {
const src = rosImageSrcString(props.topic, props.height, props.width, props.host, props.port, props.encoding, props.transportLayer, props.quality, props.bitrate, props.qmin, props.qmax, props.gop, props.vp8Quality);
return (
)
}
}
ImageViewer.propTypes = {
topic: PropTypes.string.isRequired,
height: PropTypes.number,
width: PropTypes.number,
containerWidth: PropTypes.number,
containerHeight: PropTypes.number,
host: PropTypes.string,
port: PropTypes.number,
encoding: PropTypes.string,
transportLayer: PropTypes.string,
quality: PropTypes.number,
disabled: PropTypes.bool,
bitrate: PropTypes.number,
qmin: PropTypes.number,
qmax: PropTypes.number,
gop: PropTypes.number,
vp8Quality: PropTypes.string,
imageStyle: PropTypes.object,
}