25 #include "libsigrok-internal.h"
28 #define LOG_PREFIX "filter: "
29 #define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args)
30 #define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args)
31 #define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args)
32 #define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args)
33 #define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args)
34 #define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args)
102 const GArray *probe_array,
const uint8_t *data_in,
103 uint64_t length_in, uint8_t **data_out,
104 uint64_t *length_out)
106 unsigned int in_offset, out_offset;
107 int *probelist, out_bit;
109 uint64_t sample_in, sample_out;
112 sr_err(
"%s: probe_array was NULL", __func__);
115 probelist = (
int *)probe_array->data;
118 sr_err(
"%s: data_in was NULL", __func__);
123 sr_err(
"%s: data_out was NULL", __func__);
128 sr_err(
"%s: length_out was NULL", __func__);
133 if (probe_array->len > out_unitsize * 8) {
134 sr_err(
"%s: too many probes (%d) for the target unit "
135 "size (%d)", __func__, probe_array->len, out_unitsize);
139 if (!(*data_out = g_try_malloc(length_in))) {
140 sr_err(
"%s: data_out malloc failed", __func__);
144 if (probe_array->len == in_unitsize * 8) {
146 memcpy(*data_out, data_in, length_in);
147 *length_out = length_in;
152 in_offset = out_offset = 0;
153 while (in_offset <= length_in - in_unitsize) {
154 memcpy(&sample_in, data_in + in_offset, in_unitsize);
155 sample_out = out_bit = 0;
156 for (i = 0; i < probe_array->len; i++) {
157 if (sample_in & (1 << (probelist[i])))
158 sample_out |= (1 << out_bit);
161 memcpy((*data_out) + out_offset, &sample_out, out_unitsize);
162 in_offset += in_unitsize;
163 out_offset += out_unitsize;
165 *length_out = out_offset;