video: driver: Update metadata port settings
- Set correct metadata buffer sizes/counts in initialization. - Update metadata buffer sizes/count when a metadata control is set. Change-Id: Ib695b267efac26caa5858cdcdec1868d85182b90 Signed-off-by: Mihir Ganu <mganu@codeaurora.org>
Esse commit está contido em:
@@ -297,5 +297,6 @@ bool core_lock_check(struct msm_vidc_core *core, const char *function);
|
||||
void inst_lock(struct msm_vidc_inst *inst, const char *function);
|
||||
void inst_unlock(struct msm_vidc_inst *inst, const char *function);
|
||||
bool inst_lock_check(struct msm_vidc_inst *inst, const char *function);
|
||||
int msm_vidc_update_meta_port_settings(struct msm_vidc_inst *inst);
|
||||
#endif // _MSM_VIDC_DRIVER_H_
|
||||
|
||||
|
@@ -1996,12 +1996,11 @@ int msm_vdec_inst_init(struct msm_vidc_inst *inst)
|
||||
f = &inst->fmts[INPUT_META_PORT];
|
||||
f->type = INPUT_META_PLANE;
|
||||
f->fmt.meta.dataformat = V4L2_META_FMT_VIDC;
|
||||
f->fmt.meta.buffersize = call_session_op(core, buffer_size,
|
||||
inst, MSM_VIDC_BUF_INPUT_META);
|
||||
inst->buffers.input_meta.min_count = inst->buffers.input.min_count;
|
||||
inst->buffers.input_meta.extra_count = inst->buffers.input.extra_count;
|
||||
inst->buffers.input_meta.actual_count = inst->buffers.input.actual_count;
|
||||
inst->buffers.input_meta.size = f->fmt.meta.buffersize;
|
||||
f->fmt.meta.buffersize = 0;
|
||||
inst->buffers.input_meta.min_count = 0;
|
||||
inst->buffers.input_meta.extra_count = 0;
|
||||
inst->buffers.input_meta.actual_count = 0;
|
||||
inst->buffers.input_meta.size = 0;
|
||||
|
||||
f = &inst->fmts[OUTPUT_PORT];
|
||||
f->type = OUTPUT_MPLANE;
|
||||
@@ -2028,12 +2027,11 @@ int msm_vdec_inst_init(struct msm_vidc_inst *inst)
|
||||
f = &inst->fmts[OUTPUT_META_PORT];
|
||||
f->type = OUTPUT_META_PLANE;
|
||||
f->fmt.meta.dataformat = V4L2_META_FMT_VIDC;
|
||||
f->fmt.meta.buffersize = call_session_op(core, buffer_size,
|
||||
inst, MSM_VIDC_BUF_OUTPUT_META);
|
||||
inst->buffers.output_meta.min_count = inst->buffers.output.min_count;
|
||||
inst->buffers.output_meta.extra_count = inst->buffers.output.extra_count;
|
||||
inst->buffers.output_meta.actual_count = inst->buffers.output.actual_count;
|
||||
inst->buffers.output_meta.size = f->fmt.meta.buffersize;
|
||||
f->fmt.meta.buffersize = 0;
|
||||
inst->buffers.output_meta.min_count = 0;
|
||||
inst->buffers.output_meta.extra_count = 0;
|
||||
inst->buffers.output_meta.actual_count = 0;
|
||||
inst->buffers.output_meta.size = 0;
|
||||
|
||||
rc = msm_vdec_codec_change(inst,
|
||||
inst->fmts[INPUT_PORT].fmt.pix_mp.pixelformat);
|
||||
|
@@ -1510,12 +1510,11 @@ int msm_venc_inst_init(struct msm_vidc_inst *inst)
|
||||
f = &inst->fmts[OUTPUT_META_PORT];
|
||||
f->type = OUTPUT_META_PLANE;
|
||||
f->fmt.meta.dataformat = V4L2_META_FMT_VIDC;
|
||||
f->fmt.meta.buffersize = call_session_op(core, buffer_size,
|
||||
inst, MSM_VIDC_BUF_OUTPUT_META);
|
||||
inst->buffers.output_meta.min_count = inst->buffers.output.min_count;
|
||||
inst->buffers.output_meta.extra_count = inst->buffers.output.extra_count;
|
||||
inst->buffers.output_meta.actual_count = inst->buffers.output.actual_count;
|
||||
inst->buffers.output_meta.size = f->fmt.meta.buffersize;
|
||||
f->fmt.meta.buffersize = 0;
|
||||
inst->buffers.output_meta.min_count = 0;
|
||||
inst->buffers.output_meta.extra_count = 0;
|
||||
inst->buffers.output_meta.actual_count = 0;
|
||||
inst->buffers.output_meta.size = 0;
|
||||
|
||||
f = &inst->fmts[INPUT_PORT];
|
||||
f->type = INPUT_MPLANE;
|
||||
@@ -1542,12 +1541,11 @@ int msm_venc_inst_init(struct msm_vidc_inst *inst)
|
||||
f = &inst->fmts[INPUT_META_PORT];
|
||||
f->type = INPUT_META_PLANE;
|
||||
f->fmt.meta.dataformat = V4L2_META_FMT_VIDC;
|
||||
f->fmt.meta.buffersize = call_session_op(core, buffer_size,
|
||||
inst, MSM_VIDC_BUF_INPUT_META);
|
||||
inst->buffers.input_meta.min_count = inst->buffers.input.min_count;
|
||||
inst->buffers.input_meta.extra_count = inst->buffers.input.extra_count;
|
||||
inst->buffers.input_meta.actual_count = inst->buffers.input.actual_count;
|
||||
inst->buffers.input_meta.size = f->fmt.meta.buffersize;
|
||||
f->fmt.meta.buffersize = 0;
|
||||
inst->buffers.input_meta.min_count = 0;
|
||||
inst->buffers.input_meta.extra_count = 0;
|
||||
inst->buffers.input_meta.actual_count = 0;
|
||||
inst->buffers.input_meta.size = 0;
|
||||
|
||||
inst->hfi_rc_type = HFI_RC_VBR_CFR;
|
||||
|
||||
|
@@ -24,6 +24,26 @@ static bool is_priv_ctrl(u32 id)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool is_meta_ctrl(u32 id)
|
||||
{
|
||||
return (id == V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_INTERLACE ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP ||
|
||||
id == V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA);
|
||||
}
|
||||
|
||||
static const char *const mpeg_video_rate_control[] = {
|
||||
"VBR",
|
||||
"CBR",
|
||||
@@ -625,6 +645,10 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
/* Static setting */
|
||||
if (!inst->vb2q[OUTPUT_PORT].streaming) {
|
||||
capability->cap[cap_id].value = ctrl->val;
|
||||
|
||||
if (is_meta_ctrl(ctrl->id))
|
||||
msm_vidc_update_meta_port_settings(inst);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -2760,3 +2760,54 @@ void inst_unlock(struct msm_vidc_inst *inst, const char *function)
|
||||
{
|
||||
mutex_unlock(&inst->lock);
|
||||
}
|
||||
|
||||
int msm_vidc_update_meta_port_settings(struct msm_vidc_inst *inst)
|
||||
{
|
||||
struct msm_vidc_core *core;
|
||||
struct v4l2_format *fmt;
|
||||
|
||||
if (!inst || !inst->core) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
core = inst->core;
|
||||
|
||||
fmt = &inst->fmts[INPUT_META_PORT];
|
||||
if (is_input_meta_enabled(inst)) {
|
||||
fmt->fmt.meta.buffersize = call_session_op(core,
|
||||
buffer_size, inst, MSM_VIDC_BUF_INPUT_META);
|
||||
inst->buffers.input_meta.min_count =
|
||||
inst->buffers.input.min_count;
|
||||
inst->buffers.input_meta.extra_count =
|
||||
inst->buffers.input.extra_count;
|
||||
inst->buffers.input_meta.actual_count =
|
||||
inst->buffers.input.actual_count;
|
||||
inst->buffers.input_meta.size = fmt->fmt.meta.buffersize;
|
||||
} else {
|
||||
fmt->fmt.meta.buffersize = 0;
|
||||
inst->buffers.input_meta.min_count = 0;
|
||||
inst->buffers.input_meta.extra_count = 0;
|
||||
inst->buffers.input_meta.actual_count = 0;
|
||||
inst->buffers.input_meta.size = 0;
|
||||
}
|
||||
|
||||
fmt = &inst->fmts[OUTPUT_META_PORT];
|
||||
if (is_output_meta_enabled(inst)) {
|
||||
fmt->fmt.meta.buffersize = call_session_op(core,
|
||||
buffer_size, inst, MSM_VIDC_BUF_OUTPUT_META);
|
||||
inst->buffers.output_meta.min_count =
|
||||
inst->buffers.output.min_count;
|
||||
inst->buffers.output_meta.extra_count =
|
||||
inst->buffers.output.extra_count;
|
||||
inst->buffers.output_meta.actual_count =
|
||||
inst->buffers.output.actual_count;
|
||||
inst->buffers.output_meta.size = fmt->fmt.meta.buffersize;
|
||||
} else {
|
||||
fmt->fmt.meta.buffersize = 0;
|
||||
inst->buffers.output_meta.min_count = 0;
|
||||
inst->buffers.output_meta.extra_count = 0;
|
||||
inst->buffers.output_meta.actual_count = 0;
|
||||
inst->buffers.output_meta.size = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Referência em uma nova issue
Block a user