24 #include "sigrok-internal.h"
77 const int *probelist,
const uint8_t *data_in,
78 uint64_t length_in, uint8_t **data_out,
81 unsigned int in_offset, out_offset;
82 int num_enabled_probes, out_bit, i;
83 uint64_t sample_in, sample_out;
86 sr_err(
"filter: %s: probelist was NULL", __func__);
91 sr_err(
"filter: %s: data_in was NULL", __func__);
96 sr_err(
"filter: %s: data_out was NULL", __func__);
101 sr_err(
"filter: %s: length_out was NULL", __func__);
105 num_enabled_probes = 0;
106 for (i = 0; probelist[i]; i++)
107 num_enabled_probes++;
110 if (num_enabled_probes > out_unitsize * 8) {
111 sr_err(
"filter: %s: too many probes (%d) for the target unit "
112 "size (%d)", num_enabled_probes, out_unitsize, __func__);
116 if (!(*data_out = g_try_malloc(length_in))) {
117 sr_err(
"filter: %s: data_out malloc failed", __func__);
121 if (num_enabled_probes == in_unitsize * 8) {
123 memcpy(*data_out, data_in, length_in);
124 *length_out = length_in;
129 in_offset = out_offset = 0;
130 while (in_offset <= length_in - in_unitsize) {
131 memcpy(&sample_in, data_in + in_offset, in_unitsize);
132 sample_out = out_bit = 0;
133 for (i = 0; probelist[i]; i++) {
134 if (sample_in & (1 << (probelist[i] - 1)))
135 sample_out |= (1 << out_bit);
138 memcpy((*data_out) + out_offset, &sample_out, out_unitsize);
139 in_offset += in_unitsize;
140 out_offset += out_unitsize;
142 *length_out = out_offset;