C++程序  |  231行  |  6.13 KB

/* Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of Code Aurora nor
 *       the names of its contributors may be used to endorse or promote
 *       products derived from this software without specific prior written
 *       permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef _MSM_VDEC_H_
#define _MSM_VDEC_H_

#include <linux/types.h>

#define VDEC_IOCTL_MAGIC 'v'

#define VDEC_IOCTL_INITIALIZE   _IOWR(VDEC_IOCTL_MAGIC, 1, struct vdec_init)
#define VDEC_IOCTL_SETBUFFERS   _IOW(VDEC_IOCTL_MAGIC, 2, struct vdec_buffer)
#define VDEC_IOCTL_QUEUE        _IOWR(VDEC_IOCTL_MAGIC, 3, \
					struct vdec_input_buf)
#define VDEC_IOCTL_REUSEFRAMEBUFFER  _IOW(VDEC_IOCTL_MAGIC, 4, unsigned int)
#define VDEC_IOCTL_FLUSH        _IOW(VDEC_IOCTL_MAGIC, 5, unsigned int)
#define VDEC_IOCTL_EOS          _IO(VDEC_IOCTL_MAGIC, 6)
#define VDEC_IOCTL_GETMSG       _IOR(VDEC_IOCTL_MAGIC, 7, struct vdec_msg)
#define VDEC_IOCTL_CLOSE        _IO(VDEC_IOCTL_MAGIC, 8)
#define VDEC_IOCTL_FREEBUFFERS  _IOW(VDEC_IOCTL_MAGIC, 9, struct vdec_buf_info)
#define VDEC_IOCTL_GETDECATTRIBUTES   _IOR(VDEC_IOCTL_MAGIC, 10, \
						struct vdec_dec_attributes)

enum {
	VDEC_FRAME_DECODE_OK,
	VDEC_FRAME_DECODE_ERR,
	VDEC_FATAL_ERR,
	VDEC_FLUSH_FINISH,
	VDEC_EOS,
	VDEC_FRAME_FLUSH,
	VDEC_STREAM_SWITCH,
	VDEC_SUSPEND_FINISH,
	VDEC_BUFFER_CONSUMED
};

enum {
	VDEC_FLUSH_INPUT,
	VDEC_FLUSH_OUTPUT,
	VDEC_FLUSH_ALL
};

enum {
	VDEC_BUFFER_TYPE_INPUT,
	VDEC_BUFFER_TYPE_OUTPUT,
	VDEC_BUFFER_TYPE_INTERNAL1,
	VDEC_BUFFER_TYPE_INTERNAL2,
};

enum {
	VDEC_QUEUE_SUCCESS,
	VDEC_QUEUE_FAILED,
	VDEC_QUEUE_BADSTATE,
};

struct vdec_input_buf_info {
	u32 offset;
	u32 data;
	u32 size;
	int timestamp_lo;
	int timestamp_hi;
	int avsync_state;
	u32 flags;
};

struct vdec_buf_desc {
	u32 bufsize;
	u32 num_min_buffers;
	u32 num_max_buffers;
};

struct vdec_buf_req {
	u32 max_input_queue_size;
	struct vdec_buf_desc input;
	struct vdec_buf_desc output;
	struct vdec_buf_desc dec_req1;
	struct vdec_buf_desc dec_req2;
};

struct vdec_region_info {
	u32 src_id;
	u32 offset;
	u32 size;
};

struct vdec_config {
	u32 fourcc;		/* video format */
	u32 width;		/* source width */
	u32 height;		/* source height */
	u32 order;		/* render decoder order */
	u32 notify_enable;	/* enable notify input buffer done event */
	u32 vc1_rowbase;
	u32 h264_startcode_detect;
	u32 h264_nal_len_size;
	u32 postproc_flag;
	u32 fruc_enable;
	u32 reserved;
};

struct vdec_vc1_panscan_regions {
	int num;
	int width[4];
	int height[4];
	int xoffset[4];
	int yoffset[4];
};

struct vdec_cropping_window {
	u32 x1;
	u32 y1;
	u32 x2;
	u32 y2;
};

struct vdec_frame_info {
	u32 status;		/* video decode status */
	u32 offset;		/* buffer offset */
	u32 data1;		/* user data field 1 */
	u32 data2;		/* user data field 2 */
	int timestamp_lo;	/* lower 32 bits timestamp, in msec */
	int timestamp_hi;	/* higher 32 bits timestamp, in msec */
	int cal_timestamp_lo;	/* lower 32 bits cal timestamp, in msec */
	int cal_timestamp_hi;	/* higher  32 bits cal timestamp, in msec */
	u32 dec_width;		/* frame roi width */
	u32 dec_height;		/* frame roi height */
	struct vdec_cropping_window cwin;	/* The frame cropping window */
	u32 picture_type[2];	/* picture coding type */
	u32 picture_format;	/* picture coding format */
	u32 vc1_rangeY;		/* luma range mapping */
	u32 vc1_rangeUV;	/* chroma range mapping */
	u32 picture_resolution;	/* scaling factor */
	u32 frame_disp_repeat;	/* how often repeated by disp */
	u32 repeat_first_field;	/* repeat 1st field after 2nd */
	u32 top_field_first;	/* top field displayed first */
	u32 interframe_interp;	/* not for inter-frame interp */
	struct vdec_vc1_panscan_regions panscan;	/* pan region */
	u32 concealed_macblk_num;	/* number of concealed macro blk */
	u32 flags;		/* input flags */
	u32 performance_stats;	/* performance statistics returned by decoder */
	u32 data3;		/* user data field 3 */
};

struct vdec_buf_info {
	u32 buf_type;
	struct vdec_region_info region;
	u32 num_buf;
	u32 islast;
};

struct vdec_buffer {
	u32 pmem_id;
	struct vdec_buf_info buf;
};

struct vdec_sequence {
	u8 *header;
	u32 len;
};

struct vdec_config_sps {
	struct vdec_config cfg;
	struct vdec_sequence seq;
};

#define VDEC_MSG_REUSEINPUTBUFFER 	1
#define VDEC_MSG_FRAMEDONE 		2

struct vdec_msg {
	u32 id;

	union {
		/* id = VDEC_MSG_REUSEINPUTBUFFER */
		u32 buf_id;
		/* id = VDEC_MSG_FRAMEDONE */
		struct vdec_frame_info vfr_info;
	};
};

struct vdec_init {
	struct vdec_config_sps sps_cfg;
	struct vdec_buf_req *buf_req;
};

struct vdec_input_buf {
	u32 pmem_id;
	struct vdec_input_buf_info buffer;
	struct vdec_queue_status *queue_status;
};

struct vdec_queue_status {
	u32 status;
};

struct vdec_dec_attributes {
	u32 fourcc;
	u32 profile;
	u32 level;
	u32 dec_pic_width;
	u32 dec_pic_height;
	struct vdec_buf_desc input;
	struct vdec_buf_desc output;
	struct vdec_buf_desc dec_req1;
	struct vdec_buf_desc dec_req2;
};

#endif /* _MSM_VDEC_H_ */