Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6aa25ee1 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: fix encoder bw voting for rc_off case"

parents b5ca255f bce83add
Loading
Loading
Loading
Loading
+49 −27
Original line number Diff line number Diff line
@@ -228,6 +228,19 @@ static struct lut const *__lut(int width, int height, int fps)
	return &LUT[ARRAY_SIZE(LUT) - 1];
}

static fp_t __compression_ratio(struct lut const *entry, int bpp)
{
	int c = 0;

	for (c = 0; c < COMPRESSION_RATIO_MAX; ++c) {
		if (entry->compression_ratio[c].bpp == bpp)
			return entry->compression_ratio[c].ratio;
	}

	WARN(true, "Shouldn't be here, LUT possibly corrupted?\n");
	return FP_ZERO; /* impossible */
}

#define DUMP_HEADER_MAGIC 0xdeadbeef
#define DUMP_FP_FMT "%FP" /* special format for fp_t */
struct dump {
@@ -594,8 +607,7 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,
	/* Encoder Parameters */
	int width, height, fps, lcu_size, bitrate, lcu_per_frame,
		collocated_bytes_per_lcu, tnbr_per_lcu, dpb_bpp,
		original_color_format, dpb_ubwc_tile_width,
		dpb_ubwc_tile_height, vertical_tile_width;
		original_color_format, vertical_tile_width;
	bool work_mode_1, original_compression_enabled,
		low_power, rotation, cropping_or_scaling,
		b_frames_enabled = false,
@@ -605,6 +617,7 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,

	fp_t bins_to_bit_factor, dpb_compression_factor,
		original_compression_factor,
		original_compression_factor_y,
		y_bw_no_ubwc_8bpp, y_bw_no_ubwc_10bpp,
		input_compression_factor,
		ref_y_read_bw_factor, ref_cbcr_read_bw_factor,
@@ -641,19 +654,18 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,
	fps = d->fps;
	width = max(d->input_width, BASELINE_DIMENSIONS.width);
	height = max(d->input_height, BASELINE_DIMENSIONS.height);
	bitrate = __lut(width, height, fps)->bitrate;
	bitrate = d->bitrate > 0 ? d->bitrate / 1000000 :
		__lut(width, height, fps)->bitrate;
	lcu_size = d->lcu_size;
	lcu_per_frame = DIV_ROUND_UP(width, lcu_size) *
		DIV_ROUND_UP(height, lcu_size);
	tnbr_per_lcu = lcu_size == 16 ? 128 :
		lcu_size == 32 ? 64 : 128;
	tnbr_per_lcu = 16;

	y_bw_no_ubwc_8bpp = fp_div(fp_div(fp_mult(
		FP_INT((int)(width * height)), FP_INT((int)(256 * fps))),
		FP_INT(32 * 8)), FP_INT(1000 * 1000));
	y_bw_no_ubwc_10bpp = fp_div(fp_div(fp_mult(
		FP_INT((int)(width * height)), FP_INT((int)(256 * fps))),
		FP_INT(48 * 4)), FP_INT(1000 * 1000));
	y_bw_no_ubwc_8bpp = fp_div(fp_mult(
		FP_INT((int)(width * height)), FP_INT(fps)),
		FP_INT(1000 * 1000));
	y_bw_no_ubwc_10bpp = fp_div(fp_mult(y_bw_no_ubwc_8bpp,
		FP_INT(256)), FP_INT(192));

	b_frames_enabled = d->b_frames_enabled;
	original_color_format = d->num_formats >= 1 ?
@@ -667,8 +679,6 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,
	low_power = d->power_mode == VIDC_POWER_LOW;
	bins_to_bit_factor = work_mode_1 ?
		FP_INT(0) : FP_INT(4);
	dpb_ubwc_tile_width = dpb_bpp == 8 ? 32 : 48;
	dpb_ubwc_tile_height = dpb_bpp == 8 ? 8 : 4;

	if (d->use_sys_cache) {
		llc_ref_chroma_cache_enabled = true;
@@ -697,13 +707,24 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,

	input_compression_factor = FP(integer_part, frac_part, 100);

	original_compression_factor =
		original_compression_enabled ? d->use_dpb_read ?
			dpb_compression_factor : input_compression_factor :
		FP_ONE;
	original_compression_factor = original_compression_factor_y =
		!original_compression_enabled ? FP_ONE :
		__compression_ratio(__lut(width, height, fps), dpb_bpp);
	/* use input cr if it is valid (not 1), otherwise use lut */
	if (original_compression_enabled &&
		input_compression_factor != FP_ONE) {
		original_compression_factor = input_compression_factor;
		/* Luma usually has lower compression factor than Chroma,
		 * input cf is overall cf, add 1.08 factor for Luma cf
		 */
		original_compression_factor_y =
			input_compression_factor > FP(1, 8, 100) ?
			fp_div(input_compression_factor, FP(1, 8, 100)) :
			input_compression_factor;
	}

	mese_read_factor = fp_div(FP_INT((width * height * fps)/4),
		original_compression_factor);
		original_compression_factor_y);
	mese_read_factor = fp_div(fp_mult(mese_read_factor, FP(2, 53, 100)),
		 FP_INT(1000 * 1000));

@@ -714,8 +735,8 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,
	collocated_bytes_per_lcu = lcu_size == 16 ? 16 :
				lcu_size == 32 ? 64 : 256;

	ddr.collocated_read = FP_INT(lcu_per_frame *
			collocated_bytes_per_lcu * fps / bps(1));
	ddr.collocated_read = fp_div(FP_INT(lcu_per_frame *
			collocated_bytes_per_lcu * fps), FP_INT(bps(1)));

	ddr.collocated_write = ddr.collocated_read;

@@ -753,7 +774,7 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,

	ddr.orig_read = dpb_bpp == 8 ? y_bw_no_ubwc_8bpp : y_bw_no_ubwc_10bpp;
	ddr.orig_read = fp_div(fp_mult(ddr.orig_read, FP(1, 50, 100)),
		input_compression_factor);
		original_compression_factor);

	ddr.line_buffer_read = FP_INT(tnbr_per_lcu * lcu_per_frame *
		fps / bps(1));
@@ -765,13 +786,12 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,
	}

	ddr.mese_read = dpb_bpp == 8 ? y_bw_no_ubwc_8bpp : y_bw_no_ubwc_10bpp;
	ddr.mese_read = fp_div(ddr.mese_read,
		fp_mult(FP(1, 37, 100), original_compression_factor)) +
		mese_read_factor;
	ddr.mese_read = fp_div(fp_mult(ddr.mese_read, FP(1, 37, 100)),
		original_compression_factor_y) + mese_read_factor;

	ddr.mese_write = FP_INT((width * height)/512) +
		fp_div(FP_INT((width * height)/4),
		original_compression_factor) +
		original_compression_factor_y) +
		FP_INT((width * height)/128);
	ddr.mese_write = fp_div(fp_mult(ddr.mese_write, FP_INT(fps)),
		FP_INT(1000 * 1000));
@@ -784,10 +804,9 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,
		ddr.line_buffer_read + ddr.line_buffer_write +
		ddr.mese_read + ddr.mese_write;

	llc.total = llc.ref_read_crcb + llc.line_buffer;

	qsmmu_bw_overhead_factor = FP(1, 3, 100);
	ddr.total = fp_mult(ddr.total, qsmmu_bw_overhead_factor);
	llc.total = llc.ref_read_crcb + llc.line_buffer + ddr.total;

	if (debug) {
		struct dump dump[] = {
@@ -799,6 +818,7 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,
		{"cropping or scaling", "%d", cropping_or_scaling},
		{"low power mode", "%d", low_power},
		{"work Mode", "%d", work_mode_1},
		{"B frame enabled", "%d", b_frames_enabled},
		{"original frame format", "%#x", original_color_format},
		{"original compression enabled", "%d",
			original_compression_enabled},
@@ -819,6 +839,8 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d,
		{"bins to bit factor", DUMP_FP_FMT, bins_to_bit_factor},
		{"original compression factor", DUMP_FP_FMT,
			original_compression_factor},
		{"original compression factor y", DUMP_FP_FMT,
			original_compression_factor_y},
		{"mese read factor", DUMP_FP_FMT,
			mese_read_factor},
		{"qsmmu_bw_overhead_factor",
+9 −0
Original line number Diff line number Diff line
@@ -305,6 +305,15 @@ int msm_comm_vote_bus(struct msm_vidc_core *core)
				V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES) != 0;

		vote_data[i].fps = msm_vidc_get_fps(inst);
		if (inst->session_type == MSM_VIDC_ENCODER) {
			vote_data[i].bitrate = inst->clk_data.bitrate;
			/* scale bitrate if operating rate is larger than fps */
			if (vote_data[i].fps > inst->prop.fps
				&& inst->prop.fps) {
				vote_data[i].bitrate = vote_data[i].bitrate /
				inst->prop.fps * vote_data[i].fps;
			}
		}

		vote_data[i].power_mode = 0;
		if (inst->clk_data.buffer_counter < DCVS_FTB_WINDOW &&
+1 −1
Original line number Diff line number Diff line
@@ -1393,7 +1393,7 @@ struct vidc_bus_vote_data {
	enum hal_video_codec codec;
	enum hal_uncompressed_format color_formats[2];
	int num_formats; /* 1 = DPB-OPB unified; 2 = split */
	int input_height, input_width, fps;
	int input_height, input_width, fps, bitrate;
	int output_height, output_width;
	int compression_ratio;
	int complexity_factor;