📄 armipcs_computecolourcomponents.c
字号:
/** * * * File Name: armIPCS_ComputeColourComponents.c * OpenMAX DL: v1.0.2 * Revision: 10586 * Date: Wednesday, March 5, 2008 * * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. * * * * Description : Contains functions that compute individual components of YUV/RGB. */#include "omxtypes.h"#include "armIP.h"/** * Functions: * armIPCS_ComputeYUVFromRGB_JPEG * armIPCS_ComputeYFromRGB_JPEG * * Description: * With input data (R,G,B) belonging to [0, 255] and output data (Y,U,V) * expected in [-128, 127] * The pixels are converted from float to S16, taking care of rounding errors * and also clipped to the range [-128, 127]. * * Return Value: * OMXResult -- Error status from the function */ OMXResult armIPCS_ComputeYUVFromRGB_JPEG_F32_S16( OMX_F32 Rdata, OMX_F32 Gdata, OMX_F32 Bdata, OMX_S16 *pYdata, OMX_S16 *pUdata, OMX_S16 *pVdata){ OMX_S16 tempPix; armRetArgErrIf(!pYdata, OMX_Sts_BadArgErr); armRetArgErrIf(!pUdata, OMX_Sts_BadArgErr); armRetArgErrIf(!pVdata, OMX_Sts_BadArgErr); tempPix = armRoundFloatToS16(0.29900*Rdata + 0.58700*Gdata + 0.11400*Bdata - 128); *pYdata = (OMX_S16)armClip(OMX_MIN_S8, OMX_MAX_S8, tempPix); tempPix = armRoundFloatToS16(-0.16874*Rdata - 0.33126*Gdata + 0.50000*Bdata); *pUdata = (OMX_S16)armClip(OMX_MIN_S8, OMX_MAX_S8, tempPix); tempPix = armRoundFloatToS16(0.50000*Rdata - 0.41869*Gdata - 0.08131*Bdata); *pVdata = (OMX_S16)armClip(OMX_MIN_S8, OMX_MAX_S8, tempPix); return OMX_Sts_NoErr;}OMXResult armIPCS_ComputeYFromRGB_JPEG_F32_S16( OMX_F32 Rdata, OMX_F32 Gdata, OMX_F32 Bdata, OMX_S16 *pYdata){ OMX_S16 tempPix; armRetArgErrIf(!pYdata, OMX_Sts_BadArgErr); tempPix = armRoundFloatToS16(0.29900*Rdata + 0.58700*Gdata + 0.11400*Bdata - 128); *pYdata = (OMX_S16)armClip(OMX_MIN_S8, OMX_MAX_S8, tempPix); return OMX_Sts_NoErr;}OMXResult armIPCS_ComputeUFromRGB_JPEG_F32_S16( OMX_F32 Rdata, OMX_F32 Gdata, OMX_F32 Bdata, OMX_S16 *pUdata){ OMX_S16 tempPix; armRetArgErrIf(!pUdata, OMX_Sts_BadArgErr); tempPix = armRoundFloatToS16(-0.16874*Rdata - 0.33126*Gdata + 0.50000*Bdata); *pUdata = (OMX_S16)armClip(OMX_MIN_S8, OMX_MAX_S8, tempPix); return OMX_Sts_NoErr;}OMXResult armIPCS_ComputeVFromRGB_JPEG_F32_S16( OMX_F32 Rdata, OMX_F32 Gdata, OMX_F32 Bdata, OMX_S16 *pVdata){ OMX_S16 tempPix; armRetArgErrIf(!pVdata, OMX_Sts_BadArgErr); tempPix = armRoundFloatToS16(0.50000*Rdata - 0.41869*Gdata - 0.08131*Bdata); *pVdata = (OMX_S16)armClip(OMX_MIN_S8, OMX_MAX_S8, tempPix); return OMX_Sts_NoErr;}/** * Functions: armIPCS_ComputeRGBFromYUV_JPEG_F32 * * Description: * Computes RGB values from YUV for JPEG and then clips it between [0, 255] * * Return Value: * OMXResult -- Error status from the function */ OMXResult armIPCS_ComputeRGBFromYUV_JPEG_F32( OMX_F32 Ydata, OMX_F32 Udata, OMX_F32 Vdata, OMX_F32 *pRdata, OMX_F32 *pGdata, OMX_F32 *pBdata){ OMX_F32 Rdata, Gdata, Bdata; armRetArgErrIf(!pRdata, OMX_Sts_BadArgErr); armRetArgErrIf(!pGdata, OMX_Sts_BadArgErr); armRetArgErrIf(!pBdata, OMX_Sts_BadArgErr); Rdata = (OMX_F32)(Ydata + 128 + 1.40200 * Vdata + 0 * Udata); Gdata = (OMX_F32)(Ydata + 128 - 0.34414 * Udata - 0.71414 * Vdata); Bdata = (OMX_F32)(Ydata + 128 + 1.77200 * Udata + 0 * Vdata); *pRdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Rdata); *pGdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Gdata); *pBdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Bdata); return OMX_Sts_NoErr;}/** * Functions: armIPCS_ComputeRGBFromYUV_JPEG_F32_U8 * * Description: * Computes RGB values from YUV for JPEG and then clips it between [0, 255], * converts to U8 taking care of rounding errors * * Return Value: * OMXResult -- Error status from the function */ OMXResult armIPCS_ComputeRGBFromYUV_JPEG_F32_U8( OMX_F32 Ydata, OMX_F32 Udata, OMX_F32 Vdata, OMX_U8 *pRdata, OMX_U8 *pGdata, OMX_U8 *pBdata){ OMX_F32 Rdata, Gdata, Bdata; armRetArgErrIf(!pRdata, OMX_Sts_BadArgErr); armRetArgErrIf(!pGdata, OMX_Sts_BadArgErr); armRetArgErrIf(!pBdata, OMX_Sts_BadArgErr); Rdata = (OMX_F32)(Ydata + 128 + 1.40200 * Vdata + 0 * Udata); Gdata = (OMX_F32)(Ydata + 128 - 0.34414 * Udata - 0.71414 * Vdata); Bdata = (OMX_F32)(Ydata + 128 + 1.77200 * Udata + 0 * Vdata); Rdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Rdata); Gdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Gdata); Bdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Bdata); *pRdata = (OMX_U8)(Rdata + 0.5); *pGdata = (OMX_U8)(Gdata + 0.5); *pBdata = (OMX_U8)(Bdata + 0.5); return OMX_Sts_NoErr;}/** * Functions: armIPCS_ComputeRGBFromYUV_F32 * * Description: * Computes RGB values from YUV and then clips it between [0, 255] * * Return Value: * OMXResult -- Error status from the function */ OMXResult armIPCS_ComputeRGBFromYUV_F32( OMX_F32 Ydata, OMX_F32 Udata, OMX_F32 Vdata, OMX_F32 *pRdata, OMX_F32 *pGdata, OMX_F32 *pBdata){ OMX_F32 Rdata, Gdata, Bdata; armRetArgErrIf(!pRdata, OMX_Sts_BadArgErr); armRetArgErrIf(!pGdata, OMX_Sts_BadArgErr); armRetArgErrIf(!pBdata, OMX_Sts_BadArgErr); Rdata = (OMX_F32)(1.164*(Ydata-16) + 1.596*(Vdata-128)); Gdata = (OMX_F32)(1.164*(Ydata-16) - 0.813*(Vdata-128) - 0.392*(Udata-128)); Bdata = (OMX_F32)(1.164*(Ydata-16) + 2.017*(Udata-128)); *pRdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Rdata); *pGdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Gdata); *pBdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Bdata); return OMX_Sts_NoErr;}/** * Functions: armIPCS_ComputeRGBFromYUV_F32_U8 * * Description: * Computes RGB values from YUV and then clips it between [0, 255], * converts to U8 taking care of rounding errors * * Return Value: * OMXResult -- Error status from the function */ OMXResult armIPCS_ComputeRGBFromYUV_F32_U8( OMX_F32 Ydata, OMX_F32 Udata, OMX_F32 Vdata, OMX_U8 *pRdata, OMX_U8 *pGdata, OMX_U8 *pBdata){ OMX_F32 Rdata, Gdata, Bdata; armRetArgErrIf(!pRdata, OMX_Sts_BadArgErr); armRetArgErrIf(!pGdata, OMX_Sts_BadArgErr); armRetArgErrIf(!pBdata, OMX_Sts_BadArgErr); Rdata = (OMX_F32)(1.164*(Ydata-16) + 1.596*(Vdata-128)); Gdata = (OMX_F32)(1.164*(Ydata-16) - 0.813*(Vdata-128) - 0.392*(Udata-128)); Bdata = (OMX_F32)(1.164*(Ydata-16) + 2.017*(Udata-128)); Rdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Rdata); Gdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Gdata); Bdata = armClip_F32(OMX_MIN_U8, OMX_MAX_U8, Bdata); *pRdata = (OMX_U8)(Rdata + 0.5); *pGdata = (OMX_U8)(Gdata + 0.5); *pBdata = (OMX_U8)(Bdata + 0.5); return OMX_Sts_NoErr;}/* End of file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -