From 17ed11c5eaa11cb7a40315e519816b58a2e765a0 Mon Sep 17 00:00:00 2001 From: Akshata Sahukar Date: Fri, 23 Aug 2019 14:20:30 -0700 Subject: [PATCH] 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: Akshata Sahukar Change-Id: I049f0c0ade1700816203713cd82382c2a614f20a --- msm/vidc/msm_cvp_external.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/msm/vidc/msm_cvp_external.c b/msm/vidc/msm_cvp_external.c index 5725062d96cf..8b1adc80f235 100644 --- a/msm/vidc/msm_cvp_external.c +++ b/msm/vidc/msm_cvp_external.c @@ -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;