block.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:71k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2. ***********************************************************************
  3. * COPYRIGHT AND WARRANTY INFORMATION
  4. *
  5. * Copyright 2001, International Telecommunications Union, Geneva
  6. *
  7. * DISCLAIMER OF WARRANTY
  8. *
  9. * These software programs are available to the user without any
  10. * license fee or royalty on an "as is" basis. The ITU disclaims
  11. * any and all warranties, whether express, implied, or
  12. * statutory, including any implied warranties of merchantability
  13. * or of fitness for a particular purpose.  In no event shall the
  14. * contributor or the ITU be liable for any incidental, punitive, or
  15. * consequential damages of any kind whatsoever arising from the
  16. * use of these programs.
  17. *
  18. * This disclaimer of warranty extends to the user of these programs
  19. * and user's customers, employees, agents, transferees, successors,
  20. * and assigns.
  21. *
  22. * The ITU does not represent or warrant that the programs furnished
  23. * hereunder are free of infringement of any third-party patents.
  24. * Commercial implementations of ITU-T Recommendations, including
  25. * shareware, may be subject to royalty fees to patent holders.
  26. * Information regarding the ITU-T patent policy is available from
  27. * the ITU Web site at http://www.itu.int.
  28. *
  29. * THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY.
  30. ************************************************************************
  31. */
  32. /*!
  33.  *************************************************************************************
  34.  * file block.c
  35.  *
  36.  * brief
  37.  *    Process one block
  38.  *
  39.  * author
  40.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  41.  *    - Inge Lille-Lang鴜               <inge.lille-langoy@telenor.com>
  42.  *    - Rickard Sjoberg                 <rickard.sjoberg@era.ericsson.se>
  43.  *    - Stephan Wenger                  <stewe@cs.tu-berlin.de>
  44.  *    - Jani Lainema                    <jani.lainema@nokia.com>
  45.  *    - Detlev Marpe                    <marpe@hhi.de>
  46.  *    - Thomas Wedi                     <wedi@tnt.uni-hannover.de>
  47.  *    - Ragip Kurceren                  <ragip.kurceren@nokia.com>
  48.  *************************************************************************************
  49.  */
  50. #include "contributors.h"
  51. #include <math.h>
  52. #include <stdlib.h>
  53. #include <assert.h>
  54. #include "block.h"
  55. #include "refbuf.h"
  56. /*!
  57.  ************************************************************************
  58.  * brief
  59.  *    Make intra 4x4 prediction according to all 6 prediction modes.
  60.  *    The routine uses left and upper neighbouring points from
  61.  *    previous coded blocks to do this (if available). Notice that
  62.  *    inaccessible neighbouring points are signalled with a negative
  63.  *    value i the predmode array .
  64.  *
  65.  *  para Input:
  66.  *     Starting point of current 4x4 block image posision
  67.  *
  68.  *  para Output:
  69.  *      none
  70.  ************************************************************************
  71.  */
  72. void intrapred_luma(int img_x,int img_y)
  73. {
  74.   int i,j,s0=0,s1,s2,ia[7][3],s[4][2];
  75.   int block_available_up = (img->ipredmode[img_x/BLOCK_SIZE+1][img_y/BLOCK_SIZE] >=0);
  76.   int block_available_left = (img->ipredmode[img_x/BLOCK_SIZE][img_y/BLOCK_SIZE+1] >=0);
  77.   s1=0;
  78.   s2=0;
  79.   // make DC prediction
  80.   for (i=0; i < BLOCK_SIZE; i++)
  81.   {
  82.     if (block_available_up)
  83.       s1 += imgY[img_y-1][img_x+i];    // sum hor pix
  84.     if (block_available_left)
  85.       s2 += imgY[img_y+i][img_x-1];    // sum vert pix
  86.   }
  87.   if (block_available_up && block_available_left)
  88.     s0=(s1+s2+4)/(2*BLOCK_SIZE);      // no edge
  89.   if (!block_available_up && block_available_left)
  90.     s0=(s2+2)/BLOCK_SIZE;             // upper edge
  91.   if (block_available_up && !block_available_left)
  92.     s0=(s1+2)/BLOCK_SIZE;             // left edge
  93.   if (!block_available_up && !block_available_left)
  94.     s0=128;                           // top left corner, nothing to predict from
  95.   for (i=0; i < BLOCK_SIZE; i++)
  96.   {
  97.     // vertical prediction
  98.     if (block_available_up)
  99.       s[i][0]=imgY[img_y-1][img_x+i];
  100.     // horizontal prediction
  101.     if (block_available_left)
  102.       s[i][1]=imgY[img_y+i][img_x-1];
  103.   }
  104.   for (j=0; j < BLOCK_SIZE; j++)
  105.   {
  106.     for (i=0; i < BLOCK_SIZE; i++)
  107.     {
  108.       img->mprr[DC_PRED][i][j]=s0;      // store DC prediction
  109.       img->mprr[VERT_PRED][i][j]=s[j][0]; // store vertical prediction
  110.       img->mprr[HOR_PRED][i][j]=s[i][1]; // store horizontal prediction
  111.     }
  112.   }
  113.   //  Prediction according to 'diagonal' modes
  114.   if (block_available_up && block_available_left)
  115.   {
  116.     int A = imgY[img_y-1][img_x];
  117.     int B = imgY[img_y-1][img_x+1];
  118.     int C = imgY[img_y-1][img_x+2];
  119.     int D = imgY[img_y-1][img_x+3];
  120.     int E = imgY[img_y  ][img_x-1];
  121.     int F = imgY[img_y+1][img_x-1];
  122.     int G = imgY[img_y+2][img_x-1];
  123.     int H = imgY[img_y+3][img_x-1];
  124.     int I = imgY[img_y-1][img_x-1];
  125.     ia[0][0]=(H+2*G+F+2)/4;
  126.     ia[1][0]=(G+2*F+E+2)/4;
  127.     ia[2][0]=(F+2*E+I+2)/4;
  128.     ia[3][0]=(E+2*I+A+2)/4;
  129.     ia[4][0]=(I+2*A+B+2)/4;
  130.     ia[5][0]=(A+2*B+C+2)/4;
  131.     ia[6][0]=(B+2*C+D+2)/4;
  132.     for (i=0;i<4;i++)
  133.       for (j=0;j<4;j++)
  134.         img->mprr[DIAG_PRED_LR_45][i][j]=ia[j-i+3][0];
  135.   }
  136.   if (block_available_up)
  137.   { // Do prediction 1
  138.     int A = imgY[img_y-1][img_x+0];
  139.     int B = imgY[img_y-1][img_x+1];
  140.     int C = imgY[img_y-1][img_x+2];
  141.     int D = imgY[img_y-1][img_x+3];
  142.     img->mprr[DIAG_PRED_RL][0][0] = (A+B)/2; // a
  143.     img->mprr[DIAG_PRED_RL][1][0] = B;       // e
  144.     img->mprr[DIAG_PRED_RL][0][1] = img->mprr[DIAG_PRED_RL][2][0] = (B+C)/2; // b i
  145.     img->mprr[DIAG_PRED_RL][1][1] = img->mprr[DIAG_PRED_RL][3][0] = C;       // f m
  146.     img->mprr[DIAG_PRED_RL][0][2] = img->mprr[DIAG_PRED_RL][2][1] = (C+D)/2; // c j
  147.     img->mprr[DIAG_PRED_RL][3][1] =
  148.         img->mprr[DIAG_PRED_RL][1][2] =
  149.             img->mprr[DIAG_PRED_RL][2][2] =
  150.                 img->mprr[DIAG_PRED_RL][3][2] =
  151.                     img->mprr[DIAG_PRED_RL][0][3] =
  152.                         img->mprr[DIAG_PRED_RL][1][3] =
  153.                             img->mprr[DIAG_PRED_RL][2][3] =
  154.                                 img->mprr[DIAG_PRED_RL][3][3] = D; // d g h k l n o p
  155.   }
  156.   if (block_available_left)
  157.   { // Do prediction 5
  158.     int E = imgY[img_y+0][img_x-1];
  159.     int F = imgY[img_y+1][img_x-1];
  160.     int G = imgY[img_y+2][img_x-1];
  161.     int H = imgY[img_y+3][img_x-1];
  162.     img->mprr[DIAG_PRED_LR][0][0] = (E+F)/2; // a
  163.     img->mprr[DIAG_PRED_LR][0][1] = F;       // b
  164.     img->mprr[DIAG_PRED_LR][1][0] = img->mprr[DIAG_PRED_LR][0][2] = (F+G)/2; // e c
  165.     img->mprr[DIAG_PRED_LR][1][1] = img->mprr[DIAG_PRED_LR][0][3] = G;       // f d
  166.     img->mprr[DIAG_PRED_LR][2][0] = img->mprr[DIAG_PRED_LR][1][2] = (G+H)/2; // i g
  167.     img->mprr[DIAG_PRED_LR][1][3] =
  168.         img->mprr[DIAG_PRED_LR][2][1] =
  169.             img->mprr[DIAG_PRED_LR][2][2] =
  170.                 img->mprr[DIAG_PRED_LR][2][3] =
  171.                     img->mprr[DIAG_PRED_LR][3][0] =
  172.                         img->mprr[DIAG_PRED_LR][3][1] =
  173.                             img->mprr[DIAG_PRED_LR][3][2] =
  174.                                 img->mprr[DIAG_PRED_LR][3][3] = H;
  175.   }
  176. }
  177. /*!
  178.  ************************************************************************
  179.  * brief
  180.  *    16x16 based luma prediction
  181.  *
  182.  * para Input:
  183.  *    Image parameters
  184.  *
  185.  * para Output:
  186.  *    none
  187.  ************************************************************************
  188.  */
  189. void intrapred_luma_2()
  190. {
  191.   int s0=0,s1,s2;
  192.   int i,j;
  193.   int s[16][2];
  194.   int ih,iv;
  195.   int ib,ic,iaa;
  196.   int mb_nr = img->current_mb_nr;
  197.   int mb_width = img->width/16;
  198.   int mb_available_up = (img->mb_y == 0) ? 0 : (img->slice_numbers[mb_nr] == img->slice_numbers[mb_nr-mb_width]);
  199.   int mb_available_left = (img->mb_x == 0) ? 0 : (img->slice_numbers[mb_nr] == img->slice_numbers[mb_nr-1]);
  200.   if(input->UseConstrainedIntraPred)
  201.   {
  202.     if (mb_available_up && (img->intra_mb[mb_nr-mb_width] ==0))
  203.       mb_available_up = 0;
  204.     if (mb_available_left && (img->intra_mb[mb_nr-1] ==0))
  205.       mb_available_left = 0;
  206.   }
  207.   s1=s2=0;
  208.   // make DC prediction
  209.   for (i=0; i < MB_BLOCK_SIZE; i++)
  210.   {
  211.     if (mb_available_up)
  212.       s1 += imgY[img->pix_y-1][img->pix_x+i];    // sum hor pix
  213.     if (mb_available_left)
  214.       s2 += imgY[img->pix_y+i][img->pix_x-1];    // sum vert pix
  215.   }
  216.   if (mb_available_up && mb_available_left)
  217.     s0=(s1+s2+16)/(2*MB_BLOCK_SIZE);             // no edge
  218.   if (!mb_available_up && mb_available_left)
  219.     s0=(s2+8)/MB_BLOCK_SIZE;                     // upper edge
  220.   if (mb_available_up && !mb_available_left)
  221.     s0=(s1+8)/MB_BLOCK_SIZE;                     // left edge
  222.   if (!mb_available_up && !mb_available_left)
  223.     s0=128;                                      // top left corner, nothing to predict from
  224.   for (i=0; i < MB_BLOCK_SIZE; i++)
  225.   {
  226.     // vertical prediction
  227.     if (mb_available_up)
  228.       s[i][0]=imgY[img->pix_y-1][img->pix_x+i];
  229.     // horizontal prediction
  230.     if (mb_available_left)
  231.       s[i][1]=imgY[img->pix_y+i][img->pix_x-1];
  232.   }
  233.   for (j=0; j < MB_BLOCK_SIZE; j++)
  234.   {
  235.     for (i=0; i < MB_BLOCK_SIZE; i++)
  236.     {
  237.       img->mprr_2[VERT_PRED_16][j][i]=s[i][0]; // store vertical prediction
  238.       img->mprr_2[HOR_PRED_16 ][j][i]=s[j][1]; // store horizontal prediction
  239.       img->mprr_2[DC_PRED_16  ][j][i]=s0;      // store DC prediction
  240.     }
  241.   }
  242.   if (!mb_available_up || !mb_available_left) // edge
  243.     return;
  244.   // 16 bit integer plan pred
  245.   ih=0;
  246.   iv=0;
  247.   for (i=1;i<9;i++)
  248.   {
  249.     ih += i*(imgY[img->pix_y-1][img->pix_x+7+i] - imgY[img->pix_y-1][img->pix_x+7-i]);
  250.     iv += i*(imgY[img->pix_y+7+i][img->pix_x-1] - imgY[img->pix_y+7-i][img->pix_x-1]);
  251.   }
  252.   ib=5*(ih/4)/16;
  253.   ic=5*(iv/4)/16;
  254.   iaa=16*(imgY[img->pix_y-1][img->pix_x+15]+imgY[img->pix_y+15][img->pix_x-1]);
  255.   for (j=0;j< MB_BLOCK_SIZE;j++)
  256.   {
  257.     for (i=0;i< MB_BLOCK_SIZE;i++)
  258.     {
  259.       img->mprr_2[PLANE_16][j][i]=max(0,min(255,(iaa+(i-7)*ib +(j-7)*ic + 16)/32));/* store plane prediction */                              
  260.     }
  261.   }
  262. }
  263. /*!
  264.  ************************************************************************
  265.  * brief
  266.  *    For new intra pred routines
  267.  *
  268.  * para Input:
  269.  *    Image par, 16x16 based intra mode
  270.  *
  271.  * para Output:
  272.  *    none
  273.  ************************************************************************
  274.  */
  275. void dct_luma2(int new_intra_mode)
  276. {
  277. #ifndef NO_RDQUANT
  278.   int jq0;
  279. #endif
  280. #ifdef NO_RDQUANT
  281.   int qp_const;
  282. #endif
  283.   int i,j;
  284.   int ii,jj;
  285.   int i1,j1;
  286.   int M1[16][16];
  287.   int M4[4][4];
  288.   int M5[4],M6[4];
  289.   int M0[4][4][4][4];
  290. #ifndef NO_RDQUANT
  291.   int coeff[16];
  292. #endif
  293.   int quant_set,run,scan_pos,coeff_ctr,level;
  294. #ifndef NO_RDQUANT
  295.   jq0=JQQ3;
  296. #endif
  297. #ifdef NO_RDQUANT
  298.   qp_const = JQQ3;
  299. #endif
  300.   for (j=0;j<16;j++)
  301.   {
  302.     for (i=0;i<16;i++)
  303.     {
  304.       M1[i][j]=imgY_org[img->pix_y+j][img->pix_x+i]-img->mprr_2[new_intra_mode][j][i];
  305.       M0[i%4][i/4][j%4][j/4]=M1[i][j];
  306.     }
  307.   }
  308.   for (jj=0;jj<4;jj++)
  309.   {
  310.     for (ii=0;ii<4;ii++)
  311.     {
  312.       for (j=0;j<4;j++)
  313.       {
  314.         for (i=0;i<2;i++)
  315.         {
  316.           i1=3-i;
  317.           M5[i]=  M0[i][ii][j][jj]+M0[i1][ii][j][jj];
  318.           M5[i1]= M0[i][ii][j][jj]-M0[i1][ii][j][jj];
  319.         }
  320.         M0[0][ii][j][jj]=(M5[0]+M5[1])*13;
  321.         M0[2][ii][j][jj]=(M5[0]-M5[1])*13;
  322.         M0[1][ii][j][jj]=M5[3]*17+M5[2]*7;
  323.         M0[3][ii][j][jj]=M5[3]*7-M5[2]*17;
  324.       }
  325.       // vertical
  326.       for (i=0;i<4;i++)
  327.       {
  328.         for (j=0;j<2;j++)
  329.         {
  330.           j1=3-j;
  331.           M5[j] = M0[i][ii][j][jj]+M0[i][ii][j1][jj];
  332.           M5[j1]= M0[i][ii][j][jj]-M0[i][ii][j1][jj];
  333.         }
  334.         M0[i][ii][0][jj]=(M5[0]+M5[1])*13;
  335.         M0[i][ii][2][jj]=(M5[0]-M5[1])*13;
  336.         M0[i][ii][1][jj]= M5[3]*17+M5[2]*7;
  337.         M0[i][ii][3][jj]= M5[3]*7 -M5[2]*17;
  338.       }
  339.     }
  340.   }
  341.   // pick out DC coeff
  342.   for (j=0;j<4;j++)
  343.     for (i=0;i<4;i++)
  344.       M4[i][j]= 49 * M0[0][i][0][j]/32768;
  345.   for (j=0;j<4;j++)
  346.   {
  347.     for (i=0;i<2;i++)
  348.     {
  349.       i1=3-i;
  350.       M5[i]= M4[i][j]+M4[i1][j];
  351.       M5[i1]=M4[i][j]-M4[i1][j];
  352.     }
  353.     M4[0][j]=(M5[0]+M5[1])*13;
  354.     M4[2][j]=(M5[0]-M5[1])*13;
  355.     M4[1][j]= M5[3]*17+M5[2]*7;
  356.     M4[3][j]= M5[3]*7 -M5[2]*17;
  357.   }
  358.   // vertical
  359.   for (i=0;i<4;i++)
  360.   {
  361.     for (j=0;j<2;j++)
  362.     {
  363.       j1=3-j;
  364.       M5[j]= M4[i][j]+M4[i][j1];
  365.       M5[j1]=M4[i][j]-M4[i][j1];
  366.     }
  367.     M4[i][0]=(M5[0]+M5[1])*13;
  368.     M4[i][2]=(M5[0]-M5[1])*13;
  369.     M4[i][1]= M5[3]*17+M5[2]*7;
  370.     M4[i][3]= M5[3]*7 -M5[2]*17;
  371.   }
  372.   // quant
  373.   quant_set=img->qp;
  374.   run=-1;
  375.   scan_pos=0;
  376. #ifndef NO_RDQUANT
  377.   for (coeff_ctr=0;coeff_ctr<16;coeff_ctr++)
  378.   {
  379.     i=SNGL_SCAN[coeff_ctr][0];
  380.     j=SNGL_SCAN[coeff_ctr][1];
  381.     coeff[coeff_ctr]=M4[i][j];
  382.   }
  383.   rd_quant(QUANT_LUMA_SNG,coeff);
  384.   for (coeff_ctr=0;coeff_ctr<16;coeff_ctr++)
  385.   {
  386.     i=SNGL_SCAN[coeff_ctr][0];
  387.     j=SNGL_SCAN[coeff_ctr][1];
  388.     run++;
  389.     level=abs(coeff[coeff_ctr]);
  390.     if (level != 0)
  391.     {
  392.       img->cof[0][0][scan_pos][0][1]=sign(level,M4[i][j]);
  393.       img->cof[0][0][scan_pos][1][1]=run;
  394.       ++scan_pos;
  395.       run=-1;
  396.     }
  397. #endif
  398. #ifdef NO_RDQUANT
  399.   for (coeff_ctr=0;coeff_ctr<16;coeff_ctr++)
  400.   {
  401.     i=SNGL_SCAN[coeff_ctr][0];
  402.     j=SNGL_SCAN[coeff_ctr][1];
  403.     run++;
  404.     level= (abs(M4[i][j]) * JQ[quant_set][0]+qp_const)/JQQ1;
  405.     if (level != 0)
  406.     {
  407.       img->cof[0][0][scan_pos][0][1]=sign(level,M4[i][j]);
  408.       img->cof[0][0][scan_pos][1][1]=run;
  409.       ++scan_pos;
  410.       run=-1;
  411.     }
  412. #endif
  413.     M4[i][j]=sign(level,M4[i][j]);
  414.   }
  415.   img->cof[0][0][scan_pos][0][1]=0;
  416.   // invers DC transform
  417.   for (j=0;j<4;j++)
  418.   {
  419.     for (i=0;i<4;i++)
  420.       M5[i]=M4[i][j];
  421.     M6[0]=(M5[0]+M5[2])*13;
  422.     M6[1]=(M5[0]-M5[2])*13;
  423.     M6[2]= M5[1]*7 -M5[3]*17;
  424.     M6[3]= M5[1]*17+M5[3]*7;
  425.     for (i=0;i<2;i++)
  426.     {
  427.       i1=3-i;
  428.       M4[i][j]= M6[i]+M6[i1];
  429.       M4[i1][j]=M6[i]-M6[i1];
  430.     }
  431.   }
  432.   for (i=0;i<4;i++)
  433.   {
  434.     for (j=0;j<4;j++)
  435.       M5[j]=M4[i][j];
  436.     M6[0]=(M5[0]+M5[2])*13;
  437.     M6[1]=(M5[0]-M5[2])*13;
  438.     M6[2]= M5[1]*7 -M5[3]*17;
  439.     M6[3]= M5[1]*17+M5[3]*7;
  440.     for (j=0;j<2;j++)
  441.     {
  442.       j1=3-j;
  443.       M0[0][i][0][j] = ((M6[j]+M6[j1])/8) *JQ[quant_set][1];
  444.       M0[0][i][0][j1]= ((M6[j]-M6[j1])/8) *JQ[quant_set][1];
  445.     }
  446.   }
  447.   for (j=0;j<4;j++)
  448.   {
  449.     for (i=0;i<4;i++)
  450.     {
  451.       M0[0][i][0][j] = 3 * M0[0][i][0][j]/256;
  452.     }
  453.   }
  454.   // AC invers trans/quant for MB
  455.   img->kac=0;
  456.   for (jj=0;jj<4;jj++)
  457.   {
  458.     for (ii=0;ii<4;ii++)
  459.     {
  460.       run=-1;
  461.       scan_pos=0;
  462. #ifndef NO_RDQUANT
  463.       for (coeff_ctr=1;coeff_ctr<16;coeff_ctr++) // set in AC coeff
  464.       {
  465.         i=SNGL_SCAN[coeff_ctr][0];
  466.         j=SNGL_SCAN[coeff_ctr][1];
  467.         coeff[coeff_ctr-1]=M0[i][ii][j][jj];
  468.       }
  469.       rd_quant(QUANT_LUMA_AC,coeff);
  470.       for (coeff_ctr=1;coeff_ctr<16;coeff_ctr++) // set in AC coeff
  471.       {
  472.         i=SNGL_SCAN[coeff_ctr][0];
  473.         j=SNGL_SCAN[coeff_ctr][1];
  474.         run++;
  475.         level=abs(coeff[coeff_ctr-1]);
  476.         if (level != 0)
  477.         {
  478.           img->kac=1;
  479.           img->cof[ii][jj][scan_pos][0][0]=sign(level,M0[i][ii][j][jj]);
  480.           img->cof[ii][jj][scan_pos][1][0]=run;
  481.           ++scan_pos;
  482.           run=-1;
  483.         }
  484.         M0[i][ii][j][jj]=sign(level*JQ[quant_set][1],M0[i][ii][j][jj]);
  485.       }
  486.       img->cof[ii][jj][scan_pos][0][0]=0;
  487. #endif
  488. #ifdef NO_RDQUANT
  489.       for (coeff_ctr=1;coeff_ctr<16;coeff_ctr++) // set in AC coeff
  490.       {
  491.         i=SNGL_SCAN[coeff_ctr][0];
  492.         j=SNGL_SCAN[coeff_ctr][1];
  493.         run++;
  494.         level= ( abs( M0[i][ii][j][jj]) * JQ[quant_set][0]+qp_const)/JQQ1;
  495.         if (level != 0)
  496.         {
  497.           img->kac=1;
  498.           img->cof[ii][jj][scan_pos][0][0]=sign(level,M0[i][ii][j][jj]);
  499.           img->cof[ii][jj][scan_pos][1][0]=run;
  500.           ++scan_pos;
  501.           run=-1;
  502.         }
  503.         M0[i][ii][j][jj]=sign(level*JQ[quant_set][1],M0[i][ii][j][jj]);
  504.       }
  505.       img->cof[ii][jj][scan_pos][0][0]=0;
  506. #endif
  507.       // IDCT horizontal
  508.       for (j=0;j<4;j++)
  509.       {
  510.         for (i=0;i<4;i++)
  511.         {
  512.           M5[i]=M0[i][ii][j][jj];
  513.         }
  514.         M6[0]=(M5[0]+M5[2])*13;
  515.         M6[1]=(M5[0]-M5[2])*13;
  516.         M6[2]=M5[1]*7 -M5[3]*17;
  517.         M6[3]=M5[1]*17+M5[3]*7;
  518.         for (i=0;i<2;i++)
  519.         {
  520.           i1=3-i;
  521.           M0[i][ii][j][jj] =M6[i]+M6[i1];
  522.           M0[i1][ii][j][jj]=M6[i]-M6[i1];
  523.         }
  524.       }
  525.       // vert
  526.       for (i=0;i<4;i++)
  527.       {
  528.         for (j=0;j<4;j++)
  529.           M5[j]=M0[i][ii][j][jj];
  530.         M6[0]=(M5[0]+M5[2])*13;
  531.         M6[1]=(M5[0]-M5[2])*13;
  532.         M6[2]=M5[1]*7 -M5[3]*17;
  533.         M6[3]=M5[1]*17+M5[3]*7;
  534.         for (j=0;j<2;j++)
  535.         {
  536.           j1=3-j;
  537.           M0[i][ii][ j][jj]=M6[j]+M6[j1];
  538.           M0[i][ii][j1][jj]=M6[j]-M6[j1];
  539.         }
  540.       }
  541.     }
  542.   }
  543.   for (j=0;j<16;j++)
  544.   {
  545.     for (i=0;i<16;i++)
  546.     {
  547.       M1[i][j]=M0[i%4][i/4][j%4][j/4];
  548.     }
  549.   }
  550.   for (j=0;j<16;j++)
  551.     for (i=0;i<16;i++)
  552.       imgY[img->pix_y+j][img->pix_x+i]=min(255,max(0,(M1[i][j]+img->mprr_2[new_intra_mode][j][i]*JQQ1+JQQ2)/JQQ1));
  553. }
  554. /*!
  555.  ************************************************************************
  556.  * brief
  557.  *    Intra prediction for chroma.  There is only one prediction mode,
  558.  *    corresponding to 'DC prediction' for luma. However,since 2x2 transform
  559.  *    of DC levels are used,all predictions are made from neighbouring MBs.
  560.  *    Prediction also depends on whether the block is at a frame edge.
  561.  *
  562.  *  para Input:
  563.  *     Starting point of current chroma macro block image posision
  564.  *
  565.  *  para Output:
  566.  *     8x8 array with DC intra chroma prediction and diff array
  567.  ************************************************************************
  568.  */
  569. void intrapred_chroma(int img_c_x,int img_c_y,int uv)
  570. {
  571.   int s[2][2],s0,s1,s2,s3;
  572.   int i,j;
  573.   int mb_nr = img->current_mb_nr;
  574.   int mb_width = img->width/16;
  575.   int mb_available_up = (img_c_y/BLOCK_SIZE == 0) ? 0 : (img->slice_numbers[mb_nr] == img->slice_numbers[mb_nr-mb_width]);
  576.   int mb_available_left = (img_c_x/BLOCK_SIZE == 0) ? 0 : (img->slice_numbers[mb_nr] == img->slice_numbers[mb_nr-1]);
  577.   if(input->UseConstrainedIntraPred)
  578.   {
  579.     if (mb_available_up && (img->intra_mb[mb_nr-mb_width] ==0))
  580.       mb_available_up = 0;
  581.     if (mb_available_left && (img->intra_mb[mb_nr-1] ==0))
  582.       mb_available_left = 0;
  583.   }
  584.   s0=s1=s2=s3=0;          // reset counters
  585.   for (i=0; i < BLOCK_SIZE; i++)
  586.   {
  587.     if(mb_available_up)
  588.     {
  589.       s0 += imgUV[uv][img_c_y-1][img_c_x+i];
  590.       s1 += imgUV[uv][img_c_y-1][img_c_x+i+BLOCK_SIZE];
  591.     }
  592.     if(mb_available_left)
  593.     {
  594.       s2 += imgUV[uv][img_c_y+i][img_c_x-1];
  595.       s3 += imgUV[uv][img_c_y+i+BLOCK_SIZE][img_c_x-1];
  596.     }
  597.   }
  598.   if(mb_available_up && mb_available_left)
  599.   {
  600.     s[0][0]=(s0+s2+4)/(2*BLOCK_SIZE);
  601.     s[1][0]=(s1+2)/BLOCK_SIZE;
  602.     s[0][1]=(s3+2)/BLOCK_SIZE;
  603.     s[1][1]=(s1+s3+4)/(2*BLOCK_SIZE);
  604.   }
  605.   else
  606.     if(mb_available_up && !mb_available_left)
  607.     {
  608.       s[0][0]=(s0+2)/BLOCK_SIZE;
  609.       s[1][0]=(s1+2)/BLOCK_SIZE;
  610.       s[0][1]=(s0+2)/BLOCK_SIZE;
  611.       s[1][1]=(s1+2)/BLOCK_SIZE;
  612.     }
  613.     else
  614.       if(!mb_available_up && mb_available_left)
  615.       {
  616.         s[0][0]=(s2+2)/BLOCK_SIZE;
  617.         s[1][0]=(s2+2)/BLOCK_SIZE;
  618.         s[0][1]=(s3+2)/BLOCK_SIZE;
  619.         s[1][1]=(s3+2)/BLOCK_SIZE;
  620.       }
  621.       else
  622.         if(!mb_available_up && !mb_available_left)
  623.         {
  624.           s[0][0]=128;
  625.           s[1][0]=128;
  626.           s[0][1]=128;
  627.           s[1][1]=128;
  628.         }
  629.   for (j=0; j < MB_BLOCK_SIZE/2; j++)
  630.   {
  631.     for (i=0; i < MB_BLOCK_SIZE/2; i++)
  632.     {
  633.       img->mpr[i][j]=s[i/BLOCK_SIZE][j/BLOCK_SIZE];
  634.       img->m7[i][j]=imgUV_org[uv][img_c_y+j][img_c_x+i]-img->mpr[i][j];
  635.     }
  636.   }
  637. }
  638. /*!
  639.  ************************************************************************
  640.  * brief
  641.  *    The routine performs transform,quantization,inverse transform, adds the diff.
  642.  *    to the prediction and writes the result to the decoded luma frame. Includes the
  643.  *    RD constrained quantization also.
  644.  *
  645.  * para Input:
  646.  *    block_x,block_y: Block position inside a macro block (0,4,8,12).
  647.  *
  648.  * para Output_
  649.  *    nonzero: 0 if no levels are nonzero.  1 if there are nonzero levels.             n
  650.  *    coeff_cost: Counter for nonzero coefficients, used to discard expencive levels.
  651.  ************************************************************************
  652.  */
  653. int dct_luma(int block_x,int block_y,int *coeff_cost)
  654. {
  655.   int sign(int a,int b);
  656.   int i,j,i1,j1,ilev,m5[4],m6[4],coeff_ctr,scan_loop_ctr;
  657.   int qp_const,pos_x,pos_y,quant_set,level,scan_pos,run;
  658.   int nonzero;
  659.   int idx;
  660.   int scan_mode;
  661.   int loop_rep;
  662. #ifndef NO_RDQUANT
  663.   int coeff[16];
  664. #endif
  665.   if (img->type == INTRA_IMG)
  666.     qp_const=JQQ3;    // intra
  667.   else
  668.     qp_const=JQQ4;    // inter
  669.   pos_x=block_x/BLOCK_SIZE;
  670.   pos_y=block_y/BLOCK_SIZE;
  671.   //  Horizontal transform
  672.   for (j=0; j < BLOCK_SIZE; j++)
  673.   {
  674.     for (i=0; i < 2; i++)
  675.     {
  676.       i1=3-i;
  677.       m5[i]=img->m7[i][j]+img->m7[i1][j];
  678.       m5[i1]=img->m7[i][j]-img->m7[i1][j];
  679.     }
  680.     img->m7[0][j]=(m5[0]+m5[1])*13;
  681.     img->m7[2][j]=(m5[0]-m5[1])*13;
  682.     img->m7[1][j]=m5[3]*17+m5[2]*7;
  683.     img->m7[3][j]=m5[3]*7-m5[2]*17;
  684.   }
  685.   //  Vertival transform
  686.   for (i=0; i < BLOCK_SIZE; i++)
  687.   {
  688.     for (j=0; j < 2; j++)
  689.     {
  690.       j1=3-j;
  691.       m5[j]=img->m7[i][j]+img->m7[i][j1];
  692.       m5[j1]=img->m7[i][j]-img->m7[i][j1];
  693.     }
  694.     img->m7[i][0]=(m5[0]+m5[1])*13;
  695.     img->m7[i][2]=(m5[0]-m5[1])*13;
  696.     img->m7[i][1]=m5[3]*17+m5[2]*7;
  697.     img->m7[i][3]=m5[3]*7-m5[2]*17;
  698.   }
  699.   // Quant
  700.   quant_set=img->qp;
  701.   nonzero=FALSE;
  702.   if (img->imod == INTRA_MB_OLD && img->qp < 24)
  703.   {
  704.     scan_mode=DOUBLE_SCAN;
  705.     loop_rep=2;
  706.     idx=1;
  707.   }
  708.   else
  709.   {
  710.     scan_mode=SINGLE_SCAN;
  711.     loop_rep=1;
  712.     idx=0;
  713.   }
  714. #ifndef NO_RDQUANT
  715.   for(scan_loop_ctr=0;scan_loop_ctr<loop_rep;scan_loop_ctr++) // 2 times if double scan, 1 normal scan
  716.   {
  717.     for (coeff_ctr=0;coeff_ctr < 16/loop_rep;coeff_ctr++)     // 8 times if double scan, 16 normal scan
  718.     {
  719.       if (scan_mode==DOUBLE_SCAN)
  720.       {
  721.         i=DBL_SCAN[coeff_ctr][0][scan_loop_ctr];
  722.         j=DBL_SCAN[coeff_ctr][1][scan_loop_ctr];
  723.       }
  724.       else
  725.       {
  726.         i=SNGL_SCAN[coeff_ctr][0];
  727.         j=SNGL_SCAN[coeff_ctr][1];
  728.       }
  729.       coeff[coeff_ctr]=img->m7[i][j];
  730.     }
  731.     if (scan_mode==DOUBLE_SCAN)
  732.       rd_quant(QUANT_LUMA_DBL,coeff);
  733.     else
  734.       rd_quant(QUANT_LUMA_SNG,coeff);
  735.     run=-1;
  736.     scan_pos=scan_loop_ctr*9;   // for double scan; set first or second scan posision
  737.     for (coeff_ctr=0; coeff_ctr<16/loop_rep; coeff_ctr++)
  738.     {
  739.       if (scan_mode==DOUBLE_SCAN)
  740.       {
  741.         i=DBL_SCAN[coeff_ctr][0][scan_loop_ctr];
  742.         j=DBL_SCAN[coeff_ctr][1][scan_loop_ctr];
  743.       }
  744.       else
  745.       {
  746.         i=SNGL_SCAN[coeff_ctr][0];
  747.         j=SNGL_SCAN[coeff_ctr][1];
  748.       }
  749.       run++;
  750.       ilev=0;
  751.       level= absm(coeff[coeff_ctr]);
  752.       if (level != 0)
  753.       {
  754.         nonzero=TRUE;
  755.         if (level > 1)
  756.           *coeff_cost += MAX_VALUE;                // set high cost, shall not be discarded
  757.         else
  758.           *coeff_cost += COEFF_COST[run];
  759.         img->cof[pos_x][pos_y][scan_pos][0][scan_mode]=sign(level,img->m7[i][j]);
  760.         img->cof[pos_x][pos_y][scan_pos][1][scan_mode]=run;
  761.         ++scan_pos;
  762.         run=-1;                     // reset zero level counter
  763.         ilev=level*JQ[quant_set][1];
  764.       }
  765.       img->m7[i][j]=sign(ilev,img->m7[i][j]);
  766.     }
  767.     img->cof[pos_x][pos_y][scan_pos][0][scan_mode]=0;  // end of block
  768.   }
  769. #endif
  770. #ifdef NO_RDQUANT
  771.   for(scan_loop_ctr=0;scan_loop_ctr<loop_rep;scan_loop_ctr++) // 2 times if double scan, 1 normal scan
  772.   {
  773.   run=-1;
  774.   scan_pos=scan_loop_ctr*9;
  775.     for (coeff_ctr=0;coeff_ctr < 16/loop_rep;coeff_ctr++)     // 8 times if double scan, 16 normal scan
  776.     {
  777.       if (scan_mode==DOUBLE_SCAN)
  778.       {
  779.         i=DBL_SCAN[coeff_ctr][0][scan_loop_ctr];
  780.         j=DBL_SCAN[coeff_ctr][1][scan_loop_ctr];
  781.       }
  782.       else
  783.       {
  784.         i=SNGL_SCAN[coeff_ctr][0];
  785.         j=SNGL_SCAN[coeff_ctr][1];
  786.       }
  787.       run++;
  788.       ilev=0;
  789.       level = (abs (img->m7[i][j]) * JQ[quant_set][0] +qp_const) / JQQ1;
  790.       if (level != 0)
  791.       {
  792.         nonzero=TRUE;
  793.         if (level > 1)
  794.           *coeff_cost += MAX_VALUE;                // set high cost, shall not be discarded
  795.         else
  796.           *coeff_cost += COEFF_COST[run];
  797.         img->cof[pos_x][pos_y][scan_pos][0][scan_mode]=sign(level,img->m7[i][j]);
  798.         img->cof[pos_x][pos_y][scan_pos][1][scan_mode]=run;
  799.         ++scan_pos;
  800.         run=-1;                     // reset zero level counter
  801.         ilev=level*JQ[quant_set][1];
  802.       }
  803.       img->m7[i][j]=sign(ilev,img->m7[i][j]);
  804.     }
  805.     img->cof[pos_x][pos_y][scan_pos][0][scan_mode]=0;  // end of block
  806.   }
  807. #endif
  808.   //     IDCT.
  809.   //     horizontal
  810.   for (j=0; j < BLOCK_SIZE; j++)
  811.   {
  812.     for (i=0; i < BLOCK_SIZE; i++)
  813.     {
  814.       m5[i]=img->m7[i][j];
  815.     }
  816.     m6[0]=(m5[0]+m5[2])*13;
  817.     m6[1]=(m5[0]-m5[2])*13;
  818.     m6[2]=m5[1]*7-m5[3]*17;
  819.     m6[3]=m5[1]*17+m5[3]*7;
  820.     for (i=0; i < 2; i++)
  821.     {
  822.       i1=3-i;
  823.       img->m7[i][j]=m6[i]+m6[i1];
  824.       img->m7[i1][j]=m6[i]-m6[i1];
  825.     }
  826.   }
  827.   //  vertical
  828.   for (i=0; i < BLOCK_SIZE; i++)
  829.   {
  830.     for (j=0; j < BLOCK_SIZE; j++)
  831.     {
  832.       m5[j]=img->m7[i][j];
  833.     }
  834.     m6[0]=(m5[0]+m5[2])*13;
  835.     m6[1]=(m5[0]-m5[2])*13;
  836.     m6[2]=m5[1]*7-m5[3]*17;
  837.     m6[3]=m5[1]*17+m5[3]*7;
  838.     for (j=0; j < 2; j++)
  839.     {
  840.       j1=3-j;
  841.       img->m7[i][j] =min(255,max(0,(m6[j]+m6[j1]+img->mpr[i+block_x][j+block_y] *JQQ1+JQQ2)/JQQ1));
  842.       img->m7[i][j1]=min(255,max(0,(m6[j]-m6[j1]+img->mpr[i+block_x][j1+block_y] *JQQ1+JQQ2)/JQQ1));
  843.     }
  844.   }
  845.   //  Decoded block moved to frame memory
  846.   for (j=0; j < BLOCK_SIZE; j++)
  847.     for (i=0; i < BLOCK_SIZE; i++)
  848.       imgY[img->pix_y+block_y+j][img->pix_x+block_x+i]=img->m7[i][j];
  849.   return nonzero;
  850. }
  851. /*!
  852.  ************************************************************************
  853.  * brief
  854.  *    Transform,quantization,inverse transform for chroma.
  855.  *    The main reason why this is done in a separate routine is the
  856.  *    additional 2x2 transform of DC-coeffs. This routine is called
  857.  *    ones for each of the chroma components.
  858.  *
  859.  * para Input:
  860.  *    uv    : Make difference between the U and V chroma component  n
  861.  *    cr_cbp: chroma coded block pattern
  862.  *
  863.  * para Output:
  864.  *    cr_cbp: Updated chroma coded block pattern.
  865.  ************************************************************************
  866.  */
  867. #ifndef NO_RDQUANT
  868. int dct_chroma(int uv,int cr_cbp)
  869. {
  870.   int i,j,i1,j2,ilev,n2,n1,j1,mb_y,coeff_ctr,qp_const,pos_x,pos_y,quant_set,level ,scan_pos,run;
  871.   int m1[BLOCK_SIZE],m5[BLOCK_SIZE],m6[BLOCK_SIZE];
  872.   int coeff[16];
  873.   if (img->type == INTRA_IMG)
  874.     qp_const=JQQ3;
  875.   else
  876.     qp_const=JQQ4;
  877.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  878.   {
  879.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  880.     {
  881.       //  Horizontal transform.
  882.       for (j=0; j < BLOCK_SIZE; j++)
  883.       {
  884.         mb_y=n2+j;
  885.         for (i=0; i < 2; i++)
  886.         {
  887.           i1=3-i;
  888.           m5[i]=img->m7[i+n1][mb_y]+img->m7[i1+n1][mb_y];
  889.           m5[i1]=img->m7[i+n1][mb_y]-img->m7[i1+n1][mb_y];
  890.         }
  891.         img->m7[n1][mb_y]=(m5[0]+m5[1])*13;
  892.         img->m7[n1+2][mb_y]=(m5[0]-m5[1])*13;
  893.         img->m7[n1+1][mb_y]=m5[3]*17+m5[2]*7;
  894.         img->m7[n1+3][mb_y]=m5[3]*7-m5[2]*17;
  895.       }
  896.       //  Vertical transform.
  897.       for (i=0; i < BLOCK_SIZE; i++)
  898.       {
  899.         j1=n1+i;
  900.         for (j=0; j < 2; j++)
  901.         {
  902.           j2=3-j;
  903.           m5[j]=img->m7[j1][n2+j]+img->m7[j1][n2+j2];
  904.           m5[j2]=img->m7[j1][n2+j]-img->m7[j1][n2+j2];
  905.         }
  906.         img->m7[j1][n2+0]=(m5[0]+m5[1])*13;
  907.         img->m7[j1][n2+2]=(m5[0]-m5[1])*13;
  908.         img->m7[j1][n2+1]=m5[3]*17+m5[2]*7;
  909.         img->m7[j1][n2+3]=m5[3]*7-m5[2]*17;
  910.       }
  911.     }
  912.   }
  913.   //     2X2 transform of DC coeffs.
  914.   m1[0]=(img->m7[0][0]+img->m7[4][0]+img->m7[0][4]+img->m7[4][4])/2;
  915.   m1[1]=(img->m7[0][0]-img->m7[4][0]+img->m7[0][4]-img->m7[4][4])/2;
  916.   m1[2]=(img->m7[0][0]+img->m7[4][0]-img->m7[0][4]-img->m7[4][4])/2;
  917.   m1[3]=(img->m7[0][0]-img->m7[4][0]-img->m7[0][4]+img->m7[4][4])/2;
  918.   //     Quant of chroma 2X2 coeffs.
  919.   quant_set=QP_SCALE_CR[img->qp];
  920.   run=-1;
  921.   scan_pos=0;
  922.   for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  923.     coeff[coeff_ctr]=m1[coeff_ctr];
  924.   rd_quant(QUANT_CHROMA_DC,coeff);
  925.   for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  926.   {
  927.     run++;
  928.     ilev=0;
  929.     level =0;
  930.     level =(absm(coeff[coeff_ctr]));
  931.     if (level  != 0)
  932.     {
  933.       currMB->cbp_blk |= 0xf0000 << (uv << 2) ;  // if one of the 2x2-DC levels is != 0 the coded-bit
  934.       cr_cbp=max(1,cr_cbp);                      // for all 4 4x4 blocks is set (bit 16-19 or 20-23)
  935.       img->cofu[scan_pos][0][uv]=sign(level ,m1[coeff_ctr]);
  936.       img->cofu[scan_pos][1][uv]=run;
  937.       scan_pos++;
  938.       run=-1;
  939.       ilev=level*JQ[quant_set][1];
  940.     }
  941.     m1[coeff_ctr]=sign(ilev,m1[coeff_ctr]);
  942.   }
  943.   img->cofu[scan_pos][0][uv]=0;
  944.   //  Invers transform of 2x2 DC levels
  945.   img->m7[0][0]=(m1[0]+m1[1]+m1[2]+m1[3])/2;
  946.   img->m7[4][0]=(m1[0]-m1[1]+m1[2]-m1[3])/2;
  947.   img->m7[0][4]=(m1[0]+m1[1]-m1[2]-m1[3])/2;
  948.   img->m7[4][4]=(m1[0]-m1[1]-m1[2]+m1[3])/2;
  949.   //     Quant of chroma AC-coeffs.
  950.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  951.   {
  952.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  953.     {
  954.       pos_x=n1/BLOCK_SIZE + 2*uv;
  955.       pos_y=n2/BLOCK_SIZE + BLOCK_SIZE;
  956.       run=-1;
  957.       scan_pos=0;
  958.       for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)
  959.       {
  960.         i=SNGL_SCAN[coeff_ctr][0];
  961.         j=SNGL_SCAN[coeff_ctr][1];
  962.         coeff[coeff_ctr-1]=img->m7[n1+i][n2+j];
  963.       }
  964.       rd_quant(QUANT_CHROMA_AC,coeff);
  965.       for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)
  966.       {
  967.         i=SNGL_SCAN[coeff_ctr][0];
  968.         j=SNGL_SCAN[coeff_ctr][1];
  969.         ++run;
  970.         ilev=0;
  971.         level=absm(coeff[coeff_ctr-1]);
  972.         if (level  != 0)
  973.         {
  974.           currMB->cbp_blk |=  1 << (16 + (uv << 2) + ((n2 >> 1) + (n1 >> 2))) ;
  975.           cr_cbp = 2;
  976.           img->cof[pos_x][pos_y][scan_pos][0][0]=sign(level,img->m7[n1+i][n2+j]);
  977.           img->cof[pos_x][pos_y][scan_pos][1][0]=run;
  978.           ++scan_pos;
  979.           run=-1;
  980.           ilev=level*JQ[quant_set][1];
  981.         }
  982.         img->m7[n1+i][n2+j]=sign(ilev,img->m7[n1+i][n2+j]); // for use in IDCT
  983.       }
  984.       img->cof[pos_x][pos_y][scan_pos][0][0]=0; // EOB
  985.       //     IDCT.
  986.       //     Horizontal.
  987.       for (j=0; j < BLOCK_SIZE; j++)
  988.       {
  989.         for (i=0; i < BLOCK_SIZE; i++)
  990.         {
  991.           m5[i]=img->m7[n1+i][n2+j];
  992.         }
  993.         m6[0]=(m5[0]+m5[2])*13;
  994.         m6[1]=(m5[0]-m5[2])*13;
  995.         m6[2]=m5[1]*7-m5[3]*17;
  996.         m6[3]=m5[1]*17+m5[3]*7;
  997.         for (i=0; i < 2; i++)
  998.         {
  999.           i1=3-i;
  1000.           img->m7[n1+i][n2+j]=m6[i]+m6[i1];
  1001.           img->m7[n1+i1][n2+j]=m6[i]-m6[i1];
  1002.         }
  1003.       }
  1004.       //     Vertical.
  1005.       for (i=0; i < BLOCK_SIZE; i++)
  1006.       {
  1007.         for (j=0; j < BLOCK_SIZE; j++)
  1008.         {
  1009.           m5[j]=img->m7[n1+i][n2+j];
  1010.         }
  1011.         m6[0]=(m5[0]+m5[2])*13;
  1012.         m6[1]=(m5[0]-m5[2])*13;
  1013.         m6[2]=m5[1]*7-m5[3]*17;
  1014.         m6[3]=m5[1]*17+m5[3]*7;
  1015.         for (j=0; j < 2; j++)
  1016.         {
  1017.           j2=3-j;
  1018.           img->m7[n1+i][n2+j]=min(255,max(0,(m6[j]+m6[j2]+img->mpr[n1+i][n2+j]*JQQ1+JQQ2)/JQQ1));
  1019.           img->m7[n1+i][n2+j2]=min(255,max(0,(m6[j]-m6[j2]+img->mpr[n1+i][n2+j2]*JQQ1+JQQ2)/JQQ1));
  1020.         }
  1021.       }
  1022.     }
  1023.   }
  1024.   //  Decoded block moved to memory
  1025.   for (j=0; j < BLOCK_SIZE*2; j++)
  1026.     for (i=0; i < BLOCK_SIZE*2; i++)
  1027.     {
  1028.       imgUV[uv][img->pix_c_y+j][img->pix_c_x+i]= img->m7[i][j];
  1029.     }
  1030.   return cr_cbp;
  1031. }
  1032. #endif
  1033. //************************************************************************
  1034. #ifdef NO_RDQUANT
  1035. int dct_chroma(int uv,int cr_cbp)
  1036. {
  1037.   int i,j,i1,j2,ilev,n2,n1,j1,mb_y,coeff_ctr,qp_const,pos_x,pos_y,quant_set,level ,scan_pos,run;
  1038.   int m1[BLOCK_SIZE],m5[BLOCK_SIZE],m6[BLOCK_SIZE];
  1039. // int coeff[16];
  1040.   int coeff_cost;
  1041.   int cr_cbp_tmp;
  1042.   int nn0,nn1;
  1043.   int DCcoded=0 ;
  1044.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  1045.   if (img->type == INTRA_IMG)
  1046.     qp_const=JQQ3;
  1047.   else
  1048.     qp_const=JQQ4;
  1049.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  1050.   {
  1051.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  1052.     {
  1053.       //  Horizontal transform.
  1054.       for (j=0; j < BLOCK_SIZE; j++)
  1055.       {
  1056.         mb_y=n2+j;
  1057.         for (i=0; i < 2; i++)
  1058.         {
  1059.           i1=3-i;
  1060.           m5[i]=img->m7[i+n1][mb_y]+img->m7[i1+n1][mb_y];
  1061.           m5[i1]=img->m7[i+n1][mb_y]-img->m7[i1+n1][mb_y];
  1062.         }
  1063.         img->m7[n1][mb_y]=(m5[0]+m5[1])*13;
  1064.         img->m7[n1+2][mb_y]=(m5[0]-m5[1])*13;
  1065.         img->m7[n1+1][mb_y]=m5[3]*17+m5[2]*7;
  1066.         img->m7[n1+3][mb_y]=m5[3]*7-m5[2]*17;
  1067.       }
  1068.       //  Vertical transform.
  1069.       for (i=0; i < BLOCK_SIZE; i++)
  1070.       {
  1071.         j1=n1+i;
  1072.         for (j=0; j < 2; j++)
  1073.         {
  1074.           j2=3-j;
  1075.           m5[j]=img->m7[j1][n2+j]+img->m7[j1][n2+j2];
  1076.           m5[j2]=img->m7[j1][n2+j]-img->m7[j1][n2+j2];
  1077.         }
  1078.         img->m7[j1][n2+0]=(m5[0]+m5[1])*13;
  1079.         img->m7[j1][n2+2]=(m5[0]-m5[1])*13;
  1080.         img->m7[j1][n2+1]=m5[3]*17+m5[2]*7;
  1081.         img->m7[j1][n2+3]=m5[3]*7-m5[2]*17;
  1082.       }
  1083.     }
  1084.   }
  1085.   //     2X2 transform of DC coeffs.
  1086.   m1[0]=(img->m7[0][0]+img->m7[4][0]+img->m7[0][4]+img->m7[4][4])/2;
  1087.   m1[1]=(img->m7[0][0]-img->m7[4][0]+img->m7[0][4]-img->m7[4][4])/2;
  1088.   m1[2]=(img->m7[0][0]+img->m7[4][0]-img->m7[0][4]-img->m7[4][4])/2;
  1089.   m1[3]=(img->m7[0][0]-img->m7[4][0]-img->m7[0][4]+img->m7[4][4])/2;
  1090. //     Quant of chroma 2X2 coeffs.
  1091.   quant_set=QP_SCALE_CR[img->qp];
  1092.   run=-1;
  1093.   scan_pos=0;
  1094.   for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  1095.   {
  1096.     run++;
  1097.     ilev=0;
  1098.     level =(abs(m1[coeff_ctr])*JQ[quant_set][0]+qp_const)/JQQ1;// CHANGE rd_quant removed
  1099.     if (level  != 0)
  1100.     {
  1101.       currMB->cbp_blk |= 0xf0000 << (uv << 2) ;    // if one of the 2x2-DC levels is != 0 set the
  1102.       cr_cbp=max(1,cr_cbp);                     // coded-bit all 4 4x4 blocks (bit 16-19 or 20-23)
  1103.       DCcoded = 1 ;
  1104.       img->cofu[scan_pos][0][uv]=sign(level ,m1[coeff_ctr]);
  1105.       img->cofu[scan_pos][1][uv]=run;
  1106.       scan_pos++;
  1107.       run=-1;
  1108.       ilev=level*JQ[quant_set][1];
  1109.     }
  1110.     m1[coeff_ctr]=sign(ilev,m1[coeff_ctr]);
  1111.   }
  1112.   img->cofu[scan_pos][0][uv]=0;
  1113.   //  Invers transform of 2x2 DC levels
  1114.   img->m7[0][0]=(m1[0]+m1[1]+m1[2]+m1[3])/2;
  1115.   img->m7[4][0]=(m1[0]-m1[1]+m1[2]-m1[3])/2;
  1116.   img->m7[0][4]=(m1[0]+m1[1]-m1[2]-m1[3])/2;
  1117.   img->m7[4][4]=(m1[0]-m1[1]-m1[2]+m1[3])/2;
  1118.   //     Quant of chroma AC-coeffs.
  1119.   coeff_cost=0;
  1120.   cr_cbp_tmp=0;
  1121.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  1122.   {
  1123.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  1124.     {
  1125.       pos_x=n1/BLOCK_SIZE + 2*uv;
  1126.       pos_y=n2/BLOCK_SIZE + BLOCK_SIZE;
  1127.       run=-1;
  1128.       scan_pos=0;
  1129.       for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)// start change rd_quant
  1130.       {
  1131.         i = SNGL_SCAN[coeff_ctr][0];
  1132.         j = SNGL_SCAN[coeff_ctr][1];
  1133.         ++run;
  1134.         ilev=0;
  1135.         level=(abs(img->m7[n1+i][n2+j])*JQ[quant_set][0]+qp_const)/JQQ1;// CHANGE rd_quant removed
  1136.         if (level  != 0)
  1137.         {
  1138.           currMB->cbp_blk |= 1 << (16 + (uv << 2) + ((n2 >> 1) + (n1 >> 2))) ;
  1139.           if (level > 1)
  1140.             coeff_cost += MAX_VALUE;                // set high cost, shall not be discarded
  1141.           else
  1142.             coeff_cost += COEFF_COST[run];
  1143.           cr_cbp_tmp=2;
  1144.           img->cof[pos_x][pos_y][scan_pos][0][0]=sign(level,img->m7[n1+i][n2+j]);
  1145.           img->cof[pos_x][pos_y][scan_pos][1][0]=run;
  1146.           ++scan_pos;
  1147.           run=-1;
  1148.           ilev=level*JQ[quant_set][1];
  1149.         }
  1150.         img->m7[n1+i][n2+j]=sign(ilev,img->m7[n1+i][n2+j]); // for use in IDCT
  1151.       }
  1152.       img->cof[pos_x][pos_y][scan_pos][0][0]=0; // EOB
  1153.     }
  1154.   }
  1155.   // * reset chroma coeffs
  1156.   if(coeff_cost<7)
  1157.   {
  1158.     cr_cbp_tmp = 0 ;
  1159.     for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  1160.     {
  1161.       for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  1162.       {
  1163.         if( DCcoded == 0)                                   // if no chroma DC's: then reset
  1164.          currMB->cbp_blk &= ~(0xf0000 << (uv << 2)) ; // coded-bits of this chroma subblock
  1165.         nn0 = (n1>>2) + (uv<<1);
  1166.         nn1 = 4 + (n2>>2) ;
  1167.         img->cof[nn0][nn1][0][0][0] = 0;// dc coeff
  1168.         for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)// ac coeff
  1169.         {
  1170.           i=SNGL_SCAN[coeff_ctr][0];
  1171.           j=SNGL_SCAN[coeff_ctr][1];
  1172.           img->m7[n1+i][n2+j]=0;
  1173.           img->cof[nn0][nn1][coeff_ctr][0][0]=0;
  1174.         }
  1175.       }
  1176.     }
  1177.   }
  1178.   if(cr_cbp_tmp==2)
  1179.       cr_cbp = 2;
  1180.   //     IDCT.
  1181.       //     Horizontal.
  1182.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  1183.   {
  1184.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  1185.     {
  1186.       for (j=0; j < BLOCK_SIZE; j++)
  1187.       {
  1188.         for (i=0; i < BLOCK_SIZE; i++)
  1189.         {
  1190.           m5[i]=img->m7[n1+i][n2+j];
  1191.         }
  1192.         m6[0]=(m5[0]+m5[2])*13;
  1193.         m6[1]=(m5[0]-m5[2])*13;
  1194.         m6[2]=m5[1]*7-m5[3]*17;
  1195.         m6[3]=m5[1]*17+m5[3]*7;
  1196.         for (i=0; i < 2; i++)
  1197.         {
  1198.           i1=3-i;
  1199.           img->m7[n1+i][n2+j]=m6[i]+m6[i1];
  1200.           img->m7[n1+i1][n2+j]=m6[i]-m6[i1];
  1201.         }
  1202.       }
  1203.       //     Vertical.
  1204.       for (i=0; i < BLOCK_SIZE; i++)
  1205.       {
  1206.         for (j=0; j < BLOCK_SIZE; j++)
  1207.         {
  1208.           m5[j]=img->m7[n1+i][n2+j];
  1209.         }
  1210.         m6[0]=(m5[0]+m5[2])*13;
  1211.         m6[1]=(m5[0]-m5[2])*13;
  1212.         m6[2]=m5[1]*7-m5[3]*17;
  1213.         m6[3]=m5[1]*17+m5[3]*7;
  1214.         for (j=0; j < 2; j++)
  1215.         {
  1216.           j2=3-j;
  1217.           img->m7[n1+i][n2+j]=min(255,max(0,(m6[j]+m6[j2]+img->mpr[n1+i][n2+j]*JQQ1+JQQ2)/JQQ1));
  1218.           img->m7[n1+i][n2+j2]=min(255,max(0,(m6[j]-m6[j2]+img->mpr[n1+i][n2+j2]*JQQ1+JQQ2)/JQQ1));
  1219.         }
  1220.       }
  1221.     }
  1222.   }
  1223.   //  Decoded block moved to memory
  1224.   for (j=0; j < BLOCK_SIZE*2; j++)
  1225.     for (i=0; i < BLOCK_SIZE*2; i++)
  1226.       imgUV[uv][img->pix_c_y+j][img->pix_c_x+i]= img->m7[i][j];
  1227.   return cr_cbp;
  1228. }
  1229. #endif
  1230. void rd_quant(int scan_type,int *coeff)
  1231. {
  1232.   int idx,coeff_ctr;
  1233.   int qp_const,intra_add;
  1234.   int dbl_coeff_ctr;
  1235.   int level0,level1;
  1236.   int snr0;
  1237.   int dbl_coeff,k,k1,k2,rd_best,best_coeff_comb,rd_curr,snr1;
  1238.   int k0;
  1239.   int quant_set;
  1240.   int ilev,run,level;
  1241.   int no_coeff;
  1242.   if (img->type == INTRA_IMG)
  1243.   {
  1244.     qp_const=JQQ3;
  1245.     intra_add=2;
  1246.   }
  1247.   else
  1248.   {
  1249.     qp_const=JQQ4;
  1250.     intra_add=0;
  1251.   }
  1252.   quant_set=img->qp;
  1253.   switch (scan_type)
  1254.   {
  1255.   case  QUANT_LUMA_SNG:
  1256.     quant_set=img->qp;
  1257.     idx=2;
  1258.     no_coeff=16;
  1259.     break;
  1260.   case  QUANT_LUMA_AC:
  1261.     quant_set=img->qp;
  1262.     idx=2;
  1263.     no_coeff=15;
  1264.     break;
  1265.   case QUANT_LUMA_DBL:
  1266.     quant_set=img->qp;
  1267.     idx=1;
  1268.     no_coeff=8;
  1269.     break;
  1270.   case QUANT_CHROMA_DC:
  1271.     quant_set=QP_SCALE_CR[img->qp];
  1272.     idx=0;
  1273.     no_coeff=4;
  1274.     break;
  1275.   case QUANT_CHROMA_AC:
  1276.     quant_set=QP_SCALE_CR[img->qp];
  1277.     idx=2;
  1278.     no_coeff=15;
  1279.     break;
  1280.   default:
  1281.     error("rd_quant: unsupported scan_type", 600);
  1282.     break;
  1283.   }
  1284.   dbl_coeff_ctr=0;
  1285.   for (coeff_ctr=0;coeff_ctr < no_coeff ;coeff_ctr++)
  1286.   {
  1287.     k0=coeff[coeff_ctr];
  1288.     k1=abs(k0);
  1289.     if (dbl_coeff_ctr < MAX_TWO_LEVEL_COEFF)  // limit the number of 'twin' levels
  1290.     {
  1291.       level0 = (k0*JQ[quant_set][0])/J20;
  1292.       level1 = (k1*JQ[quant_set][0]+JQ4)/J20; // make positive summation
  1293.       level1 = sign(level1,k0);// set back sign on level
  1294.     }
  1295.     else
  1296.     {
  1297.       level0 = (k1*JQ[quant_set][0]+qp_const)/J20;
  1298.       level0 = sign(level0,k0);
  1299.       level1 = level0;
  1300.     }
  1301.     if (level0 != level1)
  1302.     {
  1303.       dbl_coeff = TRUE;     // decision is still open
  1304.       dbl_coeff_ctr++;      // count number of coefficients with 2 possible levels
  1305.     }
  1306.     else
  1307.       dbl_coeff = FALSE;    // level is decided
  1308.     snr0 = (12+intra_add)*level0*(64*level0 - (JQ[quant_set][0]*coeff[coeff_ctr])/J13); // find SNR improvement
  1309.     level_arr[coeff_ctr][MTLC_POW]=0; // indicates that all coefficients are decided
  1310.     for (k=0; k< MTLC_POW; k++)
  1311.     {
  1312.       level_arr[coeff_ctr][k]=level0;
  1313.       snr_arr[coeff_ctr][k]=snr0;
  1314.     }
  1315.     if (dbl_coeff)
  1316.     {
  1317.       snr1 = (12+intra_add)*level1*(64*level1 - (JQ[quant_set][0]*coeff[coeff_ctr])/J13);
  1318.       ilev= (int)pow(2,dbl_coeff_ctr-1);
  1319.       for (k1=ilev; k1<MTLC_POW; k1+=ilev*2)
  1320.       {
  1321.         for (k2=k1; k2<k1+ilev; k2++)
  1322.         {
  1323.           level_arr[coeff_ctr][k2]=level1;
  1324.           snr_arr[coeff_ctr][k2]=snr1;
  1325.         }
  1326.       }
  1327.     }
  1328.   }
  1329.   rd_best=0;
  1330.   best_coeff_comb= MTLC_POW;      // initial setting, used if no double decision coefficients
  1331.   for (k=0; k < pow(2,dbl_coeff_ctr);k++) // go through all combinations
  1332.   {
  1333.     rd_curr=0;
  1334.     run=-1;
  1335.     for (coeff_ctr=0;coeff_ctr < no_coeff;coeff_ctr++)
  1336.     {
  1337.       run++;
  1338.       level=min(16,absm(level_arr[coeff_ctr][k]));
  1339.       if (level != 0)
  1340.       {
  1341.         rd_curr += 64*COEFF_BIT_COST[idx][run][level-1]+snr_arr[coeff_ctr][k];
  1342.         run = -1;
  1343.       }
  1344.     }
  1345.     if (rd_curr < rd_best)
  1346.     {
  1347.       rd_best=rd_curr;
  1348.       best_coeff_comb=k;
  1349.     }
  1350.   }
  1351.   for (coeff_ctr=0;coeff_ctr < no_coeff ;coeff_ctr++)
  1352.     coeff[coeff_ctr]=level_arr[coeff_ctr][best_coeff_comb];
  1353.   return;
  1354. }
  1355. /*!
  1356.  ************************************************************************
  1357.  * brief
  1358.  *    The routine performs transform,quantization,inverse transform, adds the diff.
  1359.  *    to the prediction and writes the result to the decoded luma frame. Includes the
  1360.  *    RD constrained quantization also.
  1361.  *
  1362.  * para Input:
  1363.  *    block_x,block_y: Block position inside a macro block (0,4,8,12).
  1364.  *
  1365.  * para Output:
  1366.  *    nonzero: 0 if no levels are nonzero.  1 if there are nonzero levels.              n
  1367.  *    coeff_cost: Counter for nonzero coefficients, used to discard expencive levels.
  1368.  *
  1369.  *
  1370. ************************************************************************/
  1371. #ifndef NO_RDQUANT
  1372. int dct_luma_sp(int block_x,int block_y,int *coeff_cost)
  1373. {
  1374.   int sign(int a,int b);
  1375.   int i,j,i1,j1,ilev,m5[4],m6[4],coeff_ctr,scan_loop_ctr;
  1376.   int pos_x,pos_y,quant_set,level,scan_pos,run;
  1377.   int nonzero;
  1378.   int idx;
  1379.   int scan_mode;
  1380.   int loop_rep;
  1381.   int predicted_block[BLOCK_SIZE][BLOCK_SIZE],alpha,quant_set1,Fq1q2;
  1382.   int coeff[16],coeff2[16];
  1383.   pos_x=block_x/BLOCK_SIZE;
  1384.   pos_y=block_y/BLOCK_SIZE;
  1385.   //  Horizontal transform
  1386.   for (j=0; j< BLOCK_SIZE; j++)
  1387.     for (i=0; i< BLOCK_SIZE; i++)
  1388.     {
  1389.       img->m7[i][j]+=img->mpr[i+block_x][j+block_y];
  1390.       predicted_block[i][j]=img->mpr[i+block_x][j+block_y];
  1391.     }
  1392.   for (j=0; j < BLOCK_SIZE; j++)
  1393.   {
  1394.     for (i=0; i < 2; i++)
  1395.     {
  1396.       i1=3-i;
  1397.       m5[i]=img->m7[i][j]+img->m7[i1][j];
  1398.       m5[i1]=img->m7[i][j]-img->m7[i1][j];
  1399.     }
  1400.     img->m7[0][j]=(m5[0]+m5[1])*13;
  1401.     img->m7[2][j]=(m5[0]-m5[1])*13;
  1402.     img->m7[1][j]=m5[3]*17+m5[2]*7;
  1403.     img->m7[3][j]=m5[3]*7-m5[2]*17;
  1404.   }
  1405.   //  Vertival transform
  1406.   for (i=0; i < BLOCK_SIZE; i++)
  1407.   {
  1408.     for (j=0; j < 2; j++)
  1409.     {
  1410.       j1=3-j;
  1411.       m5[j]=img->m7[i][j]+img->m7[i][j1];
  1412.       m5[j1]=img->m7[i][j]-img->m7[i][j1];
  1413.     }
  1414.     img->m7[i][0]=(m5[0]+m5[1])*13;
  1415.     img->m7[i][2]=(m5[0]-m5[1])*13;
  1416.     img->m7[i][1]=m5[3]*17+m5[2]*7;
  1417.     img->m7[i][3]=m5[3]*7-m5[2]*17;
  1418.   }
  1419.   for (j=0; j < BLOCK_SIZE; j++)
  1420.   {
  1421.     for (i=0; i < 2; i++)
  1422.     {
  1423.       i1=3-i;
  1424.       m5[i]=predicted_block[i][j]+predicted_block[i1][j];
  1425.       m5[i1]=predicted_block[i][j]-predicted_block[i1][j];
  1426.     }
  1427.     predicted_block[0][j]=(m5[0]+m5[1])*13;
  1428.     predicted_block[2][j]=(m5[0]-m5[1])*13;
  1429.     predicted_block[1][j]=m5[3]*17+m5[2]*7;
  1430.     predicted_block[3][j]=m5[3]*7-m5[2]*17;
  1431.   }
  1432.   //  Vertival transform
  1433.   for (i=0; i < BLOCK_SIZE; i++)
  1434.   {
  1435.     for (j=0; j < 2; j++)
  1436.     {
  1437.       j1=3-j;
  1438.       m5[j]=predicted_block[i][j]+predicted_block[i][j1];
  1439.       m5[j1]=predicted_block[i][j]-predicted_block[i][j1];
  1440.     }
  1441.     predicted_block[i][0]=(m5[0]+m5[1])*13;
  1442.     predicted_block[i][2]=(m5[0]-m5[1])*13;
  1443.     predicted_block[i][1]=m5[3]*17+m5[2]*7;
  1444.     predicted_block[i][3]=m5[3]*7-m5[2]*17;
  1445.   }
  1446.   // Quant
  1447.   quant_set=img->qp;
  1448.   quant_set1=img->qpsp;
  1449.   alpha=(JQQ1+JQ[quant_set1][0]/2)/JQ[quant_set1][0];
  1450.   Fq1q2=(JQQ1*JQ[quant_set1][0]+JQ[quant_set][0]/2)/JQ[quant_set][0];
  1451.   nonzero=FALSE;
  1452.     scan_mode=SINGLE_SCAN;
  1453.     loop_rep=1;
  1454.     idx=0;
  1455.   for(scan_loop_ctr=0;scan_loop_ctr<loop_rep;scan_loop_ctr++) // 2 times if double scan, 1 normal scan
  1456.   {
  1457.     for (coeff_ctr=0;coeff_ctr < 16/loop_rep;coeff_ctr++)     // 8 times if double scan, 16 normal scan
  1458.     {
  1459.       if (scan_mode==DOUBLE_SCAN)
  1460.       {
  1461.         i=DBL_SCAN[coeff_ctr][0][scan_loop_ctr];
  1462.         j=DBL_SCAN[coeff_ctr][1][scan_loop_ctr];
  1463.       }
  1464.       else
  1465.       {
  1466.         i=SNGL_SCAN[coeff_ctr][0];
  1467.         j=SNGL_SCAN[coeff_ctr][1];
  1468.       }
  1469.       coeff[coeff_ctr]=img->m7[i][j];
  1470.       coeff2[coeff_ctr]=(img->m7[i][j]-sign(((abs (predicted_block[i][j]) * JQ[quant_set1][0] +JQQ2) / JQQ1),predicted_block[i][j])*alpha);
  1471.     }
  1472.     rd_quant(QUANT_LUMA_SNG,coeff2);
  1473.     run=-1;
  1474.     scan_pos=scan_loop_ctr*9;   // for double scan; set first or second scan posision
  1475.     for (coeff_ctr=0; coeff_ctr<16/loop_rep; coeff_ctr++)
  1476.     {
  1477.       if (scan_mode==DOUBLE_SCAN)
  1478.       {
  1479.         i=DBL_SCAN[coeff_ctr][0][scan_loop_ctr];
  1480.         j=DBL_SCAN[coeff_ctr][1][scan_loop_ctr];
  1481.       }
  1482.       else
  1483.       {
  1484.         i=SNGL_SCAN[coeff_ctr][0];
  1485.         j=SNGL_SCAN[coeff_ctr][1];
  1486.       }
  1487.       run++;
  1488.       ilev=0;
  1489.       level= absm(coeff2[coeff_ctr]);
  1490.       if (level != 0)
  1491.       {
  1492.         nonzero=TRUE;
  1493.         if (level > 1)
  1494.           *coeff_cost += MAX_VALUE;                // set high cost, shall not be discarded
  1495.         else
  1496.           *coeff_cost += COEFF_COST[run];
  1497.         img->cof[pos_x][pos_y][scan_pos][0][scan_mode]=sign(level,coeff2[coeff_ctr]);
  1498.         img->cof[pos_x][pos_y][scan_pos][1][scan_mode]=run;
  1499.         ++scan_pos;
  1500.         run=-1;                     // reset zero level counter
  1501.         ilev=level;
  1502.       }
  1503.       ilev=coeff2[coeff_ctr]*Fq1q2+predicted_block[i][j]*JQ[quant_set1][0];
  1504.       img->m7[i][j]=sign((abs(ilev)+JQQ2)/ JQQ1,ilev)*JQ[quant_set1][1];
  1505.     }
  1506.     img->cof[pos_x][pos_y][scan_pos][0][scan_mode]=0;  // end of block
  1507.   }
  1508.   //     IDCT.
  1509.   //     horizontal
  1510.   for (j=0; j < BLOCK_SIZE; j++)
  1511.   {
  1512.     for (i=0; i < BLOCK_SIZE; i++)
  1513.     {
  1514.       m5[i]=img->m7[i][j];
  1515.     }
  1516.     m6[0]=(m5[0]+m5[2])*13;
  1517.     m6[1]=(m5[0]-m5[2])*13;
  1518.     m6[2]=m5[1]*7-m5[3]*17;
  1519.     m6[3]=m5[1]*17+m5[3]*7;
  1520.     for (i=0; i < 2; i++)
  1521.     {
  1522.       i1=3-i;
  1523.       img->m7[i][j]=m6[i]+m6[i1];
  1524.       img->m7[i1][j]=m6[i]-m6[i1];
  1525.     }
  1526.   }
  1527.   //  vertical
  1528.   for (i=0; i < BLOCK_SIZE; i++)
  1529.   {
  1530.     for (j=0; j < BLOCK_SIZE; j++)
  1531.     {
  1532.       m5[j]=img->m7[i][j];
  1533.     }
  1534.     m6[0]=(m5[0]+m5[2])*13;
  1535.     m6[1]=(m5[0]-m5[2])*13;
  1536.     m6[2]=m5[1]*7-m5[3]*17;
  1537.     m6[3]=m5[1]*17+m5[3]*7;
  1538.     for (j=0; j < 2; j++)
  1539.     {
  1540.       j1=3-j;
  1541.       img->m7[i][j] =min(255,max(0,(m6[j]+m6[j1]+JQQ2)/JQQ1));
  1542.       img->m7[i][j1]=min(255,max(0,(m6[j]-m6[j1]+JQQ2)/JQQ1));
  1543.     }
  1544.   }
  1545.   //  Decoded block moved to frame memory
  1546.   for (j=0; j < BLOCK_SIZE; j++)
  1547.     for (i=0; i < BLOCK_SIZE; i++)
  1548.       imgY[img->pix_y+block_y+j][img->pix_x+block_x+i]=img->m7[i][j];
  1549.   return nonzero;
  1550. }
  1551. #endif
  1552. #ifdef NO_RDQUANT
  1553. int dct_luma_sp(int block_x,int block_y,int *coeff_cost)
  1554. {
  1555.   int sign(int a,int b);
  1556.   int i,j,i1,j1,ilev,m5[4],m6[4],coeff_ctr,scan_loop_ctr;
  1557.   int qp_const,pos_x,pos_y,quant_set,level,scan_pos,run;
  1558.   int nonzero;
  1559.   int idx;
  1560.   int scan_mode;
  1561.   int loop_rep;
  1562.   int predicted_block[BLOCK_SIZE][BLOCK_SIZE],alpha,quant_set1,Fq1q2,c_err;
  1563.   qp_const=JQQ4;    // inter
  1564.   pos_x=block_x/BLOCK_SIZE;
  1565.   pos_y=block_y/BLOCK_SIZE;
  1566.   //  Horizontal transform
  1567.   for (j=0; j< BLOCK_SIZE; j++)
  1568.     for (i=0; i< BLOCK_SIZE; i++)
  1569.     {
  1570.       img->m7[i][j]+=img->mpr[i+block_x][j+block_y];
  1571.       predicted_block[i][j]=img->mpr[i+block_x][j+block_y];
  1572.     }
  1573.   for (j=0; j < BLOCK_SIZE; j++)
  1574.   {
  1575.     for (i=0; i < 2; i++)
  1576.     {
  1577.       i1=3-i;
  1578.       m5[i]=img->m7[i][j]+img->m7[i1][j];
  1579.       m5[i1]=img->m7[i][j]-img->m7[i1][j];
  1580.     }
  1581.     img->m7[0][j]=(m5[0]+m5[1])*13;
  1582.     img->m7[2][j]=(m5[0]-m5[1])*13;
  1583.     img->m7[1][j]=m5[3]*17+m5[2]*7;
  1584.     img->m7[3][j]=m5[3]*7-m5[2]*17;
  1585.   }
  1586.   //  Vertival transform
  1587.   for (i=0; i < BLOCK_SIZE; i++)
  1588.   {
  1589.     for (j=0; j < 2; j++)
  1590.     {
  1591.       j1=3-j;
  1592.       m5[j]=img->m7[i][j]+img->m7[i][j1];
  1593.       m5[j1]=img->m7[i][j]-img->m7[i][j1];
  1594.     }
  1595.     img->m7[i][0]=(m5[0]+m5[1])*13;
  1596.     img->m7[i][2]=(m5[0]-m5[1])*13;
  1597.     img->m7[i][1]=m5[3]*17+m5[2]*7;
  1598.     img->m7[i][3]=m5[3]*7-m5[2]*17;
  1599.   }
  1600.   for (j=0; j < BLOCK_SIZE; j++)
  1601.   {
  1602.     for (i=0; i < 2; i++)
  1603.     {
  1604.       i1=3-i;
  1605.       m5[i]=predicted_block[i][j]+predicted_block[i1][j];
  1606.       m5[i1]=predicted_block[i][j]-predicted_block[i1][j];
  1607.     }
  1608.     predicted_block[0][j]=(m5[0]+m5[1])*13;
  1609.     predicted_block[2][j]=(m5[0]-m5[1])*13;
  1610.     predicted_block[1][j]=m5[3]*17+m5[2]*7;
  1611.     predicted_block[3][j]=m5[3]*7-m5[2]*17;
  1612.   }
  1613.   //  Vertival transform
  1614.   for (i=0; i < BLOCK_SIZE; i++)
  1615.   {
  1616.     for (j=0; j < 2; j++)
  1617.     {
  1618.       j1=3-j;
  1619.       m5[j]=predicted_block[i][j]+predicted_block[i][j1];
  1620.       m5[j1]=predicted_block[i][j]-predicted_block[i][j1];
  1621.     }
  1622.     predicted_block[i][0]=(m5[0]+m5[1])*13;
  1623.     predicted_block[i][2]=(m5[0]-m5[1])*13;
  1624.     predicted_block[i][1]=m5[3]*17+m5[2]*7;
  1625.     predicted_block[i][3]=m5[3]*7-m5[2]*17;
  1626.   }
  1627.   // Quant
  1628.   quant_set=img->qp;
  1629.   quant_set1=img->qpsp;
  1630.   alpha=(JQQ1+JQ[quant_set1][0]/2)/JQ[quant_set1][0];
  1631.   Fq1q2=(JQQ1*JQ[quant_set1][0]+JQ[quant_set][0]/2)/JQ[quant_set][0];
  1632.   nonzero=FALSE;
  1633.     scan_mode=SINGLE_SCAN;
  1634.     loop_rep=1;
  1635.     idx=0;
  1636.   for(scan_loop_ctr=0;scan_loop_ctr<loop_rep;scan_loop_ctr++) // 2 times if double scan, 1 normal scan
  1637.   {
  1638.   run=-1;
  1639.   scan_pos=scan_loop_ctr*9;
  1640.     for (coeff_ctr=0;coeff_ctr < 16/loop_rep;coeff_ctr++)     // 8 times if double scan, 16 normal scan
  1641.     {
  1642.       if (scan_mode==DOUBLE_SCAN)
  1643.       {
  1644.         i=DBL_SCAN[coeff_ctr][0][scan_loop_ctr];
  1645.         j=DBL_SCAN[coeff_ctr][1][scan_loop_ctr];
  1646.       }
  1647.       else
  1648.       {
  1649.         i=SNGL_SCAN[coeff_ctr][0];
  1650.         j=SNGL_SCAN[coeff_ctr][1];
  1651.       }
  1652.       run++;
  1653.       ilev=0;
  1654.       c_err=img->m7[i][j]-alpha*sign(((abs (predicted_block[i][j]) * JQ[quant_set1][0] +JQQ2) / JQQ1),predicted_block[i][j]);
  1655.       level = (abs (c_err) * JQ[quant_set][0] +qp_const) / JQQ1;
  1656.       if (level != 0)
  1657.       {
  1658.         nonzero=TRUE;
  1659.         if (level > 1)
  1660.           *coeff_cost += MAX_VALUE;                // set high cost, shall not be discarded
  1661.         else
  1662.           *coeff_cost += COEFF_COST[run];
  1663.         img->cof[pos_x][pos_y][scan_pos][0][scan_mode]=sign(level,c_err);
  1664.         img->cof[pos_x][pos_y][scan_pos][1][scan_mode]=run;
  1665.         ++scan_pos;
  1666.         run=-1;                     // reset zero level counter
  1667.         ilev=level;
  1668.       }
  1669.       ilev=sign(ilev,c_err)*Fq1q2+predicted_block[i][j]*JQ[quant_set1][0];
  1670.       img->m7[i][j]=sign((abs(ilev)+JQQ2)/ JQQ1*JQ[quant_set1][1],ilev);
  1671.     }
  1672.     img->cof[pos_x][pos_y][scan_pos][0][scan_mode]=0;  // end of block
  1673.   }
  1674.   //     IDCT.
  1675.   //     horizontal
  1676.   for (j=0; j < BLOCK_SIZE; j++)
  1677.   {
  1678.     for (i=0; i < BLOCK_SIZE; i++)
  1679.     {
  1680.       m5[i]=img->m7[i][j];
  1681.     }
  1682.     m6[0]=(m5[0]+m5[2])*13;
  1683.     m6[1]=(m5[0]-m5[2])*13;
  1684.     m6[2]=m5[1]*7-m5[3]*17;
  1685.     m6[3]=m5[1]*17+m5[3]*7;
  1686.     for (i=0; i < 2; i++)
  1687.     {
  1688.       i1=3-i;
  1689.       img->m7[i][j]=m6[i]+m6[i1];
  1690.       img->m7[i1][j]=m6[i]-m6[i1];
  1691.     }
  1692.   }
  1693.   //  vertical
  1694.   for (i=0; i < BLOCK_SIZE; i++)
  1695.   {
  1696.     for (j=0; j < BLOCK_SIZE; j++)
  1697.     {
  1698.       m5[j]=img->m7[i][j];
  1699.     }
  1700.     m6[0]=(m5[0]+m5[2])*13;
  1701.     m6[1]=(m5[0]-m5[2])*13;
  1702.     m6[2]=m5[1]*7-m5[3]*17;
  1703.     m6[3]=m5[1]*17+m5[3]*7;
  1704.     for (j=0; j < 2; j++)
  1705.     {
  1706.       j1=3-j;
  1707.       img->m7[i][j] =min(255,max(0,(m6[j]+m6[j1]+JQQ2)/JQQ1));
  1708.       img->m7[i][j1]=min(255,max(0,(m6[j]-m6[j1]+JQQ2)/JQQ1));
  1709.     }
  1710.   }
  1711.   //  Decoded block moved to frame memory
  1712.   for (j=0; j < BLOCK_SIZE; j++)
  1713.     for (i=0; i < BLOCK_SIZE; i++)
  1714.       imgY[img->pix_y+block_y+j][img->pix_x+block_x+i]=img->m7[i][j];
  1715.   return nonzero;
  1716. }
  1717. #endif
  1718. /*!
  1719.  ************************************************************************
  1720.  * brief
  1721.  *    Transform,quantization,inverse transform for chroma.
  1722.  *    The main reason why this is done in a separate routine is the
  1723.  *    additional 2x2 transform of DC-coeffs. This routine is called
  1724.  *    ones for each of the chroma components.
  1725.  *
  1726.  * para Input:
  1727.  *    uv    : Make difference between the U and V chroma component               n
  1728.  *    cr_cbp: chroma coded block pattern
  1729.  *
  1730.  * para Output:
  1731.  *    cr_cbp: Updated chroma coded block pattern.
  1732.  ************************************************************************
  1733.  */
  1734. #ifndef NO_RDQUANT
  1735. int dct_chroma_sp(int uv,int cr_cbp)
  1736. {
  1737.   int i,j,i1,j2,ilev,n2,n1,j1,mb_y,coeff_ctr,qp_const,pos_x,pos_y,quant_set,level ,scan_pos,run;
  1738.   int m1[BLOCK_SIZE],m5[BLOCK_SIZE],m6[BLOCK_SIZE];
  1739.   int coeff[16];
  1740.   int predicted_chroma_block[MB_BLOCK_SIZE/2][MB_BLOCK_SIZE/2],alpha,Fq1q2,mp1[BLOCK_SIZE],quant_set1;
  1741.   qp_const=JQQ4;
  1742.   for (j=0; j < MB_BLOCK_SIZE/2; j++)
  1743.     for (i=0; i < MB_BLOCK_SIZE/2; i++)
  1744.     {
  1745.       img->m7[i][j]+=img->mpr[i][j];
  1746.       predicted_chroma_block[i][j]=img->mpr[i][j];
  1747.     }
  1748.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  1749.   {
  1750.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  1751.     {
  1752.       //  Horizontal transform.
  1753.       for (j=0; j < BLOCK_SIZE; j++)
  1754.       {
  1755.         mb_y=n2+j;
  1756.         for (i=0; i < 2; i++)
  1757.         {
  1758.           i1=3-i;
  1759.           m5[i]=img->m7[i+n1][mb_y]+img->m7[i1+n1][mb_y];
  1760.           m5[i1]=img->m7[i+n1][mb_y]-img->m7[i1+n1][mb_y];
  1761.         }
  1762.         img->m7[n1][mb_y]=(m5[0]+m5[1])*13;
  1763.         img->m7[n1+2][mb_y]=(m5[0]-m5[1])*13;
  1764.         img->m7[n1+1][mb_y]=m5[3]*17+m5[2]*7;
  1765.         img->m7[n1+3][mb_y]=m5[3]*7-m5[2]*17;
  1766.       }
  1767.       //  Vertical transform.
  1768.       for (i=0; i < BLOCK_SIZE; i++)
  1769.       {
  1770.         j1=n1+i;
  1771.         for (j=0; j < 2; j++)
  1772.         {
  1773.           j2=3-j;
  1774.           m5[j]=img->m7[j1][n2+j]+img->m7[j1][n2+j2];
  1775.           m5[j2]=img->m7[j1][n2+j]-img->m7[j1][n2+j2];
  1776.         }
  1777.         img->m7[j1][n2+0]=(m5[0]+m5[1])*13;
  1778.         img->m7[j1][n2+2]=(m5[0]-m5[1])*13;
  1779.         img->m7[j1][n2+1]=m5[3]*17+m5[2]*7;
  1780.         img->m7[j1][n2+3]=m5[3]*7-m5[2]*17;
  1781.       }
  1782.     }
  1783.   }
  1784.   //     2X2 transform of DC coeffs.
  1785.   m1[0]=(img->m7[0][0]+img->m7[4][0]+img->m7[0][4]+img->m7[4][4])/2;
  1786.   m1[1]=(img->m7[0][0]-img->m7[4][0]+img->m7[0][4]-img->m7[4][4])/2;
  1787.   m1[2]=(img->m7[0][0]+img->m7[4][0]-img->m7[0][4]-img->m7[4][4])/2;
  1788.   m1[3]=(img->m7[0][0]-img->m7[4][0]-img->m7[0][4]+img->m7[4][4])/2;
  1789.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  1790.   {
  1791.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  1792.     {
  1793.       //  Horizontal transform.
  1794.       for (j=0; j < BLOCK_SIZE; j++)
  1795.       {
  1796.         mb_y=n2+j;
  1797.         for (i=0; i < 2; i++)
  1798.         {
  1799.           i1=3-i;
  1800.           m5[i]=predicted_chroma_block[i+n1][mb_y]+predicted_chroma_block[i1+n1][mb_y];
  1801.           m5[i1]=predicted_chroma_block[i+n1][mb_y]-predicted_chroma_block[i1+n1][mb_y];
  1802.         }
  1803.         predicted_chroma_block[n1][mb_y]=(m5[0]+m5[1])*13;
  1804.         predicted_chroma_block[n1+2][mb_y]=(m5[0]-m5[1])*13;
  1805.         predicted_chroma_block[n1+1][mb_y]=m5[3]*17+m5[2]*7;
  1806.         predicted_chroma_block[n1+3][mb_y]=m5[3]*7-m5[2]*17;
  1807.       }
  1808.       //  Vertical transform.
  1809.       for (i=0; i < BLOCK_SIZE; i++)
  1810.       {
  1811.         j1=n1+i;
  1812.         for (j=0; j < 2; j++)
  1813.         {
  1814.           j2=3-j;
  1815.           m5[j]=predicted_chroma_block[j1][n2+j]+predicted_chroma_block[j1][n2+j2];
  1816.           m5[j2]=predicted_chroma_block[j1][n2+j]-predicted_chroma_block[j1][n2+j2];
  1817.         }
  1818.         predicted_chroma_block[j1][n2+0]=(m5[0]+m5[1])*13;
  1819.         predicted_chroma_block[j1][n2+2]=(m5[0]-m5[1])*13;
  1820.         predicted_chroma_block[j1][n2+1]=m5[3]*17+m5[2]*7;
  1821.         predicted_chroma_block[j1][n2+3]=m5[3]*7-m5[2]*17;
  1822.       }
  1823.     }
  1824.   }
  1825.   //     2X2 transform of DC coeffs.
  1826.   mp1[0]=(predicted_chroma_block[0][0]+predicted_chroma_block[4][0]+predicted_chroma_block[0][4]+predicted_chroma_block[4][4])/2;
  1827.   mp1[1]=(predicted_chroma_block[0][0]-predicted_chroma_block[4][0]+predicted_chroma_block[0][4]-predicted_chroma_block[4][4])/2;
  1828.   mp1[2]=(predicted_chroma_block[0][0]+predicted_chroma_block[4][0]-predicted_chroma_block[0][4]-predicted_chroma_block[4][4])/2;
  1829.   mp1[3]=(predicted_chroma_block[0][0]-predicted_chroma_block[4][0]-predicted_chroma_block[0][4]+predicted_chroma_block[4][4])/2;
  1830.   //     Quant of chroma 2X2 coeffs.
  1831.   quant_set=QP_SCALE_CR[img->qp];
  1832.   quant_set1=QP_SCALE_CR[img->qpsp];
  1833.   alpha=(JQQ1+JQ[quant_set1][0]/2)/JQ[quant_set1][0];
  1834.   Fq1q2=(JQQ1*JQ[quant_set1][0]+JQ[quant_set][0]/2)/JQ[quant_set][0];
  1835.   for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  1836.     coeff[coeff_ctr]=m1[coeff_ctr]-alpha*sign((abs (mp1[coeff_ctr]) * JQ[quant_set1][0] +JQQ2) / JQQ1,mp1[coeff_ctr]);
  1837.   rd_quant(QUANT_CHROMA_DC,coeff);
  1838.   run=-1;
  1839.   scan_pos=0;
  1840.   for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  1841.   {
  1842.     run++;
  1843.     ilev=0;
  1844.     level =0;
  1845.     level =(absm(coeff[coeff_ctr]));
  1846.     if (level  != 0)
  1847.     {
  1848.       cr_cbp=max(1,cr_cbp);
  1849.       img->cofu[scan_pos][0][uv]=sign(level ,coeff[coeff_ctr]);
  1850.       img->cofu[scan_pos][1][uv]=run;
  1851.       scan_pos++;
  1852.       run=-1;
  1853.       ilev=level;
  1854.     }
  1855.       ilev=coeff[coeff_ctr]*Fq1q2+mp1[coeff_ctr]*JQ[quant_set1][0];
  1856.       m1[coeff_ctr]=sign((abs(ilev)+JQQ2)/ JQQ1,ilev)*JQ[quant_set1][1];
  1857.   }
  1858.   img->cofu[scan_pos][0][uv]=0;
  1859.   //  Invers transform of 2x2 DC levels
  1860.   img->m7[0][0]=(m1[0]+m1[1]+m1[2]+m1[3])/2;
  1861.   img->m7[4][0]=(m1[0]-m1[1]+m1[2]-m1[3])/2;
  1862.   img->m7[0][4]=(m1[0]+m1[1]-m1[2]-m1[3])/2;
  1863.   img->m7[4][4]=(m1[0]-m1[1]-m1[2]+m1[3])/2;
  1864.   //     Quant of chroma AC-coeffs.
  1865.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  1866.   {
  1867.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  1868.     {
  1869.       pos_x=n1/BLOCK_SIZE + 2*uv;
  1870.       pos_y=n2/BLOCK_SIZE + BLOCK_SIZE;
  1871.       run=-1;
  1872.       scan_pos=0;
  1873.       for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)
  1874.       {
  1875.         i=SNGL_SCAN[coeff_ctr][0];
  1876.         j=SNGL_SCAN[coeff_ctr][1];
  1877.         coeff[coeff_ctr-1]=img->m7[n1+i][n2+j]-alpha*sign((abs (predicted_chroma_block[n1+i][n2+j]) * JQ[quant_set1][0] +JQQ2) / JQQ1,predicted_chroma_block[n1+i][n2+j]);
  1878.       }
  1879.       rd_quant(QUANT_CHROMA_AC,coeff);
  1880.       for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)
  1881.       {
  1882.         i=SNGL_SCAN[coeff_ctr][0];
  1883.         j=SNGL_SCAN[coeff_ctr][1];
  1884.         ++run;
  1885.         ilev=0;
  1886.         level=absm(coeff[coeff_ctr-1]);
  1887.         if (level  != 0)
  1888.         {
  1889.           cr_cbp=2;
  1890.           img->cof[pos_x][pos_y][scan_pos][0][0]=sign(level,coeff[coeff_ctr-1]);
  1891.           img->cof[pos_x][pos_y][scan_pos][1][0]=run;
  1892.           ++scan_pos;
  1893.           run=-1;
  1894.           ilev=level;
  1895.         }
  1896.         ilev=sign(ilev,coeff[coeff_ctr-1])*Fq1q2+predicted_chroma_block[n1+i][n2+j]*JQ[quant_set1][0];
  1897.         img->m7[n1+i][n2+j]=sign((abs(ilev)+JQQ2)/ JQQ1,ilev)*JQ[quant_set1][1];
  1898.       }
  1899.       img->cof[pos_x][pos_y][scan_pos][0][0]=0; // EOB
  1900.       //     IDCT.
  1901.       //     Horizontal.
  1902.       for (j=0; j < BLOCK_SIZE; j++)
  1903.       {
  1904.         for (i=0; i < BLOCK_SIZE; i++)
  1905.         {
  1906.           m5[i]=img->m7[n1+i][n2+j];
  1907.         }
  1908.         m6[0]=(m5[0]+m5[2])*13;
  1909.         m6[1]=(m5[0]-m5[2])*13;
  1910.         m6[2]=m5[1]*7-m5[3]*17;
  1911.         m6[3]=m5[1]*17+m5[3]*7;
  1912.         for (i=0; i < 2; i++)
  1913.         {
  1914.           i1=3-i;
  1915.           img->m7[n1+i][n2+j]=m6[i]+m6[i1];
  1916.           img->m7[n1+i1][n2+j]=m6[i]-m6[i1];
  1917.         }
  1918.       }
  1919.       //     Vertical.
  1920.       for (i=0; i < BLOCK_SIZE; i++)
  1921.       {
  1922.         for (j=0; j < BLOCK_SIZE; j++)
  1923.         {
  1924.           m5[j]=img->m7[n1+i][n2+j];
  1925.         }
  1926.         m6[0]=(m5[0]+m5[2])*13;
  1927.         m6[1]=(m5[0]-m5[2])*13;
  1928.         m6[2]=m5[1]*7-m5[3]*17;
  1929.         m6[3]=m5[1]*17+m5[3]*7;
  1930.         for (j=0; j < 2; j++)
  1931.         {
  1932.           j2=3-j;
  1933.           img->m7[n1+i][n2+j]=min(255,max(0,(m6[j]+m6[j2]+JQQ2)/JQQ1));
  1934.           img->m7[n1+i][n2+j2]=min(255,max(0,(m6[j]-m6[j2]+JQQ2)/JQQ1));
  1935.         }
  1936.       }
  1937.     }
  1938.   }
  1939.   //  Decoded block moved to memory
  1940.   for (j=0; j < BLOCK_SIZE*2; j++)
  1941.     for (i=0; i < BLOCK_SIZE*2; i++)
  1942.     {
  1943.       imgUV[uv][img->pix_c_y+j][img->pix_c_x+i]= img->m7[i][j];
  1944.     }
  1945.   return cr_cbp;
  1946. }
  1947. #endif
  1948. #ifdef NO_RDQUANT
  1949. int dct_chroma_sp(int uv,int cr_cbp)
  1950. {
  1951.   int i,j,i1,j2,ilev,n2,n1,j1,mb_y,coeff_ctr,qp_const,pos_x,pos_y,quant_set,quant_set1,c_err,level ,scan_pos,run;
  1952.   int m1[BLOCK_SIZE],m5[BLOCK_SIZE],m6[BLOCK_SIZE];
  1953. // int coeff[16];
  1954.   int coeff_cost;
  1955.   int cr_cbp_tmp;
  1956.   int predicted_chroma_block[MB_BLOCK_SIZE/2][MB_BLOCK_SIZE/2],alpha,Fq1q2,mp1[BLOCK_SIZE];
  1957.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  1958.   qp_const=JQQ4;
  1959.   for (j=0; j < MB_BLOCK_SIZE/2; j++)
  1960.         for (i=0; i < MB_BLOCK_SIZE/2; i++)
  1961.         {
  1962.           img->m7[i][j]+=img->mpr[i][j];
  1963.           predicted_chroma_block[i][j]=img->mpr[i][j];
  1964.         }
  1965.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  1966.   {
  1967.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  1968.     {
  1969.       //  Horizontal transform.
  1970.       for (j=0; j < BLOCK_SIZE; j++)
  1971.       {
  1972.         mb_y=n2+j;
  1973.         for (i=0; i < 2; i++)
  1974.         {
  1975.           i1=3-i;
  1976.           m5[i]=img->m7[i+n1][mb_y]+img->m7[i1+n1][mb_y];
  1977.           m5[i1]=img->m7[i+n1][mb_y]-img->m7[i1+n1][mb_y];
  1978.         }
  1979.         img->m7[n1][mb_y]=(m5[0]+m5[1])*13;
  1980.         img->m7[n1+2][mb_y]=(m5[0]-m5[1])*13;
  1981.         img->m7[n1+1][mb_y]=m5[3]*17+m5[2]*7;
  1982.         img->m7[n1+3][mb_y]=m5[3]*7-m5[2]*17;
  1983.       }
  1984.       //  Vertical transform.
  1985.       for (i=0; i < BLOCK_SIZE; i++)
  1986.       {
  1987.         j1=n1+i;
  1988.         for (j=0; j < 2; j++)
  1989.         {
  1990.           j2=3-j;
  1991.           m5[j]=img->m7[j1][n2+j]+img->m7[j1][n2+j2];
  1992.           m5[j2]=img->m7[j1][n2+j]-img->m7[j1][n2+j2];
  1993.         }
  1994.         img->m7[j1][n2+0]=(m5[0]+m5[1])*13;
  1995.         img->m7[j1][n2+2]=(m5[0]-m5[1])*13;
  1996.         img->m7[j1][n2+1]=m5[3]*17+m5[2]*7;
  1997.         img->m7[j1][n2+3]=m5[3]*7-m5[2]*17;
  1998.       }
  1999.     }
  2000.   }
  2001.   //     2X2 transform of DC coeffs.
  2002.   m1[0]=(img->m7[0][0]+img->m7[4][0]+img->m7[0][4]+img->m7[4][4])/2;
  2003.   m1[1]=(img->m7[0][0]-img->m7[4][0]+img->m7[0][4]-img->m7[4][4])/2;
  2004.   m1[2]=(img->m7[0][0]+img->m7[4][0]-img->m7[0][4]-img->m7[4][4])/2;
  2005.   m1[3]=(img->m7[0][0]-img->m7[4][0]-img->m7[0][4]+img->m7[4][4])/2;
  2006. for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  2007.   {
  2008.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  2009.     {
  2010.       //  Horizontal transform.
  2011.       for (j=0; j < BLOCK_SIZE; j++)
  2012.       {
  2013.         mb_y=n2+j;
  2014.         for (i=0; i < 2; i++)
  2015.         {
  2016.           i1=3-i;
  2017.           m5[i]=predicted_chroma_block[i+n1][mb_y]+predicted_chroma_block[i1+n1][mb_y];
  2018.           m5[i1]=predicted_chroma_block[i+n1][mb_y]-predicted_chroma_block[i1+n1][mb_y];
  2019.         }
  2020.         predicted_chroma_block[n1][mb_y]=(m5[0]+m5[1])*13;
  2021.         predicted_chroma_block[n1+2][mb_y]=(m5[0]-m5[1])*13;
  2022.         predicted_chroma_block[n1+1][mb_y]=m5[3]*17+m5[2]*7;
  2023.         predicted_chroma_block[n1+3][mb_y]=m5[3]*7-m5[2]*17;
  2024.       }
  2025.       //  Vertical transform.
  2026.       for (i=0; i < BLOCK_SIZE; i++)
  2027.       {
  2028.         j1=n1+i;
  2029.         for (j=0; j < 2; j++)
  2030.         {
  2031.           j2=3-j;
  2032.           m5[j]=predicted_chroma_block[j1][n2+j]+predicted_chroma_block[j1][n2+j2];
  2033.           m5[j2]=predicted_chroma_block[j1][n2+j]-predicted_chroma_block[j1][n2+j2];
  2034.         }
  2035.         predicted_chroma_block[j1][n2+0]=(m5[0]+m5[1])*13;
  2036.         predicted_chroma_block[j1][n2+2]=(m5[0]-m5[1])*13;
  2037.         predicted_chroma_block[j1][n2+1]=m5[3]*17+m5[2]*7;
  2038.         predicted_chroma_block[j1][n2+3]=m5[3]*7-m5[2]*17;
  2039.       }
  2040.     }
  2041.   }
  2042.   //     2X2 transform of DC coeffs.
  2043.   mp1[0]=(predicted_chroma_block[0][0]+predicted_chroma_block[4][0]+predicted_chroma_block[0][4]+predicted_chroma_block[4][4])/2;
  2044.   mp1[1]=(predicted_chroma_block[0][0]-predicted_chroma_block[4][0]+predicted_chroma_block[0][4]-predicted_chroma_block[4][4])/2;
  2045.   mp1[2]=(predicted_chroma_block[0][0]+predicted_chroma_block[4][0]-predicted_chroma_block[0][4]-predicted_chroma_block[4][4])/2;
  2046.   mp1[3]=(predicted_chroma_block[0][0]-predicted_chroma_block[4][0]-predicted_chroma_block[0][4]+predicted_chroma_block[4][4])/2;
  2047. //     Quant of chroma 2X2 coeffs.
  2048.   quant_set=QP_SCALE_CR[img->qp];
  2049.   quant_set1=QP_SCALE_CR[img->qpsp];
  2050.   alpha=(JQQ1+JQ[quant_set1][0]/2)/JQ[quant_set1][0];
  2051.   Fq1q2=(JQQ1*JQ[quant_set1][0]+JQ[quant_set][0]/2)/JQ[quant_set][0];
  2052.   run=-1;
  2053.   scan_pos=0;
  2054.   for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  2055.   {
  2056.     run++;
  2057.     ilev=0;
  2058.     c_err=m1[coeff_ctr]-alpha*sign((abs (mp1[coeff_ctr]) * JQ[quant_set1][0] +JQQ2) / JQQ1,mp1[coeff_ctr]);
  2059.     level =(abs(c_err)*JQ[quant_set][0]+qp_const)/JQQ1;
  2060.     if (level  != 0)
  2061.     {
  2062.       currMB->cbp_blk |= 0xf0000 << (uv << 2) ;  // if one of the 2x2-DC levels is != 0 the coded-bit
  2063.       cr_cbp=max(1,cr_cbp);
  2064.       img->cofu[scan_pos][0][uv]=sign(level ,c_err);
  2065.       img->cofu[scan_pos][1][uv]=run;
  2066.       scan_pos++;
  2067.       run=-1;
  2068.       ilev=level;
  2069.     }
  2070.     ilev=sign(level,c_err)*Fq1q2+mp1[coeff_ctr]*JQ[quant_set1][0];
  2071.     m1[coeff_ctr]=sign((abs(ilev)+JQQ2)/ JQQ1,ilev)*JQ[quant_set1][1];
  2072.   }
  2073.   img->cofu[scan_pos][0][uv]=0;
  2074.   //  Invers transform of 2x2 DC levels
  2075.   img->m7[0][0]=(m1[0]+m1[1]+m1[2]+m1[3])/2;
  2076.   img->m7[4][0]=(m1[0]-m1[1]+m1[2]-m1[3])/2;
  2077.   img->m7[0][4]=(m1[0]+m1[1]-m1[2]-m1[3])/2;
  2078.   img->m7[4][4]=(m1[0]-m1[1]-m1[2]+m1[3])/2;
  2079.   //     Quant of chroma AC-coeffs.
  2080.   coeff_cost=0;
  2081.   cr_cbp_tmp=0;
  2082.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  2083.   {
  2084.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  2085.     {
  2086.       pos_x=n1/BLOCK_SIZE + 2*uv;
  2087.       pos_y=n2/BLOCK_SIZE + BLOCK_SIZE;
  2088.       run=-1;
  2089.       scan_pos=0;
  2090.       for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)// start change rd_quant
  2091.       {
  2092.         i=SNGL_SCAN[coeff_ctr][0];
  2093.         j=SNGL_SCAN[coeff_ctr][1];
  2094.         ++run;
  2095.         ilev=0;
  2096.         c_err=img->m7[n1+i][n2+j]-alpha*sign((abs (predicted_chroma_block[n1+i][n2+j]) * JQ[quant_set1][0] +JQQ2) / JQQ1,predicted_chroma_block[n1+i][n2+j]);
  2097.         level= (abs(c_err)*JQ[quant_set][0]+qp_const)/JQQ1;
  2098.         if (level  != 0)
  2099.         {
  2100.           currMB->cbp_blk |=  1 << (16 + (uv << 2) + ((n2 >> 1) + (n1 >> 2))) ;
  2101.           if (level > 1)
  2102.             coeff_cost += MAX_VALUE;                // set high cost, shall not be discarded
  2103.           else
  2104.             coeff_cost += COEFF_COST[run];
  2105.           cr_cbp_tmp=2;
  2106.           img->cof[pos_x][pos_y][scan_pos][0][0]=sign(level,c_err);
  2107.           img->cof[pos_x][pos_y][scan_pos][1][0]=run;
  2108.           ++scan_pos;
  2109.           run=-1;
  2110.           ilev=level;
  2111.         }
  2112.         ilev=sign(ilev,c_err)*Fq1q2+predicted_chroma_block[n1+i][n2+j]*JQ[quant_set1][0];
  2113.         img->m7[n1+i][n2+j]=sign((abs(ilev)+JQQ2)/ JQQ1,ilev)*JQ[quant_set1][1];
  2114.       }
  2115.       img->cof[pos_x][pos_y][scan_pos][0][0]=0; // EOB
  2116.     }
  2117.   }
  2118.   // * reset chroma coeffs
  2119.   if(cr_cbp_tmp==2)
  2120.       cr_cbp=2;
  2121.   //     IDCT.
  2122.       //     Horizontal.
  2123.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  2124.   {
  2125.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  2126.     {
  2127.       for (j=0; j < BLOCK_SIZE; j++)
  2128.       {
  2129.         for (i=0; i < BLOCK_SIZE; i++)
  2130.         {
  2131.           m5[i]=img->m7[n1+i][n2+j];
  2132.         }
  2133.         m6[0]=(m5[0]+m5[2])*13;
  2134.         m6[1]=(m5[0]-m5[2])*13;
  2135.         m6[2]=m5[1]*7-m5[3]*17;
  2136.         m6[3]=m5[1]*17+m5[3]*7;
  2137.         for (i=0; i < 2; i++)
  2138.         {
  2139.           i1=3-i;
  2140.           img->m7[n1+i][n2+j]=m6[i]+m6[i1];
  2141.           img->m7[n1+i1][n2+j]=m6[i]-m6[i1];
  2142.         }
  2143.       }
  2144.       //     Vertical.
  2145.       for (i=0; i < BLOCK_SIZE; i++)
  2146.       {
  2147.         for (j=0; j < BLOCK_SIZE; j++)
  2148.         {
  2149.           m5[j]=img->m7[n1+i][n2+j];
  2150.         }
  2151.         m6[0]=(m5[0]+m5[2])*13;
  2152.         m6[1]=(m5[0]-m5[2])*13;
  2153.         m6[2]=m5[1]*7-m5[3]*17;
  2154.         m6[3]=m5[1]*17+m5[3]*7;
  2155.         for (j=0; j < 2; j++)
  2156.         {
  2157.           j2=3-j;
  2158.           img->m7[n1+i][n2+j]=min(255,max(0,(m6[j]+m6[j2]+JQQ2)/JQQ1));
  2159.           img->m7[n1+i][n2+j2]=min(255,max(0,(m6[j]-m6[j2]+JQQ2)/JQQ1));
  2160.         }
  2161.       }
  2162.     }
  2163.   }
  2164.   //  Decoded block moved to memory
  2165.   for (j=0; j < BLOCK_SIZE*2; j++)
  2166.     for (i=0; i < BLOCK_SIZE*2; i++)
  2167.     {
  2168.       imgUV[uv][img->pix_c_y+j][img->pix_c_x+i]= img->m7[i][j];
  2169.     }
  2170.   return cr_cbp;
  2171. }
  2172. #endif
  2173. /*!
  2174.  ************************************************************************
  2175.  * brief
  2176.  *    The routine performs transform,quantization,inverse transform, adds the diff.
  2177.  *    to the prediction and writes the result to the decoded luma frame. Includes the
  2178.  *    RD constrained quantization also.
  2179.  *
  2180.  * para Input:
  2181.  *    block_x,block_y: Block position inside a macro block (0,4,8,12).
  2182.  *
  2183.  * para Output:
  2184.  *    nonzero: 0 if no levels are nonzero.  1 if there are nonzero levels.            n
  2185.  *    coeff_cost: Counter for nonzero coefficients, used to discard expencive levels.
  2186.  ************************************************************************
  2187.  */
  2188. int copyblock_sp(int block_x,int block_y)
  2189. {
  2190.   int sign(int a,int b);
  2191.   int i,j,i1,j1,m5[4],m6[4],coeff_ctr;
  2192.   int predicted_block[BLOCK_SIZE][BLOCK_SIZE],quant_set1;
  2193.   //  Horizontal transform
  2194.   for (j=0; j< BLOCK_SIZE; j++)
  2195.     for (i=0; i< BLOCK_SIZE; i++)
  2196.     {
  2197.       predicted_block[i][j]=img->mpr[i+block_x][j+block_y];
  2198.     }
  2199.   for (j=0; j < BLOCK_SIZE; j++)
  2200.   {
  2201.     for (i=0; i < 2; i++)
  2202.     {
  2203.       i1=3-i;
  2204.       m5[i]=predicted_block[i][j]+predicted_block[i1][j];
  2205.       m5[i1]=predicted_block[i][j]-predicted_block[i1][j];
  2206.     }
  2207.     predicted_block[0][j]=(m5[0]+m5[1])*13;
  2208.     predicted_block[2][j]=(m5[0]-m5[1])*13;
  2209.     predicted_block[1][j]=m5[3]*17+m5[2]*7;
  2210.     predicted_block[3][j]=m5[3]*7-m5[2]*17;
  2211.   }
  2212.   //  Vertival transform
  2213.   for (i=0; i < BLOCK_SIZE; i++)
  2214.   {
  2215.     for (j=0; j < 2; j++)
  2216.     {
  2217.       j1=3-j;
  2218.       m5[j]=predicted_block[i][j]+predicted_block[i][j1];
  2219.       m5[j1]=predicted_block[i][j]-predicted_block[i][j1];
  2220.     }
  2221.     predicted_block[i][0]=(m5[0]+m5[1])*13;
  2222.     predicted_block[i][2]=(m5[0]-m5[1])*13;
  2223.     predicted_block[i][1]=m5[3]*17+m5[2]*7;
  2224.     predicted_block[i][3]=m5[3]*7-m5[2]*17;
  2225.   }
  2226.   // Quant
  2227.   quant_set1=img->qpsp;
  2228.     for (coeff_ctr=0;coeff_ctr < 16;coeff_ctr++)     // 8 times if double scan, 16 normal scan
  2229.     {
  2230.         i=SNGL_SCAN[coeff_ctr][0];
  2231.         j=SNGL_SCAN[coeff_ctr][1];
  2232.         img->m7[i][j]=sign((abs(predicted_block[i][j])*JQ[quant_set1][0]+JQQ2)/ JQQ1,predicted_block[i][j])*JQ[quant_set1][1];
  2233.     }
  2234.   //     IDCT.
  2235.   //     horizontal
  2236.   for (j=0; j < BLOCK_SIZE; j++)
  2237.   {
  2238.     for (i=0; i < BLOCK_SIZE; i++)
  2239.     {
  2240.       m5[i]=img->m7[i][j];
  2241.     }
  2242.     m6[0]=(m5[0]+m5[2])*13;
  2243.     m6[1]=(m5[0]-m5[2])*13;
  2244.     m6[2]=m5[1]*7-m5[3]*17;
  2245.     m6[3]=m5[1]*17+m5[3]*7;
  2246.     for (i=0; i < 2; i++)
  2247.     {
  2248.       i1=3-i;
  2249.       img->m7[i][j]=m6[i]+m6[i1];
  2250.       img->m7[i1][j]=m6[i]-m6[i1];
  2251.     }
  2252.   }
  2253.   //  vertical
  2254.   for (i=0; i < BLOCK_SIZE; i++)
  2255.   {
  2256.     for (j=0; j < BLOCK_SIZE; j++)
  2257.     {
  2258.       m5[j]=img->m7[i][j];
  2259.     }
  2260.     m6[0]=(m5[0]+m5[2])*13;
  2261.     m6[1]=(m5[0]-m5[2])*13;
  2262.     m6[2]=m5[1]*7-m5[3]*17;
  2263.     m6[3]=m5[1]*17+m5[3]*7;
  2264.     for (j=0; j < 2; j++)
  2265.     {
  2266.       j1=3-j;
  2267.       img->m7[i][j] =min(255,max(0,(m6[j]+m6[j1]+JQQ2)/JQQ1));
  2268.       img->m7[i][j1]=min(255,max(0,(m6[j]-m6[j1]+JQQ2)/JQQ1));
  2269.     }
  2270.   }
  2271.   //  Decoded block moved to frame memory
  2272.   for (j=0; j < BLOCK_SIZE; j++)
  2273.     for (i=0; i < BLOCK_SIZE; i++)
  2274.       imgY[img->pix_y+block_y+j][img->pix_x+block_x+i]=img->m7[i][j];
  2275.   return 1;
  2276. }