⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prpclass.cpp

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -