From a971625c490cdb78d4e9bf8938d82840032b35c2 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Mon, 25 Mar 2024 20:33:29 -0400 Subject: [PATCH] LibGfx/ISOBMFF: Implement UserExtensionBox .jpf (JPEG2000) files written by Photoshop contain a whole bunch of these boxes. fileformats.archiveteam.org/wiki/Boxes/atoms_format lists a few UUID types. Of those 3, these are in Photoshop-written .jpf files: * 0537cdab-9d0c-4431-a72a-fa561f2a113e Exif * 2c4c0100-8504-40b9-a03e-562148d6dfeb Photoshop Image Resource * be7acfcb-97a9-42e8-9c71-999491e3afac XMP --- .../LibGfx/ImageFormats/ISOBMFF/Boxes.cpp | 24 +++++++++++++++++++ .../LibGfx/ImageFormats/ISOBMFF/Boxes.h | 7 ++++++ .../LibGfx/ImageFormats/ISOBMFF/Reader.cpp | 2 ++ 3 files changed, 33 insertions(+) diff --git a/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Boxes.cpp b/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Boxes.cpp index 3658dd9b085..af8c916a59d 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Boxes.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Boxes.cpp @@ -120,4 +120,28 @@ void SuperBox::dump(String const& prepend) const child_box->dump(indented_prepend); } +ErrorOr UserExtensionBox::read_from_stream(BoxStream& stream) +{ + // unsigned int(8)[16] uuid; + TRY(stream.read_until_filled(uuid)); + // unsigned int(8) data[]; + data = TRY(ByteBuffer::create_uninitialized(stream.remaining())); + TRY(stream.read_until_filled(data)); + return {}; +} + +void UserExtensionBox::dump(String const& prepend) const +{ + Box::dump(prepend); + + auto indented_prepend = add_indent(prepend); + + out("{}- uuid = ", prepend); + for (auto byte : uuid) + out("{:02x}"sv, byte); + outln(); + + outln("{}- data = [ {} bytes ]", prepend, data.size()); +} + } diff --git a/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Boxes.h b/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Boxes.h index ea3935764e9..d909e1fddb1 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Boxes.h +++ b/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Boxes.h @@ -106,4 +106,11 @@ private: BoxList m_child_boxes; }; +struct UserExtensionBox final : public Box { + BOX_SUBTYPE(UserExtensionBox); + + Array uuid; + ByteBuffer data; +}; + } diff --git a/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Reader.cpp b/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Reader.cpp index e5466d45d6e..aa7fabba964 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Reader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/ISOBMFF/Reader.cpp @@ -35,6 +35,8 @@ ErrorOr Reader::read_entire_file() return TRY(JPEG2000SignatureBox::create_from_stream(stream)); case BoxType::JPEG2000UUIDInfoBox: return TRY(JPEG2000UUIDInfoBox::create_from_stream(stream)); + case BoxType::UserExtensionBox: + return TRY(UserExtensionBox::create_from_stream(stream)); default: return OptionalNone {}; }