/// <summary> /// Checks a collection of x264Settings and modifies them if needed to fit within the level constraints. /// </summary> /// <param name="level">the level to enforce</param> /// <param name="inputSettings">the collection of x264Settings to check</param> /// <param name="frameSize">the size of the decoded video frame in bytes</param> /// <returns>A compliant set of x264Settings</returns> public x264Settings EnforceSettings(int level, x264Settings inputSettings, double frameSize, out AVCLevelEnforcementReturn enforcement) { x264Settings enforcedSettings = (x264Settings)inputSettings.Clone(); enforcement = new AVCLevelEnforcementReturn(); enforcement.Altered = false; enforcement.EnableP4x4mv = true; enforcement.EnableVBVBufferSize = true; enforcement.EnableVBVMaxRate = true; enforcement.Panic = false; enforcement.PanicString = ""; if (!checkP4x4(level, inputSettings)) { enforcement.Altered = true; enforcedSettings.P4x4mv = false; } if (checkP4x4Enabled(level, inputSettings)) { enforcement.EnableP4x4mv = true; } else { enforcement.EnableP4x4mv = false; } // step through various options to enforce the max decoded picture buffer size while (!this.checkMaxDPB(level, enforcedSettings, frameSize)) { if (enforcedSettings.BFramePyramid) { enforcement.Altered = true; enforcedSettings.BFramePyramid = false; // try turning off pyramid first } else if (enforcedSettings.NbRefFrames > 1) { enforcement.Altered = true; enforcedSettings.NbRefFrames -= 1; // try reducing the number of reference frames } else if (enforcedSettings.NbBframes > 0) { enforcement.Altered = true; enforcedSettings.NbBframes = 0; // try turning off B frames } else { enforcement.Panic = true; enforcement.PanicString = "Can't force settings to conform to level (the frame size is too large)"; // reset output settings to original and set level to unrestrained enforcedSettings = (x264Settings)inputSettings.Clone(); enforcedSettings.Level = 15; return(enforcedSettings); } } // Disallow independent specification of MaxBitrate and MaxBufferSize unless Unrestrained if (level < 15) { enforcement.EnableVBVMaxRate = false; enforcedSettings.VBVMaxBitrate = -1; enforcement.EnableVBVBufferSize = false; enforcedSettings.VBVBufferSize = -1; } else { enforcement.EnableVBVMaxRate = true; enforcement.EnableVBVBufferSize = true; } return(enforcedSettings); }
/// <summary> /// Checks a collection of x264Settings and modifies them if needed to fit within the level constraints. /// </summary> /// <param name="level">the level to enforce</param> /// <param name="inputSettings">the collection of x264Settings to check</param> /// <param name="frameSize">the size of the decoded video frame in bytes</param> /// <returns>A compliant set of x264Settings</returns> public x264Settings EnforceSettings(int level, x264Settings inputSettings, double frameSize, out AVCLevelEnforcementReturn enforcement) { x264Settings enforcedSettings = (x264Settings) inputSettings.Clone(); enforcement = new AVCLevelEnforcementReturn(); enforcement.Altered = false; enforcement.EnableP4x4mv = true; enforcement.EnableVBVBufferSize = true; enforcement.EnableVBVMaxRate = true; enforcement.Panic = false; enforcement.PanicString = ""; if (!checkP4x4(level, inputSettings)) { enforcement.Altered = true; enforcedSettings.P4x4mv = false; } if (checkP4x4Enabled(level, inputSettings)) enforcement.EnableP4x4mv = true; else enforcement.EnableP4x4mv = false; // step through various options to enforce the max decoded picture buffer size while (!this.checkMaxDPB(level,enforcedSettings, frameSize)) { if (enforcedSettings.NbRefFrames > 1) { enforcement.Altered = true; enforcedSettings.NbRefFrames -= 1; // try reducing the number of reference frames } else { enforcement.Panic = true; enforcement.PanicString = "Can't force settings to conform to level (the frame size is too large)"; // reset output settings to original and set level to unrestrained enforcedSettings = (x264Settings)inputSettings.Clone(); enforcedSettings.Level = 15; return enforcedSettings; } } // Disallow independent specification of MaxBitrate and MaxBufferSize unless Unrestrained if (level < 15) { enforcement.EnableVBVMaxRate = false; enforcedSettings.VBVMaxBitrate = -1; enforcement.EnableVBVBufferSize = false; enforcedSettings.VBVBufferSize = -1; } else { enforcement.EnableVBVMaxRate = true; enforcement.EnableVBVBufferSize = true; } return enforcedSettings; }