summaryrefslogtreecommitdiff
path: root/media/libjxl/src/lib/jxl/headers.h
diff options
context:
space:
mode:
Diffstat (limited to 'media/libjxl/src/lib/jxl/headers.h')
-rw-r--r--media/libjxl/src/lib/jxl/headers.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/media/libjxl/src/lib/jxl/headers.h b/media/libjxl/src/lib/jxl/headers.h
new file mode 100644
index 0000000000..56ed72e31f
--- /dev/null
+++ b/media/libjxl/src/lib/jxl/headers.h
@@ -0,0 +1,106 @@
+// Copyright (c) the JPEG XL Project Authors. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#ifndef LIB_JXL_HEADERS_H_
+#define LIB_JXL_HEADERS_H_
+
+// Codestream headers, also stored in CodecInOut.
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "lib/jxl/aux_out_fwd.h"
+#include "lib/jxl/base/compiler_specific.h"
+#include "lib/jxl/base/status.h"
+#include "lib/jxl/dec_bit_reader.h"
+#include "lib/jxl/enc_bit_writer.h"
+#include "lib/jxl/field_encodings.h"
+
+namespace jxl {
+
+// Reserved by ISO/IEC 10918-1. LF causes files opened in text mode to be
+// rejected because the marker changes to 0x0D instead. The 0xFF prefix also
+// ensures there were no 7-bit transmission limitations.
+static constexpr uint8_t kCodestreamMarker = 0x0A;
+
+// Compact representation of image dimensions (best case: 9 bits) so decoders
+// can preallocate early.
+class SizeHeader : public Fields {
+ public:
+ // All fields are valid after reading at most this many bits. WriteSizeHeader
+ // verifies this matches Bundle::MaxBits(SizeHeader).
+ static constexpr size_t kMaxBits = 78;
+
+ SizeHeader();
+ JXL_FIELDS_NAME(SizeHeader)
+
+ Status VisitFields(Visitor* JXL_RESTRICT visitor) override;
+
+ Status Set(size_t xsize, size_t ysize);
+
+ size_t xsize() const;
+ size_t ysize() const {
+ return small_ ? ((ysize_div8_minus_1_ + 1) * 8) : ysize_;
+ }
+
+ private:
+ bool small_; // xsize and ysize <= 256 and divisible by 8.
+
+ uint32_t ysize_div8_minus_1_;
+ uint32_t ysize_;
+
+ uint32_t ratio_;
+ uint32_t xsize_div8_minus_1_;
+ uint32_t xsize_;
+};
+
+// (Similar to SizeHeader but different encoding because previews are smaller)
+class PreviewHeader : public Fields {
+ public:
+ PreviewHeader();
+ JXL_FIELDS_NAME(PreviewHeader)
+
+ Status VisitFields(Visitor* JXL_RESTRICT visitor) override;
+
+ Status Set(size_t xsize, size_t ysize);
+
+ size_t xsize() const;
+ size_t ysize() const { return div8_ ? (ysize_div8_ * 8) : ysize_; }
+
+ private:
+ bool div8_; // xsize and ysize divisible by 8.
+
+ uint32_t ysize_div8_;
+ uint32_t ysize_;
+
+ uint32_t ratio_;
+ uint32_t xsize_div8_;
+ uint32_t xsize_;
+};
+
+struct AnimationHeader : public Fields {
+ AnimationHeader();
+ JXL_FIELDS_NAME(AnimationHeader)
+
+ Status VisitFields(Visitor* JXL_RESTRICT visitor) override;
+
+ // Ticks per second (expressed as rational number to support NTSC)
+ uint32_t tps_numerator;
+ uint32_t tps_denominator;
+
+ uint32_t num_loops; // 0 means to repeat infinitely.
+
+ bool have_timecodes;
+};
+
+Status ReadSizeHeader(BitReader* JXL_RESTRICT reader,
+ SizeHeader* JXL_RESTRICT size);
+
+Status WriteSizeHeader(const SizeHeader& size, BitWriter* JXL_RESTRICT writer,
+ size_t layer, AuxOut* aux_out);
+
+} // namespace jxl
+
+#endif // LIB_JXL_HEADERS_H_