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

📄 prpclass.cpp

📁 freescale i.mx31 BSP CE5.0全部源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -