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

📄 ycbcr422pl_to_rgb565_p.h

📁 基于DM642平台的视频缩小放大功能 程序源代码
💻 H
字号:
/* ======================================================================== *//*  TEXAS INSTRUMENTS, INC.                                                 *//*                                                                          *//*  NAME                                                                    *//*      ycbcr422pl_to_rgb565 -- Planarized YCbCr 4:2:2 to 16-bit RGB 5:6:5  *//*                              color space conversion.                     *//*S                                                                        S*//*S AUTHOR                                                                 S*//*S     Joseph Zbiciak                                                     S*//*S                                                                        S*//*S REVISION HISTORY                                                       S*//*S     12-Aug-1999 Initial complete version . . . . . . .  J. Zbiciak     S*//*S     02-Sep-1999 Fix "coeff[0] < 0" case  . . . . . . .  J. Zbiciak     S*//*                                                                          *//*  USAGE                                                                   *//*      This function is C callable, and is called according to this        *//*      C prototype:                                                        *//*                                                                          *//*      void ycbcr422pl_to_rgb565                                           *//*      (                                                                   *//*          const short         coeff[5],  -- Matrix coefficients.          *//*          const unsigned char *y_data,   -- Luminence data  (Y')          *//*          const unsigned char *cb_data,  -- Blue color-diff (B'-Y')       *//*          const unsigned char *cr_data,  -- Red color-diff  (R'-Y')       *//*          unsigned short      *rgb_data, -- RGB 5:6:5 packed pixel out.   *//*          unsigned            num_pixels -- # of luma pixels to process.  *//*      )                                                                   *//*                                                                          *//*      The 'coeff[]' array contains the color-space-conversion matrix      *//*      coefficients.  The 'y_data', 'cb_data' and 'cr_data' pointers       *//*      point to the separate input image planes.  The 'rgb_data' pointer   *//*      points to the output image buffer, and must be word aligned.        *//*                                                                          *//*      The coefficients in the coeff array must be in signed Q13 form.     *//*      These coefficients correspond to the following matrix equation:     *//*                                                                          *//*          [ coeff[0] 0.0000   coeff[1] ]   [ Y' -  16 ]     [ R']         *//*          [ coeff[0] coeff[2] coeff[3] ] * [ Cb - 128 ]  =  [ G']         *//*          [ coeff[0] coeff[4] 0.0000   ]   [ Cr - 128 ]     [ B']         *//*                                                                          *//*  DESCRIPTION                                                             *//*      This kernel performs Y'CbCr to RGB conversion.  From the Color      *//*      FAQ, http://home.inforamp.net/~poynton/ColorFAQ.html :              *//*                                                                          *//*          Various scale factors are applied to (B'-Y') and (R'-Y')        *//*          for different applications.  The Y'PbPr scale factors are       *//*          optimized for component analog video.  The Y'CbCr scaling       *//*          is appropriate for component digital video, JPEG and MPEG.      *//*          Kodak's PhotoYCC(tm) uses scale factors optimized for the       *//*          gamut of film colors.  Y'UV scaling is appropriate as an        *//*          intermediate step in the formation of composite NTSC or PAL     *//*          video signals, but is not appropriate when the components       *//*          are keps separate.  Y'UV nomenclature is now used rather        *//*          loosely, and it sometimes denotes any scaling of (B'-Y')        *//*          and (R'-Y').  Y'IQ coding is obsolete.                          *//*                                                                          *//*      This code can perform various flavors of Y'CbCr to RGB conversion   *//*      as long as the offsets on Y, Cb, and Cr are -16, -128, and -128,    *//*      respectively, and the coefficients match the pattern shown.         *//*                                                                          *//*      The kernel implements the following matrix form, which involves 5   *//*      unique coefficients:                                                *//*                                                                          *//*          [ coeff[0] 0.0000   coeff[1] ]   [ Y' -  16 ]     [ R']         *//*          [ coeff[0] coeff[2] coeff[3] ] * [ Cb - 128 ]  =  [ G']         *//*          [ coeff[0] coeff[4] 0.0000   ]   [ Cr - 128 ]     [ B']         *//*                                                                          *//*      Below are some common coefficient sets, along with the matrix       *//*      equation that they correspond to.   Coefficients are in signed      *//*      Q13 notation, which gives a suitable balance between precision      *//*      and range.                                                          *//*                                                                          *//*      1.  Y'CbCr -> RGB conversion with RGB levels that correspond to     *//*          the 219-level range of Y'.  Expected ranges are [16..235] for   *//*          Y' and [16..240] for Cb and Cr.                                 *//*                                                                          *//*          coeff[] = { 0x2000, 0x2BDD, -0x0AC5, -0x1658, 0x3770 };         *//*                                                                          *//*          [ 1.0000    0.0000    1.3707 ]   [ Y' -  16 ]     [ R']         *//*          [ 1.0000   -0.3365   -0.6982 ] * [ Cb - 128 ]  =  [ G']         *//*          [ 1.0000    1.7324    0.0000 ]   [ Cr - 128 ]     [ B']         *//*                                                                          *//*      2.  Y'CbCr -> RGB conversion with the 219-level range of Y'         *//*          expanded to fill the full RGB dynamic range.  (The matrix has   *//*          been scaled by 255/219.)  Expected ranges are [16..235] for Y'  *//*          and [16..240] for Cb and Cr.                                    *//*                                                                          *//*          coeff[] = { 0x2543, 0x3313, -0x0C8A, -0x1A04, 0x408D };         *//*                                                                          *//*          [ 1.1644    0.0000    1.5960 ]   [ Y' -  16 ]     [ R']         *//*          [ 1.1644   -0.3918   -0.8130 ] * [ Cb - 128 ]  =  [ G']         *//*          [ 1.1644    2.0172    0.0000 ]   [ Cr - 128 ]     [ B']         *//*                                                                          *//*      Other scalings of the color differences (B'-Y') and (R'-Y')         *//*      (sometimes incorrectly referred to as U and V) are supported, as    *//*      long as the color differences are unsigned values centered around   *//*      128 rather than signed values centered around 0, as noted above.    *//*                                                                          *//*      In addition to performing plain color-space conversion, color       *//*      saturation can be adjusted by scaling coeff[1] through coeff[4].    *//*      Similarly, brightness can be adjusted by scaling coeff[0].          *//*      General hue adjustment can not be performed, however, due to the    *//*      two zeros hard-coded in the matrix.                                 *//*                                                                          *//*  TECHNIQUES                                                              *//*      Pixel replication is performed implicitly on chroma data to         *//*      reduce the total number of multiplies required.  The chroma         *//*      portion of the matrix is calculated once for each Cb, Cr pair,      *//*      and the result is added to both Y' samples.                         *//*                                                                          *//*      Luma is biased downwards to produce R, G, and B values that are     *//*      signed quantities centered around zero, rather than unsigned qtys.  *//*      This allows us to use SSHL to perform saturation, followed by a     *//*      quick XOR to correct the sign bits in the final packed pixels.      *//*      The required downward bias is 128 shifted left by the Q-point, 13.  *//*                                                                          *//*      To save some instructions, I transformed "(y0-16)*luma - (128<<13)" *//*      to the slightly more cryptic "y0*luma - (16*luma + (128<<13))".     *//*      This gives me the non-obvious but effective y_bias value            *//*      -((128 << 13) + 16*luma).  The transformation allows me to fit in   *//*      a 6 cycle loop.                                                     *//*                                                                          *//*      Because the loop accesses four different arrays at three different  *//*      strides, no memory accesses are allowed to parallelize in the       *//*      loop.  No bank conflicts should occur, as a result.                 *//*                                                                          *//*      Creatively constructed multiplies are used to avoid a bottleneck    *//*      on shifts in the loop.  In particular, the 5-bit mask 0xF8000000    *//*      doubles as a right-shift constant that happens to negate while      *//*      shifting.  This negation is reversed by merging the bits with a     *//*      SUB instead of an ADD or OR.                                        *//*                                                                          *//*  ASSUMPTIONS                                                             *//*      An even number of luma samples needs to be processed.               *//*                                                                          *//*  NOTES                                                                   *//*      n/a.                                                                *//*                                                                          *//*  SOURCE                                                                  *//*     Poynton, Charles et al.  "The Color FAQ,"  1999.                     *//*         http://home.inforamp.net/~poynton/ColorFAQ.html                  *//*                                                                          *//* ------------------------------------------------------------------------ *//*            Copyright (c) 1999 Texas Instruments, Incorporated.           *//*                           All Rights Reserved.                           *//* ======================================================================== */#ifndef _YCBCR422PL_TO_RGB565_P_H#define _YCBCR422PL_TO_RGB565_P_Hvoid ycbcr422pl_to_rgb565_sa(    const short         coeff[5],  /* Matrix coefficients.          */    const unsigned char *y_data,   /* Luminence data  (Y')          */    const unsigned char *cb_data,  /* Blue color-diff (B'-Y')       */    const unsigned char *cr_data,  /* Red color-diff  (R'-Y')       */    unsigned short      *rgb_data, /* RGB 5:6:5 packed pixel out.   */    unsigned            num_pixels /* # of luma pixels to process.  */);#endif/* ======================================================================== *//*  End of file:  ycbcr422pl_to_rgb565_p.h                                  *//* ------------------------------------------------------------------------ *//*            Copyright (c) 1999 Texas Instruments, Incorporated.           *//*                           All Rights Reserved.                           *//* ======================================================================== */

⌨️ 快捷键说明

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