- From: Rich Tibbett <richt@opera.com>
- Date: Tue, 14 Aug 2012 13:38:05 +0200
- To: "public-media-capture@w3.org" <public-media-capture@w3.org>
Hi,
During the last few months we've received a number of requests from
developers to provide more granular control over camera streams provided
via getUserMedia. Such requests have centered around providing
auto-focus feature detection/setting/monitoring, zoom
detection/setting/monitoring, enabling camera flash in a sensible way,
and changing the rotation/orientation of a webcam stream. Because the
current specification does not incorporate these features at present we
did some brainstorming and came up with the following idea.
Taking all of these use cases in to account, we would like to present
the following proposal that allows a web application to:
1. Distinguish between audio and video media streams obtained via
getUserMedia (by introducing VideoStreamTrack and AudioStreamTrack
interfaces that inherit from the currently specified - generic -
MediaStreamTrack interface).
2. Apply special behavior to VideoStreamTrack objects that allow a web
developer to feature detect on the capabilities of a web camera, set
their desired modes for a number of features related to a given Camera
object, trigger certain features on-demand and listen for Camera feature
start and end events where that makes sense.
When we have the ability to distinguish video stream tracks from audio
stream tracks (in point 1 above) it became clear that there were many
other use cases that we could then naturally fit in to the same API
architecture.
The proposal herein therefore incorporates an initial set of controls
for developers to tune certain web camera feature. We expect this will
be of interest for a large number of other use cases, such as Camera
capabilities detection and control in the form of a best-effort approach
that is inclusive and 'webby' by design.
Our primary concern at this time is to get a sense for whether there's
agreement around supplying these options to developers or not and then
to subsequently discuss whether the interface proposal provided is fit
for purpose. If anyone else has alternative proposals then we'd be
interested to discuss them further here of course.
*** PROPOSAL START ***
// +++ VIDEOSTREAMTRACK
interface VideoStreamTrack {
readonly attribute boolean locked; // true if object is not a
// camera object or manipulation
// is not otherwise supported
// false if object can be
// modified
// CAMERA SELECTION
readonly attribute boolean cameraChangeSupported; // true if camera
// can be changed.
// Otherwise, false.
readonly attribute unsigned short numberOfCameras;
readonly attribute unsigned short currentCamera;
CameraInfo getCameraInfo(in unsigned short value);
void setCamera(in unsigned short value);
// AUTO-FOCUS
readonly attribute boolean focusSupported; // true if camera focus
// can be changed.
// Otherwise, false.
readonly attribute DOMString currentFocusMode;
void setFocusMode(in DOMString value);
// value argument above may be one of 'auto' (default),
// 'continuous', 'edof' (Extended Depth of Field), 'fixed',
// 'infinity' or 'macro' (close-up focus mode).
void autoFocus(in optional Object xy);
void cancelAutoFocus();
// ZOOM
readonly attribute boolean zoomSupported; // true if camera zoom can
// be changed. Otherwise,
// false.
readonly attribute unsigned short currentZoom;
readonly attribute unsigned short maxZoom;
void startZoom(in unsigned short value);
void stopZoom();
// FLASH
readonly attribute boolean flashSupported; // true if camera flash
// mode can be changed.
// Otherwise, false.
readonly attribute DOMString currentFlashMode;
void setFlashMode(in DOMString value);
// value argument above may be one of 'auto' (default), 'off', 'on',
// 'red-eye' or 'torch'.
// ORIENTATION
readonly attribute boolean orientationSupported; // true if camera
// orientation be
// changed.
// Otherwise, false
readonly attribute unsigned short currentDisplayOrientation;
// 0<->360 degrees
void setDisplayOrientation(in unsigned short degrees);
// GENERAL FEATURES
void takePicture();
// takePicture first applies currentFocusMode and currentFlashMode
// before taking a JPEG image snapshot from currentCamera and firing
// a new 'picture' event, setting its data attribute as the value of
// the JPEG image's ImageData.
// VIEWING ANGLE
readonly attribute float horizontalViewAngle;
readonly attribute float verticalViewAngle;
// EVENT LISTENERS
attribute EventListener onfocusstart;
attribute EventListener onfocusend;
attribute EventListener onzoomstart;
attribute EventListener onzoomend;
attribute EventListener oncamerachange;
attribute EventListener onpicture;
}
VideoStreamTrack implements MediaStreamTrack;
VideoStreamTrack implements EventTarget;
// VideoStreamTrack events: 'focusstart', 'focusend', 'zoomstart',
// 'zoomend', 'camerachange' and 'picture'.
++ CAMERAINFO
[NoInterfaceObject]
interface CameraInfo {
attribute unsigned short facing;
// facing above will be either 'user' or 'environment'
attribute unsigned short orientation;
// orientation will be in the range 0 to 360 degrees
}
*** PROPOSAL END ***
--
Rich Tibbett (richt)
CORE Platform Architect - Opera Software ASA
Received on Tuesday, 14 August 2012 11:38:37 UTC