diff --git a/osdrv/interdrv/v2/base/vb.c b/osdrv/interdrv/v2/base/vb.c index d4f411bee..9876caf96 100644 --- a/osdrv/interdrv/v2/base/vb.c +++ b/osdrv/interdrv/v2/base/vb.c @@ -139,8 +139,7 @@ static int32_t _vb_set_config(struct cvi_vb_cfg *vb_cfg) { int i; - if (vb_cfg->comm_pool_cnt > VB_COMM_POOL_MAX_CNT - || vb_cfg->comm_pool_cnt == 0) { + if (vb_cfg->comm_pool_cnt > VB_COMM_POOL_MAX_CNT) { CVI_TRACE_BASE(CVI_BASE_DBG_ERR, "Invalid comm_pool_cnt(%d)\n", vb_cfg->comm_pool_cnt); return -EINVAL; } @@ -1164,6 +1163,14 @@ long vb_ctrl(struct vb_ext_control *p) } #endif + case VB_IOCTL_GET_VB_INIT: + { + p->value = atomic_read(&ref_count); + + ret = 0; + break; + } + default: break; } diff --git a/osdrv/interdrv/v2/cvi_vc_drv/module/src/cvi_venc.c b/osdrv/interdrv/v2/cvi_vc_drv/module/src/cvi_venc.c index b6dafd3ec..10e85e048 100644 --- a/osdrv/interdrv/v2/cvi_vc_drv/module/src/cvi_venc.c +++ b/osdrv/interdrv/v2/cvi_vc_drv/module/src/cvi_venc.c @@ -3312,7 +3312,7 @@ CVI_S32 CVI_VENC_GetStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream, } #if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) - pstStream->pstPack = vmalloc(sizeof(VENC_PACK_S) * _cviGetNumPacks(pChnAttr->stVencAttr.enType)); + pstStream->pstPack = vzalloc(sizeof(VENC_PACK_S) * _cviGetNumPacks(pChnAttr->stVencAttr.enType)); if (pstStream->pstPack == NULL) return CVI_ERR_VENC_NOMEM; #endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_internal.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_internal.c index 30288d6c2..0e092e176 100644 --- a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_internal.c +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_internal.c @@ -726,6 +726,11 @@ int cviPutEsInPack(stTestEncoder *pTestEnc, PhysicalAddress paBsBufStart, return FALSE; } } + + if (cviNalType == NAL_I || cviNalType == NAL_IDR) { + pTestEnc->encParam.idr_request = TRUE; + } + psp->dropCnt++; psp->seq++; MUTEX_UNLOCK(&psp->packMutex); diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/main_enc_cvitest.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/main_enc_cvitest.c index be44974f7..fb2473e06 100644 --- a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/main_enc_cvitest.c +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/main_enc_cvitest.c @@ -977,6 +977,7 @@ static int initEncOneFrame(stTestEncoder *pTestEnc, TestEncConfig *pEncConfig) pTestEnc->encParam.codeOption.encodeAUD = pEncCfg->encAUD; pTestEnc->encParam.codeOption.encodeEOS = 0; + pTestEnc->encParam.force_i_for_gop_sync = 1; CVI_VC_TRACE("ringBufferEnable = %d\n", pEncOP->ringBufferEnable); @@ -1202,6 +1203,12 @@ RETRY: pEncParam->is_idr_frame = cviCheckIdrPeriod(pTestEnc); + if (pEncParam->idr_request && pEncParam->resetGop) { + pTestEnc->frameIdx = 0; + pEncParam->resetGop = 0; + CVI_VC_FLOW("reset gop, frameIdx = %d\n", pTestEnc->frameIdx); + } + #ifdef DROP_FRAME // because bitstream not enough, need request IDR and reduce target bitrate if (pTestEnc->bDrop) { @@ -1596,10 +1603,11 @@ static BOOL cviCheckIdrValid(EncOpenParam *pEncOP, Uint32 frameIdx) } static void cviForcePicTypeCtrl(EncOpenParam *pEncOP, EncParam *encParam, - EncInfo *pEncInfo, BOOL is_intra_period, - BOOL force_idr, BOOL force_skip_frame, - Uint32 frameIdx) + EncInfo *pEncInfo, BOOL force_skip_frame, Uint32 frameIdx) { + int force_idr = encParam->idr_request; + int is_intra_period = encParam->is_i_period; + encParam->skipPicture = 0; encParam->forceIPicture = 0; encParam->forcePicTypeEnable = 0; @@ -1619,7 +1627,12 @@ static void cviForcePicTypeCtrl(EncOpenParam *pEncOP, EncParam *encParam, (is_intra_period && encParam->force_i_for_gop_sync)) { if (pEncOP->bitstreamFormat == STD_HEVC) { encParam->forcePicTypeEnable = 1; - encParam->forcePicType = 3; + encParam->forcePicType = + (pEncOP->EncStdParam.hevcParam.decodingRefreshType == H265_RT_IDR) ? 3 : 4; + // first frame and request idr frame should be idr + if (frameIdx == 0) { + encParam->forcePicType = 3; + } } else { // encOP->bitstreamFormat == STD_AVC encParam->forceIPicture = 1; pEncInfo->force_as_long_term_ref = 1; @@ -1730,7 +1743,6 @@ static void cviPicParamChangeCtrl(EncHandle handle, TestEncConfig *pEncConfig, } cviForcePicTypeCtrl(pEncOP, encParam, &handle->CodecInfo->encInfo, - encParam->is_i_period, encParam->idr_request, force_skip_frame, frameIdx); } while (0); @@ -2970,12 +2982,15 @@ int cviVEncGetStream(void *handle, cviVEncStreamInfo *pStreamInfo, CVI_VC_IF("\n"); if (pTestEnc->encConfig.bIsoSendFrmEn) { +wait: ret = wait_for_completion_timeout(&pTestEnc->semGetStreamCmd, usecs_to_jiffies(s32MilliSec * 1000)); if (ret == 0) { CVI_VC_WARN("get stream timeout!\n"); return RET_VCODEC_TIMEOUT; } + if (0 == pTestEnc->streamPack.totalPacks) + goto wait; memcpy(pStreamInfo, &pTestEnc->tStreamInfo, sizeof(cviVEncStreamInfo)); return RETCODE_SUCCESS; } @@ -3315,13 +3330,13 @@ int cviVEncReleaseStream(void *handle, cviVEncStreamInfo *pStreamInfo) static int cviVEncSetRequestIDR(stTestEncoder *pTestEnc, void *arg) { + unsigned int *resetGop = (unsigned int *)arg; int ret = 0; - UNREFERENCED_PARAMETER(arg); - CVI_VC_IF("\n"); pTestEnc->encParam.idr_request = TRUE; + pTestEnc->encParam.resetGop = *resetGop; return ret; } diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapi.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapi.h index a0b8a3aaf..0782e6b3c 100644 --- a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapi.h +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapi.h @@ -5047,6 +5047,7 @@ packet-based streaming with ring-buffer, this variable is ignored. /* * A flag to use a force picture type * by source index order + * 0 : I, 1 : P, 2 : B, 3 : IDR, 4 : CRA */ int forcePicType; /**< A force picture type (I, P, B, IDR, CRA) */ int srcIdx; /**< A source frame buffer index */ @@ -5089,6 +5090,7 @@ packet-based streaming with ring-buffer, this variable is ignored. BOOL is_i_period; BOOL idr_registered; BOOL force_i_for_gop_sync; + BOOL resetGop; BOOL roi_request; BOOL roi_enable[8]; diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4.c index 6fb0313ab..6272958cf 100644 --- a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4.c +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4.c @@ -1001,7 +1001,7 @@ RetCode Wave4VpuEncSetup(CodecInst *instance) VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_INTRA_PARAM, (pHevc->decodingRefreshType << 0) | (pHevc->intraQP << 3) | (pHevc->forcedIdrHeaderEnable << 9) | - (pHevc->intraPeriod << 16)); + (0 << 16)); VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_CONF_WIN_TOP_BOT, pHevc->confWinBot << 16 | pHevc->confWinTop); diff --git a/osdrv/interdrv/v2/dwa/chip/cv181x/gdc.c b/osdrv/interdrv/v2/dwa/chip/cv181x/gdc.c index 24d6d1f1a..5b23487d4 100644 --- a/osdrv/interdrv/v2/dwa/chip/cv181x/gdc.c +++ b/osdrv/interdrv/v2/dwa/chip/cv181x/gdc.c @@ -988,4 +988,4 @@ s32 dwa_start_handler(struct cvi_dwa_vdev *wdev_dwa) } return ret; -} \ No newline at end of file +} diff --git a/osdrv/interdrv/v2/dwa/chip/cv181x/ldc.c b/osdrv/interdrv/v2/dwa/chip/cv181x/ldc.c index b394883db..7b462ee10 100644 --- a/osdrv/interdrv/v2/dwa/chip/cv181x/ldc.c +++ b/osdrv/interdrv/v2/dwa/chip/cv181x/ldc.c @@ -98,6 +98,7 @@ void ldc_intr_ctrl(u8 intr_mask) void ldc_intr_clr(u8 intr_mask) { _reg_write(reg_base + REG_LDC_IRQCLR, intr_mask); + _reg_write(reg_base + REG_LDC_SRC_BG, 0x0); } /** diff --git a/osdrv/interdrv/v2/dwa/chip/cv181x/mesh.c b/osdrv/interdrv/v2/dwa/chip/cv181x/mesh.c index 36cf17395..9a592a300 100644 --- a/osdrv/interdrv/v2/dwa/chip/cv181x/mesh.c +++ b/osdrv/interdrv/v2/dwa/chip/cv181x/mesh.c @@ -276,6 +276,7 @@ static s32 mesh_gdc_do_ldc(struct cvi_dwa_vdev *wdev, const void *pUsageParam, SIZE_S size_out[2]; ROTATION_E enRotationOut[2]; u32 mesh_1st_size; + LDC_ATTR_S *pstLDCAttr = NULL; pstTask[0] = vmalloc(sizeof(struct gdc_task_attr)); pstTask[1] = vmalloc(sizeof(struct gdc_task_attr)); @@ -288,6 +289,7 @@ static s32 mesh_gdc_do_ldc(struct cvi_dwa_vdev *wdev, const void *pUsageParam, blk = vb_get_block_with_id(VB_INVALID_POOLID, buf_size, CVI_ID_GDC); if (blk == VB_INVALID_HANDLE) { vb_release_block((VB_BLK)vb_in); + CVI_TRACE_DWA(CVI_DBG_ERR, "vb_get_block failed.\n"); ret = CVI_ERR_GDC_NOBUF; goto LDC_FAIL_EXIT; } @@ -319,8 +321,14 @@ static s32 mesh_gdc_do_ldc(struct cvi_dwa_vdev *wdev, const void *pUsageParam, switch (enRotation) { default: case ROTATION_0: - enRotationOut[0] = ROTATION_90; - enRotationOut[1] = ROTATION_270; + pstLDCAttr = (LDC_ATTR_S *)pUsageParam; + if (pstLDCAttr->stGridInfoAttr.Enable) { + enRotationOut[0] = ROTATION_270; + enRotationOut[1] = ROTATION_90; + } else { + enRotationOut[0] = ROTATION_90; + enRotationOut[1] = ROTATION_270; + } break; case ROTATION_90: enRotationOut[0] = ROTATION_90; diff --git a/osdrv/interdrv/v2/dwa/common/dwa_platform.c b/osdrv/interdrv/v2/dwa/common/dwa_platform.c index 90c4ebd9b..6c0a787b1 100644 --- a/osdrv/interdrv/v2/dwa/common/dwa_platform.c +++ b/osdrv/interdrv/v2/dwa/common/dwa_platform.c @@ -269,7 +269,8 @@ int dwa_create_instance(struct platform_device *pdev) // clk_ldc_src_sel default 1(clk_src_vip_sys_2), 600 MHz // set 0(clk_src_vip_sys_4), 400MHz for ND - vip_sys_reg_write_mask(VIP_SYS_VIP_CLK_CTRL1, BIT(20), 0); + vip_sys_reg_write_mask(VIP_SYS_VIP_CLK_CTRL1, BIT(20), BIT(20)); + CVI_TRACE_DWA(CVI_DBG_DEBUG, "VIP_SYS_VIP_CLK_CTRL1:%#x\n", vip_sys_reg_read(VIP_SYS_VIP_CLK_CTRL1)); //wdev->align = LDC_ADDR_ALIGN; @@ -321,9 +322,12 @@ void dwa_irq_handler(u8 intr_status, struct cvi_dwa_vdev *wdev) { struct cvi_dwa_job *job = NULL; struct gdc_task *tsk; + unsigned long flags; + spin_lock_irqsave(&wdev->lock, flags); if (!list_empty(&wdev->jobq)) job = list_entry(wdev->jobq.next, struct cvi_dwa_job, node); + spin_unlock_irqrestore(&wdev->lock, flags); if (job) { if (!list_empty(&job->task_list)) { diff --git a/osdrv/interdrv/v2/include/common/uapi/linux/cvi_comm_video.h b/osdrv/interdrv/v2/include/common/uapi/linux/cvi_comm_video.h index 8b4d15a56..805270d4e 100644 --- a/osdrv/interdrv/v2/include/common/uapi/linux/cvi_comm_video.h +++ b/osdrv/interdrv/v2/include/common/uapi/linux/cvi_comm_video.h @@ -444,6 +444,18 @@ typedef struct _BITMAP_S { CVI_VOID * ATTRIBUTE pData; } BITMAP_S; +typedef struct _GRID_INFO_ATTR_S { + CVI_BOOL Enable; + char gridFileName[128]; + char gridBindName[128]; + CVI_BOOL isBlending; + CVI_BOOL bEISEnable; /* enable EIS */ + uint8_t homoRgnNum; +#if 0 + HOMOGRAPH_REGION_S homo_regions[GDC_MAX_REGION_NUM]; +#endif +} GRID_INFO_ATTR_S; + /* * * s32CenterXOffset: RW; Range: [-511, 511], horizontal offset of the image distortion center relative to image center @@ -454,12 +466,13 @@ typedef struct _BITMAP_S { // ++++++++ If you want to change these interfaces, please contact the isp team. ++++++++ typedef struct _LDC_ATTR_S { CVI_BOOL bAspect; /* RW;Whether aspect ration is keep */ - CVI_S32 s32XRatio; /* RW; Range: [0x00, 0x64], field angle ration of horizontal,valid when bAspect=0.*/ - CVI_S32 s32YRatio; /* RW; Range: [0x00, 0x64], field angle ration of vertical,valid when bAspect=0.*/ - CVI_S32 s32XYRatio; /* RW; Range: [0x00, 0x64], field angle ration of all,valid when bAspect=1.*/ - CVI_S32 s32CenterXOffset; /* RW; Range: [-0x1FF, 0x1FF]*/ - CVI_S32 s32CenterYOffset; /* RW; Range: [-0x1FF, 0x1FF]*/ - CVI_S32 s32DistortionRatio; /* RW; Range:[-0x12C, 0x1F4]*/ + CVI_S32 s32XRatio; /* RW; Range: [0, 100], field angle ration of horizontal,valid when bAspect=0.*/ + CVI_S32 s32YRatio; /* RW; Range: [0, 100], field angle ration of vertical,valid when bAspect=0.*/ + CVI_S32 s32XYRatio; /* RW; Range: [0, 100], field angle ration of all,valid when bAspect=1.*/ + CVI_S32 s32CenterXOffset; + CVI_S32 s32CenterYOffset; + CVI_S32 s32DistortionRatio; + GRID_INFO_ATTR_S stGridInfoAttr; } LDC_ATTR_S; // -------- If you want to change these interfaces, please contact the isp team. -------- diff --git a/osdrv/interdrv/v2/include/common/uapi/linux/vb_uapi.h b/osdrv/interdrv/v2/include/common/uapi/linux/vb_uapi.h index 40a317685..d4f75d32c 100644 --- a/osdrv/interdrv/v2/include/common/uapi/linux/vb_uapi.h +++ b/osdrv/interdrv/v2/include/common/uapi/linux/vb_uapi.h @@ -25,6 +25,7 @@ enum VB_IOCTL { VB_IOCTL_GET_POOL_MAX_CNT, VB_IOCTL_PRINT_POOL, VB_IOCTL_UNIT_TEST, + VB_IOCTL_GET_VB_INIT, VB_IOCTL_MAX, }; diff --git a/osdrv/interdrv/v2/vi/chip/cv181x/vi.c b/osdrv/interdrv/v2/vi/chip/cv181x/vi.c index d2144f33b..5b43ee7fa 100644 --- a/osdrv/interdrv/v2/vi/chip/cv181x/vi.c +++ b/osdrv/interdrv/v2/vi/chip/cv181x/vi.c @@ -2863,7 +2863,9 @@ int vi_start_streaming(struct cvi_vi_dev *vdev) } _vi_mempool_reset(); - vi_tuning_buf_clear(); + + vi_tuning_buf_setup(ctx); + vi_tuning_buf_clear(ctx); _vi_scene_ctrl(vdev, &raw_max); @@ -4734,7 +4736,6 @@ static int _vi_mempool_setup(void) int ret = 0; _vi_mempool_reset(); - ret = vi_tuning_buf_setup(); return ret; } @@ -5588,12 +5589,16 @@ static long _vi_g_ctrl(struct cvi_vi_dev *vdev, struct vi_ext_control *p) void *tun_addr = NULL; u32 size; + rc = vi_tuning_buf_setup(ctx); + tun_addr = vi_get_tuning_buf_addr(&size); - if (copy_to_user(p->ptr, tun_addr, size) != 0) + if (copy_to_user(p->ptr, tun_addr, size) != 0) { + vi_pr(VI_ERR, "Failed to copy tun_addr\n"); + rc = -EINVAL; break; + } - rc = 0; break; } @@ -8157,7 +8162,7 @@ int vi_destroy_instance(struct platform_device *pdev) for (i = 0; i < E_VI_TH_MAX; i++) vi_destory_thread(vdev, i); - vi_tuning_buf_release(); + vi_tuning_buf_release(&vdev->ctx); for (i = 0; i < ISP_PRERAW_VIRT_MAX; i++) { sync_task_exit(i); diff --git a/osdrv/interdrv/v2/vi/chip/cv181x/vip/vi_drv.h b/osdrv/interdrv/v2/vi/chip/cv181x/vip/vi_drv.h index d69edf5e8..513612210 100644 --- a/osdrv/interdrv/v2/vi/chip/cv181x/vip/vi_drv.h +++ b/osdrv/interdrv/v2/vi/chip/cv181x/vip/vi_drv.h @@ -727,10 +727,10 @@ void vi_tuning_clut_update( enum cvi_isp_raw raw_num); int vi_tuning_get_clut_tbl_idx(enum cvi_isp_raw raw_num, int tun_idx); int vi_tuning_sw_init(void); -int vi_tuning_buf_setup(void); -void vi_tuning_buf_release(void); +int vi_tuning_buf_setup(struct isp_ctx *ctx); +void vi_tuning_buf_release(struct isp_ctx *ctx); void *vi_get_tuning_buf_addr(u32 *size); -void vi_tuning_buf_clear(void); +void vi_tuning_buf_clear(struct isp_ctx *ctx); /******************************************************************************* * Tuning modules update diff --git a/osdrv/interdrv/v2/vi/chip/cv181x/vip/vi_tun_ip_ctrl.c b/osdrv/interdrv/v2/vi/chip/cv181x/vip/vi_tun_ip_ctrl.c index ff8496724..71573d2d2 100644 --- a/osdrv/interdrv/v2/vi/chip/cv181x/vip/vi_tun_ip_ctrl.c +++ b/osdrv/interdrv/v2/vi/chip/cv181x/vip/vi_tun_ip_ctrl.c @@ -217,20 +217,22 @@ int vi_tuning_sw_init(void) return 0; } -int vi_tuning_buf_setup(void) +int vi_tuning_buf_setup(struct isp_ctx *ctx) { u8 i = 0; static u64 fe_paddr[ISP_PRERAW_VIRT_MAX] = {0, 0}; static u64 be_paddr[ISP_PRERAW_VIRT_MAX] = {0, 0}; static u64 post_paddr[ISP_PRERAW_VIRT_MAX] = {0, 0}; u32 size = 0; + u64 phyAddr = 0; size = (VI_ALIGN(sizeof(struct cvi_vip_isp_post_cfg)) + VI_ALIGN(sizeof(struct cvi_vip_isp_be_cfg)) + VI_ALIGN(sizeof(struct cvi_vip_isp_fe_cfg))); for (i = 0; i < ISP_PRERAW_VIRT_MAX; i++) { - u64 phyAddr = 0; + if (!ctx->isp_pipe_enable[i]) + continue; if (vi_tuning_ptr[i] == NULL) { vi_tuning_ptr[i] = kzalloc(size, GFP_KERNEL | __GFP_RETRY_MAYFAIL); @@ -270,11 +272,14 @@ int vi_tuning_buf_setup(void) return 0; } -void vi_tuning_buf_release(void) +void vi_tuning_buf_release(struct isp_ctx *ctx) { u8 i; for (i = 0; i < ISP_PRERAW_VIRT_MAX; i++) { + if (!ctx->isp_pipe_enable[i]) + continue; + kfree(vi_tuning_ptr[i]); vi_tuning_ptr[i] = NULL; } @@ -287,7 +292,7 @@ void *vi_get_tuning_buf_addr(u32 *size) return (void *)&tuning_buf_addr; } -void vi_tuning_buf_clear(void) +void vi_tuning_buf_clear(struct isp_ctx *ctx) { struct cvi_vip_isp_post_cfg *post_cfg; struct cvi_vip_isp_be_cfg *be_cfg; @@ -295,6 +300,9 @@ void vi_tuning_buf_clear(void) u8 i = 0, tun_idx = 0; for (i = 0; i < ISP_PRERAW_VIRT_MAX; i++) { + if (!ctx->isp_pipe_enable[i]) + continue; + post_cfg = (struct cvi_vip_isp_post_cfg *)tuning_buf_addr.post_vir[i]; be_cfg = (struct cvi_vip_isp_be_cfg *)tuning_buf_addr.be_vir[i]; fe_cfg = (struct cvi_vip_isp_fe_cfg *)tuning_buf_addr.fe_vir[i];