From 596ca194de7e2f227cec96e7880dada30a10234c Mon Sep 17 00:00:00 2001 From: Darshana Patil Date: Mon, 1 Mar 2021 13:13:22 -0800 Subject: [PATCH] video: driver: add thumbnail and priority support - add thumbnail mode and priority in database. - modify output min count for thumbnail session - deprecate is_turbo_session. - deprecate flags variable in instance structure and use database entries. Change-Id: I04a3386f1e2eb9fb97bd550d6f169f9510f462c8 Signed-off-by: Darshana Patil --- driver/platform/waipio/src/msm_vidc_waipio.c | 10 +- driver/variant/iris2/src/msm_vidc_iris2.c | 5 +- .../variant/iris2/src/msm_vidc_power_iris2.c | 2 +- driver/vidc/inc/msm_vidc_driver.h | 15 +-- driver/vidc/inc/msm_vidc_inst.h | 1 - driver/vidc/inc/msm_vidc_internal.h | 8 +- driver/vidc/src/msm_vdec.c | 9 +- driver/vidc/src/msm_vidc_buffer.c | 2 +- driver/vidc/src/msm_vidc_control.c | 119 +++++++++++------- driver/vidc/src/msm_vidc_debug.c | 2 +- driver/vidc/src/msm_vidc_driver.c | 2 +- driver/vidc/src/msm_vidc_power.c | 4 +- 12 files changed, 107 insertions(+), 72 deletions(-) diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index a0191e6f9c..f6030c5779 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -1059,7 +1059,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {THUMBNAIL_MODE, DEC, CODECS_ALL, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, 1, V4L2_MPEG_MSM_VIDC_DISABLE, - 0, + V4L2_CID_MPEG_VIDC_THUMBNAIL_MODE, HFI_PROP_THUMBNAIL_MODE}, {DEFAULT_HEADER, DEC, CODECS_ALL, @@ -1083,6 +1083,14 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_SEQ_CHANGE_AT_SYNC_FRAME, CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED}, + {PRIORITY, DEC|ENC, CODECS_ALL, + 0, 2, 1, 1, + V4L2_CID_MPEG_VIDC_PRIORITY, + HFI_PROP_REALTIME, + CAP_FLAG_ROOT, + {0}, {0}, + NULL, NULL}, + {META_LTR_MARK_USE, ENC, CODECS_ALL, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, 1, V4L2_MPEG_MSM_VIDC_DISABLE, diff --git a/driver/variant/iris2/src/msm_vidc_iris2.c b/driver/variant/iris2/src/msm_vidc_iris2.c index f3db4c1323..1d6103e7d0 100644 --- a/driver/variant/iris2/src/msm_vidc_iris2.c +++ b/driver/variant/iris2/src/msm_vidc_iris2.c @@ -639,13 +639,10 @@ int msm_vidc_decide_quality_mode_iris2(struct msm_vidc_inst* inst) max_hq_mbps = core->capabilities[MAX_MBPS_HQ].value;; /* Power saving always disabled for CQ and LOSSLESS RC modes. */ - if (inst->capabilities->cap[LOSSLESS].value || + if (capability->cap[LOSSLESS].value || (mbpf <= max_hq_mbpf && mbps <= max_hq_mbps)) mode = MSM_VIDC_MAX_QUALITY_MODE; - inst->flags = mode == MSM_VIDC_POWER_SAVE_MODE ? - inst->flags | VIDC_LOW_POWER : - inst->flags & ~VIDC_LOW_POWER; capability->cap[QUALITY_MODE].value = mode; return 0; diff --git a/driver/variant/iris2/src/msm_vidc_power_iris2.c b/driver/variant/iris2/src/msm_vidc_power_iris2.c index 37e0ecc09e..d9aa38ab84 100644 --- a/driver/variant/iris2/src/msm_vidc_power_iris2.c +++ b/driver/variant/iris2/src/msm_vidc_power_iris2.c @@ -41,7 +41,7 @@ u64 msm_vidc_calc_freq_iris2(struct msm_vidc_inst *inst, u32 data_size) fw_vpp_cycles = fps * core->capabilities[MB_CYCLES_FW_VPP].value; if (inst->domain == MSM_VIDC_ENCODER) { - vpp_cycles_per_mb = inst->flags & VIDC_LOW_POWER ? + vpp_cycles_per_mb = is_low_power_session(inst) ? core->capabilities[MB_CYCLES_LP].value : core->capabilities[MB_CYCLES_VPP].value; diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index 351e4abaaa..a0d5979264 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -26,7 +26,7 @@ static inline is_encode_session(struct msm_vidc_inst *inst) static inline is_secure_session(struct msm_vidc_inst *inst) { - return false; + return !!(inst->capabilities->cap[SECURE_MODE].value); } static inline is_input_buffer(enum msm_vidc_buffer_type buffer_type) @@ -145,24 +145,21 @@ static inline bool is_secondary_output_mode(struct msm_vidc_inst *inst) return false; // TODO: inst->stream_output_mode == HAL_VIDEO_DECODER_SECONDARY; } -static inline bool is_turbo_session(struct msm_vidc_inst *inst) -{ - return !!(inst->flags & VIDC_TURBO); -} - static inline bool is_thumbnail_session(struct msm_vidc_inst *inst) { - return !!(inst->flags & VIDC_THUMBNAIL); + return false; + // todo: return !!(inst->capabilities->cap[THUMBNAIL_MODE].value); } static inline bool is_low_power_session(struct msm_vidc_inst *inst) { - return !!(inst->flags & VIDC_LOW_POWER); + return (inst->capabilities->cap[QUALITY_MODE].value == + MSM_VIDC_POWER_SAVE_MODE); } static inline bool is_realtime_session(struct msm_vidc_inst *inst) { - return false; // TODO: fix it + return !inst->capabilities->cap[PRIORITY].value; } static inline bool is_active_session(u64 prev, u64 curr) diff --git a/driver/vidc/inc/msm_vidc_inst.h b/driver/vidc/inc/msm_vidc_inst.h index 798d925350..4b8459a6fa 100644 --- a/driver/vidc/inc/msm_vidc_inst.h +++ b/driver/vidc/inc/msm_vidc_inst.h @@ -108,7 +108,6 @@ struct msm_vidc_inst { struct msm_vidc_rectangle crop; struct msm_vidc_rectangle compose; struct msm_vidc_power power; - enum msm_vidc_modes flags; struct vidc_bus_vote_data bus_data; struct msm_vidc_buffers_info buffers; struct msm_vidc_mappings_info mappings; diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index b2f0cae72c..ab8e485beb 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -413,6 +413,7 @@ enum msm_vidc_inst_capability_type { DEFAULT_HEADER, RAP_FRAME, SEQ_CHANGE_AT_SYNC_FRAME, + PRIORITY, META_LTR_MARK_USE, META_DPB_MISR, META_OPB_MISR, @@ -680,13 +681,6 @@ struct msm_vidc_decode_batch { struct delayed_work work; }; -enum msm_vidc_modes { - VIDC_SECURE = BIT(0), - VIDC_TURBO = BIT(1), - VIDC_THUMBNAIL = BIT(2), - VIDC_LOW_POWER = BIT(3), -}; - enum load_calc_quirks { LOAD_POWER = 0, LOAD_ADMISSION_CONTROL = 1, diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index 26c0fa9013..ed2a6f8b10 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -669,6 +669,7 @@ static int msm_vdec_set_realtime(struct msm_vidc_inst *inst, return -EINVAL; } + realtime = inst->capabilities->cap[PRIORITY].value; i_vpr_h(inst, "%s: priority: %d", __func__, realtime); rc = venus_hfi_session_property(inst, HFI_PROP_REALTIME, @@ -1378,7 +1379,13 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst) } inst->buffers.output.min_count = subsc_params.fw_min_count; - + if (is_thumbnail_session(inst) && inst->codec != MSM_VIDC_VP9) { + if (inst->buffers.output.min_count != 1) { + i_vpr_e(inst, "%s: invalid min count %d in thumbnail case\n", + __func__, inst->buffers.output.min_count); + msm_vidc_change_inst_state(inst, MSM_VIDC_ERROR, __func__); + } + } inst->crop.top = subsc_params.crop_offsets[0] & 0xFFFF; inst->crop.left = (subsc_params.crop_offsets[0] >> 16) & 0xFFFF; inst->crop.height = inst->fmts[INPUT_PORT].fmt.pix_mp.height - diff --git a/driver/vidc/src/msm_vidc_buffer.c b/driver/vidc/src/msm_vidc_buffer.c index 334238c395..8b2f9df4e5 100644 --- a/driver/vidc/src/msm_vidc_buffer.c +++ b/driver/vidc/src/msm_vidc_buffer.c @@ -59,7 +59,7 @@ u32 msm_vidc_output_min_count(struct msm_vidc_inst *inst) return 0; if (is_thumbnail_session(inst)) - return inst->codec == MSM_VIDC_VP9 ? 8 : 1; + return 1; if (is_decode_session(inst)) { switch (inst->codec) { diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index b364517533..d7904af970 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -119,7 +119,57 @@ static const char * const * msm_vidc_get_qmenu_type( } } -static const char *msm_vidc_get_priv_ctrl_name(struct msm_vidc_inst *inst, u32 control_id) +static const char *msm_vidc_get_priv_ctrl_name_list2(struct msm_vidc_inst *inst, + u32 control_id) +{ + switch (control_id) { + case V4L2_CID_MPEG_VIDC_HEVC_I_FRAME_MIN_QP: + return "HEVC I Frame Min QP"; + case V4L2_CID_MPEG_VIDC_HEVC_P_FRAME_MIN_QP: + return "HEVC P Frame Min QP"; + case V4L2_CID_MPEG_VIDC_HEVC_I_FRAME_MAX_QP: + return "HEVC I Frame Max QP"; + case V4L2_CID_MPEG_VIDC_HEVC_P_FRAME_MAX_QP: + return "HEVC P Frame Max QP"; + case V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS: + return "LTR Mark Use Details Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL: + return "Seq Header NAL Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR: + return "DPB Luma-Chroma MISR Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR: + return "OPB Luma-Chroma MISR Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_INTERLACE: + return "Interlace Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT: + return "Concealed MB Count Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO: + return "Historgram Info Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR: + return "SEI Mastering Display Color Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL: + return "SEI Content Lighting Level Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS: + return "HDR10PLUS Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS: + return "EVA Stats Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG: + return "Buffer Tag Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT: + return "Subframe Output Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO: + return "ROI Info Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP: + return "Timestamp Metadata"; + case V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA: + return "Encoder QP Metadata"; + default: + return NULL; + } +} + +static const char *msm_vidc_get_priv_ctrl_name_list1(struct msm_vidc_inst *inst, + u32 control_id) { switch (control_id) { case V4L2_CID_MPEG_VIDC_SECURE: @@ -162,56 +212,39 @@ static const char *msm_vidc_get_priv_ctrl_name(struct msm_vidc_inst *inst, u32 c return "H264 Display Delay"; case V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE: return "H264 Display Delay Enable"; - case V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS: - return "LTR Mark Use Details Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL: - return "Seq Header NAL Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR: - return "DPB Luma-Chroma MISR Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR: - return "OPB Luma-Chroma MISR Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_INTERLACE: - return "Interlace Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT: - return "Concealed MB Count Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO: - return "Historgram Info Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR: - return "SEI Mastering Display Color Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL: - return "SEI Content Lighting Level Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS: - return "HDR10PLUS Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS: - return "EVA Stats Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG: - return "Buffer Tag Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT: - return "Subframe Output Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO: - return "ROI Info Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP: - return "Timestamp Metadata"; - case V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA: - return "Encoder QP Metadata"; case V4L2_CID_MPEG_VIDC_MIN_BITSTREAM_SIZE_OVERWRITE: return "Bitstream Size Overwrite"; - case V4L2_CID_MPEG_VIDC_HEVC_I_FRAME_MIN_QP: - return "HEVC I Frame Min QP"; - case V4L2_CID_MPEG_VIDC_HEVC_P_FRAME_MIN_QP: - return "HEVC P Frame Min QP"; - case V4L2_CID_MPEG_VIDC_HEVC_I_FRAME_MAX_QP: - return "HEVC I Frame Max QP"; - case V4L2_CID_MPEG_VIDC_HEVC_P_FRAME_MAX_QP: - return "HEVC P Frame Max QP"; case V4L2_CID_MPEG_VIDC_SUPERFRAME: return "Encoder Batching Superframe"; + case V4L2_CID_MPEG_VIDC_THUMBNAIL_MODE: + return "Thumbnail Mode"; + case V4L2_CID_MPEG_VIDC_PRIORITY: + return "Priority"; default: - i_vpr_e(inst, "%s: ctrl name not available for ctrl id %#x\n", - __func__, control_id); return NULL; } } +/* + * Due to a long switch case function, ccn failure was observed. Hence the + * below function is split into msm_vidc_get_priv_ctrl_name_list1() and + * msm_vidc_get_priv_ctrl_name_list2() + */ +static const char *msm_vidc_get_priv_ctrl_name(struct msm_vidc_inst *inst, + u32 control_id) +{ + const char *ctrl_name; + + ctrl_name = msm_vidc_get_priv_ctrl_name_list1(inst, control_id); + if (ctrl_name) + return ctrl_name; + ctrl_name = msm_vidc_get_priv_ctrl_name_list2(inst, control_id); + if (ctrl_name) + return ctrl_name; + + i_vpr_e(inst, "%s: ctrl name not available for ctrl id %#x\n", + __func__, control_id); + return NULL; +} static int msm_vidc_packetize_control(struct msm_vidc_inst *inst, enum msm_vidc_inst_capability_type cap_id, u32 payload_type, diff --git a/driver/vidc/src/msm_vidc_debug.c b/driver/vidc/src/msm_vidc_debug.c index b68ad03b26..91c38a4c14 100644 --- a/driver/vidc/src/msm_vidc_debug.c +++ b/driver/vidc/src/msm_vidc_debug.c @@ -320,7 +320,7 @@ static ssize_t inst_info_read(struct file *file, char __user *buf, inst->capabilities->cap[FRAME_RATE].value >> 16); cur += write_str(cur, end - cur, "state: %d\n", inst->state); cur += write_str(cur, end - cur, "secure: %d\n", - !!(inst->flags & VIDC_SECURE)); + is_secure_session(inst)); cur += write_str(cur, end - cur, "-----------Formats-------------\n"); for (i = 0; i < MAX_PORT; i++) { if (i != INPUT_PORT && i != OUTPUT_PORT) diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 8d832af426..5d58e707ac 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -2964,7 +2964,7 @@ int msm_vidc_print_inst_info(struct msm_vidc_inst *inst) return -EINVAL; } - is_secure = !!(inst->flags & VIDC_SECURE); + is_secure = is_secure_session(inst); is_decode = inst->domain == MSM_VIDC_DECODER; port = is_decode ? INPUT_PORT : OUTPUT_PORT; width = inst->fmts[port].fmt.pix_mp.width; diff --git a/driver/vidc/src/msm_vidc_power.c b/driver/vidc/src/msm_vidc_power.c index 72018613b8..4bf125632a 100644 --- a/driver/vidc/src/msm_vidc_power.c +++ b/driver/vidc/src/msm_vidc_power.c @@ -494,8 +494,8 @@ int msm_vidc_scale_clocks(struct msm_vidc_inst *inst) if (!data_size) return 0; - if (inst->power.buffer_counter < DCVS_FTB_WINDOW || - is_turbo_session(inst)) { + //todo: add turbo session check + if (inst->power.buffer_counter < DCVS_FTB_WINDOW) { inst->power.min_freq = msm_vidc_max_freq(inst); inst->power.dcvs_flags = 0; } else if (msm_vidc_clock_voting) {