tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

dec_jpeg_output_chunk.h (2142B)


      1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style
      4 // license that can be found in the LICENSE file.
      5 
      6 #ifndef LIB_JXL_JPEG_DEC_JPEG_OUTPUT_CHUNK_H_
      7 #define LIB_JXL_JPEG_DEC_JPEG_OUTPUT_CHUNK_H_
      8 
      9 #include <stddef.h>
     10 #include <stdint.h>
     11 
     12 #include <initializer_list>
     13 #include <memory>
     14 #include <vector>
     15 
     16 #include "lib/jxl/base/common.h"
     17 
     18 namespace jxl {
     19 namespace jpeg {
     20 
     21 /**
     22 * A chunk of output data.
     23 *
     24 * Data producer creates OutputChunks and adds them to the end output queue.
     25 * Once control flow leaves the producer code, it is considered that chunk of
     26 * data is final and can not be changed; to underline this fact |next| is a
     27 * const-pointer.
     28 *
     29 * Data consumer removes OutputChunks from the beginning of the output queue.
     30 * It is possible to consume OutputChunks partially, by updating |next| and
     31 * |len|.
     32 *
     33 * There are 2 types of output chunks:
     34 *  - owning: actual data is stored in |buffer| field; producer fills data after
     35 *    the instance it created; it is legal to reduce |len| to show that not all
     36 *    the capacity of |buffer| is used
     37 *  - non-owning: represents the data stored (owned) somewhere else
     38 */
     39 struct OutputChunk {
     40  // Non-owning
     41  template <typename Bytes>
     42  explicit OutputChunk(Bytes& bytes) : len(bytes.size()) {
     43    // Deal both with const qualifier and data type.
     44    const void* src = bytes.data();
     45    next = reinterpret_cast<const uint8_t*>(src);
     46  }
     47 
     48  // Non-owning
     49  OutputChunk(const uint8_t* data, size_t size) : next(data), len(size) {}
     50 
     51  // Owning
     52  explicit OutputChunk(size_t size = 0) {
     53    buffer = jxl::make_unique<std::vector<uint8_t>>(size);
     54    next = buffer->data();
     55    len = size;
     56  }
     57 
     58  // Owning
     59  OutputChunk(std::initializer_list<uint8_t> bytes) {
     60    buffer = jxl::make_unique<std::vector<uint8_t>>(bytes);
     61    next = buffer->data();
     62    len = bytes.size();
     63  }
     64 
     65  const uint8_t* next;
     66  size_t len;
     67  // TODO(veluca): consider removing the unique_ptr.
     68  std::unique_ptr<std::vector<uint8_t>> buffer;
     69 };
     70 
     71 }  // namespace jpeg
     72 }  // namespace jxl
     73 
     74 #endif  // LIB_JXL_JPEG_DEC_JPEG_OUTPUT_CHUNK_H_