120 lines
2.3 KiB
C
120 lines
2.3 KiB
C
#ifndef __MEDIA_INFO_H__
|
|
#define __MEDIA_INFO_H__
|
|
|
|
#ifndef MSM_MEDIA_ALIGN
|
|
#define MSM_MEDIA_ALIGN(__sz, __align) (((__sz) + (__align-1)) & (~(__align-1)))
|
|
#endif
|
|
|
|
enum color_fmts {
|
|
COLOR_FMT_NV12,
|
|
COLOR_FMT_NV21,
|
|
};
|
|
|
|
static inline unsigned int VENUS_Y_STRIDE(int color_fmt, int width)
|
|
{
|
|
unsigned int alignment, stride = 0;
|
|
if (!width)
|
|
goto invalid_input;
|
|
|
|
switch (color_fmt) {
|
|
case COLOR_FMT_NV21:
|
|
case COLOR_FMT_NV12:
|
|
alignment = 128;
|
|
stride = MSM_MEDIA_ALIGN(width, alignment);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
invalid_input:
|
|
return stride;
|
|
}
|
|
|
|
static inline unsigned int VENUS_UV_STRIDE(int color_fmt, int width)
|
|
{
|
|
unsigned int alignment, stride = 0;
|
|
if (!width)
|
|
goto invalid_input;
|
|
|
|
switch (color_fmt) {
|
|
case COLOR_FMT_NV21:
|
|
case COLOR_FMT_NV12:
|
|
alignment = 128;
|
|
stride = MSM_MEDIA_ALIGN(width, alignment);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
invalid_input:
|
|
return stride;
|
|
}
|
|
|
|
static inline unsigned int VENUS_Y_SCANLINES(int color_fmt, int height)
|
|
{
|
|
unsigned int alignment, sclines = 0;
|
|
if (!height)
|
|
goto invalid_input;
|
|
|
|
switch (color_fmt) {
|
|
case COLOR_FMT_NV21:
|
|
case COLOR_FMT_NV12:
|
|
alignment = 32;
|
|
sclines = MSM_MEDIA_ALIGN(height, alignment);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
invalid_input:
|
|
return sclines;
|
|
}
|
|
|
|
static inline unsigned int VENUS_UV_SCANLINES(int color_fmt, int height)
|
|
{
|
|
unsigned int alignment, sclines = 0;
|
|
if (!height)
|
|
goto invalid_input;
|
|
|
|
switch (color_fmt) {
|
|
case COLOR_FMT_NV21:
|
|
case COLOR_FMT_NV12:
|
|
alignment = 16;
|
|
sclines = MSM_MEDIA_ALIGN(((height + 1) >> 1), alignment);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
invalid_input:
|
|
return sclines;
|
|
}
|
|
|
|
static inline unsigned int VENUS_BUFFER_SIZE(
|
|
int color_fmt, int width, int height)
|
|
{
|
|
unsigned int uv_alignment;
|
|
unsigned int size = 0;
|
|
unsigned int y_plane, uv_plane, y_stride,
|
|
uv_stride, y_sclines, uv_sclines;
|
|
if (!width || !height)
|
|
goto invalid_input;
|
|
|
|
y_stride = VENUS_Y_STRIDE(color_fmt, width);
|
|
uv_stride = VENUS_UV_STRIDE(color_fmt, width);
|
|
y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
|
|
uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
|
|
switch (color_fmt) {
|
|
case COLOR_FMT_NV21:
|
|
case COLOR_FMT_NV12:
|
|
uv_alignment = 4096;
|
|
y_plane = y_stride * y_sclines;
|
|
uv_plane = uv_stride * uv_sclines + uv_alignment;
|
|
size = y_plane + uv_plane;
|
|
size = MSM_MEDIA_ALIGN(size, 4096);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
invalid_input:
|
|
return size;
|
|
}
|
|
|
|
#endif
|