summaryrefslogtreecommitdiffstats
path: root/third_party/jpeg-xl/lib/jxl/jpeg/dec_jpeg_output_chunk.h
blob: e003c049528efc2dcd0d27c6785d58fd7bc11ba5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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_