/*
 * 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 mediaconvert-2017-08-29.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.MediaConvert.Model
{
    /// 
    /// Settings related to your CMAF output package. For more information, see https://docs.aws.amazon.com/mediaconvert/latest/ug/outputs-file-ABR.html.
    /// 
    public partial class CmafGroupSettings
    {
        private List _additionalManifests = new List();
        private string _baseUrl;
        private CmafClientCache _clientCache;
        private CmafCodecSpecification _codecSpecification;
        private DashManifestStyle _dashManifestStyle;
        private string _destination;
        private DestinationSettings _destinationSettings;
        private CmafEncryptionSettings _encryption;
        private int? _fragmentLength;
        private CmafImageBasedTrickPlay _imageBasedTrickPlay;
        private CmafImageBasedTrickPlaySettings _imageBasedTrickPlaySettings;
        private CmafManifestCompression _manifestCompression;
        private CmafManifestDurationFormat _manifestDurationFormat;
        private int? _minBufferTime;
        private double? _minFinalSegmentLength;
        private CmafMpdManifestBandwidthType _mpdManifestBandwidthType;
        private CmafMpdProfile _mpdProfile;
        private CmafPtsOffsetHandlingForBFrames _ptsOffsetHandlingForBFrames;
        private CmafSegmentControl _segmentControl;
        private int? _segmentLength;
        private CmafSegmentLengthControl _segmentLengthControl;
        private CmafStreamInfResolution _streamInfResolution;
        private CmafTargetDurationCompatibilityMode _targetDurationCompatibilityMode;
        private CmafVideoCompositionOffsets _videoCompositionOffsets;
        private CmafWriteDASHManifest _writeDashManifest;
        private CmafWriteHLSManifest _writeHlsManifest;
        private CmafWriteSegmentTimelineInRepresentation _writeSegmentTimelineInRepresentation;
        /// 
        /// Gets and sets the property AdditionalManifests. By default, the service creates one
        /// top-level .m3u8 HLS manifest and one top -level .mpd DASH manifest for each CMAF output
        /// group in your job. These default manifests reference every output in the output group.
        /// To create additional top-level manifests that reference a subset of the outputs in
        /// the output group, specify a list of them here. For each additional manifest that you
        /// specify, the service creates one HLS manifest and one DASH manifest.
        /// 
        public List AdditionalManifests
        {
            get { return this._additionalManifests; }
            set { this._additionalManifests = value; }
        }
        // Check to see if AdditionalManifests property is set
        internal bool IsSetAdditionalManifests()
        {
            return this._additionalManifests != null && this._additionalManifests.Count > 0; 
        }
        /// 
        /// Gets and sets the property BaseUrl. A partial URI prefix that will be put in the manifest
        /// file at the top level BaseURL element. Can be used if streams are delivered from a
        /// different URL than the manifest file.
        /// 
        public string BaseUrl
        {
            get { return this._baseUrl; }
            set { this._baseUrl = value; }
        }
        // Check to see if BaseUrl property is set
        internal bool IsSetBaseUrl()
        {
            return this._baseUrl != null;
        }
        /// 
        /// Gets and sets the property ClientCache. Disable this setting only when your workflow
        /// requires the #EXT-X-ALLOW-CACHE:no tag. Otherwise, keep the default value Enabled
        /// and control caching in your video distribution set up. For example, use the Cache-Control
        /// http header.
        /// 
        public CmafClientCache ClientCache
        {
            get { return this._clientCache; }
            set { this._clientCache = value; }
        }
        // Check to see if ClientCache property is set
        internal bool IsSetClientCache()
        {
            return this._clientCache != null;
        }
        /// 
        /// Gets and sets the property CodecSpecification. Specification to use (RFC-6381 or the
        /// default RFC-4281) during m3u8 playlist generation.
        /// 
        public CmafCodecSpecification CodecSpecification
        {
            get { return this._codecSpecification; }
            set { this._codecSpecification = value; }
        }
        // Check to see if CodecSpecification property is set
        internal bool IsSetCodecSpecification()
        {
            return this._codecSpecification != null;
        }
        /// 
        /// Gets and sets the property DashManifestStyle. Specify how MediaConvert writes SegmentTimeline
        /// in your output DASH manifest. To write a SegmentTimeline in each video Representation:
        /// Keep the default value, Basic. To write a common SegmentTimeline in the video AdaptationSet:
        /// Choose Compact. Note that MediaConvert will still write a SegmentTimeline in any Representation
        /// that does not share a common timeline. To write a video AdaptationSet for each different
        /// output framerate, and a common SegmentTimeline in each AdaptationSet: Choose Distinct.
        /// 
        public DashManifestStyle DashManifestStyle
        {
            get { return this._dashManifestStyle; }
            set { this._dashManifestStyle = value; }
        }
        // Check to see if DashManifestStyle property is set
        internal bool IsSetDashManifestStyle()
        {
            return this._dashManifestStyle != null;
        }
        /// 
        /// Gets and sets the property Destination. Use Destination to specify the S3 output location
        /// and the output filename base. Destination accepts format identifiers. If you do not
        /// specify the base filename in the URI, the service will use the filename of the input
        /// file. If your job has multiple inputs, the service uses the filename of the first
        /// input file.
        /// 
        public string Destination
        {
            get { return this._destination; }
            set { this._destination = value; }
        }
        // Check to see if Destination property is set
        internal bool IsSetDestination()
        {
            return this._destination != null;
        }
        /// 
        /// Gets and sets the property DestinationSettings. Settings associated with the destination.
        /// Will vary based on the type of destination
        /// 
        public DestinationSettings DestinationSettings
        {
            get { return this._destinationSettings; }
            set { this._destinationSettings = value; }
        }
        // Check to see if DestinationSettings property is set
        internal bool IsSetDestinationSettings()
        {
            return this._destinationSettings != null;
        }
        /// 
        /// Gets and sets the property Encryption. DRM settings.
        /// 
        public CmafEncryptionSettings Encryption
        {
            get { return this._encryption; }
            set { this._encryption = value; }
        }
        // Check to see if Encryption property is set
        internal bool IsSetEncryption()
        {
            return this._encryption != null;
        }
        /// 
        /// Gets and sets the property FragmentLength. Specify the length, in whole seconds, of
        /// the mp4 fragments. When you don't specify a value, MediaConvert defaults to 2. Related
        /// setting: Use Fragment length control to specify whether the encoder enforces this
        /// value strictly.
        /// 
        [AWSProperty(Min=1, Max=2147483647)]
        public int FragmentLength
        {
            get { return this._fragmentLength.GetValueOrDefault(); }
            set { this._fragmentLength = value; }
        }
        // Check to see if FragmentLength property is set
        internal bool IsSetFragmentLength()
        {
            return this._fragmentLength.HasValue; 
        }
        /// 
        /// Gets and sets the property ImageBasedTrickPlay. Specify whether MediaConvert generates
        /// images for trick play. Keep the default value, None, to not generate any images. Choose
        /// Thumbnail to generate tiled thumbnails. Choose Thumbnail and full frame to generate
        /// tiled thumbnails and full-resolution images of single frames. When you enable Write
        /// HLS manifest, MediaConvert creates a child manifest for each set of images that you
        /// generate and adds corresponding entries to the parent manifest. When you enable Write
        /// DASH manifest, MediaConvert adds an entry in the .mpd manifest for each set of images
        /// that you generate. A common application for these images is Roku trick mode. The thumbnails
        /// and full-frame images that MediaConvert creates with this feature are compatible with
        /// this Roku specification: https://developer.roku.com/docs/developer-program/media-playback/trick-mode/hls-and-dash.md
        /// 
        public CmafImageBasedTrickPlay ImageBasedTrickPlay
        {
            get { return this._imageBasedTrickPlay; }
            set { this._imageBasedTrickPlay = value; }
        }
        // Check to see if ImageBasedTrickPlay property is set
        internal bool IsSetImageBasedTrickPlay()
        {
            return this._imageBasedTrickPlay != null;
        }
        /// 
        /// Gets and sets the property ImageBasedTrickPlaySettings. Tile and thumbnail settings
        /// applicable when imageBasedTrickPlay is ADVANCED
        /// 
        public CmafImageBasedTrickPlaySettings ImageBasedTrickPlaySettings
        {
            get { return this._imageBasedTrickPlaySettings; }
            set { this._imageBasedTrickPlaySettings = value; }
        }
        // Check to see if ImageBasedTrickPlaySettings property is set
        internal bool IsSetImageBasedTrickPlaySettings()
        {
            return this._imageBasedTrickPlaySettings != null;
        }
        /// 
        /// Gets and sets the property ManifestCompression. When set to GZIP, compresses HLS playlist.
        /// 
        public CmafManifestCompression ManifestCompression
        {
            get { return this._manifestCompression; }
            set { this._manifestCompression = value; }
        }
        // Check to see if ManifestCompression property is set
        internal bool IsSetManifestCompression()
        {
            return this._manifestCompression != null;
        }
        /// 
        /// Gets and sets the property ManifestDurationFormat. Indicates whether the output manifest
        /// should use floating point values for segment duration.
        /// 
        public CmafManifestDurationFormat ManifestDurationFormat
        {
            get { return this._manifestDurationFormat; }
            set { this._manifestDurationFormat = value; }
        }
        // Check to see if ManifestDurationFormat property is set
        internal bool IsSetManifestDurationFormat()
        {
            return this._manifestDurationFormat != null;
        }
        /// 
        /// Gets and sets the property MinBufferTime. Minimum time of initially buffered media
        /// that is needed to ensure smooth playout.
        /// 
        [AWSProperty(Min=0, Max=2147483647)]
        public int MinBufferTime
        {
            get { return this._minBufferTime.GetValueOrDefault(); }
            set { this._minBufferTime = value; }
        }
        // Check to see if MinBufferTime property is set
        internal bool IsSetMinBufferTime()
        {
            return this._minBufferTime.HasValue; 
        }
        /// 
        /// Gets and sets the property MinFinalSegmentLength. Keep this setting at the default
        /// value of 0, unless you are troubleshooting a problem with how devices play back the
        /// end of your video asset. If you know that player devices are hanging on the final
        /// segment of your video because the length of your final segment is too short, use this
        /// setting to specify a minimum final segment length, in seconds. Choose a value that
        /// is greater than or equal to 1 and less than your segment length. When you specify
        /// a value for this setting, the encoder will combine any final segment that is shorter
        /// than the length that you specify with the previous segment. For example, your segment
        /// length is 3 seconds and your final segment is .5 seconds without a minimum final segment
        /// length; when you set the minimum final segment length to 1, your final segment is
        /// 3.5 seconds.
        /// 
        public double MinFinalSegmentLength
        {
            get { return this._minFinalSegmentLength.GetValueOrDefault(); }
            set { this._minFinalSegmentLength = value; }
        }
        // Check to see if MinFinalSegmentLength property is set
        internal bool IsSetMinFinalSegmentLength()
        {
            return this._minFinalSegmentLength.HasValue; 
        }
        /// 
        /// Gets and sets the property MpdManifestBandwidthType. Specify how the value for bandwidth
        /// is determined for each video Representation in your output MPD manifest. We recommend
        /// that you choose a MPD manifest bandwidth type that is compatible with your downstream
        /// player configuration. Max: Use the same value that you specify for Max bitrate in
        /// the video output, in bits per second. Average: Use the calculated average bitrate
        /// of the encoded video output, in bits per second.
        /// 
        public CmafMpdManifestBandwidthType MpdManifestBandwidthType
        {
            get { return this._mpdManifestBandwidthType; }
            set { this._mpdManifestBandwidthType = value; }
        }
        // Check to see if MpdManifestBandwidthType property is set
        internal bool IsSetMpdManifestBandwidthType()
        {
            return this._mpdManifestBandwidthType != null;
        }
        /// 
        /// Gets and sets the property MpdProfile. Specify whether your DASH profile is on-demand
        /// or main. When you choose Main profile, the service signals urn:mpeg:dash:profile:isoff-main:2011
        /// in your .mpd DASH manifest. When you choose On-demand, the service signals urn:mpeg:dash:profile:isoff-on-demand:2011
        /// in your .mpd. When you choose On-demand, you must also set the output group setting
        /// Segment control to Single file.
        /// 
        public CmafMpdProfile MpdProfile
        {
            get { return this._mpdProfile; }
            set { this._mpdProfile = value; }
        }
        // Check to see if MpdProfile property is set
        internal bool IsSetMpdProfile()
        {
            return this._mpdProfile != null;
        }
        /// 
        /// Gets and sets the property PtsOffsetHandlingForBFrames. Use this setting only when
        /// your output video stream has B-frames, which causes the initial presentation time
        /// stamp (PTS) to be offset from the initial decode time stamp (DTS). Specify how MediaConvert
        /// handles PTS when writing time stamps in output DASH manifests. Choose Match initial
        /// PTS when you want MediaConvert to use the initial PTS as the first time stamp in the
        /// manifest. Choose Zero-based to have MediaConvert ignore the initial PTS in the video
        /// stream and instead write the initial time stamp as zero in the manifest. For outputs
        /// that don't have B-frames, the time stamps in your DASH manifests start at zero regardless
        /// of your choice here.
        /// 
        public CmafPtsOffsetHandlingForBFrames PtsOffsetHandlingForBFrames
        {
            get { return this._ptsOffsetHandlingForBFrames; }
            set { this._ptsOffsetHandlingForBFrames = value; }
        }
        // Check to see if PtsOffsetHandlingForBFrames property is set
        internal bool IsSetPtsOffsetHandlingForBFrames()
        {
            return this._ptsOffsetHandlingForBFrames != null;
        }
        /// 
        /// Gets and sets the property SegmentControl. When set to SINGLE_FILE, a single output
        /// file is generated, which is internally segmented using the Fragment Length and Segment
        /// Length. When set to SEGMENTED_FILES, separate segment files will be created.
        /// 
        public CmafSegmentControl SegmentControl
        {
            get { return this._segmentControl; }
            set { this._segmentControl = value; }
        }
        // Check to see if SegmentControl property is set
        internal bool IsSetSegmentControl()
        {
            return this._segmentControl != null;
        }
        /// 
        /// Gets and sets the property SegmentLength. Specify the length, in whole seconds, of
        /// each segment. When you don't specify a value, MediaConvert defaults to 10. Related
        /// settings: Use Segment length control to specify whether the encoder enforces this
        /// value strictly. Use Segment control to specify whether MediaConvert creates separate
        /// segment files or one content file that has metadata to mark the segment boundaries.
        /// 
        [AWSProperty(Min=1, Max=2147483647)]
        public int SegmentLength
        {
            get { return this._segmentLength.GetValueOrDefault(); }
            set { this._segmentLength = value; }
        }
        // Check to see if SegmentLength property is set
        internal bool IsSetSegmentLength()
        {
            return this._segmentLength.HasValue; 
        }
        /// 
        /// Gets and sets the property SegmentLengthControl. Specify how you want MediaConvert
        /// to determine the segment length. Choose Exact to have the encoder use the exact length
        /// that you specify with the setting Segment length. This might result in extra I-frames.
        /// Choose Multiple of GOP to have the encoder round up the segment lengths to match the
        /// next GOP boundary.
        /// 
        public CmafSegmentLengthControl SegmentLengthControl
        {
            get { return this._segmentLengthControl; }
            set { this._segmentLengthControl = value; }
        }
        // Check to see if SegmentLengthControl property is set
        internal bool IsSetSegmentLengthControl()
        {
            return this._segmentLengthControl != null;
        }
        /// 
        /// Gets and sets the property StreamInfResolution. Include or exclude RESOLUTION attribute
        /// for video in EXT-X-STREAM-INF tag of variant manifest.
        /// 
        public CmafStreamInfResolution StreamInfResolution
        {
            get { return this._streamInfResolution; }
            set { this._streamInfResolution = value; }
        }
        // Check to see if StreamInfResolution property is set
        internal bool IsSetStreamInfResolution()
        {
            return this._streamInfResolution != null;
        }
        /// 
        /// Gets and sets the property TargetDurationCompatibilityMode. When set to LEGACY, the
        /// segment target duration is always rounded up to the nearest integer value above its
        /// current value in seconds. When set to SPEC\\_COMPLIANT, the segment target duration
        /// is rounded up to the nearest integer value if fraction seconds are greater than or
        /// equal to 0.5 (>= 0.5) and rounded down if less than 0.5 (< 0.5). You may need to use
        /// LEGACY if your client needs to ensure that the target duration is always longer than
        /// the actual duration of the segment. Some older players may experience interrupted
        /// playback when the actual duration of a track in a segment is longer than the target
        /// duration.
        /// 
        public CmafTargetDurationCompatibilityMode TargetDurationCompatibilityMode
        {
            get { return this._targetDurationCompatibilityMode; }
            set { this._targetDurationCompatibilityMode = value; }
        }
        // Check to see if TargetDurationCompatibilityMode property is set
        internal bool IsSetTargetDurationCompatibilityMode()
        {
            return this._targetDurationCompatibilityMode != null;
        }
        /// 
        /// Gets and sets the property VideoCompositionOffsets. Specify the video sample composition
        /// time offset mode in the output fMP4 TRUN box. For wider player compatibility, set
        /// Video composition offsets to Unsigned or leave blank. The earliest presentation time
        /// may be greater than zero, and sample composition time offsets will increment using
        /// unsigned integers. For strict fMP4 video and audio timing, set Video composition offsets
        /// to Signed. The earliest presentation time will be equal to zero, and sample composition
        /// time offsets will increment using signed integers.
        /// 
        public CmafVideoCompositionOffsets VideoCompositionOffsets
        {
            get { return this._videoCompositionOffsets; }
            set { this._videoCompositionOffsets = value; }
        }
        // Check to see if VideoCompositionOffsets property is set
        internal bool IsSetVideoCompositionOffsets()
        {
            return this._videoCompositionOffsets != null;
        }
        /// 
        /// Gets and sets the property WriteDashManifest. When set to ENABLED, a DASH MPD manifest
        /// will be generated for this output.
        /// 
        public CmafWriteDASHManifest WriteDashManifest
        {
            get { return this._writeDashManifest; }
            set { this._writeDashManifest = value; }
        }
        // Check to see if WriteDashManifest property is set
        internal bool IsSetWriteDashManifest()
        {
            return this._writeDashManifest != null;
        }
        /// 
        /// Gets and sets the property WriteHlsManifest. When set to ENABLED, an Apple HLS manifest
        /// will be generated for this output.
        /// 
        public CmafWriteHLSManifest WriteHlsManifest
        {
            get { return this._writeHlsManifest; }
            set { this._writeHlsManifest = value; }
        }
        // Check to see if WriteHlsManifest property is set
        internal bool IsSetWriteHlsManifest()
        {
            return this._writeHlsManifest != null;
        }
        /// 
        /// Gets and sets the property WriteSegmentTimelineInRepresentation. When you enable Precise
        /// segment duration in DASH manifests, your DASH manifest shows precise segment durations.
        /// The segment duration information appears inside the SegmentTimeline element, inside
        /// SegmentTemplate at the Representation level. When this feature isn't enabled, the
        /// segment durations in your DASH manifest are approximate. The segment duration information
        /// appears in the duration attribute of the SegmentTemplate element.
        /// 
        public CmafWriteSegmentTimelineInRepresentation WriteSegmentTimelineInRepresentation
        {
            get { return this._writeSegmentTimelineInRepresentation; }
            set { this._writeSegmentTimelineInRepresentation = value; }
        }
        // Check to see if WriteSegmentTimelineInRepresentation property is set
        internal bool IsSetWriteSegmentTimelineInRepresentation()
        {
            return this._writeSegmentTimelineInRepresentation != null;
        }
    }
}