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

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.1.5 CloudWu<sywu@sohu.com> Modify T264_get_direct_mv
  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 "portab.h"
  24. #include "stdio.h"
  25. #ifndef CHIP_DM642
  26. #include "memory.h"
  27. #endif
  28. #include "T264.h"
  29. #include "inter.h"
  30. #include "inter_b.h"
  31. #include "intra.h"
  32. #include "estimation.h"
  33. #include "utility.h"
  34. #include "interpolate.h"
  35. #include "bitstream.h"
  36. #include <assert.h>
  37. #include "block.h"
  38. static int32_t __inline
  39. T264_detect_direct_16x16(T264_t* t)
  40. {
  41.     T264_vector_t vec_direct[2][16];
  42.     T264_get_direct_mv(t, vec_direct);
  43.     if (memcmp(vec_direct, t->mb.vec, sizeof(vec_direct)) == 0)
  44.     {
  45.         return 1;
  46.     }
  47.     return 0;
  48. }
  49. uint32_t
  50. T264_mode_decision_interb_y(_RW T264_t* t)
  51. {
  52.     DECLARE_ALIGNED_MATRIX(pred_8x8, 16, 16, uint8_t, CACHE_SIZE);
  53.     DECLARE_ALIGNED_MATRIX(pred_16x8, 16, 16, uint8_t, CACHE_SIZE);
  54.     DECLARE_ALIGNED_MATRIX(pred_8x16, 16, 16, uint8_t, CACHE_SIZE);
  55. DECLARE_ALIGNED_MATRIX(pred_p16x16, 16, 16, uint8_t, CACHE_SIZE);
  56.     uint32_t sad;
  57.     uint32_t sad_16x8;
  58.     uint32_t sad_8x16;
  59. uint32_t sad_16x16;
  60.     uint32_t sad_min;
  61.     uint8_t sub_part[4];
  62.     uint8_t part;
  63.     uint8_t part_16x8[2];
  64.     uint8_t part_8x16[2];
  65.     uint8_t* p_min = t->mb.pred_p16x16;
  66. uint32_t i,j;
  67.     T264_vector_t vec_16x16[2][2], vec_8x8[4][2];
  68.     T264_vector_t vec_16x8[2][2];
  69.     T264_vector_t vec_8x16[2][2];
  70.     T264_vector_t vec_4x4[2][16];
  71.     sad_min = T264_mode_decision_inter_16x16b(t, vec_16x16, t->mb.pred_p16x16, &part);
  72.     t->mb.mb_mode = B_MODE;
  73.     copy_nvec(&vec_16x16[0][0], &t->mb.vec[0][0], 4, 4, 4);
  74.     copy_nvec(&vec_16x16[0][1], &t->mb.vec[1][0], 4, 4, 4);
  75.     t->mb.mb_part = MB_16x16;
  76.     t->mb.mb_part2[0] = part;
  77. /*
  78.     if (t->mb.is_copy)
  79.     {
  80.         t->mb.sad = sad_min;
  81.         
  82.         return sad_min;
  83.     }
  84.     */
  85.     if (t->param.block_size & SEARCH_16x8B)
  86.     {
  87.         vec_16x8[0][0].refno = vec_16x16[0][0].refno;
  88.         sad_16x8 = T264_mode_decision_inter_16x8b(t, vec_16x8, pred_16x8, part_16x8);
  89.         if (sad_16x8 < sad_min)
  90.         {
  91.             p_min = pred_16x8;
  92.             t->mb.mb_part = MB_16x8;
  93.             t->mb.mb_part2[0] = part_16x8[0];
  94.             t->mb.mb_part2[1] = part_16x8[1];
  95.             sad_min = sad_16x8;
  96.             copy_nvec(&vec_16x8[0][0], &t->mb.vec[0][0], 4, 2, 4);
  97.             copy_nvec(&vec_16x8[0][1], &t->mb.vec[1][0], 4, 2, 4);
  98.             copy_nvec(&vec_16x8[1][0], &t->mb.vec[0][8], 4, 2, 4);
  99.             copy_nvec(&vec_16x8[1][1], &t->mb.vec[1][8], 4, 2, 4);
  100.         }
  101.     }
  102.     if (t->param.block_size & SEARCH_8x16B)
  103.     {
  104.         vec_8x16[0][0].refno = vec_16x16[0][0].refno;
  105.         sad_8x16 = T264_mode_decision_inter_8x16b(t, vec_8x16, pred_8x16, part_8x16);
  106.         if (sad_8x16 < sad_min)
  107.         {
  108.             p_min = pred_8x16;
  109.             t->mb.mb_part = MB_8x16;
  110.             t->mb.mb_part2[0] = part_8x16[0];
  111.             t->mb.mb_part2[1] = part_8x16[1];
  112.             sad_min = sad_8x16;
  113.             copy_nvec(&vec_8x16[0][0], &t->mb.vec[0][0], 2, 4, 4);
  114.             copy_nvec(&vec_8x16[0][1], &t->mb.vec[1][0], 2, 4, 4);
  115.             copy_nvec(&vec_8x16[1][0], &t->mb.vec[0][2], 2, 4, 4);
  116.             copy_nvec(&vec_8x16[1][1], &t->mb.vec[1][2], 2, 4, 4);
  117.         }
  118.     }
  119.     if (t->param.block_size & SEARCH_8x8B)
  120.     {
  121.         sad = 0;
  122.         for(i = 0 ; i < 4 ; i ++)
  123.         {
  124. vec_8x8[i][0].refno = vec_16x16[0][0].refno;
  125.             sad += T264_mode_decision_inter_8x8b(t, i, vec_8x8[i], pred_8x8, &sub_part[i]);
  126.             t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 0].vec[0] =
  127.             t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 1].vec[0] =
  128.             t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 8].vec[0] =
  129.             t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 9].vec[0] = vec_8x8[i][0];
  130.             t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 0].vec[1] =
  131.             t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 1].vec[1] =
  132.             t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 8].vec[1] =
  133.             t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 9].vec[1] = vec_8x8[i][1];
  134.         }
  135.         if (sad < sad_min)
  136.         {
  137.             sad_min = sad;
  138.             t->mb.mb_part = MB_8x8;
  139.             p_min = pred_8x8;
  140.             t->mb.submb_part[0] = sub_part[0];
  141.             t->mb.submb_part[luma_index[4]] = sub_part[1];
  142.             t->mb.submb_part[luma_index[8]] = sub_part[2];
  143.             t->mb.submb_part[luma_index[12]] = sub_part[3];
  144.             t->mb.vec[0][0] =
  145.             t->mb.vec[0][1] = 
  146.             t->mb.vec[0][4] = 
  147.             t->mb.vec[0][5] = vec_8x8[0][0];
  148.             t->mb.vec[1][0] =
  149.             t->mb.vec[1][1] = 
  150.             t->mb.vec[1][4] = 
  151.             t->mb.vec[1][5] = vec_8x8[0][1];
  152.             t->mb.vec[0][2] =
  153.             t->mb.vec[0][3] = 
  154.             t->mb.vec[0][6] = 
  155.             t->mb.vec[0][7] = vec_8x8[1][0];
  156.             t->mb.vec[1][2] =
  157.             t->mb.vec[1][3] = 
  158.             t->mb.vec[1][6] = 
  159.             t->mb.vec[1][7] = vec_8x8[1][1];
  160.             t->mb.vec[0][8] =
  161.             t->mb.vec[0][9] = 
  162.             t->mb.vec[0][12] = 
  163.             t->mb.vec[0][13] = vec_8x8[2][0];
  164.             t->mb.vec[1][8] =
  165.             t->mb.vec[1][9] = 
  166.             t->mb.vec[1][12] = 
  167.             t->mb.vec[1][13] = vec_8x8[2][1];
  168.             t->mb.vec[0][10] =
  169.             t->mb.vec[0][11] = 
  170.             t->mb.vec[0][14] = 
  171.             t->mb.vec[0][15] = vec_8x8[3][0];
  172.             t->mb.vec[1][10] =
  173.             t->mb.vec[1][11] = 
  174.             t->mb.vec[1][14] = 
  175.             t->mb.vec[1][15] = vec_8x8[3][1];
  176.         }
  177.     }
  178. t->mb.is_copy = 0;
  179.     sad_16x16 = T264_mode_decision_inter_direct_16x16b(t, vec_4x4, pred_p16x16, &part);
  180. if(sad_16x16 < sad_min)
  181. {
  182. for(i = 0;i < 2; ++i)
  183. for(j = 0;j < 16; ++j)
  184. t->mb.vec[i][j] = vec_4x4[i][j];
  185. p_min = pred_p16x16;
  186. t->mb.is_copy = 1;
  187. t->mb.mb_part = MB_16x16;
  188. t->mb.mb_part2[0] = part; //part;
  189. sad_min = sad_16x16;
  190. }
  191.     if (t->flags & USE_INTRAININTER)
  192.         sad = T264_mode_decision_intra_y(t);
  193.     else
  194.         sad = -1;
  195.     if (sad <= sad_min)
  196.     {
  197. t->mb.is_copy = 0;
  198.         sad_min = sad;
  199.     }
  200.     else
  201.     {
  202.         t->mb.mb_mode = B_MODE;
  203.         if (p_min != t->mb.pred_p16x16)
  204.             memcpy(t->mb.pred_p16x16, p_min, 16 * 16 * sizeof(uint8_t));
  205. /*        if (t->mb.mb_part == MB_16x16)
  206.             t->mb.is_copy = T264_detect_direct_16x16(t);*/
  207.     }
  208.     t->mb.sad = sad_min;
  209.     return t->mb.sad;
  210. }
  211. #define MINPOSITIVE(x, y) (x >= 0 && y >= 0) ? T264_MIN(x, y) : T264_MAX(x, y)
  212. static int32_t __inline
  213. T264_get_ref_idx(T264_t* t, int32_t list)
  214. {
  215.     int32_t ref_idx;
  216.     T264_vector_t vec[3];
  217.     vec[0] = t->mb.vec_ref[VEC_LUMA - 1].vec[list];
  218.     vec[1] = t->mb.vec_ref[VEC_LUMA - 8].vec[list];
  219.     vec[2] = t->mb.vec_ref[VEC_LUMA - 4].vec[list];
  220.     if (vec[2].refno == -2)
  221.     {
  222.         vec[2] = t->mb.vec_ref[VEC_LUMA - 8 - 1].vec[list];
  223.     }
  224.     ref_idx = MINPOSITIVE(vec[1].refno, vec[2].refno);
  225.     ref_idx = MINPOSITIVE(vec[0].refno, ref_idx);
  226.     return ref_idx;
  227. }
  228. #undef MINPOSITIVE
  229. static void __inline
  230. T264_try_get_col_zero_mv(T264_t* t, T264_vector_t vec_direct[2][16], int32_t refl0, int32_t refl1)
  231. {
  232.     int32_t i;
  233.     T264_mb_context_t* mb_n = &t->ref[1][0]->mb[t->mb.mb_xy];
  234. if(refl0 == 0 || refl1 == 0)
  235.     for (i = 0 ; i < 4 * 4 ; i ++)
  236.     {
  237.         if (((mb_n->vec[0][i].refno == 0) && 
  238.             ABS(mb_n->vec[0][i].x) <= 1 &&
  239.             ABS(mb_n->vec[0][i].y) <= 1) ||
  240. ((mb_n->vec[0][i].refno == -1) && (mb_n->vec[1][i].refno == 0) &&
  241.             ABS(mb_n->vec[1][i].x) <= 1 && ABS(mb_n->vec[1][i].y) <= 1))
  242.         {
  243.             if (refl0 == 0)
  244.             {
  245.                 vec_direct[0][i].refno = 0;
  246.                 vec_direct[0][i].x = 0;
  247.                 vec_direct[0][i].y = 0;
  248.             }
  249.             if (refl1 == 0)
  250.             {
  251.                 vec_direct[1][i].refno = 0;
  252.                 vec_direct[1][i].x = 0;
  253.                 vec_direct[1][i].y = 0;
  254.             }
  255.         }
  256.     }
  257. }
  258. void
  259. T264_get_direct_mv(T264_t* t, T264_vector_t vec_direct[2][16])
  260. {
  261.     int32_t refl0, refl1;
  262.     uint8_t mb_part;
  263.     if (t->param.direct_flag)
  264.     {
  265.         // l0
  266.         refl0 = T264_get_ref_idx(t, 0);
  267.         refl1 = T264_get_ref_idx(t, 1);
  268.         // directZeroPredictionFlag = 1
  269.         if (refl0 < 0 && refl1 < 0)
  270.         {
  271. int i,j;
  272.             //memset(vec_direct, 0, sizeof(vec_direct));
  273. for(i = 0;i < 2;++i)
  274. for(j = 0;j < 16; ++j)
  275. {
  276. vec_direct[i][j].refno = 0;
  277. vec_direct[i][j].x = 0;
  278. vec_direct[i][j].y = 0;
  279. }
  280.             return;
  281.         }
  282.     mb_part = t->mb.mb_part; //save old
  283.     t->mb.mb_part = MB_16x16;
  284.         if (refl0 < 0)
  285.         {
  286.             vec_direct[0][0].refno = refl0;
  287.             vec_direct[0][0].x = vec_direct[0][0].y = 0;
  288.             copy_nvec(&vec_direct[0][0], &vec_direct[0][0], 4, 4, 4);
  289.         }
  290.         else
  291.         {
  292.             // when refl0 > 0 use T264_predict_mv
  293.             T264_vector_t vec;
  294.             vec.refno = refl0;
  295.             T264_predict_mv(t, 0, 0, 4, &vec); 
  296.             copy_nvec(&vec, &vec_direct[0][0], 4, 4, 4);
  297.         }
  298.         if (refl1 < 0)
  299.         {
  300.             vec_direct[1][0].refno = refl1;
  301.             vec_direct[1][0].x = vec_direct[1][0].y = 0;
  302.             copy_nvec(&vec_direct[1][0], &vec_direct[1][0], 4, 4, 4);
  303.         }
  304.         else
  305.         {
  306.             T264_vector_t vec;
  307.             vec.refno = refl1;
  308.             T264_predict_mv(t, 1, 0, 4, &vec); 
  309.             copy_nvec(&vec, &vec_direct[1][0], 4, 4, 4);
  310.         }
  311.         // colZeroFlag
  312.         T264_try_get_col_zero_mv(t, vec_direct, refl0, refl1);
  313. t->mb.mb_part = mb_part; //restore
  314.     }
  315.     else
  316.     {
  317.         assert(0);
  318.     }    
  319. }
  320. uint32_t
  321. T264_mode_decision_inter_direct_16x16b(_RW T264_t* t, T264_vector_t predVec[2][4 * 4], uint8_t* pred, uint8_t* part)
  322. {
  323.     uint32_t sad;
  324. T264_get_direct_mv(t,predVec);
  325. T264_mb4x4_interb_mc(t,predVec,pred);
  326. sad = t->cmp[MB_16x16](pred,16,t->mb.src_y,t->stride);
  327. *part = B_DIRECT_16x16;
  328. return sad;
  329. }
  330. uint32_t
  331. T264_mode_decision_inter_16x16b(_RW T264_t* t, T264_vector_t vec_best[2][2], uint8_t* pred, uint8_t* part)
  332. {
  333.     DECLARE_ALIGNED_MATRIX(pred_l1, 16, 16, uint8_t, CACHE_SIZE);
  334.     DECLARE_ALIGNED_MATRIX(pred_bi, 16, 16, uint8_t, CACHE_SIZE);
  335.     
  336.     T264_vector_t vec[5 + 10];  // NOTE: max 10 refs
  337.     T264_search_context_t context;
  338.     int32_t num;
  339.     uint32_t sad_min, sad;
  340.     uint8_t* pred_l0 = pred;
  341.     uint8_t* p_min = pred_l0;
  342.     T264_vector_t vec_median;
  343.     int32_t i;
  344.     uint8_t* p_buf = pred_l1;
  345.     context.height = 16;
  346.     context.width  = 16;
  347.     context.limit_x= t->param.search_x;
  348.     context.limit_y= t->param.search_y;
  349.     context.vec    = vec;
  350.     context.mb_part= MB_16x16;
  351.     context.offset = (t->mb.mb_y << 4) * t->edged_stride + (t->mb.mb_x << 4);
  352.     // list 0
  353.     vec[0].refno = 0;
  354.     get_pmv(t, 0, vec, MB_16x16, 0, 4, &num);
  355.     context.vec_num= num;
  356.     context.list_index = 0;
  357.     sad_min = t->search(t, &context);
  358.     sad_min+= REFCOST(context.vec_best.refno);
  359.     sad_min = T264_quarter_pixel_search(t, 0, t->mb.src_y, t->ref[0][context.vec_best.refno], context.offset, 
  360.         &context.vec_best, &vec[0], sad_min, 16, 16, p_min, MB_16x16);
  361.     for(i = 1 ; i < t->refl0_num ; i ++)
  362.     {
  363.         T264_vector_t vec_best_bak, vec_median_bak;
  364.         
  365.         vec_median_bak = vec[0];
  366.         vec_best_bak = context.vec_best;
  367.         
  368.         vec[0].refno = i;
  369.         get_pmv(t, 0, vec, MB_16x16, 0, 4, &num);
  370.         context.vec_num= 1;
  371.         sad = t->search(t, &context);
  372.         sad+= REFCOST(context.vec_best.refno);
  373.         sad = T264_quarter_pixel_search(t, 0, t->mb.src_y, t->ref[0][i], context.offset, 
  374.             &context.vec_best, &vec[0], sad, 16, 16, p_buf, MB_16x16);
  375.         if (sad < sad_min)
  376.         {
  377.             SWAP(uint8_t, p_buf, p_min);
  378.             sad_min = sad;
  379.         }
  380.         else
  381.         {
  382.             vec[0] = vec_median_bak;
  383.             context.vec_best = vec_best_bak;
  384.         }
  385.     }
  386.     if (p_min != pred_l0)
  387.     {
  388.         memcpy(pred_l0, p_min, sizeof(uint8_t) * 16 * 16);
  389.     }
  390.     vec_best[0][0] = context.vec_best;
  391.     vec_median = vec[0];
  392.     *part = B_L0_16x16;
  393.     // list 1
  394.     vec_best[0][1].refno = -1;
  395.     vec_best[0][1].x = 0;
  396.     vec_best[0][1].y = 0;
  397.     if (t->refl1_num > 0)
  398.     {
  399.         uint32_t sad_l1, sad_bi;
  400.         vec[0].refno = 0;
  401.         get_pmv(t, 1, vec, MB_16x16, 0, 4, &num);
  402.         context.vec_num = num;
  403.         context.list_index = 1;
  404.         sad_l1 = t->search(t, &context);
  405.         sad_l1+= REFCOST1(context.vec_best.refno);
  406.         sad_l1 = T264_quarter_pixel_search(t, 1, t->mb.src_y, t->ref[1][context.vec_best.refno], context.offset, 
  407.             &context.vec_best, &vec[0], sad_l1, 16, 16, pred_l1, MB_16x16);
  408.         vec_best[0][1] = context.vec_best;
  409.         t->pia[MB_16x16](pred_l0, pred_l1, 16, 16, pred_bi, 16);
  410.         sad_bi = t->cmp[MB_16x16](t->mb.src_y, t->stride, pred_bi, 16) + t->mb.lambda *
  411.             (eg_size_se(t->bs, vec_best[0][0].x - vec_median.x) +
  412.              eg_size_se(t->bs, vec_best[0][0].y - vec_median.y) +
  413.              eg_size_se(t->bs, vec_best[0][1].x - vec[0].x) +
  414.              eg_size_se(t->bs, vec_best[0][1].y - vec[0].y)) +
  415.              REFCOST(vec_best[0][0].refno);
  416.         if (sad_bi < sad_min)
  417.         {
  418.             sad_min = sad_bi;
  419.             *part = B_Bi_16x16;
  420.             memcpy(pred_l0, pred_bi, 256 * sizeof(uint8_t));
  421.         }
  422.         if (sad_l1 < sad_min)
  423.         {
  424.             sad_min = sad_l1;
  425.             *part = B_L1_16x16;
  426.             memcpy(pred_l0, pred_l1, 256 * sizeof(uint8_t));
  427.             vec_best[0][0].refno = -1;
  428.             vec_best[0][0].x = 0;
  429.             vec_best[0][0].y = 0;
  430.         }
  431.         if (*part == B_L0_16x16)
  432.         {
  433.             vec_best[0][1].refno = -1;
  434.             vec_best[0][1].x = 0;
  435.             vec_best[0][1].y = 0;
  436.         }
  437.     }
  438. //    t->mb.is_copy = T264_detect_direct_16x16(t, vec_best[0]);
  439.     return sad_min;
  440. }
  441. uint32_t
  442. T264_mode_decision_inter_16x8b(_RW T264_t* t, T264_vector_t vec_best[2][2], uint8_t* pred, uint8_t* part)
  443. {
  444.     DECLARE_ALIGNED_MATRIX(pred_l1_m, 16, 16, uint8_t, CACHE_SIZE);
  445.     DECLARE_ALIGNED_MATRIX(pred_bi_m, 16, 16, uint8_t, CACHE_SIZE);
  446.     T264_vector_t vec[5 + 10];  // NOTE: max 10 refs
  447.     T264_search_context_t context;
  448.     int32_t num;
  449.     uint32_t sad_min;
  450.     uint32_t sad_all = 0;
  451.     uint8_t* pred_l0 = pred;
  452.     uint8_t* pred_l1 = pred_l1_m;
  453.     uint8_t* pred_bi = pred_bi_m;
  454.     T264_vector_t vec_median;
  455.     uint8_t old_part = t->mb.mb_part;
  456.     int32_t i;
  457.     uint8_t* src;
  458.     t->mb.mb_part = MB_16x8;
  459.     context.height = 8;
  460.     context.width  = 16;
  461.     context.limit_x= t->param.search_x;
  462.     context.limit_y= t->param.search_y;
  463.     context.vec    = vec;
  464.     context.mb_part= MB_16x8;
  465.     context.offset = (t->mb.mb_y << 4) * t->edged_stride + (t->mb.mb_x << 4);
  466.     src = t->mb.src_y;
  467.     for (i = 0 ; i < 2 ; i ++)
  468.     {
  469.         // list 0
  470.         vec[0].refno = vec_best[0][0].refno;
  471.         get_pmv(t, 0, vec, MB_16x8, luma_index[8 * i], 4, &num);
  472.         context.vec_num= num;
  473.         context.list_index = 0;
  474.         sad_min = t->search(t, &context);
  475.         sad_min+= REFCOST(context.vec_best.refno);
  476.         sad_min = T264_quarter_pixel_search(t, 0, src, t->ref[0][context.vec_best.refno], context.offset, 
  477.             &context.vec_best, &vec[0], sad_min, 16, 8, pred_l0, MB_16x8);
  478.         vec_best[i][0] = context.vec_best;
  479.         vec_median = vec[0];
  480.         part[i] = B_L0_16x8;
  481.         // list 1
  482.         vec_best[i][1].refno = -1;
  483.         vec_best[i][1].x = 0;
  484.         vec_best[i][1].y = 0;
  485.         if (t->refl1_num > 0)
  486.         {
  487.             uint32_t sad_l1, sad_bi;
  488.             vec[0].refno = 0;
  489.             get_pmv(t, 1, vec, MB_16x8, luma_index[8 * i], 4, &num);
  490.             context.vec_num = num;
  491.             context.list_index = 1;
  492.             sad_l1 = t->search(t, &context);
  493.             sad_l1+= REFCOST1(context.vec_best.refno);
  494.             sad_l1 = T264_quarter_pixel_search(t, 1, src, t->ref[1][context.vec_best.refno], context.offset, 
  495.                 &context.vec_best, &vec[0], sad_l1, 16, 8, pred_l1, MB_16x8);
  496.             vec_best[i][1] = context.vec_best;
  497.             t->pia[MB_16x8](pred_l0, pred_l1, 16, 16, pred_bi, 16);
  498.             sad_bi = t->cmp[MB_16x8](src, t->stride, pred_bi, 16) + t->mb.lambda *
  499.                 (eg_size_se(t->bs, vec_best[i][0].x - vec_median.x) +
  500.                 eg_size_se(t->bs, vec_best[i][0].y - vec_median.y) +
  501.                 eg_size_se(t->bs, vec_best[i][1].x - vec[0].x) +
  502.                 eg_size_se(t->bs, vec_best[i][1].y - vec[0].y)) +
  503.                 REFCOST(vec_best[i][0].refno);
  504.             if (sad_bi < sad_min)
  505.             {
  506.                 sad_min = sad_bi;
  507.                 part[i] = B_Bi_16x8;
  508.                 memcpy(pred_l0, pred_bi, sizeof(uint8_t) * 16 * 8);
  509.             }
  510.             if (sad_l1 < sad_min)
  511.             {
  512.                 sad_min = sad_l1;
  513.                 part[i] = B_L1_16x8;
  514.                 memcpy(pred_l0, pred_l1, sizeof(uint8_t) * 16 * 8);
  515.                 vec_best[i][0].refno = -1;
  516.                 vec_best[i][0].x = 0;
  517.                 vec_best[i][0].y = 0;
  518.             }
  519.             if (part[i] == B_L0_16x8)
  520.             {
  521.                 vec_best[i][1].refno = -1;
  522.                 vec_best[i][1].x = 0;
  523.                 vec_best[i][1].y = 0;
  524.             }
  525.         }
  526.         pred_l0 += 16 * 8;
  527.         pred_l1 += 16 * 8;
  528.         pred_bi += 16 * 8;
  529.         t->mb.vec_ref[VEC_LUMA + 8].vec[0] = vec_best[i][0];
  530.         t->mb.vec_ref[VEC_LUMA + 8].vec[1] = vec_best[i][1];
  531.         context.offset += 8 * t->edged_stride;
  532.         src += 8 * t->stride;
  533.         sad_all += sad_min;
  534.     }
  535.     t->mb.mb_part = old_part;
  536.     return sad_all;
  537. }
  538. uint32_t
  539. T264_mode_decision_inter_8x16b(_RW T264_t* t, T264_vector_t vec_best[2][2], uint8_t* pred, uint8_t* part)
  540. {
  541.     DECLARE_ALIGNED_MATRIX(pred_l1_m, 16, 16, uint8_t, CACHE_SIZE);
  542.     DECLARE_ALIGNED_MATRIX(pred_bi_m, 16, 16, uint8_t, CACHE_SIZE);
  543.     T264_vector_t vec[5 + 10];  // NOTE: max 10 refs
  544.     T264_search_context_t context;
  545.     int32_t num;
  546.     uint32_t sad_min;
  547.     uint32_t sad_all = 0;
  548.     uint8_t* pred_l0 = pred;
  549.     uint8_t* pred_l1 = pred_l1_m;
  550.     uint8_t* pred_bi = pred_bi_m;
  551.     T264_vector_t vec_median;
  552.     uint8_t old_part = t->mb.mb_part;
  553.     int32_t i;
  554.     uint8_t* src;
  555.     t->mb.mb_part = MB_8x16;
  556.     context.height = 16;
  557.     context.width  = 8;
  558.     context.limit_x= t->param.search_x;
  559.     context.limit_y= t->param.search_y;
  560.     context.vec    = vec;
  561.     context.mb_part= MB_8x16;
  562.     context.offset = (t->mb.mb_y << 4) * t->edged_stride + (t->mb.mb_x << 4);
  563.     src = t->mb.src_y;
  564.     for (i = 0 ; i < 2 ; i ++)
  565.     {
  566.         // list 0
  567.         vec[0].refno = vec_best[0][0].refno;
  568.         get_pmv(t, 0, vec, MB_8x16, luma_index[4 * i], 2, &num);
  569.         context.vec_num= num;
  570.         context.list_index = 0;
  571.         sad_min = t->search(t, &context);
  572.         sad_min+= REFCOST(context.vec_best.refno);
  573.         sad_min = T264_quarter_pixel_search(t, 0, src, t->ref[0][context.vec_best.refno], context.offset, 
  574.             &context.vec_best, &vec[0], sad_min, 8, 16, pred_l0, MB_8x16);
  575.         vec_best[i][0] = context.vec_best;
  576.         vec_median = vec[0];
  577.         part[i] = B_L0_8x16;
  578.         // list 1
  579.         vec_best[i][1].refno = -1;
  580.         vec_best[i][1].x = 0;
  581.         vec_best[i][1].y = 0;
  582.         if (t->refl1_num > 0)
  583.         {
  584.             uint32_t sad_l1, sad_bi;
  585.             vec[0].refno = 0;
  586.             get_pmv(t, 1, vec, MB_8x16, luma_index[4 * i], 2, &num);
  587.             context.vec_num = num;
  588.             context.list_index = 1;
  589.             sad_l1 = t->search(t, &context);
  590.             sad_l1+= REFCOST1(context.vec_best.refno);
  591.             sad_l1 = T264_quarter_pixel_search(t, 1, src, t->ref[1][context.vec_best.refno], context.offset, 
  592.                 &context.vec_best, &vec[0], sad_l1, 8, 16, pred_l1, MB_8x16);
  593.             vec_best[i][1] = context.vec_best;
  594.             t->pia[MB_8x16](pred_l0, pred_l1, 16, 16, pred_bi, 16);
  595.             sad_bi = t->cmp[MB_8x16](src, t->stride, pred_bi, 16) + t->mb.lambda *
  596.                 (eg_size_se(t->bs, vec_best[i][0].x - vec_median.x) +
  597.                 eg_size_se(t->bs, vec_best[i][0].y - vec_median.y) +
  598.                 eg_size_se(t->bs, vec_best[i][1].x - vec[0].x) +
  599.                 eg_size_se(t->bs, vec_best[i][1].y - vec[0].y)) +
  600.                 REFCOST(vec_best[i][0].refno);
  601.             if (sad_bi < sad_min)
  602.             {
  603.                 sad_min = sad_bi;
  604.                 part[i] = B_Bi_8x16;
  605.                 t->memcpy_stride_u(pred_bi, 8, 16, 16, pred_l0, 16);
  606.             }
  607.             if (sad_l1 < sad_min)
  608.             {
  609.                 sad_min = sad_l1;
  610.                 part[i] = B_L1_8x16;
  611.                 t->memcpy_stride_u(pred_l1, 8, 16, 16, pred_l0, 16);
  612.                 vec_best[i][0].refno = -1;
  613.                 vec_best[i][0].x = 0;
  614.                 vec_best[i][0].y = 0;
  615.             }
  616.             if (part[i] == B_L0_8x16)
  617.             {
  618.                 vec_best[i][1].refno = -1;
  619.                 vec_best[i][1].x = 0;
  620.                 vec_best[i][1].y = 0;
  621.             }
  622.         }
  623.         pred_l0 += 8;
  624.         pred_l1 += 8;
  625.         pred_bi += 8;
  626.         t->mb.vec_ref[VEC_LUMA + 1].vec[0] = vec_best[i][0];
  627.         t->mb.vec_ref[VEC_LUMA + 1].vec[1] = vec_best[i][1];
  628.         context.offset += 8;
  629.         src += 8;
  630.         sad_all += sad_min;
  631.     }
  632.     t->mb.mb_part = old_part;
  633.     return sad_all;
  634. }
  635. uint32_t
  636. T264_mode_decision_inter_8x8b(_RW T264_t * t, int32_t i, T264_vector_t vec_best[2], uint8_t* pred, uint8_t* part)
  637. {
  638.     DECLARE_ALIGNED_MATRIX(pred_l1, 16, 16, uint8_t, CACHE_SIZE);
  639.     DECLARE_ALIGNED_MATRIX(pred_bi, 16, 16, uint8_t, CACHE_SIZE);
  640.     T264_vector_t vec[5 + 10];  // NOTE: max 10 refs
  641.     T264_search_context_t context;
  642.     int32_t num;
  643.     uint32_t sad_min;
  644.     T264_vector_t vec_median;
  645.     uint8_t* pred_l0 = pred;
  646.     uint8_t* src = t->mb.src_y + (i / 2 * 8) * t->stride + i % 2 * 8;
  647.     uint8_t* dst = pred + i / 2 * 16 * 8 + i % 2 * 8;
  648.     context.height = 8;
  649.     context.width  = 8;
  650.     context.limit_x= t->param.search_x;
  651.     context.limit_y= t->param.search_y;
  652.     context.vec    = vec;
  653.     context.mb_part= MB_8x8;
  654.     context.offset = ((t->mb.mb_y << 4) + i / 2 * 8) * t->edged_stride + (t->mb.mb_x << 4) + i % 2 * 8;
  655.     vec[0].refno = vec_best[0].refno;
  656.     get_pmv(t, 0, vec, MB_8x8, luma_index[4 * i], 2, &num);
  657.     context.vec_num= num;
  658.     context.list_index = 0;
  659.     sad_min = t->search(t, &context);
  660.     sad_min+= eg_size_ue(t->bs, B_L0_8x8) + REFCOST(context.vec_best.refno);
  661.     sad_min = T264_quarter_pixel_search(t, 0, src, t->ref[0][context.vec_best.refno], context.offset, 
  662.         &context.vec_best, &vec[0], sad_min, 8, 8, dst, MB_8x8);
  663.     vec_best[0] = context.vec_best;
  664.     vec_median = vec[0];
  665.     *part = B_L0_8x8;
  666.     // list 1
  667.     vec_best[1].refno = -1;
  668.     vec_best[1].x = 0;
  669.     vec_best[1].y = 0;
  670.     if (t->refl1_num > 0)
  671.     {
  672.         uint32_t sad_l1, sad_bi;
  673.         vec[0].refno = 0;
  674.         get_pmv(t, 1, vec, MB_8x8, luma_index[4 * i], 2, &num);
  675.         context.vec_num= num;
  676.         context.list_index = 1;
  677.         sad_l1 = t->search(t, &context);
  678.         sad_l1+= eg_size_ue(t->bs, B_L1_8x8) + REFCOST1(context.vec_best.refno);
  679.         sad_l1 = T264_quarter_pixel_search(t, 1, src, t->ref[1][context.vec_best.refno], context.offset, 
  680.             &context.vec_best, &vec[0], sad_l1, 8, 8, pred_l1, MB_8x8);
  681.         vec_best[1] = context.vec_best;
  682.         t->pia[MB_8x8](dst, pred_l1, 16, 16, pred_bi, 16);
  683.         sad_bi = t->cmp[MB_8x8](src, t->stride, pred_bi, 16) + t->mb.lambda *
  684.            (eg_size_se(t->bs, vec_best[0].x - vec_median.x) +
  685.             eg_size_se(t->bs, vec_best[0].y - vec_median.y) +
  686.             eg_size_se(t->bs, vec_best[1].x - vec[0].x) +
  687.             eg_size_se(t->bs, vec_best[1].y - vec[0].y) + 
  688.             2 * T264_MIN(context.vec_best.refno, 1)) +
  689.             eg_size_ue(t->bs, B_Bi_8x8) +
  690.             REFCOST(vec_best[0].refno);
  691.         if (sad_bi < sad_min)
  692.         {
  693.             sad_min = sad_bi;
  694.             *part = B_Bi_8x8;
  695.             t->memcpy_stride_u(pred_bi, 8, 8, 16, dst, 16);
  696.         }
  697.         if (sad_l1 < sad_min)
  698.         {
  699.             sad_min = sad_l1;
  700.             *part = B_L1_8x8;
  701.             t->memcpy_stride_u(pred_l1, 8, 8, 16, dst, 16);
  702.             
  703.             vec_best[0].refno = -1;
  704.             vec_best[0].x = 0;
  705.             vec_best[0].y = 0;
  706.         }
  707.         if (*part == B_L0_8x8)
  708.         {
  709.             vec_best[1].refno = -1;
  710.             vec_best[1].x = 0;
  711.             vec_best[1].y = 0;
  712.         }
  713.     }
  714.     return sad_min;
  715. }
  716. void
  717. T264_encode_interb_uv(_RW T264_t* t)
  718. {
  719.     DECLARE_ALIGNED_MATRIX(pred_u, 8, 8, uint8_t, CACHE_SIZE);
  720.     DECLARE_ALIGNED_MATRIX(pred_v, 8, 8, uint8_t, CACHE_SIZE);
  721.     DECLARE_ALIGNED_MATRIX(pred_u_l0, 8, 8, uint8_t, CACHE_SIZE);
  722.     DECLARE_ALIGNED_MATRIX(pred_v_l0, 8, 8, uint8_t, CACHE_SIZE);
  723.     DECLARE_ALIGNED_MATRIX(pred_u_l1, 8, 8, uint8_t, CACHE_SIZE);
  724.     DECLARE_ALIGNED_MATRIX(pred_v_l1, 8, 8, uint8_t, CACHE_SIZE);
  725.     T264_vector_t vec;
  726.     uint8_t* src, *dst;
  727.     int32_t i;
  728. if(t->mb.is_copy)
  729. {
  730. T264_mb4x4_interb_uv_mc(t,t->mb.vec,pred_u,pred_v);
  731. }else
  732.     switch (t->mb.mb_part)
  733.     {
  734.     case MB_16x16:
  735.         {
  736.             switch (t->mb.mb_part2[0])
  737.             {
  738.             case B_L0_16x16:
  739.                 vec = t->mb.vec[0][0];
  740.                 src = t->ref[0][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  741.                 dst = pred_u;
  742.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 8);
  743.                 src = t->ref[0][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  744.                 dst = pred_v;
  745.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 8);
  746.                 break;
  747.             case B_L1_16x16:
  748.                 vec = t->mb.vec[1][0];
  749.                 src = t->ref[1][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  750.                 dst = pred_u;
  751.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 8);
  752.                 src = t->ref[1][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  753.                 dst = pred_v;
  754.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 8);
  755.                 break;
  756.             case B_Bi_16x16:
  757.                 vec = t->mb.vec[0][0];
  758.                 src = t->ref[0][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  759.                 dst = pred_u_l0;
  760.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 8);
  761.                 src = t->ref[0][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  762.                 dst = pred_v_l0;
  763.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 8);
  764.                 vec = t->mb.vec[1][0];
  765.                 src = t->ref[1][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  766.                 dst = pred_u_l1;
  767.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 8);
  768.                 src = t->ref[1][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  769.                 dst = pred_v_l1;
  770.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 8);
  771.                 t->pia[MB_8x8](pred_u_l0, pred_u_l1, 8, 8, pred_u, 8);
  772.                 t->pia[MB_8x8](pred_v_l0, pred_v_l1, 8, 8, pred_v, 8);
  773.                 break;
  774.             }
  775.         }
  776.         break;
  777.     case MB_16x8:
  778.         {
  779.             for (i = 0 ; i < 2 ; i ++)
  780.             {
  781.                 switch (t->mb.mb_part2[i])
  782.                 {
  783.                 case B_L0_16x8:
  784.                     vec = t->mb.vec[0][i * 8];
  785.                     src = t->ref[0][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  786.                     dst = pred_u + i * 8 * 4;
  787.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 4);
  788.                     src = t->ref[0][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  789.                     dst = pred_v + i * 8 * 4;
  790.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 4);
  791.                     break;
  792.                 case B_L1_16x8:
  793.                     vec = t->mb.vec[1][i * 8];
  794.                     src = t->ref[1][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  795.                     dst = pred_u + i * 8 * 4;
  796.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 4);
  797.                     src = t->ref[1][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  798.                     dst = pred_v + i * 8 * 4;
  799.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 4);
  800.                     break;
  801.                 case B_Bi_16x8:
  802.                     vec = t->mb.vec[0][i * 8];
  803.                     src = t->ref[0][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  804.                     dst = pred_u_l0 + i * 8 * 4;
  805.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 4);
  806.                     src = t->ref[0][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  807.                     dst = pred_v_l0 + i * 8 * 4;
  808.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 4);
  809.                     vec = t->mb.vec[1][i * 8];
  810.                     src = t->ref[1][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3) + i * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  811.                     dst = pred_u_l1 + i * 8 * 4;
  812.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 4);
  813.                     src = t->ref[1][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3) + i * 4) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3);
  814.                     dst = pred_v_l1 + i * 8 * 4;
  815.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 8, 4);
  816.                     t->pia[MB_8x4](pred_u_l0 + i * 8 * 4, pred_u_l1 + i * 8 * 4, 8, 8, pred_u + i * 8 * 4, 8);
  817.                     t->pia[MB_8x4](pred_v_l0 + i * 8 * 4, pred_v_l1 + i * 8 * 4, 8, 8, pred_v + i * 8 * 4, 8);
  818.                     break;
  819.                 }
  820.             }
  821.         }
  822.         break;
  823.     case MB_8x16:
  824.         {
  825.             for (i = 0 ; i < 2 ; i ++)
  826.             {
  827.                 switch (t->mb.mb_part2[i])
  828.                 {
  829.                 case B_L0_8x16:
  830.                     vec = t->mb.vec[0][i * 2];
  831.                     src = t->ref[0][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + i * 4;
  832.                     dst = pred_u + i * 4;
  833.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 8);
  834.                     src = t->ref[0][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + i * 4;
  835.                     dst = pred_v + i * 4;
  836.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 8);
  837.                     break;
  838.                 case B_L1_8x16:
  839.                     vec = t->mb.vec[1][i * 2];
  840.                     src = t->ref[1][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + i * 4;
  841.                     dst = pred_u + i * 4;
  842.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 8);
  843.                     src = t->ref[1][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + i * 4;
  844.                     dst = pred_v + i * 4;
  845.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 8);
  846.                     break;
  847.                 case B_Bi_8x16:
  848.                     vec = t->mb.vec[0][i * 2];
  849.                     src = t->ref[0][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + i * 4;
  850.                     dst = pred_u_l0 + i * 4;
  851.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 8);
  852.                     src = t->ref[0][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + i * 4;
  853.                     dst = pred_v_l0 + i * 4;
  854.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 8);
  855.                     vec = t->mb.vec[1][i * 2];
  856.                     src = t->ref[1][vec.refno]->U + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + i * 4;
  857.                     dst = pred_u_l1 + i * 4;
  858.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 8);
  859.                     src = t->ref[1][vec.refno]->V + ((t->mb.mb_y << 3) + (vec.y >> 3)) * t->edged_stride_uv + (t->mb.mb_x << 3) + (vec.x >> 3) + i * 4;
  860.                     dst = pred_v_l1 + i * 4;
  861.                     t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 8);
  862.                     t->pia[MB_4x8](pred_u_l0 + i * 4, pred_u_l1 + i * 4, 8, 8, pred_u + i * 4, 8);
  863.                     t->pia[MB_4x8](pred_v_l0 + i * 4, pred_v_l1 + i * 4, 8, 8, pred_v + i * 4, 8);
  864.                     break;
  865.                 }
  866.             }
  867.         }
  868.         break;
  869.     case MB_8x8:
  870.         for(i = 0 ; i < 4 ; i ++)
  871.         {
  872.             int32_t offset = i / 2 * 32 + i % 2 * 4;
  873.             switch(t->mb.submb_part[luma_index[4 * i]])
  874.             {
  875.             case B_L0_8x8:
  876.                 vec = t->mb.vec[0][luma_index[4 * i]];
  877.                 src = t->ref[0][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);
  878.                 dst = pred_u + offset;
  879.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 4);
  880.                 src = t->ref[0][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);
  881.                 dst = pred_v + offset;
  882.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 4);
  883.                 break;
  884.             case B_L1_8x8:
  885.                 vec = t->mb.vec[1][luma_index[4 * i]];
  886.                 src = t->ref[1][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);
  887.                 dst = pred_u + offset;
  888.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 4);
  889.                 src = t->ref[1][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);
  890.                 dst = pred_v + offset;
  891.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 4);
  892.                 break;
  893.             case B_Bi_8x8:
  894.                 vec = t->mb.vec[0][luma_index[4 * i]];
  895.                 src = t->ref[0][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);
  896.                 dst = pred_u_l0 + offset;
  897.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 4);
  898.                 src = t->ref[0][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.                 dst = pred_v_l0 + offset;
  900.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 4);
  901.                 vec = t->mb.vec[1][luma_index[4 * i]];
  902.                 src = t->ref[1][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);
  903.                 dst = pred_u_l1 + offset;
  904.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 4);
  905.                 src = t->ref[1][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);
  906.                 dst = pred_v_l1 + offset;
  907.                 t->eighth_pixel_mc_u(src, t->edged_stride_uv, dst, vec.x, vec.y, 4, 4);
  908.                 t->pia[MB_4x4](pred_u_l0 + offset, pred_u_l1 + offset, 8, 8, pred_u + offset, 8);
  909.                 t->pia[MB_4x4](pred_v_l0 + offset, pred_v_l1 + offset, 8, 8, pred_v + offset, 8);
  910.                 break;
  911.             default:
  912.                 break;
  913.             }
  914.         }
  915.         break;
  916.     default:
  917.         break;
  918.     }
  919.     T264_transform_inter_uv(t, pred_u, pred_v);
  920. }