/*
    Copyright (c) 2011 flixmonk. (http://DVDSwarm.codeplex.com)
    All Rights Reserved.
        
    Redistribution and use in source and binary forms, with or without modification,
    are permitted provided that the following conditions are met:
        
    * Redistributions of source code must retain the above copyright notice, this list
      of conditions and the following disclaimer.
        
    * 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. 
        
    * Neither the name of The Flixmonk nor the names of its contributors may be used to
    endorse or promote products derived from this software without specific prior written
    permission.
        
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT OWNER OR 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.
*/
namespace DVDSwarm.Tools.X264
{
    #region Enumerations

    /// <summary>
    /// x264 level enumerations which specify a set of constraints indicating a degree of required
    /// decoder performance for a profile.
    /// </summary>
    public enum DecoderLevel
    {
        /// <summary>
        /// Auto detect the level.
        /// </summary>
        Auto = 0,
        /// <summary>
        /// Level 1.0 decoder performance required.
        /// </summary>
        Level_1_0 = 1,
        /// <summary>
        /// Level 1.1 decoder performance required.
        /// </summary>
        Level_1_1 = 2,
        /// <summary>
        /// Level 1.2 decoder performance required.
        /// </summary>
        Level_1_2 = 3,
        /// <summary>
        /// Level 1.3 decoder performance required.
        /// </summary>
        Level_1_3 = 4,
        /// <summary>
        /// Level 2.0 decoder performance required.
        /// </summary>
        Level_2_0 = 5,
        /// <summary>
        /// Level 2.1 decoder performance required.
        /// </summary>
        Level_2_1 = 6,
        /// <summary>
        /// Level 2.2 decoder performance required.
        /// </summary>
        Level_2_2 = 7,
        /// <summary>
        /// Level 3.0 decoder performance required.
        /// </summary>
        Level_3_0 = 8,
        /// <summary>
        /// Level 3.1 decoder performance required.
        /// </summary>
        Level_3_1 = 9,
        /// <summary>
        /// Level 3.2 decoder performance required.
        /// </summary>
        Level_3_2 = 10,
        /// <summary>
        /// Level 4.0 decoder performance required.
        /// </summary>
        Level_4_0 = 11,
        /// <summary>
        /// Level 4.1 decoder performance required.
        /// </summary>
        Level_4_1 = 12,
        /// <summary>
        /// Level 4.2 decoder performance required.
        /// </summary>
        Level_4_2 = 13,
        /// <summary>
        /// Level 5.0 decoder performance required.
        /// </summary>
        Level_5_0 = 14,
        /// <summary>
        /// Level 5.1 decoder performance required.
        /// </summary>
        Level_5_1 = 15
    }

    /// <summary>
    /// x264 encoder efficiency enumerations which specify the trade off between compression efficiency and
    /// encoding time with slower equaling better compression.
    /// </summary>
    public enum EncoderEfficiency
    {
        /// <summary>
        /// The encoder efficiency is set to ultra fast.
        /// </summary>
        UltraFast = 1,
        /// <summary>
        /// The encoder efficiency is set to super fast.
        /// </summary>
        SuperFast = 2,
        /// <summary>
        /// The encoder efficiency is set to very fast.
        /// </summary>
        VeryFast = 3,
        /// <summary>
        /// The encoder efficiency is set to faster.
        /// </summary>
        Faster = 4,
        /// <summary>
        /// The encoder efficiency is set to fast.
        /// </summary>
        Fast = 5,
        /// <summary>
        /// The encoder efficiency is set to medium.
        /// </summary>
        Medium = 6,
        /// <summary>
        /// The encoder efficiency is set to slow.
        /// </summary>
        Slow = 7,
        /// <summary>
        /// The encoder efficiency is set to slower.
        /// </summary>
        Slower = 8,
        /// <summary>
        /// The encoder efficiency is set to very slow.
        /// </summary>
        VerySlow = 9,
        /// <summary>
        /// The encoder efficiency is set to slowest.
        /// </summary>
        Placebo = 10,
        /// <summary>
        /// The encoder efficiency is set to the default value.
        /// </summary>
        Default = Medium
    }

    /// <summary>
    /// x264 tuning enumerations based upon the input content type.
    /// </summary>
    public enum InputTuning
    {
        /// <summary>
        /// No tuning set.
        /// </summary>
        None = 0,
        /// <summary>
        /// Tuned for animation.
        /// </summary>
        Animation = 1,
        /// <summary>
        /// Tuned for fast decoding.
        /// </summary>
        FastDecode = 2,
        /// <summary>
        /// Tuned for film.
        /// </summary>
        Film = 3,
        /// <summary>
        /// Tuned for grain retention.
        /// </summary>
        Grain = 4,
        /// <summary>
        /// Tuned for peak signal-to-noise ratio.
        /// </summary>
        Psnr = 5,
        /// <summary>
        /// Tuned for structural simularity.
        /// </summary>
        Ssim = 6,
        /// <summary>
        /// Tuned for still images.
        /// </summary>
        StillImage = 7,
        /// <summary>
        /// Tuned for touhou.
        /// </summary>
        TouHou = 8,
        /// <summary>
        /// Tuned for zero latency.
        /// </summary>
        ZeroLatency = 9
    }

    /// <summary>
    /// x264 profile enumerations used to limit the output profile of the video. 'None' should be used
    /// unless the playback device has limited capabilities and requires 'Baseline' or 'Main' profile.
    /// </summary>
    public enum OutputProfile
    {
        /// <summary>
        /// The profile is not set.
        /// </summary>
        None = 0,
        /// <summary>
        /// The profile is set to Baseline.
        /// </summary>
        Baseline = 1,
        /// <summary>
        /// The profile is set to Main.
        /// </summary>
        Main = 2,
        /// <summary>
        /// The profile is set to High.
        /// </summary>
        High = 3
    }

    #endregion
}
