interpolate.c
上传用户:sunbaby
上传日期:2013-05-31
资源大小:242k
文件大小:13k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  *
  3.  *  T264 AVC CODEC
  4.  *
  5.  *  Copyright(C) 2004-2005 llcc <lcgate1@yahoo.com.cn>
  6.  *               2004-2005 visionany <visionany@yahoo.com.cn>
  7.  *
  8.  *  This program is free software ; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation ; either version 2 of the License, or
  11.  *  (at your option) any later version.
  12.  *
  13.  *  This program is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with this program ; if not, write to the Free Software
  20.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  21.  *
  22.  ****************************************************************************/
  23. #include "stdio.h"
  24. #include "T264.h"
  25. #include "interpolate.h"
  26. #include "bitstream.h"
  27. //  1/4 pixel search
  28. uint32_t
  29. T264_quarter_pixel_search(T264_t* t, int32_t list_index, uint8_t* src, T264_frame_t* refframe, int32_t offset, T264_vector_t* vec, T264_vector_t* vec_median, uint32_t sad_org, int32_t w, int32_t h, uint8_t* residual, int32_t mb_part)
  30. {
  31.     DECLARE_ALIGNED_MATRIX(data1, 16, 16, uint8_t, CACHE_SIZE);
  32.     DECLARE_ALIGNED_MATRIX(data2, 16, 16, uint8_t, CACHE_SIZE);
  33.     uint32_t sad = sad_org;
  34.     uint8_t* ref;
  35.     int16_t x, y;
  36.     int32_t ref_cost = REFCOST(vec[0].refno);
  37.     x = vec[0].x &= ~3;
  38.     y = vec[0].y &= ~3;
  39.     ref = refframe->Y[0] + offset + (y >> 2) * t->edged_stride + (x >> 2);
  40.     
  41.     if (t->flags & USE_HALFPEL)
  42.     {
  43.         uint8_t* refcur;
  44.        // right half pel
  45.         refcur = refframe->Y[1] + offset + (y >> 2) * t->edged_stride + (x >> 2);
  46.         sad = t->cmp[mb_part](src, t->stride, refcur, t->edged_stride) +
  47.             t->mb.lambda * (eg_size_se(t->bs, (x + 2) - vec_median[0].x) + 
  48.             eg_size_se(t->bs, y - vec_median[0].y)) + ref_cost;
  49.         if (sad < sad_org)
  50.         {
  51.             sad_org = sad;
  52.             vec[0].x = x + 2;
  53.             vec[0].y = y;
  54.             ref = refcur;
  55.         }
  56.         // left half pel
  57.         refcur --;
  58.         sad = t->cmp[mb_part](src, t->stride, refcur, t->edged_stride) +
  59.             t->mb.lambda * (eg_size_se(t->bs, (x - 2) - vec_median[0].x) + 
  60.             eg_size_se(t->bs, y - vec_median[0].y)) + ref_cost;
  61.         if (sad < sad_org)
  62.         {
  63.             sad_org = sad;
  64.             vec[0].x = x - 2;
  65.             vec[0].y = y;
  66.             ref = refcur;
  67.         }
  68.         // bottom half pel
  69.         refcur = refframe->Y[2] + offset + (y >> 2) * t->edged_stride + (x >> 2);
  70.         sad = t->cmp[mb_part](src, t->stride, refcur, t->edged_stride) +
  71.             t->mb.lambda * (eg_size_se(t->bs, x - vec_median[0].x) + 
  72.             eg_size_se(t->bs, y + 2 - vec_median[0].y)) + ref_cost;
  73.         if (sad < sad_org)
  74.         {
  75.             sad_org = sad;
  76.             vec[0].x = x;
  77.             vec[0].y = y + 2;
  78.             ref = refcur;
  79.         }
  80.         // top half pel
  81.         refcur -= t->edged_stride;
  82.         sad = t->cmp[mb_part](src, t->stride, refcur, t->edged_stride) +
  83.             t->mb.lambda * (eg_size_se(t->bs, x - vec_median[0].x) + 
  84.             eg_size_se(t->bs, y - 2 - vec_median[0].y)) + ref_cost;
  85.         if (sad < sad_org)
  86.         {
  87.             sad_org = sad;
  88.             vec[0].x = x;
  89.             vec[0].y = y - 2;
  90.             ref = refcur;
  91.         }
  92.         // bottom-right half pel
  93.         refcur = refframe->Y[3] + offset + (y >> 2) * t->edged_stride + (x >> 2);
  94.         sad = t->cmp[mb_part](src, t->stride, refcur, t->edged_stride) +
  95.             t->mb.lambda * (eg_size_se(t->bs, x + 2 - vec_median[0].x) + 
  96.             eg_size_se(t->bs, y + 2 - vec_median[0].y)) + ref_cost;
  97.         if (sad < sad_org)
  98.         {
  99.             sad_org = sad;
  100.             vec[0].x = x + 2;
  101.             vec[0].y = y + 2;
  102.             ref = refcur;
  103.         }
  104.         // bottom-left half pel
  105.         refcur --;
  106.         sad = t->cmp[mb_part](src, t->stride, refcur, t->edged_stride) +
  107.             t->mb.lambda * (eg_size_se(t->bs, x - 2 - vec_median[0].x) + 
  108.             eg_size_se(t->bs, y + 2 - vec_median[0].y)) + ref_cost;
  109.         if (sad < sad_org)
  110.         {
  111.             sad_org = sad;
  112.             vec[0].x = x - 2;
  113.             vec[0].y = y + 2;
  114.             ref = refcur;
  115.         }
  116.         // top-left half pel
  117.         refcur -= t->edged_stride;
  118.         sad = t->cmp[mb_part](src, t->stride, refcur, t->edged_stride) +
  119.             t->mb.lambda * (eg_size_se(t->bs, x - 2 - vec_median[0].x) + 
  120.             eg_size_se(t->bs, y - 2 - vec_median[0].y)) + ref_cost;
  121.         if (sad < sad_org)
  122.         {
  123.             sad_org = sad;
  124.             vec[0].x = x - 2;
  125.             vec[0].y = y - 2;
  126.             ref = refcur;
  127.         }
  128.         // top-right half pel
  129.         refcur ++;
  130.         sad = t->cmp[mb_part](src, t->stride, refcur, t->edged_stride) +
  131.             t->mb.lambda * (eg_size_se(t->bs, x + 2 - vec_median[0].x) + 
  132.             eg_size_se(t->bs, y - 2 - vec_median[0].y)) + ref_cost;
  133.         if (sad < sad_org)
  134.         {
  135.             sad_org = sad;
  136.             vec[0].x = x + 2;
  137.             vec[0].y = y - 2;
  138.             ref = refcur;
  139.         }
  140.         // quarter pel search
  141.         if (t->flags & USE_QUARTPEL)
  142.         {
  143.             int16_t n;
  144.             int32_t i;
  145.             uint8_t* p_min = data1;
  146.             uint8_t* p_buffer = data2;
  147.             uint32_t sad_half = sad_org;
  148.             static const int8_t index[2 * 2][8][8] = 
  149.             {
  150.                 {
  151.                     {0, 1, 0, 0, 0, 0, 1, 0}, {0, 1, 0, 0,-1, 0,-1, 0},
  152.                     {0, 2, 0, 0, 0, 0, 0, 1}, {0, 2, 0, 0, 0,-1, 0,-1},
  153.                     {2, 1, 0,-1,-1, 0,-1,-1}, {2, 1, 0,-1, 0, 0, 1,-1},
  154.                     {2, 1, 0, 0,-1, 0,-1, 1}, {2, 1, 0, 0, 0, 0, 1, 1}
  155.                 },
  156.                 {
  157.                     {0, 1, 1, 0, 0, 0, 1, 0}, {0, 1, 0, 0, 0, 0,-1, 0},
  158.                     {1, 3, 0, 0, 0, 0, 0, 1}, {1, 3, 0, 0, 0,-1, 0,-1},
  159.                     {2, 1, 0,-1, 0, 0,-1,-1}, {2, 1, 1,-1, 0, 0, 1,-1},
  160.                     {2, 1, 0, 0, 0, 0,-1, 1}, {2, 1, 1, 0, 0, 0, 1, 1}
  161.                 },
  162.                 {
  163.                     {2, 3, 0, 0, 0, 0, 1, 0}, {2, 3, 0, 0,-1, 0,-1, 0},
  164.                     {2, 0, 0, 0, 0, 1, 0, 1}, {2, 0, 0, 0, 0, 0, 0,-1},
  165.                     {2, 1, 0, 0,-1, 0,-1,-1}, {2, 1, 0, 0, 0, 0, 1,-1},
  166.                     {2, 1, 0, 0,-1, 1,-1, 1}, {2, 1, 0, 0, 0, 1, 1, 1}
  167.                 },
  168.                 {
  169.                     {3, 2, 0, 0, 1, 0, 1, 0}, {3, 2, 0, 0, 0, 0,-1, 0},
  170.                     {3, 1, 0, 0, 0, 1, 0, 1}, {3, 1, 0, 0, 0, 0, 0,-1},
  171.                     {1, 2, 0, 0, 0, 0,-1,-1}, {1, 2, 0, 0, 1, 0, 1,-1},
  172.                     {1, 2, 0, 1, 0, 0,-1, 1}, {1, 2, 0, 1, 1, 0, 1, 1}
  173.                 }
  174.             };
  175.             x = ((uint16_t)vec[0].x) & (uint16_t)~1;
  176.             y = ((uint16_t)vec[0].y) & (uint16_t)~1;
  177.             n = ((y & 2)) | ((x & 2) >> 1);
  178.             for(i = 0 ; i < t->subpel_pts ; i ++)
  179.             {
  180.                 t->pia[mb_part](
  181.                     t->ref[list_index][vec[0].refno]->Y[index[n][i][0]] + offset + ((y >> 2) + index[n][i][3]) * t->edged_stride + (x >> 2) + index[n][i][2],
  182.                     t->ref[list_index][vec[0].refno]->Y[index[n][i][1]] + offset + ((y >> 2) + index[n][i][5]) * t->edged_stride + (x >> 2) + index[n][i][4],
  183.                     t->edged_stride, t->edged_stride, p_buffer, 16);
  184.                 sad = t->cmp[mb_part](src, t->stride, p_buffer, 16) +
  185.                     t->mb.lambda * (eg_size_se(t->bs, x + index[n][i][6] - vec_median[0].x) + 
  186.                     eg_size_se(t->bs, y +index[n][i][7] - vec_median[0].y)) + ref_cost;
  187.                 if (sad < sad_org)
  188.                 {
  189.                     sad_org = sad;
  190.                     vec[0].x = x + index[n][i][6];
  191.                     vec[0].y = y + index[n][i][7];
  192.                     SWAP(uint8_t, p_min, p_buffer);
  193.                     //t->memcpy_stride_u(data, w, h, 16, residual, 16);
  194.                 }
  195.             }
  196.             if (sad_org < sad_half)
  197.             {
  198.                 t->memcpy_stride_u(p_min, w, h, 16, residual, 16);
  199.             }
  200.             else
  201.             {
  202.                 t->memcpy_stride_u(ref, w, h, t->edged_stride, residual, 16);
  203.             }
  204.         }
  205.         else
  206.         {
  207.             t->memcpy_stride_u(ref, w, h, t->edged_stride, residual, 16);
  208.         }
  209.         sad = sad_org;
  210.     }
  211.     else
  212.     {
  213.         // x & y always integer pel
  214.         t->memcpy_stride_u(ref, w, h, t->edged_stride, residual, 16);
  215.     }
  216.     return sad;
  217. }
  218. void
  219. T264_pia_u_c(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride,
  220.              int32_t w,int32_t h)
  221. {
  222.     int32_t i, j;
  223.     for(i = 0 ; i < h ; i ++)
  224.     {
  225.         for(j = 0 ; j < w ; j ++)
  226.         {
  227.             dst[j] = (p1[j] + p2[j] + 1) >> 1;
  228.         }
  229.         p1 += p1_stride;
  230.         p2 += p2_stride;
  231.         dst+= dst_stride;
  232.     }
  233. }
  234. #define PIAFUNC(w, h, base)    
  235. void                    
  236. T264_##base##_u_##w##x##h##_c(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride)  
  237. {   
  238.     T264_##base##_u_c(p1,p2,p1_stride, p2_stride,dst,dst_stride,w,h); 
  239. }
  240. PIAFUNC(16, 16, pia)
  241. PIAFUNC(16, 8,  pia)
  242. PIAFUNC(8,  16, pia)
  243. PIAFUNC(8,  8,  pia)
  244. PIAFUNC(8,  4,  pia)
  245. PIAFUNC(4,  8,  pia)
  246. PIAFUNC(4,  4,  pia)
  247. PIAFUNC(2,  2,  pia)
  248. void
  249. T264_eighth_pixel_mc_u_c(uint8_t* src, int32_t src_stride, uint8_t* dst, int16_t mvx, int16_t mvy, int32_t width, int32_t height)
  250. {
  251.     int32_t x, y;
  252.     int32_t i, j;
  253.     x = mvx & 0x7;
  254.     y = mvy & 0x7;
  255.     for (i = 0 ; i < height ; i ++)
  256.     {
  257.         for(j = 0 ; j < width ; j ++)
  258.         {
  259.             dst[j] = ((8 - x) * (8 - y) * src[j]  + x * (8 - y) * src[j + 1] + 
  260.                 (8 - x) * y * src[j + src_stride] + x * y * src[j + src_stride+ 1] + 32) >> 6;
  261.         }
  262.         src += src_stride;
  263.         dst += 8;
  264.     }
  265. }
  266. static __inline int32_t
  267. tapfilter_h(uint8_t* p)
  268. {
  269.     return p[-2] - 5 * p[-1] + 20 * p[0] + 20 * p[1] - 5 * p[2] + p[3];
  270. }
  271. void
  272. interpolate_halfpel_h_c(uint8_t* src, int32_t src_stride, uint8_t* dst, int32_t dst_stride, int32_t width, int32_t height)
  273. {
  274.     int32_t i, j;
  275.     int32_t tmp;
  276.     for (i = 0 ; i < height ; i ++)
  277.     {
  278.         for (j = 0 ; j < width ; j ++)
  279.         {
  280.             tmp = (tapfilter_h(src + j) + 16) >> 5;
  281.             dst[j] = CLIP1(tmp);
  282.         }
  283.         src += src_stride;
  284.         dst += dst_stride;
  285.     }
  286. }
  287. static __inline int32_t
  288. tapfilter_v(uint8_t* p, int32_t stride)
  289. {
  290.     return p[-2 * stride] - 5 * p[-stride] + 20 * p[0] + 20 * p[stride] - 5 * p[2 * stride] + p[3 * stride];
  291. }
  292. void
  293. interpolate_halfpel_v_c(uint8_t* src, int32_t src_stride, uint8_t* dst, int32_t dst_stride, int32_t width, int32_t height)
  294. {
  295.     int32_t i, j;
  296.     int32_t tmp;
  297.     for (i = 0 ; i < height ; i ++)
  298.     {
  299.         for (j = 0 ; j < width ; j ++)
  300.         {
  301.             tmp = (tapfilter_v(src + j, src_stride) + 16) >> 5;
  302.             dst[j] = CLIP1(tmp);
  303.         }
  304.         src += src_stride;
  305.         dst += dst_stride;
  306.     }
  307. }
  308. // use vertical to generate this pic
  309. void
  310. interpolate_halfpel_hv_c(uint8_t* src, int32_t src_stride, uint8_t* dst, int32_t dst_stride, int32_t width, int32_t height)
  311. {
  312.     int32_t i, j;
  313.     int32_t tmp;
  314.     for (i = 0 ; i < height + 0 ; i ++)
  315.     {
  316.         for (j = 0 ; j < width + 0 ; j ++)
  317.         {
  318.             tmp = (
  319.                   (src[j - 2 - 2 * src_stride] - 5 * src[j - 1 - 2 * src_stride] + 20 * src[j - 2 * src_stride] + 20 * src[j + 1 - 2 * src_stride] - 5 * src[j + 2 - 2 * src_stride] + src[j + 3 - 2 * src_stride]) +
  320.            (-5) * (src[j - 2 - 1 * src_stride] - 5 * src[j - 1 - 1 * src_stride] + 20 * src[j - 1 * src_stride] + 20 * src[j + 1 - 1 * src_stride] - 5 * src[j + 2 - 1 * src_stride] + src[j + 3 - 1 * src_stride]) +
  321.            (20) * (src[j - 2 - 0 * src_stride] - 5 * src[j - 1 - 0 * src_stride] + 20 * src[j - 0 * src_stride] + 20 * src[j + 1 - 0 * src_stride] - 5 * src[j + 2 - 0 * src_stride] + src[j + 3 - 0 * src_stride]) +
  322.            (20) * (src[j - 2 + 1 * src_stride] - 5 * src[j - 1 + 1 * src_stride] + 20 * src[j + 1 * src_stride] + 20 * src[j + 1 + 1 * src_stride] - 5 * src[j + 2 + 1 * src_stride] + src[j + 3 + 1 * src_stride]) +
  323.            (-5) * (src[j - 2 + 2 * src_stride] - 5 * src[j - 1 + 2 * src_stride] + 20 * src[j + 2 * src_stride] + 20 * src[j + 1 + 2 * src_stride] - 5 * src[j + 2 + 2 * src_stride] + src[j + 3 + 2 * src_stride]) +
  324.                   (src[j - 2 + 3 * src_stride] - 5 * src[j - 1 + 3 * src_stride] + 20 * src[j + 3 * src_stride] + 20 * src[j + 1 + 3 * src_stride] - 5 * src[j + 2 + 3 * src_stride] + src[j + 3 + 3 * src_stride]) +
  325.                   512) >> 10;
  326.             dst[j] = CLIP1(tmp);
  327.         }
  328.         src += src_stride;
  329.         dst += dst_stride;
  330.     }
  331. }