Grok  10.0.3
StripCache.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 #include <mutex>
5 #include <atomic>
6 #include "grok.h"
7 #include "MinHeap.h"
8 
9 namespace grk
10 {
11 
12 struct GrkIOBuf : public grk_io_buf
13 {
14  public:
15  GrkIOBuf() : GrkIOBuf(nullptr, 0, 0, 0, false, 0) {}
16  GrkIOBuf(uint8_t* data, size_t offset, size_t dataLen, size_t allocLen, bool pooled,
17  uint32_t index)
18  {
19  data_ = data;
20  offset_ = offset;
21  len_ = dataLen;
22  allocLen_ = allocLen;
23  pooled_ = pooled;
24  index_ = index;
25  }
26  explicit GrkIOBuf(const grk_io_buf rhs)
27  {
28  data_ = rhs.data_;
29  offset_ = rhs.offset_;
30  len_ = rhs.len_;
31  allocLen_ = rhs.allocLen_;
32  pooled_ = rhs.pooled_;
33  index_ = rhs.index_;
34  }
35  uint32_t getIndex(void) const
36  {
37  return index_;
38  }
39  bool alloc(size_t len)
40  {
41  dealloc();
42  data_ = (uint8_t*)grk_aligned_malloc(len);
43  if(data_)
44  {
45  len_ = len;
46  allocLen_ = len;
47  }
48 
49  return (data_ != nullptr);
50  }
51  void dealloc()
52  {
54  data_ = nullptr;
55  }
56 };
57 
58 class BufPool
59 {
60  public:
61  ~BufPool(void)
62  {
63  for(auto& b : pool)
64  b.second.dealloc();
65  }
66  GrkIOBuf get(size_t len)
67  {
68  for(auto iter = pool.begin(); iter != pool.end(); ++iter)
69  {
70  if(iter->second.allocLen_ >= len)
71  {
72  auto b = iter->second;
73  b.len_ = len;
74  pool.erase(iter);
75  return b;
76  }
77  }
78  GrkIOBuf rc;
79  rc.alloc(len);
80 
81  return rc;
82  }
83  void put(GrkIOBuf b)
84  {
85  assert(b.data_);
86  assert(pool.find(b.data_) == pool.end());
87  pool[b.data_] = b;
88  }
89 
90  private:
91  std::map<uint8_t*, GrkIOBuf> pool;
92 };
93 
94 struct Strip
95 {
96  Strip(GrkImage* outputImage, uint16_t index, uint32_t nominalHeight, uint8_t reduce);
97  ~Strip(void);
98  uint32_t getIndex(void);
99  uint32_t reduceDim(uint32_t dim);
100  bool allocInterleavedLocked(uint64_t len, BufPool* pool);
101  bool allocInterleaved(uint64_t len, BufPool* pool);
103  std::atomic<uint32_t> tileCounter; // count number of tiles added to strip
104  uint8_t reduce_; // resolution reduction
105  mutable std::mutex interleaveMutex_;
106  mutable std::atomic<bool> allocatedInterleaved_;
107 };
108 
110 {
111  public:
112  StripCache(void);
113  virtual ~StripCache();
114 
115  void init(uint32_t concurrency, uint16_t numTiles_, uint32_t numStrips,
116  uint32_t nominalStripHeight, uint8_t reduce, GrkImage* outputImg,
117  grk_io_pixels_callback ioBufferCallback, void* ioUserData,
118  grk_io_register_reclaim_callback grkRegisterReclaimCallback);
119  bool ingestTile(uint32_t threadId, GrkImage* src);
120  bool ingestTile(GrkImage* src);
121  bool ingestStrip(uint32_t threadId, Tile* src, uint32_t yBegin, uint32_t yEnd);
122  void returnBufferToPool(uint32_t threadId, GrkIOBuf b);
123  bool isInitialized(void);
124  bool isMultiTile(void);
125 
126  private:
127  bool serialize(uint32_t threadId, GrkIOBuf buf);
128  std::vector<BufPool*> pools_;
130  uint16_t numTiles_;
131  uint32_t numStrips_;
133  uint32_t imageY0_;
134  uint64_t packedRowBytes_;
135  void* ioUserData_;
137  mutable std::mutex serializeMutex_;
139  mutable std::mutex heapMutex_;
142 };
143 
144 } // namespace grk
Definition: StripCache.h:59
std::map< uint8_t *, GrkIOBuf > pool
Definition: StripCache.h:91
~BufPool(void)
Definition: StripCache.h:61
void put(GrkIOBuf b)
Definition: StripCache.h:83
GrkIOBuf get(size_t len)
Definition: StripCache.h:66
Definition: GrkImage.h:25
Definition: MinHeap.h:34
Definition: StripCache.h:110
void init(uint32_t concurrency, uint16_t numTiles_, uint32_t numStrips, uint32_t nominalStripHeight, uint8_t reduce, GrkImage *outputImg, grk_io_pixels_callback ioBufferCallback, void *ioUserData, grk_io_register_reclaim_callback grkRegisterReclaimCallback)
Definition: StripCache.cpp:73
uint16_t numTiles_
Definition: StripCache.h:130
void * ioUserData_
Definition: StripCache.h:135
StripCache(void)
Definition: StripCache.cpp:52
uint32_t numStrips_
Definition: StripCache.h:131
bool ingestTile(uint32_t threadId, GrkImage *src)
Definition: StripCache.cpp:133
MinHeap< GrkIOBuf, uint32_t, MinHeapFakeLocker > serializeHeap
Definition: StripCache.h:138
std::mutex serializeMutex_
Definition: StripCache.h:137
bool ingestStrip(uint32_t threadId, Tile *src, uint32_t yBegin, uint32_t yEnd)
Definition: StripCache.cpp:103
virtual ~StripCache()
Definition: StripCache.cpp:57
void returnBufferToPool(uint32_t threadId, GrkIOBuf b)
Definition: StripCache.cpp:215
bool isMultiTile(void)
Definition: StripCache.cpp:69
bool multiTile_
Definition: StripCache.h:141
std::vector< BufPool * > pools_
Definition: StripCache.h:128
bool initialized_
Definition: StripCache.h:140
uint64_t packedRowBytes_
Definition: StripCache.h:134
uint32_t nominalStripHeight_
Definition: StripCache.h:132
uint32_t imageY0_
Definition: StripCache.h:133
std::mutex heapMutex_
Definition: StripCache.h:139
Strip ** strips
Definition: StripCache.h:129
bool serialize(uint32_t threadId, GrkIOBuf buf)
Definition: StripCache.cpp:167
bool isInitialized(void)
Definition: StripCache.cpp:65
grk_io_pixels_callback ioBufferCallback_
Definition: StripCache.h:136
void(* grk_io_register_reclaim_callback)(grk_io_init io_init, grk_io_callback reclaim_callback, void *io_user_data, void *reclaim_user_data)
Definition: grok.h:452
bool(* grk_io_pixels_callback)(uint32_t threadId, grk_io_buf buffer, void *user_data)
Definition: grok.h:455
Copyright (C) 2016-2022 Grok Image Compression Inc.
Definition: ICacheable.h:20
void * grk_aligned_malloc(size_t size)
Allocate memory aligned to a 16 byte boundary.
Definition: MemManager.cpp:76
void grk_aligned_free(void *ptr)
Definition: MemManager.cpp:80
Definition: grok.h:436
bool pooled_
Definition: grok.h:441
size_t offset_
Definition: grok.h:438
size_t allocLen_
Definition: grok.h:440
uint8_t * data_
Definition: grok.h:437
size_t len_
Definition: grok.h:439
uint32_t index_
Definition: grok.h:442
Definition: StripCache.h:13
GrkIOBuf(uint8_t *data, size_t offset, size_t dataLen, size_t allocLen, bool pooled, uint32_t index)
Definition: StripCache.h:16
GrkIOBuf()
Definition: StripCache.h:15
uint32_t getIndex(void) const
Definition: StripCache.h:35
void dealloc()
Definition: StripCache.h:51
GrkIOBuf(const grk_io_buf rhs)
Definition: StripCache.h:26
bool alloc(size_t len)
Definition: StripCache.h:39
Definition: StripCache.h:95
std::atomic< uint32_t > tileCounter
Definition: StripCache.h:103
uint32_t getIndex(void)
~Strip(void)
Definition: StripCache.cpp:26
GrkImage * stripImg
Definition: StripCache.h:102
uint32_t reduceDim(uint32_t dim)
Definition: StripCache.cpp:30
std::atomic< bool > allocatedInterleaved_
Definition: StripCache.h:106
std::mutex interleaveMutex_
Definition: StripCache.h:105
Strip(GrkImage *outputImage, uint16_t index, uint32_t nominalHeight, uint8_t reduce)
Definition: StripCache.cpp:16
uint8_t reduce_
Definition: StripCache.h:104
bool allocInterleaved(uint64_t len, BufPool *pool)
Definition: StripCache.cpp:46
bool allocInterleavedLocked(uint64_t len, BufPool *pool)
Definition: StripCache.cpp:34
Definition: TileProcessor.h:39