summaryrefslogtreecommitdiff
path: root/drivers/media/platform/qcom/iris/iris_venc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/platform/qcom/iris/iris_venc.c')
-rw-r--r--drivers/media/platform/qcom/iris/iris_venc.c48
1 files changed, 35 insertions, 13 deletions
diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
index 5830eba93c68..6461d9c9d598 100644
--- a/drivers/media/platform/qcom/iris/iris_venc.c
+++ b/drivers/media/platform/qcom/iris/iris_venc.c
@@ -62,12 +62,17 @@ int iris_venc_inst_init(struct iris_inst *inst)
inst->crop.left = 0;
inst->crop.top = 0;
- inst->crop.width = f->fmt.pix_mp.width;
- inst->crop.height = f->fmt.pix_mp.height;
+ inst->crop.width = DEFAULT_WIDTH;
+ inst->crop.height = DEFAULT_HEIGHT;
inst->operating_rate = DEFAULT_FPS;
inst->frame_rate = DEFAULT_FPS;
+ inst->enc_raw_width = DEFAULT_WIDTH;
+ inst->enc_raw_height = DEFAULT_HEIGHT;
+ inst->enc_scale_width = DEFAULT_WIDTH;
+ inst->enc_scale_height = DEFAULT_HEIGHT;
+
memcpy(&inst->fw_caps[0], &core->inst_fw_caps_enc[0],
INST_FW_CAP_MAX * sizeof(struct platform_inst_fw_cap));
@@ -223,15 +228,32 @@ int iris_venc_try_fmt(struct iris_inst *inst, struct v4l2_format *f)
static int iris_venc_s_fmt_output(struct iris_inst *inst, struct v4l2_format *f)
{
+ const struct iris_fmt *venc_fmt;
struct v4l2_format *fmt;
+ u32 codec_align;
iris_venc_try_fmt(inst, f);
- if (!(find_format(inst, f->fmt.pix_mp.pixelformat, f->type)))
+ venc_fmt = find_format(inst, f->fmt.pix_mp.pixelformat, f->type);
+ if (!venc_fmt)
return -EINVAL;
+ codec_align = venc_fmt->pixfmt == V4L2_PIX_FMT_HEVC ? 32 : 16;
+
fmt = inst->fmt_dst;
fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ /*
+ * If output format size != input format size,
+ * it is considered a scaling case,
+ * and the scaled size needs to be saved.
+ */
+ if (f->fmt.pix_mp.width != inst->fmt_src->fmt.pix_mp.width ||
+ f->fmt.pix_mp.height != inst->fmt_src->fmt.pix_mp.height) {
+ inst->enc_scale_width = f->fmt.pix_mp.width;
+ inst->enc_scale_height = f->fmt.pix_mp.height;
+ fmt->fmt.pix_mp.width = ALIGN(f->fmt.pix_mp.width, codec_align);
+ fmt->fmt.pix_mp.height = ALIGN(f->fmt.pix_mp.height, codec_align);
+ }
fmt->fmt.pix_mp.num_planes = 1;
fmt->fmt.pix_mp.plane_fmt[0].bytesperline = 0;
fmt->fmt.pix_mp.plane_fmt[0].sizeimage = iris_get_buffer_size(inst, BUF_OUTPUT);
@@ -287,6 +309,11 @@ static int iris_venc_s_fmt_input(struct iris_inst *inst, struct v4l2_format *f)
inst->buffers[BUF_INPUT].min_count = iris_vpu_buf_count(inst, BUF_INPUT);
inst->buffers[BUF_INPUT].size = fmt->fmt.pix_mp.plane_fmt[0].sizeimage;
+ inst->enc_raw_width = f->fmt.pix_mp.width;
+ inst->enc_raw_height = f->fmt.pix_mp.height;
+ inst->enc_scale_width = f->fmt.pix_mp.width;
+ inst->enc_scale_height = f->fmt.pix_mp.height;
+
if (f->fmt.pix_mp.width != inst->crop.width ||
f->fmt.pix_mp.height != inst->crop.height) {
inst->crop.top = 0;
@@ -382,8 +409,7 @@ int iris_venc_s_param(struct iris_inst *inst, struct v4l2_streamparm *s_parm)
struct v4l2_fract *timeperframe = NULL;
u32 default_rate = DEFAULT_FPS;
bool is_frame_rate = false;
- u64 us_per_frame, fps;
- u32 max_rate;
+ u32 fps, max_rate;
int ret = 0;
@@ -405,23 +431,19 @@ int iris_venc_s_param(struct iris_inst *inst, struct v4l2_streamparm *s_parm)
timeperframe->denominator = default_rate;
}
- us_per_frame = timeperframe->numerator * (u64)USEC_PER_SEC;
- do_div(us_per_frame, timeperframe->denominator);
-
- if (!us_per_frame)
+ fps = timeperframe->denominator / timeperframe->numerator;
+ if (!fps)
return -EINVAL;
- fps = (u64)USEC_PER_SEC;
- do_div(fps, us_per_frame);
if (fps > max_rate) {
ret = -ENOMEM;
goto reset_rate;
}
if (is_frame_rate)
- inst->frame_rate = (u32)fps;
+ inst->frame_rate = fps;
else
- inst->operating_rate = (u32)fps;
+ inst->operating_rate = fps;
if ((s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE && vb2_is_streaming(src_q)) ||
(s_parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE && vb2_is_streaming(dst_q))) {