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:
parent
91f7c849c3
commit
610cc49e11
BrotliBuilder/State
BrotliCalc/Helpers
BrotliImpl
BrotliLib
@ -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){
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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 + "]");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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));
|
||||
};
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
@ -0,0 +1,9 @@
|
||||
using BrotliLib.Brotli.Components.Header;
|
||||
|
||||
namespace BrotliLib.Brotli.Serialization{
|
||||
public sealed class BrotliSerializationParameters{
|
||||
public static BrotliSerializationParameters Default { get; } = new BrotliSerializationParameters();
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user