- list_for_each_entry(fn, &fci->filters, node) {
- int ret;
- if (*loaded && fn->loaded < fn->bufsize) {
- size_t old_fn_loaded = fn->loaded;
- PARA_DEBUG_LOG("fc %p loaded: %d, calling %s convert\n", fci, *loaded, fn->filter->name);
- ret = fn->filter->convert(ib, *loaded, fn);
- if (ret < 0) {
- if (!fci->error)
- fci->error = -ret;
- return ret;
- }
- call_callbacks(fn, ib, ret, fn->buf + old_fn_loaded, fn->loaded - old_fn_loaded);
- *loaded -= ret;
- conv += ret;
- if (*loaded && ret) {
- PARA_DEBUG_LOG("moving %d bytes in input buffer for %s filter\n",
- *loaded, fn->filter->name);
- memmove(ib, ib + ret, *loaded);
+ FOR_EACH_FILTER_NODE(fn, fc, i) {
+ struct filter *f = filters + fn->filter_num;
+ if (fn->loaded < fn->bufsize) {
+ size_t size, old_fn_loaded = fn->loaded;
+// PARA_DEBUG_LOG("fc %p loaded: %zd, calling %s convert\n",
+// fc, *loaded, fn->filter->name);
+ t->error = f->convert(ib, *loaded, fn);
+ if (t->error < 0)
+ return;
+ size = t->error;
+ call_callbacks(fn, ib, size, fn->buf + old_fn_loaded,
+ fn->loaded - old_fn_loaded);
+ *loaded -= size;
+ conv += size;
+ if (*loaded && size) {
+// PARA_DEBUG_LOG("moving %zd bytes in input "
+// "buffer for %s filter\n",
+// *loaded, fn->filter->name);
+ memmove(ib, ib + size, *loaded);