8 #include <ecl/dbobjects/ECLDspData.h>
14 const int N_CHANNELS = 16;
15 int size = src.size();
27 for (
int i = size - 1; i >= 0; i--) {
28 if (i >= 2 * N_CHANNELS)
29 dst[i] = src[i] - 2 * src[i - N_CHANNELS] + src[i - 2 * N_CHANNELS];
30 else if (i >= N_CHANNELS)
31 dst[i] = src[i] - 2 * src[i - N_CHANNELS];
47 const int value_bits = 4;
48 const long value_max = 0xF;
49 const int values_packed =
sizeof(short) * 8 / value_bits;
53 std::vector<short> packed(size / values_packed, 0);
56 for (
int i = 0; i < size; i++) {
57 short val = dst[i] - shift;
58 if (val >= 0 && val < value_max) {
60 packed[i / values_packed] |= val << (value_bits * (i % values_packed));
62 if (len >= 0 && len < i) {
65 packed[i / values_packed] |= short(value_max) << (value_bits * (i % values_packed));
72 dst.resize(len + packed.size());
73 packed_size = packed.size();
74 for (
int i = 0; i < packed_size; i++) {
75 dst[len + i] = packed[i];
78 dst.push_back(packed_size);
84 const int N_CHANNELS = 16;
89 if (packer_version == 1) {
90 dst_size = src.size();
93 if (packer_version >= 2) {
95 const int value_bits = 4;
96 const long value_max = 0xF;
97 const int values_packed =
sizeof(short) * 8 / value_bits;
99 int size = src.size();
100 int packed_size = src[--size];
102 int packed_start = size - packed_size;
103 dst_size = packed_size * values_packed;
105 dst.resize(dst_size);
107 if (packed_size > 0) {
108 int unpacked_index = 0;
110 const int shift = -6;
112 for (
int i = packed_start; i < size; i++) {
113 auto package = src[i];
114 for (
int k = 0; k < values_packed; k++) {
115 short val =
package & value_max;
116 if (val != value_max) {
117 dst[dst_index++] = val + shift;
119 dst[dst_index++] = src[unpacked_index++];
121 package >>= value_bits;
131 if (packer_version == 0) {
133 }
else if (packer_version >= 1) {
134 const std::vector<short int>& new_src = packer_version >= 2 ? dst : src;
136 for (
int i = 0; i < dst_size; i++) {
137 if (i >= 2 * N_CHANNELS)
138 dst[i] = new_src[i] + 2 * dst[i - N_CHANNELS] - dst[i - 2 * N_CHANNELS];
139 else if (i >= N_CHANNELS)
140 dst[i] = new_src[i] + 2 * dst[i - N_CHANNELS];
std::vector< short int > m_extraData
This vector contains all parameters that didn't exist in the initial version of ECL DSP file format.
void packCoefVector(const std::vector< short int > &src, std::vector< short int > &dst)
Convert vector of DSP coefficients (src) to ECLDspData internal format (dst).
static constexpr short int getPackerVersion()
GETTERS.
void unpackCoefVector(const std::vector< short int > &src, std::vector< short int > &dst) const
Convert vector of DSP coefficients (src) to ECLDspData internal format (dst).
Abstract base class for different kinds of events.