From 1b9472cc6fccc8f1e8e516dea34a19f55a746498 Mon Sep 17 00:00:00 2001 From: Akshata Sahukar Date: Mon, 29 Jul 2019 18:27:24 -0700 Subject: [PATCH] msm: vidc: Add support for V4L2_FLAG_CVPMETADATA_SKIP flag Introduced CVP skip flag as part of qbuf to indicate buffer is skipped CVP processing. This is required in order to re-use CVP metadata from previous frame when it is not an error case. Video firmware will look at this flag and reuse CVP metadata from earlier frame to encode current frame. Change-Id: Icf89daa2d5f19790a04f0467a15165870b283ee4 Signed-off-by: Akshata Sahukar --- msm/vidc/msm_cvp_external.c | 4 +++- msm/vidc/msm_vidc_common.c | 24 ++++++++++++++++++++---- msm/vidc/vidc_hfi.h | 1 + msm/vidc/vidc_hfi_api.h | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-) 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