On 11/06/2024 09:15, Jackson Lee wrote: > From: "jackson.lee" <jackson.lee@xxxxxxxxxxxxxxx> > > Use v4l2-common helper functions to calculate bytesperline and sizeimage, > instead of calculating in a wave5 driver directly. > > In case of raw(YUV) v4l2_pix_format, the wave5 driver updates > v4l2_pix_format_mplane struct through v4l2_fill_pixfmt_mp() function. > > Encoder and Decoder need same bytesperline and sizeimage values > for same v4l2_pix_format. > So, a wave5_update_pix_fmt is refactored to support both together. > > Signed-off-by: Jackson.lee <jackson.lee@xxxxxxxxxxxxxxx> > Signed-off-by: Nas Chung <nas.chung@xxxxxxxxxxxxxxx> > Reviewed-by: Nicolas Dufresne <nicolas.dufresne@xxxxxxxxxxxxx> > --- > .../platform/chips-media/wave5/wave5-helper.c | 24 ++ > .../platform/chips-media/wave5/wave5-helper.h | 5 + > .../chips-media/wave5/wave5-vpu-dec.c | 296 ++++++------------ > .../chips-media/wave5/wave5-vpu-enc.c | 197 +++++------- > .../platform/chips-media/wave5/wave5-vpu.h | 5 +- > .../chips-media/wave5/wave5-vpuconfig.h | 27 +- > 6 files changed, 235 insertions(+), 319 deletions(-) > > diff --git a/drivers/media/platform/chips-media/wave5/wave5-helper.c b/drivers/media/platform/chips-media/wave5/wave5-helper.c > index 7e0f34bfa5be..b20ab69cd341 100644 > --- a/drivers/media/platform/chips-media/wave5/wave5-helper.c > +++ b/drivers/media/platform/chips-media/wave5/wave5-helper.c > @@ -7,6 +7,8 @@ > > #include "wave5-helper.h" > > +#define DEFAULT_BS_SIZE(width, height) ((width) * (height) / 8 * 3) > + > const char *state_to_str(enum vpu_instance_state state) > { > switch (state) { > @@ -224,3 +226,25 @@ void wave5_return_bufs(struct vb2_queue *q, u32 state) > v4l2_m2m_buf_done(vbuf, state); > } > } > + > +void wave5_update_pix_fmt(struct v4l2_pix_format_mplane *pix_mp, > + int pix_fmt_type, > + unsigned int width, > + unsigned int height, > + const struct v4l2_frmsize_stepwise *frmsize) > +{ > + v4l2_apply_frmsize_constraints(&width, &height, frmsize); > + > + if (pix_fmt_type == VPU_FMT_TYPE_CODEC) { > + pix_mp->width = width; > + pix_mp->height = height; > + pix_mp->num_planes = 1; > + pix_mp->plane_fmt[0].bytesperline = 0; > + pix_mp->plane_fmt[0].sizeimage = max(DEFAULT_BS_SIZE(width, height), > + pix_mp->plane_fmt[0].sizeimage); > + } else { > + v4l2_fill_pixfmt_mp(pix_mp, pix_mp->pixelformat, width, height); > + } > + pix_mp->flags = 0; > + pix_mp->field = V4L2_FIELD_NONE; > +} > diff --git a/drivers/media/platform/chips-media/wave5/wave5-helper.h b/drivers/media/platform/chips-media/wave5/wave5-helper.h > index 6cee1c14d3ce..9937fce553fc 100644 > --- a/drivers/media/platform/chips-media/wave5/wave5-helper.h > +++ b/drivers/media/platform/chips-media/wave5/wave5-helper.h > @@ -28,4 +28,9 @@ const struct vpu_format *wave5_find_vpu_fmt_by_idx(unsigned int idx, > const struct vpu_format fmt_list[MAX_FMTS]); > enum wave_std wave5_to_vpu_std(unsigned int v4l2_pix_fmt, enum vpu_instance_type type); > void wave5_return_bufs(struct vb2_queue *q, u32 state); > +void wave5_update_pix_fmt(struct v4l2_pix_format_mplane *pix_mp, > + int pix_fmt_type, > + unsigned int width, > + unsigned int height, > + const struct v4l2_frmsize_stepwise *frmsize); > #endif > diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c > index 861a0664047c..f246c290ad6a 100644 > --- a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c > +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c > @@ -11,111 +11,92 @@ > #define VPU_DEC_DEV_NAME "C&M Wave5 VPU decoder" > #define VPU_DEC_DRV_NAME "wave5-dec" > > -#define DEFAULT_SRC_SIZE(width, height) ({ \ > - (width) * (height) / 8 * 3; \ > -}) > +static const struct v4l2_frmsize_stepwise dec_hevc_frmsize = { > + .min_width = W5_MIN_DEC_PIC_8_WIDTH, > + .max_width = W5_MAX_DEC_PIC_WIDTH, > + .step_width = W5_DEC_CODEC_STEP_WIDTH, > + .min_height = W5_MIN_DEC_PIC_8_HEIGHT, > + .max_height = W5_MAX_DEC_PIC_HEIGHT, > + .step_height = W5_DEC_CODEC_STEP_HEIGHT, > +}; > + > +static const struct v4l2_frmsize_stepwise dec_h264_frmsize = { > + .min_width = W5_MIN_DEC_PIC_32_WIDTH, > + .max_width = W5_MAX_DEC_PIC_WIDTH, > + .step_width = W5_DEC_CODEC_STEP_WIDTH, > + .min_height = W5_MIN_DEC_PIC_32_HEIGHT, > + .max_height = W5_MAX_DEC_PIC_HEIGHT, > + .step_height = W5_DEC_CODEC_STEP_HEIGHT, > +}; > + > +static const struct v4l2_frmsize_stepwise dec_raw_frmsize = { > + .min_width = W5_MIN_DEC_PIC_8_WIDTH, > + .max_width = W5_MAX_DEC_PIC_WIDTH, > + .step_width = W5_DEC_RAW_STEP_WIDTH, > + .min_height = W5_MIN_DEC_PIC_8_HEIGHT, > + .max_height = W5_MAX_DEC_PIC_HEIGHT, > + .step_height = W5_DEC_RAW_STEP_HEIGHT, > +}; > > static const struct vpu_format dec_fmt_list[FMT_TYPES][MAX_FMTS] = { > [VPU_FMT_TYPE_CODEC] = { > { > .v4l2_pix_fmt = V4L2_PIX_FMT_HEVC, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_hevc_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_H264, > - .max_width = 8192, > - .min_width = 32, > - .max_height = 4320, > - .min_height = 32, > + .v4l2_frmsize = &dec_h264_frmsize, > }, > }, > [VPU_FMT_TYPE_RAW] = { > { > .v4l2_pix_fmt = V4L2_PIX_FMT_YUV420, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_NV12, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_NV21, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_YUV422P, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_NV16, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_NV61, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_YUV420M, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_NV12M, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_NV21M, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_YUV422M, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_NV16M, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > { > .v4l2_pix_fmt = V4L2_PIX_FMT_NV61M, > - .max_width = 8192, > - .min_width = 8, > - .max_height = 4320, > - .min_height = 8, > + .v4l2_frmsize = &dec_raw_frmsize, > }, > } > }; > @@ -234,74 +215,6 @@ static void wave5_handle_src_buffer(struct vpu_instance *inst, dma_addr_t rd_ptr > inst->remaining_consumed_bytes = consumed_bytes; > } > > -static void wave5_update_pix_fmt(struct v4l2_pix_format_mplane *pix_mp, unsigned int width, > - unsigned int height) > -{ > - switch (pix_mp->pixelformat) { > - case V4L2_PIX_FMT_YUV420: > - case V4L2_PIX_FMT_NV12: > - case V4L2_PIX_FMT_NV21: > - pix_mp->width = round_up(width, 32); > - pix_mp->height = round_up(height, 16); > - pix_mp->plane_fmt[0].bytesperline = round_up(width, 32); > - pix_mp->plane_fmt[0].sizeimage = width * height * 3 / 2; > - break; > - case V4L2_PIX_FMT_YUV422P: > - case V4L2_PIX_FMT_NV16: > - case V4L2_PIX_FMT_NV61: > - pix_mp->width = round_up(width, 32); > - pix_mp->height = round_up(height, 16); > - pix_mp->plane_fmt[0].bytesperline = round_up(width, 32); > - pix_mp->plane_fmt[0].sizeimage = width * height * 2; > - break; > - case V4L2_PIX_FMT_YUV420M: > - pix_mp->width = round_up(width, 32); > - pix_mp->height = round_up(height, 16); > - pix_mp->plane_fmt[0].bytesperline = round_up(width, 32); > - pix_mp->plane_fmt[0].sizeimage = width * height; > - pix_mp->plane_fmt[1].bytesperline = round_up(width, 32) / 2; > - pix_mp->plane_fmt[1].sizeimage = width * height / 4; > - pix_mp->plane_fmt[2].bytesperline = round_up(width, 32) / 2; > - pix_mp->plane_fmt[2].sizeimage = width * height / 4; > - break; > - case V4L2_PIX_FMT_NV12M: > - case V4L2_PIX_FMT_NV21M: > - pix_mp->width = round_up(width, 32); > - pix_mp->height = round_up(height, 16); > - pix_mp->plane_fmt[0].bytesperline = round_up(width, 32); > - pix_mp->plane_fmt[0].sizeimage = width * height; > - pix_mp->plane_fmt[1].bytesperline = round_up(width, 32); > - pix_mp->plane_fmt[1].sizeimage = width * height / 2; > - break; > - case V4L2_PIX_FMT_YUV422M: > - pix_mp->width = round_up(width, 32); > - pix_mp->height = round_up(height, 16); > - pix_mp->plane_fmt[0].bytesperline = round_up(width, 32); > - pix_mp->plane_fmt[0].sizeimage = width * height; > - pix_mp->plane_fmt[1].bytesperline = round_up(width, 32) / 2; > - pix_mp->plane_fmt[1].sizeimage = width * height / 2; > - pix_mp->plane_fmt[2].bytesperline = round_up(width, 32) / 2; > - pix_mp->plane_fmt[2].sizeimage = width * height / 2; > - break; > - case V4L2_PIX_FMT_NV16M: > - case V4L2_PIX_FMT_NV61M: > - pix_mp->width = round_up(width, 32); > - pix_mp->height = round_up(height, 16); > - pix_mp->plane_fmt[0].bytesperline = round_up(width, 32); > - pix_mp->plane_fmt[0].sizeimage = width * height; > - pix_mp->plane_fmt[1].bytesperline = round_up(width, 32); > - pix_mp->plane_fmt[1].sizeimage = width * height; > - break; > - default: > - pix_mp->width = width; > - pix_mp->height = height; > - pix_mp->plane_fmt[0].bytesperline = 0; > - pix_mp->plane_fmt[0].sizeimage = max(DEFAULT_SRC_SIZE(width, height), > - pix_mp->plane_fmt[0].sizeimage); > - break; > - } > -} > - > static int start_decode(struct vpu_instance *inst, u32 *fail_res) > { > struct v4l2_m2m_ctx *m2m_ctx = inst->v4l2_fh.m2m_ctx; > @@ -389,6 +302,8 @@ static int handle_dynamic_resolution_change(struct vpu_instance *inst) > } > > if (p_dec_info->initial_info_obtained) { > + const struct vpu_format *vpu_fmt; > + > inst->conf_win.left = initial_info->pic_crop_rect.left; > inst->conf_win.top = initial_info->pic_crop_rect.top; > inst->conf_win.width = initial_info->pic_width - > @@ -396,10 +311,27 @@ static int handle_dynamic_resolution_change(struct vpu_instance *inst) > inst->conf_win.height = initial_info->pic_height - > initial_info->pic_crop_rect.top - initial_info->pic_crop_rect.bottom; > > - wave5_update_pix_fmt(&inst->src_fmt, initial_info->pic_width, > - initial_info->pic_height); > - wave5_update_pix_fmt(&inst->dst_fmt, initial_info->pic_width, > - initial_info->pic_height); > + vpu_fmt = wave5_find_vpu_fmt(inst->src_fmt.pixelformat, > + dec_fmt_list[VPU_FMT_TYPE_CODEC]); > + if (!vpu_fmt) > + return -EINVAL; > + > + wave5_update_pix_fmt(&inst->src_fmt, > + VPU_FMT_TYPE_CODEC, > + initial_info->pic_width, > + initial_info->pic_height, > + vpu_fmt->v4l2_frmsize); > + > + vpu_fmt = wave5_find_vpu_fmt(inst->dst_fmt.pixelformat, > + dec_fmt_list[VPU_FMT_TYPE_RAW]); > + if (!vpu_fmt) > + return -EINVAL; > + > + wave5_update_pix_fmt(&inst->dst_fmt, > + VPU_FMT_TYPE_RAW, > + initial_info->pic_width, > + initial_info->pic_height, > + vpu_fmt->v4l2_frmsize); > } > > v4l2_event_queue_fh(fh, &vpu_event_src_ch); > @@ -545,15 +477,11 @@ static int wave5_vpu_dec_enum_framesizes(struct file *f, void *fh, struct v4l2_f > vpu_fmt = wave5_find_vpu_fmt(fsize->pixel_format, dec_fmt_list[VPU_FMT_TYPE_RAW]); > if (!vpu_fmt) > return -EINVAL; > + return -ENOTTY; Huh? Where does this come from? It wasn't part of v4, and it doesn't make sense either. It looks like a spurious test line that you forgot to remove. Regards, Hans > } > > fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS; > - fsize->stepwise.min_width = vpu_fmt->min_width; > - fsize->stepwise.max_width = vpu_fmt->max_width; > - fsize->stepwise.step_width = 1; > - fsize->stepwise.min_height = vpu_fmt->min_height; > - fsize->stepwise.max_height = vpu_fmt->max_height; > - fsize->stepwise.step_height = 1; > + fsize->stepwise = *vpu_fmt->v4l2_frmsize; > > return 0; > } Regards, Hans