154 lines
4.8 KiB
C
154 lines
4.8 KiB
C
/*
|
|
* Copyright (C) 2012 Texas Instruments Inc
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation version 2.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* Contributors:
|
|
* Manjunath Hadli <manjunath.hadli@ti.com>
|
|
* Prabhakar Lad <prabhakar.lad@ti.com>
|
|
*/
|
|
|
|
#ifndef _DAVINCI_VPFE_VIDEO_H
|
|
#define _DAVINCI_VPFE_VIDEO_H
|
|
|
|
#include <media/videobuf2-v4l2.h>
|
|
#include <media/videobuf2-dma-contig.h>
|
|
|
|
struct vpfe_device;
|
|
|
|
/*
|
|
* struct vpfe_video_operations - VPFE video operations
|
|
* @queue: Resume streaming when a buffer is queued. Called on VIDIOC_QBUF
|
|
* if there was no buffer previously queued.
|
|
*/
|
|
struct vpfe_video_operations {
|
|
int (*queue)(struct vpfe_device *vpfe_dev, unsigned long addr);
|
|
};
|
|
|
|
enum vpfe_pipeline_stream_state {
|
|
VPFE_PIPELINE_STREAM_STOPPED = 0,
|
|
VPFE_PIPELINE_STREAM_CONTINUOUS = 1,
|
|
VPFE_PIPELINE_STREAM_SINGLESHOT = 2,
|
|
};
|
|
|
|
enum vpfe_video_state {
|
|
/* indicates that buffer is not queued */
|
|
VPFE_VIDEO_BUFFER_NOT_QUEUED = 0,
|
|
/* indicates that buffer is queued */
|
|
VPFE_VIDEO_BUFFER_QUEUED = 1,
|
|
};
|
|
|
|
struct vpfe_pipeline {
|
|
/* media pipeline */
|
|
struct media_pipeline *pipe;
|
|
struct media_graph graph;
|
|
/* state of the pipeline, continuous,
|
|
* single-shot or stopped
|
|
*/
|
|
enum vpfe_pipeline_stream_state state;
|
|
/* number of active input video entities */
|
|
unsigned int input_num;
|
|
/* number of active output video entities */
|
|
unsigned int output_num;
|
|
/* input video nodes in case of single-shot mode */
|
|
struct vpfe_video_device *inputs[10];
|
|
/* capturing video nodes */
|
|
struct vpfe_video_device *outputs[10];
|
|
};
|
|
|
|
#define to_vpfe_pipeline(__e) \
|
|
container_of((__e)->pipe, struct vpfe_pipeline, pipe)
|
|
|
|
#define to_vpfe_video(vdev) \
|
|
container_of(vdev, struct vpfe_video_device, video_dev)
|
|
|
|
struct vpfe_cap_buffer {
|
|
struct vb2_v4l2_buffer vb;
|
|
struct list_head list;
|
|
};
|
|
|
|
struct vpfe_video_device {
|
|
/* vpfe device */
|
|
struct vpfe_device *vpfe_dev;
|
|
/* video dev */
|
|
struct video_device video_dev;
|
|
/* media pad of video entity */
|
|
struct media_pad pad;
|
|
/* video operations supported by video device */
|
|
const struct vpfe_video_operations *ops;
|
|
/* type of the video buffers used by user */
|
|
enum v4l2_buf_type type;
|
|
/* Indicates id of the field which is being captured */
|
|
u32 field_id;
|
|
/* pipeline for which video device is part of */
|
|
struct vpfe_pipeline pipe;
|
|
/* Indicates whether streaming started */
|
|
u8 started;
|
|
/* Indicates state of the stream */
|
|
unsigned int state;
|
|
/* current input at the sub device */
|
|
int current_input;
|
|
/*
|
|
* This field keeps track of type of buffer exchange mechanism
|
|
* user has selected
|
|
*/
|
|
enum v4l2_memory memory;
|
|
/* number of open instances of the channel */
|
|
u32 usrs;
|
|
/* flag to indicate whether decoder is initialized */
|
|
u8 initialized;
|
|
/* skip frame count */
|
|
u8 skip_frame_count;
|
|
/* skip frame count init value */
|
|
u8 skip_frame_count_init;
|
|
/* time per frame for skipping */
|
|
struct v4l2_fract timeperframe;
|
|
/* ptr to currently selected sub device */
|
|
struct vpfe_ext_subdev_info *current_ext_subdev;
|
|
/* Pointer pointing to current vpfe_cap_buffer */
|
|
struct vpfe_cap_buffer *cur_frm;
|
|
/* Pointer pointing to next vpfe_cap_buffer */
|
|
struct vpfe_cap_buffer *next_frm;
|
|
/* Used to store pixel format */
|
|
struct v4l2_format fmt;
|
|
struct vb2_queue buffer_queue;
|
|
/* Queue of filled frames */
|
|
struct list_head dma_queue;
|
|
spinlock_t irqlock;
|
|
/* IRQ lock for DMA queue */
|
|
spinlock_t dma_queue_lock;
|
|
/* lock used to access this structure */
|
|
struct mutex lock;
|
|
/* number of users performing IO */
|
|
u32 io_usrs;
|
|
/* Currently selected or default standard */
|
|
v4l2_std_id stdid;
|
|
/*
|
|
* offset where second field starts from the starting of the
|
|
* buffer for field separated YCbCr formats
|
|
*/
|
|
u32 field_off;
|
|
};
|
|
|
|
int vpfe_video_is_pipe_ready(struct vpfe_pipeline *pipe);
|
|
void vpfe_video_unregister(struct vpfe_video_device *video);
|
|
int vpfe_video_register(struct vpfe_video_device *video,
|
|
struct v4l2_device *vdev);
|
|
int vpfe_video_init(struct vpfe_video_device *video, const char *name);
|
|
void vpfe_video_process_buffer_complete(struct vpfe_video_device *video);
|
|
void vpfe_video_schedule_bottom_field(struct vpfe_video_device *video);
|
|
void vpfe_video_schedule_next_buffer(struct vpfe_video_device *video);
|
|
|
|
#endif /* _DAVINCI_VPFE_VIDEO_H */
|