Commit 5ad964ad authored by Dikshita Agarwal's avatar Dikshita Agarwal Committed by Hans Verkuil
Browse files

media: iris: Initialize and deinitialize encoder instance structure



Introduce initialization and deinitialization for internal encoder
instance structure with necessary hooks.

Tested-by: Vikash Garodia <quic_vgarodia@quicinc.com> # X1E80100
Reviewed-by: default avatarVikash Garodia <quic_vgarodia@quicinc.com>
Reviewed-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-HDK
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK
Signed-off-by: default avatarDikshita Agarwal <quic_dikshita@quicinc.com>
Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # x1e80100-crd
Signed-off-by: default avatarBryan O'Donoghue <bod@kernel.org>
Signed-off-by: default avatarHans Verkuil <hverkuil+cisco@kernel.org>
parent 787c535a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ qcom-iris-objs += \
             iris_vidc.o \
             iris_vb2.o \
             iris_vdec.o \
             iris_venc.o \
             iris_vpu2.o \
             iris_vpu3x.o \
             iris_vpu_buffer.o \
+48 −11
Original line number Diff line number Diff line
@@ -63,7 +63,12 @@
static u32 iris_yuv_buffer_size_nv12(struct iris_inst *inst)
{
	u32 y_plane, uv_plane, y_stride, uv_stride, y_scanlines, uv_scanlines;
	struct v4l2_format *f = inst->fmt_dst;
	struct v4l2_format *f;

	if (inst->domain == DECODER)
		f = inst->fmt_dst;
	else
		f = inst->fmt_src;

	y_stride = ALIGN(f->fmt.pix_mp.width, Y_STRIDE_ALIGN);
	uv_stride = ALIGN(f->fmt.pix_mp.width, UV_STRIDE_ALIGN);
@@ -194,7 +199,7 @@ static u32 iris_yuv_buffer_size_qc08c(struct iris_inst *inst)
	return ALIGN(y_meta_plane + y_plane + uv_meta_plane + uv_plane, PIXELS_4K);
}

static u32 iris_bitstream_buffer_size(struct iris_inst *inst)
static u32 iris_dec_bitstream_buffer_size(struct iris_inst *inst)
{
	struct platform_inst_caps *caps = inst->core->iris_platform_data->inst_caps;
	u32 base_res_mbs = NUM_MBS_4K;
@@ -219,12 +224,34 @@ static u32 iris_bitstream_buffer_size(struct iris_inst *inst)
	return ALIGN(frame_size, PIXELS_4K);
}

static u32 iris_enc_bitstream_buffer_size(struct iris_inst *inst)
{
	u32 aligned_width, aligned_height, bitstream_size, yuv_size;
	struct v4l2_format *f;

	f = inst->fmt_dst;

	aligned_width = ALIGN(f->fmt.pix_mp.width, 32);
	aligned_height = ALIGN(f->fmt.pix_mp.height, 32);
	bitstream_size = aligned_width * aligned_height * 3;
	yuv_size = (aligned_width * aligned_height * 3) >> 1;
	if (aligned_width * aligned_height > (4096 * 2176))
		/* bitstream_size = 0.25 * yuv_size; */
		bitstream_size = (bitstream_size >> 3);
	else if (aligned_width * aligned_height > (1280 * 720))
		/* bitstream_size = 0.5 * yuv_size; */
		bitstream_size = (bitstream_size >> 2);

	return ALIGN(bitstream_size, 4096);
}

int iris_get_buffer_size(struct iris_inst *inst,
			 enum iris_buffer_type buffer_type)
{
	if (inst->domain == DECODER) {
		switch (buffer_type) {
		case BUF_INPUT:
		return iris_bitstream_buffer_size(inst);
			return iris_dec_bitstream_buffer_size(inst);
		case BUF_OUTPUT:
			return iris_yuv_buffer_size_nv12(inst);
		case BUF_DPB:
@@ -232,6 +259,16 @@ int iris_get_buffer_size(struct iris_inst *inst,
		default:
			return 0;
		}
	} else {
		switch (buffer_type) {
		case BUF_INPUT:
			return iris_yuv_buffer_size_nv12(inst);
		case BUF_OUTPUT:
			return iris_enc_bitstream_buffer_size(inst);
		default:
			return 0;
		}
	}
}

static void iris_fill_internal_buf_info(struct iris_inst *inst,
+6 −1
Original line number Diff line number Diff line
@@ -109,7 +109,12 @@ static int iris_hfi_gen1_session_open(struct iris_inst *inst)
	packet.shdr.hdr.size = sizeof(struct hfi_session_open_pkt);
	packet.shdr.hdr.pkt_type = HFI_CMD_SYS_SESSION_INIT;
	packet.shdr.session_id = inst->session_id;

	if (inst->domain == DECODER)
		packet.session_domain = HFI_SESSION_TYPE_DEC;
	else
		packet.session_domain = HFI_SESSION_TYPE_ENC;

	packet.session_codec = codec;

	reinit_completion(&inst->completion);
+1 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@

#define HFI_VIDEO_ARCH_OX				0x1

#define HFI_SESSION_TYPE_ENC				1
#define HFI_SESSION_TYPE_DEC				2

#define HFI_VIDEO_CODEC_H264				0x00000002
+7 −0
Original line number Diff line number Diff line
@@ -12,6 +12,9 @@
#include "iris_core.h"
#include "iris_utils.h"

#define DEFAULT_WIDTH 320
#define DEFAULT_HEIGHT 240

/**
 * struct iris_inst - holds per video instance parameters
 *
@@ -24,7 +27,9 @@
 * @fmt_src: structure of v4l2_format for source
 * @fmt_dst: structure of v4l2_format for destination
 * @ctrl_handler: reference of v4l2 ctrl handler
 * @domain: domain type: encoder or decoder
 * @crop: structure of crop info
 * @compose: structure of compose info
 * @completion: structure of signal completions
 * @flush_completion: structure of signal completions for flush cmd
 * @flush_responses_pending: counter to track number of pending flush responses
@@ -57,7 +62,9 @@ struct iris_inst {
	struct v4l2_format		*fmt_src;
	struct v4l2_format		*fmt_dst;
	struct v4l2_ctrl_handler	ctrl_handler;
	enum domain_type		domain;
	struct iris_hfi_rect_desc	crop;
	struct iris_hfi_rect_desc	compose;
	struct completion		completion;
	struct completion		flush_completion;
	u32				flush_responses_pending;
Loading