You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.2 KiB
58 lines
1.2 KiB
10 months ago
|
using System.Text;
|
||
|
|
||
|
namespace StabilityMatrix.Core.Helper.Webp;
|
||
|
|
||
|
public class WebpReader(Stream stream) : BinaryReader(stream, Encoding.ASCII, true)
|
||
|
{
|
||
|
private uint headerFileSize;
|
||
|
|
||
|
public bool GetIsAnimatedFlag()
|
||
|
{
|
||
|
ReadHeader();
|
||
|
|
||
|
while (BaseStream.Position < headerFileSize)
|
||
|
{
|
||
|
if (ReadVoidChunk() is "ANMF" or "ANIM")
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
private void ReadHeader()
|
||
|
{
|
||
|
// RIFF
|
||
|
var riff = ReadBytes(4);
|
||
|
if (!riff.SequenceEqual([.."RIFF"u8]))
|
||
|
{
|
||
|
throw new InvalidDataException("Invalid RIFF header");
|
||
|
}
|
||
|
|
||
|
// Size: uint32
|
||
|
headerFileSize = ReadUInt32();
|
||
|
|
||
|
// WEBP
|
||
|
var webp = ReadBytes(4);
|
||
|
if (!webp.SequenceEqual([.."WEBP"u8]))
|
||
|
{
|
||
|
throw new InvalidDataException("Invalid WEBP header");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Read a single chunk and discard its contents
|
||
|
private string ReadVoidChunk()
|
||
|
{
|
||
|
// FourCC: 4 bytes in ASCII
|
||
|
var result = ReadBytes(4);
|
||
|
|
||
|
// Size: uint32
|
||
|
var size = ReadUInt32();
|
||
|
|
||
|
BaseStream.Seek(size, SeekOrigin.Current);
|
||
|
|
||
|
return Encoding.ASCII.GetString(result);
|
||
|
}
|
||
|
}
|