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

Commit 66a5df49 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: Add support to H264 CABAC bitrate"

parents b3a40b99 b3089c34
Loading
Loading
Loading
Loading
+34 −9
Original line number Diff line number Diff line
@@ -1506,6 +1506,29 @@ static int msm_venc_resolve_rate_control(struct msm_vidc_inst *inst,
	return 0;
}

static int msm_venc_update_bitrate(struct msm_vidc_inst *inst)
{
	u32 cabac_max_bitrate = 0;

	if (!inst) {
		d_vpr_e("%s: invalid params %pK\n", __func__);
		return -EINVAL;
	}

	if (get_v4l2_codec(inst) == V4L2_PIX_FMT_H264) {
		cabac_max_bitrate = inst->capability.cap[CAP_CABAC_BITRATE].max;
		if ((inst->clk_data.bitrate > cabac_max_bitrate) &&
			(inst->entropy_mode == HFI_H264_ENTROPY_CABAC)) {
			s_vpr_h(inst->sid,
				"%s: update bitrate %u to max allowed cabac bitrate %u\n",
				__func__, inst->clk_data.bitrate,
				cabac_max_bitrate);
			inst->clk_data.bitrate = cabac_max_bitrate;
		}
	}
	return 0;
}

int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
{
	int rc = 0;
@@ -1564,6 +1587,10 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
	case V4L2_CID_MPEG_VIDEO_BITRATE:
		inst->clk_data.bitrate = ctrl->val;
		if (inst->state == MSM_VIDC_START_DONE) {
			rc = msm_venc_update_bitrate(inst);
			if (rc)
				s_vpr_e(sid, "%s: Update bitrate failed\n",
					__func__);
			rc = msm_venc_set_bitrate(inst);
			if (rc)
				s_vpr_e(sid, "%s: set bitrate failed\n",
@@ -2645,7 +2672,6 @@ int msm_venc_set_bitrate(struct msm_vidc_inst *inst)
{
	int rc = 0;
	struct hfi_device *hdev;
	struct v4l2_ctrl *ctrl;
	struct hfi_bitrate bitrate;
	struct hfi_enable enable;

@@ -2671,8 +2697,7 @@ int msm_venc_set_bitrate(struct msm_vidc_inst *inst)
		return rc;
	}

	ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDEO_BITRATE);
	bitrate.bit_rate = ctrl->val;
	bitrate.bit_rate = inst->clk_data.bitrate;
	bitrate.layer_id = MSM_VIDC_ALL_LAYER_ID;
	s_vpr_h(inst->sid, "%s: %d\n", __func__, bitrate.bit_rate);
	rc = call_hfi_op(hdev, session_set_property, inst->session,
@@ -2688,12 +2713,12 @@ int msm_venc_set_layer_bitrate(struct msm_vidc_inst *inst)
{
	int rc = 0, i = 0;
	struct hfi_device *hdev;
	struct v4l2_ctrl *bitrate = NULL;
	struct v4l2_ctrl *layer = NULL;
	struct v4l2_ctrl *max_layer = NULL;
	struct v4l2_ctrl *layer_br_ratios[MAX_HIER_CODING_LAYER] = {NULL};
	struct hfi_bitrate layer_br;
	struct hfi_enable enable;
	u32 bitrate;

	if (!inst || !inst->core) {
		d_vpr_e("%s: invalid params %pK\n", __func__, inst);
@@ -2760,10 +2785,10 @@ int msm_venc_set_layer_bitrate(struct msm_vidc_inst *inst)
		goto error;
	}

	bitrate = get_ctrl(inst, V4L2_CID_MPEG_VIDEO_BITRATE);
	bitrate = inst->clk_data.bitrate;
	for (i = 0; i < layer->val; ++i) {
		layer_br.bit_rate =
			bitrate->val * layer_br_ratios[i]->val / 100;
			bitrate * layer_br_ratios[i]->val / 100;
		layer_br.layer_id = i;
		s_vpr_h(inst->sid, "%s: Bitrate for Layer[%u]: [%u]\n",
			__func__, layer_br.layer_id, layer_br.bit_rate);
@@ -4485,6 +4510,9 @@ int msm_venc_set_properties(struct msm_vidc_inst *inst)
	int rc = 0;

	rc = msm_venc_update_entropy_mode(inst);
	if (rc)
		goto exit;
	rc = msm_venc_update_bitrate(inst);
	if (rc)
		goto exit;
	rc = handle_all_intra_restrictions(inst);
@@ -4512,9 +4540,6 @@ int msm_venc_set_properties(struct msm_vidc_inst *inst)
	if (rc)
		goto exit;
	rc = msm_venc_set_8x8_transform(inst);
	if (rc)
		goto exit;
	rc = msm_venc_set_bitrate(inst);
	if (rc)
		goto exit;
	rc = msm_venc_set_entropy_mode(inst);
+5 −1
Original line number Diff line number Diff line
@@ -185,6 +185,7 @@ static struct msm_vidc_codec_capability lito_capabilities_v0[] = {
	{CAP_MBS_PER_SECOND, DOMAINS_ALL, CODECS_ALL, 36, 1958400, 1, 1958400},
	{CAP_FRAMERATE, DOMAINS_ALL, CODECS_ALL, 1, 480, 1, 30},
	{CAP_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 200000000, 1, 20000000},
	{CAP_CABAC_BITRATE, ENC, H264, 1, 200000000, 1, 20000000},
	{CAP_SCALE_X, ENC, CODECS_ALL, 8192, 65536, 1, 8192},
	{CAP_SCALE_Y, ENC, CODECS_ALL, 8192, 65536, 1, 8192},
	{CAP_SCALE_X, DEC, CODECS_ALL, 65536, 65536, 1, 65536},
@@ -279,6 +280,7 @@ static struct msm_vidc_codec_capability lito_capabilities_v1[] = {
	{CAP_MBS_PER_SECOND, DOMAINS_ALL, CODECS_ALL, 36, 1224000, 1, 1224000},
	{CAP_FRAMERATE, DOMAINS_ALL, CODECS_ALL, 1, 240, 1, 30},
	{CAP_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 100000000, 1, 20000000},
	{CAP_CABAC_BITRATE, ENC, H264, 1, 100000000, 1, 20000000},
	{CAP_SCALE_X, ENC, CODECS_ALL, 8192, 65536, 1, 8192},
	{CAP_SCALE_Y, ENC, CODECS_ALL, 8192, 65536, 1, 8192},
	{CAP_SCALE_X, DEC, CODECS_ALL, 65536, 65536, 1, 65536},
@@ -406,6 +408,8 @@ static struct msm_vidc_codec_capability kona_capabilities[] = {
	{CAP_MBS_PER_SECOND, DOMAINS_ALL, CODECS_ALL, 64, 7833600, 1, 7833600},
	{CAP_FRAMERATE, DOMAINS_ALL, CODECS_ALL, 1, 960, 1, 30},
	{CAP_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 220000000, 1, 20000000},
	{CAP_BITRATE, ENC, HEVC, 1, 160000000, 1, 20000000},
	{CAP_CABAC_BITRATE, ENC, H264, 1, 160000000, 1, 20000000},
	{CAP_SCALE_X, ENC, CODECS_ALL, 8192, 65536, 1, 8192},
	{CAP_SCALE_Y, ENC, CODECS_ALL, 8192, 65536, 1, 8192},
	{CAP_SCALE_X, DEC, CODECS_ALL, 65536, 65536, 1, 65536},
@@ -438,7 +442,7 @@ static struct msm_vidc_codec_capability kona_capabilities[] = {
	{CAP_FRAMERATE, ENC, VP8, 1, 60, 1, 30},
	{CAP_FRAMERATE, DEC, VP8, 1, 120, 1, 30},
	{CAP_BITRATE, ENC, VP8, 1, 74000000, 1, 20000000},
	{CAP_BITRATE, DEC, VP8, 1, 220000000, 1, 20000000},
	{CAP_BITRATE, DEC, VP8, 1, 100000000, 1, 20000000},

	/* Mpeg2 decoder specific */
	{CAP_FRAME_WIDTH, DEC, MPEG2, 128, 1920, 1, 1920},
+1 −0
Original line number Diff line number Diff line
@@ -247,6 +247,7 @@ enum hal_capability {
	CAP_SCALE_X,
	CAP_SCALE_Y,
	CAP_BITRATE,
	CAP_CABAC_BITRATE,
	CAP_BFRAME,
	CAP_PEAKBITRATE,
	CAP_HIER_P_NUM_ENH_LAYERS,