1
0
mirror of https://github.com/chylex/Brotli-Builder.git synced 2025-04-16 00:15:42 +02:00

Add BrotliSerializationParameters

This commit is contained in:
chylex 2019-11-26 12:14:45 +01:00
parent 91f7c849c3
commit 610cc49e11
10 changed files with 52 additions and 31 deletions

View File

@ -6,11 +6,13 @@ using BrotliBuilder.Utils;
using BrotliLib.Brotli;
using BrotliLib.Brotli.Encode;
using BrotliLib.Brotli.Output;
using BrotliLib.Brotli.Serialization;
using BrotliLib.Markers;
using BrotliLib.Serialization;
namespace BrotliBuilder.State{
sealed class BrotliFileController{
public BrotliSerializationParameters SerializationParameters { get; set; } = BrotliSerializationParameters.Default;
public MarkerLevel BitMarkerLevel { get; set; } = MarkerLevel.Verbose;
public event EventHandler<StateChangedEventArgs> StateChanged;
@ -125,7 +127,7 @@ namespace BrotliBuilder.State{
private void TransformInternal(BrotliFileStructure structure, IBrotliTransformer transformer) => StartWorker(token => {
UpdateState(token, new BrotliFileState.Starting());
TryGetDecompressionState(token, structure, structure.Serialize(), out BrotliOutputStored prevOutput, out Stopwatch _);
TryGetDecompressionState(token, structure, structure.Serialize(SerializationParameters), out BrotliOutputStored prevOutput, out Stopwatch _);
if (!TryTransform(token, structure, transformer, out structure, out Stopwatch swTransform)) return;
UpdateState(token, new BrotliFileState.HasStructure(structure, swTransform));
@ -183,7 +185,7 @@ namespace BrotliBuilder.State{
private bool TrySerialize(int token, BrotliFileStructure structure, out BitStream bits, out Stopwatch stopwatch){
try{
stopwatch = Stopwatch.StartNew();
bits = structure.Serialize();
bits = structure.Serialize(SerializationParameters);
stopwatch.Stop();
return true;
}catch(Exception ex){

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using BrotliLib.Brotli;
using BrotliLib.Brotli.Serialization;
using BrotliLib.Collections;
using BrotliLib.Serialization;
@ -14,8 +15,8 @@ namespace BrotliCalc.Helpers{
this.Compressed = compressedFiles;
}
public BitStream SerializeAndValidate(BrotliFileStructure bfs){
var serialized = bfs.Serialize();
public BitStream SerializeAndValidate(BrotliFileStructure bfs, BrotliSerializationParameters parameters = null){
var serialized = bfs.Serialize(parameters);
var output = bfs.GetDecompressionState(serialized);
if (!CollectionHelper.Equal(output.AsBytes, Uncompressed.Contents)){
@ -25,8 +26,8 @@ namespace BrotliCalc.Helpers{
return serialized;
}
public int CountBytesAndValidate(BrotliFileStructure bfs){
return (7 + SerializeAndValidate(bfs).Length) / 8;
public int CountBytesAndValidate(BrotliFileStructure bfs, BrotliSerializationParameters parameters = null){
return (7 + SerializeAndValidate(bfs, parameters).Length) / 8;
}
}
}

View File

@ -3,6 +3,7 @@ using System.Diagnostics;
using BrotliLib.Brotli;
using BrotliLib.Brotli.Components;
using BrotliLib.Brotli.Encode;
using BrotliLib.Brotli.Serialization;
using BrotliLib.Serialization.Writer;
namespace BrotliImpl{
@ -16,8 +17,8 @@ namespace BrotliImpl{
this.initialState = initialState;
}
public void Test(MetaBlock tested, string debugText = null){
int testedSize = CountBits(tested, initialState.Clone());
public void Test(MetaBlock tested, BrotliSerializationParameters parameters = null, string debugText = null){
int testedSize = CountBits(tested, initialState.Clone(), parameters);
if (debugText != null){
Debug.Write(debugText + " = " + testedSize + " bits");
@ -37,15 +38,15 @@ namespace BrotliImpl{
}
}
public void Test(CompressedMetaBlockBuilder builder, string debugText = null){
Test(builder.Build().MetaBlock, debugText);
public void Test(CompressedMetaBlockBuilder builder, BrotliSerializationParameters parameters = null, string debugText = null){
Test(builder.Build().MetaBlock, parameters, debugText);
}
public static int CountBits(MetaBlock tested, BrotliGlobalState state){
public static int CountBits(MetaBlock tested, BrotliGlobalState state, BrotliSerializationParameters parameters = null){
var writer = new BitWriterNull();
try{
MetaBlock.Serialize(writer, tested, state.Clone());
MetaBlock.Serialize(writer, tested, state.Clone(), parameters ?? BrotliSerializationParameters.Default);
return writer.Length;
}catch(Exception ex){
Debug.WriteLine(ex.ToString());

View File

@ -12,7 +12,7 @@ namespace BrotliImpl.Transformers{
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, "[PostfixBitCount = " + postfixBitCount + ", DirectCodeBits = " + directCodeBits + "]");
tracker.Test(builder, debugText: "[PostfixBitCount = " + postfixBitCount + ", DirectCodeBits = " + directCodeBits + "]");
}
}

View File

@ -5,6 +5,7 @@ using BrotliLib.Brotli.Dictionary;
using BrotliLib.Brotli.Dictionary.Default;
using BrotliLib.Brotli.Encode;
using BrotliLib.Brotli.Output;
using BrotliLib.Brotli.Serialization;
using BrotliLib.Markers;
using BrotliLib.Markers.Serialization.Reader;
using BrotliLib.Serialization;
@ -47,7 +48,7 @@ namespace BrotliLib.Brotli{
this.MetaBlocks = new List<MetaBlock>();
}
public BrotliFileStructure Transform(IBrotliTransformer transformer){
public BrotliFileStructure Transform(IBrotliTransformer transformer, BrotliSerializationParameters parameters = null){
var copy = new BrotliFileStructure(Parameters);
var state = new BrotliGlobalState(Parameters, new BrotliOutputWindowed(Parameters.WindowSize));
var writer = new BitWriterNull();
@ -55,7 +56,7 @@ namespace BrotliLib.Brotli{
foreach(MetaBlock original in MetaBlocks){
foreach(MetaBlock transformed in transformer.Transform(original, state)){ // TODO figure out how to handle state
copy.MetaBlocks.Add(transformed);
MetaBlock.Serialize(writer, transformed, state);
MetaBlock.Serialize(writer, transformed, state, parameters ?? BrotliSerializationParameters.Default);
}
}
@ -69,9 +70,9 @@ namespace BrotliLib.Brotli{
}
}
public BitStream Serialize(){
public BitStream Serialize(BrotliSerializationParameters parameters = null){
BitStream stream = new BitStream();
DoSerialize(stream.GetWriter(), this, new FileContext(Parameters.Dictionary, new BrotliOutputWindowed(Parameters.WindowSize)));
DoSerialize(stream.GetWriter(), this, new FileContext(Parameters.Dictionary, new BrotliOutputWindowed(Parameters.WindowSize)), parameters ?? BrotliSerializationParameters.Default);
return stream;
}
@ -85,10 +86,6 @@ namespace BrotliLib.Brotli{
return outputState;
}
public override string ToString(){
return Serialize().ToString();
}
// Serialization
private class FileContext{
@ -127,16 +124,16 @@ namespace BrotliLib.Brotli{
return structure;
};
private static readonly BitSerializer<BrotliFileStructure, FileContext> DoSerialize = (writer, obj, context) => {
var parameters = obj.Parameters;
var windowSize = parameters.WindowSize;
private static readonly BitSerializer<BrotliFileStructure, FileContext, BrotliSerializationParameters> DoSerialize = (writer, obj, context, parameters) => {
var fileParameters = obj.Parameters;
var windowSize = fileParameters.WindowSize;
WindowSize.Serialize(writer, windowSize, NoContext.Value);
var state = new BrotliGlobalState(parameters, context.OutputState(windowSize));
var state = new BrotliGlobalState(fileParameters, context.OutputState(windowSize));
foreach(MetaBlock metaBlock in obj.MetaBlocks){
MetaBlock.Serialize(writer, metaBlock, state);
MetaBlock.Serialize(writer, metaBlock, state, parameters);
}
};
}

View File

@ -4,6 +4,7 @@ using System.Linq;
using BrotliLib.Brotli.Components.Data;
using BrotliLib.Brotli.Components.Header;
using BrotliLib.Brotli.Components.Utils;
using BrotliLib.Brotli.Serialization;
using BrotliLib.Collections;
using BrotliLib.Markers.Serialization;
using BrotliLib.Markers.Serialization.Reader;
@ -101,7 +102,7 @@ namespace BrotliLib.Brotli.Components.Compressed{
}
);
public static readonly BitSerializer<MetaBlockCompressionHeader, NoContext> Serialize = (writer, obj, context) => {
public static readonly BitSerializer<MetaBlockCompressionHeader, NoContext, BrotliSerializationParameters> Serialize = (writer, obj, context, parameters) => {
foreach(BlockTypeInfo blockTypeInfo in obj.BlockTypes.Values){
BlockTypeInfo.Serialize(writer, blockTypeInfo, NoContext.Value);
}

View File

@ -1,6 +1,7 @@
using System;
using BrotliLib.Brotli.Components.Compressed;
using BrotliLib.Brotli.Components.Header;
using BrotliLib.Brotli.Serialization;
using BrotliLib.Markers.Serialization;
using BrotliLib.Serialization;
@ -41,8 +42,8 @@ namespace BrotliLib.Brotli.Components{
}
);
internal new static readonly BitSerializer<Compressed, Context> Serialize = (writer, obj, context) => {
MetaBlockCompressionHeader.Serialize(writer, obj.Header, NoContext.Value);
internal new static readonly BitSerializer<Compressed, Context, BrotliSerializationParameters> Serialize = (writer, obj, context, parameters) => {
MetaBlockCompressionHeader.Serialize(writer, obj.Header, NoContext.Value, parameters);
MetaBlockCompressionData.Serialize(writer, obj.Data, new MetaBlockCompressionData.Context(obj.Header, context.DataLength, context.State));
};
}

View File

@ -1,5 +1,6 @@
using System;
using BrotliLib.Brotli.Components.Header;
using BrotliLib.Brotli.Serialization;
using BrotliLib.Markers.Serialization;
using BrotliLib.Serialization;
@ -71,7 +72,7 @@ namespace BrotliLib.Brotli.Components{
}
);
public static readonly BitSerializer<MetaBlock, BrotliGlobalState> Serialize = (writer, obj, context) => {
public static readonly BitSerializer<MetaBlock, BrotliGlobalState, BrotliSerializationParameters> Serialize = (writer, obj, context, parameters) => {
if (obj is LastEmpty){
writer.WriteBit(true); // ISLAST
writer.WriteBit(true); // ISLASTEMPTY
@ -109,7 +110,7 @@ namespace BrotliLib.Brotli.Components{
writer.WriteBit(false); // ISUNCOMPRESSED
}
Compressed.Serialize(writer, c, new Context(c.IsLast, c.DataLength, context));
Compressed.Serialize(writer, c, new Context(c.IsLast, c.DataLength, context), parameters);
break;
}
};

View File

@ -0,0 +1,9 @@
using BrotliLib.Brotli.Components.Header;
namespace BrotliLib.Brotli.Serialization{
public sealed class BrotliSerializationParameters{
public static BrotliSerializationParameters Default { get; } = new BrotliSerializationParameters();
}
}

View File

@ -15,4 +15,12 @@ namespace BrotliLib.Serialization{
/// <typeparam name="T">Type to convert.</typeparam>
/// <typeparam name="C">Type used to provide context.</typeparam>
public delegate void BitSerializer<T, C>(IBitWriter writer, T obj, C context);
/// <summary>
/// Provides a generic way of serializing an object into a <see cref="BitStream"/>.
/// </summary>
/// <typeparam name="T">Type to convert.</typeparam>
/// <typeparam name="C">Type used to provide context.</typeparam>
/// <typeparam name="P">Type containing additional parameters passed down the serialization chain.</typeparam>
public delegate void BitSerializer<T, C, P>(IBitWriter writer, T obj, C context, P parameters);
}