📄 umc_color_space_converter.cpp
字号:
} 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 + -