* @param new_probes A GHashTable of probes to set. Key is probe name, value is
* the probe number. Samples passed to this instance will be
* arranged in this order.
+ * @param unit_size Number of bytes per sample in the data stream to be passed
+ * to the decoder. The highest probe index specified in the
+ * probe map must lie within a sample unit.
*
* @return SRD_OK upon success, a (negative) error code otherwise.
*
* @since 0.1.0
*/
SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di,
- GHashTable *new_probes)
+ GHashTable *new_probes, int unit_size)
{
GVariant *probe_val;
GList *l;
GSList *sl;
struct srd_probe *p;
- int *new_probemap, new_probenum, num_required_probes, num_probes, i;
+ int *new_probemap, new_probenum, num_required_probes, i;
char *probe_id;
srd_dbg("set probes called for instance %s with list of %d probes",
for (i = 0; i < di->dec_num_probes; i++)
new_probemap[i] = -1;
- num_probes = 0;
for (l = g_hash_table_get_keys(new_probes); l; l = l->next) {
probe_id = l->data;
probe_val = g_hash_table_lookup(new_probes, probe_id);
return SRD_ERR_ARG;
}
new_probenum = g_variant_get_int32(probe_val);
+ if (new_probenum >= 8 * unit_size) {
+ srd_err("Probe index %d not within data unit (%d bit).",
+ new_probenum, 8 * unit_size);
+ g_free(new_probemap);
+ return SRD_ERR_ARG;
+ }
if (!(sl = g_slist_find_custom(di->decoder->probes, probe_id,
(GCompareFunc)compare_probe_id))) {
/* Fall back on optional probes. */
new_probemap[p->order] = new_probenum;
srd_dbg("Setting probe mapping: %s (index %d) = probe %d.",
p->id, p->order, new_probenum);
- num_probes++;
}
- di->data_unitsize = (num_probes + 7) / 8;
+ di->data_unitsize = unit_size;
srd_dbg("Final probe map:");
num_required_probes = g_slist_length(di->decoder->probes);
SRD_API int srd_inst_option_set(struct srd_decoder_inst *di,
GHashTable *options);
SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di,
- GHashTable *probes);
+ GHashTable *probes, int unit_size);
SRD_API struct srd_decoder_inst *srd_inst_new(struct srd_session *sess,
const char *id, GHashTable *options);
SRD_API int srd_inst_stack(struct srd_session *sess,
/**
* Send a chunk of logic sample data to a running decoder session.
*
- * The logic samples must be arranged in probe order, in the least
- * amount of space possible. If no probes were configured, the default
+ * If no probe map has been set up, the logic samples must be arranged
+ * in probe order, in the least amount of space possible. The default
* probe set consists of all required probes + all optional probes.
*
- * The size of a sample in inbuf is the minimum number of bytes needed
- * to store the configured (or default) probes.
+ * The size of a sample in inbuf is the unit size passed to
+ * srd_inst_probe_set_all(). If no probe map has been configured, it is
+ * the minimum number of bytes needed to store the default probes.
*
* @param sess The session to use.
* @param start_samplenum The sample number of the first sample in this chunk.
GHashTable *probes, *opts;
GSList *pdl, *l;
int idx;
+ int max_probe;
char **decoder_class;
if (op->outfile) {
if (pd->probes) {
probes = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
(GDestroyNotify)g_variant_unref);
+ max_probe = 0;
for (l = pd->probes; l; l = l->next) {
probe = l->data;
+ if (probe->probe > max_probe)
+ max_probe = probe->probe;
gvar = g_variant_new_int32(probe->probe);
g_variant_ref_sink(gvar);
g_hash_table_insert(probes, probe->name, gvar);
}
- if (srd_inst_probe_set_all(di, probes) != SRD_OK)
+ if (srd_inst_probe_set_all(di, probes,
+ (max_probe + 8) / 8) != SRD_OK)
return FALSE;
g_hash_table_destroy(probes);
}