From 461224485d948009c593add446c0d427a45ffa1a Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sat, 15 Apr 2023 21:01:37 +0200 Subject: [PATCH] Use BinaryWriter/BinaryReader to serialize Vp8Residual --- .../Formats/WebP/Vp8ResidualTests.cs | 129 ++++++++++++++++-- .../TestDataWebp/Vp8Residual.bin | Bin 15043 -> 7892 bytes 2 files changed, 117 insertions(+), 12 deletions(-) diff --git a/tests/ImageSharp.Tests/Formats/WebP/Vp8ResidualTests.cs b/tests/ImageSharp.Tests/Formats/WebP/Vp8ResidualTests.cs index 2371a179e..4982929c2 100644 --- a/tests/ImageSharp.Tests/Formats/WebP/Vp8ResidualTests.cs +++ b/tests/ImageSharp.Tests/Formats/WebP/Vp8ResidualTests.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Six Labors Split License. -using System.Runtime.Serialization.Formatters.Binary; +using System.Text; using SixLabors.ImageSharp.Formats.Webp; using SixLabors.ImageSharp.Formats.Webp.Lossy; using SixLabors.ImageSharp.Tests.TestUtilities; @@ -11,6 +11,117 @@ namespace SixLabors.ImageSharp.Tests.Formats.Webp; [Trait("Format", "Webp")] public class Vp8ResidualTests { + private static void WriteVp8Residual(string filename, Vp8Residual residual) + { + using FileStream stream = File.Open(filename, FileMode.Create); + using BinaryWriter writer = new(stream, Encoding.UTF8, false); + + writer.Write(residual.First); + writer.Write(residual.Last); + writer.Write(residual.CoeffType); + + for (int i = 0; i < residual.Coeffs.Length; i++) + { + writer.Write(residual.Coeffs[i]); + } + + for (int i = 0; i < residual.Prob.Length; i++) + { + for (int j = 0; j < residual.Prob[i].Probabilities.Length; j++) + { + writer.Write(residual.Prob[i].Probabilities[j].Probabilities); + } + } + + for (int i = 0; i < residual.Costs.Length; i++) + { + Vp8Costs costs = residual.Costs[i]; + Vp8CostArray[] costsArray = costs.Costs; + for (int j = 0; j < costsArray.Length; j++) + { + for (int k = 0; k < costsArray[j].Costs.Length; k++) + { + writer.Write(costsArray[j].Costs[k]); + } + } + } + + for (int i = 0; i < residual.Stats.Length; i++) + { + for (int j = 0; j < residual.Stats[i].Stats.Length; j++) + { + for (int k = 0; k < residual.Stats[i].Stats[j].Stats.Length; k++) + { + writer.Write(residual.Stats[i].Stats[j].Stats[k]); + } + } + } + + writer.Flush(); + } + + private static Vp8Residual ReadVp8Residual(string fileName) + { + using FileStream stream = File.Open(fileName, FileMode.Open); + using BinaryReader reader = new(stream, Encoding.UTF8, false); + + Vp8Residual residual = new() + { + First = reader.ReadInt32(), + Last = reader.ReadInt32(), + CoeffType = reader.ReadInt32() + }; + + for (int i = 0; i < residual.Coeffs.Length; i++) + { + residual.Coeffs[i] = reader.ReadInt16(); + } + + Vp8BandProbas[] bandProbas = new Vp8BandProbas[8]; + for (int i = 0; i < bandProbas.Length; i++) + { + bandProbas[i] = new Vp8BandProbas(); + for (int j = 0; j < bandProbas[i].Probabilities.Length; j++) + { + for (int k = 0; k < 11; k++) + { + bandProbas[i].Probabilities[j].Probabilities[k] = reader.ReadByte(); + } + } + } + + residual.Prob = bandProbas; + + residual.Costs = new Vp8Costs[16]; + for (int i = 0; i < residual.Costs.Length; i++) + { + residual.Costs[i] = new Vp8Costs(); + Vp8CostArray[] costsArray = residual.Costs[i].Costs; + for (int j = 0; j < costsArray.Length; j++) + { + for (int k = 0; k < costsArray[j].Costs.Length; k++) + { + costsArray[j].Costs[k] = reader.ReadUInt16(); + } + } + } + + residual.Stats = new Vp8Stats[8]; + for (int i = 0; i < residual.Stats.Length; i++) + { + residual.Stats[i] = new Vp8Stats(); + for (int j = 0; j < residual.Stats[i].Stats.Length; j++) + { + for (int k = 0; k < residual.Stats[i].Stats[j].Stats.Length; k++) + { + residual.Stats[i].Stats[j].Stats[k] = reader.ReadUInt32(); + } + } + } + + return residual; + } + [Fact] public void Vp8Residual_Serialization_Works() { @@ -27,12 +138,10 @@ public class Vp8ResidualTests } // act - BinaryFormatter formatter = new(); - using MemoryStream ms = new(); - formatter.Serialize(ms, expected); - ms.Position = 0; - object obj = formatter.Deserialize(ms); - Vp8Residual actual = (Vp8Residual)obj; + string fileName = "Vp8SerializationTest.bin"; + WriteVp8Residual(fileName, expected); + Vp8Residual actual = ReadVp8Residual(fileName); + File.Delete(fileName); // assert Assert.Equal(expected.CoeffType, actual.CoeffType); @@ -82,11 +191,7 @@ public class Vp8ResidualTests // arrange int ctx0 = 0; int expected = 20911; - byte[] data = File.ReadAllBytes(Path.Combine("TestDataWebp", "Vp8Residual.bin")); - BinaryFormatter formatter = new(); - using Stream stream = new MemoryStream(data); - object obj = formatter.Deserialize(stream); - Vp8Residual residual = (Vp8Residual)obj; + Vp8Residual residual = ReadVp8Residual(Path.Combine("TestDataWebp", "Vp8Residual.bin")); // act int actual = residual.GetResidualCost(ctx0); diff --git a/tests/ImageSharp.Tests/TestDataWebp/Vp8Residual.bin b/tests/ImageSharp.Tests/TestDataWebp/Vp8Residual.bin index d96a3c093a7e4e97708b276341d17cbad0047afc..1fbb39277626b5f71603c8170ab24aee76bd1262 100644 GIT binary patch delta 661 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