#include "domstubs.idl"

#include "nsIDOMMediaStream.idl"
#include "nsIDOMDOMRequest.idl"


interface nsIDOMBlob;
interface nsIDOMDeviceStorage;

/* Used to set the dimensions of a captured picture,
   a preview stream, a video capture stream, etc. */
dictionary CameraSize {
    unsigned long width;
    unsigned long height;
};

/* Camera regions are used to set focus and metering areas;
   the coordinates are referenced to the sensor:
     (-1000, -1000) is the top left corner
     (1000, 1000) is the bottom left corner
   The weight of the region can range from 0 to 1000. */
dictionary CameraRegion {
    long top;
    long left;
    long bottom;
    long right;
    unsigned long weight;
};

/* The position information to record in the image header.
   'NaN' indicates the information is not available. */
dictionary CameraPosition {
    double latitude;
    double longitude;
    double altitude;
    double timestamp;
};

[scriptable, uuid(177472c9-f83d-48b5-8782-03b43b27f25d)]
interface nsICameraCapabilities : nsISupports
{
    /* an array of objects with 'height' and 'width' properties
       supported for the preview stream */
    [implicit_jscontext]
    readonly attribute jsval        previewSizes;

    /* an array of objects with 'height' and 'width' properties
       supported for picture taking */
    [implicit_jscontext]
    readonly attribute jsval        pictureSizes;

    /* an array of strings, e.g. [ "jpeg", "rgb565" ] */
    [implicit_jscontext]
    readonly attribute jsval        fileFormats;

    /* an array of strings, e.g. [ "auto", "fluorescent", etc. ] */
    [implicit_jscontext]
    readonly attribute jsval        whiteBalanceModes;

    /* an array of strings, e.g. [ "auto", "night", "beach", etc. ] */
    [implicit_jscontext]
    readonly attribute jsval        sceneModes;

    /* an array of strings, e.g. [ "normal", "sepia", "mono", etc. ] */
    [implicit_jscontext]
    readonly attribute jsval        effects;

    /* an array of strings, e.g. [ "auto", "off", "on", etc. ] */
    [implicit_jscontext]
    readonly attribute jsval        flashModes;

    /* an array of strings, e.g. [ "auto", "fixed", "macro", etc. ] */
    [implicit_jscontext]
    readonly attribute jsval        focusModes;

    /* the maximum number of focus areas supported by the camera */
    [implicit_jscontext]
    readonly attribute long         maxFocusAreas;

    /* the minimum supported exposure compensation value */
    [implicit_jscontext]
    readonly attribute double       minExposureCompensation;

    /* the maximum supported exposure compensation value */
    [implicit_jscontext]
    readonly attribute double       maxExposureCompensation;

    /* exposure compensation minimum step-size */
    [implicit_jscontext]
    readonly attribute double       stepExposureCompensation;

    /* the maximum number of metering areas supported by the camera */
    [implicit_jscontext]
    readonly attribute long         maxMeteringAreas;

    /* an array of doubles, e.g. [ 1.0, 1.2, 1.5, 2.0, 3.0, etc. ],
       or null if zooming is not supported */
    [implicit_jscontext]
    readonly attribute jsval        zoomRatios;

    /* an array of objects with 'height' and 'width' properties
       supported for video recording */
    [implicit_jscontext]
    readonly attribute jsval        videoSizes;

    /* an object with attributes for each of the supported recorder
       profiles, e.g. recorderProfiles.cif, recorderProfiles.qvga,
       etc. */
    [implicit_jscontext]
    readonly attribute jsval        recorderProfiles;
};

/* These properties affect the video recording preview, e.g.
      {
         profile: "1080p",
         rotation: 0
      }

   'profile' is one of the profiles returned by
   nsICameraCapabilities.recorderProfiles'; if this profile is missing,
   an arbitrary profile will be chosen.

   'rotation' is the degrees clockwise to rotate the preview; if
   this option is not supported, it will be ignored; if this option
   is missing, the default is 0.
*/
dictionary CameraRecorderOptions
{
    DOMString profile;
    long      rotation;
};

/* These properties affect the actual video recording, e.g.
      {
         rotation: 0,
         maxFileSizeBytes: 1024 * 1024,
         maxVideoLengthMs: 0
      }

   'rotation' is the degrees clockwise to rotate the recorded video; if
   this options is not supported, it will be ignored; if this option is
   missing, the default is 0.

   'maxFileSizeBytes' is the maximum size in bytes to which the recorded
   video file will be allowed to grow.

   'maxVideoLengthMs' is the maximum length in milliseconds to which the
   recorded video will be allowed to grow.

   if either 'maxFileSizeBytes' or 'maxVideoLengthMs' is missing, zero,
   or negative, that limit will be disabled.
*/
dictionary CameraStartRecordingOptions
{
    long      rotation;
    long long maxFileSizeBytes;
    long long maxVideoLengthMs;
};

[scriptable, function, uuid(0444a687-4bc9-462c-8246-5423f0fe46a4)]
interface nsICameraPreviewStreamCallback : nsISupports
{
    void handleEvent(in nsIDOMMediaStream stream);
};

[scriptable, function, uuid(6baa4ac7-9c25-4c48-9bb0-5193b38b9b0a)]
interface nsICameraAutoFocusCallback : nsISupports
{
    void handleEvent(in boolean success);
};

[scriptable, function, uuid(17af779e-cb6f-4ca5-890c-06468ff82e4f)]
interface nsICameraTakePictureCallback : nsISupports
{
    void handleEvent(in nsIDOMBlob picture);
};

[scriptable, function, uuid(89a762f8-581b-410a-ad86-e2bd2113ad82)]
interface nsICameraStartRecordingCallback : nsISupports
{
    void handleEvent();
};

[scriptable, function, uuid(fb80db71-e315-42f0-9ea9-dd3dd312ed70)]
interface nsICameraShutterCallback : nsISupports
{
    void handleEvent();
};

[scriptable, function, uuid(0ef0f01e-ce74-4741-9bba-54376adfb7a2)]
interface nsICameraClosedCallback : nsISupports
{
    void handleEvent();
};

[scriptable, function, uuid(550d675a-257d-4713-8b3d-0da53eba68fc)]
interface nsICameraRecorderStateChange : nsISupports
{
    void handleStateChange(in DOMString newState);
};

[scriptable, function, uuid(d1634592-43fd-4117-a2b2-419aec841cc4)]
interface nsICameraPreviewStateChange : nsISupports
{
    void handleStateChange(in DOMString newState);
};

[scriptable, function, uuid(f84d607b-554c-413d-8810-cf848642765a)]
interface nsICameraReleaseCallback : nsISupports
{
    void handleEvent();
};

[scriptable, function, uuid(a302c6c9-3776-4d1d-a395-f4105d47c3d3)]
interface nsICameraErrorCallback : nsISupports
{
    void handleEvent(in DOMString error);
};

[scriptable, function, uuid(16de7703-dc43-4766-99c5-ff30a9ab92d7)]
interface nsICameraGetCameraCallback : nsISupports
{
    void handleEvent(in nsISupports camera);
};
