import { BitmapData } from "../display/BitmapData";
import { DisplayObject } from "../display/DisplayObject";
import { EventDispatcher } from "../events/EventDispatcher";
import { Rectangle } from "../geom/Rectangle";
import { ByteArray } from "../utils/ByteArray";
/**
 * Dispatched when a camera reports its status.
 * @eventType	flash.events.StatusEvent.STATUS
 */
/**
 * Dispatched when a camera begins or ends a session.
 * @eventType	flash.events.ActivityEvent.ACTIVITY
 */
/**
 * Use the Camera class to capture video from the client system's camera.
 * Use the Video class to monitor the video locally.
 * Use the NetConnection and NetStream classes to transmit the video to Flash Media Server.
 * Flash Media Server can send the video stream to other servers and broadcast it to other clients running Flash Player.
 *
 *   <p class="- topic/p ">A Camera instance captures video in landscape aspect ratio. On devices that can change the screen orientation,
 * such as mobile phones, a Video object attached to the camera will only show upright video in a landscape-aspect orientation.
 * Thus, mobile apps should use a landscape orientation when displaying video and should not auto-rotate.</p><p class="- topic/p ">As of AIR 2.6, autofocus is enabled automatically on mobile devices with an autofocus camera. If the camera does not support continuous autofocus,
 * and many mobile device cameras do not, then the camera is focused when the Camera object is attached to a video stream and whenever
 * the <codeph class="+ topic/ph pr-d/codeph ">setMode()</codeph> method is called. On desktop computers, autofocus behavior is dependent on the camera driver and settings.</p><p class="- topic/p ">In an AIR application on Android and iOS, the camera does not capture video while an AIR app is not the active, foreground application.
 * In addition, streaming connections can be lost when the application is in the background. On iOS, the camera video cannot be
 * displayed when an application uses the GPU rendering mode. The camera video can still be streamed to a server.</p><p class="- topic/p "><b class="+ topic/ph hi-d/b ">Mobile Browser Support:</b> This class is not supported in mobile browsers.</p><p class="- topic/p "><i class="+ topic/ph hi-d/i ">AIR profile support:</i> This feature is supported
 * on desktop operating systems, but it is not supported on all mobile devices. It is not
 * supported on AIR for TV devices. See
 * <xref href="http://help.adobe.com/en_US/air/build/WS144092a96ffef7cc16ddeea2126bb46b82f-8000.html" class="- topic/xref ">
 * AIR Profile Support</xref> for more information regarding API support across multiple profiles.</p><p class="- topic/p ">You can test
 * for support at run time using the <codeph class="+ topic/ph pr-d/codeph ">Camera.isSupported</codeph> property.
 * Note that for AIR for TV devices, <codeph class="+ topic/ph pr-d/codeph ">Camera.isSupported</codeph> is <codeph class="+ topic/ph pr-d/codeph ">true</codeph> but
 * <codeph class="+ topic/ph pr-d/codeph ">Camera.getCamera()</codeph> always returns <codeph class="+ topic/ph pr-d/codeph ">null</codeph>.</p><p class="- topic/p ">
 * For information about capturing audio, see the Microphone class.
 * </p><p class="- topic/p "><b class="+ topic/ph hi-d/b ">Important: </b>Flash Player displays a Privacy dialog box that lets the user choose whether
 * to allow or deny access to the camera. Make sure your application window size is at least 215 x 138 pixels;
 * this is the minimum size required to display the dialog box.
 * </p><p class="- topic/p ">To create or reference a Camera object, use the <codeph class="+ topic/ph pr-d/codeph ">getCamera()</codeph> method.</p>
 *
 *   EXAMPLE:
 *
 *   The following example shows the image from a camera after acknowledging the
 * security warning.  The Stage is set such that it cannot be scaled and is aligned to the
 * top-left of the player window.  The <codeph class="+ topic/ph pr-d/codeph ">activity</codeph> event is dispatched at the
 * start and end (if any) of the session and is captured by the <codeph class="+ topic/ph pr-d/codeph ">activityHandler()</codeph>
 * method, which prints out information about the event.
 *
 *   <p class="- topic/p "><b class="+ topic/ph hi-d/b ">Note:</b> A camera must be attached to your computer for this example
 * to work correctly.</p><codeblock xml:space="preserve" class="+ topic/pre pr-d/codeblock ">
 *
 *   package {
 * import flash.display.Sprite;
 * import flash.display.StageAlign;
 * import flash.display.StageScaleMode;
 * import flash.events.*;
 * import flash.media.Camera;
 * import flash.media.Video;
 *
 *   public class CameraExample extends Sprite {
 * private var video:Video;
 *
 *   public function CameraExample() {
 * stage.scaleMode = StageScaleMode.NO_SCALE;
 * stage.align = StageAlign.TOP_LEFT;
 *
 *   var camera:Camera = Camera.getCamera();
 *
 *   if (camera != null) {
 * camera.addEventListener(ActivityEvent.ACTIVITY, activityHandler);
 * video = new Video(camera.width * 2, camera.height * 2);
 * video.attachCamera(camera);
 * addChild(video);
 * } else {
 * trace("You need a camera.");
 * }
 * }
 *
 *   private function activityHandler(event:ActivityEvent):void {
 * trace("activityHandler: " + event);
 * }
 * }
 * }
 * </codeblock>
 * @langversion	3.0
 * @playerversion	Flash 9
 */
export declare class Camera extends EventDispatcher {
    private static _mediaDevices;
    private _stream;
    private _videoElement;
    private _cameraStream;
    private _cameraId;
    private _diffCanvas;
    private _diffContext;
    private _motionCanvas;
    private _motionContext;
    private _motionTimer;
    private _motionLevel;
    private _pixelDiffThreshold;
    private _diffWidth;
    private _diffHeight;
    private _diffdata;
    private _activityLevel;
    private _motionTimeout;
    private _motionDetected;
    private _showMotionCanvas;
    private static _name;
    private static _names;
    private static _devices;
    static dispatchObject: DisplayObject;
    /**
     * The amount of motion the camera is detecting. Values range from 0 (no motion is being detected) to
     * 100 (a large amount of motion is being detected). The value of this property can help you determine if you need to pass a setting
     * to the setMotionLevel() method.
     * If the camera is available but is not yet being used because the
     * Video.attachCamera() method has not been called, this property
     * is set to -1.If you are streaming only uncompressed local video, this property is set only if you have assigned a function to the  event
     * handler. Otherwise, it is undefined.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get activityLevel(): number;
    /**
     * The maximum amount of bandwidth the current outgoing video feed can use, in bytes.
     * A value of 0 means the feed can use as much bandwidth as needed to maintain the desired frame quality.
     * To set this property, use the setQuality() method.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get bandwidth(): number;
    /**
     * The rate at which the camera is capturing data, in frames per second.
     * This property cannot be set; however, you can use the setMode() method
     * to set a related property—fps—which specifies the maximum
     * frame rate at which you would like the camera to capture data.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get currentFPS(): number;
    /**
     * The maximum rate at which the camera can capture data, in frames per second.
     * The maximum rate possible depends on the capabilities of the camera; this frame rate may not be achieved.
     * To set a desired value for this property, use the setMode() method.To determine the rate at which the camera is currently capturing data, use the currentFPS property.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get fps(): number;
    /**
     * The current capture height, in pixels. To set a value for this property,
     * use the setMode() method.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get height(): number;
    /**
     * A zero-based integer that specifies the index of the camera, as reflected in
     * the array returned by the names property.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get index(): number;
    /**
     * The isSupported property is set to true if the
     * Camera class is supported on the current platform, otherwise it is
     * set to false.
     * @langversion	3.0
     * @playerversion	Flash 10.1
     * @playerversion	AIR 2
     */
    static get isSupported(): boolean;
    /**
     * The number of video frames transmitted in full (called keyframes)
     * instead of being interpolated by the video compression algorithm.
     * The default value is 15, which means that every 15th frame is a keyframe.
     * A value of 1 means that every frame is a keyframe. The allowed values are
     * 1 through 48.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get keyFrameInterval(): number;
    /**
     * Indicates whether a local view of what the camera is capturing is compressed
     * and decompressed (true), as it would be for live transmission using
     * Flash Media Server, or uncompressed (false). The default value is
     * false.
     *
     *   Although a compressed stream is useful for testing, such as when previewing
     * video quality settings, it has a significant processing cost. The local view
     * is compressed, edited for transmission as it would be over a live connection,
     * and then decompressed for local viewing.
     * To set this value, use Camera.setLoopback(). To set the amount of
     * compression used when this property is true, use Camera.setQuality().
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get loopback(): boolean;
    /**
     * The amount of motion required to invoke the activity event. Acceptable values range from 0 to 100.
     * The default value is 50.
     * Video can be displayed regardless of the value of the motionLevel property. For more information, see
     * setMotionLevel().
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get motionLevel(): number;
    /**
     * The number of milliseconds between the time the camera stops detecting motion and the time the activity event is invoked. The
     * default value is 2000 (2 seconds).
     * To set this value, use setMotionLevel().
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get motionTimeout(): number;
    /**
     * A Boolean value indicating whether the user has denied access to the camera
     * (true) or allowed access (false) in the Flash Player Privacy dialog box.
     *
     *   When this value changes, the statusevent is dispatched.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get muted(): boolean;
    /**
     * The name of the current camera, as returned by the camera hardware.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get name(): string;
    /**
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    static get names(): any[];
    get position(): string;
    /**
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get quality(): number;
    /**
     * The current capture width, in pixels. To set a desired value for this property,
     * use the setMode() method.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    get width(): number;
    /**
     * retrieves the available camera stream.
     */
    get cameraStream(): MediaStream;
    set cameraStream(value: MediaStream);
    /**
     * video element used for camera.
     */
    get videoElement(): HTMLVideoElement;
    set videoElement(value: HTMLVideoElement);
    get showMotionCanvas(): boolean;
    set showMotionCanvas(value: boolean);
    private static _scanHardware;
    constructor();
    copyToByteArray(rect: Rectangle, destination: ByteArray): void;
    copyToVector(rect: Rectangle, destination: number[]): void;
    /**
     * Draws the current camera frame to the destination bitmapdata.
     * @param	destination		the BitmapData object to use for drawing.
     */
    drawToBitmapData(destination: BitmapData): void;
    /**
     * @param	name	Specifies which camera to get, as determined from the array
     *   returned by the names property. For most applications, get the default camera
     *   by omitting this parameter. To specify a value for this parameter, use the string representation
     *   of the zero-based index position within the Camera.names array. For example, to specify the third
     *   camera in the array, use Camera.getCamera("2").
     * @param facingMode	Used to specify on mobile devices to use front facing camera "user" or the back camera "environment".
     * @return	If the name parameter is not specified, this method returns a reference
     *   to the default camera or, if it is in use by another application, to the first
     *   available camera. (If there is more than one camera installed, the user may specify
     *   the default camera in the Flash Player Camera Settings panel.) If no cameras are available
     *   or installed, the method returns null.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    static getCamera(name?: string, minWidth?: number, minHeight?: number, facingMode?: string): Camera;
    setCursor(value: boolean): void;
    /**
     * @param	keyFrameInterval	A value that specifies which video frames are transmitted in full
     *   (as keyframes) instead of being interpolated by the video compression algorithm.
     *   A value of 1 means that every frame is a keyframe, a value of 3 means that every third frame
     *   is a keyframe, and so on. Acceptable values are 1 through 48.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    setKeyFrameInterval(keyFrameInterval: number): void;
    /**
     * @param	compress	Specifies whether to use a compressed video stream (true)
     *   or an uncompressed stream (false) for a local view of what the camera
     *   is receiving.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    setLoopback(compress?: boolean): void;
    /**
     * @param	width	The requested capture width, in pixels. The default value is 160.
     * @param	height	The requested capture height, in pixels. The default value is 120.
     * @param	fps	The requested rate at which the camera should capture data, in frames per second.
     *   The default value is 15.
     * @param	favorArea	Specifies whether to manipulate the width, height, and frame rate if
     *   the camera does not have a native mode that meets the specified requirements.
     *   The default value is true, which means that maintaining capture size
     *   is favored; using this parameter selects the mode that most closely matches
     *   width and height values, even if doing so adversely affects
     *   performance by reducing the frame rate. To maximize frame rate at the expense
     *   of camera height and width, pass false for the favorArea parameter.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    setMode(width: number, height: number, fps: number, favorArea?: boolean): void;
    /**
     * @param	motionLevel	Specifies the amount of motion required to dispatch the
     *   activity event. Acceptable values range from 0 to 100. The default value is 50.
     * @param	timeout	Specifies how many milliseconds must elapse without activity
     *   before Flash Player considers activity to have stopped and dispatches the activity event.
     *   The default value is 2000 milliseconds (2 seconds).
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    setMotionLevel(motionLevel: number, timeout?: number): void;
    private onMotionTimeout;
    private onMotionTimer;
    private processDiff;
    /**
     * @param	bandwidth	Specifies the maximum amount of bandwidth that the current outgoing video
     *   feed can use, in bytes per second. To specify that Flash Player video can use as much bandwidth
     *   as needed to maintain the value of quality, pass 0 for
     *   bandwidth. The default value is 16384.
     * @param	quality	An integer that specifies the required level of picture quality,
     *   as determined by the amount of compression being applied to each video frame.
     *   Acceptable values range from 1 (lowest quality, maximum compression) to 100 (highest
     *   quality, no compression). To specify that picture quality can vary as needed to avoid
     *   exceeding bandwidth, pass 0 for quality.
     * @langversion	3.0
     * @playerversion	Flash 9
     */
    setQuality(bandwidth: number, quality: number): void;
}
