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

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. *   2005.2.24 CloudWu<sywu@sohu.com> added support for B-frame MB16x16 support 
  8. *   2005.3.2 CloudWu<sywu@sohu.com> added support for B-frame MB16x8 and MB8x16,MB8x8 support
  9. *
  10. *  This program is free software ; you can redistribute it and/or modify
  11. *  it under the terms of the GNU General Public License as published by
  12. *  the Free Software Foundation ; either version 2 of the License, or
  13. *  (at your option) any later version.
  14. *
  15. *  This program is distributed in the hope that it will be useful,
  16. *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  17. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. *  GNU General Public License for more details.
  19. *
  20. *  You should have received a copy of the GNU General Public License
  21. *  along with this program ; if not, write to the Free Software
  22. *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  23. *
  24. ****************************************************************************/
  25. #include "stdio.h"
  26. #include "T264.h"
  27. #include "utility.h"
  28. #ifndef CHIP_DM642
  29. #include "memory.h"
  30. #endif
  31. #include "assert.h"
  32. #include "block.h"
  33. /* intra */
  34. static void __inline
  35. T264dec_mb_decode_predict_i16x16_y(T264_t* t, uint8_t mode, uint8_t* pred, uint8_t* src)
  36. {
  37.     DECLARE_ALIGNED_MATRIX(topcache, 1, 16 + CACHE_SIZE, uint8_t, CACHE_SIZE);
  38.     DECLARE_ALIGNED_MATRIX(leftcache, 1, 16 + CACHE_SIZE, uint8_t, CACHE_SIZE);
  39.     uint8_t* p;
  40.     int32_t i;
  41.     uint8_t* top, *left;
  42.     top  =  &topcache[CACHE_SIZE];
  43.     left = &leftcache[CACHE_SIZE];
  44.     if (mode == Intra_16x16_DC)
  45.     {
  46.         if ((t->mb.mb_neighbour & (MB_LEFT | MB_TOP)) == (MB_LEFT | MB_TOP))
  47.         {
  48.             mode = Intra_16x16_DC;
  49.             p = src - t->edged_stride;
  50.             for(i = 0 ; i < 16 ; i ++)
  51.             {
  52.                 top[i] = p[i];
  53.             }
  54.             p = src - 1;
  55.             for(i = 0 ; i < 16 ; i ++)
  56.             {
  57.                 left[i] = p[0];
  58.                 p += t->edged_stride;
  59.             }
  60.         }
  61.         else if(t->mb.mb_neighbour & MB_LEFT)
  62.         {
  63.             mode = Intra_16x16_DCLEFT;
  64.             p = src - 1;
  65.             for(i = 0 ; i < 16 ; i ++)
  66.             {
  67.                 left[i] = p[0];
  68.                 p += t->edged_stride;
  69.             }
  70.         }
  71.         else if(t->mb.mb_neighbour & MB_TOP)
  72.         {
  73.             mode = Intra_16x16_DCTOP;
  74.             p = src - t->edged_stride;
  75.             for(i = 0 ; i < 16 ; i ++)
  76.             {
  77.                 top[i] = p[i];
  78.             }
  79.         }
  80.         else
  81.         {
  82.             mode = Intra_16x16_DC128;
  83.         }
  84.     }
  85.     else
  86.     {
  87.         switch(mode)
  88.         {
  89.         case Intra_16x16_TOP:
  90.             p = src - t->edged_stride;
  91.             for(i = 0 ; i < 16 ; i ++)
  92.             {
  93.                 top[i] = p[i];
  94.             }
  95.             break;
  96.         case Intra_16x16_LEFT:
  97.             p = src - 1;
  98.             for(i = 0 ; i < 16 ; i ++)
  99.             {
  100.                 left[i] = p[0];
  101.                 p += t->edged_stride;
  102.             }
  103.             break;
  104.         case Intra_16x16_PLANE:
  105.             p = src - t->edged_stride;
  106.             for(i = -1 ; i < 16 ; i ++)
  107.             {
  108.                 top[i] = p[i];
  109.             }
  110.             p -= 1;
  111.             for(i = -1 ; i < 16 ; i ++)
  112.             {
  113.                 left[i] = p[0];
  114.                 p += t->edged_stride;
  115.             }
  116.             break;
  117.         default:
  118.             assert(0);
  119.             break;
  120.         }
  121.     }
  122.     t->pred16x16[mode](pred, 16, top, left);
  123. }
  124. static void __inline
  125. T264dec_mb_decode_predict_i4x4_y(T264_t* t, uint8_t idx, uint8_t mode, uint8_t* pred, uint8_t* src)
  126. {
  127.     DECLARE_ALIGNED_MATRIX(topcache,  8 + CACHE_SIZE, 1, uint8_t, CACHE_SIZE);
  128.     DECLARE_ALIGNED_MATRIX(leftcache, 4 + CACHE_SIZE, 1, uint8_t, CACHE_SIZE);
  129.     static const int32_t neighbour[] =
  130.     {
  131.         0, MB_LEFT, MB_LEFT, MB_LEFT,
  132.         MB_TOP| MB_TOPRIGHT, MB_LEFT| MB_TOP,              MB_LEFT |MB_TOP| MB_TOPRIGHT, MB_LEFT| MB_TOP,
  133.         MB_TOP| MB_TOPRIGHT, MB_LEFT| MB_TOP| MB_TOPRIGHT, MB_LEFT |MB_TOP| MB_TOPRIGHT, MB_LEFT| MB_TOP,
  134.         MB_TOP| MB_TOPRIGHT, MB_LEFT| MB_TOP,              MB_LEFT |MB_TOP| MB_TOPRIGHT, MB_LEFT| MB_TOP
  135.     };
  136.     static const int32_t fix[] =
  137.     {
  138.         ~0, ~0, ~0, ~0,
  139.         ~0, ~MB_TOPRIGHT, ~0, ~MB_TOPRIGHT,
  140.         ~0, ~0, ~0, ~MB_TOPRIGHT,
  141.         ~0, ~MB_TOPRIGHT, ~0, ~MB_TOPRIGHT
  142.     };
  143.     uint8_t* p;
  144.     int32_t i;
  145.     uint8_t* top  = &topcache[CACHE_SIZE];
  146.     uint8_t* left = &leftcache[CACHE_SIZE];
  147.     if (mode == Intra_4x4_DC)
  148.     {
  149.         int32_t mb_neighbour = (t->mb.mb_neighbour| neighbour[idx]) & fix[idx];
  150.         if ((mb_neighbour & (MB_LEFT | MB_TOP)) == (MB_LEFT | MB_TOP))
  151.         {
  152.             mode = Intra_4x4_DC;
  153.             p = src - t->edged_stride;
  154.             for(i = 0 ; i < 4 ; i ++)
  155.             {
  156.                 top[i] = p[i];
  157.             }
  158.             p = src - 1;
  159.             for(i = 0 ; i < 4 ; i ++)
  160.             {
  161.                 left[i] = p[0];
  162.                 p += t->edged_stride;
  163.             }
  164.         }
  165.         else if(mb_neighbour & MB_LEFT)
  166.         {
  167.             mode = Intra_4x4_DCLEFT;
  168.             p = src - 1;
  169.             for(i = 0 ; i < 4 ; i ++)
  170.             {
  171.                 left[i] = p[0];
  172.                 p += t->edged_stride;
  173.             }
  174.         }
  175.         else if(mb_neighbour & MB_TOP)
  176.         {
  177.             mode = Intra_4x4_DCTOP;
  178.             p = src - t->edged_stride;
  179.             for(i = 0 ; i < 4 ; i ++)
  180.             {
  181.                 top[i] = p[i];
  182.             }
  183.         }
  184.         else
  185.         {
  186.             mode = Intra_4x4_DC128;
  187.         }
  188.     }
  189.     else
  190.     {
  191.         switch(mode)
  192.         {
  193.         case Intra_4x4_TOP:
  194.             p = src - t->edged_stride;
  195.             for(i = 0 ; i < 4 ; i ++)
  196.             {
  197.                 top[i] = p[i];
  198.             }
  199.             break;
  200.         case Intra_4x4_LEFT:
  201.         case Intra_4x4_HORIZONTAL_UP:
  202.             p = src - 1;
  203.             for(i = 0 ; i < 4 ; i ++)
  204.             {
  205.                 left[i] = p[0];
  206.                 p += t->edged_stride;
  207.             }
  208.             break;
  209.         case Intra_4x4_DIAGONAL_DOWNLEFT:
  210.         case Intra_4x4_VERTICAL_LEFT:
  211.             {
  212.                 int32_t mb_neighbour = (t->mb.mb_neighbour| neighbour[idx]) & fix[idx];
  213.             
  214.                 p = src - t->edged_stride;
  215.                 if((idx & 3) == 3 && t->mb.mb_x == t->mb_width - 1)    //if is the right-most sub-block, if is th last MB in horizontal, no top-right exist
  216.                     mb_neighbour &= ~MB_TOPRIGHT;
  217.                 if (mb_neighbour & MB_TOPRIGHT)
  218.                 {
  219.                     for(i = 0 ; i < 8 ; i ++)
  220.                     {
  221.                         top[i] = p[i];
  222.                     }
  223.                 }
  224.                 else
  225.                 {
  226.                     for(i = 0 ; i < 4 ; i ++)
  227.                     {
  228.                         top[i] = p[i];
  229.                     }
  230.                     top[4] = p[3];
  231.                     top[5] = p[3];
  232.                     top[6] = p[3];
  233.                     top[7] = p[3];
  234.                 }
  235.             }
  236.             break;
  237.         case Intra_4x4_DIAGONAL_DOWNRIGHT:
  238.         case Intra_4x4_VERTICAL_RIGHT:
  239.         case Intra_4x4_HORIZONTAL_DOWN:
  240.             p = src - t->edged_stride;
  241.             for(i = -1 ; i < 4 ; i ++)
  242.             {
  243.                 top[i] = p[i];
  244.             }
  245.             p -= 1;
  246.             for(i = -1 ; i < 4 ; i ++)
  247.             {
  248.                 left[i] = p[0];
  249.                 p += t->edged_stride;
  250.             }
  251.             break;
  252.         default:
  253.             assert(0);
  254.             break;
  255.         }
  256.     }
  257.     t->pred4x4[mode](pred, 4, top, left);
  258. }
  259. static void __inline
  260. T264dec_mb_decode_predict_i8x8_y(T264_t* t, uint8_t mode, uint8_t* pred_u, uint8_t* pred_v)
  261. {
  262.     DECLARE_ALIGNED_MATRIX(topcacheu, 1, 8 + CACHE_SIZE, uint8_t, CACHE_SIZE);
  263.     DECLARE_ALIGNED_MATRIX(leftcacheu, 1, 8 + CACHE_SIZE, uint8_t, CACHE_SIZE);
  264.     DECLARE_ALIGNED_MATRIX(topcachev, 1, 8 + CACHE_SIZE, uint8_t, CACHE_SIZE);
  265.     DECLARE_ALIGNED_MATRIX(leftcachev, 1, 8 + CACHE_SIZE, uint8_t, CACHE_SIZE);
  266.     uint8_t* p_u, *p_v;
  267.     int32_t i;
  268.     uint8_t* top_u, *left_u;
  269.     uint8_t* top_v, *left_v;
  270.     top_u  = &topcacheu[CACHE_SIZE];
  271.     top_v  = &topcachev[CACHE_SIZE];
  272.     left_u = &leftcacheu[CACHE_SIZE];
  273.     left_v = &leftcachev[CACHE_SIZE];
  274.     if (mode == Intra_8x8_DC)
  275.     {
  276.         if ((t->mb.mb_neighbour & (MB_LEFT | MB_TOP)) == (MB_LEFT | MB_TOP))
  277.         {
  278.             mode = Intra_8x8_DC;
  279.             p_u = t->mb.src_u - t->edged_stride_uv;
  280.             p_v = t->mb.src_v - t->edged_stride_uv;
  281.             for(i = 0 ; i < 8 ; i ++)
  282.             {
  283.                 top_u[i] = p_u[i];
  284.                 top_v[i] = p_v[i];
  285.             }
  286.             p_u = t->mb.src_u - 1;
  287.             p_v = t->mb.src_v - 1;
  288.             for(i = 0 ; i < 8 ; i ++)
  289.             {
  290.                 left_u[i] = p_u[0];
  291.                 left_v[i] = p_v[0];
  292.                 p_u += t->edged_stride_uv;
  293.                 p_v += t->edged_stride_uv;
  294.             }
  295.         }
  296.         else if(t->mb.mb_neighbour & MB_LEFT)
  297.         {
  298.             mode = Intra_8x8_DCLEFT;
  299.             p_u = t->mb.src_u - 1;
  300.             p_v = t->mb.src_v - 1;
  301.             for(i = 0 ; i < 8 ; i ++)
  302.             {
  303.                 left_u[i] = p_u[0];
  304.                 left_v[i] = p_v[0];
  305.                 p_u += t->edged_stride_uv;
  306.                 p_v += t->edged_stride_uv;
  307.             }
  308.         }
  309.         else if(t->mb.mb_neighbour & MB_TOP)
  310.         {
  311.             mode = Intra_8x8_DCTOP;
  312.             p_u = t->mb.src_u - t->edged_stride_uv;
  313.             p_v = t->mb.src_v - t->edged_stride_uv;
  314.             for(i = 0 ; i < 8 ; i ++)
  315.             {
  316.                 top_u[i] = p_u[i];
  317.                 top_v[i] = p_v[i];
  318.             }
  319.         }
  320.         else
  321.         {
  322.             mode = Intra_8x8_DC128;
  323.         }
  324.     }
  325.     else
  326.     {
  327.         switch(mode)
  328.         {
  329.         case Intra_8x8_TOP:
  330.             p_u = t->mb.src_u - t->edged_stride_uv;
  331.             p_v = t->mb.src_v - t->edged_stride_uv;
  332.             for(i = 0 ; i < 8 ; i ++)
  333.             {
  334.                 top_u[i] = p_u[i];
  335.                 top_v[i] = p_v[i];
  336.             }
  337.             break;
  338.         case Intra_8x8_LEFT:
  339.             p_u = t->mb.src_u - 1;
  340.             p_v = t->mb.src_v - 1;
  341.             for(i = 0 ; i < 8 ; i ++)
  342.             {
  343.                 left_u[i] = p_u[0];
  344.                 left_v[i] = p_v[0];
  345.                 p_u += t->edged_stride_uv;
  346.                 p_v += t->edged_stride_uv;
  347.             }
  348.             break;
  349.         case Intra_8x8_PLANE:
  350.             p_u = t->mb.src_u - t->edged_stride_uv;
  351.             p_v = t->mb.src_v - t->edged_stride_uv;
  352.             for(i = -1 ; i < 8 ; i ++)
  353.             {
  354.                 top_u[i] = p_u[i];
  355.                 top_v[i] = p_v[i];
  356.             }
  357.             p_u -= 1;
  358.             p_v -= 1;
  359.             for(i = -1 ; i < 8 ; i ++)
  360.             {
  361.                 left_u[i] = p_u[0];
  362.                 p_u += t->edged_stride_uv;
  363.                 left_v[i] = p_v[0];
  364.                 p_v += t->edged_stride_uv;
  365.             }
  366.             break;
  367.         default:
  368.             assert(0);
  369.             break;
  370.         }
  371.     }
  372.     t->pred8x8[mode](pred_u, 8, top_u, left_u);
  373.     t->pred8x8[mode](pred_v, 8, top_v, left_v);
  374. }
  375. static void __inline
  376. T264dec_mb_decode_i16x16_y(T264_t* t)
  377. {
  378.     DECLARE_ALIGNED_MATRIX(dct, 1+16, 16, int16_t, CACHE_SIZE);
  379.  
  380.     int32_t qp = t->qp_y;
  381.     int32_t i;
  382.     int16_t* curdct;
  383.     uint8_t* src;
  384.     
  385.     src = t->mb.src_y;
  386.     T264dec_mb_decode_predict_i16x16_y(t, t->mb.mode_i16x16, t->mb.pred_i16x16, src);
  387.     unscan_zig_4x4( t->mb.dc4x4_z, dct + 256 );
  388.     t->iquant4x4dc(dct + 256, qp);
  389.     t->idct4x4dc(dct + 256);
  390.     curdct = dct;
  391.     for( i = 0; i < 16; i++ )
  392.     {
  393.         unscan_zig_4x4( t->mb.dct_y_z[luma_index[i]], curdct );
  394.         t->iquant4x4( curdct, qp );
  395.         curdct[0] = dct[256 + i];
  396.         t->idct4x4(curdct);
  397.         curdct += 16;
  398.     }
  399.     t->contract16to8add(dct, 16 / 4, 16 / 4, t->mb.pred_i16x16, src, t->edged_stride);
  400. }
  401. static void __inline
  402. T264dec_mb_decode_i4x4_y(T264_t* t)
  403. {
  404.     DECLARE_ALIGNED_MATRIX(pred, 4, 5, uint8_t, CACHE_SIZE);
  405.     DECLARE_ALIGNED_MATRIX(dct, 1, 16, int16_t, 16);
  406.     int32_t qp = t->qp_y;
  407.     int32_t i;
  408.     uint8_t* src;
  409.     for(i = 0 ; i < 16 ; i ++)
  410.     {
  411.         int32_t row = i / 4;
  412.         int32_t col = i % 4;
  413.         src = t->mb.src_y + (row * t->edged_stride << 2) + (col << 2);
  414.         T264dec_mb_decode_predict_i4x4_y(t, i, t->mb.mode_i4x4[luma_index[i]], pred, src);
  415.         unscan_zig_4x4(t->mb.dct_y_z[luma_index[i]], dct);
  416.         t->iquant4x4(dct, qp);
  417.         t->idct4x4(dct);
  418.         t->contract16to8add(dct, 4 / 4, 4 / 4, pred, src, t->edged_stride);
  419.     }
  420. }
  421. void
  422. T264dec_mb_decode_intra_y(T264_t* t)
  423. {
  424.     if (t->mb.mb_mode == I_4x4)
  425.         T264dec_mb_decode_i4x4_y(t);
  426.     else
  427.         T264dec_mb_decode_i16x16_y(t);
  428. }
  429. void
  430. T264dec_mb_decode_uv(T264_t* t, uint8_t* pred_u, uint8_t* pred_v)
  431. {
  432.     DECLARE_ALIGNED_MATRIX(dct, 10, 8, int16_t, CACHE_SIZE);
  433.     int32_t qp = t->qp_uv;
  434.     int32_t i, j;
  435.     int16_t* curdct;
  436.     uint8_t* start;
  437.     uint8_t* src;
  438.     start = pred_u;
  439.     src   = t->mb.src_u;
  440.     
  441.     for(j = 0 ; j < 2 ; j ++)
  442.     {
  443.         unscan_zig_2x2(t->mb.dc2x2_z[j], dct + 64);
  444.         t->iquant2x2dc(dct + 64, qp);
  445.         t->idct2x2dc(dct + 64);
  446.         curdct = dct;
  447.         for(i = 0 ; i < 4 ; i ++)
  448.         {
  449.             unscan_zig_4x4(t->mb.dct_uv_z[j][i], curdct);
  450.             t->iquant4x4(curdct, qp);
  451.             curdct[0] = dct[64 + i];
  452.             t->idct4x4(curdct);
  453.             curdct += 16;
  454.         }
  455.         t->contract16to8add(dct, 8 / 4, 8 / 4, start, src, t->edged_stride_uv);
  456.         //
  457.         // change to v
  458.         //
  459.         start = pred_v;
  460.         src   = t->mb.src_v;
  461.     }
  462. }
  463. void
  464. T264dec_mb_decode_intra_uv(T264_t* t)
  465. {
  466.     T264dec_mb_decode_predict_i8x8_y(t, t->mb.mb_mode_uv, t->mb.pred_i8x8u, t->mb.pred_i8x8v);
  467.     T264dec_mb_decode_uv(t, t->mb.pred_i8x8u, t->mb.pred_i8x8v);
  468. }
  469. void
  470. T264dec_mb_decode_interp_mc(T264_t* t, uint8_t* ref)
  471. {
  472.     T264_vector_t vec;
  473.     uint8_t* tmp;
  474.     int32_t x, y;
  475.     int32_t i;
  476.     int32_t list_index = 0;
  477.     static const int8_t index[4][4][6] = 
  478.     {
  479.         {{0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 0}, {1, 0, 0, 0, 1, 0}},
  480.         {{0, 2, 0, 0, 0, 0}, {1, 2, 0, 0, 0, 0}, {1, 3, 0, 0, 0, 0}, {1, 2, 0, 0, 1, 0}},
  481.         {{2, 2, 0, 0, 0, 0}, {2, 3, 0, 0, 0, 0}, {3, 3, 0, 0, 0, 0}, {3, 2, 0, 0, 1, 0}},
  482.         {{2, 0, 0, 0, 0, 1}, {2, 1, 0, 0, 0, 1}, {3, 1, 0, 0, 0, 1}, {1, 2, 0, 1, 1, 0}}
  483.     };
  484.     switch(t->mb.mb_part)
  485.     {
  486.     case MB_16x16:
  487.         vec = t->mb.vec[0][0];
  488.         x = (vec.x & 3);
  489.         y = (vec.y & 3);
  490.         if (index[y][x][0] == index[y][x][1])
  491.         {
  492.             tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2)) * t->edged_stride + 
  493.                 ((t->mb.mb_x << 4) + (vec.x >> 2));
  494.             t->memcpy_stride_u(tmp, 16, 16, t->edged_stride, ref, 16);
  495.         }
  496.         else
  497.         {
  498.             t->pia[MB_16x16](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2], 
  499.                 t->ref[list_index][vec.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4],
  500.                 t->edged_stride, t->edged_stride, ref, 16);
  501.         }
  502.         break;
  503.     case MB_16x8:
  504.         vec = t->mb.vec[0][0];
  505.         x = (vec.x & 3);
  506.         y = (vec.y & 3);
  507.         if (index[y][x][0] == index[y][x][1])
  508.         {
  509.             tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2)) * t->edged_stride + 
  510.                 ((t->mb.mb_x << 4) + (vec.x >> 2));
  511.             t->memcpy_stride_u(tmp, 16, 8, t->edged_stride, ref, 16);
  512.         }
  513.         else
  514.         {
  515.             t->pia[MB_16x8](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2], 
  516.                 t->ref[list_index][vec.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4],
  517.                 t->edged_stride, t->edged_stride, ref, 16);
  518.         }
  519.         vec = t->mb.vec[0][8];
  520.         x = (vec.x & 3);
  521.         y = (vec.y & 3);
  522.         if (index[y][x][0] == index[y][x][1])
  523.         {
  524.             tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + 8) * t->edged_stride + 
  525.                 ((t->mb.mb_x << 4) + (vec.x >> 2));
  526.             t->memcpy_stride_u(tmp, 16, 8, t->edged_stride, ref + 16 * 8, 16);
  527.         }
  528.         else
  529.         {
  530.             t->pia[MB_16x8](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3] + 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2], 
  531.                 t->ref[list_index][vec.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5] + 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4],
  532.                 t->edged_stride, t->edged_stride, ref + 16 * 8, 16);
  533.         }
  534.         break;
  535.     case MB_8x16:
  536.         vec = t->mb.vec[0][0];
  537.         x = (vec.x & 3);
  538.         y = (vec.y & 3);
  539.         if (index[y][x][0] == index[y][x][1])
  540.         {
  541.             tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2)) * t->edged_stride + 
  542.                 ((t->mb.mb_x << 4) + (vec.x >> 2));
  543.             t->memcpy_stride_u(tmp, 8, 16, t->edged_stride, ref, 16);
  544.         }
  545.         else
  546.         {
  547.             t->pia[MB_8x16](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2], 
  548.                 t->ref[list_index][vec.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4],
  549.                 t->edged_stride, t->edged_stride, ref, 16);
  550.         }
  551.         vec = t->mb.vec[0][2];
  552.         x = (vec.x & 3);
  553.         y = (vec.y & 3);
  554.         if (index[y][x][0] == index[y][x][1])
  555.         {
  556.             tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2)) * t->edged_stride + 
  557.                 ((t->mb.mb_x << 4) + (vec.x >> 2)) + 8;
  558.             t->memcpy_stride_u(tmp, 8, 16, t->edged_stride, ref + 8, 16);
  559.         }
  560.         else
  561.         {
  562.             t->pia[MB_8x16](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2] + 8, 
  563.                 t->ref[list_index][vec.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4] + 8,
  564.                 t->edged_stride, t->edged_stride, ref + 8, 16);
  565.         }
  566.         break;
  567.     case MB_8x8:
  568.     case MB_8x8ref0:
  569.         for(i = 0 ; i < 4 ; i ++)
  570.         {
  571.             int32_t offset1, offset2;
  572.             switch(t->mb.submb_part[luma_index[4 * i]]) 
  573.             {
  574.             case MB_8x8:
  575.                 vec = t->mb.vec[0][luma_index[4 * i]];
  576.                 x = (vec.x & 3);
  577.                 y = (vec.y & 3);
  578.                 if (index[y][x][0] == index[y][x][1])
  579.                 {
  580.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + i / 2 * 8) * t->edged_stride + ((t->mb.mb_x << 4) + (vec.x >> 2)) + i % 2 * 8;
  581.                     tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1;
  582.                     t->memcpy_stride_u(tmp, 8, 8, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8, 16);
  583.                 }
  584.                 else
  585.                 {
  586.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2] + i % 2 * 8;
  587.                     offset2 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4] + i % 2 * 8;
  588.                     t->pia[MB_8x8](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1, 
  589.                         t->ref[list_index][vec.refno]->Y[index[y][x][1]] + offset2,
  590.                         t->edged_stride, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8, 
  591.                         16);
  592.                 }
  593.                 break;
  594.             case MB_8x4:
  595.                 vec = t->mb.vec[0][luma_index[4 * i]];
  596.                 x = (vec.x & 3);
  597.                 y = (vec.y & 3);
  598.                 if (index[y][x][0] == index[y][x][1])
  599.                 {
  600.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + i / 2 * 8) * t->edged_stride + ((t->mb.mb_x << 4) + (vec.x >> 2)) + i % 2 * 8;
  601.                     tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1;
  602.                     t->memcpy_stride_u(tmp, 8, 4, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8, 16);
  603.                 }
  604.                 else
  605.                 {
  606.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2] + i % 2 * 8;
  607.                     offset2 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4] + i % 2 * 8;
  608.                     t->pia[MB_8x4](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1, 
  609.                         t->ref[list_index][vec.refno]->Y[index[y][x][1]] + offset2,
  610.                         t->edged_stride, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8, 
  611.                         16);
  612.                 }
  613.                 vec = t->mb.vec[0][luma_index[4 * i + 2]];
  614.                 x = (vec.x & 3);
  615.                 y = (vec.y & 3);
  616.                 if (index[y][x][0] == index[y][x][1])
  617.                 {
  618.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + i / 2 * 8 + 4) * t->edged_stride + ((t->mb.mb_x << 4) + (vec.x >> 2)) + i % 2 * 8;
  619.                     tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1;
  620.                     t->memcpy_stride_u(tmp, 8, 4, t->edged_stride, ref + i / 2  * 16 * 8 + 64 + i % 2 * 8, 16);
  621.                 }
  622.                 else
  623.                 {
  624.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3] + i / 2 * 8 + 4) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2] + i % 2 * 8;
  625.                     offset2 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5] + i / 2 * 8 + 4) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4] + i % 2 * 8;
  626.                     t->pia[MB_8x4](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1, 
  627.                         t->ref[list_index][vec.refno]->Y[index[y][x][1]] + offset2,
  628.                         t->edged_stride, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8 + 64, 
  629.                         16);
  630.                 }
  631.                 break;
  632.             case MB_4x8:
  633.                 vec = t->mb.vec[0][luma_index[4 * i]];
  634.                 x = (vec.x & 3);
  635.                 y = (vec.y & 3);
  636.                 if (index[y][x][0] == index[y][x][1])
  637.                 {
  638.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + i / 2 * 8) * t->edged_stride + ((t->mb.mb_x << 4) + (vec.x >> 2)) + i % 2 * 8;
  639.                     tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1;
  640.                     t->memcpy_stride_u(tmp, 4, 8, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8, 16);
  641.                 }
  642.                 else
  643.                 {
  644.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2] + i % 2 * 8;
  645.                     offset2 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4] + i % 2 * 8;
  646.                     t->pia[MB_4x8](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1, 
  647.                         t->ref[list_index][vec.refno]->Y[index[y][x][1]] + offset2,
  648.                         t->edged_stride, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8, 
  649.                         16);
  650.                 }
  651.                 vec = t->mb.vec[0][luma_index[4 * i + 1]];
  652.                 x = (vec.x & 3);
  653.                 y = (vec.y & 3);
  654.                 if (index[y][x][0] == index[y][x][1])
  655.                 {
  656.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + i / 2 * 8) * t->edged_stride + ((t->mb.mb_x << 4) + (vec.x >> 2)) + i % 2 * 8 + 4;
  657.                     tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1;
  658.                     t->memcpy_stride_u(tmp, 4, 8, t->edged_stride, ref + i / 2  * 16 * 8 + i % 2 * 8 + 4, 16);
  659.                 }
  660.                 else
  661.                 {
  662.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2] + i % 2 * 8 + 4;
  663.                     offset2 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4] + i % 2 * 8 + 4;
  664.                     t->pia[MB_4x8](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1, 
  665.                         t->ref[list_index][vec.refno]->Y[index[y][x][1]] + offset2,
  666.                         t->edged_stride, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8 + 4, 
  667.                         16);
  668.                 }
  669.                 break;
  670.             case MB_4x4:
  671.                 vec = t->mb.vec[0][luma_index[4 * i]];
  672.                 x = (vec.x & 3);
  673.                 y = (vec.y & 3);
  674.                 if (index[y][x][0] == index[y][x][1])
  675.                 {
  676.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + i / 2 * 8) * t->edged_stride + ((t->mb.mb_x << 4) + (vec.x >> 2)) + i % 2 * 8;
  677.                     tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1;
  678.                     t->memcpy_stride_u(tmp, 4, 4, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8, 16);
  679.                 }
  680.                 else
  681.                 {
  682.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2] + i % 2 * 8;
  683.                     offset2 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4] + i % 2 * 8;
  684.                     t->pia[MB_4x4](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1, 
  685.                         t->ref[list_index][vec.refno]->Y[index[y][x][1]] + offset2,
  686.                         t->edged_stride, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8, 
  687.                         16);
  688.                 }
  689.                 vec = t->mb.vec[0][luma_index[4 * i + 1]];
  690.                 x = (vec.x & 3);
  691.                 y = (vec.y & 3);
  692.                 if (index[y][x][0] == index[y][x][1])
  693.                 {
  694.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + i / 2 * 8) * t->edged_stride + ((t->mb.mb_x << 4) + (vec.x >> 2)) + i % 2 * 8 + 4;
  695.                     tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1;
  696.                     t->memcpy_stride_u(tmp, 4, 4, t->edged_stride, ref + i / 2  * 16 * 8 + i % 2 * 8 + 4, 16);
  697.                 }
  698.                 else
  699.                 {
  700.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2] + i % 2 * 8 + 4;
  701.                     offset2 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4] + i % 2 * 8 + 4;
  702.                     t->pia[MB_4x4](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1, 
  703.                         t->ref[list_index][vec.refno]->Y[index[y][x][1]] + offset2,
  704.                         t->edged_stride, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8 + 4, 
  705.                         16);
  706.                 }
  707.                 vec = t->mb.vec[0][luma_index[4 * i + 2]];
  708.                 x = (vec.x & 3);
  709.                 y = (vec.y & 3);
  710.                 if (index[y][x][0] == index[y][x][1])
  711.                 {
  712.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + i / 2 * 8 + 4) * t->edged_stride + ((t->mb.mb_x << 4) + (vec.x >> 2)) + i % 2 * 8;
  713.                     tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1;
  714.                     t->memcpy_stride_u(tmp, 4, 4, t->edged_stride, ref + i / 2  * 16 * 8 + 64 + i % 2 * 8, 16);
  715.                 }
  716.                 else
  717.                 {
  718.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3] + i / 2 * 8 + 4) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2] + i % 2 * 8;
  719.                     offset2 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5] + i / 2 * 8 + 4) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4] + i % 2 * 8;
  720.                     t->pia[MB_4x4](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1, 
  721.                         t->ref[list_index][vec.refno]->Y[index[y][x][1]] + offset2,
  722.                         t->edged_stride, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8 + 64, 
  723.                         16);
  724.                 }
  725.                 vec = t->mb.vec[0][luma_index[4 * i + 3]];
  726.                 x = (vec.x & 3);
  727.                 y = (vec.y & 3);
  728.                 if (index[y][x][0] == index[y][x][1])
  729.                 {
  730.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + i / 2 * 8 + 4) * t->edged_stride + ((t->mb.mb_x << 4) + (vec.x >> 2)) + i % 2 * 8 + 4;
  731.                     tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1;
  732.                     t->memcpy_stride_u(tmp, 4, 4, t->edged_stride, ref + i / 2  * 16 * 8 + 64 + i % 2 * 8 + 4, 16);
  733.                 }
  734.                 else
  735.                 {
  736.                     offset1 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3] + i / 2 * 8 + 4) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2] + i % 2 * 8 + 4;
  737.                     offset2 = ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5] + i / 2 * 8 + 4) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4] + i % 2 * 8 + 4;
  738.                     t->pia[MB_4x4](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + offset1, 
  739.                         t->ref[list_index][vec.refno]->Y[index[y][x][1]] + offset2,
  740.                         t->edged_stride, t->edged_stride, ref + i / 2 * 16 * 8 + i % 2 * 8 + 64 + 4, 
  741.                         16);
  742.                 }
  743.                 break;
  744.             }
  745.         }
  746.         break;
  747.     default:
  748.         assert(0);
  749.         break;
  750.     }
  751. }
  752. void
  753. T264dec_mb_decode_interp_transform(T264_t* t, uint8_t* ref)
  754. {
  755.     DECLARE_ALIGNED_MATRIX(dct, 16, 16, int16_t, 16);
  756.  
  757.     int16_t* curdct = dct;
  758.     int32_t i;
  759.     for(i = 0 ; i < 16 ; i ++)
  760.     {
  761.         unscan_zig_4x4(t->mb.dct_y_z[luma_index[i]], curdct);
  762.         t->iquant4x4(curdct, t->qp_y);
  763.         t->idct4x4(curdct);
  764.         curdct += 16;
  765.     }
  766.     t->contract16to8add(dct, 16 / 4, 16 / 4, ref, t->mb.src_y, t->edged_stride);
  767. }
  768. void 
  769. T264dec_mb_decode_interp_y(T264_t* t)
  770. {
  771.     T264dec_mb_decode_interp_mc(t, t->mb.pred_p16x16);
  772.     T264dec_mb_decode_interp_transform(t, t->mb.pred_p16x16);
  773. }
  774. void 
  775. T264dec_mb_decode_interp_uv(T264_t* t)
  776. {
  777.     DECLARE_ALIGNED_MATRIX(pred_u, 8, 8, uint8_t, CACHE_SIZE);
  778.     DECLARE_ALIGNED_MATRIX(pred_v, 8, 8, uint8_t, CACHE_SIZE);
  779.     T264_vector_t vec;
  780.     uint8_t* src, *dst;
  781.     uint8_t* src_u, *dst_u;
  782.     int32_t i;
  783.     int32_t list_index = 0;
  784.     switch (t->mb.mb_part)
  785.     {
  786.     case MB_16x16:
  787.         vec = t->mb.vec[0][0];
  788.         src = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  789.         dst = pred_u;
  790.         t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 8);
  791.         src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  792.         dst = pred_v;
  793.         t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 8);
  794.         break;
  795.     case MB_16x8:
  796.         vec = t->mb.vec[0][0];
  797.         src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  798.         dst_u = pred_u;
  799.         t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 8, 4);
  800.         src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  801.         dst = pred_v;
  802.         t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 4);
  803.         vec = t->mb.vec[0][luma_index[8]];
  804.         src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) +
  805.             4 * t->edged_stride_uv;
  806.         dst_u += 4 * 8;
  807.         t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 8, 4);
  808.         src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + 
  809.             4 * t->edged_stride_uv;
  810.         dst += 4 * 8;
  811.         t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 4);
  812.         break;
  813.     case MB_8x16:
  814.         vec = t->mb.vec[0][0];
  815.         src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  816.         dst_u = pred_u;
  817.         t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 4, 8);
  818.         src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  819.         dst = pred_v;
  820.         t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 8);
  821.         vec = t->mb.vec[0][luma_index[4]];
  822.         src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + 4;
  823.         dst_u += 4;
  824.         t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 4, 8);
  825.         src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + 4;
  826.         dst += 4;
  827.         t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 8);
  828.         break;
  829.     case MB_8x8:
  830.     case MB_8x8ref0:
  831.         for(i = 0 ; i < 4 ; i ++)
  832.         {
  833.             switch(t->mb.submb_part[luma_index[4 * i]])
  834.             {
  835.             case MB_8x8:
  836.                 vec = t->mb.vec[0][luma_index[4 * i]];
  837.                 src = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4);
  838.                 dst = pred_u + i / 2 * 32 + i % 2 * 4;
  839.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 4);
  840.                 src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4);
  841.                 dst = pred_v + i / 2 * 32 + i % 2 * 4;
  842.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 4);
  843.                 break;
  844.             case MB_8x4:
  845.                 vec = t->mb.vec[0][luma_index[4 * i]];
  846.                 src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4);
  847.                 dst_u = pred_u + i / 2 * 32 + i % 2 * 4;
  848.                 t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 4, 2);
  849.                 src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4);
  850.                 dst = pred_v + i / 2 * 32 + i % 2 * 4;
  851.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 2);
  852.                 vec = t->mb.vec[0][luma_index[4 * i + 2]];
  853.                 src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4) + 
  854.                     2 * t->edged_stride_uv;
  855.                 dst_u += 2 * 8;
  856.                 t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 4, 2);
  857.                 src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4) +
  858.                     2 * t->edged_stride_uv;
  859.                 dst += 2 * 8;
  860.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 2);
  861.                 break;
  862.             case MB_4x8:
  863.                 vec = t->mb.vec[0][luma_index[4 * i]];
  864.                 src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4);
  865.                 dst_u = pred_u + i / 2 * 32 + i % 2 * 4;
  866.                 t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 2, 4);
  867.                 src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4);
  868.                 dst = pred_v + i / 2 * 32 + i % 2 * 4;
  869.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 2, 4);
  870.                 vec = t->mb.vec[0][luma_index[4 * i + 1]];
  871.                 src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4) + 2;
  872.                 dst_u += 2;
  873.                 t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 2, 4);
  874.                 src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4) + 2;
  875.                 dst += 2;
  876.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 2, 4);
  877.                 break;
  878.             case MB_4x4:
  879.                 vec = t->mb.vec[0][luma_index[4 * i]];
  880.                 src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4);
  881.                 dst_u = pred_u + i / 2 * 32 + i % 2 * 4;
  882.                 t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 2, 2);
  883.                 src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4);
  884.                 dst = pred_v + i / 2 * 32 + i % 2 * 4;
  885.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 2, 2);
  886.                 vec = t->mb.vec[0][luma_index[4 * i + 1]];
  887.                 src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4) + 2;
  888.                 dst_u += 2;
  889.                 t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 2, 2);
  890.                 src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4) + 2;
  891.                 dst += 2;
  892.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 2, 2);
  893.                 vec = t->mb.vec[0][luma_index[4 * i + 2]];
  894.                 src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4) + 
  895.                     2 * t->edged_stride_uv;
  896.                 dst_u += 2 * 8 - 2;
  897.                 t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 2, 2);
  898.                 src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4) + 
  899.                     2 * t->edged_stride_uv;
  900.                 dst += 2 * 8 - 2;
  901.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 2, 2);
  902.                 vec = t->mb.vec[0][luma_index[4 * i + 3]];
  903.                 src_u = t->ref[list_index][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4) +
  904.                     2 * t->edged_stride_uv + 2;
  905.                 dst_u += 2;
  906.                 t->eighth_pixel_mc_u(src_u, t->edged_stride_uv, dst_u, vec.x, vec.y, 2, 2);
  907.                 src = t->ref[list_index][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + (i % 2 * 4) + 
  908.                     2 * t->edged_stride_uv + 2;
  909.                 dst += 2;
  910.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 2, 2);
  911.                 break;
  912.             default:
  913.                 break;
  914.             }
  915.         }
  916.         break;
  917.     default:
  918.         break;
  919.     }
  920.     T264dec_mb_decode_uv(t, pred_u, pred_v);
  921. }
  922.     static const int8_t index[4][4][6] = 
  923.     {
  924.         {{0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 0}, {1, 0, 0, 0, 1, 0}},
  925.         {{0, 2, 0, 0, 0, 0}, {1, 2, 0, 0, 0, 0}, {1, 3, 0, 0, 0, 0}, {1, 2, 0, 0, 1, 0}},
  926.         {{2, 2, 0, 0, 0, 0}, {2, 3, 0, 0, 0, 0}, {3, 3, 0, 0, 0, 0}, {3, 2, 0, 0, 1, 0}},
  927.         {{2, 0, 0, 0, 0, 1}, {2, 1, 0, 0, 0, 1}, {3, 1, 0, 0, 0, 1}, {1, 2, 0, 1, 1, 0}}
  928.     };
  929. void 
  930. T264_mb4x4_interb_uv_mc(T264_t* t,T264_vector_t vecPredicted[2][16],uint8_t* pred_u,uint8_t* pred_v)
  931. {
  932.     DECLARE_ALIGNED_MATRIX(pred_u_l1, 8, 8, uint8_t, CACHE_SIZE);
  933.     DECLARE_ALIGNED_MATRIX(pred_v_l1, 8, 8, uint8_t, CACHE_SIZE);
  934.     T264_vector_t vec;
  935.     uint8_t* src, *dst;
  936.     int32_t i;
  937.     int32_t j;
  938.     int32_t idx;
  939.     int32_t offset_src,offset_dst;
  940.     uint8_t *dstv;
  941.     for(i = 0;i < 4; ++i)
  942.     {
  943.         for(j = 0;j < 4; ++j)
  944.         {    //predict each 2x2 block
  945.             idx = (i * 4) + j;
  946.             offset_dst = ((i * 2) * 8) + (j << 1);
  947.             vec = vecPredicted[0][idx];
  948.             offset_src = ((t->mb.mb_y << 3) + ((i << 1) + (vec.y >> 3))) * t->edged_stride_uv + (t->mb.mb_x << 3) + (j << 1) + (vec.x >> 3);
  949.             dstv = pred_v + offset_dst;
  950.             dst = pred_u + offset_dst;
  951.             if(vec.refno > -1)
  952.             {
  953.                 src = t->ref[0][vec.refno]->U + offset_src;
  954.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 2, 2);
  955.                 src = t->ref[0][vec.refno]->V + offset_src;
  956.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dstv, vec.x, vec.y, 2, 2);
  957.             }
  958.             vec = vecPredicted[1][idx];
  959.             offset_src = ((t->mb.mb_y << 3) + ((i << 1) + (vec.y >> 3))) * t->edged_stride_uv + (t->mb.mb_x << 3) + (j << 1) + (vec.x >> 3);
  960.             if(vec.refno > -1)
  961.             {
  962.                 if(vecPredicted[0][idx].refno > -1)
  963.                 {
  964.                     dst = pred_u_l1 + offset_dst;
  965.                     dstv = pred_v_l1 + offset_dst;
  966.                 }
  967.                 src = t->ref[1][vec.refno]->U + offset_src;
  968.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 2, 2);
  969.                 src = t->ref[1][vec.refno]->V + offset_src;
  970.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dstv, vec.x, vec.y, 2, 2);
  971.             }
  972.             if(dst != pred_u + offset_dst)
  973.             {
  974.                 t->pia[MB_2x2](dst, pred_u + offset_dst, 8, 8, pred_u + offset_dst, 8);
  975.                 t->pia[MB_2x2](dstv, pred_v + offset_dst, 8, 8, pred_v + offset_dst, 8);
  976.             }
  977.         }
  978.     }
  979. }
  980. void 
  981. T264_mb4x4_interb_mc(T264_t* t,T264_vector_t vec[2][16],uint8_t* ref)
  982. {
  983.     T264_vector_t vec0,vec1;
  984.     uint8_t* tmp,*pred_tmp;
  985.     int32_t x, y,i,j;
  986.     int32_t list_index,
  987.             block_idx = 0;
  988.     int32_t offset1, offset2;
  989.     DECLARE_ALIGNED_MATRIX_H(pred_16x16bi, 16, 16, uint8_t, CACHE_SIZE);
  990.  
  991.     for(i = 0 ; i < 4 ; i ++)
  992.     {
  993.         for(j = 0;j < 4; ++j)
  994.         {
  995.             int32_t offset_base;
  996.             vec0 = vec[0][block_idx];
  997.             vec1 = vec[1][block_idx];
  998.             x = (vec0.x & 3);
  999.             y = (vec0.y & 3);
  1000.         //    offset_base = luma_inverse_y[block_idx] * 16 * 4 + luma_inverse_x[block_idx] * 4;
  1001.             offset_base = i * 16 * 4 + j * 4;
  1002.             pred_tmp = ref + offset_base;
  1003.             if(vec0.refno > -1)
  1004.             {
  1005.                     list_index = 0;
  1006.                     if (index[y][x][0] == index[y][x][1])
  1007.                     {
  1008.                         offset1 = ((t->mb.mb_y << 4) + (vec0.y >> 2) + i * 4) * t->edged_stride + ((t->mb.mb_x << 4) + (vec0.x >> 2)) + j  * 4;
  1009.                         tmp = t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + offset1;
  1010.                         t->memcpy_stride_u(tmp, 4, 4, t->edged_stride, pred_tmp, 16);
  1011.                     }
  1012.                     else
  1013.                     {
  1014.                         offset1 = ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][3] + i * 4) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][2] + j * 4;
  1015.                         offset2 = ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][5] + i * 4) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][4] + j * 4;
  1016.                         t->pia[MB_4x4](t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + offset1, 
  1017.                             t->ref[list_index][vec0.refno]->Y[index[y][x][1]] + offset2,
  1018.                             t->edged_stride, t->edged_stride, pred_tmp,16);
  1019.                     }
  1020.                 }
  1021.                 x = (vec1.x & 3);
  1022.                 y = (vec1.y & 3);
  1023.                 if(vec1.refno > -1)
  1024.                 {
  1025.                     list_index = 1;
  1026.                     if(vec0.refno > -1)
  1027.                         pred_tmp = pred_16x16bi + offset_base;
  1028.                     if (index[y][x][0] == index[y][x][1])
  1029.                     {
  1030.                         offset1 = ((t->mb.mb_y << 4) + (vec1.y >> 2) + i * 4) * t->edged_stride + ((t->mb.mb_x << 4) + (vec1.x >> 2)) + j * 4;
  1031.                         tmp = t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + offset1;
  1032.                         t->memcpy_stride_u(tmp, 4, 4, t->edged_stride, pred_tmp, 16);
  1033.                     }
  1034.                     else
  1035.                     {
  1036.                         offset1 = ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][3] + i * 4) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][2] + j * 4;
  1037.                         offset2 = ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][5] + i * 4) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][4] + j * 4;
  1038.                         t->pia[MB_4x4](t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + offset1, 
  1039.                             t->ref[list_index][vec1.refno]->Y[index[y][x][1]] + offset2,
  1040.                             t->edged_stride, t->edged_stride, pred_tmp, 16);
  1041.                     }
  1042.                 }
  1043.                 if(pred_tmp != ref + offset_base)
  1044.                     t->pia[MB_4x4](pred_tmp,ref + offset_base,16,16,ref + offset_base,16);        
  1045.                 ++block_idx;
  1046.         }
  1047.     }
  1048. }
  1049. void
  1050. T264dec_mb_decode_interb_mc(T264_t* t, uint8_t* ref)
  1051. {
  1052.     T264_vector_t vec0,vec1;
  1053.     uint8_t* tmp,*pred_tmp;
  1054.     int32_t x, y,i;
  1055.     int32_t list_index;
  1056.     DECLARE_ALIGNED_MATRIX_H(pred_16x16bi, 16, 16, uint8_t, CACHE_SIZE);
  1057.  
  1058.     if(t->mb.is_copy)
  1059.         T264_mb4x4_interb_mc(t,t->mb.vec,ref);
  1060.     else
  1061.     switch(t->mb.mb_part)
  1062.     {
  1063.     case MB_16x16:
  1064.         vec0 = t->mb.vec[0][0];
  1065.         vec1 = t->mb.vec[1][0];
  1066.         x = (vec0.x & 3);
  1067.         y = (vec0.y & 3);
  1068.         pred_tmp = ref;    
  1069.         if(vec0.refno > -1)
  1070.         {
  1071.             list_index = 0;
  1072.             if (index[y][x][0] == index[y][x][1])
  1073.             {   
  1074.                 tmp = t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec0.y >> 2)) * t->edged_stride + 
  1075.                     ((t->mb.mb_x << 4) + (vec0.x >> 2));
  1076.                 t->memcpy_stride_u(tmp, 16, 16, t->edged_stride, ref, 16);
  1077.             }
  1078.             else
  1079.             {  
  1080.                 t->pia[MB_16x16](t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][2], 
  1081.                     t->ref[list_index][vec0.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][4],
  1082.                     t->edged_stride, t->edged_stride, ref, 16);
  1083.             }                              
  1084.         }
  1085.         if(vec1.refno > -1)
  1086.         {   //if bi-pred
  1087.                 x = (vec1.x & 3);
  1088.                 y = (vec1.y & 3);
  1089.                 list_index = 1;
  1090.                 if(vec0.refno > -1) //if biPred
  1091.                     pred_tmp = pred_16x16bi;
  1092.                 else
  1093.                     pred_tmp = ref;
  1094.                 if (index[y][x][0] == index[y][x][1])
  1095.                 {   
  1096.                     tmp = t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec1.y >> 2)) * t->edged_stride + 
  1097.                         ((t->mb.mb_x << 4) + (vec1.x >> 2));
  1098.                     t->memcpy_stride_u(tmp, 16, 16, t->edged_stride, pred_tmp, 16);
  1099.                 }
  1100.                 else
  1101.                 {   
  1102.                     t->pia[MB_16x16](t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][2], 
  1103.                         t->ref[list_index][vec1.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][4],
  1104.                         t->edged_stride, t->edged_stride, pred_tmp, 16);
  1105.                 }    
  1106.         } 
  1107.         if(pred_tmp != ref)
  1108.         {   //if biPred
  1109.             t->pia[MB_16x16](pred_tmp,ref,16,16,ref,16);            
  1110.         }
  1111.         break;
  1112.     case MB_16x8:
  1113.         vec0 = t->mb.vec[0][0];
  1114.         vec1 = t->mb.vec[1][0];
  1115.         pred_tmp = ref;   
  1116.         if(vec0.refno > -1)
  1117.         {
  1118.             list_index = 0;
  1119.             x = (vec0.x & 3);
  1120.             y = (vec0.y & 3);
  1121.             if (index[y][x][0] == index[y][x][1])
  1122.             {
  1123.                 tmp = t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec0.y >> 2)) * t->edged_stride + 
  1124.                     ((t->mb.mb_x << 4) + (vec0.x >> 2));
  1125.                 t->memcpy_stride_u(tmp, 16, 8, t->edged_stride, ref, 16);
  1126.             }
  1127.             else
  1128.             {
  1129.                 t->pia[MB_16x8](t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][2], 
  1130.                     t->ref[list_index][vec0.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][4],
  1131.                     t->edged_stride, t->edged_stride, ref, 16);
  1132.             }
  1133.         }
  1134.         if(vec1.refno > -1)
  1135.         {
  1136.             x = (vec1.x & 3);
  1137.             y = (vec1.y & 3);
  1138.             list_index = 1;
  1139.             if(vec0.refno > -1) //if biPred
  1140.                 pred_tmp = pred_16x16bi;
  1141.             else
  1142.                 pred_tmp = ref;
  1143.             if (index[y][x][0] == index[y][x][1])
  1144.             {
  1145.                 tmp = t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec1.y >> 2)) * t->edged_stride + 
  1146.                     ((t->mb.mb_x << 4) + (vec1.x >> 2));
  1147.                 t->memcpy_stride_u(tmp, 16, 8, t->edged_stride, pred_tmp, 16);
  1148.             }
  1149.             else
  1150.             {
  1151.                 t->pia[MB_16x8](t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][2], 
  1152.                     t->ref[list_index][vec1.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][4],
  1153.                     t->edged_stride, t->edged_stride, pred_tmp, 16);
  1154.             }
  1155.         }
  1156.         if(pred_tmp != ref)
  1157.         {   //if biPred
  1158.             t->pia[MB_16x8](pred_tmp,ref,16,16,ref,16);            
  1159.         }
  1160.         //For second MB16x8
  1161.         vec0 = t->mb.vec[0][8];
  1162.         vec1 = t->mb.vec[1][8];
  1163.         pred_tmp = ref + 16 * 8;    
  1164.         if(vec0.refno > -1)
  1165.         {
  1166.             x = (vec0.x & 3);
  1167.             y = (vec0.y & 3);
  1168.             list_index = 0;
  1169.             if (index[y][x][0] == index[y][x][1])
  1170.             {
  1171.                 tmp = t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + 8) * t->edged_stride + 
  1172.                     ((t->mb.mb_x << 4) + (vec0.x >> 2));
  1173.                 t->memcpy_stride_u(tmp, 16, 8, t->edged_stride, pred_tmp, 16);
  1174.             }
  1175.             else
  1176.             {
  1177.                 t->pia[MB_16x8](t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][3] + 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][2], 
  1178.                     t->ref[list_index][vec0.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][5] + 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][4],
  1179.                     t->edged_stride, t->edged_stride, pred_tmp, 16);
  1180.             }
  1181.         }
  1182.         if(vec1.refno > -1)
  1183.         {
  1184.             x = (vec1.x & 3);
  1185.             y = (vec1.y & 3);
  1186.             list_index = 1;
  1187.             if(vec0.refno > -1) //if biPred
  1188.                 pred_tmp = pred_16x16bi + 16 * 8;
  1189.             if (index[y][x][0] == index[y][x][1])
  1190.             {
  1191.                 tmp = t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + 8) * t->edged_stride + 
  1192.                     ((t->mb.mb_x << 4) + (vec1.x >> 2));
  1193.                 t->memcpy_stride_u(tmp, 16, 8, t->edged_stride,pred_tmp, 16);
  1194.             }
  1195.             else
  1196.             {
  1197.                 t->pia[MB_16x8](t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][3] + 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][2], 
  1198.                     t->ref[list_index][vec1.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][5] + 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][4],
  1199.                     t->edged_stride, t->edged_stride, pred_tmp, 16);
  1200.             }
  1201.         }
  1202.         if(pred_tmp != ref + 16 * 8)
  1203.         {   //if biPred
  1204.             t->pia[MB_16x8](pred_tmp,ref + 16 * 8,16,16,ref + 16 * 8,16);            
  1205.         }
  1206.         break;
  1207.     case MB_8x16:
  1208.         pred_tmp = ref;
  1209.         vec0 = t->mb.vec[0][0];
  1210.         vec1 = t->mb.vec[1][0];
  1211.         if(vec0.refno > -1)
  1212.         {
  1213.             x = (vec0.x & 3);
  1214.             y = (vec0.y & 3);
  1215.             list_index = 0;
  1216.             if (index[y][x][0] == index[y][x][1])
  1217.             {
  1218.                 tmp = t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec0.y >> 2)) * t->edged_stride + 
  1219.                     ((t->mb.mb_x << 4) + (vec0.x >> 2));
  1220.                 t->memcpy_stride_u(tmp, 8, 16, t->edged_stride, ref, 16);
  1221.             }
  1222.             else
  1223.             {
  1224.                 t->pia[MB_8x16](t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][2], 
  1225.                     t->ref[list_index][vec0.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][4],
  1226.                     t->edged_stride, t->edged_stride, ref, 16);
  1227.             }
  1228.         }
  1229.         if(vec1.refno > -1)
  1230.         {
  1231.             list_index = 1;
  1232.             x = (vec1.x & 3);
  1233.             y = (vec1.y & 3);
  1234.             if(vec0.refno > -1) //if biPred
  1235.                 pred_tmp = pred_16x16bi;
  1236.             if (index[y][x][0] == index[y][x][1])
  1237.             {
  1238.                 tmp = t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec1.y >> 2)) * t->edged_stride + 
  1239.                     ((t->mb.mb_x << 4) + (vec1.x >> 2));
  1240.                 t->memcpy_stride_u(tmp, 8, 16, t->edged_stride, pred_tmp, 16);
  1241.             }
  1242.             else
  1243.             {
  1244.                 t->pia[MB_8x16](t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][2], 
  1245.                     t->ref[list_index][vec1.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][4],
  1246.                     t->edged_stride, t->edged_stride,pred_tmp, 16);
  1247.             }
  1248.         }
  1249.         if(pred_tmp != ref)
  1250.         {   //if biPred
  1251.             t->pia[MB_8x16](pred_tmp,ref,16,16,ref,16);            
  1252.         }
  1253.         //for second MB8x16
  1254.         vec0 = t->mb.vec[0][2];
  1255.         vec1 = t->mb.vec[1][2];
  1256.         pred_tmp = ref + 8;
  1257.         if(vec0.refno > -1)
  1258.         {
  1259.             x = (vec0.x & 3);
  1260.             y = (vec0.y & 3);
  1261.             list_index = 0;
  1262.             if (index[y][x][0] == index[y][x][1])
  1263.             {
  1264.                 tmp = t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec0.y >> 2)) * t->edged_stride + 
  1265.                     ((t->mb.mb_x << 4) + (vec0.x >> 2)) + 8;
  1266.                 t->memcpy_stride_u(tmp, 8, 16, t->edged_stride, pred_tmp, 16);
  1267.             }
  1268.             else
  1269.             {
  1270.                 t->pia[MB_8x16](t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][2] + 8, 
  1271.                     t->ref[list_index][vec0.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][4] + 8,
  1272.                     t->edged_stride, t->edged_stride, pred_tmp, 16);
  1273.             }
  1274.         }
  1275.         if(vec1.refno > -1)
  1276.         {
  1277.             x = (vec1.x & 3);
  1278.             y = (vec1.y & 3);
  1279.             list_index = 1;
  1280.             if(vec0.refno > -1) //if biPred
  1281.                 pred_tmp = pred_16x16bi + 8;
  1282.             if (index[y][x][0] == index[y][x][1])
  1283.             {
  1284.                 tmp = t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec1.y >> 2)) * t->edged_stride + 
  1285.                     ((t->mb.mb_x << 4) + (vec1.x >> 2)) + 8;
  1286.                 t->memcpy_stride_u(tmp, 8, 16, t->edged_stride, pred_tmp, 16);
  1287.             }
  1288.             else
  1289.             {
  1290.                 t->pia[MB_8x16](t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][2] + 8, 
  1291.                     t->ref[list_index][vec1.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][4] + 8,
  1292.                     t->edged_stride, t->edged_stride,pred_tmp, 16);
  1293.             }
  1294.         }
  1295.         if(pred_tmp != ref + 8)
  1296.         {   //if biPred
  1297.             t->pia[MB_8x16](pred_tmp,ref + 8,16,16,ref + 8,16);            
  1298.         }
  1299.         break;
  1300.     case MB_8x8:
  1301.         for(i = 0 ; i < 4 ; i ++)
  1302.         {
  1303.             int32_t offset1, offset2;
  1304.             switch(t->mb.submb_part[luma_index[4 * i]]) 
  1305.             {
  1306.             case MB_8x8:
  1307.                 vec0 = t->mb.vec[0][luma_index[4 * i]];
  1308.                 vec1 = t->mb.vec[1][luma_index[4 * i]];
  1309.                 x = (vec0.x & 3);
  1310.                 y = (vec0.y & 3);
  1311.                 pred_tmp = ref + i / 2 * 16 * 8 + i % 2 * 8;
  1312.                 if(vec0.refno > -1)
  1313.                 {
  1314.                     list_index = 0;
  1315.                     if (index[y][x][0] == index[y][x][1])
  1316.                     {
  1317.                         offset1 = ((t->mb.mb_y << 4) + (vec0.y >> 2) + i / 2 * 8) * t->edged_stride + ((t->mb.mb_x << 4) + (vec0.x >> 2)) + i % 2 * 8;
  1318.                         tmp = t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + offset1;
  1319.                         t->memcpy_stride_u(tmp, 8, 8, t->edged_stride, pred_tmp, 16);
  1320.                     }
  1321.                     else
  1322.                     {
  1323.                         offset1 = ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][3] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][2] + i % 2 * 8;
  1324.                         offset2 = ((t->mb.mb_y << 4) + (vec0.y >> 2) + index[y][x][5] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec0.x >> 2) + index[y][x][4] + i % 2 * 8;
  1325.                         t->pia[MB_8x8](t->ref[list_index][vec0.refno]->Y[index[y][x][0]] + offset1, 
  1326.                             t->ref[list_index][vec0.refno]->Y[index[y][x][1]] + offset2,
  1327.                             t->edged_stride, t->edged_stride, pred_tmp,16);
  1328.                     }
  1329.                 }
  1330.                 x = (vec1.x & 3);
  1331.                 y = (vec1.y & 3);
  1332.                 if(vec1.refno > -1)
  1333.                 {
  1334.                     list_index = 1;
  1335.                     if(vec0.refno > -1)
  1336.                         pred_tmp = pred_16x16bi + i / 2 * 16 * 8 + i % 2 * 8;
  1337.                     if (index[y][x][0] == index[y][x][1])
  1338.                     {
  1339.                         offset1 = ((t->mb.mb_y << 4) + (vec1.y >> 2) + i / 2 * 8) * t->edged_stride + ((t->mb.mb_x << 4) + (vec1.x >> 2)) + i % 2 * 8;
  1340.                         tmp = t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + offset1;
  1341.                         t->memcpy_stride_u(tmp, 8, 8, t->edged_stride, pred_tmp, 16);
  1342.                     }
  1343.                     else
  1344.                     {
  1345.                         offset1 = ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][3] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][2] + i % 2 * 8;
  1346.                         offset2 = ((t->mb.mb_y << 4) + (vec1.y >> 2) + index[y][x][5] + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + (vec1.x >> 2) + index[y][x][4] + i % 2 * 8;
  1347.                         t->pia[MB_8x8](t->ref[list_index][vec1.refno]->Y[index[y][x][0]] + offset1, 
  1348.                             t->ref[list_index][vec1.refno]->Y[index[y][x][1]] + offset2,
  1349.                             t->edged_stride, t->edged_stride, pred_tmp, 16);
  1350.                     }
  1351.                 }
  1352.                 if(pred_tmp != ref + i / 2 * 16 * 8 + i % 2 * 8)
  1353.                     t->pia[MB_8x8](pred_tmp,ref + i / 2 * 16 * 8 + i % 2 * 8,16,16,ref + i / 2 * 16 * 8 + i % 2 * 8,16);
  1354.                 break;
  1355.             default:
  1356.                 assert(0);
  1357.                 break;
  1358.             }
  1359.         }
  1360.         break;
  1361.     default:    //only support MB16x16 B-frame
  1362.         assert(0);
  1363.         break;
  1364.     }
  1365. }
  1366. void 
  1367. T264dec_mb_decode_interb_y(T264_t* t)
  1368. {
  1369.     T264dec_mb_decode_interb_mc(t, t->mb.pred_p16x16);
  1370.     T264dec_mb_decode_interp_transform(t, t->mb.pred_p16x16);
  1371. }
  1372. void 
  1373. T264dec_mb_decode_interb_uv(T264_t* t)
  1374. {
  1375.     DECLARE_ALIGNED_MATRIX(pred_u, 8, 8, uint8_t, CACHE_SIZE);
  1376.     DECLARE_ALIGNED_MATRIX(pred_v, 8, 8, uint8_t, CACHE_SIZE);
  1377.     DECLARE_ALIGNED_MATRIX(pred_bi, 8, 8, uint8_t, CACHE_SIZE);
  1378.     T264_vector_t vec0,vec1;
  1379.     uint8_t* src, *dst;
  1380.     int32_t list_index,i;
  1381.     if(t->mb.is_copy)
  1382.     {
  1383.         T264_mb4x4_interb_uv_mc(t,t->mb.vec,pred_u,pred_v);
  1384.     }else
  1385.     switch (t->mb.mb_part)
  1386.     {
  1387.     case MB_16x16:
  1388.         vec0 = t->mb.vec[0][0];
  1389.         vec1 = t->mb.vec[1][0];
  1390.         dst  = pred_u;
  1391.         if(vec0.refno > -1)
  1392.         {
  1393.             list_index = 0;
  1394.             src = t->ref[list_index][vec0.refno]->U + ((t->mb.mb_y << 3) + (vec0.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3);
  1395.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, pred_u, vec0.x, vec0.y, 8, 8);            
  1396.         }
  1397.         if(vec1.refno > -1)
  1398.         {
  1399.             list_index = 1;
  1400.             if(vec0.refno > -1)
  1401.                 dst = pred_bi;            
  1402.             else
  1403.                 dst = pred_u;
  1404.             src = t->ref[list_index][vec1.refno]->U + ((t->mb.mb_y << 3) + (vec1.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3);
  1405.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 8, 8);            
  1406.         }
  1407.         if(dst != pred_u)
  1408.         {
  1409.             t->pia[MB_8x8](dst,pred_u,8,8,pred_u,8);            
  1410.         }
  1411.         dst = pred_v;
  1412.         if(vec0.refno > -1)
  1413.         {
  1414.             list_index = 0;
  1415.             src = t->ref[list_index][vec0.refno]->V + ((t->mb.mb_y << 3) + (vec0.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3);
  1416.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, pred_v, vec0.x, vec0.y, 8, 8);            
  1417.         }
  1418.         if(vec1.refno > -1)
  1419.         {
  1420.             list_index = 1;
  1421.             if(vec0.refno > -1)
  1422.                 dst = pred_bi;            
  1423.             else
  1424.                 dst = pred_v;
  1425.             src = t->ref[list_index][vec1.refno]->V + ((t->mb.mb_y << 3) + (vec1.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3);
  1426.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 8, 8);            
  1427.         }
  1428.         if(dst != pred_v)
  1429.         {
  1430.             t->pia[MB_8x8](dst,pred_v,8,8,pred_v,8);            
  1431.         }
  1432.         break;
  1433.     case MB_16x8:
  1434.         vec0 = t->mb.vec[0][0];
  1435.         vec1 = t->mb.vec[1][0];
  1436.         
  1437.         dst  = pred_u;
  1438.         if(vec0.refno > -1)
  1439.         {
  1440.             list_index = 0;
  1441.             src = t->ref[list_index][vec0.refno]->U + ((t->mb.mb_y << 3) + (vec0.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3);
  1442.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec0.x, vec0.y, 8, 4);
  1443.         }
  1444.         if(vec1.refno > -1)
  1445.         {
  1446.             if(vec0.refno > -1)
  1447.                 dst = pred_bi;
  1448.             else
  1449.                 dst = pred_u;
  1450.             list_index = 1;
  1451.             src = t->ref[list_index][vec1.refno]->U + ((t->mb.mb_y << 3) + (vec1.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3);
  1452.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 8, 4);
  1453.         }
  1454.         if(dst != pred_u)
  1455.         {
  1456.             t->pia[MB_8x4](dst,pred_u,8,8,pred_u,8);            
  1457.         }
  1458.         dst  = pred_v;
  1459.         if(vec0.refno > -1)
  1460.         {
  1461.             list_index = 0;
  1462.             src = t->ref[list_index][vec0.refno]->V + ((t->mb.mb_y << 3) + (vec0.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3);
  1463.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec0.x, vec0.y, 8, 4);
  1464.         }
  1465.         if(vec1.refno > -1)
  1466.         {
  1467.             if(vec0.refno > -1)
  1468.                 dst = pred_bi;
  1469.             else
  1470.                 dst = pred_v;
  1471.             list_index = 1;
  1472.             src = t->ref[list_index][vec1.refno]->V + ((t->mb.mb_y << 3) + (vec1.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3);
  1473.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 8, 4);
  1474.         }
  1475.         if(dst != pred_v)
  1476.         {
  1477.             t->pia[MB_8x4](dst,pred_v,8,8,pred_v,8);            
  1478.         }
  1479.         //now for next MB16x8
  1480.         vec0 = t->mb.vec[0][luma_index[8]];
  1481.         vec1 = t->mb.vec[1][luma_index[8]];        
  1482.         dst  = pred_u + 4 * 8;
  1483.         if(vec0.refno > -1)
  1484.         {
  1485.             list_index = 0;
  1486.             src = t->ref[list_index][vec0.refno]->U + ((t->mb.mb_y << 3) + (vec0.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3) +
  1487.             4 * t->edged_stride_uv;
  1488.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec0.x, vec0.y, 8, 4);
  1489.         }
  1490.         if(vec1.refno > -1)
  1491.         {
  1492.             if(vec0.refno > -1)
  1493.                 dst = pred_bi + 4 * 8;
  1494.             else
  1495.                 dst = pred_u + 4 * 8;
  1496.             list_index = 1;
  1497.             src = t->ref[list_index][vec1.refno]->U + ((t->mb.mb_y << 3) + (vec1.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3) +
  1498.             4 * t->edged_stride_uv;
  1499.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 8, 4);
  1500.         }
  1501.         if(dst != pred_u + 4 * 8)
  1502.         {
  1503.             t->pia[MB_8x4](dst,pred_u + 4 * 8,8,8,pred_u + 4 * 8,8);
  1504.         }
  1505.         //for v
  1506.         dst  = pred_v + 4 * 8;
  1507.         if(vec0.refno > -1)
  1508.         {
  1509.             list_index = 0;
  1510.             src = t->ref[list_index][vec0.refno]->V + ((t->mb.mb_y << 3) + (vec0.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3) + 
  1511.                 4 * t->edged_stride_uv;        
  1512.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec0.x, vec0.y, 8, 4);
  1513.         }
  1514.         if(vec1.refno > -1)
  1515.         {
  1516.             if(vec0.refno > -1)
  1517.                 dst = pred_bi + 4 * 8;
  1518.             else
  1519.                 dst = pred_v + 4 * 8;
  1520.             list_index = 1;
  1521.             src = t->ref[list_index][vec1.refno]->V + ((t->mb.mb_y << 3) + (vec1.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3) + 
  1522.                 4 * t->edged_stride_uv;        
  1523.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 8, 4);
  1524.         }
  1525.         if(dst != pred_v + 4 * 8)
  1526.         {
  1527.             t->pia[MB_8x4](dst,pred_v + 4 * 8,8,8,pred_v + 4 * 8,8);            
  1528.         }
  1529.         break;
  1530.     case MB_8x16:
  1531.         vec0 = t->mb.vec[0][0];
  1532.         vec1 = t->mb.vec[1][0];
  1533.         
  1534.         dst  = pred_u;
  1535.         if(vec0.refno > -1)
  1536.         {
  1537.             list_index = 0;
  1538.             src = t->ref[list_index][vec0.refno]->U + ((t->mb.mb_y << 3) + (vec0.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3);
  1539.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec0.x, vec0.y, 4, 8);
  1540.         }
  1541.         if(vec1.refno > -1)
  1542.         {
  1543.             if(vec0.refno > -1)
  1544.                 dst = pred_bi;
  1545.             else
  1546.                 dst = pred_u;
  1547.             list_index = 1;
  1548.             src = t->ref[list_index][vec1.refno]->U + ((t->mb.mb_y << 3) + (vec1.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3);
  1549.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 4, 8);
  1550.         }
  1551.         if(dst != pred_u)
  1552.         {
  1553.             t->pia[MB_4x8](dst,pred_u,8,8,pred_u,8);            
  1554.         }
  1555.         dst  = pred_v;
  1556.         if(vec0.refno > -1)
  1557.         {
  1558.             list_index = 0;
  1559.             src = t->ref[list_index][vec0.refno]->V + ((t->mb.mb_y << 3) + (vec0.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3);
  1560.             //dst = pred_v;
  1561.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec0.x, vec0.y, 4, 8);
  1562.         }
  1563.         if(vec1.refno > -1)
  1564.         {
  1565.             if(vec0.refno > -1)
  1566.                 dst = pred_bi;
  1567.             else
  1568.                 dst = pred_v;
  1569.             list_index = 1;
  1570.             src = t->ref[list_index][vec1.refno]->V + ((t->mb.mb_y << 3) + (vec1.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3);
  1571.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 4, 8);
  1572.         }
  1573.         if(dst != pred_v)
  1574.         {
  1575.             t->pia[MB_4x8](dst,pred_v,8,8,pred_v,8);            
  1576.         }
  1577.         //now for next MB8x16
  1578.         vec0 = t->mb.vec[0][luma_index[4]];
  1579.         vec1 = t->mb.vec[1][luma_index[4]];        
  1580.         dst  = pred_u + 4;
  1581.         if(vec0.refno > -1)
  1582.         {
  1583.             list_index = 0;
  1584.             src = t->ref[list_index][vec0.refno]->U + ((t->mb.mb_y << 3) + (vec0.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3) + 4;
  1585.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec0.x, vec0.y, 4, 8);
  1586.         }
  1587.         if(vec1.refno > -1)
  1588.         {
  1589.             if(vec0.refno > -1)
  1590.                 dst = pred_bi + 4;
  1591.             else
  1592.                 dst = pred_u + 4;
  1593.             list_index = 1;
  1594.             src = t->ref[list_index][vec1.refno]->U + ((t->mb.mb_y << 3) + (vec1.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3) + 4;
  1595.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 4, 8);
  1596.         }
  1597.         if(dst != pred_u + 4)
  1598.         {
  1599.             t->pia[MB_4x8](dst,pred_u + 4,8,8,pred_u + 4,8);            
  1600.         }
  1601.         //for v
  1602.         dst  = pred_v + 4;
  1603.         if(vec0.refno > -1)
  1604.         {
  1605.             list_index = 0;
  1606.             src = t->ref[list_index][vec0.refno]->V + ((t->mb.mb_y << 3) + (vec0.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3) + 4;        
  1607.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec0.x, vec0.y, 4, 8);
  1608.         }
  1609.         if(vec1.refno > -1)
  1610.         {
  1611.             if(vec0.refno > -1)
  1612.                 dst = pred_bi + 4;
  1613.             else
  1614.                 dst = pred_v + 4;
  1615.             list_index = 1;
  1616.             src = t->ref[list_index][vec1.refno]->V + ((t->mb.mb_y << 3) + (vec1.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3) + 4;        
  1617.             t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 4, 8);
  1618.         }
  1619.         if(dst != pred_v + 4)
  1620.         {
  1621.             t->pia[MB_4x8](dst,pred_v + 4,8,8,pred_v + 4,8);            
  1622.         }
  1623.       
  1624.         break;
  1625.     case MB_8x8:
  1626.         for(i = 0 ; i < 4 ; i ++)
  1627.         {
  1628.             switch(t->mb.submb_part[luma_index[4 * i]])
  1629.             {
  1630.             case MB_8x8:
  1631.                 vec0 = t->mb.vec[0][luma_index[4 * i]];
  1632.                 vec1 = t->mb.vec[1][luma_index[4 * i]];
  1633.                 dst = pred_u + i / 2 * 32 + i % 2 * 4;
  1634.                 if(vec0.refno > -1)
  1635.                 {
  1636.                     list_index = 0;
  1637.                     src = t->ref[list_index][vec0.refno]->U + ((t->mb.mb_y << 3) + (vec0.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3) + (i % 2 * 4);
  1638.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec0.x, vec0.y, 4, 4);
  1639.                 }
  1640.                 if(vec1.refno > -1)
  1641.                 {
  1642.                     if(vec0.refno > -1)
  1643.                         dst = pred_bi + i / 2 * 32 + i % 2 * 4;
  1644.                     list_index = 1;
  1645.                     src = t->ref[list_index][vec1.refno]->U + ((t->mb.mb_y << 3) + (vec1.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3) + (i % 2 * 4);
  1646.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 4, 4);
  1647.                 }
  1648.                 if(dst != pred_u + i / 2 * 32 + i % 2 * 4)
  1649.                     t->pia[MB_4x4](dst,pred_u + i / 2 * 32 + i % 2 * 4,8,8,pred_u + i / 2 * 32 + i % 2 * 4,8);  
  1650.                 dst = pred_v + i / 2 * 32 + i % 2 * 4;
  1651.                 if(vec0.refno > -1)
  1652.                 {
  1653.                     list_index = 0;
  1654.                     src = t->ref[list_index][vec0.refno]->V + ((t->mb.mb_y << 3) + (vec0.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec0.x >> 3) + (i % 2 * 4);
  1655.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec0.x, vec0.y, 4, 4);
  1656.                 }
  1657.                 if(vec1.refno > -1)
  1658.                 {
  1659.                     if(vec0.refno > -1)
  1660.                         dst = pred_bi + i / 2 * 32 + i % 2 * 4;
  1661.                     list_index = 1;
  1662.                     src = t->ref[list_index][vec1.refno]->V + ((t->mb.mb_y << 3) + (vec1.y >> 3) + i / 2 * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec1.x >> 3) + (i % 2 * 4);
  1663.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec1.x, vec1.y, 4, 4);
  1664.                 }
  1665.                 if(dst != pred_v + i / 2 * 32 + i % 2 * 4)
  1666.                     t->pia[MB_4x4](dst,pred_v + i / 2 * 32 + i % 2 * 4,8,8,pred_v + i / 2 * 32 + i % 2 * 4,8);  
  1667.                 break;
  1668.             default:
  1669.                 assert(0);
  1670.                 break;
  1671.             }
  1672.         }
  1673.     default:
  1674.         break;
  1675.     }
  1676.     T264dec_mb_decode_uv(t, pred_u, pred_v);   
  1677. }