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

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. * Added support for B frame,20041223 Cloud Wu<sywu@sohu.com>
  8. *  This program is free software ; you can redistribute it and/or modify
  9. *  it under the terms of the GNU General Public License as published by
  10. *  the Free Software Foundation ; either version 2 of the License, or
  11. *  (at your option) any later version.
  12. *
  13. *  This program is distributed in the hope that it will be useful,
  14. *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  15. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. *  GNU General Public License for more details.
  17. *
  18. *  You should have received a copy of the GNU General Public License
  19. *  along with this program ; if not, write to the Free Software
  20. *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  21. *
  22. ****************************************************************************/
  23. #include "stdio.h"
  24. #include "T264.h"
  25. #include "assert.h"
  26. #define IS_INTRA(mode) (mode <= I_16x16)
  27. static const uint8_t deblock_threshold_a[] = 
  28. {
  29.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  30.     0, 0, 0, 4, 4, 5, 6, 7, 8, 9, 10, 12, 13,
  31.     15,17,20,22,25,28,32,36,40,45,50,56,63,71,
  32.     80,90,101,113,127,144,162,182,203,226,255,255
  33. };
  34. static const uint8_t deblock_threshold_b[] = 
  35. {
  36.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  37.     0, 0, 0, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,
  38.     6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11,12,
  39.     12,13,13,14,14,15,15,16,16,17,17,18,18
  40. };
  41. static const uint8_t deblock_threshold_tc0[][3] = 
  42. {
  43.     { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },
  44.     { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },
  45.     { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 1 },
  46.     { 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, { 0, 1, 1 }, { 0, 1, 1 }, { 1, 1, 1 },
  47.     { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 2 }, { 1, 1, 2 }, { 1, 1, 2 },
  48.     { 1, 1, 2 }, { 1, 2, 3 }, { 1, 2, 3 }, { 2, 2, 3 }, { 2, 2, 4 }, { 2, 3, 4 },
  49.     { 2, 3, 4 }, { 3, 3, 5 }, { 3, 4, 6 }, { 3, 4, 6 }, { 4, 5, 7 }, { 4, 5, 8 },
  50.     { 4, 6, 9 }, { 5, 7,10 }, { 6, 8,11 }, { 6, 8,13 }, { 7,10,14 }, { 8,11,16 },
  51.     { 9,12,18 }, {10,13,20 }, {11,15,23 }, {13,17,25 }
  52. };
  53. static void __inline
  54. get_strength(T264_t* t, uint8_t bS[4], int32_t dir, int32_t edge, T264_mb_context_t* cur, T264_mb_context_t* prev)
  55. {
  56.     int32_t row_stride, col_stride;
  57.     int32_t n;
  58.     
  59.     if (dir == 0)
  60.     {
  61.         row_stride = 4;
  62.         col_stride = 1;
  63.     }
  64.     else
  65.     {
  66.         row_stride = 1;
  67.         col_stride = 4;
  68.     }
  69.     if (IS_INTRA(cur->mb_mode) || IS_INTRA(prev->mb_mode))
  70.     {
  71.         bS[0] = bS[1] = bS[2] = bS[3] = (edge == 0) ? 4 : 3;
  72.     }
  73.     else
  74.     {
  75.         for(n = 0 ; n < 4 ; n ++)
  76.         {
  77.             int32_t pos = n * row_stride + edge * col_stride;
  78.             int32_t pos_n;
  79.             if (cur == prev)
  80.             { //If is macro blcok border
  81.                 pos_n = dir == 0 ? pos - 1 : pos - 4;
  82.             }
  83.             else
  84.             {
  85.                 pos_n = dir == 0 ? 4 * n + 3 : 12 + n;
  86.             }
  87.             if (cur->nnz[pos] || prev->nnz[pos_n])
  88.             {
  89.                 bS[n] = 2;
  90.             }
  91.             else if (t->slice_type == SLICE_P) 
  92.             {
  93.                 int32_t ref, ref_n;
  94.                 ref = cur->vec[0][pos].refno;
  95.                 ref_n = prev->vec[0][pos_n].refno;
  96.                 assert(cur->vec[0][pos].refno != -2);
  97.                 assert(prev->vec[0][pos_n].refno != -2);
  98.                 bS[n] = ((ref != ref_n) |
  99.                     (ABS(cur->vec[0][pos].x - prev->vec[0][pos_n].x) >= 4) |
  100.                     (ABS(cur->vec[0][pos].y - prev->vec[0][pos_n].y) >= 4));
  101.             }
  102.             else 
  103.             {
  104.                 int32_t ref0,ref1, ref_n0,ref_n1;
  105.                 
  106.                 ref0 = cur->vec[0][pos].refno;
  107.                 ref1 = cur->vec[1][pos].refno;                
  108.                 ref_n0 = prev->vec[0][pos_n].refno;  
  109.                 ref_n1 = prev->vec[1][pos_n].refno;       
  110. ref0 = ref0 < 0? -1 : ref0;
  111. ref1 = ref1 < 0? -1 : ref1 + MAX_REFFRAMES;
  112.                 ref_n0 = ref_n0 < 0? -1 : ref_n0;  
  113.                 ref_n1 = ref_n1 < 0? -1 : ref_n1 + MAX_REFFRAMES;  
  114.                 assert(ref0 > -1 || ref1 > -1);
  115. if((ref0 == ref_n0 && ref1 == ref_n1) ||
  116. (ref1 == ref_n0 && ref0 == ref_n1))
  117. {
  118.                  bS[n] = 0;
  119.                  if(ref0 == ref1)
  120.                 { //if all use the same reference frame
  121. bS[n] = (
  122. (ABS(cur->vec[0][pos].x - prev->vec[0][pos_n].x) >= 4) |
  123. (ABS(cur->vec[0][pos].y - prev->vec[0][pos_n].y) >= 4) |
  124. (ABS(cur->vec[1][pos].x - prev->vec[1][pos_n].x) >= 4) |
  125. (ABS(cur->vec[1][pos].y - prev->vec[1][pos_n].y) >= 4))
  126. &&
  127. (
  128. (ABS(cur->vec[0][pos].x - prev->vec[1][pos_n].x) >= 4) |
  129. (ABS(cur->vec[0][pos].y - prev->vec[1][pos_n].y) >= 4) |
  130. (ABS(cur->vec[1][pos].x - prev->vec[0][pos_n].x) >= 4) |
  131. (ABS(cur->vec[1][pos].y - prev->vec[0][pos_n].y) >= 4));
  132.                 }else
  133.               {
  134.               if(ref0 == ref_n0)
  135.                 { //if list0 reference frame are the same
  136.                  bS[n] = 
  137.                  (ABS(cur->vec[0][pos].x - prev->vec[0][pos_n].x) >= 4) |
  138. (ABS(cur->vec[0][pos].y - prev->vec[0][pos_n].y) >= 4) |
  139. (ABS(cur->vec[1][pos].x - prev->vec[1][pos_n].x) >= 4) |
  140. (ABS(cur->vec[1][pos].y - prev->vec[1][pos_n].y) >= 4);
  141.                  }else
  142.                 {
  143.                 bS[n] = 
  144.                 (ABS(cur->vec[0][pos].x - prev->vec[1][pos_n].x) >= 4) |
  145. (ABS(cur->vec[0][pos].y - prev->vec[1][pos_n].y) >= 4) |
  146. (ABS(cur->vec[1][pos].x - prev->vec[0][pos_n].x) >= 4) |
  147. (ABS(cur->vec[1][pos].y - prev->vec[0][pos_n].y) >= 4);
  148.                 }
  149.              }
  150.                 }else
  151.                 {
  152.                  bS[n] =1;
  153.                 }
  154.             }
  155.        }
  156.     }
  157. }
  158. static __inline void
  159. EdgeLoopH(T264_t* t, uint8_t* dst, int32_t stride, uint8_t indexA, int32_t alpha, int32_t beta, uint8_t bS, int32_t is_chroma)
  160. {
  161.     int32_t ap, aq, tmp;
  162.     uint8_t p[4];
  163.     uint8_t q[4];
  164.     q[0] = dst[0];
  165.     p[0] = dst[-1];
  166.     if (ABS(p[0] - q[0]) < alpha)
  167.     {
  168.         p[1] = dst[-2];
  169.         if (ABS(p[1] - p[0]) < beta)
  170.         {
  171.             q[1] = dst[1];
  172.             if (ABS(q[1] - q[0]) < beta)
  173.             {
  174.                 if (bS < 4)
  175.                 {
  176.                     int32_t tc0, tc, delta;
  177.                     tc0 = deblock_threshold_tc0[indexA][bS - 1];
  178.                     if (is_chroma == 0)
  179.                     {
  180.                         q[2] = dst[2];
  181.                         p[2] = dst[-3];
  182.                         ap = ABS(p[2] - p[0]);
  183.                         aq = ABS(q[2] - q[0]);
  184.                         tc =  tc0;
  185.                         if (ap < beta)
  186.                         {
  187.                             dst[-2] = p[1] + clip3(((p[2] + ((p[0] + q[0] + 1) >> 1) - (p[1] << 1)) >> 1), -tc0, tc0);
  188.                             tc ++;
  189.                         }
  190.                         if (aq < beta)
  191.                         {
  192.                             dst[1] = q[1] + clip3(((q[2] + ((p[0] + q[0] + 1) >> 1) - (q[1] << 1)) >> 1), -tc0, tc0);
  193.                             tc ++;
  194.                         }
  195.                     }
  196.                     else
  197.                     {
  198.                         tc = tc0 + 1;
  199.                     }
  200.                     delta = clip3(((((q[0] - p[0]) << 2) + (p[1] - q[1]) + 4) >> 3), -tc, tc);
  201.                     tmp = p[0] + delta;
  202.                     dst[-1] = CLIP1(tmp);
  203.                     tmp = q[0] - delta;
  204.                     dst[0] = CLIP1(tmp);
  205.                 }
  206.                 else
  207.                 {
  208.                     if (ABS(p[0] - q[0]) < ((alpha >> 2) + 2))
  209.                     {
  210.                         if (is_chroma == 0)
  211.                         {
  212.                             q[2] = dst[2];
  213.                             p[2] = dst[-3];
  214.                             ap = ABS(p[2] - p[0]);
  215.                             aq = ABS(q[2] - q[0]);
  216.                             if (ap < beta)
  217.                             {
  218.                                 p[3] = dst[-4];
  219.                                 dst[-1] = (p[2] + 2 * p[1] + 2 * p[0] + 2 * q[0] + q[1] + 4) >> 3;
  220.                                 dst[-2] = (p[2] + p[1] + p[0] + q[0] + 2) >> 2;
  221.                                 dst[-3] = (2 * p[3] + 3 * p[2] + p[1] + p[0] + q[0] + 4) >> 3;
  222.                             }
  223.                             else
  224.                             {
  225.                                 dst[-1] = (2 * p[1] + p[0] + q[1] + 2 ) >> 2;
  226.                             }
  227.                             if (aq < beta)
  228.                             {
  229.                                 q[3] = dst[3];
  230.                                 dst[0] = (p[1] + 2 * p[0] + 2 * q[0] + 2 * q[1] + q[2] + 4) >> 3;
  231.                                 dst[1] = (p[0] + q[0] + q[1] + q[2] + 2) >> 2;
  232.                                 dst[2] = (2 * q[3] + 3 * q[2] + q[1] + q[0] + p[0] + 4) >> 3;
  233.                             }
  234.                             else
  235.                             {
  236.                                 dst[0] = (2 * q[1] + q[0] + p[1] + 2 ) >> 2;
  237.                             }
  238.                         }
  239.                         else
  240.                         {
  241.                             dst[-1] = (2 * p[1] + p[0] + q[1] + 2 ) >> 2;
  242.                             dst[0] = (2 * q[1] + q[0] + p[1] + 2 ) >> 2;
  243.                         }
  244.                     }
  245.                     else
  246.                     {
  247.                         dst[-1] = (2 * p[1] + p[0] + q[1] + 2 ) >> 2;
  248.                         dst[0] = (2 * q[1] + q[0] + p[1] + 2 ) >> 2;
  249.                     }
  250.                 }
  251.             }
  252.         }
  253.     }
  254. }
  255. static __inline void
  256. EdgeLoopV(T264_t* t, uint8_t* dst, int32_t stride, uint8_t indexA, int32_t alpha, int32_t beta, uint8_t bS, int32_t is_chroma)
  257. {
  258.     int32_t ap, aq, tmp;
  259.     uint8_t p[4];
  260.     uint8_t q[4];
  261.     q[0] = dst[0];
  262.     p[0] = dst[-1 * stride];
  263.     if (ABS(p[0] - q[0]) < alpha)
  264.     {
  265.         p[1] = dst[-2 * stride];
  266.         if (ABS(p[1] - p[0]) < beta)
  267.         {
  268.             q[1] = dst[1 * stride];
  269.             if (ABS(q[1] - q[0]) < beta)
  270.             {
  271.                 if (bS < 4)
  272.                 {
  273.                     int32_t tc0, tc, delta;
  274.                     tc0 = deblock_threshold_tc0[indexA][bS - 1];
  275.                     if (is_chroma == 0)
  276.                     {
  277.                         q[2] = dst[2 * stride];
  278.                         p[2] = dst[-3 * stride];
  279.                         ap = ABS(p[2] - p[0]);
  280.                         aq = ABS(q[2] - q[0]);
  281.                         tc =  tc0;
  282.                         if (ap < beta)
  283.                         {
  284.                             dst[-2 * stride] = p[1] + clip3(((p[2] + ((p[0] + q[0] + 1) >> 1) - (p[1] << 1)) >> 1), -tc0, tc0);
  285.                             tc ++;
  286.                         }
  287.                         if (aq < beta)
  288.                         {
  289.                             dst[1 * stride] = q[1] + clip3(((q[2] + ((p[0] + q[0] + 1) >> 1) - (q[1] << 1)) >> 1), -tc0, tc0);
  290.                             tc ++;
  291.                         }
  292.                     }
  293.                     else
  294.                     {
  295.                         tc = tc0 + 1;
  296.                     }
  297.                     delta = clip3(((((q[0] - p[0]) << 2) + (p[1] - q[1]) + 4) >> 3), -tc, tc);
  298.                     tmp = p[0] + delta;
  299.                     dst[-1 * stride] = CLIP1(tmp);
  300.                     tmp = q[0] - delta;
  301.                     dst[0] = CLIP1(tmp);
  302.                 }
  303.                 else
  304.                 {
  305.                     if (ABS(p[0] - q[0]) < ((alpha >> 2) + 2))
  306.                     {
  307.                         if (is_chroma == 0)
  308.                         {
  309.                             q[2] = dst[2 * stride];
  310.                             p[2] = dst[-3 * stride];
  311.                             ap = ABS(p[2] - p[0]);
  312.                             aq = ABS(q[2] - q[0]);
  313.                             if (ap < beta)
  314.                             {
  315.                                 p[3] = dst[-4 * stride];
  316.                                 dst[-1 * stride] = (p[2] + 2 * p[1] + 2 * p[0] + 2 * q[0] + q[1] + 4) >> 3;
  317.                                 dst[-2 * stride] = (p[2] + p[1] + p[0] + q[0] + 2) >> 2;
  318.                                 dst[-3 * stride] = (2 * p[3] + 3 * p[2] + p[1] + p[0] + q[0] + 4) >> 3;
  319.                             }
  320.                             else
  321.                             {
  322.                                 dst[-1 * stride] = (2 * p[1] + p[0] + q[1] + 2 ) >> 2;
  323.                             }
  324.                             if (aq < beta)
  325.                             {
  326.                                 q[3] = dst[3 * stride];
  327.                                 dst[0 * stride] = (p[1] + 2 * p[0] + 2 * q[0] + 2 * q[1] + q[2] + 4) >> 3;
  328.                                 dst[1 * stride] = (p[0] + q[0] + q[1] + q[2] + 2) >> 2;
  329.                                 dst[2 * stride] = (2 * q[3] + 3 * q[2] + q[1] + q[0] + p[0] + 4) >> 3;
  330.                             }
  331.                             else
  332.                             {
  333.                                 dst[0] = (2 * q[1] + q[0] + p[1] + 2 ) >> 2;
  334.                             }
  335.                         }
  336.                         else
  337.                         {
  338.                             dst[-1 * stride] = (2 * p[1] + p[0] + q[1] + 2 ) >> 2;
  339.                             dst[0] = (2 * q[1] + q[0] + p[1] + 2 ) >> 2;
  340.                         }
  341.                     }
  342.                     else
  343.                     {
  344.                         dst[-1 * stride] = (2 * p[1] + p[0] + q[1] + 2 ) >> 2;
  345.                         dst[0] = (2 * q[1] + q[0] + p[1] + 2 ) >> 2;
  346.                     }
  347.                 }
  348.             }
  349.         }
  350.     }
  351. }
  352. void __inline
  353. deblock_mb_chroma(T264_t*t, int32_t x, int32_t y, uint8_t* dst_uv, uint8_t bSV[4][4], uint8_t bSH[4][4],
  354.                   uint8_t indexAc, int32_t alphac, int32_t betac)
  355. {
  356.     uint8_t* dst;
  357.     int32_t i;
  358.     if (x != 0)
  359.     {
  360.         dst = dst_uv;
  361.         for(i = 0 ; i < 4 ; i ++)
  362.         {
  363.             if (bSV[0][i] > 0)
  364.             {
  365.                 EdgeLoopH(t, dst, t->edged_stride_uv, indexAc, alphac, betac, bSV[0][i], 1);
  366.                 dst += t->edged_stride_uv;
  367.                 EdgeLoopH(t, dst, t->edged_stride_uv, indexAc, alphac, betac, bSV[0][i], 1);
  368.                 dst += t->edged_stride_uv;
  369.             }
  370.             else
  371.             {
  372.                 dst += 2 * t->edged_stride_uv;
  373.             }
  374.         }
  375.     }
  376.     {
  377.         dst = dst_uv + 4;
  378.         for(i = 0 ; i < 4 ; i ++)
  379.         {
  380.             if (bSV[2][i] > 0)
  381.             {
  382.                 EdgeLoopH(t, dst, t->edged_stride_uv, indexAc, alphac, betac, bSV[2][i], 1);
  383.                 dst += t->edged_stride_uv;
  384.                 EdgeLoopH(t, dst, t->edged_stride_uv, indexAc, alphac, betac, bSV[2][i], 1);
  385.                 dst += t->edged_stride_uv;
  386.             }
  387.             else
  388.             {
  389.                 dst += 2 * t->edged_stride_uv;
  390.             }
  391.         }
  392.     }
  393.     // u
  394.     if (y != 0)
  395.     {
  396.         dst = dst_uv;
  397.         for(i = 0 ; i < 4 ; i ++)
  398.         {
  399.             if (bSH[0][i] > 0)
  400.             {
  401.                 EdgeLoopV(t, dst, t->edged_stride_uv, indexAc, alphac, betac, bSH[0][i], 1);
  402.                 dst ++;
  403.                 EdgeLoopV(t, dst, t->edged_stride_uv, indexAc, alphac, betac, bSH[0][i], 1);
  404.                 dst ++;
  405.             }
  406.             else
  407.             {
  408.                 dst += 2;
  409.             }
  410.         }
  411.     }
  412.     {
  413.         dst = dst_uv + 4 * t->edged_stride_uv;
  414.         for(i = 0 ; i < 4 ; i ++)
  415.         {
  416.             if (bSH[2][i] > 0)
  417.             {
  418.                 EdgeLoopV(t, dst, t->edged_stride_uv, indexAc, alphac, betac, bSH[2][i], 1);
  419.                 dst ++;
  420.                 EdgeLoopV(t, dst, t->edged_stride_uv, indexAc, alphac, betac, bSH[2][i], 1);
  421.                 dst ++;
  422.             }
  423.             else
  424.             {
  425.                 dst += 2;
  426.             }
  427.         }
  428.     }
  429. }
  430. void __inline
  431. deblock_mb_chroma_(T264_t*t, int32_t x, int32_t y, uint8_t* org_dst_u, uint8_t* org_dst_v, uint8_t bSV[4][4], uint8_t bSH[4][4],
  432.                   uint8_t indexAc, int32_t alphac, int32_t betac)
  433. {
  434.     uint8_t* dst_u, *dst_v;
  435.     int32_t i;
  436.     if (x != 0)
  437.     {
  438.         dst_u = org_dst_u;
  439.         dst_v = org_dst_v;
  440.         for(i = 0 ; i < 4 ; i ++)
  441.         {
  442.             if (bSV[0][i] > 0)
  443.             {
  444.                 EdgeLoopH(t, dst_u, t->edged_stride_uv, indexAc, alphac, betac, bSV[0][i], 1);
  445.                 dst_u += t->edged_stride_uv;
  446.                 EdgeLoopH(t, dst_u, t->edged_stride_uv, indexAc, alphac, betac, bSV[0][i], 1);
  447.                 dst_u += t->edged_stride_uv;
  448.                 EdgeLoopH(t, dst_v, t->edged_stride_uv, indexAc, alphac, betac, bSV[0][i], 1);
  449.                 dst_v += t->edged_stride_uv;
  450.                 EdgeLoopH(t, dst_v, t->edged_stride_uv, indexAc, alphac, betac, bSV[0][i], 1);
  451.                 dst_v += t->edged_stride_uv;
  452.             }
  453.             else
  454.             {
  455.                 dst_u += 2 * t->edged_stride_uv;
  456.                 dst_v += 2 * t->edged_stride_uv;
  457.             }
  458.         }
  459.     }
  460.     {
  461.         dst_u = org_dst_u + 4;
  462.         dst_v = org_dst_v + 4;
  463.         for(i = 0 ; i < 4 ; i ++)
  464.         {
  465.             if (bSV[2][i] > 0)
  466.             {
  467.                 EdgeLoopH(t, dst_u, t->edged_stride_uv, indexAc, alphac, betac, bSV[2][i], 1);
  468.                 dst_u += t->edged_stride_uv;
  469.                 EdgeLoopH(t, dst_u, t->edged_stride_uv, indexAc, alphac, betac, bSV[2][i], 1);
  470.                 dst_u += t->edged_stride_uv;
  471.                 EdgeLoopH(t, dst_v, t->edged_stride_uv, indexAc, alphac, betac, bSV[2][i], 1);
  472.                 dst_v += t->edged_stride_uv;
  473.                 EdgeLoopH(t, dst_v, t->edged_stride_uv, indexAc, alphac, betac, bSV[2][i], 1);
  474.                 dst_v += t->edged_stride_uv;
  475.             }
  476.             else
  477.             {
  478.                 dst_u += 2 * t->edged_stride_uv;
  479.                 dst_v += 2 * t->edged_stride_uv;
  480.             }
  481.         }
  482.     }
  483.     // u
  484.     if (y != 0)
  485.     {
  486.         dst_u = org_dst_u;
  487.         dst_v = org_dst_v;
  488.         for(i = 0 ; i < 4 ; i ++)
  489.         {
  490.             if (bSH[0][i] > 0)
  491.             {
  492.                 EdgeLoopV(t, dst_u, t->edged_stride_uv, indexAc, alphac, betac, bSH[0][i], 1);
  493.                 dst_u ++;
  494.                 EdgeLoopV(t, dst_u, t->edged_stride_uv, indexAc, alphac, betac, bSH[0][i], 1);
  495.                 dst_u ++;
  496.                 EdgeLoopV(t, dst_v, t->edged_stride_uv, indexAc, alphac, betac, bSH[0][i], 1);
  497.                 dst_v ++;
  498.                 EdgeLoopV(t, dst_v, t->edged_stride_uv, indexAc, alphac, betac, bSH[0][i], 1);
  499.                 dst_v ++;
  500.             }
  501.             else
  502.             {
  503.                 dst_u += 2;
  504.                 dst_v += 2;
  505.             }
  506.         }
  507.     }
  508.     {
  509.         dst_u = org_dst_u + 4 * t->edged_stride_uv;
  510.         dst_v = org_dst_v + 4 * t->edged_stride_uv;
  511.         for(i = 0 ; i < 4 ; i ++)
  512.         {
  513.             if (bSH[2][i] > 0)
  514.             {
  515.                 EdgeLoopV(t, dst_u, t->edged_stride_uv, indexAc, alphac, betac, bSH[2][i], 1);
  516.                 dst_u ++;
  517.                 EdgeLoopV(t, dst_u, t->edged_stride_uv, indexAc, alphac, betac, bSH[2][i], 1);
  518.                 dst_u ++;
  519.                 EdgeLoopV(t, dst_v, t->edged_stride_uv, indexAc, alphac, betac, bSH[2][i], 1);
  520.                 dst_v ++;
  521.                 EdgeLoopV(t, dst_v, t->edged_stride_uv, indexAc, alphac, betac, bSH[2][i], 1);
  522.                 dst_v ++;
  523.             }
  524.             else
  525.             {
  526.                 dst_u += 2;
  527.                 dst_v += 2;
  528.             }
  529.         }
  530.     }
  531. }
  532. void
  533. deblock_mb(T264_t* t, int32_t y, int32_t x, T264_frame_t* f)
  534. {
  535.     int32_t i, j;
  536.     T264_mb_context_t* cur, *prev;
  537.     uint8_t qpav, qpavc;
  538.     uint8_t indexA, indexB, indexAc, indexBc;
  539.     int32_t alpha, beta, alphac, betac;
  540.     uint8_t bSV[4][4];
  541.     uint8_t bSH[4][4];
  542.     uint8_t* dst_y, *dst_u, *dst_v;
  543.     int32_t mb_xy = t->mb_stride * y + x;
  544.     uint8_t* dst;
  545.     
  546.     cur = &f->mb[mb_xy];
  547.     dst_y = f->Y[0] + (y << 4) * t->edged_stride + (x << 4);
  548.     dst_u = f->U + (y << 3) * t->edged_stride_uv + (x << 3);
  549.     dst_v = f->V + (y << 3) * t->edged_stride_uv + (x << 3);
  550.     // xxx current mb_qp_delta == 0 !!
  551.     qpav = (cur->mb_qp_delta + cur->mb_qp_delta + t->qp_y + t->qp_y + 1) >> 1;
  552.     indexA = clip3(qpav + 0, 0, 51);
  553.     indexB = clip3(qpav + 0, 0, 51);
  554.     alpha = deblock_threshold_a[indexA];
  555.     beta  = deblock_threshold_b[indexB];
  556.     qpavc = (cur->mb_qp_delta + cur->mb_qp_delta + t->qp_uv + t->qp_uv + 1) >> 1;
  557.     indexAc = clip3(qpavc + 0, 0, 51);
  558.     indexBc = clip3(qpavc + 0, 0, 51);
  559.     alphac = deblock_threshold_a[indexAc];
  560.     betac  = deblock_threshold_b[indexBc];
  561.     // vertical first
  562.     // mb edge
  563.     if (x != 0)
  564.     {
  565.         prev = &f->mb[mb_xy - 1];
  566.         get_strength(t, bSV[0], 0, 0, cur, prev);
  567.         
  568.         dst = dst_y;
  569.         for(i = 0 ; i < 4 ; i ++)
  570.         {
  571.             if (bSV[0][i] > 0)
  572.             {
  573.                 EdgeLoopH(t, dst, t->edged_stride, indexA, alpha, beta, bSV[0][i], 0);
  574.                 dst += t->edged_stride;
  575.                 EdgeLoopH(t, dst, t->edged_stride, indexA, alpha, beta, bSV[0][i], 0);
  576.                 dst += t->edged_stride;
  577.                 EdgeLoopH(t, dst, t->edged_stride, indexA, alpha, beta, bSV[0][i], 0);
  578.                 dst += t->edged_stride;
  579.                 EdgeLoopH(t, dst, t->edged_stride, indexA, alpha, beta, bSV[0][i], 0);
  580.                 dst += t->edged_stride;
  581.             }
  582.             else
  583.             {
  584.                 dst += 4 * t->edged_stride;
  585.             }
  586.         }
  587.     }
  588.     for(j = 1 ; j < 4 ; j ++)
  589.     {
  590.         prev = cur;
  591.         get_strength(t, bSV[j], 0, j, cur, prev);
  592.         dst = dst_y + 4 * j;
  593.         for(i = 0 ; i < 4 ; i ++)
  594.         {
  595.             if (bSV[j][i] > 0)
  596.             {
  597.                 EdgeLoopH(t, dst, t->edged_stride, indexA, alpha, beta, bSV[j][i], 0);
  598.                 dst += t->edged_stride;
  599.                 EdgeLoopH(t, dst, t->edged_stride, indexA, alpha, beta, bSV[j][i], 0);
  600.                 dst += t->edged_stride;
  601.                 EdgeLoopH(t, dst, t->edged_stride, indexA, alpha, beta, bSV[j][i], 0);
  602.                 dst += t->edged_stride;
  603.                 EdgeLoopH(t, dst, t->edged_stride, indexA, alpha, beta, bSV[j][i], 0);
  604.                 dst += t->edged_stride;
  605.             }
  606.             else
  607.             {
  608.                 dst += 4 * t->edged_stride;
  609.             }
  610.         }
  611.     }
  612.     // mb edge
  613.     if (y != 0)
  614.     {
  615.         prev = &f->mb[mb_xy - t->mb_stride];
  616.         get_strength(t, bSH[0], 1, 0, cur, prev);
  617.         dst = dst_y;
  618.         for(i = 0 ; i < 4 ; i ++)
  619.         {
  620.             if (bSH[0][i] > 0)
  621.             {
  622.                 EdgeLoopV(t, dst, t->edged_stride, indexA, alpha, beta, bSH[0][i], 0);
  623.                 dst ++;
  624.                 EdgeLoopV(t, dst, t->edged_stride, indexA, alpha, beta, bSH[0][i], 0);
  625.                 dst ++;
  626.                 EdgeLoopV(t, dst, t->edged_stride, indexA, alpha, beta, bSH[0][i], 0);
  627.                 dst ++;
  628.                 EdgeLoopV(t, dst, t->edged_stride, indexA, alpha, beta, bSH[0][i], 0);
  629.                 dst ++;
  630.             }
  631.             else
  632.             {
  633.                 dst += 4;
  634.             }
  635.         }
  636.     }
  637.     for(j = 1 ; j < 4 ; j ++)
  638.     {
  639.         prev = cur;
  640.         get_strength(t, bSH[j], 1, j, cur, prev);
  641.         dst = dst_y + 4 * j * t->edged_stride;
  642.         for(i = 0 ; i < 4 ; i ++)
  643.         {
  644.             if (bSH[j][i] > 0)
  645.             {
  646.                 EdgeLoopV(t, dst, t->edged_stride, indexA, alpha, beta, bSH[j][i], 0);
  647.                 dst ++;
  648.                 EdgeLoopV(t, dst, t->edged_stride, indexA, alpha, beta, bSH[j][i], 0);
  649.                 dst ++;
  650.                 EdgeLoopV(t, dst, t->edged_stride, indexA, alpha, beta, bSH[j][i], 0);
  651.                 dst ++;
  652.                 EdgeLoopV(t, dst, t->edged_stride, indexA, alpha, beta, bSH[j][i], 0);
  653.                 dst ++;
  654.             }
  655.             else
  656.             {
  657.                 dst += 4;
  658.             }
  659.         }
  660.     }
  661.     deblock_mb_chroma(t, x, y, dst_u, bSV, bSH, indexAc, alphac, betac);
  662.     deblock_mb_chroma(t, x, y, dst_v, bSV, bSH, indexAc, alphac, betac);
  663. }
  664. void
  665. T264_deblock_frame(T264_t* t, T264_frame_t* f)
  666. {
  667.     int32_t i, j;
  668.     
  669.     for (i = 0 ; i < t->mb_height ; i ++)
  670.     {
  671.         for (j = 0 ; j < t->mb_width ; j ++)
  672.         {
  673.             deblock_mb(t, i, j, f);
  674.         }
  675.     }
  676. }