video: driver: add RGBA format support

add RGBA and RGBA_UBWC color format support
for encoder.

Change-Id: I3e179ae9769d851afc5a6f11e1afb14d96e92073
Signed-off-by: Darshana Patil <darshana@codeaurora.org>
This commit is contained in:
Darshana Patil
2021-03-19 10:08:35 -07:00
parent d238d03c1b
commit 48912aee84
6 changed files with 65 additions and 24 deletions

View File

@@ -111,13 +111,15 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
{PIX_FMTS, ENC, H264,
MSM_VIDC_FMT_NV12,
MSM_VIDC_FMT_NV12C,
MSM_VIDC_FMT_NV12 | MSM_VIDC_FMT_NV21 | MSM_VIDC_FMT_NV12C,
MSM_VIDC_FMT_NV12 | MSM_VIDC_FMT_NV21 | MSM_VIDC_FMT_NV12C |
MSM_VIDC_FMT_RGBA8888 | MSM_VIDC_FMT_RGBA8888C,
MSM_VIDC_FMT_NV12C},
{PIX_FMTS, ENC, HEVC|HEIC,
MSM_VIDC_FMT_NV12,
MSM_VIDC_FMT_TP10C,
MSM_VIDC_FMT_NV12 | MSM_VIDC_FMT_NV21 | MSM_VIDC_FMT_NV12C |
MSM_VIDC_FMT_P010 | MSM_VIDC_FMT_TP10C,
MSM_VIDC_FMT_P010 | MSM_VIDC_FMT_TP10C |
MSM_VIDC_FMT_RGBA8888 | MSM_VIDC_FMT_RGBA8888C,
MSM_VIDC_FMT_NV12C,
0, 0,
CAP_FLAG_ROOT,

View File

@@ -384,7 +384,8 @@ static inline unsigned int VIDEO_RGB_STRIDE_BYTES(unsigned int v4l2_fmt,
switch (v4l2_fmt) {
case V4L2_PIX_FMT_VIDC_ARGB32C:
alignment = 64;
case V4L2_PIX_FMT_RGBA32:
alignment = 256;
break;
default:
goto invalid_input;
@@ -414,6 +415,7 @@ static inline unsigned int VIDEO_RGB_SCANLINES(unsigned int v4l2_fmt,
switch (v4l2_fmt) {
case V4L2_PIX_FMT_VIDC_ARGB32C:
case V4L2_PIX_FMT_RGBA32:
alignment = 16;
break;
default:
@@ -436,6 +438,7 @@ static inline unsigned int VIDEO_RGB_META_STRIDE(unsigned int v4l2_fmt,
switch (v4l2_fmt) {
case V4L2_PIX_FMT_VIDC_ARGB32C:
case V4L2_PIX_FMT_RGBA32:
rgb_tile_width = 16;
break;
default:
@@ -459,6 +462,7 @@ static inline unsigned int VIDEO_RGB_META_SCANLINES(unsigned int v4l2_fmt,
switch (v4l2_fmt) {
case V4L2_PIX_FMT_VIDC_ARGB32C:
case V4L2_PIX_FMT_RGBA32:
rgb_tile_height = 4;
break;
default:
@@ -483,7 +487,7 @@ static inline unsigned int VIDEO_RAW_BUFFER_SIZE(unsigned int v4l2_fmt,
unsigned int uv_meta_stride = 0, uv_meta_scanlines = 0;
unsigned int y_meta_plane = 0, uv_meta_plane = 0;
unsigned int rgb_stride = 0, rgb_scanlines = 0;
unsigned int rgb_ubwc_plane = 0, rgb_meta_plane = 0;
unsigned int rgb_plane = 0, rgb_ubwc_plane = 0, rgb_meta_plane = 0;
unsigned int rgb_meta_stride = 0, rgb_meta_scanlines = 0;
if (!pix_width || !pix_height)
@@ -588,6 +592,10 @@ static inline unsigned int VIDEO_RAW_BUFFER_SIZE(unsigned int v4l2_fmt,
rgb_meta_scanlines, 4096);
size = rgb_ubwc_plane + rgb_meta_plane;
break;
case V4L2_PIX_FMT_RGBA32:
rgb_plane = MSM_MEDIA_ALIGN(rgb_stride * rgb_scanlines, 4096);
size = rgb_plane;
break;
default:
break;
}

View File

@@ -156,6 +156,12 @@ static inline bool is_8bit_colorformat(enum msm_vidc_colorformat_type colorforma
colorformat == MSM_VIDC_FMT_RGBA8888C;
}
static inline bool is_rgba_colorformat(enum msm_vidc_colorformat_type colorformat)
{
return colorformat == MSM_VIDC_FMT_RGBA8888 ||
colorformat == MSM_VIDC_FMT_RGBA8888C;
}
static inline bool is_secondary_output_mode(struct msm_vidc_inst *inst)
{
return false; // TODO: inst->stream_output_mode == HAL_VIDEO_DECODER_SECONDARY;

View File

@@ -127,7 +127,8 @@ static int msm_venc_set_stride_scanline(struct msm_vidc_inst *inst,
enum msm_vidc_port_type port)
{
int rc = 0;
u32 pixelformat, stride_y, scanline_y, stride_uv, scanline_uv;
u32 color_format, stride_y, scanline_y;
u32 stride_uv = 0, scanline_uv = 0;
u32 payload[2];
if (port != INPUT_PORT) {
@@ -135,9 +136,8 @@ static int msm_venc_set_stride_scanline(struct msm_vidc_inst *inst,
return -EINVAL;
}
pixelformat = inst->fmts[INPUT_PORT].fmt.pix_mp.pixelformat;
if (pixelformat != V4L2_PIX_FMT_NV12 &&
pixelformat != V4L2_PIX_FMT_VIDC_P010) {
color_format = inst->capabilities->cap[PIX_FMTS].value;
if (!is_linear_colorformat(color_format)) {
i_vpr_e(inst,
"%s: not a linear color fmt, property is not set\n",
__func__);
@@ -146,8 +146,11 @@ static int msm_venc_set_stride_scanline(struct msm_vidc_inst *inst,
stride_y = inst->fmts[INPUT_PORT].fmt.pix_mp.width;
scanline_y = inst->fmts[INPUT_PORT].fmt.pix_mp.height;
if (color_format == MSM_VIDC_FMT_NV12 ||
color_format == MSM_VIDC_FMT_P010) {
stride_uv = stride_y;
scanline_uv = scanline_y / 2;
}
payload[0] = stride_y << 16 | scanline_y;
payload[1] = stride_uv << 16 | scanline_uv;
@@ -1192,6 +1195,7 @@ static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format *
struct v4l2_format *fmt;
struct msm_vidc_core *core;
u32 pix_fmt;
u32 crop_width, crop_height;
if (!inst || !inst->core || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
@@ -1204,15 +1208,33 @@ static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format *
fmt->fmt.pix_mp.pixelformat = f->fmt.pix_mp.pixelformat;
pix_fmt = v4l2_colorformat_to_driver(f->fmt.pix_mp.pixelformat, __func__);
msm_vidc_update_cap_value(inst, PIX_FMTS, pix_fmt, __func__);
if (is_rgba_colorformat(pix_fmt)) {
fmt->fmt.pix_mp.width = VIDEO_RGB_STRIDE_PIX(fmt->fmt.pix_mp.pixelformat,
f->fmt.pix_mp.width);
fmt->fmt.pix_mp.height = VIDEO_RGB_SCANLINES(fmt->fmt.pix_mp.pixelformat,
f->fmt.pix_mp.height);
fmt->fmt.pix_mp.plane_fmt[0].bytesperline =
VIDEO_RGB_STRIDE_BYTES(fmt->fmt.pix_mp.pixelformat,
f->fmt.pix_mp.width);
crop_width = VIDEO_RGB_STRIDE_PIX(
fmt->fmt.pix_mp.pixelformat, inst->crop.width);
crop_height = VIDEO_RGB_SCANLINES(
fmt->fmt.pix_mp.pixelformat, inst->crop.height);
} else {
fmt->fmt.pix_mp.width = VIDEO_Y_STRIDE_PIX(fmt->fmt.pix_mp.pixelformat,
f->fmt.pix_mp.width);
fmt->fmt.pix_mp.height = VIDEO_Y_SCANLINES(fmt->fmt.pix_mp.pixelformat,
f->fmt.pix_mp.height);
fmt->fmt.pix_mp.num_planes = 1;
fmt->fmt.pix_mp.plane_fmt[0].bytesperline =
VIDEO_Y_STRIDE_BYTES(fmt->fmt.pix_mp.pixelformat,
f->fmt.pix_mp.width);
crop_width = VIDEO_Y_STRIDE_PIX(
fmt->fmt.pix_mp.pixelformat, inst->crop.width);
crop_height = VIDEO_Y_SCANLINES(
fmt->fmt.pix_mp.pixelformat, inst->crop.height);
}
fmt->fmt.pix_mp.num_planes = 1;
fmt->fmt.pix_mp.plane_fmt[0].sizeimage = call_session_op(core,
buffer_size, inst, MSM_VIDC_BUF_INPUT);
fmt->fmt.pix_mp.colorspace = f->fmt.pix_mp.colorspace;
@@ -1233,10 +1255,8 @@ static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format *
inst->buffers.input.size =
fmt->fmt.pix_mp.plane_fmt[0].sizeimage;
if (fmt->fmt.pix_mp.width != VIDEO_Y_STRIDE_PIX(
fmt->fmt.pix_mp.pixelformat, inst->crop.width) ||
fmt->fmt.pix_mp.height != VIDEO_Y_SCANLINES(
fmt->fmt.pix_mp.pixelformat, inst->crop.height)) {
if (fmt->fmt.pix_mp.width != crop_width ||
fmt->fmt.pix_mp.height != crop_height) {
/* reset crop dimensions with updated resolution */
inst->crop.top = inst->crop.left = 0;

View File

@@ -422,6 +422,9 @@ enum msm_vidc_colorformat_type v4l2_colorformat_to_driver(u32 v4l2_colorformat,
case V4L2_PIX_FMT_VIDC_TP10C:
colorformat = MSM_VIDC_FMT_TP10C;
break;
case V4L2_PIX_FMT_RGBA32:
colorformat = MSM_VIDC_FMT_RGBA8888;
break;
case V4L2_PIX_FMT_VIDC_ARGB32C:
colorformat = MSM_VIDC_FMT_RGBA8888C;
break;
@@ -454,6 +457,9 @@ u32 v4l2_colorformat_from_driver(enum msm_vidc_colorformat_type colorformat,
case MSM_VIDC_FMT_TP10C:
v4l2_colorformat = V4L2_PIX_FMT_VIDC_TP10C;
break;
case MSM_VIDC_FMT_RGBA8888:
v4l2_colorformat = V4L2_PIX_FMT_RGBA32;
break;
case MSM_VIDC_FMT_RGBA8888C:
v4l2_colorformat = V4L2_PIX_FMT_VIDC_ARGB32C;
break;

View File

@@ -12,8 +12,7 @@
/*
* supported standard color formats
* V4L2_PIX_FMT_NV12 Y/CbCr 4:2:0
* NV21?? // TODO: jdas
* V4L2_PIX_FMT_ARGB32 ARGB-8-8-8-8
* V4L2_PIX_FMT_RGBA32 RGBA-8-8-8-8
*/
/* Below are additional color formats */
/* 12 Y/CbCr 4:2:0 compressed */
@@ -22,7 +21,7 @@
#define V4L2_PIX_FMT_VIDC_TP10C v4l2_fourcc('Q', '1', '0', 'C')
/* Y/CbCr 4:2:0, 10 bits per channel */
#define V4L2_PIX_FMT_VIDC_P010 v4l2_fourcc('P', '0', '1', '0')
/* 32 ARGB-8-8-8-8 compressed */
/* 32 RGBA-8-8-8-8 compressed */
#define V4L2_PIX_FMT_VIDC_ARGB32C v4l2_fourcc('Q', '2', '4', 'C')
#define V4L2_META_FMT_VIDC v4l2_fourcc('Q', 'M', 'E', 'T')
/* HEIC encoder and decoder */