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 <darshana@codeaurora.org>
This commit is contained in:
Darshana Patil
2021-03-01 13:13:22 -08:00
parent 57637ef8e0
commit 596ca194de
12 changed files with 107 additions and 72 deletions

View File

@@ -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)

View File

@@ -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;

View File

@@ -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,

View File

@@ -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 -

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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)

View File

@@ -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;

View File

@@ -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) {