📄 prpclass.cpp
字号:
if (!bInputRGB && !bVfOutputRGB) {
DEBUGMSG(ZONE_FUNCTION,
(TEXT("%s: CSC is not needed. \r\n"), __WFUNCTION__));
return TRUE;
}
// Setup CSC equation
switch (pConfigData->CSCEquation) {
// RGB to YUV
case prpCSCR2Y_A1:
case prpCSCR2Y_A0:
case prpCSCR2Y_B1:
case prpCSCR2Y_B0:
if (!bInputRGB) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: CSC setting is not consistent with input image format! \r\n"),
__WFUNCTION__));
return FALSE;
}
OUTREG32(&m_pPrpReg->PRP_CSC_COEF_012,
CSP_BITFVAL(PRP_CSC_COEF_012_C0,
rgb2yuv_tbl[pConfigData->CSCEquation][0]) |
CSP_BITFVAL(PRP_CSC_COEF_012_C1,
rgb2yuv_tbl[pConfigData->CSCEquation][1]) |
CSP_BITFVAL(PRP_CSC_COEF_012_C2,
rgb2yuv_tbl[pConfigData->CSCEquation][2]));
OUTREG32(&m_pPrpReg->PRP_CSC_COEF_345,
CSP_BITFVAL(PRP_CSC_COEF_345_C3,
rgb2yuv_tbl[pConfigData->CSCEquation][3]) |
CSP_BITFVAL(PRP_CSC_COEF_345_C4,
rgb2yuv_tbl[pConfigData->CSCEquation][4]) |
CSP_BITFVAL(PRP_CSC_COEF_345_C5,
rgb2yuv_tbl[pConfigData->CSCEquation][5]));
OUTREG32(&m_pPrpReg->PRP_CSC_COEF_678,
CSP_BITFVAL(PRP_CSC_COEF_678_C6,
rgb2yuv_tbl[pConfigData->CSCEquation][6]) |
CSP_BITFVAL(PRP_CSC_COEF_678_C7,
rgb2yuv_tbl[pConfigData->CSCEquation][7]) |
CSP_BITFVAL(PRP_CSC_COEF_678_C8,
rgb2yuv_tbl[pConfigData->CSCEquation][8]) |
CSP_BITFVAL(PRP_CSC_COEF_678_X0,
rgb2yuv_tbl[pConfigData->CSCEquation][9]));
break;
// YUV to RGB
case prpCSCY2R_A1:
case prpCSCY2R_A0:
case prpCSCY2R_B1:
case prpCSCY2R_B0:
if (bInputRGB) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: CSC setting is not consistent with input image format! \r\n"),
__WFUNCTION__));
return FALSE;
}
OUTREG32(&m_pPrpReg->PRP_CSC_COEF_012,
CSP_BITFVAL(PRP_CSC_COEF_012_C0,
yuv2rgb_tbl[pConfigData->CSCEquation - 4][0]) |
CSP_BITFVAL(PRP_CSC_COEF_012_C1,
yuv2rgb_tbl[pConfigData->CSCEquation - 4][1]) |
CSP_BITFVAL(PRP_CSC_COEF_012_C2,
yuv2rgb_tbl[pConfigData->CSCEquation - 4][2]));
OUTREG32(&m_pPrpReg->PRP_CSC_COEF_345,
CSP_BITFVAL(PRP_CSC_COEF_345_C3,
yuv2rgb_tbl[pConfigData->CSCEquation - 4][3]) |
CSP_BITFVAL(PRP_CSC_COEF_345_C4,
yuv2rgb_tbl[pConfigData->CSCEquation - 4][4]) |
CSP_BITFVAL(PRP_CSC_COEF_345_C5, 0));
OUTREG32(&m_pPrpReg->PRP_CSC_COEF_678,
CSP_BITFVAL(PRP_CSC_COEF_678_C6, 0) |
CSP_BITFVAL(PRP_CSC_COEF_678_C7, 0) |
CSP_BITFVAL(PRP_CSC_COEF_678_C8, 0) |
CSP_BITFVAL(PRP_CSC_COEF_678_X0,
yuv2rgb_tbl[pConfigData->CSCEquation - 4][5]));
break;
default:
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Invalid CSC equation. \r\n"),
__WFUNCTION__));
return FALSE;
}
PRP_FUNCTION_EXIT();
return TRUE;
}
//-----------------------------------------------------------------------------
//
// Function: PrpConfigureResize
//
// This function configures the pre-processor resizing.
//
// Parameters:
// pConfigData
// [in] Pointer to configuration data structure
//
// Returns:
// TRUE if success; FALSE if failure.
//
//-----------------------------------------------------------------------------
BOOL PrpClass::PrpConfigureResize(pPrpConfigData pConfigData)
{
PRP_FUNCTION_ENTRY();
// Pre-processor resizer only support downsaling
if (m_bEnableVfOutput) {
if (!VALID_RESIZE_DIRECTION(pConfigData->inputSize,
pConfigData->outputVfSize)) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Pre-processor can not support upscaling on viewfinding channel! \r\n"),
__WFUNCTION__));
return FALSE;
}
}
if (m_bEnableEncOutput) {
if (!VALID_RESIZE_DIRECTION(pConfigData->inputSize,
pConfigData->outputEncSize)) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Pre-processor can not support upscaling on encoding channel! \r\n"),
__WFUNCTION__));
return FALSE;
}
}
// Calculate resize
if (m_bEnableVfOutput) {
//
// Viewfinding channel is enabled
//
if (VALID_RESIZE_RATIO(pConfigData->inputSize,
pConfigData->outputVfSize)) {
//
// Cascade resize is not needed
//
if (m_bEnableEncOutput) {
//
// And encoding channel is enabled
//
if (VALID_RESIZE_RATIO(pConfigData->inputSize,
pConfigData->outputEncSize)) {
//
// Encoding channel horizontal resize
//
if (PrpResize(pConfigData->inputSize.width,
pConfigData->outputEncSize.width,
prpResize_Encoding, prpResize_Horizontal) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel horizontal resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
//
// Encoding channel vertical resize
//
if (PrpResize(pConfigData->inputSize.height,
pConfigData->outputEncSize.height,
prpResize_Encoding, prpResize_Vertical) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel vertical resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
//
// Viewfinding channel horizontal resize
//
if (PrpResize(pConfigData->inputSize.width,
pConfigData->outputVfSize.width,
prpResize_Viewfinding, prpResize_Horizontal) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Viewfinding channel horizontal resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
//
// Viewfinding channel vertical resize
//
if (PrpResize(pConfigData->inputSize.height,
pConfigData->outputVfSize.height,
prpResize_Viewfinding, prpResize_Vertical) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Viewfinding channel vertical resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
// Disable cascade resize
INSREG32BF(&m_pPrpReg->PRP_CNTL,
PRP_CNTL_CH1BYP, PRP_CNTL_CH1BYP_DISCASCADE);
} else {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel resize ratio is invalid! \r\n"),
__WFUNCTION__));
return FALSE;
}
} else { // Only viewfinding channel is enabled
//
// Viewfinding channel horizontal resize
//
if (PrpResize(pConfigData->inputSize.width,
pConfigData->outputVfSize.width,
prpResize_Viewfinding, prpResize_Horizontal) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Viewfinding channel (only) horizontal resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
//
// Viewfinding channel vertical resize
//
if (PrpResize(pConfigData->inputSize.height,
pConfigData->outputVfSize.height,
prpResize_Viewfinding, prpResize_Vertical) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Viewfinding channel (only) vertical resize failed! \r\n")));
return FALSE;
}
// Disable cascade resize
INSREG32BF(&m_pPrpReg->PRP_CNTL,
PRP_CNTL_CH1BYP, PRP_CNTL_CH1BYP_DISCASCADE);
}
} else {
//
// Cascade resize is needed
//
if (m_bEnableEncOutput) { // Encoding channel is enabled
// Viewfinding size must be less than encoding
if ((pConfigData->outputVfSize.width >= pConfigData->outputEncSize.width) ||
(pConfigData->outputVfSize.height >= pConfigData->outputEncSize.height)) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Viewfinding size is bigger than encoding! \r\n"),
__WFUNCTION__));
return FALSE;
}
if (VALID_RESIZE_RATIO(pConfigData->inputSize,
pConfigData->outputEncSize)) {
if (VALID_RESIZE_RATIO(pConfigData->outputEncSize,
pConfigData->outputVfSize)) {
//
// Encoding channel horizontal resize
//
if (PrpResize(pConfigData->inputSize.width,
pConfigData->outputEncSize.width,
prpResize_Encoding, prpResize_Horizontal) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel (cascade) horizontal resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
//
// Encoding channel vertical resize
//
if (PrpResize(pConfigData->inputSize.height,
pConfigData->outputEncSize.height,
prpResize_Encoding, prpResize_Vertical) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel (cascade) vertical resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
//
// Viewfinding channel horizontal resize
//
if (PrpResize(pConfigData->outputEncSize.width,
pConfigData->outputVfSize.width,
prpResize_Viewfinding, prpResize_Horizontal) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Viewfinding channel (cascade) horizontal resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
//
// Viewfinding channel vertical resize
//
if (PrpResize(pConfigData->outputEncSize.height,
pConfigData->outputVfSize.height,
prpResize_Viewfinding, prpResize_Vertical) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Viewfinding channel (cascade) vertical resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
// Enable cascade resize
INSREG32BF(&m_pPrpReg->PRP_CNTL,
PRP_CNTL_CH1BYP, PRP_CNTL_CH1BYP_CASCADE);
} else {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel to viewfinding channel resize ratio is invalid! \r\n"),
__WFUNCTION__));
return FALSE;
}
} else {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel (cascode) resize ratio is invalid! \r\n"),
__WFUNCTION__));
return FALSE;
}
} else {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel is not enabled for the cascode resize! \r\n"),
__WFUNCTION__));
return FALSE;
}
}
} else { // Viewfinding channel is not enabled
if (m_bEnableEncOutput) {
//
// Only encoding channel enabled
//
if (VALID_RESIZE_RATIO(pConfigData->inputSize,
pConfigData->outputEncSize)) {
//
// Encoding channel horizontal resize
//
if (PrpResize(pConfigData->inputSize.width,
pConfigData->outputEncSize.width,
prpResize_Encoding, prpResize_Horizontal) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel (only) horizontal resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
//
// Encoding channel vertical resize
//
if (PrpResize(pConfigData->inputSize.height,
pConfigData->outputEncSize.height,
prpResize_Encoding, prpResize_Vertical) == FALSE) {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel (only) vertical resize failed! \r\n"),
__WFUNCTION__));
return FALSE;
}
// Just make sure cascade resize is not being used
INSREG32BF(&m_pPrpReg->PRP_CNTL,
PRP_CNTL_CH1BYP, PRP_CNTL_CH1BYP_DISCASCADE);
} else {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Encoding channel (only) resize ratio is invalid! \r\n"),
__WFUNCTION__));
return FALSE;
}
} else {
DEBUGMSG(ZONE_ERROR,
(TEXT("%s: Both viewfinding and encoding channels are disabled! \r\n"),
__WFUNCTION__));
return FALSE;
}
}
PRP_FUNCTION_EXIT();
return TRUE;
}
//------------------------------------------------------------------------------
//
// Function: PrpResize
//
// This function is used to build resizing table. Resize registers are setup
// for the given group.
//
// Parameters:
// in
// [in] Width/height of resizing input.
//
// out
// [in] Width/height of resizing output.
//
// channel
// [in] Viewfinding or encoding channel.
//
// dimension
// [in] Horizontal or vertical.
//
// Returns:
// TRUE if success; FALSE if failure.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -