📄 prpclass.cpp
字号:
if (!pVfBufferManager->AllocateBuffers(m_iVfNumBuffers, m_iVfBufSize))
{
DEBUGMSG(ZONE_ERROR,
(TEXT("%s : Viewfinding Buffer allocation failed!\r\n"), __WFUNCTION__));
return FALSE;
}
if (m_bVfFlipRot)
{
// Initialize MsgQueues when buffers are allocated
if (!PrpAllocateVfRotBuffers())
{
DEBUGMSG(ZONE_ERROR,
(TEXT("%s : Rotation for viewfinding Buffer allocation failed!\r\n"), __WFUNCTION__));
return FALSE;
}
}
PRP_FUNCTION_EXIT();
// Return virtual buffer address
return TRUE;
}
//-----------------------------------------------------------------------------
//
// Function: PrpAllocateVfRotBuffers
//
// This function allocates buffers for the rotation for viewfinding channel
// and adds each to the buffer queue. This function must be called
// in order to allocate physically contiguous buffers for use in
// the IPU's IDMAC.
//
// Parameters:
// numBuffers
// [in] Number of buffers to allocate and add
// to the queues.
//
// bufSize
// [in] Size of buffer to create and enqueue.
//
// Returns:
// TRUE if success, FALSE if failure.
//
//-----------------------------------------------------------------------------
BOOL PrpClass::PrpAllocateVfRotBuffers()
{
PRP_FUNCTION_ENTRY();
// Initialize MsgQueues when buffers are allocated
if (!pVfRotBufferManager->AllocateBuffers(m_iVfNumBuffers, m_iVfBufSize))
{
return FALSE;
}
m_bVfRotBuffersAllocated = TRUE;
PRP_FUNCTION_EXIT();
return TRUE;
}
//-----------------------------------------------------------------------------
//
// Function: PrpGetVfBufFilled
//
// This function reads the queue of filled viewfinding channel
// buffers and returns the buffer at the top of the queue.
//
// Parameters:
// None.
//
// Returns:
// Pointer to filled buffer, or NULL if failure.
//
//-----------------------------------------------------------------------------
UINT32* PrpClass::PrpGetVfBufFilled()
{
PRP_FUNCTION_ENTRY();
if (m_bVfFlipRot)
{
PRP_FUNCTION_EXIT();
// Get filled buffer from the filled buffer queue.
return pVfRotBufferManager->GetBufferFilled();
}
else
{
PRP_FUNCTION_EXIT();
// Get filled buffer from the filled buffer queue.
return pVfBufferManager->GetBufferFilled();
}
}
//-----------------------------------------------------------------------------
//
// Function: PrpDeleteVfBuffers
//
// This function deletes all of the viewfinding buffers in the Idle
// and Ready queues.
//
// Parameters:
// None.
//
// Returns:
// TRUE if success, otherwise FALSE.
//
//-----------------------------------------------------------------------------
BOOL PrpClass::PrpDeleteVfBuffers()
{
PRP_FUNCTION_ENTRY();
// Delete viewfinding buffers.
if (!pVfBufferManager->DeleteBuffers())
{
DEBUGMSG(ZONE_ERROR,
(TEXT("%s : Failed to delete buffers!\r\n"), __WFUNCTION__));
return FALSE;
}
// TODO: Make sure that viewfinding rotation buffers deleted whenever
// rotation is turned off
if (m_bVfFlipRot)
{
// Delete encoding buffers for rotation.
if (!pVfRotBufferManager->DeleteBuffers())
{
DEBUGMSG(ZONE_ERROR,
(TEXT("%s : Failed to delete buffers!\r\n"), __WFUNCTION__));
return FALSE;
m_bVfRotBuffersAllocated = TRUE;
}
}
PRP_FUNCTION_EXIT();
return TRUE;
}
//-----------------------------------------------------------------------------
//
// Function: PrpGetMaxBuffers
//
// This function returns the maximum number of buffers supported
// by the preprocessor.
// with the IPU hardware.
//
// Parameters:
// None.
//
// Returns:
// Returns the Max buffer number.
//
//-----------------------------------------------------------------------------
UINT32 PrpClass::PrpGetMaxBuffers(void)
{
return PRP_MAX_NUM_BUFFERS;
}
//-----------------------------------------------------------------------------
//
// Function: PrpConfigureEncoding
//
// This function configures the IC registers and IDMAC
// channels for the preprocessor encoding channel.
//
// Parameters:
// pPrpEncConfigureData
// [in] Pointer to configuration data structure
//
// Returns:
// TRUE if success
// FALSE if failure
//
//-----------------------------------------------------------------------------
BOOL PrpClass::PrpConfigureEncoding(pPrpEncConfigData configData)
{
UINT16 iEncOutputWidth, iEncOutputHeight, tempWidth;
BOOL result = TRUE;
prpEncOutputFormat iEncFormat = configData->encFormat;
prpIDMACChannelParams channelParams;
prpResizeCoeffs resizeCoeffs;
prpCSCCoeffs CSCCoeffs;
UINT32 iYBufLen;
UINT32 iUBufOffset, iVBufOffset;
UINT32 strideFactor;
UINT32 oldVal, newVal, iMask, iBitval;
PRP_FUNCTION_ENTRY();
if (iEncFormat != prpEncOutputFormat_Disabled)
{
// Set these variables to reduce pointer computations,
// as these will be referenced several times.
iEncOutputWidth = configData->encSize.width;
iEncOutputHeight = configData->encSize.height;
// Configure rotation BAM parameter
channelParams.iBAM = (configData->encFlipRot.verticalFlip ? 1 : 0) |
(configData->encFlipRot.horizontalFlip ? 1 : 0) << 1 |
(configData->encFlipRot.rotate90 ? 1 : 0) << 2;
m_bEncFlipRot = (channelParams.iBAM == 0) ? 0 : 1;
//-----------------------------------------------------------------
// Setup color space conversion
//-----------------------------------------------------------------
// Set up CSC for encoding
if (configData->encCSCEquation != prpCSCNoOp)
{
switch (configData->encCSCEquation)
{
case prpCSCR2Y_A1:
case prpCSCR2Y_A0:
case prpCSCR2Y_B0:
case prpCSCR2Y_B1:
CSCCoeffs.C00 = rgb2yuv_tbl[configData->encCSCEquation][0];
CSCCoeffs.C01 = rgb2yuv_tbl[configData->encCSCEquation][1];
CSCCoeffs.C02 = rgb2yuv_tbl[configData->encCSCEquation][2];
CSCCoeffs.C10 = rgb2yuv_tbl[configData->encCSCEquation][3];
CSCCoeffs.C11 = rgb2yuv_tbl[configData->encCSCEquation][4];
CSCCoeffs.C12 = rgb2yuv_tbl[configData->encCSCEquation][5];
CSCCoeffs.C20 = rgb2yuv_tbl[configData->encCSCEquation][6];
CSCCoeffs.C21 = rgb2yuv_tbl[configData->encCSCEquation][7];
CSCCoeffs.C22 = rgb2yuv_tbl[configData->encCSCEquation][8];
CSCCoeffs.A0 = rgb2yuv_tbl[configData->encCSCEquation][9];
CSCCoeffs.A1 = rgb2yuv_tbl[configData->encCSCEquation][10];
CSCCoeffs.A2 = rgb2yuv_tbl[configData->encCSCEquation][11];
CSCCoeffs.Scale = rgb2yuv_tbl[configData->encCSCEquation][12];
break;
case prpCSCY2R_A1:
case prpCSCY2R_A0:
case prpCSCY2R_B0:
case prpCSCY2R_B1:
CSCCoeffs.C00 = yuv2rgb_tbl[configData->encCSCEquation - 4][0];
CSCCoeffs.C01 = yuv2rgb_tbl[configData->encCSCEquation - 4][1];
CSCCoeffs.C02 = yuv2rgb_tbl[configData->encCSCEquation - 4][2];
CSCCoeffs.C10 = yuv2rgb_tbl[configData->encCSCEquation - 4][3];
CSCCoeffs.C11 = yuv2rgb_tbl[configData->encCSCEquation - 4][4];
CSCCoeffs.C12 = yuv2rgb_tbl[configData->encCSCEquation - 4][5];
CSCCoeffs.C20 = yuv2rgb_tbl[configData->encCSCEquation - 4][6];
CSCCoeffs.C21 = yuv2rgb_tbl[configData->encCSCEquation - 4][7];
CSCCoeffs.C22 = yuv2rgb_tbl[configData->encCSCEquation - 4][8];
CSCCoeffs.A0 = yuv2rgb_tbl[configData->encCSCEquation - 4][9];
CSCCoeffs.A1 = yuv2rgb_tbl[configData->encCSCEquation - 4][10];
CSCCoeffs.A2 = yuv2rgb_tbl[configData->encCSCEquation - 4][11];
CSCCoeffs.Scale = yuv2rgb_tbl[configData->encCSCEquation - 4][12];
break;
case prpCSCCustom:
CSCCoeffs.C00 = configData->encCSCCoeffs.C00;
CSCCoeffs.C01 = configData->encCSCCoeffs.C01;
CSCCoeffs.C02 = configData->encCSCCoeffs.C02;
CSCCoeffs.C10 = configData->encCSCCoeffs.C10;
CSCCoeffs.C11 = configData->encCSCCoeffs.C11;
CSCCoeffs.C12 = configData->encCSCCoeffs.C12;
CSCCoeffs.C20 = configData->encCSCCoeffs.C20;
CSCCoeffs.C21 = configData->encCSCCoeffs.C21;
CSCCoeffs.C22 = configData->encCSCCoeffs.C22;
CSCCoeffs.A0 = configData->encCSCCoeffs.A0;
CSCCoeffs.A1 = configData->encCSCCoeffs.A1;
CSCCoeffs.A2 = configData->encCSCCoeffs.A2;
CSCCoeffs.Scale = configData->encCSCCoeffs.Scale;
break;
default:
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Invalid encoding CSC equation. \r\n"), __WFUNCTION__));
result = FALSE;
goto _encDone;
}
// Set up the task parameter memory
PrpTaskParamConfig(prpCSCEncMatrix1, &CSCCoeffs);
// Now enable CSC in IC configuration register
INSREG32BF(&P_IPU_REGS->IC_CONF, IPU_IC_CONF_PRPENC_CSC1,
IPU_IC_CONF_PRPENC_CSC1_ENABLE);
}
else
{
// Disable CSC in IC configuration register
INSREG32BF(&P_IPU_REGS->IC_CONF, IPU_IC_CONF_PRPENC_CSC1,
IPU_IC_CONF_PRPENC_CSC1_DISABLE);
}
//-----------------------------------------------------------------
// Set up resizing.
//-----------------------------------------------------------------
// Encoding path
if (configData->encFormat != prpEncOutputFormat_Disabled)
{
// Vertical resizing
// Get coefficients and then set registers
if (!PrpGetResizeCoeffs(configData->inputSize.height,
configData->encSize.height, &resizeCoeffs))
{
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding vertical resizing failed. \r\n"), __WFUNCTION__));
result = FALSE;
goto _encDone;
}
// Set downsizing field
INSREG32BF(&P_IPU_REGS->IC_PRP_ENC_RSC, IPU_IC_PRP_ENC_RSC_PRPENC_DS_R_V,
resizeCoeffs.downsizeCoeff);
// Set resizing field
INSREG32BF(&P_IPU_REGS->IC_PRP_ENC_RSC, IPU_IC_PRP_ENC_RSC_PRPENC_RS_R_V,
resizeCoeffs.resizeCoeff);
// Horizontal resizing
// Get coefficients and then set registers
if (!PrpGetResizeCoeffs(configData->inputSize.width,
configData->encSize.width, &resizeCoeffs))
{
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding horizontal resizing failed. \r\n"), __WFUNCTION__));
result = FALSE;
goto _encDone;
}
// Set downsizing field
INSREG32BF(&P_IPU_REGS->IC_PRP_ENC_RSC, IPU_IC_PRP_ENC_RSC_PRPENC_DS_R_H,
resizeCoeffs.downsizeCoeff);
// Set resizing field
INSREG32BF(&P_IPU_REGS->IC_PRP_ENC_RSC, IPU_IC_PRP_ENC_RSC_PRPENC_RS_R_H,
resizeCoeffs.resizeCoeff);
}
//-----------------------------------------------------------------
// Setup output format
//-----------------------------------------------------------------
switch(iEncFormat)
{
case prpEncOutputFormat_YUV444:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -