/*
 * Copyright (C) 2016 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

[
    Conditional=MEDIA_STREAM,
    JSGenerateToJSObject,
] dictionary MediaTrackConstraints : MediaTrackConstraintSet {
    sequence<MediaTrackConstraintSet> advanced;
};

[
    Conditional=MEDIA_STREAM,
    JSGenerateToJSObject,
    ImplementedAs=MediaTrackConstraintSet
] dictionary MediaTrackConstraintSet {
    ConstrainLong width;
    ConstrainLong height;
    ConstrainDouble aspectRatio;
    ConstrainDouble frameRate;
    ConstrainDOMString facingMode;
    ConstrainDouble volume;
    ConstrainLong sampleRate;
    ConstrainLong sampleSize;
    ConstrainBoolean echoCancellation;
    // FIXME 169871: add latency
    // FIXME 169871: add channelCount
    ConstrainDOMString deviceId;
    ConstrainDOMString groupId;
    ConstrainDOMString displaySurface;
    ConstrainBoolean logicalSurface;

};

typedef (double or ConstrainDoubleRange) ConstrainDouble;
typedef (long or ConstrainLongRange) ConstrainLong;
typedef (boolean or ConstrainBooleanParameters) ConstrainBoolean;
typedef (DOMString or sequence<DOMString> or ConstrainDOMStringParameters) ConstrainDOMString;

[
    Conditional=MEDIA_STREAM,
    JSGenerateToJSObject,
    ImplementedAs=ConstrainBooleanParameters
] dictionary ConstrainBooleanParameters {
    boolean exact;
    boolean ideal;
};

[
    Conditional=MEDIA_STREAM,
    JSGenerateToJSObject,
    ImplementedAs=ConstrainDOMStringParameters
] dictionary ConstrainDOMStringParameters {
    (DOMString or sequence<DOMString>) exact;
    (DOMString or sequence<DOMString>) ideal;
};

[
    Conditional=MEDIA_STREAM,
    JSGenerateToJSObject,
    ImplementedAs=ConstrainDoubleRange
] dictionary ConstrainDoubleRange : DoubleRange {
    double exact;
    double ideal;
};

[
    Conditional=MEDIA_STREAM,
    JSGenerateToJSObject,
    ImplementedAs=ConstrainLongRange
] dictionary ConstrainLongRange : LongRange {
    long exact;
    long ideal;
};
