diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index 837f7bd96d..3bb70b0eab 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -1493,6 +1493,16 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst) __func__); } + /* align input port color info with output port */ + inst->fmts[INPUT_PORT].fmt.pix_mp.colorspace = + inst->fmts[OUTPUT_PORT].fmt.pix_mp.colorspace; + inst->fmts[INPUT_PORT].fmt.pix_mp.xfer_func = + inst->fmts[OUTPUT_PORT].fmt.pix_mp.xfer_func; + inst->fmts[INPUT_PORT].fmt.pix_mp.ycbcr_enc = + inst->fmts[OUTPUT_PORT].fmt.pix_mp.ycbcr_enc; + inst->fmts[INPUT_PORT].fmt.pix_mp.quantization = + inst->fmts[OUTPUT_PORT].fmt.pix_mp.quantization; + inst->buffers.output.min_count = subsc_params.fw_min_count; inst->buffers.output.extra_count = call_session_op(core, extra_count, inst, MSM_VIDC_BUF_OUTPUT); @@ -2488,7 +2498,7 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) { int rc = 0; struct msm_vidc_core *core; - struct v4l2_format *fmt; + struct v4l2_format *fmt, *output_fmt; u32 codec_align, pix_fmt; if (!inst || !inst->core) { @@ -2539,6 +2549,17 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) } inst->buffers.input.size = fmt->fmt.pix_mp.plane_fmt[0].sizeimage; + /* update input port color info */ + fmt->fmt.pix_mp.colorspace = f->fmt.pix_mp.colorspace; + fmt->fmt.pix_mp.xfer_func = f->fmt.pix_mp.xfer_func; + fmt->fmt.pix_mp.ycbcr_enc = f->fmt.pix_mp.ycbcr_enc; + fmt->fmt.pix_mp.quantization = f->fmt.pix_mp.quantization; + /* update output port color info */ + output_fmt = &inst->fmts[OUTPUT_PORT]; + output_fmt->fmt.pix_mp.colorspace = f->fmt.pix_mp.colorspace; + output_fmt->fmt.pix_mp.xfer_func = f->fmt.pix_mp.xfer_func; + output_fmt->fmt.pix_mp.ycbcr_enc = f->fmt.pix_mp.ycbcr_enc; + output_fmt->fmt.pix_mp.quantization = f->fmt.pix_mp.quantization; /* update crop dimensions */ inst->crop.left = inst->crop.top = 0; diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index 895da9d860..ebde5333b0 100644 --- a/driver/vidc/src/msm_venc.c +++ b/driver/vidc/src/msm_venc.c @@ -1212,7 +1212,7 @@ static int msm_venc_s_fmt_output_meta(struct msm_vidc_inst *inst, struct v4l2_fo static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format *f) { int rc = 0; - struct v4l2_format *fmt; + struct v4l2_format *fmt, *output_fmt; struct msm_vidc_core *core; u32 pix_fmt, width, height, size, bytesperline, crop_width, crop_height; @@ -1258,10 +1258,22 @@ static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format * else size = call_session_op(core, buffer_size, inst, MSM_VIDC_BUF_INPUT); fmt->fmt.pix_mp.plane_fmt[0].sizeimage = size; + /* update input port colorspace info */ fmt->fmt.pix_mp.colorspace = f->fmt.pix_mp.colorspace; fmt->fmt.pix_mp.xfer_func = f->fmt.pix_mp.xfer_func; fmt->fmt.pix_mp.ycbcr_enc = f->fmt.pix_mp.ycbcr_enc; fmt->fmt.pix_mp.quantization = f->fmt.pix_mp.quantization; + /* + * Update output port colorspace info. + * NOTE: If client needs CSC, then client needs to ensure setting + * output port color after setting input color info. + */ + output_fmt = &inst->fmts[OUTPUT_PORT]; + output_fmt->fmt.pix_mp.colorspace = fmt->fmt.pix_mp.colorspace; + output_fmt->fmt.pix_mp.xfer_func = fmt->fmt.pix_mp.xfer_func; + output_fmt->fmt.pix_mp.ycbcr_enc = fmt->fmt.pix_mp.ycbcr_enc; + output_fmt->fmt.pix_mp.quantization = fmt->fmt.pix_mp.quantization; + inst->buffers.input.min_count = call_session_op(core, min_count, inst, MSM_VIDC_BUF_INPUT); inst->buffers.input.extra_count = call_session_op(core,