// 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 #include #include #include #include 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 explicit OutputChunk(Bytes& bytes) : len(bytes.size()) { // Deal both with const qualifier and data type. const void* src = bytes.data(); next = reinterpret_cast(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(size)); next = buffer->data(); len = size; } // Owning OutputChunk(std::initializer_list bytes) { buffer.reset(new std::vector(bytes)); next = buffer->data(); len = bytes.size(); } const uint8_t* next; size_t len; // TODO(veluca): consider removing the unique_ptr. std::unique_ptr> buffer; }; } // namespace jpeg } // namespace jxl #endif // LIB_JXL_JPEG_DEC_JPEG_OUTPUT_CHUNK_H_