Loading drivers/media/platform/msm/vidc/governors/msm_vidc_dyn_gov.c +49 −27 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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, Loading @@ -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, Loading Loading @@ -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 ? Loading @@ -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; Loading Loading @@ -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)); Loading @@ -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; Loading Loading @@ -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)); Loading @@ -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)); Loading @@ -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[] = { Loading @@ -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}, Loading @@ -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", Loading drivers/media/platform/msm/vidc/msm_vidc_clocks.c +9 −0 Original line number Diff line number Diff line Loading @@ -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 && Loading drivers/media/platform/msm/vidc/vidc_hfi_api.h +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
drivers/media/platform/msm/vidc/governors/msm_vidc_dyn_gov.c +49 −27 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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, Loading @@ -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, Loading Loading @@ -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 ? Loading @@ -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; Loading Loading @@ -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)); Loading @@ -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; Loading Loading @@ -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)); Loading @@ -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)); Loading @@ -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[] = { Loading @@ -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}, Loading @@ -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", Loading
drivers/media/platform/msm/vidc/msm_vidc_clocks.c +9 −0 Original line number Diff line number Diff line Loading @@ -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 && Loading
drivers/media/platform/msm/vidc/vidc_hfi_api.h +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading