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

This commit is contained in:
Linux Build Service Account 2016-11-15 04:07:43 -08:00 committed by Gerrit - the friendly Code Review server
commit a8bcbb0330
5 changed files with 96 additions and 0 deletions

View file

@ -2153,6 +2153,33 @@ int create_pkt_cmd_session_set_property(
pkt->size += sizeof(u32) + sizeof(*signal_info);
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:

View file

@ -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,
@ -1281,6 +1288,20 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
.step = 1,
.qmenu = NULL,
},
{
.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,
},
};
@ -2117,6 +2138,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:
@ -2159,6 +2193,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__);
@ -3242,6 +3277,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;

View file

@ -242,6 +242,7 @@ enum hal_property {
HAL_PARAM_VENC_SESSION_QP_RANGE_PACKED,
HAL_PARAM_VENC_H264_TRANSFORM_8x8,
HAL_PARAM_VENC_VIDEO_SIGNAL_INFO,
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,

View file

@ -386,6 +386,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)
@ -888,6 +890,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)

View file

@ -1199,6 +1199,15 @@ enum v4l2_cid_mpeg_vidc_video_full_range {
#define V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS \
(V4L2_CID_MPEG_MSM_VIDC_BASE + 97)
#define V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE \
(V4L2_CID_MPEG_MSM_VIDC_BASE + 98)
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)