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_VDEC_H_ 30 #define _MSM_VDEC_H_ 31 32 #include <linux/types.h> 33 34 #define VDEC_IOCTL_MAGIC 'v' 35 36 #define VDEC_IOCTL_INITIALIZE _IOWR(VDEC_IOCTL_MAGIC, 1, struct vdec_init) 37 #define VDEC_IOCTL_SETBUFFERS _IOW(VDEC_IOCTL_MAGIC, 2, struct vdec_buffer) 38 #define VDEC_IOCTL_QUEUE _IOWR(VDEC_IOCTL_MAGIC, 3, \ 39 struct vdec_input_buf) 40 #define VDEC_IOCTL_REUSEFRAMEBUFFER _IOW(VDEC_IOCTL_MAGIC, 4, unsigned int) 41 #define VDEC_IOCTL_FLUSH _IOW(VDEC_IOCTL_MAGIC, 5, unsigned int) 42 #define VDEC_IOCTL_EOS _IO(VDEC_IOCTL_MAGIC, 6) 43 #define VDEC_IOCTL_GETMSG _IOR(VDEC_IOCTL_MAGIC, 7, struct vdec_msg) 44 #define VDEC_IOCTL_CLOSE _IO(VDEC_IOCTL_MAGIC, 8) 45 #define VDEC_IOCTL_FREEBUFFERS _IOW(VDEC_IOCTL_MAGIC, 9, struct vdec_buf_info) 46 #define VDEC_IOCTL_GETDECATTRIBUTES _IOR(VDEC_IOCTL_MAGIC, 10, \ 47 struct vdec_dec_attributes) 48 49 enum { 50 VDEC_FRAME_DECODE_OK, 51 VDEC_FRAME_DECODE_ERR, 52 VDEC_FATAL_ERR, 53 VDEC_FLUSH_FINISH, 54 VDEC_EOS, 55 VDEC_FRAME_FLUSH, 56 VDEC_STREAM_SWITCH, 57 VDEC_SUSPEND_FINISH, 58 VDEC_BUFFER_CONSUMED 59 }; 60 61 enum { 62 VDEC_FLUSH_INPUT, 63 VDEC_FLUSH_OUTPUT, 64 VDEC_FLUSH_ALL 65 }; 66 67 enum { 68 VDEC_BUFFER_TYPE_INPUT, 69 VDEC_BUFFER_TYPE_OUTPUT, 70 VDEC_BUFFER_TYPE_INTERNAL1, 71 VDEC_BUFFER_TYPE_INTERNAL2, 72 }; 73 74 enum { 75 VDEC_QUEUE_SUCCESS, 76 VDEC_QUEUE_FAILED, 77 VDEC_QUEUE_BADSTATE, 78 }; 79 80 struct vdec_input_buf_info { 81 u32 offset; 82 u32 data; 83 u32 size; 84 int timestamp_lo; 85 int timestamp_hi; 86 int avsync_state; 87 u32 flags; 88 }; 89 90 struct vdec_buf_desc { 91 u32 bufsize; 92 u32 num_min_buffers; 93 u32 num_max_buffers; 94 }; 95 96 struct vdec_buf_req { 97 u32 max_input_queue_size; 98 struct vdec_buf_desc input; 99 struct vdec_buf_desc output; 100 struct vdec_buf_desc dec_req1; 101 struct vdec_buf_desc dec_req2; 102 }; 103 104 struct vdec_region_info { 105 u32 src_id; 106 u32 offset; 107 u32 size; 108 }; 109 110 struct vdec_config { 111 u32 fourcc; /* video format */ 112 u32 width; /* source width */ 113 u32 height; /* source height */ 114 u32 order; /* render decoder order */ 115 u32 notify_enable; /* enable notify input buffer done event */ 116 u32 vc1_rowbase; 117 u32 h264_startcode_detect; 118 u32 h264_nal_len_size; 119 u32 postproc_flag; 120 u32 fruc_enable; 121 u32 reserved; 122 }; 123 124 struct vdec_vc1_panscan_regions { 125 int num; 126 int width[4]; 127 int height[4]; 128 int xoffset[4]; 129 int yoffset[4]; 130 }; 131 132 struct vdec_cropping_window { 133 u32 x1; 134 u32 y1; 135 u32 x2; 136 u32 y2; 137 }; 138 139 struct vdec_frame_info { 140 u32 status; /* video decode status */ 141 u32 offset; /* buffer offset */ 142 u32 data1; /* user data field 1 */ 143 u32 data2; /* user data field 2 */ 144 int timestamp_lo; /* lower 32 bits timestamp, in msec */ 145 int timestamp_hi; /* higher 32 bits timestamp, in msec */ 146 int cal_timestamp_lo; /* lower 32 bits cal timestamp, in msec */ 147 int cal_timestamp_hi; /* higher 32 bits cal timestamp, in msec */ 148 u32 dec_width; /* frame roi width */ 149 u32 dec_height; /* frame roi height */ 150 struct vdec_cropping_window cwin; /* The frame cropping window */ 151 u32 picture_type[2]; /* picture coding type */ 152 u32 picture_format; /* picture coding format */ 153 u32 vc1_rangeY; /* luma range mapping */ 154 u32 vc1_rangeUV; /* chroma range mapping */ 155 u32 picture_resolution; /* scaling factor */ 156 u32 frame_disp_repeat; /* how often repeated by disp */ 157 u32 repeat_first_field; /* repeat 1st field after 2nd */ 158 u32 top_field_first; /* top field displayed first */ 159 u32 interframe_interp; /* not for inter-frame interp */ 160 struct vdec_vc1_panscan_regions panscan; /* pan region */ 161 u32 concealed_macblk_num; /* number of concealed macro blk */ 162 u32 flags; /* input flags */ 163 u32 performance_stats; /* performance statistics returned by decoder */ 164 u32 data3; /* user data field 3 */ 165 }; 166 167 struct vdec_buf_info { 168 u32 buf_type; 169 struct vdec_region_info region; 170 u32 num_buf; 171 u32 islast; 172 }; 173 174 struct vdec_buffer { 175 u32 pmem_id; 176 struct vdec_buf_info buf; 177 }; 178 179 struct vdec_sequence { 180 u8 *header; 181 u32 len; 182 }; 183 184 struct vdec_config_sps { 185 struct vdec_config cfg; 186 struct vdec_sequence seq; 187 }; 188 189 #define VDEC_MSG_REUSEINPUTBUFFER 1 190 #define VDEC_MSG_FRAMEDONE 2 191 192 struct vdec_msg { 193 u32 id; 194 195 union { 196 /* id = VDEC_MSG_REUSEINPUTBUFFER */ 197 u32 buf_id; 198 /* id = VDEC_MSG_FRAMEDONE */ 199 struct vdec_frame_info vfr_info; 200 }; 201 }; 202 203 struct vdec_init { 204 struct vdec_config_sps sps_cfg; 205 struct vdec_buf_req *buf_req; 206 }; 207 208 struct vdec_input_buf { 209 u32 pmem_id; 210 struct vdec_input_buf_info buffer; 211 struct vdec_queue_status *queue_status; 212 }; 213 214 struct vdec_queue_status { 215 u32 status; 216 }; 217 218 struct vdec_dec_attributes { 219 u32 fourcc; 220 u32 profile; 221 u32 level; 222 u32 dec_pic_width; 223 u32 dec_pic_height; 224 struct vdec_buf_desc input; 225 struct vdec_buf_desc output; 226 struct vdec_buf_desc dec_req1; 227 struct vdec_buf_desc dec_req2; 228 }; 229 230 #endif /* _MSM_VDEC_H_ */ 231