Grok 12.0.1
Codeblock.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016-2024 Grok Image Compression Inc.
3 *
4 * This source code is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License, version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This source code is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Affero General Public License for more details.
12 *
13 * You should have received a copy of the GNU Affero General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#pragma once
17
18#include "grk_includes.h"
19#include <vector>
20namespace grk
21{
22// code segment (code block can be encoded into multiple segments)
23struct Segment
24{
26 {
27 clear();
28 }
29 void clear()
30 {
31 numpasses = 0;
32 len = 0;
33 maxpasses = 0;
36 }
37 uint32_t numpasses; // number of passes in segment
38 uint32_t len; // total length of segment
39 uint32_t maxpasses; // maximum number of passes in segment
40 uint32_t numPassesInPacket; // number of passes contributed by current packet
41 uint32_t numBytesInPacket; // number of bytes contributed by current packet
42};
43
44// compressing/decoding pass
46{
47 CodePass() : rate(0), distortiondec(0), len(0), term(0), slope(0) {}
52 uint16_t slope; // ln(slope) in 8.8 fixed point
53};
54// quality layer
55struct Layer
56{
58 uint32_t numpasses; // Number of passes in the layer
59 uint32_t len; // number of bytes in layer
60 double distortion; // layer distortion decrease
61 uint8_t* data; // compressed layer data
62};
63
64// note: block lives in canvas coordinates
65struct Codeblock : public grk_buf2d<int32_t, AllocatorAligned>, public ICacheable
66{
74 virtual ~Codeblock()
75 {
77 delete[] numPassesInPacket;
78 }
86 {
87 (*(grk_rect32*)this) = r;
88 }
93 {
94 assert(layno < numlayers_);
95 return numPassesInPacket[layno];
96 }
98 {
99 assert(layno < numlayers_);
100 numPassesInPacket[layno] = passes;
101 }
103 {
104 assert(layno < numlayers_);
105 numPassesInPacket[layno] += delta;
106 }
107
108 protected:
111#ifdef DEBUG_LOSSLESS_T2
113 std::vector<PacketLengthInfo> packet_length_info;
114#endif
115
116 private:
117 explicit Codeblock(const Codeblock& rhs) = default;
118 Codeblock& operator=(const Codeblock& rhs) = default;
119};
120
122{
132 {
133 delete[] layers;
134 delete[] passes;
135 }
136 void init()
137 {
139 if(!layers)
140 layers = new Layer[numlayers_];
141 if(!passes)
142 passes = new CodePass[3 * 32 - 2];
143 }
151 {
153 // we add two fake zero bytes at beginning of buffer, so that mq coder
154 // can be initialized to data[-1] == actualData[1], and still point
155 // to a valid memory location
157 buf[0] = 0;
158 buf[1] = 0;
159
164
165 return true;
166 }
171 uint32_t numPassesTotal; /* total number of passes in all layers */
172#ifdef PLUGIN_DEBUG_ENCODE
173 uint32_t* contextStream;
174#endif
175};
176
178{
187 {
188 release();
189 }
191 {
192 if(!segs)
193 {
197 }
199 {
200 auto new_segs = new Segment[2 * numSegmentsAllocated];
201 for(uint32_t i = 0; i < numSegmentsAllocated; ++i)
202 new_segs[i] = segs[i];
204 delete[] segs;
205 segs = new_segs;
206 }
207
208 return segs + segmentIndex;
209 }
211 {
212 return numSegments;
213 }
215 {
216 return numSegments ? getSegment(numSegments - 1) : nullptr;
217 }
219 {
220 numSegments++;
221 return getCurrentSegment();
222 }
224 {
225 for(auto& b : seg_buffers)
226 delete b;
227 seg_buffers.clear();
228 numSegments = 0;
229 }
231 {
232 return std::accumulate(seg_buffers.begin(), seg_buffers.end(), (size_t)0,
233 [](const size_t s, grk_buf8* a) { return (s + a->len); });
234 }
236 {
237 if(!buffer)
238 return false;
239 size_t offset = 0;
240 for(auto& buf : seg_buffers)
241 {
242 if(buf->len)
243 {
244 memcpy(buffer + offset, buf->buf, buf->len);
245 offset += buf->len;
246 }
247 }
248 return true;
249 }
250 void release(void)
251 {
253 delete[] segs;
254 segs = nullptr;
256 }
257 std::vector<grk_buf8*> seg_buffers;
258
259 private:
260 Segment* segs; /* information on segments */
261 uint32_t numSegments; /* number of segment in block*/
262 uint32_t numSegmentsAllocated; // number of segments allocated for segs array
263};
264
265} // namespace grk
Definition ICacheable.h:29
Copyright (C) 2016-2024 Grok Image Compression Inc.
Definition ICacheable.h:20
void grk_read(const uint8_t *buffer, TYPE *value, uint32_t numBytes)
Definition BufferedStream.h:239
static const float delta
Definition WaveletFwd.cpp:42
Definition Codeblock.h:46
uint16_t slope
Definition Codeblock.h:52
uint8_t term
Definition Codeblock.h:51
uint32_t len
Definition Codeblock.h:50
uint32_t rate
Definition Codeblock.h:48
double distortiondec
Definition Codeblock.h:49
CodePass()
Definition Codeblock.h:47
Definition Codeblock.h:66
uint8_t * numPassesInPacket
Definition Codeblock.h:109
uint8_t numlenbits
Definition Codeblock.h:91
uint8_t getNumPassesInPacket(uint16_t layno)
Definition Codeblock.h:92
uint8_t numbps
Definition Codeblock.h:90
void setRect(grk_rect32 r)
Definition Codeblock.h:85
Codeblock & operator=(const Codeblock &rhs)=default
void setNumPassesInPacket(uint16_t layno, uint8_t passes)
Definition Codeblock.h:97
virtual ~Codeblock()
Definition Codeblock.h:74
void init(void)
Definition Codeblock.h:79
uint16_t numlayers_
Definition Codeblock.h:110
grk_buf8 compressedStream
Definition Codeblock.h:89
Codeblock(const Codeblock &rhs)=default
void incNumPassesInPacket(uint16_t layno, uint8_t delta)
Definition Codeblock.h:102
Codeblock(uint16_t numLayers)
Definition Codeblock.h:67
Definition Codeblock.h:122
void init()
Definition Codeblock.h:136
uint32_t numPassesInPreviousPackets
Definition Codeblock.h:170
uint32_t numPassesTotal
Definition Codeblock.h:171
CodePass * passes
Definition Codeblock.h:169
bool allocData(size_t nominalBlockSize)
Allocates data memory for an compressing code block.
Definition Codeblock.h:150
CompressCodeblock(uint16_t numLayers)
Definition Codeblock.h:123
Layer * layers
Definition Codeblock.h:168
uint8_t * paddedCompressedStream
Definition Codeblock.h:167
virtual ~CompressCodeblock()
Definition Codeblock.h:131
Definition Codeblock.h:178
size_t getSegBuffersLen()
Definition Codeblock.h:230
bool copyToContiguousBuffer(uint8_t *buffer)
Definition Codeblock.h:235
virtual ~DecompressCodeblock()
Definition Codeblock.h:186
uint32_t numSegmentsAllocated
Definition Codeblock.h:262
DecompressCodeblock(uint16_t numLayers)
Definition Codeblock.h:179
void release(void)
Definition Codeblock.h:250
void cleanUpSegBuffers()
Definition Codeblock.h:223
Segment * nextSegment(void)
Definition Codeblock.h:218
std::vector< grk_buf8 * > seg_buffers
Definition Codeblock.h:257
Segment * getCurrentSegment(void)
Definition Codeblock.h:214
Segment * segs
Definition Codeblock.h:260
uint32_t numSegments
Definition Codeblock.h:261
uint32_t getNumSegments(void)
Definition Codeblock.h:210
Segment * getSegment(uint32_t segmentIndex)
Definition Codeblock.h:190
Definition Codeblock.h:56
uint32_t len
Definition Codeblock.h:59
double distortion
Definition Codeblock.h:60
uint8_t * data
Definition Codeblock.h:61
Layer()
Definition Codeblock.h:57
uint32_t numpasses
Definition Codeblock.h:58
Definition Codeblock.h:24
void clear()
Definition Codeblock.h:29
uint32_t maxpasses
Definition Codeblock.h:39
uint32_t len
Definition Codeblock.h:38
uint32_t numBytesInPacket
Definition Codeblock.h:41
uint32_t numPassesInPacket
Definition Codeblock.h:40
Segment()
Definition Codeblock.h:25
uint32_t numpasses
Definition Codeblock.h:37
Definition buffer.h:230
bool owns_data
Definition buffer.h:198
size_t len
Definition buffer.h:197
virtual void dealloc()
Definition buffer.h:117
T * buf
Definition buffer.h:195
size_t offset
Definition buffer.h:196
const uint8_t grk_cblk_enc_compressed_data_pad_left
Definition t1_common.h:40