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

📄 transform.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
                        p_out_end -= p_outpic->p[i_index].i_pitch                                      - p_outpic->p[i_index].i_visible_pitch;                        p_line_end = p_in + p_pic->p[i_index].i_visible_lines *                            i_pitch;                        for( ; p_in < p_line_end ; )                        {                            p_line_end -= i_pitch;                            *(--p_out_end) = *p_line_end;                        }                        p_in++;                    }                }                else /* i_index == 1 or 2 */                {                    for( ; p_out < p_out_end ; )                    {                        uint8_t *p_line_end, *p_out_end2;                        p_out_end -= p_outpic->p[i_index].i_pitch                                      - p_outpic->p[i_index].i_visible_pitch;                        p_out_end2 = p_out_end - p_outpic->p[i_index].i_pitch;                        p_line_end = p_in + p_pic->p[i_index].i_visible_lines *                            i_pitch;                        for( ; p_in < p_line_end ; )                        {                            uint8_t p1, p2;                            p_line_end -= i_pitch;                            p1 = *p_line_end;                            p_line_end -= i_pitch;                            p2 = *p_line_end;                            /* Trick for (x+y)/2 without overflow, based on                             *   x + y == (x ^ y) + 2 * (x & y) */                            *(--p_out_end) = (p1 & p2) + ((p1 ^ p2) / 2);                            *(--p_out_end2) = (p1 & p2) + ((p1 ^ p2) / 2);                        }                        p_out_end = p_out_end2;                        p_in++;                    }                }            }            break;        case TRANSFORM_MODE_270:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                int i_pitch = p_pic->p[i_index].i_pitch;                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                uint8_t *p_out_end = p_out +                    p_outpic->p[i_index].i_visible_lines *                    p_outpic->p[i_index].i_pitch;                if( i_index == 0 )                {                    for( ; p_out < p_out_end ; )                    {                        uint8_t *p_in_end;                        p_in_end = p_in + p_pic->p[i_index].i_visible_lines *                            i_pitch;                        for( ; p_in < p_in_end ; )                        {                            p_in_end -= i_pitch;                            *p_out++ = *p_in_end;                        }                        p_out += p_outpic->p[i_index].i_pitch                                  - p_outpic->p[i_index].i_visible_pitch;                        p_in++;                    }                }                else /* i_index == 1 or 2 */                {                    for( ; p_out < p_out_end ; )                    {                        uint8_t *p_in_end, *p_out2;                        p_in_end = p_in + p_pic->p[i_index].i_visible_lines *                            i_pitch;                        p_out2 = p_out + p_outpic->p[i_index].i_pitch;                        for( ; p_in < p_in_end ; )                        {                            uint8_t p1, p2;                            p_in_end -= i_pitch;                            p1 = *p_in_end;                            p_in_end -= i_pitch;                            p2 = *p_in_end;                            /* Trick for (x+y)/2 without overflow, based on                             *   x + y == (x ^ y) + 2 * (x & y) */                            *p_out++ = (p1 & p2) + ((p1 ^ p2) / 2);                            *p_out2++ = (p1 & p2) + ((p1 ^ p2) / 2);                        }                        p_out2 += p_outpic->p[i_index].i_pitch                                   - p_outpic->p[i_index].i_visible_pitch;                        p_out = p_out2;                        p_in++;                    }                }            }            break;        default:            break;    }}static void FilterYUYV( vout_thread_t *p_vout,                        const picture_t *p_pic, picture_t *p_outpic ){    int i_index;    int i_y_offset, i_u_offset, i_v_offset;    if( GetPackedYuvOffsets( p_pic->format.i_chroma, &i_y_offset,                             &i_u_offset, &i_v_offset ) != VLC_SUCCESS )        return;    switch( p_vout->p_sys->i_mode )    {        case TRANSFORM_MODE_HFLIP:            /* Fall back on the default implementation */            FilterPlanar( p_vout, p_pic, p_outpic );            return;        case TRANSFORM_MODE_90:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                int i_pitch = p_pic->p[i_index].i_pitch;                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                uint8_t *p_out_end = p_out +                    p_outpic->p[i_index].i_visible_lines *                    p_outpic->p[i_index].i_pitch;                int i_offset  = i_u_offset;                int i_offset2 = i_v_offset;                for( ; p_out < p_out_end ; )                {                    uint8_t *p_line_end;                    p_out_end -= p_outpic->p[i_index].i_pitch                                  - p_outpic->p[i_index].i_visible_pitch;                    p_line_end = p_in + p_pic->p[i_index].i_visible_lines *                        i_pitch;                    for( ; p_in < p_line_end ; )                    {                        p_line_end -= i_pitch;                        p_out_end -= 4;                        p_out_end[i_y_offset+2] = p_line_end[i_y_offset];                        p_out_end[i_u_offset] = p_line_end[i_offset];                        p_line_end -= i_pitch;                        p_out_end[i_y_offset] = p_line_end[i_y_offset];                        p_out_end[i_v_offset] = p_line_end[i_offset2];                    }                    p_in += 2;                    {                        int a = i_offset;                        i_offset = i_offset2;                        i_offset2 = a;                    }                }            }            break;        case TRANSFORM_MODE_180:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_in_end = p_in + p_pic->p[i_index].i_visible_lines                                            * p_pic->p[i_index].i_pitch;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                for( ; p_in < p_in_end ; )                {                    uint8_t *p_line_start = p_in_end                                             - p_pic->p[i_index].i_pitch;                    p_in_end -= p_pic->p[i_index].i_pitch                                 - p_pic->p[i_index].i_visible_pitch;                    for( ; p_line_start < p_in_end ; )                    {                        p_in_end -= 4;                        p_out[i_y_offset] = p_in_end[i_y_offset+2];                        p_out[i_u_offset] = p_in_end[i_u_offset];                        p_out[i_y_offset+2] = p_in_end[i_y_offset];                        p_out[i_v_offset] = p_in_end[i_v_offset];                        p_out += 4;                    }                    p_out += p_outpic->p[i_index].i_pitch                              - p_outpic->p[i_index].i_visible_pitch;                }            }            break;        case TRANSFORM_MODE_270:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                int i_pitch = p_pic->p[i_index].i_pitch;                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                uint8_t *p_out_end = p_out +                    p_outpic->p[i_index].i_visible_lines *                    p_outpic->p[i_index].i_pitch;                int i_offset  = i_u_offset;                int i_offset2 = i_v_offset;                for( ; p_out < p_out_end ; )                {                    uint8_t *p_in_end;                    p_in_end = p_in                             + p_pic->p[i_index].i_visible_lines * i_pitch;                    for( ; p_in < p_in_end ; )                    {                        p_in_end -= i_pitch;                        p_out[i_y_offset] = p_in_end[i_y_offset];                        p_out[i_u_offset] = p_in_end[i_offset];                        p_in_end -= i_pitch;                        p_out[i_y_offset+2] = p_in_end[i_y_offset];                        p_out[i_v_offset] = p_in_end[i_offset2];                        p_out += 4;                    }                    p_out += p_outpic->p[i_index].i_pitch                           - p_outpic->p[i_index].i_visible_pitch;                    p_in += 2;                    {                        int a = i_offset;                        i_offset = i_offset2;                        i_offset2 = a;                    }                }            }            break;        case TRANSFORM_MODE_VFLIP:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_in_end = p_in + p_pic->p[i_index].i_visible_lines                                         * p_pic->p[i_index].i_pitch;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                for( ; p_in < p_in_end ; )                {                    uint8_t *p_line_end = p_in                                        + p_pic->p[i_index].i_visible_pitch;                    for( ; p_in < p_line_end ; )                    {                        p_line_end -= 4;                        p_out[i_y_offset] = p_line_end[i_y_offset+2];                        p_out[i_u_offset] = p_line_end[i_u_offset];                        p_out[i_y_offset+2] = p_line_end[i_y_offset];                        p_out[i_v_offset] = p_line_end[i_v_offset];                        p_out += 4;                    }                    p_in += p_pic->p[i_index].i_pitch;                }            }            break;        default:            break;    }}

⌨️ 快捷键说明

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