📄 omxipcs_bgr565toycbcr422ls_mcu_u16_s16_c3p3.c
字号:
/**** * File Name: omxIPCS_BGR565ToYCbCr422LS_MCU_U16_S16_C3P3.c* OpenMAX DL: v1.0.2* Revision: 10586* Date: Wednesday, March 5, 2008* * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.* * ** Description : Colour Conversion Routine - Converts BGR565 to YUV422 in floating point.* Source is in three channel, pixel domain and the destination would be in * three-channel planar format. Output is a JPEG MCU.**/#include "omxtypes.h"#include "armCOMM.h"#include "armOMX.h"#include "omxIP.h"#include "armIP.h"/*** Function: omxIPCS_BGR565ToYCbCr422LS_MCU_U16_S16_C3P3 (4.4.3.7.6)** Description:* This function converts packed BGR565 image data to the following * sub-sampled color spaces: YCbCr4:4:4, YCbCr4:2:2, and YCbCr4:2:0. The * parameter pDstMCU[0] must point to the start of a buffer with sufficient * free space to contain the particular number of contiguously stored 8x8 Y * blocks that constitute a complete MCU given the output chroma sub-sampling * scheme, i.e., 1, 2, or 4 of 8x8 Y blocks for YCbCr 4:4:4, 4:2:2, or 4:2:0 * output, respectively. ** Input Arguments:* * pSrc - references the source image data buffer. Pixel intensities are * interleaved as shown in Table 4 1, and G, B, and R are * represented using, respectively, 6, 5, and 5 bits. The image * data buffer pSrcsupports bottom-up storage format, for which * srcStep can be less than 0. * srcStep - distance in bytes between the starts of consecutive lines in * the source image; can be less than 0 to support bottom-up * storage format. ** Output Arguments:* * pDstMCU[3] - output MCU pointers. The parameter pDstMCU[0] must point * to the start of a buffer with sufficient free space to contain * the particular number of contiguously stored 8x8 Y blocks that * constitute a complete MCU given the output chroma sub-sampling * scheme, i.e., 1, 2, or 4 of 8x8 Y blocks for YCbCr 4:4:4, 4:2:2, * or 4:2:0 output, respectively. The parameter pDstMCU[1] points to * the Cb block, and the parameter pDstMCU[2] points to the Cr * block. Output components are expressed using a Q8 * representation and are bounded on the interval [-128, 127]. The * buffers referenced by pDstMCU[] support top-down storage format * only, and all pointers pDstMCU[0..2] must be 8-byte aligned. ** Return Value:* * OMX_Sts_NoErr - no error * OMX_Sts_BadArgErr - bad arguments. Returned for any of the following * conditions: * - a pointer was NULL * - srcStep was an odd number or its absolute value was less * than 16 for YCbCr444 or 32 for YCbCr422/YCbCr420. * - a pointer in pDstMCU[] was not 8-byte aligned **/OMXResult omxIPCS_BGR565ToYCbCr422LS_MCU_U16_S16_C3P3( const OMX_U16 *pSrc, OMX_INT srcStep, OMX_S16 * pDstMCU[3] ) { OMX_S16 *pDstY, *pDstCb, *pDstCr; OMX_U8 Rdata, Gdata, Bdata, Rdata2, Gdata2, Bdata2; OMX_INT i, j, blk; ARM_BLOCK8x8 *y8x8; OMX_INT blkOffset[2] = {0, 8}; OMX_INT blkOffset_UV[2] = {0, 4}; const OMX_U16 *pRGB; armRetArgErrIf(!pSrc, OMX_Sts_BadArgErr); armRetArgErrIf(!pDstMCU, OMX_Sts_BadArgErr); armRetArgErrIf(!pDstMCU[0], OMX_Sts_BadArgErr); armRetArgErrIf(!pDstMCU[1], OMX_Sts_BadArgErr); armRetArgErrIf(!pDstMCU[2], OMX_Sts_BadArgErr); armRetArgErrIf(!armIs8ByteAligned(pDstMCU[0]), OMX_Sts_BadArgErr); armRetArgErrIf(!armIs8ByteAligned(pDstMCU[1]), OMX_Sts_BadArgErr); armRetArgErrIf(!armIs8ByteAligned(pDstMCU[2]), OMX_Sts_BadArgErr); armRetArgErrIf(((srcStep > (-2 * JPEG_MCU_PIX_WIDTH_422)) && (srcStep < (2 * JPEG_MCU_PIX_WIDTH_422))), OMX_Sts_BadArgErr); armRetArgErrIf((srcStep % 2), OMX_Sts_BadArgErr); /* -------------------------------------------------------------------------- With input data (R, G, B) belonging to [0, 255] and output data (Y,Cb,Cr) expected in [-128, 127], CC equations in JPEG domain would be - Y = 0.29900*R + 0.58700*G + 0.11400*B - 128 Cb = -0.16874*R - 0.33126*G + 0.50000*B Cr = 0.50000*R - 0.41869*G - 0.08131*B The armComputeXFromRGB_JPEG() functions apart from doing the colour conversion, takes care of type-conversion from intermediate float values and clipping to S16, taking care of rounding errors. The cases of Nearest Neighbour interpolation and Bilinear interpolation are separately handled. -------------------------------------------------------------------------- */ y8x8 = (ARM_BLOCK8x8 *)pDstMCU[0]; pDstY = (OMX_S16 *)y8x8++; for(blk = 0; blk < 2; blk++) { pDstCb = pDstMCU[1] + blkOffset_UV[blk]; pDstCr = pDstMCU[2] + blkOffset_UV[blk]; pRGB = pSrc + blkOffset[blk]; for(i = 0; i < 8; i++) { for(j = 0; j < 4*2; j+=2) { armIPCS_UnpackBGR565(pSrc[j], &Bdata, &Gdata, &Rdata); armIPCS_UnpackBGR565(pSrc[j+1], &Bdata2, &Gdata2, &Rdata2); armIPCS_ComputeYFromRGB_JPEG_F32_S16(Rdata, Gdata, Bdata, pDstY++); armIPCS_ComputeYFromRGB_JPEG_F32_S16(Rdata2, Gdata2, Bdata2, pDstY++); { OMX_F32 interpPixR = (Rdata + Rdata2) / (OMX_F32)2; OMX_F32 interpPixG = (Gdata + Gdata2) / (OMX_F32)2; OMX_F32 interpPixB = (Bdata + Bdata2) / (OMX_F32)2; armIPCS_ComputeUFromRGB_JPEG_F32_S16(interpPixR, interpPixG, interpPixB, pDstCb++); armIPCS_ComputeVFromRGB_JPEG_F32_S16(interpPixR, interpPixG, interpPixB, pDstCr++); } } pDstCb += 4; pDstCr += 4; pRGB += srcStep>>1; } } return OMX_Sts_NoErr; } /* End of file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -