Home | History | Annotate | Download | only in linux
      1 /* Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved.
      2  *
      3  * Redistribution and use in source and binary forms, with or without
      4  * modification, are permitted provided that the following conditions are met:
      5  *     * Redistributions of source code must retain the above copyright
      6  *       notice, this list of conditions and the following disclaimer.
      7  *     * Redistributions in binary form must reproduce the above copyright
      8  *       notice, this list of conditions and the following disclaimer in the
      9  *       documentation and/or other materials provided with the distribution.
     10  *     * Neither the name of Code Aurora nor
     11  *       the names of its contributors may be used to endorse or promote
     12  *       products derived from this software without specific prior written
     13  *       permission.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     17  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     18  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  *
     27  */
     28 
     29 #ifndef _MSM_VENC_H_
     30 #define _MSM_VENC_H_
     31 
     32 #include <linux/types.h>
     33 
     34 #define VENC_MAX_RECON_BUFFERS 2
     35 
     36 #define VENC_FLAG_EOS                   0x00000001
     37 #define VENC_FLAG_END_OF_FRAME          0x00000010
     38 #define VENC_FLAG_SYNC_FRAME            0x00000020
     39 #define VENC_FLAG_EXTRA_DATA            0x00000040
     40 #define VENC_FLAG_CODEC_CONFIG          0x00000080
     41 
     42 enum venc_flush_type {
     43 	VENC_FLUSH_INPUT,
     44 	VENC_FLUSH_OUTPUT,
     45 	VENC_FLUSH_ALL
     46 };
     47 
     48 enum venc_state_type {
     49 	VENC_STATE_PAUSE = 0x1,
     50 	VENC_STATE_START = 0x2,
     51 	VENC_STATE_STOP = 0x4
     52 };
     53 
     54 enum venc_event_type_enum {
     55 	VENC_EVENT_START_STATUS,
     56 	VENC_EVENT_STOP_STATUS,
     57 	VENC_EVENT_SUSPEND_STATUS,
     58 	VENC_EVENT_RESUME_STATUS,
     59 	VENC_EVENT_FLUSH_STATUS,
     60 	VENC_EVENT_RELEASE_INPUT,
     61 	VENC_EVENT_DELIVER_OUTPUT,
     62 	VENC_EVENT_UNKNOWN_STATUS
     63 };
     64 
     65 enum venc_status_code {
     66 	VENC_STATUS_SUCCESS,
     67 	VENC_STATUS_ERROR,
     68 	VENC_STATUS_INVALID_STATE,
     69 	VENC_STATUS_FLUSHING,
     70 	VENC_STATUS_INVALID_PARAM,
     71 	VENC_STATUS_CMD_QUEUE_FULL,
     72 	VENC_STATUS_CRITICAL,
     73 	VENC_STATUS_INSUFFICIENT_RESOURCES,
     74 	VENC_STATUS_TIMEOUT
     75 };
     76 
     77 enum venc_msg_code {
     78 	VENC_MSG_INDICATION,
     79 	VENC_MSG_INPUT_BUFFER_DONE,
     80 	VENC_MSG_OUTPUT_BUFFER_DONE,
     81 	VENC_MSG_NEED_OUTPUT_BUFFER,
     82 	VENC_MSG_FLUSH,
     83 	VENC_MSG_START,
     84 	VENC_MSG_STOP,
     85 	VENC_MSG_PAUSE,
     86 	VENC_MSG_RESUME,
     87 	VENC_MSG_STOP_READING_MSG
     88 };
     89 
     90 enum venc_error_code {
     91 	VENC_S_SUCCESS,
     92 	VENC_S_EFAIL,
     93 	VENC_S_EFATAL,
     94 	VENC_S_EBADPARAM,
     95 	VENC_S_EINVALSTATE,
     96 	VENC_S_ENOSWRES,
     97 	VENC_S_ENOHWRES,
     98 	VENC_S_EBUFFREQ,
     99 	VENC_S_EINVALCMD,
    100 	VENC_S_ETIMEOUT,
    101 	VENC_S_ENOREATMPT,
    102 	VENC_S_ENOPREREQ,
    103 	VENC_S_ECMDQFULL,
    104 	VENC_S_ENOTSUPP,
    105 	VENC_S_ENOTIMPL,
    106 	VENC_S_ENOTPMEM,
    107 	VENC_S_EFLUSHED,
    108 	VENC_S_EINSUFBUF,
    109 	VENC_S_ESAMESTATE,
    110 	VENC_S_EINVALTRANS
    111 };
    112 
    113 enum venc_mem_region_enum {
    114 	VENC_PMEM_EBI1,
    115 	VENC_PMEM_SMI
    116 };
    117 
    118 struct venc_buf_type {
    119 	unsigned int region;
    120 	unsigned int phys;
    121 	unsigned int size;
    122 	int offset;
    123 };
    124 
    125 struct venc_qp_range {
    126 	unsigned int min_qp;
    127 	unsigned int max_qp;
    128 };
    129 
    130 struct venc_frame_rate {
    131 	unsigned int frame_rate_num;
    132 	unsigned int frame_rate_den;
    133 };
    134 
    135 struct venc_slice_info {
    136 	unsigned int slice_mode;
    137 	unsigned int units_per_slice;
    138 };
    139 
    140 struct venc_extra_data {
    141 	unsigned int slice_extra_data_flag;
    142 	unsigned int slice_client_data1;
    143 	unsigned int slice_client_data2;
    144 	unsigned int slice_client_data3;
    145 	unsigned int none_extra_data_flag;
    146 	unsigned int none_client_data1;
    147 	unsigned int none_client_data2;
    148 	unsigned int none_client_data3;
    149 };
    150 
    151 struct venc_common_config {
    152 	unsigned int standard;
    153 	unsigned int input_frame_height;
    154 	unsigned int input_frame_width;
    155 	unsigned int output_frame_height;
    156 	unsigned int output_frame_width;
    157 	unsigned int rotation_angle;
    158 	unsigned int intra_period;
    159 	unsigned int rate_control;
    160 	struct venc_frame_rate frame_rate;
    161 	unsigned int bitrate;
    162 	struct venc_qp_range qp_range;
    163 	unsigned int iframe_qp;
    164 	unsigned int pframe_qp;
    165 	struct venc_slice_info slice_config;
    166 	struct venc_extra_data extra_data;
    167 };
    168 
    169 struct venc_nonio_buf_config {
    170 	struct venc_buf_type recon_buf1;
    171 	struct venc_buf_type recon_buf2;
    172 	struct venc_buf_type wb_buf;
    173 	struct venc_buf_type cmd_buf;
    174 	struct venc_buf_type vlc_buf;
    175 };
    176 
    177 struct venc_mpeg4_config {
    178 	unsigned int profile;
    179 	unsigned int level;
    180 	unsigned int time_resolution;
    181 	unsigned int ac_prediction;
    182 	unsigned int hec_interval;
    183 	unsigned int data_partition;
    184 	unsigned int short_header;
    185 	unsigned int rvlc_enable;
    186 };
    187 
    188 struct venc_h263_config {
    189 	unsigned int profile;
    190 	unsigned int level;
    191 };
    192 
    193 struct venc_h264_config {
    194 	unsigned int profile;
    195 	unsigned int level;
    196 	unsigned int max_nal;
    197 	unsigned int idr_period;
    198 };
    199 
    200 struct venc_pmem {
    201 	int src;
    202 	int fd;
    203 	unsigned int offset;
    204 	void *virt;
    205 	void *phys;
    206 	unsigned int size;
    207 };
    208 
    209 struct venc_buffer {
    210 	unsigned char *ptr_buffer;
    211 	unsigned int size;
    212 	unsigned int len;
    213 	unsigned int offset;
    214 	long long time_stamp;
    215 	unsigned int flags;
    216 	unsigned int client_data;
    217 };
    218 
    219 struct venc_buffers {
    220 	struct venc_pmem recon_buf[VENC_MAX_RECON_BUFFERS];
    221 	struct venc_pmem wb_buf;
    222 	struct venc_pmem cmd_buf;
    223 	struct venc_pmem vlc_buf;
    224 };
    225 
    226 struct venc_buffer_flush {
    227 	unsigned int flush_mode;
    228 };
    229 
    230 union venc_msg_data {
    231 	struct venc_buffer buf;
    232 	struct venc_buffer_flush flush_ret;
    233 };
    234 
    235 struct venc_msg {
    236 	unsigned int status_code;
    237 	unsigned int msg_code;
    238 	union venc_msg_data msg_data;
    239 	unsigned int msg_data_size;
    240 };
    241 
    242 union venc_codec_config {
    243 	struct venc_mpeg4_config mpeg4_params;
    244 	struct venc_h263_config h263_params;
    245 	struct venc_h264_config h264_params;
    246 };
    247 
    248 struct venc_q6_config {
    249 	struct venc_common_config config_params;
    250 	union venc_codec_config codec_params;
    251 	struct venc_nonio_buf_config buf_params;
    252 	void *callback_event;
    253 };
    254 
    255 struct venc_hdr_config {
    256 	struct venc_common_config config_params;
    257 	union venc_codec_config codec_params;
    258 };
    259 
    260 struct venc_init_config {
    261 	struct venc_q6_config q6_config;
    262 	struct venc_buffers q6_bufs;
    263 };
    264 
    265 struct venc_seq_config {
    266 	int size;
    267 	struct venc_pmem buf;
    268 	struct venc_q6_config q6_config;
    269 };
    270 
    271 #define VENC_IOCTL_MAGIC 'V'
    272 
    273 #define VENC_IOCTL_CMD_READ_NEXT_MSG \
    274 	_IOWR(VENC_IOCTL_MAGIC, 1, struct venc_msg)
    275 
    276 #define VENC_IOCTL_CMD_STOP_READ_MSG  _IO(VENC_IOCTL_MAGIC, 2)
    277 
    278 #define VENC_IOCTL_SET_INPUT_BUFFER \
    279 	_IOW(VENC_IOCTL_MAGIC, 3, struct venc_pmem)
    280 
    281 #define VENC_IOCTL_SET_OUTPUT_BUFFER \
    282 	_IOW(VENC_IOCTL_MAGIC, 4, struct venc_pmem)
    283 
    284 #define VENC_IOCTL_CMD_START _IOW(VENC_IOCTL_MAGIC, 5, struct venc_init_config)
    285 
    286 #define VENC_IOCTL_CMD_ENCODE_FRAME \
    287 	_IOW(VENC_IOCTL_MAGIC, 6, struct venc_buffer)
    288 
    289 #define VENC_IOCTL_CMD_FILL_OUTPUT_BUFFER \
    290 	_IOW(VENC_IOCTL_MAGIC, 7, struct venc_buffer)
    291 
    292 #define VENC_IOCTL_CMD_FLUSH \
    293 	_IOW(VENC_IOCTL_MAGIC, 8, struct venc_buffer_flush)
    294 
    295 #define VENC_IOCTL_CMD_PAUSE _IO(VENC_IOCTL_MAGIC, 9)
    296 
    297 #define VENC_IOCTL_CMD_RESUME _IO(VENC_IOCTL_MAGIC, 10)
    298 
    299 #define VENC_IOCTL_CMD_STOP _IO(VENC_IOCTL_MAGIC, 11)
    300 
    301 #define VENC_IOCTL_SET_INTRA_PERIOD \
    302 	_IOW(VENC_IOCTL_MAGIC, 12, int)
    303 
    304 #define VENC_IOCTL_CMD_REQUEST_IFRAME _IO(VENC_IOCTL_MAGIC, 13)
    305 
    306 #define VENC_IOCTL_GET_SEQUENCE_HDR \
    307 	_IOWR(VENC_IOCTL_MAGIC, 14, struct venc_seq_config)
    308 
    309 #define VENC_IOCTL_SET_INTRA_REFRESH \
    310 	_IOW(VENC_IOCTL_MAGIC, 15, int)
    311 
    312 #define VENC_IOCTL_SET_FRAME_RATE \
    313 	_IOW(VENC_IOCTL_MAGIC, 16, struct venc_frame_rate)
    314 
    315 #define VENC_IOCTL_SET_TARGET_BITRATE \
    316 	_IOW(VENC_IOCTL_MAGIC, 17, int)
    317 
    318 #define VENC_IOCTL_SET_QP_RANGE \
    319 	_IOW(VENC_IOCTL_MAGIC, 18, struct venc_qp_range)
    320 
    321 #endif
    322