blob: 673cefe3ef61f1091578679667a7901954054e90 [file] [log] [blame]
/*
* 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;
/* 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;
/* allocator-specific contexts for each plane */
struct vb2_alloc_ctx *alloc_ctx;
/* 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 */