void vsp1_pipeline_reset(struct vsp1_pipeline *pipe)
{
+ unsigned int i;
+
if (pipe->bru) {
struct vsp1_bru *bru = to_bru(&pipe->bru->subdev);
- unsigned int i;
for (i = 0; i < ARRAY_SIZE(bru->inputs); ++i)
bru->inputs[i].rpf = NULL;
}
+ for (i = 0; i < ARRAY_SIZE(pipe->inputs); ++i)
+ pipe->inputs[i] = NULL;
+
INIT_LIST_HEAD(&pipe->entities);
pipe->state = VSP1_PIPELINE_STOPPED;
pipe->buffers_ready = 0;
* @stream_count: number of streaming video nodes
* @buffers_ready: bitmask of RPFs and WPFs with at least one buffer available
* @num_inputs: number of RPFs
- * @inputs: array of RPFs in the pipeline
+ * @inputs: array of RPFs in the pipeline (indexed by RPF index)
* @output: WPF at the output of the pipeline
* @bru: BRU entity, if present
* @lif: LIF entity, if present
if (e->type == VSP1_ENTITY_RPF) {
rwpf = to_rwpf(subdev);
- pipe->inputs[pipe->num_inputs++] = rwpf;
- rwpf->video->pipe_index = pipe->num_inputs;
+ pipe->inputs[rwpf->entity.index] = rwpf;
+ rwpf->video->pipe_index = ++pipe->num_inputs;
} else if (e->type == VSP1_ENTITY_WPF) {
rwpf = to_rwpf(subdev);
pipe->output = rwpf;
/* Follow links downstream for each input and make sure the graph
* contains no loop and that all branches end at the output WPF.
*/
- for (i = 0; i < pipe->num_inputs; ++i) {
+ for (i = 0; i < video->vsp1->pdata.rpf_count; ++i) {
+ if (!pipe->inputs[i])
+ continue;
+
ret = vsp1_video_pipeline_validate_branch(pipe, pipe->inputs[i],
pipe->output);
if (ret < 0)
static void vsp1_video_pipeline_frame_end(struct vsp1_pipeline *pipe)
{
+ struct vsp1_device *vsp1 = pipe->output->entity.vsp1;
unsigned int i;
/* Complete buffers on all video nodes. */
- for (i = 0; i < pipe->num_inputs; ++i)
+ for (i = 0; i < vsp1->pdata.rpf_count; ++i) {
+ if (!pipe->inputs[i])
+ continue;
+
vsp1_video_frame_end(pipe, pipe->inputs[i]);
+ }
if (!pipe->lif)
vsp1_video_frame_end(pipe, pipe->output);
* inputs as sub-layers and select the virtual RPF as the master
* layer.
*/
- for (i = 0; i < pipe->num_inputs; ++i) {
+ for (i = 0; i < vsp1->pdata.rpf_count; ++i) {
struct vsp1_rwpf *input = pipe->inputs[i];
+ if (!input)
+ continue;
+
srcrpf |= (!pipe->bru && pipe->num_inputs == 1)
? VI6_WPF_SRCRPF_RPF_ACT_MST(input->entity.index)
: VI6_WPF_SRCRPF_RPF_ACT_SUB(input->entity.index);