summaryrefslogtreecommitdiff
path: root/drivers/mxc
diff options
context:
space:
mode:
authorMing Qian <ming.qian@nxp.com>2020-08-10 16:27:24 +0800
committerMing Qian <ming.qian@nxp.com>2020-08-12 16:02:21 +0800
commitc9f7364dc4059f833fe24579295af94d0405e04e (patch)
tree372da138c852b7c7f8f934e842e8b5d9c3b27d77 /drivers/mxc
parentf36e9e62bd2f6ec9a60abeaef817384094d7c789 (diff)
MLK-24477-3:[8QM_MEK/8QXP_MEK]mxc:vpu_malone: improve get/set color api
use the v4l2 api instead of custom api Signed-off-by: Ming Qian <ming.qian@nxp.com> Reviewed-by: Shijie Qin <shijie.qin@nxp.com>
Diffstat (limited to 'drivers/mxc')
-rw-r--r--drivers/mxc/vpu_malone/vpu_b0.c96
-rw-r--r--drivers/mxc/vpu_malone/vpu_b0.h5
2 files changed, 96 insertions, 5 deletions
diff --git a/drivers/mxc/vpu_malone/vpu_b0.c b/drivers/mxc/vpu_malone/vpu_b0.c
index 0df6367d5054..48b9cb409ba2 100644
--- a/drivers/mxc/vpu_malone/vpu_b0.c
+++ b/drivers/mxc/vpu_malone/vpu_b0.c
@@ -670,9 +670,7 @@ static int v4l2_ioctl_querycap(struct file *file,
strlcpy(cap->driver, "vpu B0", sizeof(cap->driver));
strlcpy(cap->card, "vpu B0", sizeof(cap->card));
strlcpy(cap->bus_info, "platform:", sizeof(cap->bus_info));
- cap->version = KERNEL_VERSION(0, 0, 1);
- cap->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING;
- cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
+
return 0;
}
@@ -818,6 +816,76 @@ static void calculate_frame_size(struct vpu_ctx *ctx)
q_data->field = V4L2_FIELD_INTERLACED;
}
+static const u8 colorprimaries[] = {
+ 0,
+ V4L2_COLORSPACE_REC709, /*Rec. ITU-R BT.709-6*/
+ 0,
+ 0,
+ V4L2_COLORSPACE_470_SYSTEM_M, /*Rec. ITU-R BT.470-6 System M*/
+ V4L2_COLORSPACE_470_SYSTEM_BG,/*Rec. ITU-R BT.470-6 System B, G*/
+ V4L2_COLORSPACE_SMPTE170M, /*SMPTE170M*/
+ V4L2_COLORSPACE_SMPTE240M, /*SMPTE240M*/
+ V4L2_COLORSPACE_GENERIC_FILM, /*Generic film*/
+ V4L2_COLORSPACE_BT2020, /*Rec. ITU-R BT.2020-2*/
+ V4L2_COLORSPACE_ST428 /*SMPTE ST 428-1*/
+};
+
+static const u8 colortransfers[] = {
+ 0,
+ V4L2_XFER_FUNC_709, /*Rec. ITU-R BT.709-6*/
+ 0,
+ 0,
+ V4L2_XFER_FUNC_GAMMA22, /*Rec. ITU-R BT.470-6 System M*/
+ V4L2_XFER_FUNC_GAMMA28, /*Rec. ITU-R BT.470-6 System B, G*/
+ V4L2_XFER_FUNC_709, /*SMPTE170M*/
+ V4L2_XFER_FUNC_SMPTE240M,/*SMPTE240M*/
+ V4L2_XFER_FUNC_LINEAR, /*Linear transfer characteristics*/
+ 0,
+ 0,
+ V4L2_XFER_FUNC_XVYCC, /*IEC 61966-2-4*/
+ V4L2_XFER_FUNC_BT1361, /*Rec. ITU-R BT.1361-0 extended colour gamut*/
+ V4L2_XFER_FUNC_SRGB, /*IEC 61966-2-1 sRGB or sYCC*/
+ V4L2_XFER_FUNC_709, /*Rec. ITU-R BT.2020-2 (10 bit system)*/
+ V4L2_XFER_FUNC_709, /*Rec. ITU-R BT.2020-2 (12 bit system)*/
+ V4L2_XFER_FUNC_SMPTE2084,/*SMPTE ST 2084*/
+ V4L2_XFER_FUNC_ST428, /*SMPTE ST 428-1*/
+ V4L2_XFER_FUNC_HLG /*Rec. ITU-R BT.2100-0 hybrid log-gamma (HLG)*/
+};
+
+static const u8 colormatrixcoefs[] = {
+ 0,
+ V4L2_YCBCR_ENC_709, /*Rec. ITU-R BT.709-6*/
+ 0,
+ 0,
+ V4L2_YCBCR_ENC_BT470_6M, /*Title 47 Code of Federal Regulations*/
+ V4L2_YCBCR_ENC_601, /*Rec. ITU-R BT.601-7 625*/
+ V4L2_YCBCR_ENC_601, /*Rec. ITU-R BT.601-7 525*/
+ V4L2_YCBCR_ENC_SMPTE240M, /*SMPTE240M*/
+ 0,
+ V4L2_YCBCR_ENC_BT2020, /*Rec. ITU-R BT.2020-2*/
+ V4L2_YCBCR_ENC_BT2020_CONST_LUM /*Rec. ITU-R BT.2020-2 constant*/
+};
+
+static int vpu_dec_convert_color_iso_aspect_to_v4l2_aspect(struct vpu_ctx *ctx,
+ u32 primaries, u32 transfer, u32 coeffs, u32 fullrange)
+{
+ if (primaries < ARRAY_SIZE(colorprimaries))
+ ctx->colorspace = colorprimaries[primaries];
+
+ if (transfer < ARRAY_SIZE(colortransfers))
+ ctx->xfer_func = colortransfers[transfer];
+
+ if (coeffs < ARRAY_SIZE(colormatrixcoefs))
+ ctx->ycbcr_enc = colormatrixcoefs[coeffs];
+
+ if (fullrange)
+ ctx->quantization = V4L2_QUANTIZATION_FULL_RANGE;
+ else
+ ctx->quantization = V4L2_QUANTIZATION_LIM_RANGE;
+
+ return 0;
+}
+
static int v4l2_ioctl_g_fmt(struct file *file,
void *fh,
struct v4l2_format *f
@@ -842,7 +910,6 @@ static int v4l2_ioctl_g_fmt(struct file *file,
pix_mp->height = q_data->height;
pix_mp->field = q_data->field;
pix_mp->num_planes = 2;
- pix_mp->colorspace = V4L2_COLORSPACE_REC709;
for (i = 0; i < pix_mp->num_planes; i++) {
pix_mp->plane_fmt[i].bytesperline = q_data->stride;
pix_mp->plane_fmt[i].sizeimage = q_data->sizeimage[i];
@@ -865,6 +932,12 @@ static int v4l2_ioctl_g_fmt(struct file *file,
up(&q_data->drv_q_lock);
} else
return -EINVAL;
+
+ pix_mp->colorspace = ctx->colorspace;
+ pix_mp->xfer_func = ctx->xfer_func;
+ pix_mp->ycbcr_enc = ctx->ycbcr_enc;
+ pix_mp->quantization = ctx->quantization;
+
vpu_dbg(LVL_BIT_FLOW, "%s g_fmt : %c%c%c%c %d x %d\n",
V4L2_TYPE_IS_OUTPUT(f->type) ? "OUTPUT" : "CAPTURE",
pix_mp->pixelformat & 0xff,
@@ -931,7 +1004,6 @@ static int v4l2_ioctl_s_fmt(struct file *file,
q_data = &ctx->q_data[V4L2_DST];
if (!set_video_standard(ctx, q_data, f, formats_yuv_dec, ARRAY_SIZE(formats_yuv_dec)))
return -EINVAL;
- pix_mp->colorspace = V4L2_COLORSPACE_REC709;
} else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
q_data = &ctx->q_data[V4L2_SRC];
if (!set_video_standard(ctx, q_data, f, formats_compressed_dec, ARRAY_SIZE(formats_compressed_dec)))
@@ -939,6 +1011,10 @@ static int v4l2_ioctl_s_fmt(struct file *file,
} else
return -EINVAL;
+ pix_mp->colorspace = ctx->colorspace;
+ pix_mp->xfer_func = ctx->xfer_func;
+ pix_mp->ycbcr_enc = ctx->ycbcr_enc;
+ pix_mp->quantization = ctx->quantization;
pix_mp->num_planes = q_data->num_planes;
down(&q_data->drv_q_lock);
@@ -4364,6 +4440,12 @@ static void vpu_api_event_handler(struct vpu_ctx *ctx, u_int32 uStrIdx, u_int32
ctx->seqinfo.uMatrixCoeffs,
ctx->seqinfo.uVideoFullRangeFlag,
ctx->seqinfo.uVUIPresent);
+ vpu_dec_convert_color_iso_aspect_to_v4l2_aspect(ctx,
+ ctx->seqinfo.uColorDesc,
+ ctx->seqinfo.uTransferChars,
+ ctx->seqinfo.uMatrixCoeffs,
+ ctx->seqinfo.uVideoFullRangeFlag);
+
down(&ctx->q_data[V4L2_DST].drv_q_lock);
calculate_frame_size(ctx);
ctx->dcp_size = get_dcp_size(ctx);
@@ -6065,6 +6147,10 @@ static int v4l2_open(struct file *filp)
ctx->stream_input_mode = FRAME_LVL;
ctx->hang_status = false;
ctx->first_dump_data_flag = true;
+ ctx->colorspace = V4L2_COLORSPACE_REC709;
+ ctx->xfer_func = V4L2_XFER_FUNC_709;
+ ctx->ycbcr_enc = V4L2_YCBCR_ENC_709;
+ ctx->quantization = V4L2_QUANTIZATION_LIM_RANGE;
INIT_LIST_HEAD(&ctx->cmd_q);
INIT_LIST_HEAD(&ctx->perf_q);
ctx->tsm = createTSManager(tsm_buffer_size);
diff --git a/drivers/mxc/vpu_malone/vpu_b0.h b/drivers/mxc/vpu_malone/vpu_b0.h
index fe63512a4db6..83f1e5c06484 100644
--- a/drivers/mxc/vpu_malone/vpu_b0.h
+++ b/drivers/mxc/vpu_malone/vpu_b0.h
@@ -493,6 +493,11 @@ struct vpu_ctx {
struct mutex perf_lock;
struct mutex fw_flow_mutex;
+
+ u8 colorspace;
+ u8 xfer_func;
+ u8 ycbcr_enc;
+ u8 quantization;
};
#define LVL_WARN (1 << 0)