diff --git a/msm/vidc/msm_cvp_external.c b/msm/vidc/msm_cvp_external.c index 62eed1185afb..4fab5a81fdd2 100644 --- a/msm/vidc/msm_cvp_external.c +++ b/msm/vidc/msm_cvp_external.c @@ -864,6 +864,7 @@ static int msm_cvp_frame_process(struct msm_vidc_inst *inst, else operating_rate = cvp->operating_rate; + mbuf->vvb.flags &= ~V4L2_BUF_FLAG_CVPMETADATA_SKIP; /* frame skip logic */ fps = max(cvp->frame_rate, operating_rate) >> 16; if (fps > fps_max) { @@ -878,10 +879,11 @@ static int msm_cvp_frame_process(struct msm_vidc_inst *inst, skipframe = cvp->framecount % skip_framecount; } if (skipframe) { - print_cvp_buffer(VIDC_LOW, "input frame skipped", + print_cvp_buffer(VIDC_LOW, "input frame with skipflag", inst, &cvp->fullres_buffer); cvp->framecount++; cvp->metadata_available = false; + mbuf->vvb.flags |= V4L2_BUF_FLAG_CVPMETADATA_SKIP; return 0; } diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index c6802a320bb0..ac5cd6d17ffb 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -4220,6 +4220,9 @@ static void populate_frame_data(struct vidc_frame_data *data, if (vbuf->flags & V4L2_BUF_FLAG_CODECCONFIG) data->flags |= HAL_BUFFERFLAG_CODECCONFIG; + if(vbuf->flags & V4L2_BUF_FLAG_CVPMETADATA_SKIP) + data->flags |= HAL_BUFFERFLAG_CVPMETADATA_SKIP; + msm_comm_fetch_input_tag(&inst->etb_data, vb->index, &itag, &itag2); data->input_tag = itag; @@ -4385,6 +4388,7 @@ static int msm_comm_qbuf_superframe_to_hfi(struct msm_vidc_inst *inst, u64 ts_delta_us; struct vidc_frame_data *frames; u32 num_etbs, superframe_count, frame_size, hfi_fmt; + bool skip_allowed = false; if (!inst || !inst->core || !inst->core->device || !mbuf) { dprintk(VIDC_ERR, "%s: Invalid arguments\n", __func__); @@ -4425,16 +4429,23 @@ static int msm_comm_qbuf_superframe_to_hfi(struct msm_vidc_inst *inst, /* prepare superframe buffers */ frames[0].filled_len = frame_size; /* - * superframe logic updates extradata and eos flags only, so - * ensure no other flags are populated in populate_frame_data() + * superframe logic updates extradata, cvpmetadata_skip and eos flags only, + * so ensure no other flags are populated in populate_frame_data() */ frames[0].flags &= ~HAL_BUFFERFLAG_EXTRADATA; frames[0].flags &= ~HAL_BUFFERFLAG_EOS; + frames[0].flags &= ~HAL_BUFFERFLAG_CVPMETADATA_SKIP; if (frames[0].flags) dprintk(VIDC_ERR, "%s: invalid flags %#x\n", __func__, frames[0].flags); frames[0].flags = 0; + /* Add skip flag only if CVP metadata is enabled */ + if (inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_CVP) { + skip_allowed = true; + frames[0].flags |= HAL_BUFFERFLAG_CVPMETADATA_SKIP; + } + for (i = 0; i < superframe_count; i++) { if (i) memcpy(&frames[i], &frames[0], @@ -4443,8 +4454,8 @@ static int msm_comm_qbuf_superframe_to_hfi(struct msm_vidc_inst *inst, frames[i].timestamp += i * ts_delta_us; if (!i) { /* first frame */ - if (frames[i].extradata_addr) - frames[i].flags |= HAL_BUFFERFLAG_EXTRADATA; + if (frames[0].extradata_addr) + frames[0].flags |= HAL_BUFFERFLAG_EXTRADATA; } else if (i == superframe_count - 1) { /* last frame */ if (mbuf->vvb.flags & V4L2_BUF_FLAG_EOS) @@ -4453,6 +4464,11 @@ static int msm_comm_qbuf_superframe_to_hfi(struct msm_vidc_inst *inst, num_etbs++; } + /* If cvp metadata is enabled and metadata is available, + * do not add skip flag for only first frame */ + if (skip_allowed && !(mbuf->vvb.flags & V4L2_BUF_FLAG_CVPMETADATA_SKIP)) + frames[0].flags &= ~HAL_BUFFERFLAG_CVPMETADATA_SKIP; + rc = call_hfi_op(hdev, session_process_batch, inst->session, num_etbs, frames, 0, NULL); if (rc) { diff --git a/msm/vidc/vidc_hfi.h b/msm/vidc/vidc_hfi.h index 8b9d20dcbbd2..8ba52402cbe6 100644 --- a/msm/vidc/vidc_hfi.h +++ b/msm/vidc/vidc_hfi.h @@ -37,6 +37,7 @@ #define HFI_BUFFERFLAG_DROP_FRAME 0x20000000 #define HFI_BUFFERFLAG_TEI 0x40000000 #define HFI_BUFFERFLAG_DISCONTINUITY 0x80000000 +#define HFI_BUFFERFLAG_CVPMETADATA_REPEAT 0x00000800 #define HFI_ERR_SESSION_EMPTY_BUFFER_DONE_OUTPUT_PENDING \ diff --git a/msm/vidc/vidc_hfi_api.h b/msm/vidc/vidc_hfi_api.h index 0b34ee56d7df..a2746df040f8 100644 --- a/msm/vidc/vidc_hfi_api.h +++ b/msm/vidc/vidc_hfi_api.h @@ -38,7 +38,7 @@ #define HAL_BUFFERFLAG_DROP_FRAME 0x20000000 #define HAL_BUFFERFLAG_TS_DISCONTINUITY 0x40000000 #define HAL_BUFFERFLAG_TS_ERROR 0x80000000 - +#define HAL_BUFFERFLAG_CVPMETADATA_SKIP 0x00000800 #define HAL_DEBUG_MSG_LOW 0x00000001