亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gmc_altivec.c

?? 這是著名的TCPMP播放器在WINDWOWS,和WINCE下編譯通過的源程序.筆者對其中的LIBMAD庫做了針對ARM MPU的優化. 并增加了詞幕功能.
?? C
字號:
/*
 * GMC (Global Motion Compensation)
 * AltiVec-enabled
 * Copyright (c) 2003 Romain Dolbeau <romain@dolbeau.org>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include "../dsputil.h"

#include "gcc_fixes.h"

#include "dsputil_altivec.h"

/*
  altivec-enhanced gmc1. ATM this code assume stride is a multiple of 8,
  to preserve proper dst alignement.
*/
#define GMC1_PERF_COND (h==8)
void gmc1_altivec(uint8_t *dst /* align 8 */, uint8_t *src /* align1 */, int stride, int h, int x16, int y16, int rounder)
{
POWERPC_PERF_DECLARE(altivec_gmc1_num, GMC1_PERF_COND);
#ifdef ALTIVEC_USE_REFERENCE_C_CODE
    const int A=(16-x16)*(16-y16);
    const int B=(   x16)*(16-y16);
    const int C=(16-x16)*(   y16);
    const int D=(   x16)*(   y16);
    int i;

POWERPC_PERF_START_COUNT(altivec_gmc1_num, GMC1_PERF_COND);
    
    for(i=0; i<h; i++)
    {
        dst[0]= (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1] + rounder)>>8;
        dst[1]= (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2] + rounder)>>8;
        dst[2]= (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3] + rounder)>>8;
        dst[3]= (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4] + rounder)>>8;
        dst[4]= (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5] + rounder)>>8;
        dst[5]= (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6] + rounder)>>8;
        dst[6]= (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7] + rounder)>>8;
        dst[7]= (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8] + rounder)>>8;
        dst+= stride;
        src+= stride;
    }

POWERPC_PERF_STOP_COUNT(altivec_gmc1_num, GMC1_PERF_COND);

#else /* ALTIVEC_USE_REFERENCE_C_CODE */
    const unsigned short __attribute__ ((aligned(16))) rounder_a[8] =
      {rounder, rounder, rounder, rounder,
       rounder, rounder, rounder, rounder};
    const unsigned short __attribute__ ((aligned(16))) ABCD[8] =
      {
        (16-x16)*(16-y16), /* A */
        (   x16)*(16-y16), /* B */
        (16-x16)*(   y16), /* C */
        (   x16)*(   y16), /* D */
        0, 0, 0, 0         /* padding */
      };
    register const_vector unsigned char vczero = (const_vector unsigned char)vec_splat_u8(0);
    register const_vector unsigned short vcsr8 = (const_vector unsigned short)vec_splat_u16(8);
    register vector unsigned char dstv, dstv2, src_0, src_1, srcvA, srcvB, srcvC, srcvD;
    register vector unsigned short Av, Bv, Cv, Dv, rounderV, tempA, tempB, tempC, tempD;
    int i;
    unsigned long dst_odd = (unsigned long)dst & 0x0000000F;
    unsigned long src_really_odd = (unsigned long)src & 0x0000000F;


POWERPC_PERF_START_COUNT(altivec_gmc1_num, GMC1_PERF_COND);

    tempA = vec_ld(0, (unsigned short*)ABCD);
    Av = vec_splat(tempA, 0);
    Bv = vec_splat(tempA, 1);
    Cv = vec_splat(tempA, 2);
    Dv = vec_splat(tempA, 3);

    rounderV = vec_ld(0, (unsigned short*)rounder_a);
    
    // we'll be able to pick-up our 9 char elements
    // at src from those 32 bytes
    // we load the first batch here, as inside the loop
    // we can re-use 'src+stride' from one iteration
    // as the 'src' of the next.
    src_0 = vec_ld(0, src);
    src_1 = vec_ld(16, src);
    srcvA = vec_perm(src_0, src_1, vec_lvsl(0, src));
    
    if (src_really_odd != 0x0000000F)
    { // if src & 0xF == 0xF, then (src+1) is properly aligned on the second vector.
      srcvB = vec_perm(src_0, src_1, vec_lvsl(1, src));
    }
    else
    {
      srcvB = src_1;
    }
    srcvA = vec_mergeh(vczero, srcvA);
    srcvB = vec_mergeh(vczero, srcvB);
    
    for(i=0; i<h; i++)
    {
      dst_odd = (unsigned long)dst & 0x0000000F;
      src_really_odd = (((unsigned long)src) + stride) & 0x0000000F;
      
      dstv = vec_ld(0, dst);
      
      // we we'll be able to pick-up our 9 char elements
      // at src + stride from those 32 bytes
      // then reuse the resulting 2 vectors srvcC and srcvD
      // as the next srcvA and srcvB
      src_0 = vec_ld(stride + 0, src);
      src_1 = vec_ld(stride + 16, src);
      srcvC = vec_perm(src_0, src_1, vec_lvsl(stride + 0, src));
      
      if (src_really_odd != 0x0000000F)
      { // if src & 0xF == 0xF, then (src+1) is properly aligned on the second vector.
        srcvD = vec_perm(src_0, src_1, vec_lvsl(stride + 1, src));
      }
      else
      {
        srcvD = src_1;
      }
      
      srcvC = vec_mergeh(vczero, srcvC);
      srcvD = vec_mergeh(vczero, srcvD);
      

      // OK, now we (finally) do the math :-)
      // those four instructions replaces 32 int muls & 32 int adds.
      // isn't AltiVec nice ?
      tempA = vec_mladd((vector unsigned short)srcvA, Av, rounderV);
      tempB = vec_mladd((vector unsigned short)srcvB, Bv, tempA);
      tempC = vec_mladd((vector unsigned short)srcvC, Cv, tempB);
      tempD = vec_mladd((vector unsigned short)srcvD, Dv, tempC);
      
      srcvA = srcvC;
      srcvB = srcvD;
      
      tempD = vec_sr(tempD, vcsr8);
      
      dstv2 = vec_pack(tempD, (vector unsigned short)vczero);
      
      if (dst_odd)
      {
        dstv2 = vec_perm(dstv, dstv2, vcprm(0,1,s0,s1));
      }
      else
      {
        dstv2 = vec_perm(dstv, dstv2, vcprm(s0,s1,2,3));
      }
      
      vec_st(dstv2, 0, dst);
      
      dst += stride;
      src += stride;
    }

POWERPC_PERF_STOP_COUNT(altivec_gmc1_num, GMC1_PERF_COND);

#endif /* ALTIVEC_USE_REFERENCE_C_CODE */
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成精国产精品女| 5858s免费视频成人| 欧美国产成人精品| 成人18视频在线播放| 日韩美女视频一区二区| 在线看日本不卡| 视频一区二区欧美| 精品久久国产字幕高潮| 高清日韩电视剧大全免费| 国产精品毛片无遮挡高清| 色综合久久99| 天天影视网天天综合色在线播放| 日韩一级片在线观看| 久久爱www久久做| 日韩一区在线播放| 91精品免费在线观看| 国产精品1区二区.| 粉嫩13p一区二区三区| 中文字幕在线一区免费| 欧美在线一区二区| 精品在线一区二区| 亚洲视频在线观看三级| 正在播放一区二区| 成人av在线播放网站| 亚洲成人免费观看| 国产丝袜欧美中文另类| 欧美亚洲国产怡红院影院| 久久se精品一区精品二区| 亚洲人妖av一区二区| 日韩视频一区二区| 91蜜桃传媒精品久久久一区二区 | 精品久久一区二区| 成人激情免费视频| 免费三级欧美电影| 亚洲精品福利视频网站| 欧美成人a视频| 欧美优质美女网站| 国产成人在线视频播放| 日日夜夜免费精品| 亚洲精选一二三| 亚洲国产精品成人综合| 欧美一区二区成人| 色爱区综合激月婷婷| 国产麻豆精品一区二区| 爽好多水快深点欧美视频| 中文字幕一区二区三区不卡在线 | 日韩va欧美va亚洲va久久| 国产欧美精品一区二区色综合朱莉| 欧美调教femdomvk| 不卡高清视频专区| 国产精品一区二区在线观看不卡| 五月激情综合婷婷| 一区二区高清视频在线观看| 国产精品日产欧美久久久久| 日韩一二三四区| 欧美午夜理伦三级在线观看| 91丨porny丨蝌蚪视频| 国产一区二区三区视频在线播放| 视频一区二区中文字幕| 亚洲午夜成aⅴ人片| 亚洲视频在线一区观看| 国产精品免费视频观看| 久久影院午夜片一区| 精品免费国产二区三区| 日韩一级免费观看| 91精品欧美福利在线观看| 欧美日韩高清一区二区不卡| 欧美亚男人的天堂| 在线免费亚洲电影| 日本道免费精品一区二区三区| 99久久精品免费看| 国产欧美一二三区| 久久久99久久| 国产亚洲精品aa| 欧美激情在线一区二区| 国产亚洲欧洲997久久综合| 久久久国产一区二区三区四区小说 | 亚洲国产精品黑人久久久| 欧美国产一区二区在线观看| 国产日韩欧美综合在线| 国产精品天天摸av网| 中文字幕制服丝袜成人av| 中文字幕一区二区不卡| 亚洲免费av高清| 亚洲成人免费观看| 蜜臀久久99精品久久久久宅男| 精品一区二区三区在线观看| 国产乱码精品一区二区三区av | 中文字幕在线不卡国产视频| 亚洲欧美日韩国产成人精品影院 | 国产亚洲一区二区在线观看| 久久久噜噜噜久噜久久综合| 中文字幕 久热精品 视频在线 | 久久精品人人做人人爽人人| 国产精品视频一二三区| 亚洲图片欧美激情| 亚洲国产欧美在线人成| 日产精品久久久久久久性色 | 国产成人精品综合在线观看| 成人免费福利片| 欧美亚洲日本一区| 欧美一级在线视频| 久久精品在这里| 亚洲一区在线观看视频| 蜜臀av一级做a爰片久久| 国产不卡在线一区| 欧美视频一区在线| 精品福利av导航| 成人免费小视频| 日韩精品1区2区3区| 粉嫩欧美一区二区三区高清影视| 99re这里都是精品| 6080yy午夜一二三区久久| 欧美激情一区不卡| 亚洲高清免费一级二级三级| 国内欧美视频一区二区| 日本高清不卡一区| 欧美成人三级在线| 亚洲三级在线观看| 久久99国产精品尤物| 97精品视频在线观看自产线路二| 日韩一区二区三区精品视频 | 欧美日韩激情一区二区| 久久久久久免费网| 午夜精品久久久久久久99水蜜桃 | av电影在线观看一区| 欧美一区二区在线不卡| 《视频一区视频二区| 毛片不卡一区二区| 在线免费观看一区| 中文av一区二区| 国产毛片精品一区| 9191国产精品| 亚洲线精品一区二区三区| 国产成人亚洲综合a∨猫咪| 欧美一区二区在线不卡| 一区二区三区在线看| 国产精品一级在线| 日韩亚洲电影在线| 亚洲电影中文字幕在线观看| 成人网在线播放| 欧美精品一区二区三区蜜桃视频 | 久久蜜臀中文字幕| 日韩高清一区在线| 欧美日韩美少妇| 夜夜嗨av一区二区三区| 久久久久亚洲蜜桃| 蜜臀av一区二区在线免费观看| 欧美日韩亚洲不卡| 自拍偷拍国产亚洲| 99久久久精品| 自拍偷拍亚洲激情| 成人a区在线观看| 国产精品久久久久桃色tv| 国产成人综合在线| 国产亚洲综合在线| 国产成人自拍网| 久久精品一区二区三区av | 国产91露脸合集magnet| 26uuu亚洲综合色| 久久国产剧场电影| 精品福利二区三区| 国产精品一色哟哟哟| 国产欧美一区二区三区鸳鸯浴| 国产在线精品视频| 26uuu色噜噜精品一区| 精品午夜久久福利影院| 精品少妇一区二区三区| 久久疯狂做爰流白浆xx| 欧美大黄免费观看| 国产一区二区三区久久久 | 麻豆久久久久久| 日韩一区二区在线观看视频播放| 午夜精品福利在线| 欧美日韩小视频| 免费成人在线视频观看| 欧美成人艳星乳罩| 国产99精品在线观看| 中文字幕亚洲一区二区av在线 | 亚洲成人你懂的| 91精品国产高清一区二区三区 | 亚洲成人午夜影院| 日韩精品一区二区三区在线观看 | 色狠狠色噜噜噜综合网| 亚洲va欧美va国产va天堂影院| 欧美久久久久久久久中文字幕| 天堂va蜜桃一区二区三区漫画版| 欧美美女一区二区在线观看| 日本中文一区二区三区| 国产无一区二区| 91传媒视频在线播放| 蜜桃视频一区二区| 国产精品久久久久一区二区三区共| 91福利精品视频| 九一久久久久久| 日韩毛片在线免费观看| 午夜精品一区二区三区电影天堂| 日韩一区二区三区视频在线 | 91影院在线观看| 亚洲国产一区二区视频|