|
@@ -82,6 +82,8 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
|
|
|
{META_EVA_STATS, "META_EVA_STATS" },
|
|
|
{META_ROI_INFO, "META_ROI_INFO" },
|
|
|
{META_SALIENCY_INFO, "META_SALIENCY_INFO" },
|
|
|
+ {META_TRANSCODING_STAT_INFO, "META_TRANSCODING_STAT_INFO" },
|
|
|
+ {META_DOLBY_RPU, "META_DOLBY_RPU" },
|
|
|
{META_CAP_MAX, "META_CAP_MAX" },
|
|
|
{FRAME_WIDTH, "FRAME_WIDTH" },
|
|
|
{LOSSLESS_FRAME_WIDTH, "LOSSLESS_FRAME_WIDTH" },
|
|
@@ -110,6 +112,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
|
|
|
{MB_CYCLES_LP, "MB_CYCLES_LP" },
|
|
|
{MB_CYCLES_FW, "MB_CYCLES_FW" },
|
|
|
{MB_CYCLES_FW_VPP, "MB_CYCLES_FW_VPP" },
|
|
|
+ {CLIENT_ID, "CLIENT_ID" },
|
|
|
{SECURE_MODE, "SECURE_MODE" },
|
|
|
{FENCE_ID, "FENCE_ID" },
|
|
|
{FENCE_FD, "FENCE_FD" },
|
|
@@ -188,6 +191,10 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
|
|
|
{INPUT_META_VIA_REQUEST, "INPUT_META_VIA_REQUEST" },
|
|
|
{ENC_IP_CR, "ENC_IP_CR" },
|
|
|
{COMPLEXITY, "COMPLEXITY" },
|
|
|
+ {CABAC_MAX_BITRATE, "CABAC_MAX_BITRATE" },
|
|
|
+ {CAVLC_MAX_BITRATE, "CAVLC_MAX_BITRATE" },
|
|
|
+ {ALLINTRA_MAX_BITRATE, "ALLINTRA_MAX_BITRATE" },
|
|
|
+ {LOWLATENCY_MAX_BITRATE, "LOWLATENCY_MAX_BITRATE" },
|
|
|
{PROFILE, "PROFILE" },
|
|
|
{ENH_LAYER_COUNT, "ENH_LAYER_COUNT" },
|
|
|
{BIT_RATE, "BIT_RATE" },
|
|
@@ -1767,8 +1774,8 @@ static int msm_vidc_flush_pending_last_flag(struct msm_vidc_inst *inst)
|
|
|
return rc;
|
|
|
}
|
|
|
list_del(&resp_work->list);
|
|
|
- kfree(resp_work->data);
|
|
|
- kfree(resp_work);
|
|
|
+ msm_vidc_vmem_free((void **)&resp_work->data);
|
|
|
+ msm_vidc_vmem_free((void **)&resp_work);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1794,8 +1801,8 @@ static int msm_vidc_discard_pending_opsc(struct msm_vidc_inst *inst)
|
|
|
i_vpr_h(inst,
|
|
|
"%s: discard pending output psc\n", __func__);
|
|
|
list_del(&resp_work->list);
|
|
|
- kfree(resp_work->data);
|
|
|
- kfree(resp_work);
|
|
|
+ msm_vidc_vmem_free((void **)&resp_work->data);
|
|
|
+ msm_vidc_vmem_free((void **)&resp_work);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1825,8 +1832,8 @@ static int msm_vidc_discard_pending_ipsc(struct msm_vidc_inst *inst)
|
|
|
inst->ipsc_properties_set = false;
|
|
|
|
|
|
list_del(&resp_work->list);
|
|
|
- kfree(resp_work->data);
|
|
|
- kfree(resp_work);
|
|
|
+ msm_vidc_vmem_free((void **)&resp_work->data);
|
|
|
+ msm_vidc_vmem_free((void **)&resp_work);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1863,8 +1870,8 @@ static int msm_vidc_process_pending_ipsc(struct msm_vidc_inst *inst,
|
|
|
}
|
|
|
}
|
|
|
list_del(&resp_work->list);
|
|
|
- kfree(resp_work->data);
|
|
|
- kfree(resp_work);
|
|
|
+ msm_vidc_vmem_free((void **)&resp_work->data);
|
|
|
+ msm_vidc_vmem_free((void **)&resp_work);
|
|
|
/* list contains max only one ipsc at anytime */
|
|
|
break;
|
|
|
}
|
|
@@ -2413,7 +2420,7 @@ int msm_vidc_update_input_rate(struct msm_vidc_inst *inst, u64 time_us)
|
|
|
prev_timer = input_timer;
|
|
|
}
|
|
|
|
|
|
- if (input_timer_sum_us)
|
|
|
+ if (input_timer_sum_us && counter >= INPUT_TIMER_LIST_SIZE)
|
|
|
inst->capabilities->cap[INPUT_RATE].value =
|
|
|
(s32)(DIV64_U64_ROUND_CLOSEST(counter * 1000000,
|
|
|
input_timer_sum_us) << 16);
|
|
@@ -3211,7 +3218,7 @@ exit:
|
|
|
|
|
|
static void msm_vidc_update_input_cr(struct msm_vidc_inst *inst, u32 idx, u32 cr)
|
|
|
{
|
|
|
- struct msm_vidc_input_cr_data *temp, *next;
|
|
|
+ struct msm_vidc_input_cr_data *temp = NULL, *next = NULL;
|
|
|
bool found = false;
|
|
|
|
|
|
list_for_each_entry_safe(temp, next, &inst->enc_input_crs, list) {
|
|
@@ -3222,11 +3229,10 @@ static void msm_vidc_update_input_cr(struct msm_vidc_inst *inst, u32 idx, u32 cr
|
|
|
}
|
|
|
}
|
|
|
if (!found) {
|
|
|
- temp = kzalloc(sizeof(*temp), GFP_KERNEL);
|
|
|
- if (!temp) {
|
|
|
- i_vpr_e(inst, "%s: malloc failure.\n", __func__);
|
|
|
+ temp = NULL;
|
|
|
+ if (msm_vidc_vmem_alloc(sizeof(*temp), (void **)&temp, __func__))
|
|
|
return;
|
|
|
- }
|
|
|
+
|
|
|
temp->index = idx;
|
|
|
temp->input_cr = cr;
|
|
|
list_add_tail(&temp->list, &inst->enc_input_crs);
|
|
@@ -3239,7 +3245,7 @@ static void msm_vidc_free_input_cr_list(struct msm_vidc_inst *inst)
|
|
|
|
|
|
list_for_each_entry_safe(temp, next, &inst->enc_input_crs, list) {
|
|
|
list_del(&temp->list);
|
|
|
- kfree(temp);
|
|
|
+ msm_vidc_vmem_free((void **)&temp);
|
|
|
}
|
|
|
INIT_LIST_HEAD(&inst->enc_input_crs);
|
|
|
}
|
|
@@ -3902,7 +3908,6 @@ static int msm_vidc_vb2_buffer_done(struct msm_vidc_inst *inst,
|
|
|
vbuf->flags = buf->flags;
|
|
|
vb2->timestamp = buf->timestamp;
|
|
|
vb2->planes[0].bytesused = buf->data_size + vb2->planes[0].data_offset;
|
|
|
- v4l2_ctrl_request_complete(vb2->req_obj.req, &inst->ctrl_handler);
|
|
|
vb2_buffer_done(vb2, state);
|
|
|
|
|
|
return 0;
|
|
@@ -4098,22 +4103,20 @@ int msm_vidc_vb2_queue_init(struct msm_vidc_inst *inst)
|
|
|
}
|
|
|
inst->event_handler.m2m_ctx = inst->m2m_ctx;
|
|
|
|
|
|
- inst->bufq[INPUT_META_PORT].vb2q = kzalloc(sizeof(struct vb2_queue), GFP_KERNEL);
|
|
|
- if (!inst->bufq[INPUT_META_PORT].vb2q) {
|
|
|
- i_vpr_e(inst, "%s: queue allocation failed for input meta port\n", __func__);
|
|
|
+ rc = msm_vidc_vmem_alloc(sizeof(struct vb2_queue),
|
|
|
+ (void **)&inst->bufq[INPUT_META_PORT].vb2q, "input meta port");
|
|
|
+ if (rc)
|
|
|
goto fail_in_meta_alloc;
|
|
|
- }
|
|
|
|
|
|
/* do input meta port queues initialization */
|
|
|
rc = vb2q_init(inst, inst->bufq[INPUT_META_PORT].vb2q, INPUT_META_PLANE);
|
|
|
if (rc)
|
|
|
goto fail_in_meta_vb2q_init;
|
|
|
|
|
|
- inst->bufq[OUTPUT_META_PORT].vb2q = kzalloc(sizeof(struct vb2_queue), GFP_KERNEL);
|
|
|
- if (!inst->bufq[OUTPUT_META_PORT].vb2q) {
|
|
|
- i_vpr_e(inst, "%s: queue allocation failed for output meta port\n", __func__);
|
|
|
+ rc = msm_vidc_vmem_alloc(sizeof(struct vb2_queue),
|
|
|
+ (void **)&inst->bufq[OUTPUT_META_PORT].vb2q, "output meta port");
|
|
|
+ if (rc)
|
|
|
goto fail_out_meta_alloc;
|
|
|
- }
|
|
|
|
|
|
/* do output meta port queues initialization */
|
|
|
rc = vb2q_init(inst, inst->bufq[OUTPUT_META_PORT].vb2q, OUTPUT_META_PLANE);
|
|
@@ -4124,12 +4127,12 @@ int msm_vidc_vb2_queue_init(struct msm_vidc_inst *inst)
|
|
|
return 0;
|
|
|
|
|
|
fail_out_meta_vb2q_init:
|
|
|
- kfree(inst->bufq[OUTPUT_META_PORT].vb2q);
|
|
|
+ msm_vidc_vmem_free((void **)&inst->bufq[OUTPUT_META_PORT].vb2q);
|
|
|
inst->bufq[OUTPUT_META_PORT].vb2q = NULL;
|
|
|
fail_out_meta_alloc:
|
|
|
vb2_queue_release(inst->bufq[INPUT_META_PORT].vb2q);
|
|
|
fail_in_meta_vb2q_init:
|
|
|
- kfree(inst->bufq[INPUT_META_PORT].vb2q);
|
|
|
+ msm_vidc_vmem_free((void **)&inst->bufq[INPUT_META_PORT].vb2q);
|
|
|
inst->bufq[INPUT_META_PORT].vb2q = NULL;
|
|
|
fail_in_meta_alloc:
|
|
|
v4l2_m2m_ctx_release(inst->m2m_ctx);
|
|
@@ -4155,10 +4158,10 @@ int msm_vidc_vb2_queue_deinit(struct msm_vidc_inst *inst)
|
|
|
}
|
|
|
|
|
|
vb2_queue_release(inst->bufq[OUTPUT_META_PORT].vb2q);
|
|
|
- kfree(inst->bufq[OUTPUT_META_PORT].vb2q);
|
|
|
+ msm_vidc_vmem_free((void **)&inst->bufq[OUTPUT_META_PORT].vb2q);
|
|
|
inst->bufq[OUTPUT_META_PORT].vb2q = NULL;
|
|
|
vb2_queue_release(inst->bufq[INPUT_META_PORT].vb2q);
|
|
|
- kfree(inst->bufq[INPUT_META_PORT].vb2q);
|
|
|
+ msm_vidc_vmem_free((void **)&inst->bufq[INPUT_META_PORT].vb2q);
|
|
|
inst->bufq[INPUT_META_PORT].vb2q = NULL;
|
|
|
/*
|
|
|
* vb2_queue_release() for input and output queues
|
|
@@ -4282,11 +4285,9 @@ int msm_vidc_session_open(struct msm_vidc_inst *inst)
|
|
|
}
|
|
|
|
|
|
inst->packet_size = 4096;
|
|
|
- inst->packet = kzalloc(inst->packet_size, GFP_KERNEL);
|
|
|
- if (!inst->packet) {
|
|
|
- i_vpr_e(inst, "%s(): inst packet allocation failed\n", __func__);
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
+ rc = msm_vidc_vmem_alloc(inst->packet_size, (void **)&inst->packet, __func__);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
|
|
|
rc = venus_hfi_session_open(inst);
|
|
|
if (rc)
|
|
@@ -4295,7 +4296,7 @@ int msm_vidc_session_open(struct msm_vidc_inst *inst)
|
|
|
return 0;
|
|
|
error:
|
|
|
i_vpr_e(inst, "%s(): session open failed\n", __func__);
|
|
|
- kfree(inst->packet);
|
|
|
+ msm_vidc_vmem_free((void **)&inst->packet);
|
|
|
inst->packet = NULL;
|
|
|
return rc;
|
|
|
}
|
|
@@ -4480,7 +4481,7 @@ int msm_vidc_session_close(struct msm_vidc_inst *inst)
|
|
|
|
|
|
/* we are not supposed to send any more commands after close */
|
|
|
i_vpr_h(inst, "%s: free session packet data\n", __func__);
|
|
|
- kfree(inst->packet);
|
|
|
+ msm_vidc_vmem_free((void **)&inst->packet);
|
|
|
inst->packet = NULL;
|
|
|
|
|
|
core = inst->core;
|
|
@@ -4559,7 +4560,7 @@ int msm_vidc_deinit_core_caps(struct msm_vidc_core *core)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- kfree(core->capabilities);
|
|
|
+ msm_vidc_vmem_free((void **)&core->capabilities);
|
|
|
core->capabilities = NULL;
|
|
|
d_vpr_h("%s: Core capabilities freed\n", __func__);
|
|
|
|
|
@@ -4586,15 +4587,10 @@ int msm_vidc_init_core_caps(struct msm_vidc_core *core)
|
|
|
goto exit;
|
|
|
}
|
|
|
|
|
|
- core->capabilities = kcalloc(1,
|
|
|
- (sizeof(struct msm_vidc_core_capability) *
|
|
|
- (CORE_CAP_MAX + 1)), GFP_KERNEL);
|
|
|
- if (!core->capabilities) {
|
|
|
- d_vpr_e("%s: failed to allocate core capabilities\n",
|
|
|
- __func__);
|
|
|
- rc = -ENOMEM;
|
|
|
+ rc = msm_vidc_vmem_alloc((sizeof(struct msm_vidc_core_capability) *
|
|
|
+ (CORE_CAP_MAX + 1)), (void **)&core->capabilities, __func__);
|
|
|
+ if (rc)
|
|
|
goto exit;
|
|
|
- }
|
|
|
|
|
|
num_platform_caps = core->platform->data.core_data_size;
|
|
|
|
|
@@ -4663,7 +4659,7 @@ int msm_vidc_deinit_instance_caps(struct msm_vidc_core *core)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- kfree(core->inst_caps);
|
|
|
+ msm_vidc_vmem_free((void **)&core->inst_caps);
|
|
|
core->inst_caps = NULL;
|
|
|
d_vpr_h("%s: core->inst_caps freed\n", __func__);
|
|
|
|
|
@@ -4713,15 +4709,10 @@ int msm_vidc_init_instance_caps(struct msm_vidc_core *core)
|
|
|
COUNT_BITS(count_bits, codecs_count);
|
|
|
|
|
|
core->codecs_count = codecs_count;
|
|
|
- core->inst_caps = kcalloc(codecs_count,
|
|
|
- sizeof(struct msm_vidc_inst_capability),
|
|
|
- GFP_KERNEL);
|
|
|
- if (!core->inst_caps) {
|
|
|
- d_vpr_e("%s: failed to allocate core capabilities\n",
|
|
|
- __func__);
|
|
|
- rc = -ENOMEM;
|
|
|
+ rc = msm_vidc_vmem_alloc(codecs_count * sizeof(struct msm_vidc_inst_capability),
|
|
|
+ (void **)&core->inst_caps, __func__);
|
|
|
+ if (rc)
|
|
|
goto error;
|
|
|
- }
|
|
|
|
|
|
check_bit = 0;
|
|
|
/* determine codecs for enc domain */
|
|
@@ -5558,25 +5549,25 @@ void msm_vidc_destroy_buffers(struct msm_vidc_inst *inst)
|
|
|
|
|
|
list_for_each_entry_safe(work, dummy_work, &inst->response_works, list) {
|
|
|
list_del(&work->list);
|
|
|
- kfree(work->data);
|
|
|
- kfree(work);
|
|
|
+ msm_vidc_vmem_free((void **)&work->data);
|
|
|
+ msm_vidc_vmem_free((void **)&work);
|
|
|
}
|
|
|
|
|
|
list_for_each_entry_safe(entry, dummy_entry, &inst->firmware_list, list) {
|
|
|
i_vpr_e(inst, "%s: fw list: %s\n", __func__, cap_name(entry->cap_id));
|
|
|
list_del(&entry->list);
|
|
|
- kfree(entry);
|
|
|
+ msm_vidc_vmem_free((void **)&entry);
|
|
|
}
|
|
|
|
|
|
list_for_each_entry_safe(entry, dummy_entry, &inst->children_list, list) {
|
|
|
i_vpr_e(inst, "%s: child list: %s\n", __func__, cap_name(entry->cap_id));
|
|
|
list_del(&entry->list);
|
|
|
- kfree(entry);
|
|
|
+ msm_vidc_vmem_free((void **)&entry);
|
|
|
}
|
|
|
|
|
|
list_for_each_entry_safe(entry, dummy_entry, &inst->caps_list, list) {
|
|
|
list_del(&entry->list);
|
|
|
- kfree(entry);
|
|
|
+ msm_vidc_vmem_free((void **)&entry);
|
|
|
}
|
|
|
|
|
|
list_for_each_entry_safe(fence, dummy_fence, &inst->fence_list, list) {
|
|
@@ -5606,10 +5597,11 @@ static void msm_vidc_close_helper(struct kref *kref)
|
|
|
if (inst->response_workq)
|
|
|
destroy_workqueue(inst->response_workq);
|
|
|
msm_vidc_remove_dangling_session(inst);
|
|
|
+ mutex_destroy(&inst->client_lock);
|
|
|
mutex_destroy(&inst->request_lock);
|
|
|
mutex_destroy(&inst->lock);
|
|
|
- kfree(inst->capabilities);
|
|
|
- kfree(inst);
|
|
|
+ msm_vidc_vmem_free((void **)&inst->capabilities);
|
|
|
+ msm_vidc_vmem_free((void **)&inst);
|
|
|
}
|
|
|
|
|
|
struct msm_vidc_inst *get_inst_ref(struct msm_vidc_core *core,
|
|
@@ -5698,6 +5690,21 @@ void inst_unlock(struct msm_vidc_inst *inst, const char *function)
|
|
|
mutex_unlock(&inst->lock);
|
|
|
}
|
|
|
|
|
|
+bool client_lock_check(struct msm_vidc_inst *inst, const char *func)
|
|
|
+{
|
|
|
+ return mutex_is_locked(&inst->client_lock);
|
|
|
+}
|
|
|
+
|
|
|
+void client_lock(struct msm_vidc_inst *inst, const char *function)
|
|
|
+{
|
|
|
+ mutex_lock(&inst->client_lock);
|
|
|
+}
|
|
|
+
|
|
|
+void client_unlock(struct msm_vidc_inst *inst, const char *function)
|
|
|
+{
|
|
|
+ mutex_unlock(&inst->client_lock);
|
|
|
+}
|
|
|
+
|
|
|
int msm_vidc_update_bitstream_buffer_size(struct msm_vidc_inst *inst)
|
|
|
{
|
|
|
struct msm_vidc_core *core;
|
|
@@ -5853,8 +5860,8 @@ void msm_vidc_schedule_core_deinit(struct msm_vidc_core *core)
|
|
|
static const char *get_codec_str(enum msm_vidc_codec_type type)
|
|
|
{
|
|
|
switch (type) {
|
|
|
- case MSM_VIDC_H264: return "h264";
|
|
|
- case MSM_VIDC_HEVC: return "h265";
|
|
|
+ case MSM_VIDC_H264: return " avc";
|
|
|
+ case MSM_VIDC_HEVC: return "hevc";
|
|
|
case MSM_VIDC_VP9: return " vp9";
|
|
|
case MSM_VIDC_AV1: return " av1";
|
|
|
case MSM_VIDC_HEIC: return "heic";
|
|
@@ -5866,8 +5873,8 @@ static const char *get_codec_str(enum msm_vidc_codec_type type)
|
|
|
static const char *get_domain_str(enum msm_vidc_domain_type type)
|
|
|
{
|
|
|
switch (type) {
|
|
|
- case MSM_VIDC_ENCODER: return "e";
|
|
|
- case MSM_VIDC_DECODER: return "d";
|
|
|
+ case MSM_VIDC_ENCODER: return "E";
|
|
|
+ case MSM_VIDC_DECODER: return "D";
|
|
|
}
|
|
|
|
|
|
return ".";
|
|
@@ -5876,6 +5883,7 @@ static const char *get_domain_str(enum msm_vidc_domain_type type)
|
|
|
int msm_vidc_update_debug_str(struct msm_vidc_inst *inst)
|
|
|
{
|
|
|
u32 sid;
|
|
|
+ int client_id = INVALID_CLIENT_ID;
|
|
|
const char *codec;
|
|
|
const char *domain;
|
|
|
|
|
@@ -5883,10 +5891,20 @@ int msm_vidc_update_debug_str(struct msm_vidc_inst *inst)
|
|
|
d_vpr_e("%s: Invalid params\n", __func__);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
+
|
|
|
+ if (inst->capabilities)
|
|
|
+ client_id = inst->capabilities->cap[CLIENT_ID].value;
|
|
|
+
|
|
|
sid = inst->session_id;
|
|
|
codec = get_codec_str(inst->codec);
|
|
|
domain = get_domain_str(inst->domain);
|
|
|
- snprintf(inst->debug_str, sizeof(inst->debug_str), "%08x: %s%s", sid, codec, domain);
|
|
|
+ if (client_id != INVALID_CLIENT_ID) {
|
|
|
+ snprintf(inst->debug_str, sizeof(inst->debug_str), "%08x: %s%s_%d",
|
|
|
+ sid, codec, domain, client_id);
|
|
|
+ } else {
|
|
|
+ snprintf(inst->debug_str, sizeof(inst->debug_str), "%08x: %s%s",
|
|
|
+ sid, codec, domain);
|
|
|
+ }
|
|
|
d_vpr_h("%s: sid: %08x, codec: %s, domain: %s, final: %s\n",
|
|
|
__func__, sid, codec, domain, inst->debug_str);
|
|
|
|
|
@@ -5991,7 +6009,7 @@ int msm_vidc_check_core_mbps(struct msm_vidc_inst *inst)
|
|
|
continue;
|
|
|
|
|
|
/* ignore thumbnail, image, and non realtime sessions */
|
|
|
- if (msm_vidc_ignore_session_load(inst))
|
|
|
+ if (msm_vidc_ignore_session_load(instance))
|
|
|
continue;
|
|
|
|
|
|
mbps = msm_vidc_get_inst_load(instance);
|
|
@@ -6016,10 +6034,10 @@ int msm_vidc_check_core_mbps(struct msm_vidc_inst *inst)
|
|
|
core_lock(core, __func__);
|
|
|
list_for_each_entry(instance, &core->instances, list) {
|
|
|
/* reduce realtime decode sessions priority */
|
|
|
- if (is_decode_session(inst) && is_realtime_session(inst)) {
|
|
|
+ if (is_decode_session(instance) && is_realtime_session(instance)) {
|
|
|
instance->adjust_priority = RT_DEC_DOWN_PRORITY_OFFSET;
|
|
|
i_vpr_h(inst, "%s: pending adjust priority by %d\n",
|
|
|
- __func__, inst->adjust_priority);
|
|
|
+ __func__, instance->adjust_priority);
|
|
|
}
|
|
|
}
|
|
|
core_unlock(core, __func__);
|
|
@@ -6092,7 +6110,7 @@ int msm_vidc_check_core_mbpf(struct msm_vidc_inst *inst)
|
|
|
core_lock(core, __func__);
|
|
|
/* check real-time video sessions max limit */
|
|
|
list_for_each_entry(instance, &core->instances, list) {
|
|
|
- if (msm_vidc_ignore_session_load(inst))
|
|
|
+ if (msm_vidc_ignore_session_load(instance))
|
|
|
continue;
|
|
|
|
|
|
video_rt_mbpf += msm_vidc_get_mbs_per_frame(instance);
|
|
@@ -6137,6 +6155,43 @@ static int msm_vidc_check_inst_mbpf(struct msm_vidc_inst *inst)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+u32 msm_vidc_get_max_bitrate(struct msm_vidc_inst* inst)
|
|
|
+{
|
|
|
+ struct msm_vidc_inst_capability *capability;
|
|
|
+ u32 max_bitrate = 0x7fffffff;
|
|
|
+
|
|
|
+ if (!inst || !inst->capabilities) {
|
|
|
+ d_vpr_e("%s: invalid params\n", __func__);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ capability = inst->capabilities;
|
|
|
+
|
|
|
+ if (inst->capabilities->cap[LOWLATENCY_MODE].value)
|
|
|
+ max_bitrate = min(max_bitrate,
|
|
|
+ (u32)inst->capabilities->cap[LOWLATENCY_MAX_BITRATE].max);
|
|
|
+
|
|
|
+ if (inst->capabilities->cap[ALL_INTRA].value)
|
|
|
+ max_bitrate = min(max_bitrate,
|
|
|
+ (u32)inst->capabilities->cap[ALLINTRA_MAX_BITRATE].max);
|
|
|
+
|
|
|
+ if (inst->codec == MSM_VIDC_HEVC) {
|
|
|
+ max_bitrate = min(max_bitrate,
|
|
|
+ (u32)inst->capabilities->cap[CABAC_MAX_BITRATE].max);
|
|
|
+ } else if (inst->codec == MSM_VIDC_H264) {
|
|
|
+ if (inst->capabilities->cap[ENTROPY_MODE].value ==
|
|
|
+ V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC)
|
|
|
+ max_bitrate = min(max_bitrate,
|
|
|
+ (u32)inst->capabilities->cap[CAVLC_MAX_BITRATE].max);
|
|
|
+ else
|
|
|
+ max_bitrate = min(max_bitrate,
|
|
|
+ (u32)inst->capabilities->cap[CABAC_MAX_BITRATE].max);
|
|
|
+ }
|
|
|
+ if (max_bitrate == 0x7fffffff || !max_bitrate)
|
|
|
+ max_bitrate = min(max_bitrate, (u32)inst->capabilities->cap[BIT_RATE].max);
|
|
|
+
|
|
|
+ return max_bitrate;
|
|
|
+}
|
|
|
+
|
|
|
static bool msm_vidc_allow_image_encode_session(struct msm_vidc_inst *inst)
|
|
|
{
|
|
|
struct msm_vidc_inst_capability *capability;
|
|
@@ -6180,16 +6235,6 @@ static bool msm_vidc_allow_image_encode_session(struct msm_vidc_inst *inst)
|
|
|
goto exit;
|
|
|
}
|
|
|
|
|
|
- /* is input grid aligned */
|
|
|
- fmt = &inst->fmts[INPUT_PORT];
|
|
|
- allow = IS_ALIGNED(fmt->fmt.pix_mp.width, HEIC_GRID_DIMENSION);
|
|
|
- allow &= IS_ALIGNED(fmt->fmt.pix_mp.height, HEIC_GRID_DIMENSION);
|
|
|
- if (!allow) {
|
|
|
- i_vpr_e(inst, "%s: input is not grid aligned: %u x %u\n", __func__,
|
|
|
- fmt->fmt.pix_mp.width, fmt->fmt.pix_mp.height);
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
/* is output grid dimension */
|
|
|
fmt = &inst->fmts[OUTPUT_PORT];
|
|
|
allow = fmt->fmt.pix_mp.width == HEIC_GRID_DIMENSION;
|
|
@@ -6201,7 +6246,7 @@ static bool msm_vidc_allow_image_encode_session(struct msm_vidc_inst *inst)
|
|
|
}
|
|
|
|
|
|
/* is bitrate mode CQ */
|
|
|
- allow = capability->cap[BITRATE_MODE].value == HFI_RC_CQ;
|
|
|
+ allow = capability->cap[BITRATE_MODE].value == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ;
|
|
|
if (!allow) {
|
|
|
i_vpr_e(inst, "%s: bitrate mode is not CQ: %#x\n", __func__,
|
|
|
capability->cap[BITRATE_MODE].value);
|
|
@@ -6334,7 +6379,7 @@ static int msm_vidc_check_max_sessions(struct msm_vidc_inst *inst)
|
|
|
core_lock(core, __func__);
|
|
|
list_for_each_entry(i, &core->instances, list) {
|
|
|
/* skip image sessions count */
|
|
|
- if (is_image_session(inst))
|
|
|
+ if (is_image_session(i))
|
|
|
continue;
|
|
|
|
|
|
if (is_decode_session(i)) {
|