Home | History | Annotate | Download | only in media
      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 	unsigned int uv_alignment;
    224 	unsigned int 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;
    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;
    247 		size = y_plane + uv_plane;
    248 		size = 2 * size + uv_alignment;
    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