1 #ifndef __MEDIA_INFO_H__ 2 #define __MEDIA_INFO_H__ 3 4 #ifndef MSM_MEDIA_ALIGN 5 #define MSM_MEDIA_ALIGN(__sz, __align) (((__sz) + (__align-1)) & (~(__align-1))) 6 #endif 7 8 enum color_fmts { 9 /* Venus NV12: 10 * YUV 4:2:0 image with a plane of 8 bit Y samples followed 11 * by an interleaved U/V plane containing 8 bit 2x2 subsampled 12 * colour difference samples. 13 * 14 * <-------- Y/UV_Stride --------> 15 * <------- Width -------> 16 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X ^ ^ 17 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | 18 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X Height | 19 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | Y_Scanlines 20 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | 21 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | 22 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | 23 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X V | 24 * X X X X X X X X X X X X X X X X | 25 * X X X X X X X X X X X X X X X X | 26 * X X X X X X X X X X X X X X X X | 27 * X X X X X X X X X X X X X X X X V 28 * U V U V U V U V U V U V X X X X ^ 29 * U V U V U V U V U V U V X X X X | 30 * U V U V U V U V U V U V X X X X | 31 * U V U V U V U V U V U V X X X X UV_Scanlines 32 * X X X X X X X X X X X X X X X X | 33 * X X X X X X X X X X X X X X X X V 34 * X X X X X X X X X X X X X X X X --> Buffer size alignment 35 * 36 * Y_Stride : Width aligned to 128 37 * UV_Stride : Width aligned to 128 38 * Y_Scanlines: Height aligned to 32 39 * UV_Scanlines: Height/2 aligned to 16 40 * Total size = align((Y_Stride * Y_Scanlines 41 * + UV_Stride * UV_Scanlines + 4096), 4096) 42 */ 43 COLOR_FMT_NV12, 44 45 /* Venus NV21: 46 * YUV 4:2:0 image with a plane of 8 bit Y samples followed 47 * by an interleaved V/U plane containing 8 bit 2x2 subsampled 48 * colour difference samples. 49 * 50 * <-------- Y/UV_Stride --------> 51 * <------- Width -------> 52 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X ^ ^ 53 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | 54 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X Height | 55 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | Y_Scanlines 56 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | 57 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | 58 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | 59 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X V | 60 * X X X X X X X X X X X X X X X X | 61 * X X X X X X X X X X X X X X X X | 62 * X X X X X X X X X X X X X X X X | 63 * X X X X X X X X X X X X X X X X V 64 * V U V U V U V U V U V U X X X X ^ 65 * V U V U V U V U V U V U X X X X | 66 * V U V U V U V U V U V U X X X X | 67 * V U V U V U V U V U V U X X X X UV_Scanlines 68 * X X X X X X X X X X X X X X X X | 69 * X X X X X X X X X X X X X X X X V 70 * X X X X X X X X X X X X X X X X --> Padding & Buffer size alignment 71 * 72 * Y_Stride : Width aligned to 128 73 * UV_Stride : Width aligned to 128 74 * Y_Scanlines: Height aligned to 32 75 * UV_Scanlines: Height/2 aligned to 16 76 * Total size = align((Y_Stride * Y_Scanlines 77 * + UV_Stride * UV_Scanlines + 4096), 4096) 78 */ 79 COLOR_FMT_NV21, 80 /* Venus NV12_MVTB: 81 * Two YUV 4:2:0 images/views one after the other 82 * in a top-bottom layout, same as NV12 83 * with a plane of 8 bit Y samples followed 84 * by an interleaved U/V plane containing 8 bit 2x2 subsampled 85 * colour difference samples. 86 * 87 * 88 * <-------- Y/UV_Stride --------> 89 * <------- Width -------> 90 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X ^ ^ ^ 91 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | | 92 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X Height | | 93 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | Y_Scanlines | 94 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | | 95 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | | 96 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | | 97 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X V | | 98 * X X X X X X X X X X X X X X X X | View_1 99 * X X X X X X X X X X X X X X X X | | 100 * X X X X X X X X X X X X X X X X | | 101 * X X X X X X X X X X X X X X X X V | 102 * U V U V U V U V U V U V X X X X ^ | 103 * U V U V U V U V U V U V X X X X | | 104 * U V U V U V U V U V U V X X X X | | 105 * U V U V U V U V U V U V X X X X UV_Scanlines | 106 * X X X X X X X X X X X X X X X X | | 107 * X X X X X X X X X X X X X X X X V V 108 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X ^ ^ ^ 109 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | | 110 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X Height | | 111 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | Y_Scanlines | 112 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | | 113 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | | 114 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X | | | 115 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X V | | 116 * X X X X X X X X X X X X X X X X | View_2 117 * X X X X X X X X X X X X X X X X | | 118 * X X X X X X X X X X X X X X X X | | 119 * X X X X X X X X X X X X X X X X V | 120 * U V U V U V U V U V U V X X X X ^ | 121 * U V U V U V U V U V U V X X X X | | 122 * U V U V U V U V U V U V X X X X | | 123 * U V U V U V U V U V U V X X X X UV_Scanlines | 124 * X X X X X X X X X X X X X X X X | | 125 * X X X X X X X X X X X X X X X X V V 126 * X X X X X X X X X X X X X X X X --> Buffer size alignment 127 * 128 * Y_Stride : Width aligned to 128 129 * UV_Stride : Width aligned to 128 130 * Y_Scanlines: Height aligned to 32 131 * UV_Scanlines: Height/2 aligned to 16 132 * View_1 begin at: 0 (zero) 133 * View_2 begin at: Y_Stride * Y_Scanlines + UV_Stride * UV_Scanlines 134 * Total size = align((2*(Y_Stride * Y_Scanlines) 135 * + 2*(UV_Stride * UV_Scanlines) + 4096), 4096) 136 */ 137 COLOR_FMT_NV12_MVTB, 138 }; 139 140 static inline unsigned int VENUS_Y_STRIDE(int color_fmt, int width) 141 { 142 unsigned int alignment, stride = 0; 143 if (!width) 144 goto invalid_input; 145 146 switch (color_fmt) { 147 case COLOR_FMT_NV21: 148 case COLOR_FMT_NV12: 149 case COLOR_FMT_NV12_MVTB: 150 alignment = 128; 151 stride = MSM_MEDIA_ALIGN(width, alignment); 152 break; 153 default: 154 break; 155 } 156 invalid_input: 157 return stride; 158 } 159 160 static inline unsigned int VENUS_UV_STRIDE(int color_fmt, int width) 161 { 162 unsigned int alignment, stride = 0; 163 if (!width) 164 goto invalid_input; 165 166 switch (color_fmt) { 167 case COLOR_FMT_NV21: 168 case COLOR_FMT_NV12: 169 case COLOR_FMT_NV12_MVTB: 170 alignment = 128; 171 stride = MSM_MEDIA_ALIGN(width, alignment); 172 break; 173 default: 174 break; 175 } 176 invalid_input: 177 return stride; 178 } 179 180 static inline unsigned int VENUS_Y_SCANLINES(int color_fmt, int height) 181 { 182 unsigned int alignment, sclines = 0; 183 if (!height) 184 goto invalid_input; 185 186 switch (color_fmt) { 187 case COLOR_FMT_NV21: 188 case COLOR_FMT_NV12: 189 case COLOR_FMT_NV12_MVTB: 190 alignment = 32; 191 sclines = MSM_MEDIA_ALIGN(height, alignment); 192 break; 193 default: 194 break; 195 } 196 invalid_input: 197 return sclines; 198 } 199 200 static inline unsigned int VENUS_UV_SCANLINES(int color_fmt, int height) 201 { 202 unsigned int alignment, sclines = 0; 203 if (!height) 204 goto invalid_input; 205 206 switch (color_fmt) { 207 case COLOR_FMT_NV21: 208 case COLOR_FMT_NV12: 209 case COLOR_FMT_NV12_MVTB: 210 alignment = 16; 211 sclines = MSM_MEDIA_ALIGN(((height + 1) >> 1), alignment); 212 break; 213 default: 214 break; 215 } 216 invalid_input: 217 return sclines; 218 } 219 220 static inline unsigned int VENUS_BUFFER_SIZE( 221 int color_fmt, int width, int height) 222 { 223 const unsigned int extra_size = 8*1024; 224 unsigned int uv_alignment = 0, size = 0; 225 unsigned int y_plane, uv_plane, y_stride, 226 uv_stride, y_sclines, uv_sclines; 227 if (!width || !height) 228 goto invalid_input; 229 230 y_stride = VENUS_Y_STRIDE(color_fmt, width); 231 uv_stride = VENUS_UV_STRIDE(color_fmt, width); 232 y_sclines = VENUS_Y_SCANLINES(color_fmt, height); 233 uv_sclines = VENUS_UV_SCANLINES(color_fmt, height); 234 switch (color_fmt) { 235 case COLOR_FMT_NV21: 236 case COLOR_FMT_NV12: 237 uv_alignment = 4096; 238 y_plane = y_stride * y_sclines; 239 uv_plane = uv_stride * uv_sclines + uv_alignment; 240 size = y_plane + uv_plane + extra_size; 241 size = MSM_MEDIA_ALIGN(size, 4096); 242 break; 243 case COLOR_FMT_NV12_MVTB: 244 uv_alignment = 4096; 245 y_plane = y_stride * y_sclines; 246 uv_plane = uv_stride * uv_sclines + uv_alignment; 247 size = y_plane + uv_plane; 248 size = 2 * size + extra_size; 249 size = MSM_MEDIA_ALIGN(size, 4096); 250 break; 251 default: 252 break; 253 } 254 invalid_input: 255 return size; 256 } 257 258 static inline unsigned int VENUS_VIEW2_OFFSET( 259 int color_fmt, int width, int height) 260 { 261 unsigned int offset = 0; 262 unsigned int y_plane, uv_plane, y_stride, 263 uv_stride, y_sclines, uv_sclines; 264 if (!width || !height) 265 goto invalid_input; 266 267 y_stride = VENUS_Y_STRIDE(color_fmt, width); 268 uv_stride = VENUS_UV_STRIDE(color_fmt, width); 269 y_sclines = VENUS_Y_SCANLINES(color_fmt, height); 270 uv_sclines = VENUS_UV_SCANLINES(color_fmt, height); 271 switch (color_fmt) { 272 case COLOR_FMT_NV12_MVTB: 273 y_plane = y_stride * y_sclines; 274 uv_plane = uv_stride * uv_sclines; 275 offset = y_plane + uv_plane; 276 break; 277 default: 278 break; 279 } 280 invalid_input: 281 return offset; 282 } 283 284 #endif 285