aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/webcam
diff options
context:
space:
mode:
authorandrewdkim <adkim414@gmail.com>2019-10-01 18:55:50 -0400
committerandrewdkim <adkim414@gmail.com>2019-10-01 18:55:50 -0400
commit23619154f8688ffcb25a988158d75934c0cacbf7 (patch)
treed7462da0f0e8b9de091263af166959872e8af0f6 /src/client/views/webcam
parent45b9f489033cd323614463ca9c36f41900bf1965 (diff)
parent69e4a936c4eb0cc2e35e4e7f3258aed1f72b8da7 (diff)
still unfinished
Diffstat (limited to 'src/client/views/webcam')
-rw-r--r--src/client/views/webcam/DashWebRTC.tsx73
1 files changed, 61 insertions, 12 deletions
diff --git a/src/client/views/webcam/DashWebRTC.tsx b/src/client/views/webcam/DashWebRTC.tsx
index 203a9df35..9c289b40f 100644
--- a/src/client/views/webcam/DashWebRTC.tsx
+++ b/src/client/views/webcam/DashWebRTC.tsx
@@ -2,7 +2,7 @@ import { observer } from "mobx-react";
import React = require("react");
import { CollectionFreeFormDocumentViewProps } from "../nodes/CollectionFreeFormDocumentView";
import { FieldViewProps, FieldView } from "../nodes/FieldView";
-import { observable } from "mobx";
+import { observable, trace } from "mobx";
import { DocumentDecorations } from "../DocumentDecorations";
import { InkingControl } from "../InkingControl";
import "../../views/nodes/WebBox.scss";
@@ -15,30 +15,79 @@ const mediaStreamConstaints = {
video: true,
};
+const offerOptions = {
+ offerToReceiveVideo: 1,
+};
+
@observer
export class DashWebRTC extends React.Component<CollectionFreeFormDocumentViewProps & FieldViewProps> {
- @observable private videoEl: HTMLVideoElement | undefined;
+ @observable private localVideoEl: HTMLVideoElement | undefined;
+ @observable private peerVideoEl: HTMLVideoElement | undefined;
@observable private localStream: MediaStream | undefined;
+ @observable private startTime = null;
+ @observable private remoteStream: MediaStream | undefined;
+ @observable private localPeerConnection: any;
+ @observable private remotePeerConnection: any;
+ private callButton: HTMLButtonElement | undefined;
+ private startButton: HTMLButtonElement | undefined;
+ private hangupButton: HTMLButtonElement | undefined;
+
+
+ componentDidMount() {
+ this.callButton!.disabled = true;
+ this.hangupButton!.disabled = true;
+ navigator.mediaDevices.getUserMedia(mediaStreamConstaints).then(this.gotLocalMediaStream).catch(this.handleLocalMediaStreamError);
+ this.localVideoEl!.addEventListener('loadedmetadata', this.logVideoLoaded);
+ this.peerVideoEl!.addEventListener('loadedmetadata', this.logVideoLoaded);
+ this.peerVideoEl!.addEventListener('onresize', this.logResizedVideo);
+ }
gotLocalMediaStream = (mediaStream: MediaStream) => {
this.localStream = mediaStream;
- if (this.videoEl) {
- this.videoEl.srcObject = mediaStream;
+ if (this.localVideoEl) {
+ this.localVideoEl.srcObject = mediaStream;
}
+ trace('Received local stream.');
+ this.callButton!.disabled = false;
+
+ }
+
+ gotRemoteMediaStream = (event: MediaStreamEvent) => {
+ let mediaStream = event.stream;
+ this.peerVideoEl!.srcObject = mediaStream;
+ this.remoteStream = mediaStream!;
+
}
handleLocalMediaStreamError = (error: string) => {
- console.log("navigator.getUserMedia error: ", error);
+ //console.log("navigator.getUserMedia error: ", error);
+ trace(`navigator.getUserMedia error: ${error.toString()}.`);
+
}
- componentDidUpdate() {
- navigator.mediaDevices.getUserMedia(mediaStreamConstaints).then(this.gotLocalMediaStream).catch(this.handleLocalMediaStreamError);
+ logVideoLoaded(event: any) {
+ let video = event.target;
+ trace(`${video!.id} videoWidth: ${video!.videoWidth}px, ` +
+ `videoHeight: ${video!.videoHeight}px.`);
+ }
+
+ logResizedVideo(event: any) {
+ this.logVideoLoaded(event);
+
+ if (this.startTime) {
+ let elapsedTime = window.performance.now() - this.startTime!;
+ this.startTime = null;
+ trace(`Setup time: ${elapsedTime.toFixed(3)}ms.`);
+ }
+
}
+
+
public static LayoutString() { return FieldView.LayoutString(DashWebRTC); }
@@ -65,11 +114,11 @@ export class DashWebRTC extends React.Component<CollectionFreeFormDocumentViewPr
render() {
let content =
<div className="webcam-cont" style={{ width: "100%", height: "100%" }} onWheel={this.onPostWheel} onPointerDown={this.onPostPointer} onPointerMove={this.onPostPointer} onPointerUp={this.onPostPointer}>
- <video id="localVideo" autoPlay playsInline ref={(e) => this.videoEl = e!}></video>
- <video id="remoteVideo" autoPlay playsInline></video>
- <button id="startButton">Start</button>
- <button id="callButton">Call</button>
- <button id="hangupButton">Hang Up</button>
+ <video id="localVideo" autoPlay playsInline ref={(e) => this.localVideoEl = e!}></video>
+ <video id="remoteVideo" autoPlay playsInline ref={(e) => this.peerVideoEl = e!}></video>
+ <button id="startButton" ref={(e) => this.startButton = e!}>Start</button>
+ <button id="callButton" ref={(e) => this.callButton = e!}>Call</button>
+ <button id="hangupButton" ref={(e) => this.hangupButton = e!}>Hang Up</button>
</div>;
let frozen = !this.props.isSelected() || DocumentDecorations.Instance.Interacting;