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

📄 ppclass.cpp

📁 freescale i.mx31 BSP CE5.0全部源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    return FALSE;
}

//-----------------------------------------------------------------------------
//
// Function: PpDeinit
//
// This function deinitializes the Image Converter (Postprocessor).
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
void PpClass::PpDeinit(void)
{

    PP_FUNCTION_ENTRY();

    // Disable Postprocessor
    PpDisable();

    CloseHandle(m_hPpIntrEvent);
    m_hPpIntrEvent = NULL;

    CloseHandle(m_hEOFEvent);
    m_hEOFEvent = NULL;

    CloseHandle(m_hReadDisplayBufferQueue);
    m_hReadDisplayBufferQueue = NULL;

    CloseHandle(m_hWriteDisplayBufferQueue);
    m_hWriteDisplayBufferQueue = NULL;

    if (m_hDisplay != NULL)
    {
        DeleteDC(m_hDisplay);
        m_hDisplay = NULL;
    }

    if (m_hPpISRThread)
    {
        TerminateThread(m_hPpISRThread, 0);
        CloseHandle(m_hPpISRThread);
        m_hPpISRThread = NULL;
    }

    if (m_hPpBufThread)
    {
        TerminateThread(m_hPpBufThread, 0);
        CloseHandle(m_hPpBufThread);
        m_hPpBufThread = NULL;
    }
}


//-----------------------------------------------------------------------------
//
// Function:  PpEnqueueBuffers
//
// This function adds buffers for the PP channel.
// Input and output buffers are provided and added to the buffer queue.
// It is assumed that the caller has allocated physically contiguous 
// buffers for use in the IPU's IDMAC.
//
// Parameters:
//      pBufs
//          [in] Pointer to structure containing a pointer
//          to an input and output buffer.
//
// Returns:
//      TRUE if successful; FALSE if failed
//
//-----------------------------------------------------------------------------
BOOL PpClass::PpEnqueueBuffers(pPpBuffers pBufs)
{

    // Map pointers for input and output buffers;
//    pInputBuf = (UINT32 *) MapCallerPtr(pBufs->inputBuf, pBufs->inBufLen);
//    pOutputBuf = (UINT32 *) MapCallerPtr(pBufs->outputBuf, pBufs->outBufLen);

    // Enqueue input buffer
    if (!WriteMsgQueue(m_hWriteInputBufferQueue, pBufs, sizeof(ppBuffers), 0, 0))
    {
        DEBUGMSG(ZONE_ERROR, 
            (TEXT("%s : Could not write to input buffer queue.  Error!\r\n"), __WFUNCTION__));
        return FALSE;
    }

    // Enqueue output buffer
    if (!WriteMsgQueue(m_hWriteOutputBufferQueue, pBufs, sizeof(ppBuffers), 0, 0))
    {
        DEBUGMSG(ZONE_ERROR, 
            (TEXT("%s : Could not write to output buffer queue.  Error!\r\n"), __WFUNCTION__));
        return FALSE;
    }

    return TRUE;
}


//-----------------------------------------------------------------------------
//
// Function:  PpClearBuffers
//
// This function clears out the input and output buffer queues
// for the Post-processor.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
void PpClass::PpClearBuffers()
{
    ppBuffers bufs;
    DWORD dwFlags, bytesRead;

    // Read all buffers from Input queue.
    while (ReadMsgQueue(m_hReadInputBufferQueue, &bufs, sizeof(ppBuffers), &bytesRead, 0, &dwFlags)){}

    // Read all buffers from Output queue.
    while (ReadMsgQueue(m_hReadOutputBufferQueue, &bufs, sizeof(ppBuffers), &bytesRead, 0, &dwFlags)){}
}

//-----------------------------------------------------------------------------
//
// Function:  PpGetMaxBuffers
//
// This function returns the maximum number of buffers supported
// by the postprocessor.
// with the IPU hardware.
//
// Parameters:
//      None.
//
// Returns:
//      Returns the Max buffer number.
//
//-----------------------------------------------------------------------------
UINT32 PpClass::PpGetMaxBuffers(void)
{
    return PP_MAX_NUM_BUFFERS;
}


//-----------------------------------------------------------------------------
//
// Function: PpConfigure
//
// This function configures the IC registers and IDMAC
// channels for the postprocessor channel.
//
// Parameters:
//      pPpConfigureData
//          [in] Pointer to configuration data structure
//
// Returns:
//      TRUE if success
//      FALSE if failure
//
//-----------------------------------------------------------------------------
BOOL PpClass::PpConfigure(pPpConfigData pConfigData)
{
    BOOL result = TRUE;
    ppFormat iFormat = pConfigData->outputFormat;
    ppCSCCoeffs CSCCoeffs;
    ppResizeCoeffs resizeCoeffs;
    UINT16 iResizeOutputHeight, iResizeOutputWidth;

    PP_FUNCTION_ENTRY();

    // Get display characteristics for PpClass.
    // Only perform once.
    if (!m_bDisplayInitialized)
    {
        PpInitDisplayCharacteristics();
        m_bDisplayInitialized = TRUE;
    }

    // If Post-processing enabled, configure
    if (iFormat != ppFormat_Disabled)
    {
        //-----------------------------------------------------------------
        // Setup input source
        //-----------------------------------------------------------------
        PpConfigureInput(pConfigData);

        //-----------------------------------------------------------------
        // Setup input source
        //-----------------------------------------------------------------
        PpConfigureOutput(pConfigData);

        //-----------------------------------------------------------------
        // Setup color space conversion
        //-----------------------------------------------------------------

        // Set up CSC for post-processing
        if (pConfigData->CSCEquation != ppCSCNoOp)
        {
            switch (pConfigData->CSCEquation)
            {
                case ppCSCR2Y_A1:
                case ppCSCR2Y_A0:
                case ppCSCR2Y_B0:
                case ppCSCR2Y_B1:
                    CSCCoeffs.C00 = rgb2yuv_tbl[pConfigData->CSCEquation][0];
                    CSCCoeffs.C01 = rgb2yuv_tbl[pConfigData->CSCEquation][1];
                    CSCCoeffs.C02 = rgb2yuv_tbl[pConfigData->CSCEquation][2];
                    CSCCoeffs.C10 = rgb2yuv_tbl[pConfigData->CSCEquation][3];
                    CSCCoeffs.C11 = rgb2yuv_tbl[pConfigData->CSCEquation][4];
                    CSCCoeffs.C12 = rgb2yuv_tbl[pConfigData->CSCEquation][5];
                    CSCCoeffs.C20 = rgb2yuv_tbl[pConfigData->CSCEquation][6];
                    CSCCoeffs.C21 = rgb2yuv_tbl[pConfigData->CSCEquation][7];
                    CSCCoeffs.C22 = rgb2yuv_tbl[pConfigData->CSCEquation][8];
                    CSCCoeffs.A0 = rgb2yuv_tbl[pConfigData->CSCEquation][9];
                    CSCCoeffs.A1 = rgb2yuv_tbl[pConfigData->CSCEquation][10];
                    CSCCoeffs.A2 = rgb2yuv_tbl[pConfigData->CSCEquation][11];
                    CSCCoeffs.Scale = rgb2yuv_tbl[pConfigData->CSCEquation][12];
                    break;

                case ppCSCY2R_A1:
                case ppCSCY2R_A0:
                case ppCSCY2R_B0:
                case ppCSCY2R_B1:
                    CSCCoeffs.C00 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][0];
                    CSCCoeffs.C01 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][1];
                    CSCCoeffs.C02 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][2];
                    CSCCoeffs.C10 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][3];
                    CSCCoeffs.C11 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][4];
                    CSCCoeffs.C12 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][5];
                    CSCCoeffs.C20 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][6];
                    CSCCoeffs.C21 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][7];
                    CSCCoeffs.C22 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][8];
                    CSCCoeffs.A0 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][9];
                    CSCCoeffs.A1 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][10];
                    CSCCoeffs.A2 = yuv2rgb_tbl[pConfigData->CSCEquation - 4][11];
                    CSCCoeffs.Scale = yuv2rgb_tbl[pConfigData->CSCEquation - 4][12];
                    break;

                case ppCSCCustom:
                    CSCCoeffs.C00 = pConfigData->CSCCoeffs.C00;
                    CSCCoeffs.C01 = pConfigData->CSCCoeffs.C01;
                    CSCCoeffs.C02 = pConfigData->CSCCoeffs.C02;
                    CSCCoeffs.C10 = pConfigData->CSCCoeffs.C10;
                    CSCCoeffs.C11 = pConfigData->CSCCoeffs.C11;
                    CSCCoeffs.C12 = pConfigData->CSCCoeffs.C12;
                    CSCCoeffs.C20 = pConfigData->CSCCoeffs.C20;
                    CSCCoeffs.C21 = pConfigData->CSCCoeffs.C21;
                    CSCCoeffs.C22 = pConfigData->CSCCoeffs.C22;
                    CSCCoeffs.A0 = pConfigData->CSCCoeffs.A0;
                    CSCCoeffs.A1 = pConfigData->CSCCoeffs.A1;
                    CSCCoeffs.A2 = pConfigData->CSCCoeffs.A2;
                    CSCCoeffs.Scale = pConfigData->CSCCoeffs.Scale;
                    break;

                default:
                    DEBUGMSG(ZONE_ERROR,
                        (TEXT("%s: Invalid PP CSC equation. \r\n"), __WFUNCTION__));
            }

            // Set up the task parameter memory
            PpTaskParamConfig(&CSCCoeffs);

            // Now enable CSC in IC configuration register
            INSREG32BF(&P_IPU_REGS->IC_CONF, IPU_IC_CONF_PP_CSC1,
                IPU_IC_CONF_PP_CSC1_ENABLE);
        }
        else
        {
            // Disable CSC in IC configuration register
            INSREG32BF(&P_IPU_REGS->IC_CONF, IPU_IC_CONF_PP_CSC1,
                IPU_IC_CONF_PP_CSC1_DISABLE);
        }

        //-----------------------------------------------------------------
        // Set up resizing.
        //-----------------------------------------------------------------

        // Viewfinding path
        if (pConfigData->outputFormat != ppFormat_Disabled)
        {
            // If we are rotating, we want to resize the input
            // so that it matches the dimensions of the output
            // before rotation. (i.e., width in = height out
            // and height in = width out)
            if (pConfigData->flipRot.rotate90)
            {
                iResizeOutputWidth = pConfigData->outputSize.height;
                iResizeOutputHeight = pConfigData->outputSize.width;
            }
            else
            {
                iResizeOutputWidth = pConfigData->outputSize.width;
                iResizeOutputHeight = pConfigData->outputSize.height;
            }

            // Vertical resizing
            // Get coefficients and then set registers
            if (!PpGetResizeCoeffs(pConfigData->inputSize.height,
                iResizeOutputHeight, &resizeCoeffs))
            {
                DEBUGMSG(ZONE_ERROR,
                    (TEXT("%s: Post-processing vertical resizing failed. \r\n"), __WFUNCTION__));
                result = FALSE;
                goto _done;
            }

            // Set downsizing field
            INSREG32BF(&P_IPU_REGS->IC_PP_RSC, IPU_IC_PP_RSC_PP_DS_R_V,
                resizeCoeffs.downsizeCoeff);

            // Set resizing field
            INSREG32BF(&P_IPU_REGS->IC_PP_RSC, IPU_IC_PP_RSC_PP_RS_R_V,
                resizeCoeffs.resizeCoeff);

            // Horizontal resizing
            // Get coefficients and then set registers
            if (!PpGetResizeCoeffs(pConfigData->inputSize.width,
                iResizeOutputWidth, &resizeCoeffs))
            {
                DEBUGMSG(ZONE_ERROR,
                    (TEXT("%s: Viewfinding horizontal resizing failed. \r\n"), __WFUNCTION__));
                result = FALSE;
                goto _done;
            }

            // Set downsizing field
            INSREG32BF(&P_IPU_REGS->IC_PP_RSC, IPU_IC_PP_RSC_PP_DS_R_H,
                resizeCoeffs.downsizeCoeff);

            // Set resizing field
            INSREG32BF(&P_IPU_REGS->IC_PP_RSC, IPU_IC_PP_RSC_PP_RS_R_H,
                resizeCoeffs.resizeCoeff);
        }

        m_bConfigured = TRUE;
    }

_done:
    PP_FUNCTION_EXIT();
    return result;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -