/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 * 
 *  http://aws.amazon.com/apache2.0
 * 
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
/*
 * Do not modify this file. This file is generated from the medialive-2017-10-14.normal.json service model.
 */
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Text;
using System.IO;
using System.Net;
using Amazon.Runtime;
using Amazon.Runtime.Internal;
namespace Amazon.MediaLive.Model
{
    /// 
    /// H265 Settings
    /// 
    public partial class H265Settings
    {
        private H265AdaptiveQuantization _adaptiveQuantization;
        private AfdSignaling _afdSignaling;
        private H265AlternativeTransferFunction _alternativeTransferFunction;
        private int? _bitrate;
        private int? _bufSize;
        private H265ColorMetadata _colorMetadata;
        private H265ColorSpaceSettings _colorSpaceSettings;
        private H265FilterSettings _filterSettings;
        private FixedAfd _fixedAfd;
        private H265FlickerAq _flickerAq;
        private int? _framerateDenominator;
        private int? _framerateNumerator;
        private int? _gopClosedCadence;
        private double? _gopSize;
        private H265GopSizeUnits _gopSizeUnits;
        private H265Level _level;
        private H265LookAheadRateControl _lookAheadRateControl;
        private int? _maxBitrate;
        private int? _minIInterval;
        private int? _parDenominator;
        private int? _parNumerator;
        private H265Profile _profile;
        private int? _qvbrQualityLevel;
        private H265RateControlMode _rateControlMode;
        private H265ScanType _scanType;
        private H265SceneChangeDetect _sceneChangeDetect;
        private int? _slices;
        private H265Tier _tier;
        private TimecodeBurninSettings _timecodeBurninSettings;
        private H265TimecodeInsertionBehavior _timecodeInsertion;
        /// 
        /// Gets and sets the property AdaptiveQuantization. Adaptive quantization. Allows intra-frame
        /// quantizers to vary to improve visual quality.
        /// 
        public H265AdaptiveQuantization AdaptiveQuantization
        {
            get { return this._adaptiveQuantization; }
            set { this._adaptiveQuantization = value; }
        }
        // Check to see if AdaptiveQuantization property is set
        internal bool IsSetAdaptiveQuantization()
        {
            return this._adaptiveQuantization != null;
        }
        /// 
        /// Gets and sets the property AfdSignaling. Indicates that AFD values will be written
        /// into the output stream.  If afdSignaling is "auto", the system will try to preserve
        /// the input AFD value (in cases where multiple AFD values are valid). If set to "fixed",
        /// the AFD value will be the value configured in the fixedAfd parameter.
        /// 
        public AfdSignaling AfdSignaling
        {
            get { return this._afdSignaling; }
            set { this._afdSignaling = value; }
        }
        // Check to see if AfdSignaling property is set
        internal bool IsSetAfdSignaling()
        {
            return this._afdSignaling != null;
        }
        /// 
        /// Gets and sets the property AlternativeTransferFunction. Whether or not EML should
        /// insert an Alternative Transfer Function SEI message to support backwards compatibility
        /// with non-HDR decoders and displays.
        /// 
        public H265AlternativeTransferFunction AlternativeTransferFunction
        {
            get { return this._alternativeTransferFunction; }
            set { this._alternativeTransferFunction = value; }
        }
        // Check to see if AlternativeTransferFunction property is set
        internal bool IsSetAlternativeTransferFunction()
        {
            return this._alternativeTransferFunction != null;
        }
        /// 
        /// Gets and sets the property Bitrate. Average bitrate in bits/second. Required when
        /// the rate control mode is VBR or CBR. Not used for QVBR. In an MS Smooth output group,
        /// each output must have a unique value when its bitrate is rounded down to the nearest
        /// multiple of 1000.
        /// 
        [AWSProperty(Min=100000, Max=40000000)]
        public int Bitrate
        {
            get { return this._bitrate.GetValueOrDefault(); }
            set { this._bitrate = value; }
        }
        // Check to see if Bitrate property is set
        internal bool IsSetBitrate()
        {
            return this._bitrate.HasValue; 
        }
        /// 
        /// Gets and sets the property BufSize. Size of buffer (HRD buffer model) in bits.
        /// 
        [AWSProperty(Min=100000, Max=80000000)]
        public int BufSize
        {
            get { return this._bufSize.GetValueOrDefault(); }
            set { this._bufSize = value; }
        }
        // Check to see if BufSize property is set
        internal bool IsSetBufSize()
        {
            return this._bufSize.HasValue; 
        }
        /// 
        /// Gets and sets the property ColorMetadata. Includes colorspace metadata in the output.
        /// 
        public H265ColorMetadata ColorMetadata
        {
            get { return this._colorMetadata; }
            set { this._colorMetadata = value; }
        }
        // Check to see if ColorMetadata property is set
        internal bool IsSetColorMetadata()
        {
            return this._colorMetadata != null;
        }
        /// 
        /// Gets and sets the property ColorSpaceSettings. Color Space settings
        /// 
        public H265ColorSpaceSettings ColorSpaceSettings
        {
            get { return this._colorSpaceSettings; }
            set { this._colorSpaceSettings = value; }
        }
        // Check to see if ColorSpaceSettings property is set
        internal bool IsSetColorSpaceSettings()
        {
            return this._colorSpaceSettings != null;
        }
        /// 
        /// Gets and sets the property FilterSettings. Optional filters that you can apply to
        /// an encode.
        /// 
        public H265FilterSettings FilterSettings
        {
            get { return this._filterSettings; }
            set { this._filterSettings = value; }
        }
        // Check to see if FilterSettings property is set
        internal bool IsSetFilterSettings()
        {
            return this._filterSettings != null;
        }
        /// 
        /// Gets and sets the property FixedAfd. Four bit AFD value to write on all frames of
        /// video in the output stream. Only valid when afdSignaling is set to 'Fixed'.
        /// 
        public FixedAfd FixedAfd
        {
            get { return this._fixedAfd; }
            set { this._fixedAfd = value; }
        }
        // Check to see if FixedAfd property is set
        internal bool IsSetFixedAfd()
        {
            return this._fixedAfd != null;
        }
        /// 
        /// Gets and sets the property FlickerAq. If set to enabled, adjust quantization within
        /// each frame to reduce flicker or 'pop' on I-frames.
        /// 
        public H265FlickerAq FlickerAq
        {
            get { return this._flickerAq; }
            set { this._flickerAq = value; }
        }
        // Check to see if FlickerAq property is set
        internal bool IsSetFlickerAq()
        {
            return this._flickerAq != null;
        }
        /// 
        /// Gets and sets the property FramerateDenominator. Framerate denominator.
        /// 
        [AWSProperty(Required=true, Min=1, Max=3003)]
        public int FramerateDenominator
        {
            get { return this._framerateDenominator.GetValueOrDefault(); }
            set { this._framerateDenominator = value; }
        }
        // Check to see if FramerateDenominator property is set
        internal bool IsSetFramerateDenominator()
        {
            return this._framerateDenominator.HasValue; 
        }
        /// 
        /// Gets and sets the property FramerateNumerator. Framerate numerator - framerate is
        /// a fraction, e.g. 24000 / 1001 = 23.976 fps.
        /// 
        [AWSProperty(Required=true, Min=1)]
        public int FramerateNumerator
        {
            get { return this._framerateNumerator.GetValueOrDefault(); }
            set { this._framerateNumerator = value; }
        }
        // Check to see if FramerateNumerator property is set
        internal bool IsSetFramerateNumerator()
        {
            return this._framerateNumerator.HasValue; 
        }
        /// 
        /// Gets and sets the property GopClosedCadence. Frequency of closed GOPs. In streaming
        /// applications, it is recommended that this be set to 1 so a decoder joining mid-stream
        /// will receive an IDR frame as quickly as possible. Setting this value to 0 will break
        /// output segmenting.
        /// 
        [AWSProperty(Min=0)]
        public int GopClosedCadence
        {
            get { return this._gopClosedCadence.GetValueOrDefault(); }
            set { this._gopClosedCadence = value; }
        }
        // Check to see if GopClosedCadence property is set
        internal bool IsSetGopClosedCadence()
        {
            return this._gopClosedCadence.HasValue; 
        }
        /// 
        /// Gets and sets the property GopSize. GOP size (keyframe interval) in units of either
        /// frames or seconds per gopSizeUnits.If gopSizeUnits is frames, gopSize must be an integer
        /// and must be greater than or equal to 1.If gopSizeUnits is seconds, gopSize must be
        /// greater than 0, but need not be an integer.
        /// 
        public double GopSize
        {
            get { return this._gopSize.GetValueOrDefault(); }
            set { this._gopSize = value; }
        }
        // Check to see if GopSize property is set
        internal bool IsSetGopSize()
        {
            return this._gopSize.HasValue; 
        }
        /// 
        /// Gets and sets the property GopSizeUnits. Indicates if the gopSize is specified in
        /// frames or seconds. If seconds the system will convert the gopSize into a frame count
        /// at run time.
        /// 
        public H265GopSizeUnits GopSizeUnits
        {
            get { return this._gopSizeUnits; }
            set { this._gopSizeUnits = value; }
        }
        // Check to see if GopSizeUnits property is set
        internal bool IsSetGopSizeUnits()
        {
            return this._gopSizeUnits != null;
        }
        /// 
        /// Gets and sets the property Level. H.265 Level.
        /// 
        public H265Level Level
        {
            get { return this._level; }
            set { this._level = value; }
        }
        // Check to see if Level property is set
        internal bool IsSetLevel()
        {
            return this._level != null;
        }
        /// 
        /// Gets and sets the property LookAheadRateControl. Amount of lookahead. A value of low
        /// can decrease latency and memory usage, while high can produce better quality for certain
        /// content.
        /// 
        public H265LookAheadRateControl LookAheadRateControl
        {
            get { return this._lookAheadRateControl; }
            set { this._lookAheadRateControl = value; }
        }
        // Check to see if LookAheadRateControl property is set
        internal bool IsSetLookAheadRateControl()
        {
            return this._lookAheadRateControl != null;
        }
        /// 
        /// Gets and sets the property MaxBitrate. For QVBR: See the tooltip for Quality level
        /// 
        [AWSProperty(Min=100000, Max=40000000)]
        public int MaxBitrate
        {
            get { return this._maxBitrate.GetValueOrDefault(); }
            set { this._maxBitrate = value; }
        }
        // Check to see if MaxBitrate property is set
        internal bool IsSetMaxBitrate()
        {
            return this._maxBitrate.HasValue; 
        }
        /// 
        /// Gets and sets the property MinIInterval. Only meaningful if sceneChangeDetect is set
        /// to enabled.  Defaults to 5 if multiplex rate control is used.  Enforces separation
        /// between repeated (cadence) I-frames and I-frames inserted by Scene Change Detection.
        /// If a scene change I-frame is within I-interval frames of a cadence I-frame, the GOP
        /// is shrunk and/or stretched to the scene change I-frame. GOP stretch requires enabling
        /// lookahead as well as setting I-interval. The normal cadence resumes for the next GOP.
        /// Note: Maximum GOP stretch = GOP size + Min-I-interval - 1
        /// 
        [AWSProperty(Min=0, Max=30)]
        public int MinIInterval
        {
            get { return this._minIInterval.GetValueOrDefault(); }
            set { this._minIInterval = value; }
        }
        // Check to see if MinIInterval property is set
        internal bool IsSetMinIInterval()
        {
            return this._minIInterval.HasValue; 
        }
        /// 
        /// Gets and sets the property ParDenominator. Pixel Aspect Ratio denominator.
        /// 
        [AWSProperty(Min=1)]
        public int ParDenominator
        {
            get { return this._parDenominator.GetValueOrDefault(); }
            set { this._parDenominator = value; }
        }
        // Check to see if ParDenominator property is set
        internal bool IsSetParDenominator()
        {
            return this._parDenominator.HasValue; 
        }
        /// 
        /// Gets and sets the property ParNumerator. Pixel Aspect Ratio numerator.
        /// 
        [AWSProperty(Min=1)]
        public int ParNumerator
        {
            get { return this._parNumerator.GetValueOrDefault(); }
            set { this._parNumerator = value; }
        }
        // Check to see if ParNumerator property is set
        internal bool IsSetParNumerator()
        {
            return this._parNumerator.HasValue; 
        }
        /// 
        /// Gets and sets the property Profile. H.265 Profile.
        /// 
        public H265Profile Profile
        {
            get { return this._profile; }
            set { this._profile = value; }
        }
        // Check to see if Profile property is set
        internal bool IsSetProfile()
        {
            return this._profile != null;
        }
        /// 
        /// Gets and sets the property QvbrQualityLevel. Controls the target quality for the video
        /// encode. Applies only when the rate control mode is QVBR. Set values for the QVBR quality
        /// level field and Max bitrate field that suit your most important viewing devices. Recommended
        /// values are:- Primary screen: Quality level: 8 to 10. Max bitrate: 4M- PC or tablet:
        /// Quality level: 7. Max bitrate: 1.5M to 3M- Smartphone: Quality level: 6. Max bitrate:
        /// 1M to 1.5M
        /// 
        [AWSProperty(Min=1, Max=10)]
        public int QvbrQualityLevel
        {
            get { return this._qvbrQualityLevel.GetValueOrDefault(); }
            set { this._qvbrQualityLevel = value; }
        }
        // Check to see if QvbrQualityLevel property is set
        internal bool IsSetQvbrQualityLevel()
        {
            return this._qvbrQualityLevel.HasValue; 
        }
        /// 
        /// Gets and sets the property RateControlMode. Rate control mode.QVBR: Quality will match
        /// the specified quality level except when it is constrained by themaximum bitrate. 
        /// Recommended if you or your viewers pay for bandwidth.CBR: Quality varies, depending
        /// on the video complexity. Recommended only if you distributeyour assets to devices
        /// that cannot handle variable bitrates.Multiplex: This rate control mode is only supported
        /// (and is required) when the video is beingdelivered to a MediaLive Multiplex in which
        /// case the rate control configuration is controlledby the properties within the Multiplex
        /// Program.
        /// 
        public H265RateControlMode RateControlMode
        {
            get { return this._rateControlMode; }
            set { this._rateControlMode = value; }
        }
        // Check to see if RateControlMode property is set
        internal bool IsSetRateControlMode()
        {
            return this._rateControlMode != null;
        }
        /// 
        /// Gets and sets the property ScanType. Sets the scan type of the output to progressive
        /// or top-field-first interlaced.
        /// 
        public H265ScanType ScanType
        {
            get { return this._scanType; }
            set { this._scanType = value; }
        }
        // Check to see if ScanType property is set
        internal bool IsSetScanType()
        {
            return this._scanType != null;
        }
        /// 
        /// Gets and sets the property SceneChangeDetect. Scene change detection.
        /// 
        public H265SceneChangeDetect SceneChangeDetect
        {
            get { return this._sceneChangeDetect; }
            set { this._sceneChangeDetect = value; }
        }
        // Check to see if SceneChangeDetect property is set
        internal bool IsSetSceneChangeDetect()
        {
            return this._sceneChangeDetect != null;
        }
        /// 
        /// Gets and sets the property Slices. Number of slices per picture. Must be less than
        /// or equal to the number of macroblock rows for progressive pictures, and less than
        /// or equal to half the number of macroblock rows for interlaced pictures.This field
        /// is optional; when no value is specified the encoder will choose the number of slices
        /// based on encode resolution.
        /// 
        [AWSProperty(Min=1, Max=16)]
        public int Slices
        {
            get { return this._slices.GetValueOrDefault(); }
            set { this._slices = value; }
        }
        // Check to see if Slices property is set
        internal bool IsSetSlices()
        {
            return this._slices.HasValue; 
        }
        /// 
        /// Gets and sets the property Tier. H.265 Tier.
        /// 
        public H265Tier Tier
        {
            get { return this._tier; }
            set { this._tier = value; }
        }
        // Check to see if Tier property is set
        internal bool IsSetTier()
        {
            return this._tier != null;
        }
        /// 
        /// Gets and sets the property TimecodeBurninSettings. Timecode burn-in settings
        /// 
        public TimecodeBurninSettings TimecodeBurninSettings
        {
            get { return this._timecodeBurninSettings; }
            set { this._timecodeBurninSettings = value; }
        }
        // Check to see if TimecodeBurninSettings property is set
        internal bool IsSetTimecodeBurninSettings()
        {
            return this._timecodeBurninSettings != null;
        }
        /// 
        /// Gets and sets the property TimecodeInsertion. Determines how timecodes should be inserted
        /// into the video elementary stream.- 'disabled': Do not include timecodes- 'picTimingSei':
        /// Pass through picture timing SEI messages from the source specified in Timecode Config
        /// 
        public H265TimecodeInsertionBehavior TimecodeInsertion
        {
            get { return this._timecodeInsertion; }
            set { this._timecodeInsertion = value; }
        }
        // Check to see if TimecodeInsertion property is set
        internal bool IsSetTimecodeInsertion()
        {
            return this._timecodeInsertion != null;
        }
    }
}