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

Commit 1b9472cc authored by Akshata Sahukar's avatar Akshata Sahukar Committed by Shivendra Kakrania
Browse files

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: default avatarAkshata Sahukar <asahukar@codeaurora.org>
parent e13d370e
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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;
	}

+20 −4
Original line number Diff line number Diff line
@@ -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) {
+1 −0
Original line number Diff line number Diff line
@@ -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	\
+1 −1
Original line number Diff line number Diff line
@@ -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