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:
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
@@ -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,
|
||||
|
@@ -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 -
|
||||
|
@@ -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) {
|
||||
|
@@ -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:
|
||||
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,
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user