Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP Replace Jpeg Decoder #274

Merged
merged 156 commits into from
Sep 14, 2017
Merged
Show file tree
Hide file tree
Changes from 47 commits
Commits
Show all changes
156 commits
Select commit Hold shift + click to select a range
1555f09
Begin port
JimBobSquarePants Jun 16, 2017
1abe631
Fix header finder
JimBobSquarePants Jun 18, 2017
d4d74b4
Add js source link
JimBobSquarePants Jun 18, 2017
f63f85a
Use buffer
JimBobSquarePants Jun 18, 2017
2c629c7
Remove offset
JimBobSquarePants Jun 18, 2017
b025ed6
Fix progressive bool assignment
JimBobSquarePants Jun 18, 2017
3728b82
(╯°□°)╯︵ ┻━┻
JimBobSquarePants Jun 19, 2017
0ea7a6f
Can now build huffman tables
JimBobSquarePants Jun 20, 2017
a718bf8
Begin ProcessStartOfScan
JimBobSquarePants Jun 20, 2017
cd72206
Merge branch 'master' into jpeg-port
JimBobSquarePants Jun 21, 2017
1629819
Can now decode a scan
JimBobSquarePants Jun 22, 2017
8bbc63f
Begin second phase of decoding
JimBobSquarePants Jun 22, 2017
c1025a6
Impove disposal
JimBobSquarePants Jun 23, 2017
549e61f
Experiment with new file marker finder
JimBobSquarePants Jun 23, 2017
ba8a5b3
Merge branch 'master' into jpeg-port
JimBobSquarePants Jun 23, 2017
2f501eb
Decoder now doesn't break tests
JimBobSquarePants Jun 25, 2017
4a4e94d
Fix progressive decoding
JimBobSquarePants Jun 25, 2017
472d6ba
baseline decode works progressive nearly
JimBobSquarePants Jun 26, 2017
28a8aca
Fix progressive scan decoding
JimBobSquarePants Jun 26, 2017
ca9bd35
Can now decode many images
JimBobSquarePants Jun 27, 2017
69c15e3
Merge branch 'master' into jpeg-port
JimBobSquarePants Jun 27, 2017
59c0793
Can now decode that bad progressive image
JimBobSquarePants Jun 28, 2017
827ca83
Now decodes all images
JimBobSquarePants Jun 28, 2017
e2d26eb
Fix #159
JimBobSquarePants Jun 28, 2017
76e91db
use an offset span instead of buffer
tocsoft Jun 28, 2017
db2b712
additional usages of Span
tocsoft Jun 28, 2017
5439240
fixed Sandbox46 execution
antonfirsov Jun 28, 2017
ea0abc9
Rough working better Huffman
JimBobSquarePants Jun 29, 2017
0f60242
Better Huffman decoding
JimBobSquarePants Jun 29, 2017
0323d00
Almost got Huffman LUT working
JimBobSquarePants Jun 30, 2017
a360614
Better Huffman indexing.
JimBobSquarePants Jun 30, 2017
2703e22
Merge branch 'master' into jpeg-port
JimBobSquarePants Jun 30, 2017
8241314
Getting close with that lookup now.
JimBobSquarePants Jul 1, 2017
2c64ed6
Fix build
JimBobSquarePants Jul 1, 2017
2b4abd2
introduced CoreCompat.SystemDrawing as reference utility for tests, i…
antonfirsov Jul 1, 2017
7d12830
ReferencePngDecoder
antonfirsov Jul 1, 2017
f026778
migrate to a Image.Generate/Image.Mutate context api
tocsoft Jul 1, 2017
24433e9
ReferenceOutput + ResizeTests prototype
antonfirsov Jul 2, 2017
1e8f899
Merge branch 'master' into jpeg-port
JimBobSquarePants Jul 2, 2017
5086b08
Use properties
JimBobSquarePants Jul 2, 2017
290646a
store scale as vector + remove unneeded bit or operations
tocsoft Jul 2, 2017
456e139
fix demo
tocsoft Jul 4, 2017
88e30a0
fix apply processors to frames
tocsoft Jul 4, 2017
a61fcc9
Rename Generate -> Clone
tocsoft Jul 5, 2017
09d8fac
refactor
antonfirsov Jul 5, 2017
738fc20
Add WIP faster IDCT method
JimBobSquarePants Jul 6, 2017
9ff1b56
This works. High allocations though
JimBobSquarePants Jul 9, 2017
8c22c11
A little cleanup
JimBobSquarePants Jul 9, 2017
a236a80
Simplify indexing
JimBobSquarePants Jul 9, 2017
1cd137d
Reduce allocations
JimBobSquarePants Jul 9, 2017
0ff77ec
Move check into if statement
JimBobSquarePants Jul 9, 2017
996da79
Fix tests
JimBobSquarePants Jul 10, 2017
215345e
Merge branch 'master' into jpeg-port
JimBobSquarePants Jul 10, 2017
3272518
Fix broken EXIF test
JimBobSquarePants Jul 10, 2017
ae6d91a
Fix ImageMetaData test
JimBobSquarePants Jul 10, 2017
001e3ca
Fix stack overflow
tocsoft Jul 10, 2017
b4fbf17
merge with master
tocsoft Jul 11, 2017
4d931e6
more benchmarks
antonfirsov Jul 11, 2017
961e202
initail image operations tests
tocsoft Jul 11, 2017
c3f7f83
move methods
tocsoft Jul 11, 2017
ccee50b
Merge branch 'tocsoft/mutate-api' of https://github.com/JimBobSquareP…
tocsoft Jul 11, 2017
f7cbb27
test extensions methods
tocsoft Jul 11, 2017
04b6ad8
fix warnings
tocsoft Jul 11, 2017
c12f993
fix sandbox test
tocsoft Jul 11, 2017
6270568
blank to force rebuild
tocsoft Jul 12, 2017
ab30013
Renameing classes + simplifying Image<TPixel>
tocsoft Jul 14, 2017
9b86525
fix some comments
tocsoft Jul 15, 2017
cb165fa
Merge remote-tracking branch 'origin/master' into tocsoft/mutate-api
tocsoft Jul 15, 2017
41cadf9
fix broken tests
tocsoft Jul 15, 2017
c421e6d
Cloneing Image Processor
tocsoft Jul 15, 2017
7635558
internalise cloning processor + rename context
tocsoft Jul 16, 2017
3e23313
made FormatsDirectory a lazy value -> folders are no longer walked in…
antonfirsov Jul 17, 2017
d9fb5bd
clean up TestFile.cs
antonfirsov Jul 17, 2017
7d932dc
Merge branch 'master' into tocsoft/mutate-api
tocsoft Jul 17, 2017
06271fa
Fix spelling errors
JimBobSquarePants Jul 18, 2017
e824a1b
Merge remote-tracking branch 'origin/master' into tocsoft/mutate-api
tocsoft Jul 18, 2017
2af76f6
refactored GetFormatsDirectory() to GetInputImagesDirectoryFullPath()
antonfirsov Jul 21, 2017
7eca259
always DebugSave() png-s
antonfirsov Jul 21, 2017
70892a1
Cleanup + Rename Run to Apply
JimBobSquarePants Jul 26, 2017
0136a6c
ResizeTests working with CalliphoraPartial.png
antonfirsov Jul 28, 2017
fe874b6
Merge remote-tracking branch 'origin/master' into antonfirsov/qa-lab
antonfirsov Aug 13, 2017
572db70
build fix + clean up ImageDataAttributeBase code duplication
antonfirsov Aug 13, 2017
3251941
use TestPatternImages in ResizeTests
antonfirsov Aug 13, 2017
5dff018
moving input test images into ./tests/TestImages/Input
antonfirsov Aug 13, 2017
e170f80
update .gitignore to match the new test output directory
antonfirsov Aug 13, 2017
f53a788
test utility refactors
antonfirsov Aug 13, 2017
5fb4461
Merge remote-tracking branch 'origin/tocsoft/mutate-api' into antonfi…
antonfirsov Aug 13, 2017
355a4ac
re-apply DebugSave() changes after merging mutate-api
antonfirsov Aug 14, 2017
9c5798b
Intellisense docs cleanup
JimBobSquarePants Aug 14, 2017
d855c6e
reduced resize output by 75%
antonfirsov Aug 14, 2017
f357f31
moving images again
antonfirsov Aug 14, 2017
15a7b5a
Merge branch 'master' into tocsoft/mutate-api
JimBobSquarePants Aug 14, 2017
f8a0ed3
Update rotate test to use new API
JimBobSquarePants Aug 14, 2017
cd2e0a1
optimized ResizeTests output further, added Bike.png
antonfirsov Aug 15, 2017
0e06480
optimized DetectEdgesTest
antonfirsov Aug 15, 2017
de964e5
added comments, docs + a CloneAndConvertToAvatarWithoutApply() example
antonfirsov Aug 15, 2017
9245631
fix typo
antonfirsov Aug 15, 2017
81ee6d0
smaller Bike.png, optimized RotateTests & RotateFlipTests
antonfirsov Aug 15, 2017
e01cc2b
docs & formatting
antonfirsov Aug 15, 2017
a00aec7
ImageComparer refactors, ExactComparer
antonfirsov Aug 15, 2017
0b0ba13
implemented ExactImageComparer
antonfirsov Aug 15, 2017
619ad53
changed ImageComparer design again
antonfirsov Aug 15, 2017
d9238a5
implemented TolerantImageComparer
antonfirsov Aug 15, 2017
f9cd6b6
replaced old comparer everywhere
antonfirsov Aug 15, 2017
8d091b5
looks like ApplyOilPaintFilterInBox() is failing with a very good reason
antonfirsov Aug 15, 2017
105d445
PixelTypes bugfix + polishing ResizeTests
antonfirsov Aug 15, 2017
985ed92
added submodule as "External"
antonfirsov Aug 15, 2017
fe79f4a
TestImageExtensionsTests + TolerantImageComparer bugfix + update subm…
antonfirsov Aug 15, 2017
2b292d4
ResizeTests use CompareToReferenceOutput now!
antonfirsov Aug 15, 2017
747aa7f
JpegDecoderTests using reference images
antonfirsov Aug 16, 2017
2c8e29c
copied pdfjs classes from the jpeg-port branch
antonfirsov Aug 16, 2017
692c4f7
prefixed every ported class with PdfJs... to avoid naming conflicts
antonfirsov Aug 16, 2017
0a80231
shut up StyleStalin, I'm working! :P
antonfirsov Aug 16, 2017
85f880d
so what's the deal with submodule branches?
antonfirsov Aug 16, 2017
f460c2a
maybe this?
antonfirsov Aug 16, 2017
a5c901f
now what?
antonfirsov Aug 16, 2017
febe9c6
TestImageProvider can use custom decoder now
antonfirsov Aug 16, 2017
cd3f391
TestImageProvider can use custom decoder now
antonfirsov Aug 16, 2017
59705ee
introducing the "doNotAppendPixelType" feature
antonfirsov Aug 16, 2017
a284598
CompareToReferenceOutput() no longer triggers DebugSave(). Need to be…
antonfirsov Aug 16, 2017
55d814c
with 'appendPixelTypeToFileName: false' there is no need to duplicate…
antonfirsov Aug 16, 2017
9af66a6
Merge remote-tracking branch 'origin/antonfirsov/qa-lab' into jpeg-lab
antonfirsov Aug 16, 2017
48f3fde
comparing decoders
antonfirsov Aug 16, 2017
94c60cb
inital rename packages and namespaces
tocsoft Aug 16, 2017
3653f1f
fix some tests and updated packages
tocsoft Aug 16, 2017
fbe9d25
add missing stylecop.json
tocsoft Aug 16, 2017
8f53b5b
tweek codecov cmd file
tocsoft Aug 16, 2017
58281ef
Use more accurate IDCT for now
JimBobSquarePants Aug 16, 2017
f5b9a8c
Use more accurate IDCT
JimBobSquarePants Aug 16, 2017
9da4345
.
antonfirsov Aug 17, 2017
2d80a6f
Merge branch 'jpeg-lab' of https://github.com/JimBobSquarePants/Image…
antonfirsov Aug 17, 2017
9be5ba0
skip tests in build on CI server as they are ran from CodeCoverage.cmd
tocsoft Aug 17, 2017
9a4d048
publish both packages
tocsoft Aug 17, 2017
c9db035
ensure local running of build scripts runs tests from correct build
tocsoft Aug 17, 2017
4c8ba59
fix broken test
tocsoft Aug 17, 2017
4f38761
Fix skew
JimBobSquarePants Aug 18, 2017
84852a8
good by GenericFactory!
antonfirsov Aug 18, 2017
1562e32
Using Corecompat.System.Drawing as reference encoder/decoder for PNG.…
antonfirsov Aug 18, 2017
02eb5f2
PngDecoder is covered now, and proven to be buggy :P
antonfirsov Aug 18, 2017
1df0010
covered DetectEdges
antonfirsov Aug 18, 2017
f6904d9
Merge remote-tracking branch 'origin/antonfirsov/qa-lab' into jpeg-lab
antonfirsov Aug 18, 2017
a103cb8
TestImageProvider.FileProvider cache is now aware of decoder parameters
antonfirsov Aug 18, 2017
a798d5a
Merge remote-tracking branch 'origin/antonfirsov/qa-lab' into jpeg-lab
antonfirsov Aug 18, 2017
385ed88
provider.GetImage(new JpegDecoder())
antonfirsov Aug 18, 2017
c4953b0
let's merge jpeg-port to have the changelog!
antonfirsov Aug 18, 2017
1959c4a
Merge remote-tracking branch 'origin/jpeg-port' into jpeg-lab
antonfirsov Aug 18, 2017
7383124
grouping files for decoders
antonfirsov Aug 18, 2017
4676d8a
moving a few more files
antonfirsov Aug 18, 2017
b6d4f35
GolangPort namespaces following folder structure
antonfirsov Aug 18, 2017
1c75403
move Block8x8F into ImageSharp.Formats.Jpeg.Common
antonfirsov Aug 18, 2017
80380d9
adjust PdfJsPort namespaces
antonfirsov Aug 18, 2017
51b430b
prefixing GolangPort stuff with Old*** #Round1
antonfirsov Aug 18, 2017
493deda
renaming is hard
antonfirsov Aug 18, 2017
b3b4827
introduced OldJpegDecoder : IImageDecoder for the GolangPort decoder
antonfirsov Aug 18, 2017
9b34d09
Merge pull request #297 from SixLabors/tocsoft/sixlabors_rename
JimBobSquarePants Aug 19, 2017
0baf7d0
Merge branch 'tocsoft/mutate-api' into jpeg-port
JimBobSquarePants Aug 19, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion ImageSharp.sln
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{7CC6
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AvatarWithRoundedCorner", "samples\AvatarWithRoundedCorner\AvatarWithRoundedCorner.csproj", "{844FC582-4E78-4371-847D-EFD4D1103578}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChangeDefaultEncoderOptions", "samples\ChangeDefaultEncoderOptions\ChangeDefaultEncoderOptions.csproj", "{07EE511D-4BAB-4323-BAFC-3AF2BF9366F0}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChangeDefaultEncoderOptions", "samples\ChangeDefaultEncoderOptions\ChangeDefaultEncoderOptions.csproj", "{07EE511D-4BAB-4323-BAFC-3AF2BF9366F0}"
EndProject
Global
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Expand Down
48 changes: 48 additions & 0 deletions src/ImageSharp/Common/Extensions/ListExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// <copyright file="ListExtensions.cs" company="James Jackson-South">
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think I'm using any of this anymore. It can go.

// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>

namespace ImageSharp.Common.Extensions
{
using System.Collections.Generic;

/// <summary>
/// Encapsulates a series of time saving extension methods to the <see cref="T:System.Collections.Generic.List"/> class.
/// </summary>
internal static class ListExtensions
{
/// <summary>
/// Inserts an item at the given index automatically expanding the capacity if required.
/// </summary>
/// <typeparam name="T">The type of object within the list</typeparam>
/// <param name="list">The list</param>
/// <param name="index">The index</param>
/// <param name="item">The item to insert</param>
public static void SafeInsert<T>(this List<T> list, int index, T item)
{
if (index >= list.Count)
{
list.Add(item);
}
else
{
list[index] = item;
}
}

/// <summary>
/// Removes the last element from a list and returns that element. This method changes the length of the list.
/// </summary>
/// <typeparam name="T">The type of object within the list</typeparam>
/// <param name="list">The list</param>
/// <returns>The last element in the specified sequence.</returns>
public static T Pop<T>(this List<T> list)
{
int last = list.Count - 1;
T item = list[last];
list.RemoveAt(last);
return item;
}
}
}
2 changes: 1 addition & 1 deletion src/ImageSharp/Common/Extensions/StreamExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public static void Skip(this Stream stream, int count)

if (stream.CanSeek)
{
stream.Position += count;
stream.Seek(count, SeekOrigin.Current); // Position += count;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is supposedly faster

}
else
{
Expand Down
7 changes: 3 additions & 4 deletions src/ImageSharp/Formats/Jpeg/JpegDecoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@

namespace ImageSharp.Formats
{
using System;
using System.Collections.Generic;
using System.IO;

using ImageSharp.PixelFormats;
Expand All @@ -27,10 +25,11 @@ public Image<TPixel> Decode<TPixel>(Configuration configuration, Stream stream)
{
Guard.NotNull(stream, "stream");

using (JpegDecoderCore decoder = new JpegDecoderCore(configuration, this))
// using (var decoder = new JpegDecoderCore(configuration, this))
using (var decoder = new Jpeg.Port.JpegDecoderCore(configuration, this))
{
return decoder.Decode<TPixel>(stream);
}
}
}
}
}
74 changes: 74 additions & 0 deletions src/ImageSharp/Formats/Jpeg/Port/Components/Adobe.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// <copyright file="Adobe.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>

// ReSharper disable InconsistentNaming
namespace ImageSharp.Formats.Jpeg.Port.Components
{
using System;

/// <summary>
/// Provides information about the Adobe marker segment
/// </summary>
internal struct Adobe : IEquatable<Adobe>
{
/// <summary>
/// The DCT Encode Version
/// </summary>
public short DCTEncodeVersion;

/// <summary>
/// 0x0 : (none)
/// Bit 15 : Encoded with Blend=1 downsampling
/// </summary>
public short APP14Flags0;

/// <summary>
/// 0x0 : (none)
/// </summary>
public short APP14Flags1;

/// <summary>
/// Determines the colorspace transform
/// 00 : Unknown (RGB or CMYK)
/// 01 : YCbCr
/// 02 : YCCK
/// </summary>
public byte ColorTransform;

/// <inheritdoc/>
public bool Equals(Adobe other)
{
return this.DCTEncodeVersion == other.DCTEncodeVersion
&& this.APP14Flags0 == other.APP14Flags0
&& this.APP14Flags1 == other.APP14Flags1
&& this.ColorTransform == other.ColorTransform;
}

/// <inheritdoc/>
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}

return obj is Adobe && this.Equals((Adobe)obj);
}

/// <inheritdoc/>
public override int GetHashCode()
{
unchecked
{
// TODO: Merge and use HashCodeHelpers
int hashCode = this.DCTEncodeVersion.GetHashCode();
hashCode = (hashCode * 397) ^ this.APP14Flags0.GetHashCode();
hashCode = (hashCode * 397) ^ this.APP14Flags1.GetHashCode();
hashCode = (hashCode * 397) ^ this.ColorTransform.GetHashCode();
return hashCode;
}
}
}
}
44 changes: 44 additions & 0 deletions src/ImageSharp/Formats/Jpeg/Port/Components/Component.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// <copyright file="Component.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>

namespace ImageSharp.Formats.Jpeg.Port.Components
{
using System;
using System.Numerics;
using ImageSharp.Memory;

/// <summary>
/// Represents a component block
/// </summary>
internal struct Component : IDisposable
{
/// <summary>
/// Gets or sets the output
/// </summary>
public Buffer<short> Output;

/// <summary>
/// Gets or sets the scaling factors
/// </summary>
public Vector2 Scale;

/// <summary>
/// Gets or sets the number of blocks per line
/// </summary>
public int BlocksPerLine;

/// <summary>
/// Gets or sets the number of blocks per column
/// </summary>
public int BlocksPerColumn;

/// <inheritdoc/>
public void Dispose()
{
this.Output?.Dispose();
this.Output = null;
}
}
}
34 changes: 34 additions & 0 deletions src/ImageSharp/Formats/Jpeg/Port/Components/ComponentBlocks.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// <copyright file="Components.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>

namespace ImageSharp.Formats.Jpeg.Port.Components
{
using System;

/// <summary>
/// Contains all the decoded component blocks
/// </summary>
internal sealed class ComponentBlocks : IDisposable
{
/// <summary>
/// Gets or sets the component blocks
/// </summary>
public Component[] Components { get; set; }

/// <inheritdoc/>
public void Dispose()
{
if (this.Components != null)
{
for (int i = 0; i < this.Components.Length; i++)
{
this.Components[i].Dispose();
}

this.Components = null;
}
}
}
}
59 changes: 59 additions & 0 deletions src/ImageSharp/Formats/Jpeg/Port/Components/FileMarker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// <copyright file="HuffmanTables.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>

namespace ImageSharp.Formats.Jpeg.Port.Components
{
/// <summary>
/// Represents a jpeg file marker
/// </summary>
internal struct FileMarker
{
/// <summary>
/// Initializes a new instance of the <see cref="FileMarker"/> struct.
/// </summary>
/// <param name="marker">The marker</param>
/// <param name="position">The position within the stream</param>
public FileMarker(ushort marker, long position)
{
this.Marker = marker;
this.Position = position;
this.Invalid = false;
}

/// <summary>
/// Initializes a new instance of the <see cref="FileMarker"/> struct.
/// </summary>
/// <param name="marker">The marker</param>
/// <param name="position">The position within the stream</param>
/// <param name="invalid">Whether the current marker is invalid</param>
public FileMarker(ushort marker, long position, bool invalid)
{
this.Marker = marker;
this.Position = position;
this.Invalid = invalid;
}

/// <summary>
/// Gets or sets a value indicating whether the current marker is invalid
/// </summary>
public bool Invalid { get; set; }

/// <summary>
/// Gets the position of the marker within a stream
/// </summary>
public ushort Marker { get; }

/// <summary>
/// Gets the position of the marker within a stream
/// </summary>
public long Position { get; }

/// <inheritdoc/>
public override string ToString()
{
return this.Marker.ToString("X");
}
}
}
Loading