diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index dc3442112a..67396caa76 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -19,6 +19,7 @@ #define MIN_CHROMA_QP_OFFSET -12 #define MAX_CHROMA_QP_OFFSET 0 #define MAX_BITRATE 220000000 +#define DEFAULT_BITRATE 20000000 #define MIN_QP_10BIT -12 #define MIN_QP_8BIT 0 #define MAX_QP 51 @@ -308,12 +309,12 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { * Dec: there's no use of Bitrate cap */ {BIT_RATE, ENC, H264|HEVC, - 1, 220000000, 1, 20000000, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, V4L2_CID_MPEG_VIDEO_BITRATE, HFI_PROP_TOTAL_BITRATE, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, - {0}, {0}, - NULL, msm_vidc_set_u32}, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {ENH_LAYER_COUNT, BITRATE_MODE}, {PEAK_BITRATE}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, {BITRATE_MODE, ENC, H264, V4L2_MPEG_VIDEO_BITRATE_MODE_VBR, @@ -326,7 +327,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, {0}, {LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP, - ENH_LAYER_COUNT}, + ENH_LAYER_COUNT, BIT_RATE, CONTENT_ADAPTIVE_CODING, + BITRATE_BOOST, MIN_QUALITY, VBV_DELAY, PEAK_BITRATE}, msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum}, {BITRATE_MODE, ENC, HEVC, @@ -340,8 +342,11 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_RATE_CONTROL, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, {0}, - {LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, - I_FRAME_QP, CONSTANT_QUALITY, ENH_LAYER_COUNT}, + {LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP, + CONSTANT_QUALITY, ENH_LAYER_COUNT, + CONTENT_ADAPTIVE_CODING, BIT_RATE, + BITRATE_BOOST, MIN_QUALITY, VBV_DELAY, + PEAK_BITRATE}, msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum}, {LOSSLESS, ENC, HEVC|HEIC, @@ -496,17 +501,49 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { 1, V4L2_MPEG_MSM_VIDC_ENABLE, V4L2_CID_MPEG_VIDC_CONTENT_ADAPTIVE_CODING, HFI_PROP_CONTENT_ADAPTIVE_CODING, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + CAP_FLAG_OUTPUT_PORT, + {BITRATE_MODE}, {0}, + NULL, msm_vidc_set_vbr_related_properties}, {BITRATE_BOOST, ENC, H264|HEVC, - 0, 100, 25, 25, + 0, 50, 25, 25, V4L2_CID_MPEG_VIDC_QUALITY_BITRATE_BOOST, HFI_PROP_BITRATE_BOOST, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + CAP_FLAG_OUTPUT_PORT, + {BITRATE_MODE}, + {0}, + NULL, msm_vidc_set_vbr_related_properties}, + + {MIN_QUALITY, ENC, H264|HEVC, + 0, 80, 80, 80, + V4L2_CID_MPEG_VIDC_MIN_QUALITY, + HFI_PROP_MAINTAIN_MIN_QUALITY, + CAP_FLAG_OUTPUT_PORT, + {BITRATE_MODE}, + {0}, + NULL, msm_vidc_set_vbr_related_properties}, {VBV_DELAY, ENC, H264|HEVC, - 0, 1000, 500, 0, - V4L2_CID_MPEG_VIDEO_VBV_DELAY}, + 500, 2000, 500, 500, + V4L2_CID_MPEG_VIDEO_VBV_DELAY, + HFI_PROP_VBV_DELAY, + CAP_FLAG_OUTPUT_PORT, + {BITRATE_MODE}, + {0}, + NULL, msm_vidc_set_cbr_related_properties}, + + {PEAK_BITRATE, ENC, H264|HEVC, + /* default peak bitrate is 10% larger than avrg bitrate */ + 1, MAX_BITRATE, 1, + (DEFAULT_BITRATE + + (DEFAULT_BITRATE / PERCENT_PEAK_BITRATE_INCREASED)), + V4L2_CID_MPEG_VIDEO_BITRATE_PEAK, + HFI_PROP_TOTAL_PEAK_BITRATE, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {BITRATE_MODE, BIT_RATE}, + {0}, + msm_vidc_adjust_peak_bitrate, + msm_vidc_set_cbr_related_properties}, {MIN_FRAME_QP, ENC, H264, MIN_QP_8BIT, MAX_QP, 1, MIN_QP_8BIT, @@ -627,42 +664,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP, V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP}, - {L0_QP, ENC, HEVC, - 0, 51, 1, 20, - V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_QP, - HFI_PROP_QP_PACKED, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - - {L1_QP, ENC, HEVC, - 0, 51, 1, 20, - V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_QP, - HFI_PROP_QP_PACKED, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - - {L2_QP, ENC, HEVC, - 0, 51, 1, 20, - V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_QP, - HFI_PROP_QP_PACKED, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - - {L3_QP, ENC, HEVC, - 0, 51, 1, 20, - V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_QP, - HFI_PROP_QP_PACKED, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - - {L4_QP, ENC, HEVC, - 0, 51, 1, 20, - V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_QP, - HFI_PROP_QP_PACKED, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - - {L5_QP, ENC, HEVC, - 0, 51, 1, 20, - V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_QP, - HFI_PROP_QP_PACKED, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - {HIER_LAYER_QP, ENC, H264, 0, 0x0060033, 1, 20, V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP, @@ -701,7 +702,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_LAYER_COUNT, CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, {BITRATE_MODE}, - {GOP_SIZE, B_FRAME}, + {GOP_SIZE, B_FRAME, BIT_RATE}, msm_vidc_adjust_layer_count, msm_vidc_set_layer_count_and_type}, {ENH_LAYER_COUNT, ENC, H264, @@ -710,44 +711,108 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_LAYER_COUNT, CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, {BITRATE_MODE}, - {GOP_SIZE, B_FRAME}, + {GOP_SIZE, B_FRAME, BIT_RATE}, msm_vidc_adjust_layer_count, msm_vidc_set_layer_count_and_type}, + /* + * layer bitrate is treated as BIT_RATE cap sibling and + * is handled in bitrate adjust and set functions + */ {L0_BR, ENC, HEVC, - 1, 220000000, 1, 20000000, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR, HFI_PROP_BITRATE_LAYER1, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, {L1_BR, ENC, HEVC, - 1, 220000000, 1, 20000000, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR, HFI_PROP_BITRATE_LAYER2, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, {L2_BR, ENC, HEVC, - 1, 220000000, 1, 20000000, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR, HFI_PROP_BITRATE_LAYER3, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, {L3_BR, ENC, HEVC, - 1, 220000000, 1, 20000000, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR, HFI_PROP_BITRATE_LAYER4, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, {L4_BR, ENC, HEVC, - 1, 220000000, 1, 20000000, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR, HFI_PROP_BITRATE_LAYER5, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, {L5_BR, ENC, HEVC, - 1, 220000000, 1, 20000000, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR, HFI_PROP_BITRATE_LAYER6, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, + + {L0_BR, ENC, H264, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, + V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR, + HFI_PROP_BITRATE_LAYER1, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, + + {L1_BR, ENC, H264, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, + V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR, + HFI_PROP_BITRATE_LAYER2, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, + + {L2_BR, ENC, H264, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, + V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR, + HFI_PROP_BITRATE_LAYER3, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, + + {L3_BR, ENC, H264, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, + V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR, + HFI_PROP_BITRATE_LAYER4, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, + + {L4_BR, ENC, H264, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, + V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR, + HFI_PROP_BITRATE_LAYER5, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, + + {L5_BR, ENC, H264, + 1, MAX_BITRATE, 1, DEFAULT_BITRATE, + V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR, + HFI_PROP_BITRATE_LAYER6, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_bitrate, msm_vidc_set_bitrate}, {ENTROPY_MODE, ENC, H264, V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC, diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index 125aee6111..be8a307604 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -31,6 +31,8 @@ int msm_vidc_adjust_transform_8x8(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_layer_count(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_gop_size(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_b_frame(void *instance, struct v4l2_ctrl *ctrl); +int msm_vidc_adjust_bitrate(void *instance, struct v4l2_ctrl *ctrl); +int msm_vidc_adjust_peak_bitrate(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_hevc_min_qp(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_hevc_max_qp(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl); @@ -56,12 +58,18 @@ int msm_vidc_set_layer_count_and_type(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_gop_size(void *instance, enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_bitrate(void *instance, + enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_u32(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_u32_enum(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_constant_quality(void *instance, enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_vbr_related_properties( + void *instance, enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_cbr_related_properties(void *instance, + enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_use_and_mark_ltr(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_nal_length(void* instance, diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 10e20e9f03..10b0ac9b7d 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -55,6 +55,7 @@ #define MAX_HEVC_ENH_LAYER_SLIDING_WINDOW 5 #define MAX_AVC_ENH_LAYER_SLIDING_WINDOW 3 #define MAX_AVC_ENH_LAYER_HYBRID_HP 5 +#define PERCENT_PEAK_BITRATE_INCREASED 10 /* TODO * #define MAX_SUPERFRAME_COUNT 32 @@ -360,7 +361,9 @@ enum msm_vidc_inst_capability_type { TIME_DELTA_BASED_RC, CONTENT_ADAPTIVE_CODING, BITRATE_BOOST, + MIN_QUALITY, VBV_DELAY, + PEAK_BITRATE, MIN_FRAME_QP, I_FRAME_MIN_QP, P_FRAME_MIN_QP, @@ -373,12 +376,6 @@ enum msm_vidc_inst_capability_type { I_FRAME_QP, P_FRAME_QP, B_FRAME_QP, - L0_QP, - L1_QP, - L2_QP, - L3_QP, - L4_QP, - L5_QP, HIER_LAYER_QP, LAYER_TYPE, LAYER_ENABLE, diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index cccb9bf549..904def341c 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -1241,6 +1241,135 @@ exit: return 0; } +int msm_vidc_adjust_bitrate(void *instance, struct v4l2_ctrl *ctrl) +{ + int i; + struct msm_vidc_inst_capability *capability; + s32 adjusted_value; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + s32 rc_type = -1, enh_layer_count = -1; + u32 cap_id = 0, cumulative_bitrate = 0; + bool layer_bitrate_set = false; + u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR}; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + adjusted_value = ctrl ? ctrl->val : + capability->cap[BIT_RATE].value; + + /* ignore layer bitrate when total bitrate is set */ + if (capability->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET) + goto exit; + + if (msm_vidc_get_parent_value(inst, BIT_RATE, + ENH_LAYER_COUNT, &enh_layer_count, __func__)) + return -EINVAL; + + if (msm_vidc_get_parent_value(inst, BIT_RATE, + BITRATE_MODE, &rc_type, __func__)) + return -EINVAL; + + /* + * ENH_LAYER_COUNT cap max is positive only if + * layer encoding is enabled for static setting + */ + if (capability->cap[ENH_LAYER_COUNT].max) { + layer_bitrate_set = true; + for (i = 0; i <= enh_layer_count; i++) { + if (i >= ARRAY_SIZE(layer_br_caps)) + break; + cap_id = layer_br_caps[i]; + if (!(capability->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)) { + layer_bitrate_set = false; + break; + } + cumulative_bitrate += capability->cap[cap_id].value; + } + + /* layer bitrate supported only for CBR rc */ + if (layer_bitrate_set && + (rc_type == HFI_RC_CBR_CFR || rc_type == HFI_RC_CBR_VFR)) { + if (cumulative_bitrate > capability->cap[BIT_RATE].max) + cumulative_bitrate = + capability->cap[BIT_RATE].max; + adjusted_value = cumulative_bitrate; + i_vpr_h(inst, + "%s: update BIT_RATE with cumulative bitrate\n", + __func__); + } + } else { + for (i = 0; i < sizeof(layer_br_caps) / sizeof(u32); i++) { + if (i >= ARRAY_SIZE(layer_br_caps)) + break; + cap_id = layer_br_caps[i]; + /* + * layer bitrate cannot be set + * when layer encoding is disabled + */ + if (capability->cap[cap_id].flags & + CAP_FLAG_CLIENT_SET) { + i_vpr_e(inst, + "%s: invalid layer bitrate set\n", + __func__); + return -EINVAL; + } + } + } + +exit: + msm_vidc_update_cap_value(inst, BIT_RATE, + adjusted_value, __func__); + return 0; +} + +int msm_vidc_adjust_peak_bitrate(void *instance, struct v4l2_ctrl *ctrl) +{ + struct msm_vidc_inst_capability *capability; + s32 adjusted_value; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + s32 rc_type = -1, bitrate = -1; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + adjusted_value = ctrl ? ctrl->val : + capability->cap[PEAK_BITRATE].value; + + if (msm_vidc_get_parent_value(inst, PEAK_BITRATE, + BITRATE_MODE, &rc_type, __func__)) + return -EINVAL; + + if (rc_type != HFI_RC_CBR_CFR && + rc_type != HFI_RC_CBR_VFR) + return 0; + + if (msm_vidc_get_parent_value(inst, PEAK_BITRATE, + BIT_RATE, &bitrate, __func__)) + return -EINVAL; + + /* Peak Bitrate should be larger than or equal to avg bitrate */ + if (capability->cap[PEAK_BITRATE].flags & CAP_FLAG_CLIENT_SET) { + if (adjusted_value < bitrate) + adjusted_value = bitrate; + } else { + adjusted_value = capability->cap[BIT_RATE].value + + (capability->cap[BIT_RATE].value / + PERCENT_PEAK_BITRATE_INCREASED); + } + + msm_vidc_update_cap_value(inst, PEAK_BITRATE, + adjusted_value, __func__); + + return 0; +} + int msm_vidc_adjust_hevc_min_qp(void *instance, struct v4l2_ctrl *ctrl) { int rc = 0; @@ -1449,6 +1578,63 @@ int msm_vidc_set_constant_quality(void *instance, return rc; } +int msm_vidc_set_vbr_related_properties(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; + s32 rc_type = -1; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + if (msm_vidc_get_parent_value(inst, cap_id, + BITRATE_MODE, &rc_type, __func__)) + return -EINVAL; + + if (rc_type != HFI_RC_VBR_CFR) + return 0; + + hfi_value = inst->capabilities->cap[cap_id].value; + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32, + &hfi_value, sizeof(u32), __func__); + + return rc; +} + +int msm_vidc_set_cbr_related_properties(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; + s32 rc_type = -1; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + if (msm_vidc_get_parent_value(inst, cap_id, + BITRATE_MODE, &rc_type, __func__)) + return -EINVAL; + + if (rc_type != HFI_RC_CBR_VFR && + rc_type != HFI_RC_CBR_CFR) + return 0; + + hfi_value = inst->capabilities->cap[cap_id].value; + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32, + &hfi_value, sizeof(u32), __func__); + + return rc; +} + int msm_vidc_set_use_and_mark_ltr(void *instance, enum msm_vidc_inst_capability_type cap_id) { @@ -1845,6 +2031,73 @@ int msm_vidc_set_gop_size(void *instance, return rc; } +int msm_vidc_set_bitrate(void *instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0, i; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance; + u32 hfi_value = 0; + s32 rc_type = -1, enh_layer_count = -1; + u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR}; + bool layer_bitrate_set = false; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + /* set Total Bitrate */ + if (inst->capabilities->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET) + goto set_total_bitrate; + + if (msm_vidc_get_parent_value(inst, BIT_RATE, + ENH_LAYER_COUNT, &enh_layer_count, __func__)) + return -EINVAL; + + if (msm_vidc_get_parent_value(inst, BIT_RATE, + BITRATE_MODE, &rc_type, __func__)) + return -EINVAL; + + if (inst->capabilities->cap[ENH_LAYER_COUNT].max && + (rc_type == HFI_RC_CBR_CFR || + rc_type == HFI_RC_CBR_VFR)) { + layer_bitrate_set = true; + for (i = 0; i <= enh_layer_count; i++) { + if (i >= ARRAY_SIZE(layer_br_caps)) + break; + cap_id = layer_br_caps[i]; + if (!(inst->capabilities->cap[cap_id].flags & + CAP_FLAG_CLIENT_SET)) { + layer_bitrate_set = false; + break; + } + } + + if (layer_bitrate_set) { + /* set Layer Bitrate */ + for (i = 0; i <= enh_layer_count; i++) { + if (i >= ARRAY_SIZE(layer_br_caps)) + break; + cap_id = layer_br_caps[i]; + hfi_value = inst->capabilities->cap[cap_id].value; + rc = msm_vidc_packetize_control(inst, cap_id, + HFI_PAYLOAD_U32, &hfi_value, + sizeof(u32), __func__); + if (rc) + return rc; + } + goto exit; + } + } + +set_total_bitrate: + hfi_value = inst->capabilities->cap[BIT_RATE].value; + rc = msm_vidc_packetize_control(inst, BIT_RATE, HFI_PAYLOAD_U32, + &hfi_value, sizeof(u32), __func__); +exit: + return rc; +} + /* TODO int msm_vidc_set_flip(void *instance, enum msm_vidc_inst_capability_type cap_id) diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index cdc0534a00..2488d989b7 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -103,7 +103,9 @@ static const struct msm_vidc_cap_name cap_name_arr[] = { {TIME_DELTA_BASED_RC, "TIME_DELTA_BASED_RC" }, {CONTENT_ADAPTIVE_CODING, "CONTENT_ADAPTIVE_CODING" }, {BITRATE_BOOST, "BITRATE_BOOST" }, + {MIN_QUALITY, "MIN_QUALITY" }, {VBV_DELAY, "VBV_DELAY" }, + {PEAK_BITRATE, "PEAK_BITRATE" }, {MIN_FRAME_QP, "MIN_FRAME_QP" }, {I_FRAME_MIN_QP, "I_FRAME_MIN_QP" }, {P_FRAME_MIN_QP, "P_FRAME_MIN_QP" }, @@ -116,12 +118,6 @@ static const struct msm_vidc_cap_name cap_name_arr[] = { {I_FRAME_QP, "I_FRAME_QP" }, {P_FRAME_QP, "P_FRAME_QP" }, {B_FRAME_QP, "B_FRAME_QP" }, - {L0_QP, "L0_QP" }, - {L1_QP, "L1_QP" }, - {L2_QP, "L2_QP" }, - {L3_QP, "L3_QP" }, - {L4_QP, "L4_QP" }, - {L5_QP, "L5_QP" }, {HIER_LAYER_QP, "HIER_LAYER_QP" }, {LAYER_TYPE, "LAYER_TYPE" }, {LAYER_ENABLE, "LAYER_ENABLE" }, diff --git a/include/uapi/vidc/media/v4l2_vidc_extensions.h b/include/uapi/vidc/media/v4l2_vidc_extensions.h index f363ae6c00..b8b7bfd8ee 100644 --- a/include/uapi/vidc/media/v4l2_vidc_extensions.h +++ b/include/uapi/vidc/media/v4l2_vidc_extensions.h @@ -147,6 +147,8 @@ enum v4l2_mpeg_vidc_blur_types { /* Encoder Input Compression Ratio control */ #define V4L2_CID_MPEG_VIDC_ENC_INPUT_COMPRESSION_RATIO \ (V4L2_CID_MPEG_VIDC_BASE + 0x2C) +#define V4L2_CID_MPEG_VIDC_MIN_QUALITY \ + (V4L2_CID_MPEG_VIDC_BASE + 0x2D) enum v4l2_mpeg_vidc_metapayload_header_flags { METADATA_FLAGS_NONE = 0,