mirror of https://gitee.com/openkylin/linux.git
[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: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
parent
2f2db2f206
commit
3f725b7eee
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue