protected override (MetaBlock, BrotliGlobalState) Transform(MetaBlock.Compressed original, BrotliGlobalState state, BrotliCompressionParameters parameters) { var builder = new CompressedMetaBlockBuilder(original, state) { LiteralCtxMap = ContextMapBuilder.Literals.Simple, DistanceCtxMap = ContextMapBuilder.Distances.Simple }; foreach (var category in Categories.LID) { builder.BlockTypes[category].Reset(); } builder.UseSameLiteralContextMode(LiteralContextMode.UTF8); var tracker = new MetaBlockSizeTracker(state); tracker.Test(builder, parameters); foreach (var category in Categories.LID) { TestBlockSplits(builder, parameters, tracker, category); } tracker.Test(original); return(tracker.Smallest ?? throw new InvalidOperationException("Transformation did not generate any meta-blocks.")); }
protected override (MetaBlock, BrotliGlobalState) Transform(MetaBlock.Compressed original, BrotliGlobalState state, BrotliCompressionParameters parameters) { return(new CompressedMetaBlockBuilder(original, state) { DistanceParameters = DistanceParameters.Zero }.Build(parameters)); }
public BuildCompressedMetaBlock(MetaBlock.Compressed metaBlock) { InitializeComponent(); var blocks = new CategoryMap <BlockSwitchTrackerCustom>(category => new BlockSwitchTrackerCustom(metaBlock, category, allItems)); var data = metaBlock.Data; foreach (var command in data.InsertCopyCommands) { blocks[Category.InsertCopy].Advance(); for (int literal = 0; literal < command.Literals.Count; literal++) { blocks[Category.Literal].Advance(); } if (command.CopyDistance.HasExplicitDistanceCode()) { blocks[Category.Distance].Advance(); } allItems.Add(new InsertCopyCommandItem(command, allItems.Count + 1)); } SuspendLayout(); checkBoxInsertCopy.Text = $"Insert&&Copy ({data.InsertCopyCommands.Count})"; checkBoxBlockSwitchL.Text = $"Block-Switch/L ({data.BlockSwitchCommands[Category.Literal].Count})"; checkBoxBlockSwitchI.Text = $"Block-Switch/I ({data.BlockSwitchCommands[Category.InsertCopy].Count})"; checkBoxBlockSwitchD.Text = $"Block-Switch/D ({data.BlockSwitchCommands[Category.Distance].Count})"; RefreshItems(); ResumeLayout(true); }
protected override (MetaBlock, BrotliGlobalState) Transform(MetaBlock.Compressed original, BrotliGlobalState state, BrotliCompressionParameters parameters) { var uncompressed = new BrotliOutputStored(); state.AddOutputCallback(uncompressed); original.Decompress(state); state.RemoveOutputCallback(uncompressed); return(new MetaBlock.Uncompressed(uncompressed.AsBytes), state); }
public CompressedMetaBlockBuilder(MetaBlock.Compressed metaBlock, BrotliGlobalState state) : this(state){ var header = metaBlock.Header; var data = metaBlock.Data; this.BlockTypes = header.BlockTypes.Select(info => new BlockSwitchBuilder(info, data.BlockSwitchCommands[info.Category])); this.DistanceParameters = header.DistanceParameters; this.LiteralContextModes = header.LiteralCtxModes.ToArray(); this.LiteralCtxMap = header.LiteralCtxMap; this.DistanceCtxMap = header.DistanceCtxMap; foreach (InsertCopyCommand command in data.InsertCopyCommands) { AddInsertCopyCommand(command); } }
protected override (MetaBlock, BrotliGlobalState) Transform(MetaBlock.Compressed original, BrotliGlobalState state, BrotliCompressionParameters parameters) { var builder = new CompressedMetaBlockBuilder(original, state) { LiteralCtxMap = ContextMapBuilder.Literals.Simple, DistanceCtxMap = ContextMapBuilder.Distances.Simple }; foreach (var category in Categories.LID) { builder.BlockTypes[category].Reset(); } return(builder.UseSameLiteralContextMode(LiteralContextMode.LSB6).Build(parameters)); }
protected override (MetaBlock, BrotliGlobalState) Transform(MetaBlock.Compressed original, BrotliGlobalState state, BrotliCompressionParameters parameters) { if (original.Data.InsertCopyCommands.Count <= 1 || original.Data.BlockSwitchCommands[Category.InsertCopy].Count > 0) { return(original, state); } var builder = new CompressedMetaBlockBuilder(original, state); var icBlocks = builder.BlockTypes[Category.InsertCopy]; var icCommands = builder.GetTotalBlockLength(Category.InsertCopy); icBlocks.SetInitialLength(icCommands / 2) .AddFinalBlock(1); return(builder.Build(parameters)); }
protected override (MetaBlock, BrotliGlobalState) Transform(MetaBlock.Compressed original, BrotliGlobalState state, BrotliCompressionParameters parameters) { var builder = new CompressedMetaBlockBuilder(original, state); var tracker = new MetaBlockSizeTracker(state); for (byte postfixBitCount = 0; postfixBitCount <= DistanceParameters.MaxPostfixBitCount; postfixBitCount++) { for (byte directCodeBits = 0; directCodeBits <= DistanceParameters.MaxDirectCodeBits; directCodeBits++) { builder.DistanceParameters = new DistanceParameters(postfixBitCount, directCodeBits); tracker.Test(builder, parameters, debugText: "[PostfixBitCount = " + postfixBitCount + ", DirectCodeBits = " + directCodeBits + "]"); } } return(tracker.Smallest ?? throw new InvalidOperationException("Transformation did not generate any meta-blocks.")); }
protected override (MetaBlock, BrotliGlobalState) Transform(MetaBlock.Compressed original, BrotliGlobalState state, BrotliCompressionParameters parameters) { var builder = new CompressedMetaBlockBuilder(original, state); var tracker = new MetaBlockSizeTracker(state); tracker.Test(builder, parameters); var blocker = new Blocker(parameters.DistanceCodePicker); parameters = new BrotliCompressionParameters.Builder(parameters) { DistanceCodePicker = blocker.Pick }.Build(); foreach (var code in DistanceCode.Last.Codes.Except(new DistanceCode[] { DistanceCode.Zero })) { var prev = tracker.SmallestSize; blocker.BlockedCodes.Add(code); tracker.Test(builder, parameters); if (tracker.SmallestSize < prev) { Debug.WriteLine("Blocking code " + code + " reduced size (" + prev + " > " + tracker.SmallestSize + "), keeping it..."); } else { Debug.WriteLine("Blocking code " + code + " did not improve the size, continuing..."); blocker.BlockedCodes.Remove(code); } } Debug.WriteLine("Final blocked codes: " + string.Join(", ", blocker.BlockedCodes)); return(tracker.Smallest ?? throw new InvalidOperationException("Transformation did not generate any meta-blocks.")); }
protected override (MetaBlock, BrotliGlobalState) Transform(MetaBlock.Compressed original, BrotliGlobalState state, BrotliCompressionParameters parameters) { var builder = new CompressedMetaBlockBuilder(original, state); var literals = new List <Literal>(builder.GetTotalBlockLength(Category.Literal)); var lengthCodes = new List <InsertCopyLengthCode>(builder.GetTotalBlockLength(Category.InsertCopy)); var distanceCodes = new List <DistanceCode>(builder.GetTotalBlockLength(Category.Distance)); var distanceFreq = new FrequencyList <DistanceCode>(); var validDistanceCodes = new List <DistanceCode>(5); foreach (var command in original.Data.InsertCopyCommands) { literals.AddRange(command.Literals); state.OutputLiterals(command.Literals); if (command.CopyDistance == DistanceInfo.EndsAfterLiterals) { lengthCodes.Add(command.Lengths.MakeCode(ImplicitDistanceCodeZero.PreferEnabled)); break; } if (!command.CopyDistance.FindCodes(original.Header.DistanceParameters, state, validDistanceCodes)) { lengthCodes.Add(command.Lengths.MakeCode(ImplicitDistanceCodeZero.ForceEnabled)); } else { DistanceCode distanceCode; if (command.CopyDistance == DistanceInfo.ExplicitCodeZero) { distanceCode = DistanceCode.Zero; } else { distanceCode = validDistanceCodes.Count > 1 ? parameters.DistanceCodePicker(validDistanceCodes, distanceFreq) : validDistanceCodes[0]; } distanceFreq.Add(distanceCode); distanceCodes.Add(distanceCode); lengthCodes.Add(command.Lengths.MakeCode(ImplicitDistanceCodeZero.Disable)); } } var origLitCtxMap = builder.LiteralCtxMap; if (origLitCtxMap.TreeCount == 1) { Split(builder, Category.Literal, literals, 512, 400.0); builder.UseSameLiteralContextMode(LiteralContextMode.UTF8); builder.LiteralCtxMap = new ContextMapBuilder.Literals(builder).RepeatFirstBlockType(true).Build(); } else { var literalContextMap = Enumerable.Range(0, origLitCtxMap.ContextsPerBlockType).Select(index => origLitCtxMap.DetermineTreeID(0, index)).ToArray(); var literalContextMode = builder.LiteralContextModes[0]; var literalBuffer = RingBufferFast <byte> .From(0, 0); Split(builder, Category.Literal, literals, 512, 400.0, new BlockSplitter <Literal> .ContextInfo(literalContextMap, literal => { literalBuffer.Push(literal.Value); return(literalContextMode.DetermineContextID(literalBuffer.Front, literalBuffer.Back)); })); builder.UseSameLiteralContextMode(literalContextMode); builder.LiteralCtxMap = new ContextMapBuilder.Literals(builder).Set(0, literalContextMap).RepeatFirstBlockType(true).Build(); } Split(builder, Category.InsertCopy, lengthCodes, 1024, 500.0); Split(builder, Category.Distance, distanceCodes, 512, 100.0); builder.DistanceCtxMap = new ContextMapBuilder.Distances(builder).RepeatFirstBlockType(true).Build(); return(builder.Build(parameters)); }
protected abstract (MetaBlock, BrotliGlobalState) Transform(MetaBlock.Compressed original, BrotliGlobalState state, BrotliCompressionParameters parameters);
protected sealed override IList <(MetaBlock MetaBlock, BrotliGlobalState NextState)> TransformCompressed(MetaBlock.Compressed original, BrotliGlobalState state, BrotliCompressionParameters parameters) { return(new [] { Transform(original, state, parameters) }); }
public BlockSwitchTrackerCustom(MetaBlock.Compressed metaBlock, Category category, List <object> list) : base(metaBlock.Header.BlockTypes[category]) { this.category = category; this.list = list; this.queue = new Queue <BlockSwitchCommand>(metaBlock.Data.BlockSwitchCommands[category]); }