1 #include <ecl/dbobjects/ECLDspData.h>
7 const int N_CHANNELS = 16;
18 for (
int i = size - 1; i >= 0; i--) {
19 if (i >= 2 * N_CHANNELS)
20 dst[i] = src[i] - 2 * src[i - N_CHANNELS] + src[i - 2 * N_CHANNELS];
21 else if (i >= N_CHANNELS)
22 dst[i] = src[i] - 2 * src[i - N_CHANNELS];
37 const int value_bits = 4;
38 const long value_max = 0xF;
39 const int values_packed =
sizeof(short) * 8 / value_bits;
43 std::vector<short> packed(size / values_packed);
45 for (
int i = 0; i < size; i++) {
46 if (i % values_packed == 0) packed[i / values_packed] = 0;
48 short val = dst[i] - shift;
49 if (val >= 0 && val < value_max) {
51 packed[i / values_packed] |= val << (value_bits * (i % values_packed));
53 if (len >= 0 && len < i) {
56 packed[i / values_packed] |= short(value_max) << (value_bits * (i % values_packed));
63 dst.resize(len + packed.size());
64 packed_size = packed.size();
65 for (
int i = 0; i < packed_size; i++) {
66 dst[len + i] = packed[i];
69 dst.push_back(packed_size);
74 const int N_CHANNELS = 16;
79 if (packer_version == 1) {
80 dst_size = src.size();
83 if (packer_version >= 2) {
85 const int value_bits = 4;
86 const long value_max = 0xF;
87 const int values_packed =
sizeof(short) * 8 / value_bits;
89 int size = src.size();
90 int packed_size = src[--size];
92 int packed_start = size - packed_size;
93 dst_size = packed_size * values_packed;
97 if (packed_size > 0) {
98 int unpacked_index = 0;
100 const int shift = -6;
102 for (
int i = packed_start; i < size; i++) {
103 auto package = src[i];
104 for (
int k = 0; k < values_packed; k++) {
105 short val =
package & value_max;
106 if (val != value_max) {
107 dst[dst_index++] = val + shift;
109 dst[dst_index++] = src[unpacked_index++];
111 package >>= value_bits;
121 if (packer_version == 0) {
123 }
else if (packer_version >= 1) {
124 const std::vector<short int>& new_src = packer_version >= 2 ? dst : src;
126 for (
int i = 0; i < dst_size; i++) {
127 if (i >= 2 * N_CHANNELS)
128 dst[i] = new_src[i] + 2 * dst[i - N_CHANNELS] - dst[i - 2 * N_CHANNELS];
129 else if (i >= N_CHANNELS)
130 dst[i] = new_src[i] + 2 * dst[i - N_CHANNELS];