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

Commit 822c20ed authored by Deva Ramasubramanian's avatar Deva Ramasubramanian
Browse files

msm: vidc: Add support for VIDC_VIDEO_RATE_CONTROL_TIMESTAMP_MODE



In certain use cases, the timestamps provided by clients are uneven and
unpredictable. The unpredictability of timestamps causes uneveness in
the bitrate of encoded content. _TIMESTAMP_MODE_IGNORE allows the client
to indicate that its timestamps aren't to be trusted for rate control. In
these cases the core is expected to use it's own internal clock for rate
control.

Change-Id: I0a03f8b5a58c8677bc32101f0c4ea7696da6da98
Signed-off-by: default avatarDeva Ramasubramanian <dramasub@codeaurora.org>
parent 90d52535
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1678,6 +1678,16 @@ int create_pkt_cmd_session_set_property(
		pkt->size += sizeof(u32) * 2;
		break;
	}
	case HAL_PARAM_VENC_DISABLE_RC_TIMESTAMP:
	{
		struct hfi_enable *hfi;
		pkt->rg_property_data[0] =
			HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP;
		hfi = (struct hfi_enable *)&pkt->rg_property_data[1];
		hfi->enable = ((struct hfi_enable *)pdata)->enable;
		pkt->size += sizeof(u32) * 2;
		break;
	}
	/* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */
	case HAL_CONFIG_BUFFER_REQUIREMENTS:
	case HAL_CONFIG_PRIORITY:
+22 −0
Original line number Diff line number Diff line
@@ -137,6 +137,11 @@ static const char *const intra_refresh_modes[] = {
	"Random"
};

static const char *const timestamp_mode[] = {
	"Honor",
	"Ignore",
};

enum msm_venc_ctrl_cluster {
	MSM_VENC_CTRL_CLUSTER_QP = 1 << 0,
	MSM_VENC_CTRL_CLUSTER_INTRA_PERIOD = 1 << 1,
@@ -867,6 +872,17 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
		.qmenu = NULL,
		.cluster = 0,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_TIMESTAMP_MODE,
		.name = "Encoder Timestamp Mode",
		.type = V4L2_CTRL_TYPE_MENU,
		.default_value =
			V4L2_MPEG_VIDC_VIDEO_RATE_CONTROL_TIMESTAMP_MODE_HONOR,
		.menu_skip_mask = ~(
		(1 << V4L2_MPEG_VIDC_VIDEO_RATE_CONTROL_TIMESTAMP_MODE_HONOR) |
		(1 << V4L2_MPEG_VIDC_VIDEO_RATE_CONTROL_TIMESTAMP_MODE_IGNORE)),
		.qmenu = timestamp_mode,
	},
};

#define NUM_CTRLS ARRAY_SIZE(msm_venc_ctrls)
@@ -2200,6 +2216,12 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
		}
		pdata = &hier_p_layers;
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_TIMESTAMP_MODE:
		property_id = HAL_PARAM_VENC_DISABLE_RC_TIMESTAMP;
		enable.enable = (ctrl->val ==
		V4L2_MPEG_VIDC_VIDEO_RATE_CONTROL_TIMESTAMP_MODE_IGNORE);
		pdata = &enable;
		break;
	default:
		dprintk(VIDC_ERR, "Unsupported index: %x\n", ctrl->id);
		rc = -ENOTSUPP;
+1 −0
Original line number Diff line number Diff line
@@ -196,6 +196,7 @@ enum hal_property {
	HAL_CONFIG_VENC_USELTRFRAME,
	HAL_CONFIG_VENC_LTRPERIOD,
	HAL_PARAM_VENC_HIER_P_NUM_FRAMES,
	HAL_PARAM_VENC_DISABLE_RC_TIMESTAMP,
};

enum hal_domain {
+2 −0
Original line number Diff line number Diff line
@@ -323,6 +323,8 @@ struct hfi_buffer_info {
	(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x021)
#define HFI_PROPERTY_PARAM_VENC_PRESERVE_TEXT_QUALITY \
	(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x023)
#define HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP \
	(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x027)


#define HFI_PROPERTY_CONFIG_VENC_COMMON_START				\
+7 −0
Original line number Diff line number Diff line
@@ -871,6 +871,13 @@ enum v4l2_mpeg_vidc_video_ltrmode {
#define V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS \
		(V4L2_CID_MPEG_MSM_VIDC_BASE + 51)

#define V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_TIMESTAMP_MODE \
	(V4L2_CID_MPEG_MSM_VIDC_BASE + 52)
enum v4l2_mpeg_vidc_video_rate_control_timestamp_mode {
	V4L2_MPEG_VIDC_VIDEO_RATE_CONTROL_TIMESTAMP_MODE_HONOR = 0,
	V4L2_MPEG_VIDC_VIDEO_RATE_CONTROL_TIMESTAMP_MODE_IGNORE = 1,
};

/*  Camera class control IDs */

#define V4L2_CID_CAMERA_CLASS_BASE 	(V4L2_CTRL_CLASS_CAMERA | 0x900)