video: driver: encoder fix for frame qp and level
- misc fix for setting frame qp, min qp, max qp. - seperate LEVEL database entry for encoder and decoder as max level supported by encoder is 6_0, but decoder supports upto 6_2. Change-Id: Ia0a0a717e73e55a8b6933421e3eb55c3831524b2 Signed-off-by: Darshana Patil <darshana@codeaurora.org>
This commit is contained in:
@@ -962,7 +962,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
{0},
|
{0},
|
||||||
NULL, msm_vidc_set_u32_enum},
|
NULL, msm_vidc_set_u32_enum},
|
||||||
|
|
||||||
{LEVEL, ENC|DEC, H264,
|
{LEVEL, DEC, H264,
|
||||||
V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
|
V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
|
||||||
V4L2_MPEG_VIDEO_H264_LEVEL_6_2,
|
V4L2_MPEG_VIDEO_H264_LEVEL_6_2,
|
||||||
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
|
||||||
@@ -993,7 +993,36 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
{0},
|
{0},
|
||||||
NULL, msm_vidc_set_u32_enum},
|
NULL, msm_vidc_set_u32_enum},
|
||||||
|
|
||||||
{LEVEL, ENC|DEC, HEVC|HEIC,
|
{LEVEL, ENC, H264,
|
||||||
|
V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
|
||||||
|
V4L2_MPEG_VIDEO_H264_LEVEL_6_0,
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_0) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_1) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_2) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_0) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_1) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_2) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_6_0),
|
||||||
|
V4L2_MPEG_VIDEO_H264_LEVEL_5_0,
|
||||||
|
V4L2_CID_MPEG_VIDEO_H264_LEVEL,
|
||||||
|
HFI_PROP_LEVEL,
|
||||||
|
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
|
||||||
|
{0},
|
||||||
|
{0},
|
||||||
|
NULL, msm_vidc_set_u32_enum},
|
||||||
|
|
||||||
|
{LEVEL, DEC, HEVC|HEIC,
|
||||||
V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
|
V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
|
||||||
V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,
|
V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,
|
||||||
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
|
||||||
@@ -1017,6 +1046,28 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
{0},
|
{0},
|
||||||
NULL, msm_vidc_set_u32_enum},
|
NULL, msm_vidc_set_u32_enum},
|
||||||
|
|
||||||
|
{LEVEL, ENC, HEVC|HEIC,
|
||||||
|
V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
|
||||||
|
V4L2_MPEG_VIDEO_HEVC_LEVEL_6,
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6),
|
||||||
|
V4L2_MPEG_VIDEO_HEVC_LEVEL_5,
|
||||||
|
V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,
|
||||||
|
HFI_PROP_LEVEL,
|
||||||
|
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
|
||||||
|
{0},
|
||||||
|
{0},
|
||||||
|
NULL, msm_vidc_set_u32_enum},
|
||||||
|
|
||||||
/* TODO: Bring the VP9 Level upstream GKI change, and level cap here:
|
/* TODO: Bring the VP9 Level upstream GKI change, and level cap here:
|
||||||
* go/videogki
|
* go/videogki
|
||||||
*/
|
*/
|
||||||
|
@@ -97,6 +97,8 @@ int msm_vidc_set_session_priority(void* instance,
|
|||||||
enum msm_vidc_inst_capability_type cap_id);
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
int msm_vidc_set_seq_change_at_sync_frame(void* instance,
|
int msm_vidc_set_seq_change_at_sync_frame(void* instance,
|
||||||
enum msm_vidc_inst_capability_type cap_id);
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
|
int msm_vidc_set_level(void *instance,
|
||||||
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
int msm_vidc_set_s32(void *instance,
|
int msm_vidc_set_s32(void *instance,
|
||||||
enum msm_vidc_inst_capability_type cap_id);
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
int msm_vidc_set_q16(void *instance,
|
int msm_vidc_set_q16(void *instance,
|
||||||
|
@@ -2249,15 +2249,18 @@ int msm_vidc_set_min_qp(void *instance,
|
|||||||
}
|
}
|
||||||
capability = inst->capabilities;
|
capability = inst->capabilities;
|
||||||
|
|
||||||
min_qp_enable =
|
if (capability->cap[MIN_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
|
||||||
capability->cap[MIN_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
|
min_qp_enable = 1;
|
||||||
|
|
||||||
i_qp_enable = min_qp_enable ||
|
if (min_qp_enable ||
|
||||||
capability->cap[I_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET;
|
(capability->cap[I_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET))
|
||||||
p_qp_enable = min_qp_enable ||
|
i_qp_enable = 1;
|
||||||
capability->cap[P_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET;
|
if (min_qp_enable ||
|
||||||
b_qp_enable = min_qp_enable ||
|
(capability->cap[P_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET))
|
||||||
capability->cap[B_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET;
|
p_qp_enable = 1;
|
||||||
|
if (min_qp_enable ||
|
||||||
|
(capability->cap[B_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET))
|
||||||
|
b_qp_enable = 1;
|
||||||
|
|
||||||
client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
|
client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
|
||||||
if (!client_qp_enable) {
|
if (!client_qp_enable) {
|
||||||
@@ -2311,15 +2314,18 @@ int msm_vidc_set_max_qp(void *instance,
|
|||||||
}
|
}
|
||||||
capability = inst->capabilities;
|
capability = inst->capabilities;
|
||||||
|
|
||||||
max_qp_enable =
|
if (capability->cap[MAX_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
|
||||||
capability->cap[MAX_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
|
max_qp_enable = 1;
|
||||||
|
|
||||||
i_qp_enable = max_qp_enable ||
|
if (max_qp_enable ||
|
||||||
capability->cap[I_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET;
|
(capability->cap[I_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET))
|
||||||
p_qp_enable = max_qp_enable ||
|
i_qp_enable = 1;
|
||||||
capability->cap[P_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET;
|
if (max_qp_enable ||
|
||||||
b_qp_enable = max_qp_enable ||
|
(capability->cap[P_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET))
|
||||||
capability->cap[B_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET;
|
p_qp_enable = 1;
|
||||||
|
if (max_qp_enable ||
|
||||||
|
(capability->cap[B_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET))
|
||||||
|
b_qp_enable = 1;
|
||||||
|
|
||||||
client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
|
client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
|
||||||
if (!client_qp_enable) {
|
if (!client_qp_enable) {
|
||||||
@@ -2383,12 +2389,12 @@ int msm_vidc_set_frame_qp(void *instance,
|
|||||||
i_qp_enable = p_qp_enable = b_qp_enable = 1;
|
i_qp_enable = p_qp_enable = b_qp_enable = 1;
|
||||||
} else {
|
} else {
|
||||||
/* Set only if client has set for NON rc off case */
|
/* Set only if client has set for NON rc off case */
|
||||||
i_qp_enable =
|
if (capab->cap[I_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
|
||||||
capab->cap[I_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
|
i_qp_enable = 1;
|
||||||
p_qp_enable =
|
if (capab->cap[P_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
|
||||||
capab->cap[P_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
|
p_qp_enable = 1;
|
||||||
b_qp_enable =
|
if (capab->cap[B_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
|
||||||
capab->cap[B_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
|
b_qp_enable = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
|
client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
|
||||||
@@ -3030,6 +3036,35 @@ int msm_vidc_set_csc_custom_matrix(void *instance,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: currently fw does not accept HFI_LEVEL_NONE.
|
||||||
|
* Use this function for encoder level setting once
|
||||||
|
* fw issue is fixed.
|
||||||
|
*/
|
||||||
|
int msm_vidc_set_level(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;
|
||||||
|
|
||||||
|
if (!inst || !inst->capabilities) {
|
||||||
|
d_vpr_e("%s: invalid params\n", __func__);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hfi_value = inst->capabilities->cap[cap_id].value;
|
||||||
|
if (!(inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET))
|
||||||
|
hfi_value = HFI_LEVEL_NONE;
|
||||||
|
|
||||||
|
rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
|
||||||
|
&hfi_value, sizeof(u32), __func__);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
int msm_vidc_set_q16(void *instance,
|
int msm_vidc_set_q16(void *instance,
|
||||||
enum msm_vidc_inst_capability_type cap_id)
|
enum msm_vidc_inst_capability_type cap_id)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user