summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/block_handlers.cpp2
-rw-r--r--lib/block_task.cpp28
-rw-r--r--lib/element_impl.hpp2
3 files changed, 15 insertions, 17 deletions
diff --git a/lib/block_handlers.cpp b/lib/block_handlers.cpp
index 73dc20a..d63c1a9 100644
--- a/lib/block_handlers.cpp
+++ b/lib/block_handlers.cpp
@@ -134,6 +134,7 @@ void ElementImpl::topology_update(const tsbe::TaskInterface &task_iface)
this->work_input_items.resize(num_inputs);
this->work_output_items.resize(num_outputs);
this->work_ninput_items.resize(num_inputs);
+ this->fcast_ninput_items.resize(num_inputs);
this->input_items.resize(num_inputs);
this->output_items.resize(num_outputs);
this->consume_items.resize(num_inputs, 0);
@@ -141,6 +142,7 @@ void ElementImpl::topology_update(const tsbe::TaskInterface &task_iface)
this->input_queues.resize(num_inputs);
this->output_queues.resize(num_outputs);
this->output_bytes_offset.resize(num_outputs, 0);
+ this->forecast_enable = not this->enable_fixed_rate;
this->input_tokens.resize(num_inputs);
this->output_tokens.resize(num_outputs);
diff --git a/lib/block_task.cpp b/lib/block_task.cpp
index 5b3ae00..b9347e8 100644
--- a/lib/block_task.cpp
+++ b/lib/block_task.cpp
@@ -157,26 +157,20 @@ void ElementImpl::handle_task(const tsbe::TaskInterface &task_iface)
//-- forecast
//------------------------------------------------------------------
forecast_again_you_jerk:
- if (not this->enable_fixed_rate)
+ if (this->forecast_enable)
{
- block_ptr->forecast(num_output_items, work_ninput_items);
+ fcast_ninput_items = work_ninput_items;
+ block_ptr->forecast(num_output_items, fcast_ninput_items);
for (size_t i = 0; i < num_inputs; i++)
{
- if (size_t(work_ninput_items[i]) > this->input_items[i].size())
- {
- for (size_t j = 0; j < num_inputs; j++)
- {
- work_ninput_items[j] = this->input_items[j]._len;
- }
- num_output_items = num_output_items/2;
- if (num_output_items == 0)
- {
- this->forecast_fail = true;
- this->conclusion(task_iface, inputs_done);
- return;
- }
- goto forecast_again_you_jerk;
- }
+ if (fcast_ninput_items[i] <= work_ninput_items[i]) continue;
+
+ num_output_items = num_output_items/2; //backoff regime
+ if (num_output_items) goto forecast_again_you_jerk;
+
+ this->forecast_fail = true;
+ this->conclusion(task_iface, inputs_done);
+ return;
}
}
this->forecast_fail = false;
diff --git a/lib/element_impl.hpp b/lib/element_impl.hpp
index cf7f164..6a9c088 100644
--- a/lib/element_impl.hpp
+++ b/lib/element_impl.hpp
@@ -64,6 +64,7 @@ struct ElementImpl
std::vector<const void *> work_input_items;
std::vector<void *> work_output_items;
std::vector<int> work_ninput_items;
+ std::vector<int> fcast_ninput_items;
//work buffers for the new work interface
Block::InputItems input_items;
@@ -130,6 +131,7 @@ struct ElementImpl
bool enable_fixed_rate;
double relative_rate;
bool forecast_fail;
+ bool forecast_enable;
};
} //namespace gnuradio