rvl_codec.cpp
Go to the documentation of this file.
1 // The following code is a C++ wrapper of the code presented by
2 // Andrew D. Wilson in "Fast Lossless Depth Image Compression" at SIGCHI'17.
3 // The original code is licensed under the MIT License.
4 
5 #include "compressed_depth_image_transport/rvl_codec.h"
6 
8 {
10 {
11 }
12 
13 void RvlCodec::EncodeVLE(int value)
14 {
15  do
16  {
17  int nibble = value & 0x7; // lower 3 bits
18  if (value >>= 3)
19  nibble |= 0x8; // more to come
20  word_ <<= 4;
21  word_ |= nibble;
22  if (++nibblesWritten_ == 8) // output word
23  {
24  *pBuffer_++ = word_;
25  nibblesWritten_ = 0;
26  word_ = 0;
27  }
28  } while (value);
29 }
30 
32 {
33  unsigned int nibble;
34  int value = 0, bits = 29;
35  do
36  {
37  if (!nibblesWritten_)
38  {
39  word_ = *pBuffer_++; // load word
40  nibblesWritten_ = 8;
41  }
42  nibble = word_ & 0xf0000000;
43  value |= (nibble << 1) >> bits;
44  word_ <<= 4;
46  bits -= 3;
47  } while (nibble & 0x80000000);
48  return value;
49 }
50 
51 int RvlCodec::CompressRVL(const unsigned short* input, unsigned char* output, int numPixels)
52 {
53  buffer_ = pBuffer_ = (int*)output;
54  nibblesWritten_ = 0;
55  const unsigned short* end = input + numPixels;
56  unsigned short previous = 0;
57  while (input != end)
58  {
59  int zeros = 0, nonzeros = 0;
60  for (; (input != end) && !*input; input++, zeros++)
61  ;
62  EncodeVLE(zeros); // number of zeros
63  for (const unsigned short* p = input; (p != end) && *p++; nonzeros++)
64  ;
65  EncodeVLE(nonzeros); // number of nonzeros
66  for (int i = 0; i < nonzeros; i++)
67  {
68  unsigned short current = *input++;
69  int delta = current - previous;
70  int positive = (delta << 1) ^ (delta >> 31);
71  EncodeVLE(positive); // nonzero value
72  previous = current;
73  }
74  }
75  if (nibblesWritten_) // last few values
76  *pBuffer_++ = word_ << 4 * (8 - nibblesWritten_);
77  return int((unsigned char*)pBuffer_ - (unsigned char*)buffer_); // num bytes
78 }
79 
80 void RvlCodec::DecompressRVL(const unsigned char* input, unsigned short* output, int numPixels)
81 {
82  buffer_ = pBuffer_ = const_cast<int*>(reinterpret_cast<const int*>(input));
83  nibblesWritten_ = 0;
84  unsigned short current, previous = 0;
85  int numPixelsToDecode = numPixels;
86  while (numPixelsToDecode)
87  {
88  int zeros = DecodeVLE(); // number of zeros
89  numPixelsToDecode -= zeros;
90  for (; zeros; zeros--)
91  *output++ = 0;
92  int nonzeros = DecodeVLE(); // number of nonzeros
93  numPixelsToDecode -= nonzeros;
94  for (; nonzeros; nonzeros--)
95  {
96  int positive = DecodeVLE(); // nonzero value
97  int delta = (positive >> 1) ^ -(positive & 1);
98  current = previous + delta;
99  *output++ = current;
100  previous = current;
101  }
102  }
103 }
104 
105 } // namespace compressed_depth_image_transport
compressed_depth_image_transport::RvlCodec::CompressRVL
int CompressRVL(const unsigned short *input, unsigned char *output, int numPixels)
Definition: rvl_codec.cpp:51
compressed_depth_image_transport::RvlCodec::DecodeVLE
int DecodeVLE()
Definition: rvl_codec.cpp:31
compressed_depth_image_transport
compressed_depth_image_transport::RvlCodec::EncodeVLE
void EncodeVLE(int value)
Definition: rvl_codec.cpp:13
compressed_depth_image_transport::RvlCodec::RvlCodec
RvlCodec()
Definition: rvl_codec.cpp:9
compressed_depth_image_transport::RvlCodec::DecompressRVL
void DecompressRVL(const unsigned char *input, unsigned short *output, int numPixels)
Definition: rvl_codec.cpp:80
compressed_depth_image_transport::RvlCodec::nibblesWritten_
int nibblesWritten_
Definition: rvl_codec.h:28
compressed_depth_image_transport::RvlCodec::pBuffer_
int * pBuffer_
Definition: rvl_codec.h:26
compressed_depth_image_transport::RvlCodec::buffer_
int * buffer_
Definition: rvl_codec.h:25
compressed_depth_image_transport::RvlCodec::word_
int word_
Definition: rvl_codec.h:27


adi_3dtof_adtf31xx
Author(s):
autogenerated on Sat May 17 2025 02:12:30