Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 17ed11c5 authored by Akshata Sahukar's avatar Akshata Sahukar
Browse files

msm: vidc: Update CVP skip pattern logic



Update CVP metadata skip logic to send a frame for CVP
processing every time frame rate or operatimg rate changes
dynamically. This helps in handling skipping of CVP metadata
processing for a random number of frames whenever frame rate
or operating rate changes dynamically, and avoid sending
CVP metadata to video firmware for an unpredictable frame.

Signed-off-by: default avatarAkshata Sahukar <asahukar@codeaurora.org>

Change-Id: I049f0c0ade1700816203713cd82382c2a614f20a
parent d168b1da
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -666,6 +666,9 @@ static int msm_cvp_prepare_extradata(struct msm_vidc_inst *inst,
	char *kvaddr = NULL;
	struct msm_vidc_extradata_header *e_hdr;
	bool input_extradata, found_end;
	char *cvpframe = NULL;
	u32 cvp_metadata_valid_flag = 0;
	int nIsValid_offset = 232;

	if (!inst || !inst->cvp || !mbuf) {
		dprintk(VIDC_ERR, "%s: invalid params\n", __func__);
@@ -753,6 +756,11 @@ static int msm_cvp_prepare_extradata(struct msm_vidc_inst *inst,
			DMA_BIDIRECTIONAL);
		memcpy(e_hdr->data, cvp->output_buffer.kvaddr,
			sizeof(struct msm_vidc_enc_cvp_metadata_payload));
		cvpframe = (char *) e_hdr->data;
		cvp_metadata_valid_flag = *(u32*)(cvpframe + nIsValid_offset);
		dprintk(VIDC_HIGH,
			"CVP metadata nIsValid flag = %u frame: %u",
			cvp_metadata_valid_flag, cvp->framecount);
		dma_buf_end_cpu_access(cvp->output_buffer.dbuf,
			DMA_BIDIRECTIONAL);
	}
@@ -823,6 +831,7 @@ static int msm_cvp_frame_process(struct msm_vidc_inst *inst,
	const u32 fps_max = CVP_FRAME_RATE_MAX;
	u32 fps, operating_rate, skip_framecount;
	bool skipframe = false;
	bool first_frame = false;

	if (!inst || !inst->cvp || !inst->cvp->arg || !mbuf) {
		dprintk(VIDC_ERR, "%s: invalid params\n", __func__);
@@ -838,10 +847,14 @@ static int msm_cvp_frame_process(struct msm_vidc_inst *inst,
	cvp->fullres_buffer.offset = vb->planes[0].data_offset;
	cvp->fullres_buffer.dbuf = mbuf->smem[0].dma_buf;

	if(!cvp->framecount)
		first_frame = true;

	/* handle framerate or operarating rate changes dynamically */
	if (cvp->frame_rate != inst->clk_data.frame_rate ||
		cvp->operating_rate != inst->clk_data.operating_rate) {
		/* update cvp parameters */
		cvp->framecount = 0;
		cvp->frame_rate = inst->clk_data.frame_rate;
		cvp->operating_rate = inst->clk_data.operating_rate;
		rc = msm_cvp_set_clocks_and_bus(inst);
@@ -898,7 +911,7 @@ static int msm_cvp_frame_process(struct msm_vidc_inst *inst,
	frame->size = sizeof(struct msm_cvp_dme_frame_packet);
	frame->packet_type = HFI_CMD_SESSION_CVP_DME_FRAME;
	frame->session_id = cvp->session_id;
	if (!cvp->framecount)
	if (first_frame)
		frame->skip_mv_calc = 1;
	else
		frame->skip_mv_calc = 0;