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

Commit 867a0ceb authored by Deepak Kushwah's avatar Deepak Kushwah Committed by Gerrit - the friendly Code Review server
Browse files

msm: vidc: Allow clients to suggest I-frame sizes



Clients that want to influence the size I-frames emitted by the encoder
can set V4L2_CID_MPEG_VIDC_VIDEO_VENC_IFRAMESIZE_TYPE.

Change-Id: I4e6853022b558069304cde4cff7bc1445fd66213
Signed-off-by: default avatarDeepak Kushwah <dkushwah@codeaurora.org>
parent f6a9d356
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -2153,6 +2153,33 @@ int create_pkt_cmd_session_set_property(
		pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
		break;
	}
	case HAL_PARAM_VENC_IFRAMESIZE_TYPE:
	{
		enum hal_iframesize_type hal =
			*(enum hal_iframesize_type *)pdata;
		struct hfi_iframe_size *hfi = (struct hfi_iframe_size *)
			&pkt->rg_property_data[1];

		switch (hal) {
		case HAL_IFRAMESIZE_TYPE_DEFAULT:
			hfi->type = HFI_IFRAME_SIZE_DEFAULT;
			break;
		case HAL_IFRAMESIZE_TYPE_MEDIUM:
			hfi->type = HFI_IFRAME_SIZE_MEDIUM;
			break;
		case HAL_IFRAMESIZE_TYPE_HUGE:
			hfi->type = HFI_IFRAME_SIZE_HIGH;
			break;
		case HAL_IFRAMESIZE_TYPE_UNLIMITED:
			hfi->type = HFI_IFRAME_SIZE_UNLIMITED;
			break;
		default:
			return -ENOTSUPP;
		}
		pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_VENC_IFRAMESIZE;
		pkt->size += sizeof(u32) + sizeof(struct hfi_iframe_size);
		break;
	}
	/* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */
	case HAL_CONFIG_BUFFER_REQUIREMENTS:
	case HAL_CONFIG_PRIORITY:
+42 −0
Original line number Diff line number Diff line
@@ -185,6 +185,13 @@ static const char *const timestamp_mode[] = {
	"Ignore",
};

static const char *const iframe_sizes[] = {
	"Default",
	"Medium",
	"Huge",
	"Unlimited"
};

static struct msm_vidc_ctrl msm_venc_ctrls[] = {
	{
		.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD,
@@ -1300,6 +1307,20 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
		.default_value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE,
		.step = 1,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE,
		.name = "Bounds of I-frame size",
		.type = V4L2_CTRL_TYPE_MENU,
		.minimum = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT,
		.maximum = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED,
		.default_value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT,
		.menu_skip_mask = ~(
			(1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT) |
			(1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM) |
			(1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE) |
			(1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED)),
		.qmenu = iframe_sizes,
	},
};

static struct v4l2_ctrl *get_ctrl_from_cluster(int id,
@@ -2142,6 +2163,19 @@ static inline int venc_v4l2_to_hal(int id, int value)
		default:
			goto unknown_value;
		}
	case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE:
		switch (value) {
		case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT:
			return HAL_IFRAMESIZE_TYPE_DEFAULT;
		case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM:
			return HAL_IFRAMESIZE_TYPE_MEDIUM;
		case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE:
			return HAL_IFRAMESIZE_TYPE_HUGE;
		case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED:
			return HAL_IFRAMESIZE_TYPE_UNLIMITED;
		default:
			goto unknown_value;
		}
	}

unknown_value:
@@ -2230,6 +2264,7 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
	int frameqp = 0;
	int pic_order_cnt = 0;
	struct hal_video_signal_info signal_info = {0};
	enum hal_iframesize_type iframesize_type = HAL_IFRAMESIZE_TYPE_DEFAULT;

	if (!inst || !inst->core || !inst->core->device) {
		dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
@@ -3318,6 +3353,13 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
		}
		pdata = &enable;
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE:
		property_id = HAL_PARAM_VENC_IFRAMESIZE_TYPE;
		iframesize_type = venc_v4l2_to_hal(
				V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE,
				ctrl->val);
		pdata = &iframesize_type;
		break;
	default:
		dprintk(VIDC_ERR, "Unsupported index: %x\n", ctrl->id);
		rc = -ENOTSUPP;
+8 −0
Original line number Diff line number Diff line
@@ -242,6 +242,7 @@ enum hal_property {
	HAL_PARAM_VENC_VIDEO_SIGNAL_INFO,
	HAL_PARAM_VENC_SESSION_QP_RANGE_PACKED,
	HAL_PARAM_VENC_H264_TRANSFORM_8x8,
	HAL_PARAM_VENC_IFRAMESIZE_TYPE,
};

enum hal_domain {
@@ -1002,6 +1003,13 @@ struct hal_video_signal_info {
	bool full_range;
};

enum hal_iframesize_type {
	HAL_IFRAMESIZE_TYPE_DEFAULT,
	HAL_IFRAMESIZE_TYPE_MEDIUM,
	HAL_IFRAMESIZE_TYPE_HUGE,
	HAL_IFRAMESIZE_TYPE_UNLIMITED,
};

enum vidc_resource_id {
	VIDC_RESOURCE_NONE,
	VIDC_RESOURCE_OCMEM,
+10 −0
Original line number Diff line number Diff line
@@ -384,6 +384,8 @@ struct hfi_buffer_info {
	(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x031)
#define  HFI_PROPERTY_PARAM_VENC_VQZIP_SEI_TYPE		\
	(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x033)
#define  HFI_PROPERTY_PARAM_VENC_IFRAMESIZE			\
	(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x034)

#define HFI_PROPERTY_CONFIG_VENC_COMMON_START				\
	(HFI_DOMAIN_BASE_VENC + HFI_ARCH_COMMON_OFFSET + 0x6000)
@@ -882,6 +884,14 @@ struct hfi_aspect_ratio {
	u32 aspect_height;
};

#define HFI_IFRAME_SIZE_DEFAULT			(HFI_COMMON_BASE + 0x1)
#define HFI_IFRAME_SIZE_MEDIUM			(HFI_COMMON_BASE + 0x2)
#define HFI_IFRAME_SIZE_HIGH			(HFI_COMMON_BASE + 0x3)
#define HFI_IFRAME_SIZE_UNLIMITED		(HFI_COMMON_BASE + 0x4)
struct hfi_iframe_size {
	u32 type;
};

#define HFI_MVC_BUFFER_LAYOUT_TOP_BOTTOM  (0)
#define HFI_MVC_BUFFER_LAYOUT_SIDEBYSIDE  (1)
#define HFI_MVC_BUFFER_LAYOUT_SEQ         (2)
+9 −0
Original line number Diff line number Diff line
@@ -1200,6 +1200,15 @@ enum v4l2_mpeg_vidc_video_h264_transform_8x8 {
	V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE = 1,
};

#define V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE \
		(V4L2_CID_MPEG_MSM_VIDC_BASE + 100)
enum v4l2_mpeg_vidc_video_venc_iframesize_type {
	V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT,
	V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM,
	V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE,
	V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED,
};

/*  Camera class control IDs */

#define V4L2_CID_CAMERA_CLASS_BASE 	(V4L2_CTRL_CLASS_CAMERA | 0x900)