summaryrefslogtreecommitdiffstats
path: root/third_party/jpeg-xl/lib/jxl/jpeg/dec_jpeg_output_chunk.h
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/jpeg-xl/lib/jxl/jpeg/dec_jpeg_output_chunk.h')
-rw-r--r--third_party/jpeg-xl/lib/jxl/jpeg/dec_jpeg_output_chunk.h72
1 files changed, 72 insertions, 0 deletions
diff --git a/third_party/jpeg-xl/lib/jxl/jpeg/dec_jpeg_output_chunk.h b/third_party/jpeg-xl/lib/jxl/jpeg/dec_jpeg_output_chunk.h
new file mode 100644
index 0000000000..e003c04952
--- /dev/null
+++ b/third_party/jpeg-xl/lib/jxl/jpeg/dec_jpeg_output_chunk.h
@@ -0,0 +1,72 @@
+// 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_JPEG_DEC_JPEG_OUTPUT_CHUNK_H_
+#define LIB_JXL_JPEG_DEC_JPEG_OUTPUT_CHUNK_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <initializer_list>
+#include <memory>
+#include <vector>
+
+namespace jxl {
+namespace jpeg {
+
+/**
+ * A chunk of output data.
+ *
+ * Data producer creates OutputChunks and adds them to the end output queue.
+ * Once control flow leaves the producer code, it is considered that chunk of
+ * data is final and can not be changed; to underline this fact |next| is a
+ * const-pointer.
+ *
+ * Data consumer removes OutputChunks from the beginning of the output queue.
+ * It is possible to consume OutputChunks partially, by updating |next| and
+ * |len|.
+ *
+ * There are 2 types of output chunks:
+ * - owning: actual data is stored in |buffer| field; producer fills data after
+ * the instance it created; it is legal to reduce |len| to show that not all
+ * the capacity of |buffer| is used
+ * - non-owning: represents the data stored (owned) somewhere else
+ */
+struct OutputChunk {
+ // Non-owning
+ template <typename Bytes>
+ explicit OutputChunk(Bytes& bytes) : len(bytes.size()) {
+ // Deal both with const qualifier and data type.
+ const void* src = bytes.data();
+ next = reinterpret_cast<const uint8_t*>(src);
+ }
+
+ // Non-owning
+ OutputChunk(const uint8_t* data, size_t size) : next(data), len(size) {}
+
+ // Owning
+ explicit OutputChunk(size_t size = 0) {
+ buffer.reset(new std::vector<uint8_t>(size));
+ next = buffer->data();
+ len = size;
+ }
+
+ // Owning
+ OutputChunk(std::initializer_list<uint8_t> bytes) {
+ buffer.reset(new std::vector<uint8_t>(bytes));
+ next = buffer->data();
+ len = bytes.size();
+ }
+
+ const uint8_t* next;
+ size_t len;
+ // TODO(veluca): consider removing the unique_ptr.
+ std::unique_ptr<std::vector<uint8_t>> buffer;
+};
+
+} // namespace jpeg
+} // namespace jxl
+
+#endif // LIB_JXL_JPEG_DEC_JPEG_OUTPUT_CHUNK_H_