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

📄 sdl_yuv_sw.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
            L = *lum2++;            row2[0] = row2[next_row] = (rgb_2_pix[ L + cr_r ] |                                        rgb_2_pix[ L + crb_g ] |                                        rgb_2_pix[ L + cb_b ]);            row2++;        }        /*         * These values are at the start of the next line, (due         * to the ++'s above),but they need to be at the start         * of the line after that.         */        lum  += cols;        lum2 += cols;        row1 += mod;        row2 += mod;    }}static void Color24DitherYV12Mod2X( int *colortab, Uint32 *rgb_2_pix,                                    unsigned char *lum, unsigned char *cr,                                    unsigned char *cb, unsigned char *out,                                    int rows, int cols, int mod ){    unsigned int value;    unsigned char* row1 = out;    const int next_row = (cols*2 + mod) * 3;    unsigned char* row2 = row1 + 2*next_row;    unsigned char* lum2;    int x, y;    int cr_r;    int crb_g;    int cb_b;    int cols_2 = cols / 2;    lum2 = lum + cols;    mod = next_row*3 + mod*3;    y = rows / 2;    while( y-- )    {        x = cols_2;        while( x-- )        {            register int L;            cr_r   = 0*768+256 + colortab[ *cr + 0*256 ];            crb_g  = 1*768+256 + colortab[ *cr + 1*256 ]                               + colortab[ *cb + 2*256 ];            cb_b   = 2*768+256 + colortab[ *cb + 3*256 ];            ++cr; ++cb;            L = *lum++;            value = (rgb_2_pix[ L + cr_r ] |                     rgb_2_pix[ L + crb_g ] |                     rgb_2_pix[ L + cb_b ]);            row1[0+0] = row1[3+0] = row1[next_row+0] = row1[next_row+3+0] =                     (value      ) & 0xFF;            row1[0+1] = row1[3+1] = row1[next_row+1] = row1[next_row+3+1] =                     (value >>  8) & 0xFF;            row1[0+2] = row1[3+2] = row1[next_row+2] = row1[next_row+3+2] =                     (value >> 16) & 0xFF;            row1 += 2*3;            L = *lum++;            value = (rgb_2_pix[ L + cr_r ] |                     rgb_2_pix[ L + crb_g ] |                     rgb_2_pix[ L + cb_b ]);            row1[0+0] = row1[3+0] = row1[next_row+0] = row1[next_row+3+0] =                     (value      ) & 0xFF;            row1[0+1] = row1[3+1] = row1[next_row+1] = row1[next_row+3+1] =                     (value >>  8) & 0xFF;            row1[0+2] = row1[3+2] = row1[next_row+2] = row1[next_row+3+2] =                     (value >> 16) & 0xFF;            row1 += 2*3;            /* Now, do second row. */            L = *lum2++;            value = (rgb_2_pix[ L + cr_r ] |                     rgb_2_pix[ L + crb_g ] |                     rgb_2_pix[ L + cb_b ]);            row2[0+0] = row2[3+0] = row2[next_row+0] = row2[next_row+3+0] =                     (value      ) & 0xFF;            row2[0+1] = row2[3+1] = row2[next_row+1] = row2[next_row+3+1] =                     (value >>  8) & 0xFF;            row2[0+2] = row2[3+2] = row2[next_row+2] = row2[next_row+3+2] =                     (value >> 16) & 0xFF;            row2 += 2*3;            L = *lum2++;            value = (rgb_2_pix[ L + cr_r ] |                     rgb_2_pix[ L + crb_g ] |                     rgb_2_pix[ L + cb_b ]);            row2[0+0] = row2[3+0] = row2[next_row+0] = row2[next_row+3+0] =                     (value      ) & 0xFF;            row2[0+1] = row2[3+1] = row2[next_row+1] = row2[next_row+3+1] =                     (value >>  8) & 0xFF;            row2[0+2] = row2[3+2] = row2[next_row+2] = row2[next_row+3+2] =                     (value >> 16) & 0xFF;            row2 += 2*3;        }        /*         * These values are at the start of the next line, (due         * to the ++'s above),but they need to be at the start         * of the line after that.         */        lum  += cols;        lum2 += cols;        row1 += mod;        row2 += mod;    }}static void Color32DitherYV12Mod2X( int *colortab, Uint32 *rgb_2_pix,                                    unsigned char *lum, unsigned char *cr,                                    unsigned char *cb, unsigned char *out,                                    int rows, int cols, int mod ){    unsigned int* row1 = (unsigned int*) out;    const int next_row = cols*2+mod;    unsigned int* row2 = row1 + 2*next_row;    unsigned char* lum2;    int x, y;    int cr_r;    int crb_g;    int cb_b;    int cols_2 = cols / 2;    lum2 = lum + cols;    mod = (next_row * 3) + mod;    y = rows / 2;    while( y-- )    {        x = cols_2;        while( x-- )        {            register int L;            cr_r   = 0*768+256 + colortab[ *cr + 0*256 ];            crb_g  = 1*768+256 + colortab[ *cr + 1*256 ]                               + colortab[ *cb + 2*256 ];            cb_b   = 2*768+256 + colortab[ *cb + 3*256 ];            ++cr; ++cb;            L = *lum++;            row1[0] = row1[1] = row1[next_row] = row1[next_row+1] =                                       (rgb_2_pix[ L + cr_r ] |                                        rgb_2_pix[ L + crb_g ] |                                        rgb_2_pix[ L + cb_b ]);            row1 += 2;            L = *lum++;            row1[0] = row1[1] = row1[next_row] = row1[next_row+1] =                                       (rgb_2_pix[ L + cr_r ] |                                        rgb_2_pix[ L + crb_g ] |                                        rgb_2_pix[ L + cb_b ]);            row1 += 2;            /* Now, do second row. */            L = *lum2++;            row2[0] = row2[1] = row2[next_row] = row2[next_row+1] =                                       (rgb_2_pix[ L + cr_r ] |                                        rgb_2_pix[ L + crb_g ] |                                        rgb_2_pix[ L + cb_b ]);            row2 += 2;            L = *lum2++;            row2[0] = row2[1] = row2[next_row] = row2[next_row+1] =                                       (rgb_2_pix[ L + cr_r ] |                                        rgb_2_pix[ L + crb_g ] |                                        rgb_2_pix[ L + cb_b ]);            row2 += 2;        }        /*         * These values are at the start of the next line, (due         * to the ++'s above),but they need to be at the start         * of the line after that.         */        lum  += cols;        lum2 += cols;        row1 += mod;        row2 += mod;    }}static void Color16DitherYUY2Mod1X( int *colortab, Uint32 *rgb_2_pix,                                    unsigned char *lum, unsigned char *cr,                                    unsigned char *cb, unsigned char *out,                                    int rows, int cols, int mod ){    unsigned short* row;    int x, y;    int cr_r;    int crb_g;    int cb_b;    int cols_2 = cols / 2;    row = (unsigned short*) out;    y = rows;    while( y-- )    {        x = cols_2;        while( x-- )        {            register int L;            cr_r   = 0*768+256 + colortab[ *cr + 0*256 ];            crb_g  = 1*768+256 + colortab[ *cr + 1*256 ]                               + colortab[ *cb + 2*256 ];            cb_b   = 2*768+256 + colortab[ *cb + 3*256 ];            cr += 4; cb += 4;            L = *lum; lum += 2;            *row++ = (rgb_2_pix[ L + cr_r ] |                       rgb_2_pix[ L + crb_g ] |                       rgb_2_pix[ L + cb_b ]);            L = *lum; lum += 2;            *row++ = (rgb_2_pix[ L + cr_r ] |                       rgb_2_pix[ L + crb_g ] |                       rgb_2_pix[ L + cb_b ]);        }        row += mod;    }}static void Color24DitherYUY2Mod1X( int *colortab, Uint32 *rgb_2_pix,                                    unsigned char *lum, unsigned char *cr,                                    unsigned char *cb, unsigned char *out,                                    int rows, int cols, int mod ){    unsigned int value;    unsigned char* row;    int x, y;    int cr_r;    int crb_g;    int cb_b;    int cols_2 = cols / 2;    row = (unsigned char*) out;    mod *= 3;    y = rows;    while( y-- )    {        x = cols_2;        while( x-- )        {            register int L;            cr_r   = 0*768+256 + colortab[ *cr + 0*256 ];            crb_g  = 1*768+256 + colortab[ *cr + 1*256 ]                               + colortab[ *cb + 2*256 ];            cb_b   = 2*768+256 + colortab[ *cb + 3*256 ];            cr += 4; cb += 4;            L = *lum; lum += 2;            value = (rgb_2_pix[ L + cr_r ] |                     rgb_2_pix[ L + crb_g ] |                     rgb_2_pix[ L + cb_b ]);            *row++ = (value      ) & 0xFF;            *row++ = (value >>  8) & 0xFF;            *row++ = (value >> 16) & 0xFF;            L = *lum; lum += 2;            value = (rgb_2_pix[ L + cr_r ] |                     rgb_2_pix[ L + crb_g ] |                     rgb_2_pix[ L + cb_b ]);            *row++ = (value      ) & 0xFF;            *row++ = (value >>  8) & 0xFF;            *row++ = (value >> 16) & 0xFF;        }        row += mod;    }}static void Color32DitherYUY2Mod1X( int *colortab, Uint32 *rgb_2_pix,                                    unsigned char *lum, unsigned char *cr,                                    unsigned char *cb, unsigned char *out,                                    int rows, int cols, int mod ){    unsigned int* row;    int x, y;    int cr_r;    int crb_g;    int cb_b;    int cols_2 = cols / 2;    row = (unsigned int*) out;    y = rows;    while( y-- )    {        x = cols_2;        while( x-- )        {            register int L;            cr_r   = 0*768+256 + colortab[ *cr + 0*256 ];            crb_g  = 1*768+256 + colortab[ *cr + 1*256 ]                               + colortab[ *cb + 2*256 ];            cb_b   = 2*768+256 + colortab[ *cb + 3*256 ];            cr += 4; cb += 4;            L = *lum; lum += 2;            *row++ = (rgb_2_pix[ L + cr_r ] |                       rgb_2_pix[ L + crb_g ] |                       rgb_2_pix[ L + cb_b ]);            L = *lum; lum += 2;            *row++ = (rgb_2_pix[ L + cr_r ] |                       rgb_2_pix[ L + crb_g ] |                       rgb_2_pix[ L + cb_b ]);        }        row += mod;    }}/* * In this function I make use of a nasty trick. The tables have the lower * 16 bits replicated in the upper 16. This means I can write ints and get * the horisontal doubling for free (almost). */static void Color16DitherYUY2Mod2X( int *colortab, Uint32 *rgb_2_pix,                                    unsigned char *lum, unsigned char *cr,                                    unsigned char *cb, unsigned char *out,                                    int rows, int cols, int mod ){    unsigned int* row = (unsigned int*) out;    const int next_row = cols+(mod/2);    int x, y;    int cr_r;    int crb_g;    int cb_b;    int cols_2 = cols / 2;    y = rows;    while( y-- )    {        x = cols_2;        while( x-- )        {            register int L;            cr_r   = 0*768+256 + colortab[ *cr + 0*256 ];            crb_g  = 1*768+256 + colortab[ *cr + 1*256 ]                               + colortab[ *cb + 2*256 ];            cb_b   = 2*768+256 + colortab[ *cb + 3*256 ];            cr += 4; cb += 4;            L = *lum; lum += 2;            row[0] = row[next_row] = (rgb_2_pix[ L + cr_r ] |                                        rgb_2_pix[ L + crb_g ] |                                        rgb_2_pix[ L + cb_b ]);            row++;            L = *lum; lum += 2;            row[0] = row[next_row] = (rgb_2_pix[ L + cr_r ] |                                        rgb_2_pix[ L + crb_g ] |                                        rgb_2_pix[ L + cb_b ]);            row++;        }        row += next_row;    }}static void Color24DitherYUY2Mod2X( int *colortab, Uint32 *rgb_2_pix,                                    unsigned char *lum, unsigned char *cr,                                    unsigned char *cb, unsigned char *out,                                    int rows, int cols, int mod ){    unsigned int value;    unsigned char* row = out;    const int next_row = (cols*2 + mod) * 3;    int x, y;    int cr_r;    int crb_g;    int cb_b;    int cols_2 = cols / 2;    y = rows;    while( y-- )    {        x = cols_2;        while( x-- )        {            register int L;            cr_r   = 0*768+256 + colortab[ *cr + 0*256 ];            crb_g  = 1*768+256 + colortab[ *cr + 1*256 ]                               + colortab[ *cb + 2*256 ];            cb_b   = 2*768+256 + colortab[ *cb + 3*256 ];            cr += 4; cb += 4;            L = *lum; lum += 2;            value = (rgb_2_pix[ L + cr_r ] |                     rgb_2_pix[ L + crb_g ] |                     rgb_2_pix[ L + cb_b ]);            row[0+0] = row[3+0] = row[next_row+0] = row[next_row+3+0] =                     (value      ) & 0xFF;            row[0+1] = row[3+1] = row[next_row+1] = row[next_row+3+1] =                     (value >>  8) & 0xFF;            row[0+2] = row[3+2] = row[next_row+2] = row[next_row+3+2] =                     (value >> 16) & 0xFF;            row += 2*3;            L = *lum; lum += 2;            value = (rgb_2_pix[ L + cr_r ] |                     rgb_2_pix[ L + crb_g ] |                     rgb_2_pix[ L + cb_b ]);            row[0+0] = row[3+0] = row[next_row+0] = row[next_row+3+0] =                     (value      ) & 0xFF;            row[0+1] = row[3+1] = row[next_row+1] = row[next_row+3+1] =                     (value >>  8) & 0xFF;            row[0+2] = row[3+2] = row[next_row+2] = row[next_row+3+2] =                     (value >> 16) & 0xFF;            row += 2*3;        }        row += next_row;    }}static void Color32DitherYUY2Mod2X( int *colortab, Uint32 *rgb_2_pix,                                    unsigned char *lum, unsigned char *cr,                                    unsigned char *cb, unsigned char *out,

⌨️ 快捷键说明

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