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

📄 vlc_deinterlace.cpp

📁 linux下实现视频播放的播放器
💻 CPP
字号:
/* *  Copyright (C) 2005-2007  gulikoza * *  Taken from VideoLAN project, original copyright: * *  Copyright (C) 2000, 2001, 2002, 2003 the VideoLAN team *  Author: Sam Hocevar <sam@zoy.org> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* $Id$ */#include "iptv.h"#include "VLC_deinterlace.h"#ifdef HAVE_ALTIVEC_H#include <altivec.h>#endif/*#if (C_HOSTCPU == X86) || (C_HOSTCPU == X86_64)#include "mmx.h"#endif*/// Function pointersMERGE Merge;END_MERGE EndMerge;void MergeGeneric( void *_p_dest, const void *_p_s1,                          const void *_p_s2, size_t i_bytes ){    uint8_t* p_dest = (uint8_t*)_p_dest;    const uint8_t *p_s1 = (const uint8_t *)_p_s1;    const uint8_t *p_s2 = (const uint8_t *)_p_s2;    uint8_t* p_end = p_dest + i_bytes - 8;    while( p_dest < p_end )    {        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;    }    p_end += 8;    while( p_dest < p_end )    {        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;    }}#if (C_HOSTCPU == X86) || (C_HOSTCPU == X86_64)void MergeMMXEXT( void *_p_dest, const void *_p_s1, const void *_p_s2,                         size_t i_bytes ){    uint8_t* p_dest = (uint8_t*)_p_dest;    const uint8_t *p_s1 = (const uint8_t *)_p_s1;    const uint8_t *p_s2 = (const uint8_t *)_p_s2;    uint8_t* p_end = p_dest + i_bytes - 8;    while( p_dest < p_end )    {        __asm__  __volatile__( "movq %2,%%mm1;"                               "pavgb %1, %%mm1;"                               "movq %%mm1, %0" :"=m" (*p_dest):                                                 "m" (*p_s1),                                                 "m" (*p_s2) );        p_dest += 8;        p_s1 += 8;        p_s2 += 8;    }    p_end += 8;    while( p_dest < p_end )    {        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;    }}void Merge3DNow( void *_p_dest, const void *_p_s1, const void *_p_s2,                        size_t i_bytes ){    uint8_t* p_dest = (uint8_t*)_p_dest;    const uint8_t *p_s1 = (const uint8_t *)_p_s1;    const uint8_t *p_s2 = (const uint8_t *)_p_s2;    uint8_t* p_end = p_dest + i_bytes - 8;    while( p_dest < p_end )    {        __asm__  __volatile__( "movq %2,%%mm1;"                               "pavgusb %1, %%mm1;"                               "movq %%mm1, %0" :"=m" (*p_dest):                                                 "m" (*p_s1),                                                 "m" (*p_s2) );        p_dest += 8;        p_s1 += 8;        p_s2 += 8;    }    p_end += 8;    while( p_dest < p_end )    {        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;    }}void MergeSSE2( void *_p_dest, const void *_p_s1, const void *_p_s2,                       size_t i_bytes ){    uint8_t* p_dest = (uint8_t*)_p_dest;    const uint8_t *p_s1 = (const uint8_t *)_p_s1;    const uint8_t *p_s2 = (const uint8_t *)_p_s2;    uint8_t* p_end;    /* Use C until the first 16-bytes aligned source pixel */    while( (intptr_t)p_s1 & 0xF )    {        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;    }    p_end = p_dest + i_bytes - 16;    while( p_dest < p_end )    {        __asm__  __volatile__( "movdqu %2,%%xmm1;"                               "pavgb %1, %%xmm1;"                               "movdqu %%xmm1, %0" :"=m" (*p_dest):                                                 "m" (*p_s1),                                                 "m" (*p_s2) );        p_dest += 16;        p_s1 += 16;        p_s2 += 16;    }    p_end += 16;    while( p_dest < p_end )    {        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;    }}void EndMMX( void ){    __asm__ __volatile__( "emms" :: );}void End3DNow( void ){    __asm__ __volatile__( "femms" :: );}#endif#ifdef HAVE_ALTIVEC_Hvoid MergeAltivec( void *_p_dest, const void *_p_s1,                          const void *_p_s2, size_t i_bytes ){    uint8_t *p_dest = (uint8_t *)_p_dest;    uint8_t *p_s1   = (uint8_t *)_p_s1;    uint8_t *p_s2   = (uint8_t *)_p_s2;    uint8_t *p_end  = p_dest + i_bytes - 15;    /* Use C until the first 16-bytes aligned destination pixel */    while( (int)p_dest & 0xF )    {        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;    }    if( ( (int)p_s1 & 0xF ) | ( (int)p_s2 & 0xF ) )    {        /* Unaligned source */        vector unsigned char s1v, s2v, destv;        vector unsigned char s1oldv, s2oldv, s1newv, s2newv;        vector unsigned char perm1v, perm2v;        perm1v = vec_lvsl( 0, p_s1 );        perm2v = vec_lvsl( 0, p_s2 );        s1oldv = vec_ld( 0, p_s1 );        s2oldv = vec_ld( 0, p_s2 );        while( p_dest < p_end )        {            s1newv = vec_ld( 16, p_s1 );            s2newv = vec_ld( 16, p_s2 );            s1v    = vec_perm( s1oldv, s1newv, perm1v );            s2v    = vec_perm( s2oldv, s2newv, perm2v );            s1oldv = s1newv;            s2oldv = s2newv;            destv  = vec_avg( s1v, s2v );            vec_st( destv, 0, p_dest );            p_s1   += 16;            p_s2   += 16;            p_dest += 16;        }    }    else    {        /* Aligned source */        vector unsigned char s1v, s2v, destv;        while( p_dest < p_end )        {            s1v   = vec_ld( 0, p_s1 );            s2v   = vec_ld( 0, p_s2 );            destv = vec_avg( s1v, s2v );            vec_st( destv, 0, p_dest );            p_s1   += 16;            p_s2   += 16;            p_dest += 16;        }    }    p_end += 15;    while( p_dest < p_end )    {        *p_dest++ = ( (uint16_t)(*p_s1++) + (uint16_t)(*p_s2++) ) >> 1;    }}#endif

⌨️ 快捷键说明

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