Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2000, 2001 Fabrice Bellard
  3.  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21.  
  22. #include "libavutil/avassert.h"
  23.  
  24. #include "bit_depth_template.c"
  25.  
  26. #define H264_CHROMA_MC(OPNAME, OP)\
  27. static void FUNCC(OPNAME ## h264_chroma_mc1)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\
  28.     pixel *dst = (pixel*)_dst;\
  29.     pixel *src = (pixel*)_src;\
  30.     const int A=(8-x)*(8-y);\
  31.     const int B=(  x)*(8-y);\
  32.     const int C=(8-x)*(  y);\
  33.     const int D=(  x)*(  y);\
  34.     int i;\
  35.     stride >>= sizeof(pixel)-1;\
  36.     \
  37.     av_assert2(x<8 && y<8 && x>=0 && y>=0);\
  38. \
  39.     if(D){\
  40.         for(i=0; i<h; i++){\
  41.             OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
  42.             dst+= stride;\
  43.             src+= stride;\
  44.         }\
  45.     }else{\
  46.         const int E= B+C;\
  47.         const int step= C ? stride : 1;\
  48.         for(i=0; i<h; i++){\
  49.             OP(dst[0], (A*src[0] + E*src[step+0]));\
  50.             dst+= stride;\
  51.             src+= stride;\
  52.         }\
  53.     }\
  54. }\
  55. static void FUNCC(OPNAME ## h264_chroma_mc2)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\
  56.     pixel *dst = (pixel*)_dst;\
  57.     pixel *src = (pixel*)_src;\
  58.     const int A=(8-x)*(8-y);\
  59.     const int B=(  x)*(8-y);\
  60.     const int C=(8-x)*(  y);\
  61.     const int D=(  x)*(  y);\
  62.     int i;\
  63.     stride >>= sizeof(pixel)-1;\
  64.     \
  65.     av_assert2(x<8 && y<8 && x>=0 && y>=0);\
  66. \
  67.     if(D){\
  68.         for(i=0; i<h; i++){\
  69.             OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
  70.             OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
  71.             dst+= stride;\
  72.             src+= stride;\
  73.         }\
  74.     }else{\
  75.         const int E= B+C;\
  76.         const int step= C ? stride : 1;\
  77.         for(i=0; i<h; i++){\
  78.             OP(dst[0], (A*src[0] + E*src[step+0]));\
  79.             OP(dst[1], (A*src[1] + E*src[step+1]));\
  80.             dst+= stride;\
  81.             src+= stride;\
  82.         }\
  83.     }\
  84. }\
  85. \
  86. static void FUNCC(OPNAME ## h264_chroma_mc4)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\
  87.     pixel *dst = (pixel*)_dst;\
  88.     pixel *src = (pixel*)_src;\
  89.     const int A=(8-x)*(8-y);\
  90.     const int B=(  x)*(8-y);\
  91.     const int C=(8-x)*(  y);\
  92.     const int D=(  x)*(  y);\
  93.     int i;\
  94.     stride >>= sizeof(pixel)-1;\
  95.     \
  96.     av_assert2(x<8 && y<8 && x>=0 && y>=0);\
  97. \
  98.     if(D){\
  99.         for(i=0; i<h; i++){\
  100.             OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
  101.             OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
  102.             OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
  103.             OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
  104.             dst+= stride;\
  105.             src+= stride;\
  106.         }\
  107.     }else{\
  108.         const int E= B+C;\
  109.         const int step= C ? stride : 1;\
  110.         for(i=0; i<h; i++){\
  111.             OP(dst[0], (A*src[0] + E*src[step+0]));\
  112.             OP(dst[1], (A*src[1] + E*src[step+1]));\
  113.             OP(dst[2], (A*src[2] + E*src[step+2]));\
  114.             OP(dst[3], (A*src[3] + E*src[step+3]));\
  115.             dst+= stride;\
  116.             src+= stride;\
  117.         }\
  118.     }\
  119. }\
  120. \
  121. static void FUNCC(OPNAME ## h264_chroma_mc8)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\
  122.     pixel *dst = (pixel*)_dst;\
  123.     pixel *src = (pixel*)_src;\
  124.     const int A=(8-x)*(8-y);\
  125.     const int B=(  x)*(8-y);\
  126.     const int C=(8-x)*(  y);\
  127.     const int D=(  x)*(  y);\
  128.     int i;\
  129.     stride >>= sizeof(pixel)-1;\
  130.     \
  131.     av_assert2(x<8 && y<8 && x>=0 && y>=0);\
  132. \
  133.     if(D){\
  134.         for(i=0; i<h; i++){\
  135.             OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
  136.             OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
  137.             OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
  138.             OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
  139.             OP(dst[4], (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5]));\
  140.             OP(dst[5], (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6]));\
  141.             OP(dst[6], (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7]));\
  142.             OP(dst[7], (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8]));\
  143.             dst+= stride;\
  144.             src+= stride;\
  145.         }\
  146.     }else{\
  147.         const int E= B+C;\
  148.         const int step= C ? stride : 1;\
  149.         for(i=0; i<h; i++){\
  150.             OP(dst[0], (A*src[0] + E*src[step+0]));\
  151.             OP(dst[1], (A*src[1] + E*src[step+1]));\
  152.             OP(dst[2], (A*src[2] + E*src[step+2]));\
  153.             OP(dst[3], (A*src[3] + E*src[step+3]));\
  154.             OP(dst[4], (A*src[4] + E*src[step+4]));\
  155.             OP(dst[5], (A*src[5] + E*src[step+5]));\
  156.             OP(dst[6], (A*src[6] + E*src[step+6]));\
  157.             OP(dst[7], (A*src[7] + E*src[step+7]));\
  158.             dst+= stride;\
  159.             src+= stride;\
  160.         }\
  161.     }\
  162. }
  163.  
  164. #define op_avg(a, b) a = (((a)+(((b) + 32)>>6)+1)>>1)
  165. #define op_put(a, b) a = (((b) + 32)>>6)
  166.  
  167. H264_CHROMA_MC(put_       , op_put)
  168. H264_CHROMA_MC(avg_       , op_avg)
  169. #undef op_avg
  170. #undef op_put
  171.