📄 umc_color_space_converter_yv12.cpp
字号:
/*//// INTEL CORPORATION PROPRIETARY INFORMATION// This software is supplied under the terms of a license agreement or// nondisclosure agreement with Intel Corporation and may not be copied// or disclosed except in accordance with the terms of that agreement.// Copyright (c) 2003-2005 Intel Corporation. All Rights Reserved.//*/#include <stdlib.h>#include <ippi.h>#include <ippvc.h>#include <ippcc.h>#include "umc_color_space_converter.h"#include "vm_debug.h"namespace UMC{void ColorSpaceConverter::ResizeYV12(ColorConversionParams &ConvertParam){ vm_byte *lpY, *lpU, *lpV; IppiSize SizeSrc = {ConvertParam.ConversionInit.SizeSource.width, ConvertParam.ConversionInit.SizeSource.height}; IppiSize SizeDst = {ConvertParam.ConversionInit.SizeDest.width, ConvertParam.ConversionInit.SizeDest.height}; IppiRect RectSrc = {0, 0, SizeSrc.width, SizeSrc.height}; IppiRect RectDst = {0, 0, SizeDst.width, SizeDst.height}; size_t lPitchY, lPitchU, lPitchV; // we need resize (into temporary buffer) with conversion (from it) if (ConvertParam.ConversionInit.FormatDest != ConvertParam.ConversionInit.FormatSource) { size_t lNeededSize; // correct dest size(s) SizeDst.width = (SizeDst.width + 1) & ~(1); SizeDst.height = (SizeDst.height + 1) & ~(1); // calc needed internal buffer size lNeededSize = (SizeDst.width * SizeDst.height * 3) / 2; if (lNeededSize > m_lBufferSize) { if (false == AllocateInternalBuffer(lNeededSize)) return; }; lpY = reinterpret_cast<vm_byte *> (m_lpvBuffer); lpU = lpY + SizeDst.width * SizeDst.height; lpV = lpU + (SizeDst.width * SizeDst.height) / 4; lPitchY = SizeDst.width; lPitchU = SizeDst.width / 2; lPitchV = SizeDst.width / 2; } else { lpY = ConvertParam.lpDest0; lpU = ConvertParam.lpDest1; lpV = ConvertParam.lpDest2; lPitchY = ConvertParam.PitchDest0; lPitchU = ConvertParam.PitchDest1; lPitchV = ConvertParam.PitchDest2; }; // resize image to internal buffer // resize Y//#if !defined (ARM) && !defined (_ARM_) ippiResize_8u_C1R( ConvertParam.lpSource0, SizeSrc, ConvertParam.PitchSource0, RectSrc, lpY, (Ipp32s) lPitchY, SizeDst, static_cast<double> (RectDst.width) / static_cast<double> (RectSrc.width), static_cast<double> (RectDst.height) / static_cast<double> (RectSrc.height), ConvertParam.ConversionInit.lInterpolation);//#endif // resize U & V SizeSrc.width /= 2; SizeSrc.height /= 2; RectSrc.width /= 2; RectSrc.height /= 2; SizeDst.width /= 2; SizeDst.height /= 2; RectDst.width /= 2; RectDst.height /= 2;//#if !defined (ARM) && !defined (_ARM_) ippiResize_8u_C1R( ConvertParam.lpSource1, SizeSrc, ConvertParam.PitchSource1, RectSrc, lpU, (Ipp32s) lPitchU, SizeDst, static_cast<double> (RectDst.width) / static_cast<double> (RectSrc.width), static_cast<double> (RectDst.height) / static_cast<double> (RectSrc.height), ConvertParam.ConversionInit.lInterpolation); ippiResize_8u_C1R( ConvertParam.lpSource2, SizeSrc, ConvertParam.PitchSource2, RectSrc, lpV, (Ipp32s) lPitchV, SizeDst, static_cast<double> (RectDst.width) / static_cast<double> (RectSrc.width), static_cast<double> (RectDst.height) / static_cast<double> (RectSrc.height), ConvertParam.ConversionInit.lInterpolation);//#endif if (ConvertParam.ConversionInit.FormatDest != ConvertParam.ConversionInit.FormatSource) { // save new pointer(s) ConvertParam.ConversionInit.SizeSource = ConvertParam.ConversionInit.SizeDest; ConvertParam.lpSource0 = lpY; ConvertParam.lpSource1 = lpU; ConvertParam.lpSource2 = lpV; ConvertParam.PitchSource0 = (vm_var32) lPitchY; ConvertParam.PitchSource1 = (vm_var32) lPitchU; ConvertParam.PitchSource2 = (vm_var32) lPitchV; };} // void ColorSpaceConverter::ResizeYV12(ColorConversionParams &ConvertParam)void ColorSpaceConverter::ConvertFrom_YV12_To_YV12(ColorConversionParams &ConvertParam){ // different sizes. Do resize if ((ConvertParam.ConversionInit.SizeSource.width != ConvertParam.ConversionInit.SizeDest.width) || (ConvertParam.ConversionInit.SizeSource.height != ConvertParam.ConversionInit.SizeDest.height)) { // simple resize ResizeYV12(ConvertParam); } else // equal size. simple copy { IppiSize SizeDst = {ConvertParam.ConversionInit.SizeDest.width, ConvertParam.ConversionInit.SizeDest.height}; // copy Y ippiCopy_8u_C1R(ConvertParam.lpSource0, ConvertParam.PitchSource0, ConvertParam.lpDest0, ConvertParam.PitchDest0, SizeDst); SizeDst.width /= 2; SizeDst.height /= 2;#if !defined(MT_WILSON) // copy U ippiCopy_8u_C1R(ConvertParam.lpSource1, ConvertParam.PitchSource1, ConvertParam.lpDest1, ConvertParam.PitchDest1, SizeDst); // copy V ippiCopy_8u_C1R(ConvertParam.lpSource2, ConvertParam.PitchSource2, ConvertParam.lpDest2, ConvertParam.PitchDest2, SizeDst);#else // !defined(MT_WILSON) // copy U ippiCopy_8u_C1R(ConvertParam.lpSource1, ConvertParam.PitchSource1, ConvertParam.lpDest1, ConvertParam.PitchDest1 * 2, SizeDst); ippiCopy_8u_C1R(ConvertParam.lpSource1, ConvertParam.PitchSource1, ConvertParam.lpDest1 + ConvertParam.PitchDest1, ConvertParam.PitchDest1 * 2, SizeDst); // copy V ippiCopy_8u_C1R(ConvertParam.lpSource2, ConvertParam.PitchSource2, ConvertParam.lpDest2, ConvertParam.PitchDest2 * 2, SizeDst); ippiCopy_8u_C1R(ConvertParam.lpSource2, ConvertParam.PitchSource2, ConvertParam.lpDest2 + ConvertParam.PitchDest2, ConvertParam.PitchDest2 * 2, SizeDst);#endif // !defined(MT_WILSON) };} // void ColorSpaceConverter::ConvertFrom_YV12_To_YV12(ColorConversionParams &ConvertParam)void ColorSpaceConverter::ConvertFrom_YV12_To_NV12(ColorConversionParams &ConvertParam){ // different size. Do resize if ((ConvertParam.ConversionInit.SizeSource.width != ConvertParam.ConversionInit.SizeDest.width) || (ConvertParam.ConversionInit.SizeSource.height != ConvertParam.ConversionInit.SizeDest.height)) { // resize image to internal buffer ResizeYV12(ConvertParam); }//#if !defined (ARM) && !defined (_ARM_) // equal size. simple convert { const vm_byte *(pSrc[3]) = {ConvertParam.lpSource0, ConvertParam.lpSource1, ConvertParam.lpSource2}; size_t srcStep[3] = {ConvertParam.PitchSource0, ConvertParam.PitchSource1, ConvertParam.PitchSource2}; IppiSize roiSize = {ConvertParam.ConversionInit.SizeDest.width, ConvertParam.ConversionInit.SizeDest.height}; ippiYCrCb420ToYCbCr420_8u_P3P2R(pSrc, (int *) srcStep, ConvertParam.lpDest0,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -