+ DecoderStack *const ds = (DecoderStack*)decoder_stack;
+ assert(ds);
+
+ lock_guard<mutex> lock(ds->output_mutex_);
+
+ const Annotation a(pdata);
+
+ // Find the row
+ assert(pdata->pdo);
+ assert(pdata->pdo->di);
+ const srd_decoder *const decc = pdata->pdo->di->decoder;
+ assert(decc);
+
+ auto row_iter = ds->rows_.end();
+
+ // Try looking up the sub-row of this class
+ const auto r = ds->class_rows_.find(make_pair(decc, a.format()));
+ if (r != ds->class_rows_.end())
+ row_iter = ds->rows_.find((*r).second);
+ else {
+ // Failing that, use the decoder as a key
+ row_iter = ds->rows_.find(Row(decc));
+ }
+
+ assert(row_iter != ds->rows_.end());
+ if (row_iter == ds->rows_.end()) {
+ qDebug() << "Unexpected annotation: decoder = " << decc <<
+ ", format = " << a.format();
+ assert(false);
+ return;
+ }
+
+ // Add the annotation
+ (*row_iter).second.push_annotation(a);