From 4d8dedc0669b842be436d83e6d113c281d658072 Mon Sep 17 00:00:00 2001 From: Dikshita Agarwal Date: Tue, 1 Feb 2022 13:13:22 +0530 Subject: [PATCH] video: driver: handle invalid format in s_fmt Handle invalid format 0xfffff by invoking try_fmt in s_fmt. It is expected from driver to return EINVAL for only unsupported buf type and if color format is unsupported, driver should fill the fmt structure with valid values. Partially Fixes: v4l2-compliance: TestSetFormat(VIDIOC_S_FMT) Change-Id: I27e82866e8ad4a13661431f2a38a66ac3ef7dd80 Signed-off-by: Dikshita Agarwal --- driver/vidc/src/msm_vdec.c | 27 +++++++++++++-------------- driver/vidc/src/msm_venc.c | 24 +++++++++++++----------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index b3f4f7e419..d236d7afe2 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -2410,27 +2410,25 @@ int msm_vdec_try_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) if (f->type == INPUT_MPLANE) { pix_fmt = v4l2_codec_to_driver(f->fmt.pix_mp.pixelformat, __func__); if (!pix_fmt) { - i_vpr_h(inst, "%s: unsupported codec, set default params\n", __func__); - f->fmt.pix_mp.width = DEFAULT_WIDTH; - f->fmt.pix_mp.height = DEFAULT_HEIGHT; - f->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264; + i_vpr_e(inst, "%s: unsupported codec, set current params\n", __func__); + f->fmt.pix_mp.width = inst->fmts[INPUT_PORT].fmt.pix_mp.width; + f->fmt.pix_mp.height = inst->fmts[INPUT_PORT].fmt.pix_mp.height; + f->fmt.pix_mp.pixelformat = inst->fmts[INPUT_PORT].fmt.pix_mp.pixelformat; pix_fmt = v4l2_codec_to_driver(f->fmt.pix_mp.pixelformat, __func__); } } else if (f->type == OUTPUT_MPLANE) { + pix_fmt = v4l2_colorformat_to_driver(f->fmt.pix_mp.pixelformat, __func__); + if (!pix_fmt) { + i_vpr_e(inst, "%s: unsupported format, set current params\n", __func__); + f->fmt.pix_mp.pixelformat = inst->fmts[OUTPUT_PORT].fmt.pix_mp.pixelformat; + f->fmt.pix_mp.width = inst->fmts[OUTPUT_PORT].fmt.pix_mp.width; + f->fmt.pix_mp.height = inst->fmts[OUTPUT_PORT].fmt.pix_mp.height; + pix_fmt = v4l2_colorformat_to_driver(f->fmt.pix_mp.pixelformat, __func__); + } if (inst->bufq[INPUT_PORT].vb2q->streaming) { f->fmt.pix_mp.height = inst->fmts[INPUT_PORT].fmt.pix_mp.height; f->fmt.pix_mp.width = inst->fmts[INPUT_PORT].fmt.pix_mp.width; } - pix_fmt = v4l2_colorformat_to_driver(f->fmt.pix_mp.pixelformat, __func__); - if (!pix_fmt) { - i_vpr_h(inst, "%s: unsupported format, set default params\n", __func__); - f->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_VIDC_NV12C; - f->fmt.pix_mp.width = VIDEO_Y_STRIDE_PIX(f->fmt.pix_mp.pixelformat, - DEFAULT_WIDTH); - f->fmt.pix_mp.height = VIDEO_Y_SCANLINES(f->fmt.pix_mp.pixelformat, - DEFAULT_HEIGHT); - pix_fmt = v4l2_colorformat_to_driver(f->fmt.pix_mp.pixelformat, __func__); - } } else { i_vpr_e(inst, "%s: invalid type %d\n", __func__, f->type); return -EINVAL; @@ -2474,6 +2472,7 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) return -EINVAL; } core = inst->core; + msm_vdec_try_fmt(inst, f); if (f->type == INPUT_MPLANE) { if (inst->fmts[INPUT_PORT].fmt.pix_mp.pixelformat != diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index 895da9d860..1e269e7ec8 100644 --- a/driver/vidc/src/msm_venc.c +++ b/driver/vidc/src/msm_venc.c @@ -1060,21 +1060,20 @@ int msm_venc_try_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) if (f->type == INPUT_MPLANE) { pix_fmt = v4l2_colorformat_to_driver(f->fmt.pix_mp.pixelformat, __func__); if (!pix_fmt) { - i_vpr_h(inst, "%s: unsupported format, set default params\n", __func__); - f->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_VIDC_NV12C; - f->fmt.pix_mp.width = VIDEO_Y_STRIDE_PIX(f->fmt.pix_mp.pixelformat, - DEFAULT_WIDTH); - f->fmt.pix_mp.height = VIDEO_Y_SCANLINES(f->fmt.pix_mp.pixelformat, - DEFAULT_HEIGHT); + i_vpr_e(inst, "%s: unsupported format, set current params\n", __func__); + f->fmt.pix_mp.pixelformat = inst->fmts[INPUT_PORT].fmt.pix_mp.pixelformat; + f->fmt.pix_mp.width = inst->fmts[INPUT_PORT].fmt.pix_mp.width; + f->fmt.pix_mp.height = inst->fmts[INPUT_PORT].fmt.pix_mp.height; + pix_fmt = v4l2_colorformat_to_driver(f->fmt.pix_mp.pixelformat, __func__); } } else if (f->type == OUTPUT_MPLANE) { pix_fmt = v4l2_codec_to_driver(f->fmt.pix_mp.pixelformat, __func__); if (!pix_fmt) { - i_vpr_h(inst, "%s: unsupported codec, set default params\n", __func__); - f->fmt.pix_mp.width = DEFAULT_WIDTH; - f->fmt.pix_mp.height = DEFAULT_HEIGHT; - f->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264; - pix_fmt = v4l2_colorformat_to_driver(f->fmt.pix_mp.pixelformat, __func__); + i_vpr_e(inst, "%s: unsupported codec, set current params\n", __func__); + f->fmt.pix_mp.width = inst->fmts[OUTPUT_PORT].fmt.pix_mp.width; + f->fmt.pix_mp.height = inst->fmts[OUTPUT_PORT].fmt.pix_mp.height; + f->fmt.pix_mp.pixelformat = inst->fmts[OUTPUT_PORT].fmt.pix_mp.pixelformat; + pix_fmt = v4l2_codec_to_driver(f->fmt.pix_mp.pixelformat, __func__); } } else { i_vpr_e(inst, "%s: invalid type %d\n", __func__, f->type); @@ -1101,6 +1100,7 @@ int msm_venc_s_fmt_output(struct msm_vidc_inst *inst, struct v4l2_format *f) return -EINVAL; } core = inst->core; + msm_venc_try_fmt(inst, f); fmt = &inst->fmts[OUTPUT_PORT]; if (fmt->fmt.pix_mp.pixelformat != f->fmt.pix_mp.pixelformat) { @@ -1222,6 +1222,8 @@ static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format * return -EINVAL; } core = inst->core; + msm_venc_try_fmt(inst, f); + pix_fmt = v4l2_colorformat_to_driver(f->fmt.pix_mp.pixelformat, __func__); msm_vidc_update_cap_value(inst, PIX_FMTS, pix_fmt, __func__);