ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
Encoder.h
Go to the documentation of this file.
1 /*
2  * Original work Copyright 2009 - 2010 Kevin Ackley (kackley@gwi.net)
3  * Modified work Copyright 2018 - 2020 Andy Maloney <asmaloney@gmail.com>
4  *
5  * Permission is hereby granted, free of charge, to any person or organization
6  * obtaining a copy of the software and accompanying documentation covered by
7  * this license (the "Software") to use, reproduce, display, distribute,
8  * execute, and transmit the Software, and to prepare derivative works of the
9  * Software, and to permit third-parties to whom the Software is furnished to
10  * do so, all subject to the following:
11  *
12  * The copyright notices in the Software and this entire statement, including
13  * the above license grant, this restriction and the following disclaimer,
14  * must be included in all copies of the Software, in whole or in part, and
15  * all derivative works of the Software, unless such copies or derivative
16  * works are solely in the form of machine-executable object code generated by
17  * a source language processor.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
22  * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
23  * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
24  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25  * DEALINGS IN THE SOFTWARE.
26  */
27 
28 #pragma once
29 
30 #include "Common.h"
31 
32 namespace e57
33 {
34  class Encoder
35  {
36  public:
37  static std::shared_ptr<Encoder> EncoderFactory( unsigned bytestreamNumber,
38  std::shared_ptr<CompressedVectorNodeImpl> cVector,
39  std::vector<SourceDestBuffer> &sbuf, ustring &codecPath );
40 
41  virtual ~Encoder() = default;
42 
43  virtual uint64_t processRecords( size_t recordCount ) = 0;
44  virtual unsigned sourceBufferNextIndex() = 0;
45  virtual uint64_t currentRecordIndex() = 0;
46  virtual float bitsPerRecord() = 0;
47  virtual bool registerFlushToOutput() = 0;
48 
49  virtual size_t outputAvailable() const = 0;
50  virtual void outputRead( char *dest, const size_t byteCount ) = 0;
51  virtual void outputClear() = 0;
52 
53  virtual void sourceBufferSetNew( std::vector<SourceDestBuffer> &sbufs ) = 0;
54  virtual size_t outputGetMaxSize() = 0;
55  virtual void outputSetMaxSize( unsigned byteCount ) = 0;
56 
57  unsigned bytestreamNumber() const
58  {
59  return bytestreamNumber_;
60  }
61 
62 #ifdef E57_DEBUG
63  virtual void dump( int indent = 0, std::ostream &os = std::cout ) const;
64 #endif
65  protected:
66  Encoder( unsigned bytestreamNumber );
67 
69  };
70 
71  class BitpackEncoder : public Encoder
72  {
73  public:
74  uint64_t processRecords( size_t recordCount ) override = 0;
75  unsigned sourceBufferNextIndex() override;
76  uint64_t currentRecordIndex() override;
77  float bitsPerRecord() override = 0;
78  bool registerFlushToOutput() override = 0;
79 
80  size_t outputAvailable() const override;
81  void outputRead( char *dest,
82  const size_t byteCount ) override;
83  void outputClear() override;
84 
85  void sourceBufferSetNew( std::vector<SourceDestBuffer> &sbufs ) override;
86  size_t outputGetMaxSize() override;
87  void outputSetMaxSize( unsigned byteCount ) override;
88 
89 #ifdef E57_DEBUG
90  void dump( int indent = 0, std::ostream &os = std::cout ) const override;
91 #endif
92  protected:
93  BitpackEncoder( unsigned bytestreamNumber, SourceDestBuffer &sbuf, unsigned outputMaxSize,
94  unsigned alignmentSize );
95 
96  void outBufferShiftDown();
97 
98  std::shared_ptr<SourceDestBufferImpl> sourceBuffer_;
99 
100  std::vector<char> outBuffer_;
104 
106  };
107 
109  {
110  public:
111  BitpackFloatEncoder( unsigned bytestreamNumber, SourceDestBuffer &sbuf, unsigned outputMaxSize,
112  FloatPrecision precision );
113 
114  uint64_t processRecords( size_t recordCount ) override;
115  bool registerFlushToOutput() override;
116  float bitsPerRecord() override;
117 
118 #ifdef E57_DEBUG
119  void dump( int indent = 0, std::ostream &os = std::cout ) const override;
120 #endif
121  protected:
123  };
124 
126  {
127  public:
128  BitpackStringEncoder( unsigned bytestreamNumber, SourceDestBuffer &sbuf, unsigned outputMaxSize );
129 
130  uint64_t processRecords( size_t recordCount ) override;
131  bool registerFlushToOutput() override;
132  float bitsPerRecord() override;
133 
134 #ifdef E57_DEBUG
135  void dump( int indent = 0, std::ostream &os = std::cout ) const override;
136 #endif
137  protected:
143  };
144 
145  template <typename RegisterT> class BitpackIntegerEncoder : public BitpackEncoder
146  {
147  public:
148  BitpackIntegerEncoder( bool isScaledInteger, unsigned bytestreamNumber, SourceDestBuffer &sbuf,
149  unsigned outputMaxSize, int64_t minimum, int64_t maximum, double scale, double offset );
150 
151  uint64_t processRecords( size_t recordCount ) override;
152  bool registerFlushToOutput() override;
153  float bitsPerRecord() override;
154 
155 #ifdef E57_DEBUG
156  void dump( int indent = 0, std::ostream &os = std::cout ) const override;
157 #endif
158  protected:
160  int64_t minimum_;
161  int64_t maximum_;
162  double scale_;
163  double offset_;
164  unsigned bitsPerRecord_;
165  uint64_t sourceBitMask_;
167  RegisterT register_;
168  };
169 
171  {
172  public:
173  ConstantIntegerEncoder( unsigned bytestreamNumber, SourceDestBuffer &sbuf, int64_t minimum );
174  uint64_t processRecords( size_t recordCount ) override;
175  unsigned sourceBufferNextIndex() override;
176  uint64_t currentRecordIndex() override;
177  float bitsPerRecord() override;
178  bool registerFlushToOutput() override;
179 
180  size_t outputAvailable() const override;
181  void outputRead( char *dest,
182  const size_t byteCount ) override;
183  void outputClear() override;
184 
185  void sourceBufferSetNew( std::vector<SourceDestBuffer> &sbufs ) override;
186  size_t outputGetMaxSize() override;
187  void outputSetMaxSize( unsigned byteCount ) override;
188 
189 #ifdef E57_DEBUG
190  void dump( int indent = 0, std::ostream &os = std::cout ) const override;
191 #endif
192  protected:
193  std::shared_ptr<SourceDestBufferImpl> sourceBuffer_;
195  int64_t minimum_;
196  };
197 }
int offset
std::shared_ptr< SourceDestBufferImpl > sourceBuffer_
Definition: Encoder.h:98
size_t outBufferAlignmentSize_
Definition: Encoder.h:103
bool registerFlushToOutput() override=0
size_t outBufferFirst_
Definition: Encoder.h:101
uint64_t processRecords(size_t recordCount) override=0
void outputSetMaxSize(unsigned byteCount) override
Definition: Encoder.cpp:289
float bitsPerRecord() override=0
uint64_t currentRecordIndex_
Definition: Encoder.h:105
size_t outputAvailable() const override
Definition: Encoder.cpp:221
void dump(int indent=0, std::ostream &os=std::cout) const override
Definition: Encoder.cpp:348
void sourceBufferSetNew(std::vector< SourceDestBuffer > &sbufs) override
Definition: Encoder.cpp:272
size_t outputGetMaxSize() override
Definition: Encoder.cpp:283
unsigned sourceBufferNextIndex() override
Definition: Encoder.cpp:211
BitpackEncoder(unsigned bytestreamNumber, SourceDestBuffer &sbuf, unsigned outputMaxSize, unsigned alignmentSize)
================
Definition: Encoder.cpp:204
std::vector< char > outBuffer_
Definition: Encoder.h:100
void outputClear() override
get data from encoder
Definition: Encoder.cpp:266
void outputRead(char *dest, const size_t byteCount) override
number of bytes that can be read
Definition: Encoder.cpp:226
void outBufferShiftDown()
Definition: Encoder.cpp:298
size_t outBufferEnd_
Definition: Encoder.h:102
uint64_t currentRecordIndex() override
Definition: Encoder.cpp:216
FloatPrecision precision_
Definition: Encoder.h:122
uint64_t processRecords(size_t recordCount) override
Definition: Encoder.cpp:382
void dump(int indent=0, std::ostream &os=std::cout) const override
Definition: Encoder.cpp:461
BitpackFloatEncoder(unsigned bytestreamNumber, SourceDestBuffer &sbuf, unsigned outputMaxSize, FloatPrecision precision)
Definition: Encoder.cpp:374
float bitsPerRecord() override
Definition: Encoder.cpp:455
bool registerFlushToOutput() override
Definition: Encoder.cpp:449
void dump(int indent=0, std::ostream &os=std::cout) const override
Definition: Encoder.cpp:853
BitpackIntegerEncoder(bool isScaledInteger, unsigned bytestreamNumber, SourceDestBuffer &sbuf, unsigned outputMaxSize, int64_t minimum, int64_t maximum, double scale, double offset)
Definition: Encoder.cpp:636
bool registerFlushToOutput() override
Definition: Encoder.cpp:819
float bitsPerRecord() override
Definition: Encoder.cpp:847
uint64_t processRecords(size_t recordCount) override
Definition: Encoder.cpp:657
float bitsPerRecord() override
Definition: Encoder.cpp:609
bool registerFlushToOutput() override
Definition: Encoder.cpp:603
void dump(int indent=0, std::ostream &os=std::cout) const override
Definition: Encoder.cpp:622
uint64_t processRecords(size_t recordCount) override
Definition: Encoder.cpp:484
uint64_t totalBytesProcessed_
Definition: Encoder.h:138
BitpackStringEncoder(unsigned bytestreamNumber, SourceDestBuffer &sbuf, unsigned outputMaxSize)
Definition: Encoder.cpp:477
ConstantIntegerEncoder(unsigned bytestreamNumber, SourceDestBuffer &sbuf, int64_t minimum)
Definition: Encoder.cpp:872
void outputRead(char *dest, const size_t byteCount) override
number of bytes that can be read
Definition: Encoder.cpp:928
std::shared_ptr< SourceDestBufferImpl > sourceBuffer_
Definition: Encoder.h:193
size_t outputGetMaxSize() override
Definition: Encoder.cpp:952
bool registerFlushToOutput() override
Definition: Encoder.cpp:917
unsigned sourceBufferNextIndex() override
Definition: Encoder.cpp:901
size_t outputAvailable() const override
Definition: Encoder.cpp:922
void dump(int indent=0, std::ostream &os=std::cout) const override
Definition: Encoder.cpp:964
void sourceBufferSetNew(std::vector< SourceDestBuffer > &sbufs) override
Definition: Encoder.cpp:941
uint64_t processRecords(size_t recordCount) override
Definition: Encoder.cpp:877
uint64_t currentRecordIndex() override
Definition: Encoder.cpp:906
float bitsPerRecord() override
Definition: Encoder.cpp:911
void outputSetMaxSize(unsigned byteCount) override
Definition: Encoder.cpp:958
void outputClear() override
get data from encoder
Definition: Encoder.cpp:937
virtual size_t outputGetMaxSize()=0
virtual size_t outputAvailable() const =0
virtual void outputRead(char *dest, const size_t byteCount)=0
number of bytes that can be read
static std::shared_ptr< Encoder > EncoderFactory(unsigned bytestreamNumber, std::shared_ptr< CompressedVectorNodeImpl > cVector, std::vector< SourceDestBuffer > &sbuf, ustring &codecPath)
Definition: Encoder.cpp:42
virtual void dump(int indent=0, std::ostream &os=std::cout) const
Definition: Encoder.cpp:196
virtual uint64_t processRecords(size_t recordCount)=0
virtual void sourceBufferSetNew(std::vector< SourceDestBuffer > &sbufs)=0
virtual uint64_t currentRecordIndex()=0
virtual ~Encoder()=default
virtual void outputSetMaxSize(unsigned byteCount)=0
virtual bool registerFlushToOutput()=0
virtual float bitsPerRecord()=0
unsigned bytestreamNumber_
Definition: Encoder.h:68
virtual unsigned sourceBufferNextIndex()=0
virtual void outputClear()=0
get data from encoder
Encoder(unsigned bytestreamNumber)
Definition: Encoder.cpp:191
unsigned bytestreamNumber() const
Definition: Encoder.h:57
FloatPrecision
The IEEE floating point number precisions supported.
Definition: E57Format.h:71
std::string ustring
UTF-8 encodeded Unicode string.
Definition: E57Format.h:54