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

📄 umc_color_space_converter.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        }        if(InitParam.SizeDest.height == 0) {            InitParam.SizeDest.height = InitParam.SrcCropRect.bottom - InitParam.SrcCropRect.top;        }    }    else if(InitParam.SizeDest.height == 0 || InitParam.SizeDest.width == 0)    {        if(InitParam.SizeDest.height == 0)        {            switch(InitParam.lFlags & 0x1f)            {            case FLAG_CCNV_RESIZE_2S:                InitParam.SizeDest.height = InitParam.SizeSource.height/2;                break;            case FLAG_CCNV_RESIZE_4S:                InitParam.SizeDest.height = InitParam.SizeSource.height/4;                break;            case FLAG_CCNV_RESIZE_8S:                InitParam.SizeDest.height = InitParam.SizeSource.height/8;                break;            }        }        if(InitParam.SizeDest.width == 0)        {            switch(InitParam.lFlags & 0x1f)            {            case FLAG_CCNV_RESIZE_2S:                InitParam.SizeDest.width = InitParam.SizeSource.width/2;                break;            case FLAG_CCNV_RESIZE_4S:                InitParam.SizeDest.width = InitParam.SizeSource.width/4;                break;            case FLAG_CCNV_RESIZE_8S:                InitParam.SizeDest.width = InitParam.SizeSource.width/8;                break;            }        }    }    // Init format constants' sets    {        Status umcRes = SetFormatConsts(InitParam.FormatSource,                                        InitParam.SrcFmtConsts);        if (UMC_OK == umcRes)        {            umcRes = SetFormatConsts(InitParam.FormatDest,                                     InitParam.DstFmtConsts);        }        if (UMC_OK != umcRes)        {   return umcRes;  }    }    return UMC_OK;} // Status ColorSpaceConverter::Init(ColorConversionInfo &InitParam)Status ColorSpaceConverter::CheckParameters(ColorConversionParams &Param){    // check source image size(s)    if(0 == Param.ConversionInit.lInterpolation)        Param.ConversionInit.lInterpolation = 1 /*IPPI_INTER_NN*/;    if ((Param.ConversionInit.SizeDest.width > Param.ConversionInit.SizeSource.width) ||        (Param.ConversionInit.SizeDest.height > Param.ConversionInit.SizeSource.height))    {        if (8 /*IPPI_INTER_SUPER*/ == Param.ConversionInit.lInterpolation)            Param.ConversionInit.lInterpolation = 4 /*IPPI_INTER_CUBIC*/;    };    switch (Param.ConversionInit.FormatSource)    {    case YV12:    case YUV420:        Param.ConversionInit.SizeSource.height &= ~(1);        Param.ConversionInit.SizeSource.width &= ~(1);        Param.ConversionInit.SrcCropRect.left &= ~(1);        Param.ConversionInit.SrcCropRect.top &= ~(1);        Param.ConversionInit.SrcCropRect.right &= ~(1);        Param.ConversionInit.SrcCropRect.bottom &= ~(1);        if (NULL == Param.lpSource0)            return UMC_NULL_PTR;        if (NULL == Param.lpSource1)        {            Param.PitchSource1 = Param.PitchSource0 / 2;            Param.lpSource1 = Param.lpSource0 + (Param.ConversionInit.SizeDest.height * Param.PitchSource0);        };        if (NULL == Param.lpSource2)        {            Param.PitchSource2 = Param.PitchSource0 / 2;            Param.lpSource2 = Param.lpSource1 + ((Param.ConversionInit.SizeDest.height / 2) * Param.PitchSource1);        };        break;    case NV12:    case YUV420M:        Param.ConversionInit.SizeSource.height &= ~(1);        Param.ConversionInit.SizeSource.width &= ~(1);        Param.ConversionInit.SrcCropRect.left &= ~(1);        Param.ConversionInit.SrcCropRect.top &= ~(1);        Param.ConversionInit.SrcCropRect.right &= ~(1);        Param.ConversionInit.SrcCropRect.bottom &= ~(1);        if (NULL == Param.lpSource0)            return UMC_NULL_PTR;        if (NULL == Param.lpSource1)        {            Param.PitchSource1 = Param.PitchSource0;            Param.lpSource1 = Param.lpSource0 + ((Param.ConversionInit.SizeSource.height) * Param.PitchSource0);        };        break;    case YUY2:    case UYVY:        Param.ConversionInit.SizeSource.width &= ~(1);        Param.ConversionInit.SrcCropRect.left &= ~(1);        Param.ConversionInit.SrcCropRect.right &= ~(1);        if (NULL == Param.lpSource0)            return UMC_NULL_PTR;        break;    case YUV411:        Param.ConversionInit.SizeSource.width &= ~(3);        Param.ConversionInit.SrcCropRect.left &= ~(3);        Param.ConversionInit.SrcCropRect.right &= ~(3);        if ((NULL == Param.lpSource0) ||            (NULL == Param.lpSource1) ||            (NULL == Param.lpSource2))            return UMC_NULL_PTR;        break;    default:        if (NULL == Param.lpSource0)            return UMC_NULL_PTR;        break;    };    // check if Crop region is in frame bounds    if (Param.ConversionInit.SizeSource.width <        Param.ConversionInit.SrcCropRect.right)    {        Param.ConversionInit.SrcCropRect.right =            static_cast<signed short> (Param.ConversionInit.SizeSource.width);    }    if (Param.ConversionInit.SrcCropRect.right <        Param.ConversionInit.SrcCropRect.left)    {        Param.ConversionInit.SrcCropRect.left =            Param.ConversionInit.SrcCropRect.right;    }    if (Param.ConversionInit.SizeSource.height <        Param.ConversionInit.SrcCropRect.bottom)    {        Param.ConversionInit.SrcCropRect.bottom =            static_cast<signed short> (Param.ConversionInit.SizeSource.height);    }    if (Param.ConversionInit.SrcCropRect.bottom <        Param.ConversionInit.SrcCropRect.top)    {        Param.ConversionInit.SrcCropRect.top =            Param.ConversionInit.SrcCropRect.bottom;    }    // check dest image size(s)    switch (Param.ConversionInit.FormatDest)    {    case YV12:    case YUV420:        Param.ConversionInit.SizeDest.height &= ~(1);        Param.ConversionInit.SizeDest.width &= ~(1);        if (NULL == Param.lpDest0)            return UMC_NULL_PTR;        if (NULL == Param.lpDest1)        {            Param.PitchDest1 = Param.PitchDest0 / 2;            Param.lpDest1 = Param.lpDest0 + (Param.ConversionInit.SizeDest.height * Param.PitchDest0);        };        if (NULL == Param.lpDest2)        {            Param.PitchDest2 = Param.PitchDest0 / 2;            Param.lpDest2 = Param.lpDest1 + ((Param.ConversionInit.SizeDest.height / 2) * Param.PitchDest1);        };        break;    case NV12:    case YUV420M:        Param.ConversionInit.SizeDest.height &= ~(1);        Param.ConversionInit.SizeDest.width &= ~(1);        if (NULL == Param.lpDest0)            return UMC_NULL_PTR;        if (NULL == Param.lpDest1)        {            Param.PitchDest1 = Param.PitchDest0;            Param.lpDest1 = Param.lpDest0 + ((Param.ConversionInit.SizeDest.height) * Param.PitchDest0);        };        break;    case YUY2:    case UYVY:        Param.ConversionInit.SizeDest.width &= ~(1);        if (NULL == Param.lpDest0)            return UMC_NULL_PTR;        break;    case YUV411:        return UMC_NULL_PTR;    default:        if (NULL == Param.lpDest0)            return UMC_NULL_PTR;        break;    };    if (0 == Param.ConversionInit.SrcCropRect.right ||        0 == Param.ConversionInit.SrcCropRect.bottom)    {        // left shouldn't be more then left        assert(0 == Param.ConversionInit.SrcCropRect.left);        // top shouldn't be more then bottom        assert(0 == Param.ConversionInit.SrcCropRect.top);        // Suppose SrcCropRect parameter just wasn't initialized        Param.ConversionInit.SrcCropRect.right =            static_cast<signed short> (Param.ConversionInit.SizeSource.width);        Param.ConversionInit.SrcCropRect.bottom =            static_cast<signed short> (Param.ConversionInit.SizeSource.height);    }    return UMC_OK;} // Status ColorSpaceConverter::CheckParameters(ColorConversionParams &ConvertParam)Status ColorSpaceConverter::ConvertFrame(ColorConversionParams *lpConvertParam){    ColorConversionParams Param;    Status Error;    // check param    if (NULL == lpConvertParam)        return UMC_NULL_PTR;    // simple set pointer(s)    if (FLAG_CCNV_NONE == lpConvertParam->ConversionInit.lFlags)    {        lpConvertParam->ConversionInit.FormatDest =                                    lpConvertParam->ConversionInit.FormatSource;        lpConvertParam->lpDest0 = lpConvertParam->lpSource0;        lpConvertParam->lpDest1 = lpConvertParam->lpSource1;        lpConvertParam->lpDest2 = lpConvertParam->lpSource2;        lpConvertParam->PitchDest0 = lpConvertParam->PitchSource0;        lpConvertParam->PitchDest1 = lpConvertParam->PitchSource1;        lpConvertParam->PitchDest2 = lpConvertParam->PitchSource2;        return UMC_OK;    }    Param = *lpConvertParam;    // copy data    if (NONE == Param.ConversionInit.FormatDest)        Param.ConversionInit.FormatDest = Param.ConversionInit.FormatSource;    // if Init was not called    if (NULL == lpConvertParam->ConversionInit.iInternal)        return UMC_NOT_INITIALIZED;    // check formats & fix it    if (UMC_OK != (Error = CheckParameters(Param)))        return Error;    // Convert crop area only:    {        Param.lpSource0 +=            Param.ConversionInit.SrcCropRect.top *            Param.PitchSource0 +            Param.ConversionInit.SrcCropRect.left *            Param.ConversionInit.SrcFmtConsts.uiBytesPerPixPl0;        if (2 <= Param.ConversionInit.SrcFmtConsts.uiPlanNum)        {            Param.lpSource1 +=                Param.ConversionInit.SrcCropRect.top /                Param.ConversionInit.SrcFmtConsts.uiColPerLinePl12 *                Param.PitchSource1 +                Param.ConversionInit.SrcCropRect.left /                Param.ConversionInit.SrcFmtConsts.uiPixPerBytePl12;        }        if (3 == Param.ConversionInit.SrcFmtConsts.uiPlanNum)        {            Param.lpSource2 +=                Param.ConversionInit.SrcCropRect.top /                Param.ConversionInit.SrcFmtConsts.uiColPerLinePl12 *                Param.PitchSource2 +                Param.ConversionInit.SrcCropRect.left /                Param.ConversionInit.SrcFmtConsts.uiPixPerBytePl12;        }        Param.ConversionInit.SizeSource.width =            min(Param.ConversionInit.SizeSource.width,                 Param.ConversionInit.SrcCropRect.right -                 Param.ConversionInit.SrcCropRect.left);        Param.ConversionInit.SizeSource.height =            min(Param.ConversionInit.SizeSource.height,            Param.ConversionInit.SrcCropRect.bottom -            Param.ConversionInit.SrcCropRect.top);    }#ifdef _WIN32_WCE#if (_WIN32_WCE > 0x0300)    try    {#endif // (_WIN32_WCE > 0x0300)#endif // _WIN32_WCE        // convert & deinterlace        ConvertFrameAndDeinterlace(Param);#ifdef _WIN32_WCE#if (_WIN32_WCE > 0x0300)    }    catch(...)    {    };#endif // (_WIN32_WCE > 0x0300)#endif // _WIN32_WCE    return UMC_OK;} // Status ColorSpaceConverter::ConvertFrame(ColorConversionParams *lpConvertParam)Status ColorSpaceConverter::ConvertSlice(ColorConversionParams *lpConvertParam, vm_var32 lSliceNum){    ColorConversionParams Param;    Status Error;    // check param    if (NULL == lpConvertParam)        return UMC_NULL_PTR;    if (lpConvertParam->ConversionInit.lDeinterlace & FLAG_CCNV_DEINTERLACE)        return UMC_OK;    // simple set pointer(s)    if (FLAG_CCNV_NONE == lpConvertParam->ConversionInit.lFlags)    {        lpConvertParam->ConversionInit.FormatDest = lpConvertParam->ConversionInit.FormatSource;

⌨️ 快捷键说明

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