media: dvb: mpq: Add support for dvb/video

Support for dvb/video interface for Qualcomm 8960 platform.
This code provides standard DVB Video API and
its extensions for broadcast scenario.
Refer http://linuxtv.org/ for complete API specification.

Change-Id: Ie60aa0719c6c7d9ab5d473382e3ef229c8b02be2
Signed-off-by: Ananda Kishore <kananda@codeaurora.org>
diff --git a/include/linux/dvb/video.h b/include/linux/dvb/video.h
index 1d750c0..81475c2 100644
--- a/include/linux/dvb/video.h
+++ b/include/linux/dvb/video.h
@@ -57,6 +57,19 @@
 	VIDEO_CENTER_CUT_OUT  /* use center cut out format */
 } video_displayformat_t;
 
+enum video_codec_t {
+	VIDEO_CODECTYPE_NONE,
+	VIDEO_CODECTYPE_MPEG2,
+	VIDEO_CODECTYPE_MPEG4,
+	VIDEO_CODECTYPE_H264,
+	VIDEO_CODECTYPE_VC1
+};
+
+enum video_out_format_t {
+	VIDEO_YUV_FORMAT_NV12,
+	VIDEO_YUV_FORMAT_TILE_4x2
+};
+
 typedef struct {
 	int w;
 	int h;
@@ -84,12 +97,29 @@
 #define VIDEO_CMD_FREEZE      (2)
 #define VIDEO_CMD_CONTINUE    (3)
 
+#define VIDEO_CMD_SET_CODEC           (4)
+#define VIDEO_CMD_GET_CODEC           (5)
+#define VIDEO_CMD_SET_OUTPUT_FORMAT   (6)
+#define VIDEO_CMD_GET_OUTPUT_FORMAT   (7)
+#define VIDEO_CMD_GET_BUFFER_REQ      (8)
+#define VIDEO_CMD_SET_INPUT_BUFFERS   (9)
+#define VIDEO_CMD_SET_OUTPUT_BUFFERS  (10)
+#define VIDEO_CMD_READ_RAW_OUTPUT     (11)
+#define VIDEO_CMD_GET_PIC_RES         (12)
+#define VIDEO_CMD_FREE_INPUT_BUFFERS  (13)
+#define VIDEO_CMD_FREE_OUTPUT_BUFFERS (14)
+#define VIDEO_CMD_GET_H264_MV_BUFFER  (15)
+#define VIDEO_CMD_SET_H264_MV_BUFFER  (16)
+#define VIDEO_CMD_FREE_H264_MV_BUFFER (17)
+#define VIDEO_CMD_CLEAR_INPUT_BUFFER  (18)
+#define VIDEO_CMD_CLEAR_OUTPUT_BUFFER (19)
+
 /* Flags for VIDEO_CMD_FREEZE */
-#define VIDEO_CMD_FREEZE_TO_BLACK     	(1 << 0)
+#define VIDEO_CMD_FREEZE_TO_BLACK	(1 << 0)
 
 /* Flags for VIDEO_CMD_STOP */
-#define VIDEO_CMD_STOP_TO_BLACK      	(1 << 0)
-#define VIDEO_CMD_STOP_IMMEDIATELY     	(1 << 1)
+#define VIDEO_CMD_STOP_TO_BLACK		(1 << 0)
+#define VIDEO_CMD_STOP_IMMEDIATELY	(1 << 1)
 
 /* Play input formats: */
 /* The decoder has no special format requirements */
@@ -97,6 +127,56 @@
 /* The decoder requires full GOPs */
 #define VIDEO_PLAY_FMT_GOP          (1)
 
+/* Picture Resolution for Video Data */
+struct video_pic_res {
+	unsigned int width;
+	unsigned int height;
+	unsigned int stride;
+	unsigned int scan_lines;
+};
+
+/* Video Buffer Properties */
+struct video_buffer_prop {
+	unsigned int alignment;
+	unsigned int buf_poolid;
+	size_t buf_size;
+};
+
+/* Buffer Requirements from Video Decoder */
+struct video_buffer_req {
+	unsigned int num_input_buffers;  /* Number of Input Buffers */
+	unsigned int num_output_buffers; /* Number of Output Buffers */
+	struct video_buffer_prop input_buf_prop; /* Input Buffer Properties */
+	struct video_buffer_prop output_buf_prop; /* Output Buffer Prop */
+};
+
+/* Video Data Buffer Structure for Input and Output */
+struct video_data_buffer {
+	void __user *bufferaddr; /* Pointer to Buffer */
+	size_t buffer_len;       /* Length of Buffer */
+	int ion_fd;             /* file Descriptor */
+	size_t offset;
+	size_t mmaped_size;
+	void *client_data;
+	void *ip_buffer_tag;
+	__u64 pts;
+};
+
+struct video_h264_mv {
+	size_t size;
+	int count;
+	int ion_fd;
+	int offset;
+};
+
+struct video_mv_buff_size {
+	int width;
+	int height;
+	int size;
+	int alignment;
+};
+
+
 /* The structure must be zeroed before use by the application
    This ensures it can be extended safely in the future. */
 struct video_command {
@@ -112,11 +192,23 @@
 			   1 specifies forward single stepping,
 			   -1 specifies backward single stepping,
 			   >1: playback at speed/1000 of the normal speed,
-			   <-1: reverse playback at (-speed/1000) of the normal speed. */
+			   <-1: reverse playback at (-speed/1000) of
+				the normal speed. */
 			__s32 speed;
 			__u32 format;
 		} play;
 
+		union {
+			enum video_codec_t codec; /* Video Codec Type */
+			enum video_out_format_t format; /* YUV Format */
+			struct video_pic_res frame_res; /* Frame Resolution */
+			/* Buffer Requirements for Video Decoder */
+			struct video_buffer_req buf_req;
+			struct video_data_buffer buffer; /* Buffer Details */
+			struct video_mv_buff_size mv_buffer_req;
+			struct video_h264_mv mv_buffer_prop;
+		};
+
 		struct {
 			__u32 data[16];
 		} raw;
@@ -126,22 +218,47 @@
 /* FIELD_UNKNOWN can be used if the hardware does not know whether
    the Vsync is for an odd, even or progressive (i.e. non-interlaced)
    field. */
-#define VIDEO_VSYNC_FIELD_UNKNOWN  	(0)
-#define VIDEO_VSYNC_FIELD_ODD 		(1)
+#define VIDEO_VSYNC_FIELD_UNKNOWN	(0)
+#define VIDEO_VSYNC_FIELD_ODD		(1)
 #define VIDEO_VSYNC_FIELD_EVEN		(2)
 #define VIDEO_VSYNC_FIELD_PROGRESSIVE	(3)
 
 struct video_event {
 	__s32 type;
-#define VIDEO_EVENT_SIZE_CHANGED	1
-#define VIDEO_EVENT_FRAME_RATE_CHANGED	2
-#define VIDEO_EVENT_DECODER_STOPPED 	3
-#define VIDEO_EVENT_VSYNC 		4
+#define VIDEO_EVENT_SIZE_CHANGED	(1)
+#define VIDEO_EVENT_FRAME_RATE_CHANGED	(2)
+#define VIDEO_EVENT_DECODER_STOPPED	(3)
+#define VIDEO_EVENT_VSYNC		(4)
+#define VIDEO_EVENT_DECODER_PLAYING     (5)
+#define VIDEO_EVENT_DECODER_FREEZED     (6)
+#define VIDEO_EVENT_DECODER_RESUMED     (7)
+#define VIDEO_EVENT_INPUT_BUFFER_DONE   (8)
+#define VIDEO_EVENT_SEQ_HDR_FOUND       (9)
+#define VIDEO_EVENT_OUTPUT_BUFFER_DONE  (10)
+#define VIDEO_EVENT_OUTPUT_FLUSH_DONE   (11)
+#define VIDEO_EVENT_INPUT_FLUSH_DONE    (12)
+#define VIDEO_EVENT_INPUT_FLUSHED       (13)
+#define VIDEO_EVENT_OUTPUT_FLUSHED      (14)
+
+
+	unsigned int    status;
+#define VIDEO_STATUS_SUCESS             0
+#define VIDEO_STATUS_BITSTREAM_ERROR    1
+#define VIDEO_STATUS_FAILED             2
+#define VIDEO_STATUS_NORESOURCE         3
+#define VIDEO_STATUS_INVALID_CMD        4
+#define VIDEO_STATUS_INVALID_PARAM      5
+#define VIDEO_STATUS_INVALID_STATE      6
+#define VIDEO_STATUS_BUSY               7
+#define VIDEO_STATUS_INVALID_HANDLE     8
+#define VIDEO_STATUS_NO_SUPPORT         9
 	__kernel_time_t timestamp;
+
 	union {
 		video_size_t size;
 		unsigned int frame_rate;	/* in frames per 1000sec */
-		unsigned char vsync_field;	/* unknown/odd/even/progressive */
+		unsigned char vsync_field; /* unknown/odd/even/progressive */
+		struct video_data_buffer buffer; /* Output Buffer Details */
 	} u;
 };
 
@@ -149,8 +266,8 @@
 struct video_status {
 	int                   video_blank;   /* blank video on freeze? */
 	video_play_state_t    play_state;    /* current state of playback */
-	video_stream_source_t stream_source; /* current source (demux/memory) */
-	video_format_t        video_format;  /* current aspect ratio of stream*/
+	video_stream_source_t stream_source;/* current source (demux/memory) */
+	video_format_t        video_format; /* current aspect ratio of stream*/
 	video_displayformat_t display_format;/* selected cropping mode */
 };
 
@@ -160,7 +277,6 @@
 	__s32 size;
 };
 
-
 typedef
 struct video_highlight {
 	int     active;      /*    1=show highlight, 0=hide highlight */
@@ -268,9 +384,9 @@
 #define VIDEO_GET_PTS              _IOR('o', 57, __u64)
 
 /* Read the number of displayed frames since the decoder was started */
-#define VIDEO_GET_FRAME_COUNT  	   _IOR('o', 58, __u64)
+#define VIDEO_GET_FRAME_COUNT	   _IOR('o', 58, __u64)
 
-#define VIDEO_COMMAND     	   _IOWR('o', 59, struct video_command)
-#define VIDEO_TRY_COMMAND 	   _IOWR('o', 60, struct video_command)
+#define VIDEO_COMMAND		   _IOWR('o', 59, struct video_command)
+#define VIDEO_TRY_COMMAND	   _IOWR('o', 60, struct video_command)
 
 #endif /*_DVBVIDEO_H_*/