Merge "video: driver: update input, output and crop dimensions"

Bu işleme şunda yer alıyor:
qctecmdr
2022-03-26 23:24:19 -07:00
işlemeyi yapan: Gerrit - the friendly Code Review server
işleme 5fd0e0a094

Dosyayı Görüntüle

@@ -157,8 +157,20 @@ static int msm_venc_set_stride_scanline(struct msm_vidc_inst *inst,
return 0;
}
stride_y = inst->fmts[INPUT_PORT].fmt.pix_mp.width;
scanline_y = inst->fmts[INPUT_PORT].fmt.pix_mp.height;
if (is_image_session(inst)) {
stride_y = ALIGN(inst->fmts[INPUT_PORT].fmt.pix_mp.width, HEIC_GRID_DIMENSION);
scanline_y = ALIGN(inst->fmts[INPUT_PORT].fmt.pix_mp.height, HEIC_GRID_DIMENSION);
} else if (is_rgba_colorformat(color_format)) {
stride_y = VIDEO_RGB_STRIDE_PIX(inst->fmts[INPUT_PORT].fmt.pix_mp.pixelformat,
inst->fmts[INPUT_PORT].fmt.pix_mp.width);
scanline_y = VIDEO_RGB_SCANLINES(inst->fmts[INPUT_PORT].fmt.pix_mp.pixelformat,
inst->fmts[INPUT_PORT].fmt.pix_mp.height);
} else {
stride_y = VIDEO_Y_STRIDE_PIX(inst->fmts[INPUT_PORT].fmt.pix_mp.pixelformat,
inst->fmts[INPUT_PORT].fmt.pix_mp.width);
scanline_y = VIDEO_Y_SCANLINES(inst->fmts[INPUT_PORT].fmt.pix_mp.pixelformat,
inst->fmts[INPUT_PORT].fmt.pix_mp.height);
}
if (color_format == MSM_VIDC_FMT_NV12 ||
color_format == MSM_VIDC_FMT_P010 ||
color_format == MSM_VIDC_FMT_NV21) {
@@ -1134,7 +1146,6 @@ int msm_venc_s_fmt_output(struct msm_vidc_inst *inst, struct v4l2_format *f)
}
inst->buffers.output.size =
fmt->fmt.pix_mp.plane_fmt[0].sizeimage;
memcpy(f, fmt, sizeof(struct v4l2_format));
/* reset metadata buffer size with updated resolution*/
msm_vidc_update_meta_port_settings(inst);
@@ -1147,6 +1158,8 @@ int msm_venc_s_fmt_output(struct msm_vidc_inst *inst, struct v4l2_format *f)
inst->buffers.output.min_count,
inst->buffers.output.extra_count);
/* finally update client format */
memcpy(f, fmt, sizeof(struct v4l2_format));
return rc;
}
@@ -1198,8 +1211,7 @@ static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format *
int rc = 0;
struct v4l2_format *fmt, *output_fmt;
struct msm_vidc_core *core;
u32 pix_fmt, width, height, size, bytesperline,
crop_width, crop_height;
u32 pix_fmt, width, height, size, bytesperline;
if (!inst || !inst->core || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
@@ -1211,25 +1223,21 @@ static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format *
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)) {
width = VIDEO_RGB_STRIDE_PIX(f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.width);
height = VIDEO_RGB_SCANLINES(f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.height);
crop_width = VIDEO_RGB_STRIDE_PIX(f->fmt.pix_mp.pixelformat, inst->crop.width);
crop_height = VIDEO_RGB_SCANLINES(f->fmt.pix_mp.pixelformat, inst->crop.height);
bytesperline =
VIDEO_RGB_STRIDE_BYTES(f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.width);
} else if (is_image_session(inst)) {
width = f->fmt.pix_mp.width;
height = f->fmt.pix_mp.height;
if (is_image_session(inst)) {
width = ALIGN(f->fmt.pix_mp.width, HEIC_GRID_DIMENSION);
height = ALIGN(f->fmt.pix_mp.height, HEIC_GRID_DIMENSION);
crop_width = ALIGN(inst->crop.width, HEIC_GRID_DIMENSION);
crop_height = ALIGN(inst->crop.height, HEIC_GRID_DIMENSION);
inst->crop.width = ALIGN(inst->crop.width, HEIC_GRID_DIMENSION);
inst->crop.height = ALIGN(inst->crop.height, HEIC_GRID_DIMENSION);
bytesperline = width * (is_10bit_colorformat(pix_fmt) ? 2 : 1);
} else if (is_rgba_colorformat(pix_fmt)) {
bytesperline = VIDEO_RGB_STRIDE_BYTES(f->fmt.pix_mp.pixelformat,
f->fmt.pix_mp.width);
} else {
width = VIDEO_Y_STRIDE_PIX(f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.width);
height = VIDEO_Y_SCANLINES(f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.height);
crop_width = VIDEO_Y_STRIDE_PIX(f->fmt.pix_mp.pixelformat, inst->crop.width);
crop_height = VIDEO_Y_SCANLINES(f->fmt.pix_mp.pixelformat, inst->crop.height);
bytesperline = VIDEO_Y_STRIDE_BYTES(f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.width);
bytesperline = VIDEO_Y_STRIDE_BYTES(f->fmt.pix_mp.pixelformat,
f->fmt.pix_mp.width);
}
fmt = &inst->fmts[INPUT_PORT];
@@ -1273,9 +1281,8 @@ static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format *
}
inst->buffers.input.size = size;
if (fmt->fmt.pix_mp.width != crop_width ||
fmt->fmt.pix_mp.height != crop_height) {
struct v4l2_format *output_fmt;
if (f->fmt.pix_mp.width != inst->crop.width ||
f->fmt.pix_mp.height != inst->crop.height) {
/* reset crop dimensions with updated resolution */
inst->crop.top = inst->crop.left = 0;
@@ -1287,12 +1294,11 @@ static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format *
inst->compose.width = f->fmt.pix_mp.width;
inst->compose.height = f->fmt.pix_mp.height;
output_fmt = &inst->fmts[OUTPUT_PORT];
/* update output format */
rc = msm_venc_s_fmt_output(inst, output_fmt);
if (rc)
return rc;
}
memcpy(f, fmt, sizeof(struct v4l2_format));
/* reset metadata buffer size with updated resolution*/
msm_vidc_update_meta_port_settings(inst);
@@ -1305,6 +1311,9 @@ static int msm_venc_s_fmt_input(struct msm_vidc_inst *inst, struct v4l2_format *
inst->buffers.input.min_count,
inst->buffers.input.extra_count);
/* finally update client format */
memcpy(f, fmt, sizeof(struct v4l2_format));
return rc;
}
@@ -1862,10 +1871,8 @@ int msm_venc_inst_init(struct msm_vidc_inst *inst)
f = &inst->fmts[INPUT_PORT];
f->type = INPUT_MPLANE;
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);
f->fmt.pix_mp.width = DEFAULT_WIDTH;
f->fmt.pix_mp.height = DEFAULT_HEIGHT;
f->fmt.pix_mp.num_planes = 1;
f->fmt.pix_mp.plane_fmt[0].bytesperline =
VIDEO_Y_STRIDE_BYTES(f->fmt.pix_mp.pixelformat,