video: driver: add support to few properties

Add support to below properties
- HFI_PROP_MULTI_SLICE_BYTES_COUNT
- HFI_PROP_MULTI_SLICE_MB_COUNT
- HFI_PROP_CHROMA_QP_OFFSET
- HFI_PROP_REQUEST_SYNC_FRAME

Change-Id: I4cc62870756d058e7a7b15290f5d6797b3be243c
Signed-off-by: Akshata Sahukar <asahukar@codeaurora.org>
This commit is contained in:
Akshata Sahukar
2021-02-22 15:08:06 -08:00
committed by Gerrit - the friendly Code Review server
parent d4b5661567
commit 17addfbc6d
5 changed files with 118 additions and 18 deletions

View File

@@ -280,7 +280,9 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
0, 0, 0, 0, 0, 0, 0, 0,
V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME, V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME,
HFI_PROP_REQUEST_SYNC_FRAME, HFI_PROP_REQUEST_SYNC_FRAME,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED}, CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
{0}, {0},
NULL, msm_vidc_set_req_sync_frame},
/* Enc: Keeping CABAC and CAVLC as same bitrate. /* Enc: Keeping CABAC and CAVLC as same bitrate.
* Dec: there's no use of Bitrate cap * Dec: there's no use of Bitrate cap
@@ -920,20 +922,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
-6, 6, 1, 0, -6, 6, 1, 0,
V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2}, V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2},
{SLICE_MAX_BYTES, ENC, H264|HEVC,
1, MAX_BITRATE / DEFAULT_FPS / 8 / 10,
1, MAX_BITRATE / DEFAULT_FPS / 8 / 10,
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES,
HFI_PROP_MULTI_SLICE_BYTES_COUNT,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{SLICE_MAX_MB, ENC, H264|HEVC,
1, (MAX_WIDTH * MAX_HEIGHT) / 256 / DEFAULT_FPS / 10,
1, (MAX_WIDTH * MAX_HEIGHT) / 256 / DEFAULT_FPS / 10,
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB,
HFI_PROP_MULTI_SLICE_MB_COUNT,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{SLICE_MODE, ENC, H264|HEVC, {SLICE_MODE, ENC, H264|HEVC,
V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES, V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES,
@@ -943,7 +931,21 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE, V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,
0, 0,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU}, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{0}, {0},
NULL, msm_vidc_set_slice_count},
{SLICE_MAX_BYTES, ENC, H264|HEVC,
1, INT_MAX, 1, INT_MAX,
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES,
HFI_PROP_MULTI_SLICE_BYTES_COUNT,
CAP_FLAG_OUTPUT_PORT},
{SLICE_MAX_MB, ENC, H264|HEVC,
1, INT_MAX, 1, INT_MAX,
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB,
HFI_PROP_MULTI_SLICE_MB_COUNT,
CAP_FLAG_OUTPUT_PORT},
// TODO: MB level RC - mapping // TODO: MB level RC - mapping
{MB_RC, ENC, CODECS_ALL, {MB_RC, ENC, CODECS_ALL,
@@ -967,7 +969,9 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, MAX_CHROMA_QP_OFFSET, 1, MAX_CHROMA_QP_OFFSET,
V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET, V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET,
HFI_PROP_CHROMA_QP_OFFSET, HFI_PROP_CHROMA_QP_OFFSET,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
{0}, {0},
NULL, msm_vidc_set_chroma_qp_index_offset},
{DISPLAY_DELAY_ENABLE, DEC, CODECS_ALL, {DISPLAY_DELAY_ENABLE, DEC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,

View File

@@ -283,6 +283,10 @@ enum hfi_layer_encoding_type {
#define HFI_PROP_LAYER_COUNT 0x03000139 #define HFI_PROP_LAYER_COUNT 0x03000139
enum hfi_chromaqp_offset_mode {
HFI_ADAPTIVE_CHROMAQP_OFFSET = 0x0,
HFI_FIXED_CHROMAQP_OFFSET = 0x1,
};
#define HFI_BITMASK_CHROMA_CB_OFFSET 0x0000ffff #define HFI_BITMASK_CHROMA_CB_OFFSET 0x0000ffff
#define HFI_BITMASK_CHROMA_CR_OFFSET 0xffff0000 #define HFI_BITMASK_CHROMA_CR_OFFSET 0xffff0000
#define HFI_PROP_CHROMA_QP_OFFSET 0x0300013a #define HFI_PROP_CHROMA_QP_OFFSET 0x0300013a

View File

@@ -43,6 +43,12 @@ int msm_vidc_set_max_qp(void *instance,
enum msm_vidc_inst_capability_type cap_id); enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_frame_qp(void *instance, int msm_vidc_set_frame_qp(void *instance,
enum msm_vidc_inst_capability_type cap_id); enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_req_sync_frame(void *instance,
enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_chroma_qp_index_offset(void *instance,
enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_slice_count(void* instance,
enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_u32(void *instance, int msm_vidc_set_u32(void *instance,
enum msm_vidc_inst_capability_type cap_id); enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_u32_enum(void *instance, int msm_vidc_set_u32_enum(void *instance,

View File

@@ -332,9 +332,9 @@ enum msm_vidc_inst_capability_type {
LF_MODE, LF_MODE,
LF_ALPHA, LF_ALPHA,
LF_BETA, LF_BETA,
SLICE_MODE,
SLICE_MAX_BYTES, SLICE_MAX_BYTES,
SLICE_MAX_MB, SLICE_MAX_MB,
SLICE_MODE,
MB_RC, MB_RC,
TRANSFORM_8X8, TRANSFORM_8X8,
CHROMA_QP_INDEX_OFFSET, CHROMA_QP_INDEX_OFFSET,

View File

@@ -1464,6 +1464,92 @@ int msm_vidc_set_frame_qp(void *instance,
return rc; return rc;
} }
int msm_vidc_set_req_sync_frame(void *instance,
enum msm_vidc_inst_capability_type cap_id)
{
int rc = 0;
struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
s32 prepend_spspps;
u32 hfi_value = 0;
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
prepend_spspps = inst->capabilities->cap[PREPEND_SPSPPS_TO_IDR].value;
if (prepend_spspps)
hfi_value = HFI_SYNC_FRAME_REQUEST_WITH_PREFIX_SEQ_HDR;
else
hfi_value = HFI_SYNC_FRAME_REQUEST_WITHOUT_SEQ_HDR;
rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
&hfi_value, sizeof(u32), __func__);
return rc;
}
int msm_vidc_set_chroma_qp_index_offset(void *instance,
enum msm_vidc_inst_capability_type cap_id)
{
int rc = 0;
struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
u32 hfi_value = 0, chroma_qp_offset_mode = 0, chroma_qp = 0;
u32 offset = 12;
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
if (inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)
chroma_qp_offset_mode = HFI_FIXED_CHROMAQP_OFFSET;
else
chroma_qp_offset_mode = HFI_ADAPTIVE_CHROMAQP_OFFSET;
chroma_qp = inst->capabilities->cap[cap_id].value + offset;
hfi_value = chroma_qp_offset_mode | chroma_qp << 8 | chroma_qp << 16 ;
rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
&hfi_value, sizeof(u32), __func__);
return rc;
}
int msm_vidc_set_slice_count(void* instance,
enum msm_vidc_inst_capability_type cap_id)
{
int rc = 0;
struct msm_vidc_inst* inst = (struct msm_vidc_inst*)instance;
s32 slice_mode = -1;
u32 hfi_value = 0, set_cap_id = 0;
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
slice_mode = inst->capabilities->cap[SLICE_MODE].value;
if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
i_vpr_l(inst, "%s: slice mode is: %u, ignore setting to fw\n",
__func__, slice_mode);
return 0;
}
if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB) {
hfi_value = inst->capabilities->cap[SLICE_MAX_MB].value;
set_cap_id = SLICE_MAX_MB;
} else if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES) {
hfi_value = inst->capabilities->cap[SLICE_MAX_BYTES].value;
set_cap_id = SLICE_MAX_BYTES;
}
rc = msm_vidc_packetize_control(inst, set_cap_id, HFI_PAYLOAD_U32,
&hfi_value, sizeof(u32), __func__);
return rc;
}
/* TODO /* TODO
int msm_vidc_set_flip(void *instance, int msm_vidc_set_flip(void *instance,
enum msm_vidc_inst_capability_type cap_id) enum msm_vidc_inst_capability_type cap_id)