From 180bb0fc5d4d5fb8669c539c90545b76221987ab Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Wed, 2 Jul 2025 12:34:34 +0200 Subject: [PATCH] Everywhere: Remove LibRIFF --- Libraries/CMakeLists.txt | 1 - Libraries/LibGfx/CMakeLists.txt | 2 +- Libraries/LibGfx/ImageFormats/WebPWriter.cpp | 2 - Libraries/LibMedia/CMakeLists.txt | 2 +- Libraries/LibRIFF/CMakeLists.txt | 6 - Libraries/LibRIFF/ChunkID.h | 71 ---------- Libraries/LibRIFF/Decoding.cpp | 28 ---- Libraries/LibRIFF/Details.cpp | 125 ------------------ Libraries/LibRIFF/Details.h | 74 ----------- Libraries/LibRIFF/IFF.h | 24 ---- Libraries/LibRIFF/RIFF.h | 35 ----- Meta/gn/secondary/Ladybird/BUILD.gn | 2 - .../Userland/Libraries/LibGfx/BUILD.gn | 1 - .../Userland/Libraries/LibMedia/BUILD.gn | 1 - .../Userland/Libraries/LibRIFF/BUILD.gn | 16 --- 15 files changed, 2 insertions(+), 388 deletions(-) delete mode 100644 Libraries/LibRIFF/CMakeLists.txt delete mode 100644 Libraries/LibRIFF/ChunkID.h delete mode 100644 Libraries/LibRIFF/Decoding.cpp delete mode 100644 Libraries/LibRIFF/Details.cpp delete mode 100644 Libraries/LibRIFF/Details.h delete mode 100644 Libraries/LibRIFF/IFF.h delete mode 100644 Libraries/LibRIFF/RIFF.h delete mode 100644 Meta/gn/secondary/Userland/Libraries/LibRIFF/BUILD.gn diff --git a/Libraries/CMakeLists.txt b/Libraries/CMakeLists.txt index 73653913de4..b355f5ace8a 100644 --- a/Libraries/CMakeLists.txt +++ b/Libraries/CMakeLists.txt @@ -8,7 +8,6 @@ add_subdirectory(LibIPC) add_subdirectory(LibJS) add_subdirectory(LibRegex) add_subdirectory(LibRequests) -add_subdirectory(LibRIFF) add_subdirectory(LibSyntax) add_subdirectory(LibTest) add_subdirectory(LibTextCodec) diff --git a/Libraries/LibGfx/CMakeLists.txt b/Libraries/LibGfx/CMakeLists.txt index 169e15967b6..e888b4be5ef 100644 --- a/Libraries/LibGfx/CMakeLists.txt +++ b/Libraries/LibGfx/CMakeLists.txt @@ -82,7 +82,7 @@ endif() serenity_lib(LibGfx gfx) -target_link_libraries(LibGfx PRIVATE LibCompress LibCore LibCrypto LibFileSystem LibRIFF LibTextCodec LibIPC LibUnicode) +target_link_libraries(LibGfx PRIVATE LibCompress LibCore LibCrypto LibFileSystem LibTextCodec LibIPC LibUnicode) set(generated_sources TIFFMetadata.h TIFFTagHandler.cpp) list(TRANSFORM generated_sources PREPEND "ImageFormats/") diff --git a/Libraries/LibGfx/ImageFormats/WebPWriter.cpp b/Libraries/LibGfx/ImageFormats/WebPWriter.cpp index 2a3287bf31b..b1019242250 100644 --- a/Libraries/LibGfx/ImageFormats/WebPWriter.cpp +++ b/Libraries/LibGfx/ImageFormats/WebPWriter.cpp @@ -66,7 +66,6 @@ static ErrorOr write_VP8L_header(Stream& stream, unsigned width, unsigned return {}; } -// FIXME: Consider using LibRIFF for RIFF writing details. (It currently has no writing support.) static ErrorOr align_to_two(Stream& stream, size_t number_of_bytes_written) { // https://developers.google.com/speed/webp/docs/riff_container @@ -172,7 +171,6 @@ static ErrorOr write_VP8X_chunk(Stream& stream, VP8XHeader const& header) return {}; } -// FIXME: Consider using LibRIFF for RIFF writing details. (It currently has no writing support.) static ErrorOr align_to_two(AllocatingMemoryStream& stream) { return align_to_two(stream, stream.used_buffer_size()); diff --git a/Libraries/LibMedia/CMakeLists.txt b/Libraries/LibMedia/CMakeLists.txt index 195ee66f61b..c9623118639 100644 --- a/Libraries/LibMedia/CMakeLists.txt +++ b/Libraries/LibMedia/CMakeLists.txt @@ -17,7 +17,7 @@ set(SOURCES ) serenity_lib(LibMedia media) -target_link_libraries(LibMedia PRIVATE LibCore LibCrypto LibRIFF LibIPC LibGfx LibThreading LibUnicode) +target_link_libraries(LibMedia PRIVATE LibCore LibCrypto LibIPC LibGfx LibThreading LibUnicode) if (NOT ANDROID) target_sources(LibMedia PRIVATE diff --git a/Libraries/LibRIFF/CMakeLists.txt b/Libraries/LibRIFF/CMakeLists.txt deleted file mode 100644 index 1de53fe04ad..00000000000 --- a/Libraries/LibRIFF/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -set(SOURCES - Decoding.cpp - Details.cpp -) - -serenity_lib(LibRIFF riff) diff --git a/Libraries/LibRIFF/ChunkID.h b/Libraries/LibRIFF/ChunkID.h deleted file mode 100644 index 54401841c1a..00000000000 --- a/Libraries/LibRIFF/ChunkID.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2023, kleines Filmröllchen - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include -#include -#include - -namespace RIFF { - -static constexpr size_t const chunk_id_size = 4; - -// Also referred to as "FourCC" (four character code) in the context of some formats. -struct ChunkID { - constexpr ChunkID(char const name[4]) - { - id_data[0] = static_cast(name[0]); - id_data[1] = static_cast(name[1]); - id_data[2] = static_cast(name[2]); - id_data[3] = static_cast(name[3]); - } - constexpr ChunkID(Array data) - : id_data(data) - { - } - constexpr ChunkID(ChunkID const&) = default; - constexpr ChunkID(ChunkID&&) = default; - constexpr ChunkID& operator=(ChunkID const&) = default; - static constexpr ChunkID from_number(u32 number) - { - return Array { { - static_cast((number >> 24) & 0xff), - static_cast((number >> 16) & 0xff), - static_cast((number >> 8) & 0xff), - static_cast(number & 0xff), - } }; - } - - static ErrorOr read_from_stream(Stream& stream); - - StringView as_ascii_string() const; - constexpr u32 as_number() const - { - return (id_data[0] << 24) | (id_data[1] << 16) | (id_data[2] << 8) | id_data[3]; - } - - bool operator==(ChunkID const&) const = default; - bool operator==(StringView) const; - - Array id_data; -}; -static_assert(AssertSize()); - -} - -template<> -struct AK::Formatter : StandardFormatter { - ErrorOr format(FormatBuilder& builder, RIFF::ChunkID const& chunk_id) - { - TRY(builder.put_padding('\'', 1)); - TRY(builder.put_literal(chunk_id.as_ascii_string())); - TRY(builder.put_padding('\'', 1)); - return {}; - } -}; diff --git a/Libraries/LibRIFF/Decoding.cpp b/Libraries/LibRIFF/Decoding.cpp deleted file mode 100644 index e02dc064723..00000000000 --- a/Libraries/LibRIFF/Decoding.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2023, kleines Filmröllchen - * Copyright (c) 2023, Nicolas Ramz - * Copyright (c) 2023, Nico Weber - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include - -ErrorOr RIFF::ChunkID::read_from_stream(Stream& stream) -{ - Array id; - TRY(stream.read_until_filled(id.span())); - return ChunkID { id }; -} - -ErrorOr RIFF::OwnedList::read_from_stream(Stream& stream) -{ - auto type = TRY(stream.read_value()); - Vector chunks; - while (!stream.is_eof()) - TRY(chunks.try_append(TRY(stream.read_value()))); - - return RIFF::OwnedList { .type = type, .chunks = move(chunks) }; -} diff --git a/Libraries/LibRIFF/Details.cpp b/Libraries/LibRIFF/Details.cpp deleted file mode 100644 index 78487d76c37..00000000000 --- a/Libraries/LibRIFF/Details.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2023, kleines Filmröllchen - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include "Details.h" -#include -#include -#include - -namespace RIFF { - -StringView ChunkID::as_ascii_string() const -{ - return StringView { id_data.span() }; -} - -bool ChunkID::operator==(StringView other_string) const -{ - return as_ascii_string() == other_string; -} - -namespace Detail { - -template -auto ChunkHeader::read_from_stream(Stream& stream) -> ErrorOr -{ - auto id = TRY(stream.read_value()); - u32 size = TRY(stream.read_value()); - return ChunkHeader { id, size }; -} - -template -auto FileHeader::read_from_stream(Stream& stream) -> ErrorOr -{ - auto header = TRY(stream.read_value()); - auto subformat = TRY(stream.read_value()); - return FileHeader { header, subformat }; -} - -template -Chunk::Chunk(HeaderType header, ReadonlyBytes data) - : m_header(header) - , m_data(data) -{ - VERIFY(data.size() == header.size); -} - -template -FixedMemoryStream Chunk::data_stream() const -{ - return FixedMemoryStream { m_data }; -} - -template -auto Chunk::decode(ReadonlyBytes data) -> ErrorOr -{ - auto data_stream = FixedMemoryStream { data }; - auto header = TRY(HeaderType::read_from_stream(data_stream)); - - if (data.size() < sizeof(HeaderType) + header.size) - return Error::from_string_literal("Not enough data for IFF/RIFF chunk"); - - return Chunk { header, data.slice(sizeof(HeaderType), header.size) }; -} - -template -auto Chunk::decode_and_advance(ReadonlyBytes& data) -> ErrorOr -{ - auto chunk = TRY(decode(data)); - data = data.slice(sizeof(HeaderType) + chunk.size()); - // add padding if needed - if (chunk.size() % 2 != 0) { - if (data.is_empty()) - return Error::from_string_literal("Missing data for padding byte"); - if (*data.data() != 0) - return Error::from_string_literal("Padding byte is not 0"); - data = data.slice(1); - } - - return chunk; -} - -template -OwnedChunk::OwnedChunk(HeaderType header, Buffer backing_data) - : Chunk(header, backing_data.span()) - , m_backing_data(move(backing_data)) -{ -} - -template -auto OwnedChunk::read_from_stream(Stream& stream) -> ErrorOr -{ - auto header = TRY(stream.read_value()); - - auto data = TRY(Buffer::create_uninitialized(header.size)); - TRY(stream.read_until_filled(data.span())); - - // RIFF chunks may have trailing padding to align to x86 "words" (i.e. 2 bytes). - if (is(stream)) { - if (!stream.is_eof()) { - auto stream_position = TRY(static_cast(stream).tell()); - if (stream_position % 2 != 0) - TRY(static_cast(stream).seek(1, SeekMode::FromCurrentPosition)); - } - } else { - dbgln("RIFF Warning: Cannot align stream to 2-byte boundary, next chunk may be bogus!"); - } - - return OwnedChunk { header, data }; -} - -template class Chunk; -template class Chunk; -template class OwnedChunk; -template class OwnedChunk; -template struct ChunkHeader; -template struct ChunkHeader; -template struct FileHeader; -template struct FileHeader; - -} - -} diff --git a/Libraries/LibRIFF/Details.h b/Libraries/LibRIFF/Details.h deleted file mode 100644 index 276eac08c25..00000000000 --- a/Libraries/LibRIFF/Details.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2023, kleines Filmröllchen - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include - -// Despite the name, this header contains details for both RIFF and IFF -namespace RIFF::Detail { - -// http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/riffmci.pdf page 11 (Chunks) -template -struct ChunkHeader { - static ErrorOr read_from_stream(Stream& stream); - - RIFF::ChunkID id; - u32 size; -}; - -// Standard RIFF/IFF file formats use a global chunk with a chunk ID (magic bytes) such as "RIFF" or "FORM". -// A chunk ID right at the start of the global chunk specifies the subformat specific to the file type. -// Example for RIFF from WebP: https://developers.google.com/speed/webp/docs/riff_container#webp_file_header -template -struct FileHeader { - HeaderType global_header; - RIFF::ChunkID subformat; - - static ErrorOr read_from_stream(Stream& stream); - - constexpr ChunkID magic() const { return global_header.id; } - constexpr u32 file_size() const { return global_header.size; } -}; - -// An RIFF or IFF chunk. -template -class Chunk { -public: - Chunk(HeaderType header, ReadonlyBytes data); - - // Note that the resulting chunk will refer to the provided data. - static ErrorOr decode(ReadonlyBytes data); - static ErrorOr decode_and_advance(ReadonlyBytes& data); - - RIFF::ChunkID id() const { return m_header.id; } - u32 size() const { return m_header.size; } - ReadonlyBytes data() const { return m_data; } - FixedMemoryStream data_stream() const; - - u8 operator[](size_t index) const { return data()[index]; } - -private: - HeaderType m_header; - ReadonlyBytes m_data; -}; - -// Owns the chunk data and can therefore be parsed from a stream. -template -class OwnedChunk : public Chunk { -public: - using Buffer = AK::Detail::ByteBuffer<0>; - OwnedChunk(HeaderType, Buffer); - - static ErrorOr read_from_stream(Stream& stream); - -private: - Buffer m_backing_data; -}; - -} diff --git a/Libraries/LibRIFF/IFF.h b/Libraries/LibRIFF/IFF.h deleted file mode 100644 index d70013efbd4..00000000000 --- a/Libraries/LibRIFF/IFF.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2018-2023, the SerenityOS developers. - * Copyright (c) 2023, Nico Weber - * Copyright (c) 2023, kleines Filmröllchen - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include - -// IFF chunks (as often used by Amiga, EA and more modern formats) use big-endian fields. -namespace IFF { - -using WordType = BigEndian; -using ChunkHeader = RIFF::Detail::ChunkHeader; -using FileHeader = RIFF::Detail::FileHeader; -using Chunk = RIFF::Detail::Chunk; -using OwnedChunk = RIFF::Detail::OwnedChunk; - -} diff --git a/Libraries/LibRIFF/RIFF.h b/Libraries/LibRIFF/RIFF.h deleted file mode 100644 index df7ca0f4e3a..00000000000 --- a/Libraries/LibRIFF/RIFF.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2018-2023, the SerenityOS developers. - * Copyright (c) 2023, kleines Filmröllchen - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include -#include - -// RIFF chunks (as often used by Microsoft's older formats) use little-endian fields. -namespace RIFF { - -static constexpr StringView const riff_magic = "RIFF"sv; -static constexpr StringView const list_chunk_id = "LIST"sv; - -using WordType = LittleEndian; -using ChunkHeader = RIFF::Detail::ChunkHeader; -using FileHeader = RIFF::Detail::FileHeader; -using Chunk = RIFF::Detail::Chunk; -using OwnedChunk = RIFF::Detail::OwnedChunk; - -// http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/riffmci.pdf page 23 (LIST type) -struct OwnedList { - static ErrorOr read_from_stream(Stream& stream); - - ChunkID type; - Vector chunks; -}; - -} diff --git a/Meta/gn/secondary/Ladybird/BUILD.gn b/Meta/gn/secondary/Ladybird/BUILD.gn index 627d079c058..7bc55789d9a 100644 --- a/Meta/gn/secondary/Ladybird/BUILD.gn +++ b/Meta/gn/secondary/Ladybird/BUILD.gn @@ -398,7 +398,6 @@ if (current_os != "mac") { "//Userland/Libraries/LibJS", "//Userland/Libraries/LibLine", "//Userland/Libraries/LibMedia", - "//Userland/Libraries/LibRIFF", "//Userland/Libraries/LibRegex", "//Userland/Libraries/LibRequests", "//Userland/Libraries/LibSyntax", @@ -430,7 +429,6 @@ if (current_os != "mac") { "$root_out_dir/lib/liblagom-media.dylib", "$root_out_dir/lib/liblagom-regex.dylib", "$root_out_dir/lib/liblagom-requests.dylib", - "$root_out_dir/lib/liblagom-riff.dylib", "$root_out_dir/lib/liblagom-syntax.dylib", "$root_out_dir/lib/liblagom-textcodec.dylib", "$root_out_dir/lib/liblagom-threading.dylib", diff --git a/Meta/gn/secondary/Userland/Libraries/LibGfx/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibGfx/BUILD.gn index 657a7237bef..0c2700fec59 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibGfx/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibGfx/BUILD.gn @@ -95,7 +95,6 @@ shared_library("LibGfx") { "//Userland/Libraries/LibCrypto", "//Userland/Libraries/LibFileSystem", "//Userland/Libraries/LibIPC", - "//Userland/Libraries/LibRIFF", "//Userland/Libraries/LibTextCodec", "//Userland/Libraries/LibURL", "//Userland/Libraries/LibUnicode", diff --git a/Meta/gn/secondary/Userland/Libraries/LibMedia/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibMedia/BUILD.gn index 8f3980069ef..0669297bcdc 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibMedia/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibMedia/BUILD.gn @@ -41,7 +41,6 @@ shared_library("LibMedia") { "//Userland/Libraries/LibCrypto", "//Userland/Libraries/LibGfx", "//Userland/Libraries/LibIPC", - "//Userland/Libraries/LibRIFF", "//Userland/Libraries/LibThreading", "//Userland/Libraries/LibUnicode", ] diff --git a/Meta/gn/secondary/Userland/Libraries/LibRIFF/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibRIFF/BUILD.gn deleted file mode 100644 index fea37c59a8e..00000000000 --- a/Meta/gn/secondary/Userland/Libraries/LibRIFF/BUILD.gn +++ /dev/null @@ -1,16 +0,0 @@ -shared_library("LibRIFF") { - output_name = "riff" - - include_dirs = [ "//Userland/Libraries" ] - - sources = [ - "ChunkID.h", - "Decoding.cpp", - "Details.cpp", - "Details.h", - "IFF.h", - "RIFF.h", - ] - - deps = [ "//AK" ] -}