Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f725b7e authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab
Browse files

[media] v4l: vsp1: Decouple pipeline end of frame processing from vsp1_video



To make the pipeline structure and operations usable without video
devices the frame end processing must be decoupled from struct
vsp1_video. Implement this by calling the video frame end function
indirectly through a function pointer in struct vsp1_pipeline.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 2f2db2f2
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -633,8 +633,9 @@ vsp1_video_complete_buffer(struct vsp1_video *video)
}

static void vsp1_video_frame_end(struct vsp1_pipeline *pipe,
				 struct vsp1_video *video)
				 struct vsp1_rwpf *rwpf)
{
	struct vsp1_video *video = rwpf->video;
	struct vsp1_vb2_buffer *buf;
	unsigned long flags;

@@ -650,21 +651,28 @@ static void vsp1_video_frame_end(struct vsp1_pipeline *pipe,
	spin_unlock_irqrestore(&pipe->irqlock, flags);
}

static void vsp1_video_pipeline_frame_end(struct vsp1_pipeline *pipe)
{
	unsigned int i;

	/* Complete buffers on all video nodes. */
	for (i = 0; i < pipe->num_inputs; ++i)
		vsp1_video_frame_end(pipe, pipe->inputs[i]);

	if (!pipe->lif)
		vsp1_video_frame_end(pipe, pipe->output);
}

void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe)
{
	enum vsp1_pipeline_state state;
	unsigned long flags;
	unsigned int i;

	if (pipe == NULL)
		return;

	/* Complete buffers on all video nodes. */
	for (i = 0; i < pipe->num_inputs; ++i)
		vsp1_video_frame_end(pipe, pipe->inputs[i]->video);

	if (!pipe->lif)
		vsp1_video_frame_end(pipe, pipe->output->video);
	/* Signal frame end to the pipeline handler. */
	pipe->frame_end(pipe);

	spin_lock_irqsave(&pipe->irqlock, flags);

@@ -1240,6 +1248,7 @@ struct vsp1_video *vsp1_video_create(struct vsp1_device *vsp1,
	INIT_LIST_HEAD(&video->pipe.entities);
	init_waitqueue_head(&video->pipe.wq);
	video->pipe.state = VSP1_PIPELINE_STOPPED;
	video->pipe.frame_end = vsp1_video_pipeline_frame_end;

	/* Initialize the media entity... */
	ret = media_entity_pads_init(&video->video.entity, 1, &video->pad);
+2 −0
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ struct vsp1_pipeline {
	enum vsp1_pipeline_state state;
	wait_queue_head_t wq;

	void (*frame_end)(struct vsp1_pipeline *pipe);

	struct mutex lock;
	unsigned int use_count;
	unsigned int stream_count;