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

流媒体/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 macroblock.c
  35.  *
  36.  * brief
  37.  *    Process one macroblock
  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.  *    - Jani Lainema                    <jani.lainema@nokia.com>
  44.  *    - Sebastian Purreiter             <sebastian.purreiter@mch.siemens.de>
  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 "elements.h"
  54. #include "macroblock.h"
  55. #include "refbuf.h"
  56. /*!
  57.  ************************************************************************
  58.  * brief
  59.  *    updates the coordinates and statistics parameter for the
  60.  *    next macroblock
  61.  ************************************************************************
  62.  */
  63. void proceed2nextMacroblock()
  64. {
  65. #if TRACE
  66.   int use_bitstream_backing = (input->slice_mode == FIXED_RATE || input->slice_mode == CALLBACK);
  67. #endif
  68.   const int number_mb_per_row = img->width / MB_BLOCK_SIZE ;
  69.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  70. #if TRACE
  71.   int i;
  72.   if (p_trace)
  73.   {
  74.     if(use_bitstream_backing)
  75.       fprintf(p_trace, "n*********** Pic: %i (I/P) MB: %i Slice: %i **********nn", frame_no, img->current_mb_nr, img->current_slice_nr);
  76.    // Write out the tracestring for each symbol
  77.      for (i=0; i<currMB->currSEnr; i++)
  78.        trace2out(&(img->MB_SyntaxElements[i]));
  79.   }
  80. #endif
  81.   // Update the statistics
  82.   stat->bit_use_mb_type[img->type]      += currMB->bitcounter[BITS_MB_MODE];
  83.   stat->bit_use_coeffY[img->type]       += currMB->bitcounter[BITS_COEFF_Y_MB] ;
  84.   stat->bit_use_mode_inter[img->mb_mode]+= currMB->bitcounter[BITS_INTER_MB];
  85.   stat->tmp_bit_use_cbp[img->type]      += currMB->bitcounter[BITS_CBP_MB];
  86.   stat->bit_use_coeffC[img->type]       += currMB->bitcounter[BITS_COEFF_UV_MB];
  87.   stat->bit_use_delta_quant[img->type]  += currMB->bitcounter[BITS_DELTA_QUANT_MB];
  88. /*  if (input->symbol_mode == UVLC)
  89.     stat->bit_ctr += currMB->bitcounter[BITS_TOTAL_MB]; */
  90.   if (img->type==INTRA_IMG)
  91.     ++stat->mode_use_intra[img->mb_mode];
  92.   else
  93.     if (img->type != B_IMG)
  94.       ++stat->mode_use_inter[img->mb_mode];
  95.     else
  96.       ++stat->mode_use_Bframe[img->mb_mode];
  97.   // Update coordinates of macroblock
  98.   img->mb_x++;
  99.   if (img->mb_x == number_mb_per_row) // next row of MBs
  100.   {
  101.     img->mb_x = 0; // start processing of next row
  102.     img->mb_y++;
  103.   }
  104.   img->current_mb_nr++;
  105.   // Define vertical positions
  106.   img->block_y = img->mb_y * BLOCK_SIZE;      // vertical luma block position
  107.   img->pix_y   = img->mb_y * MB_BLOCK_SIZE;   // vertical luma macroblock position
  108.   img->pix_c_y = img->mb_y * MB_BLOCK_SIZE/2; // vertical chroma macroblock position
  109.   if (img->type != B_IMG)
  110.   {
  111.     if (input->intra_upd > 0 && img->mb_y <= img->mb_y_intra)
  112.       img->height_err=(img->mb_y_intra*16)+15;     // for extra intra MB
  113.     else
  114.       img->height_err=img->height-1;
  115.   }
  116.   // Define horizontal positions
  117.   img->block_x = img->mb_x * BLOCK_SIZE;        // luma block
  118.   img->pix_x   = img->mb_x * MB_BLOCK_SIZE;     // luma pixel
  119.   img->block_c_x = img->mb_x * BLOCK_SIZE/2;    // chroma block
  120.   img->pix_c_x   = img->mb_x * MB_BLOCK_SIZE/2; // chroma pixel
  121.   // Statistics
  122.   if ((img->type == INTER_IMG)||(img->types==SP_IMG) )
  123.   {
  124.     ++stat->quant0;
  125.     stat->quant1 += img->qp;      // to find average quant for inter frames
  126.   }
  127. }
  128. /*!
  129.  ************************************************************************
  130.  * brief
  131.  *    initializes the current macroblock
  132.  ************************************************************************
  133.  */
  134. void start_macroblock()
  135. {
  136.   int i,j,k,l;
  137.   int x=0, y=0 ;
  138.   int use_bitstream_backing = (input->slice_mode == FIXED_RATE || input->slice_mode == CALLBACK);
  139.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  140.   Slice *curr_slice = img->currentSlice;
  141.   DataPartition *dataPart;
  142.   Bitstream *currStream;
  143.   EncodingEnvironmentPtr eep;
  144.   if(use_bitstream_backing)
  145.   {
  146.      // Save image to allow recoding if necessary
  147.      for(y=0; y<img->height; y++)
  148.        for(x=0; x<img->width; x++)
  149.          imgY_tmp[y][x] = imgY[y][x];
  150.      for(i=0; i<2; i++)
  151.        for(y=0; y<img->height_cr; y++)
  152.          for(x=0; x<img->width_cr; x++)
  153.            imgUV_tmp[i][y][x] = imgUV[i][y][x];
  154.     // Keep the current state of the bitstreams
  155.     if(!img->cod_counter)
  156.       for (i=0; i<curr_slice->max_part_nr; i++)
  157.       {
  158.         dataPart = &(curr_slice->partArr[i]);
  159.         currStream = dataPart->bitstream;
  160.         currStream->stored_bits_to_go   = currStream->bits_to_go;
  161.         currStream->stored_byte_pos   = currStream->byte_pos;
  162.         currStream->stored_byte_buf   = currStream->byte_buf;
  163.         if (input->symbol_mode ==CABAC)
  164.         {
  165.           eep = &(dataPart->ee_cabac);
  166.           eep->ElowS            = eep->Elow;
  167.           eep->EhighS           = eep->Ehigh;
  168.           eep->EbufferS         = eep->Ebuffer;
  169.           eep->Ebits_to_goS     = eep->Ebits_to_go;
  170.           eep->Ebits_to_followS = eep->Ebits_to_follow;
  171.           eep->EcodestrmS       = eep->Ecodestrm;
  172.           eep->Ecodestrm_lenS   = eep->Ecodestrm_len;
  173.         }
  174.       }
  175.   }
  176.   // Save the slice number of this macroblock. When the macroblock below
  177.   // is coded it will use this to decide if prediction for above is possible
  178.   img->slice_numbers[img->current_mb_nr] = img->current_slice_nr;
  179.   // Save the slice and macroblock number of the current MB
  180.   currMB->slice_nr = img->current_slice_nr;
  181.     // Initialize delta qp change from last macroblock. Feature may be used for future rate control
  182.   currMB->delta_qp=0;
  183.   // Initialize counter for MB symbols
  184.   currMB->currSEnr=0;
  185.   // If MB is next to a slice boundary, mark neighboring blocks unavailable for prediction
  186.   CheckAvailabilityOfNeighbors(img);
  187.   // Reset vectors before doing motion search in motion_search().
  188.   if (img->type != B_IMG)
  189.   {
  190.     for (k=0; k < 2; k++)
  191.     {
  192.       for (j=0; j < BLOCK_MULTIPLE; j++)
  193.         for (i=0; i < BLOCK_MULTIPLE; i++)
  194.           tmp_mv[k][img->block_y+j][img->block_x+i+4]=0;
  195.     }
  196.   }
  197.   // Reset syntax element entries in MB struct
  198.   currMB->ref_frame = 0;
  199.   currMB->mb_type   = 0;
  200.   currMB->cbp_blk   = 0;
  201.   currMB->cbp       = 0;
  202.   for (l=0; l < 2; l++)
  203.     for (j=0; j < BLOCK_MULTIPLE; j++)
  204.       for (i=0; i < BLOCK_MULTIPLE; i++)
  205.         for (k=0; k < 2; k++)
  206.           currMB->mvd[l][j][i][k] = 0;
  207.   for (i=0; i < (BLOCK_MULTIPLE*BLOCK_MULTIPLE); i++)
  208.     currMB->intra_pred_modes[i] = 0;
  209.   // Initialize bitcounters for this macroblock
  210.   if(img->current_mb_nr == 0) // No slice header to account for
  211.   {
  212.     currMB->bitcounter[BITS_HEADER] = 0;
  213.   }
  214.   else if (img->slice_numbers[img->current_mb_nr] == img->slice_numbers[img->current_mb_nr-1]) // current MB belongs to the
  215.   // same slice as the last MB
  216.   {
  217.     currMB->bitcounter[BITS_HEADER] = 0;
  218.   }
  219.   currMB->bitcounter[BITS_MB_MODE] = 0;
  220.   currMB->bitcounter[BITS_COEFF_Y_MB] = 0;
  221.   currMB->bitcounter[BITS_INTER_MB] = 0;
  222.   currMB->bitcounter[BITS_CBP_MB] = 0;
  223.   currMB->bitcounter[BITS_DELTA_QUANT_MB] = 0;
  224.   currMB->bitcounter[BITS_COEFF_UV_MB] = 0;
  225. #ifdef _FAST_FULL_ME_
  226.   ResetFastFullIntegerSearch ();
  227. #endif
  228. }
  229. /*!
  230.  ************************************************************************
  231.  * brief
  232.  *    terminates processing of the current macroblock depending
  233.  *    on the chosen slice mode
  234.  ************************************************************************
  235.  */
  236. void terminate_macroblock(Boolean *end_of_slice, Boolean *recode_macroblock)
  237. {
  238.   int i,x=0, y=0 ;
  239.   Slice *currSlice = img->currentSlice;
  240.   Macroblock    *currMB    = &img->mb_data[img->current_mb_nr];
  241.   SyntaxElement *currSE    = &img->MB_SyntaxElements[currMB->currSEnr];
  242.   int *partMap = assignSE2partition[input->partition_mode];
  243.   DataPartition *dataPart;
  244.   Bitstream *currStream;
  245.   int rlc_bits=0;
  246.   EncodingEnvironmentPtr eep;
  247.   int use_bitstream_backing = (input->slice_mode == FIXED_RATE || input->slice_mode == CALLBACK);
  248.   int new_slice = ( (img->current_mb_nr == 0) || img->mb_data[img->current_mb_nr-1].slice_nr != img->current_slice_nr);
  249.   static int skip = FALSE;
  250.   switch(input->slice_mode)
  251.   {
  252.   case NO_SLICES:
  253.     *recode_macroblock = FALSE;
  254.     if ((img->current_mb_nr+1) == img->total_number_mb) // maximum number of MBs
  255.       *end_of_slice = TRUE;
  256.     break;
  257.   case FIXED_MB:
  258.     // For slice mode one, check if a new slice boundary follows
  259.     *recode_macroblock = FALSE;
  260.     if ( ((img->current_mb_nr+1) % input->slice_argument == 0) || ((img->current_mb_nr+1) == img->total_number_mb) )
  261.     {
  262.       *end_of_slice = TRUE;
  263.     }
  264.     break;
  265.     // For slice modes two and three, check if coding of this macroblock
  266.     // resulted in too many bits for this slice. If so, indicate slice
  267.     // boundary before this macroblock and code the macroblock again
  268.   case FIXED_RATE:
  269.      // in case of skip MBs check if there is a slice boundary
  270.      // only for UVLC (img->cod_counter is always 0 in case of CABAC)
  271.      if(img->cod_counter)
  272.      {
  273.        // write out the skip MBs to know how many bits we need for the RLC
  274.        dataPart = &(currSlice->partArr[partMap[SE_MBTYPE]]);
  275.        currSE->value1 = img->cod_counter;
  276.        currSE->mapping = n_linfo2;
  277.        currSE->type = SE_MBTYPE;
  278.        dataPart->writeSyntaxElement(  currSE, dataPart);
  279.        rlc_bits=currSE->len;
  280.        currStream = dataPart->bitstream;
  281.        // save the bitstream as it would be if we write the skip MBs
  282.        currStream->bits_to_go_skip  = currStream->bits_to_go;
  283.        currStream->byte_pos_skip    = currStream->byte_pos;
  284.        currStream->byte_buf_skip    = currStream->byte_buf;
  285.        // restore the bitstream
  286.        currStream->bits_to_go = currStream->stored_bits_to_go;
  287.        currStream->byte_pos = currStream->stored_byte_pos;
  288.        currStream->byte_buf = currStream->stored_byte_buf;
  289.        skip = TRUE;
  290.      }
  291.      //! Check if the last coded macroblock fits into the size of the slice
  292.      //! But only if this is not the first macroblock of this slice
  293.      if (!new_slice)
  294.      {
  295.        if(slice_too_big(rlc_bits))
  296.        {
  297.          *recode_macroblock = TRUE;
  298.          *end_of_slice = TRUE;
  299.        }
  300.        else if(!img->cod_counter)
  301.          skip = FALSE;
  302.      }
  303.      // maximum number of MBs
  304.      if ((*recode_macroblock == FALSE) && ((img->current_mb_nr+1) == img->total_number_mb)) 
  305.      {
  306.        *end_of_slice = TRUE;
  307.        if(!img->cod_counter)
  308.          skip = FALSE;
  309.      }
  310.    
  311.      //! (first MB OR first MB in a slice) AND bigger that maximum size of slice
  312.      if (new_slice && slice_too_big(rlc_bits))
  313.      {
  314.        *end_of_slice = TRUE;
  315.        if(!img->cod_counter)
  316.          skip = FALSE;
  317.      }
  318.      break;
  319.   case  CALLBACK:
  320.     if (img->current_mb_nr > 0 && !new_slice)
  321.     {
  322.       if (currSlice->slice_too_big(rlc_bits))
  323.       {
  324.         *recode_macroblock = TRUE;
  325.         *end_of_slice = TRUE;
  326.       }
  327.     }
  328.     if ( (*recode_macroblock == FALSE) && ((img->current_mb_nr+1) == img->total_number_mb) ) // maximum number of MBs
  329.       *end_of_slice = TRUE;
  330.     break;
  331.   default:
  332.     snprintf(errortext, ET_SIZE, "Slice Mode %d not supported", input->slice_mode);
  333.     error(errortext, 600);
  334.   }
  335.   if(*recode_macroblock == TRUE)
  336.   {
  337.     // Restore everything
  338.     for (i=0; i<currSlice->max_part_nr; i++)
  339.     {
  340.       dataPart = &(currSlice->partArr[i]);
  341.       currStream = dataPart->bitstream;
  342.       currStream->bits_to_go = currStream->stored_bits_to_go;
  343.       currStream->byte_pos  = currStream->stored_byte_pos;
  344.       currStream->byte_buf  = currStream->stored_byte_buf;
  345.       if (input->symbol_mode == CABAC)
  346.       {
  347.         eep = &(dataPart->ee_cabac);
  348.         eep->Elow            = eep->ElowS;
  349.         eep->Ehigh           = eep->EhighS;
  350.         eep->Ebuffer         = eep->EbufferS;
  351.         eep->Ebits_to_go     = eep->Ebits_to_goS;
  352.         eep->Ebits_to_follow = eep->Ebits_to_followS;
  353.         eep->Ecodestrm       = eep->EcodestrmS;
  354.         eep->Ecodestrm_len   = eep->Ecodestrm_lenS;
  355.       }
  356.     }
  357.     // Restore image to avoid DeblockMB to operate twice
  358.     // Note that this can be simplified! The copy range!
  359.     for(y=0; y<img->height; y++)
  360.       for(x=0; x<img->width; x++)
  361.         imgY[y][x] = imgY_tmp[y][x];
  362.     for(i=0; i<2; i++)
  363.       for(y=0; y<img->height_cr; y++)
  364.         for(x=0; x<img->width_cr; x++)
  365.           imgUV[i][y][x] = imgUV_tmp[i][y][x];
  366.   }
  367.   if(*end_of_slice == TRUE  && skip == TRUE) //! TO 4.11.2001 Skip MBs at the end of this slice
  368.   { 
  369.     //! only for Slice Mode 2 or 3
  370.     // If we still have to write the skip, let's do it!
  371.     if(img->cod_counter && *recode_macroblock == TRUE) //! MB that did not fit in this slice
  372.     { 
  373.       // If recoding is true and we have had skip, 
  374.       // we have to reduce the counter in case of recoding
  375.       img->cod_counter--;
  376.       if(img->cod_counter)
  377.       {
  378.         dataPart = &(currSlice->partArr[partMap[SE_MBTYPE]]);
  379.         currSE->value1 = img->cod_counter;
  380.         currSE->mapping = n_linfo2;
  381.         currSE->type = SE_MBTYPE;
  382.         dataPart->writeSyntaxElement(  currSE, dataPart);
  383.         rlc_bits=currSE->len;
  384.         currMB->bitcounter[BITS_MB_MODE]+=rlc_bits;
  385.         img->cod_counter = 0;
  386.       }
  387.     }
  388.     else //! MB that did not fit in this slice anymore is not a Skip MB
  389.     {
  390.       for (i=0; i<currSlice->max_part_nr; i++)
  391.       {
  392.         dataPart = &(currSlice->partArr[i]);
  393.         currStream = dataPart->bitstream;
  394.         // update the bitstream
  395.         currStream->bits_to_go = currStream->bits_to_go_skip;
  396.         currStream->byte_pos  = currStream->byte_pos_skip;
  397.         currStream->byte_buf  = currStream->byte_buf_skip;
  398.       }
  399.       // update the statistics
  400.       img->cod_counter = 0;
  401.       skip = FALSE;
  402.     }
  403.   }
  404.   
  405.   //! TO 4.11.2001 Skip MBs at the end of this slice for Slice Mode 0 or 1
  406.   if(*end_of_slice == TRUE && img->cod_counter && !use_bitstream_backing)
  407.   {
  408.     dataPart = &(currSlice->partArr[partMap[SE_MBTYPE]]);
  409.     currSE->value1 = img->cod_counter;
  410.     currSE->mapping = n_linfo2;
  411.     currSE->type = SE_MBTYPE;
  412.     dataPart->writeSyntaxElement(  currSE, dataPart);
  413.     rlc_bits=currSE->len;
  414.     currMB->bitcounter[BITS_MB_MODE]+=rlc_bits;
  415.     img->cod_counter = 0;
  416.   }
  417. }
  418. /*!
  419.  *****************************************************************************
  420.  *
  421.  * brief 
  422.  *    For Slice Mode 2: Checks if one partition of one slice exceeds the 
  423.  *    allowed size
  424.  * 
  425.  * return
  426.  *    FALSE if all Partitions of this slice are smaller than the allowed size
  427.  *    TRUE is at least one Partition exceeds the limit
  428.  *
  429.  * para Parameters
  430.  *    
  431.  *    
  432.  *
  433.  * para Side effects
  434.  *    none
  435.  *
  436.  * para Other Notes
  437.  *    
  438.  *    
  439.  *
  440.  * date
  441.  *    4 November 2001
  442.  *
  443.  * author
  444.  *    Tobias Oelbaum      drehvial@gmx.net
  445.  *****************************************************************************/
  446.  
  447.  int slice_too_big(int rlc_bits)
  448.  {
  449.    Slice *currSlice = img->currentSlice;
  450.    DataPartition *dataPart;
  451.    Bitstream *currStream;
  452.    EncodingEnvironmentPtr eep;
  453.    int i;
  454.    int size_in_bytes;
  455.    
  456.    //! UVLC
  457.    if (input->symbol_mode == UVLC)
  458.    {
  459.      for (i=0; i<currSlice->max_part_nr; i++)
  460.      {
  461.        dataPart = &(currSlice->partArr[i]);
  462.        currStream = dataPart->bitstream;
  463.        size_in_bytes = currStream->byte_pos;
  464.        if (currStream->bits_to_go < 8)
  465.          size_in_bytes++;
  466.        if (currStream->bits_to_go < rlc_bits)
  467.          size_in_bytes++;
  468.        if(size_in_bytes > input->slice_argument)
  469.          return TRUE;
  470.      }
  471.    }
  472.     
  473.    //! CABAC
  474.    if (input->symbol_mode ==CABAC)
  475.    {
  476.      for (i=0; i<currSlice->max_part_nr; i++)
  477.      {
  478.         dataPart= &(currSlice->partArr[i]);
  479.         eep = &(dataPart->ee_cabac);
  480.         if(arienco_bits_written(eep) > (input->slice_argument*8))
  481.           return TRUE;
  482.      }
  483.    }
  484.    return FALSE;
  485.  }
  486. /*!
  487.  ************************************************************************
  488.  * brief
  489.  *    Checks the availability of neighboring macroblocks of
  490.  *    the current macroblock for prediction and context determination;
  491.  *    marks the unavailable MBs for intra prediction in the
  492.  *    ipredmode-array by -1. Only neighboring MBs in the causal
  493.  *    past of the current MB are checked.
  494.  ************************************************************************
  495.  */
  496. void CheckAvailabilityOfNeighbors()
  497. {
  498.   int i,j;
  499.   const int mb_width = img->width/MB_BLOCK_SIZE;
  500.   const int mb_nr = img->current_mb_nr;
  501.   Macroblock *currMB = &img->mb_data[mb_nr];
  502.   // mark all neighbors as unavailable
  503.   for (i=0; i<3; i++)
  504.     for (j=0; j<3; j++)
  505.       img->mb_data[mb_nr].mb_available[i][j]=NULL;
  506.   img->mb_data[mb_nr].mb_available[1][1]=currMB; // current MB
  507.   // Check MB to the left
  508.   if(img->pix_x >= MB_BLOCK_SIZE)
  509.   {
  510.     int remove_prediction = currMB->slice_nr != img->mb_data[mb_nr-1].slice_nr;
  511.     if(input->UseConstrainedIntraPred)
  512.       remove_prediction = (remove_prediction || img->intra_mb[mb_nr-1] ==0);
  513.     if(remove_prediction)
  514.     {
  515.       img->ipredmode[img->block_x][img->block_y+1] = -1;
  516.       img->ipredmode[img->block_x][img->block_y+2] = -1;
  517.       img->ipredmode[img->block_x][img->block_y+3] = -1;
  518.       img->ipredmode[img->block_x][img->block_y+4] = -1;
  519.     } else
  520.       currMB->mb_available[1][0]=&(img->mb_data[mb_nr-1]);
  521.   }
  522.   // Check MB above
  523.   if(img->pix_y >= MB_BLOCK_SIZE)
  524.   {
  525.     int remove_prediction = currMB->slice_nr != img->mb_data[mb_nr-mb_width].slice_nr;
  526.     if(input->UseConstrainedIntraPred)
  527.       remove_prediction = (remove_prediction || img->intra_mb[mb_nr-mb_width] ==0);
  528.     if(remove_prediction)
  529.     {
  530.       img->ipredmode[img->block_x+1][img->block_y] = -1;
  531.       img->ipredmode[img->block_x+2][img->block_y] = -1;
  532.       img->ipredmode[img->block_x+3][img->block_y] = -1;
  533.       img->ipredmode[img->block_x+4][img->block_y] = -1;
  534.     } else
  535.       currMB->mb_available[0][1]=&(img->mb_data[mb_nr-mb_width]);
  536.   }
  537.   // Check MB left above
  538.   if(img->pix_x >= MB_BLOCK_SIZE && img->pix_y  >= MB_BLOCK_SIZE )
  539.   {
  540.     if(currMB->slice_nr == img->mb_data[mb_nr-mb_width-1].slice_nr)
  541.       img->mb_data[mb_nr].mb_available[0][0]=&(img->mb_data[mb_nr-mb_width-1]);
  542.   }
  543.   // Check MB right above
  544.   if(img->pix_y >= MB_BLOCK_SIZE && img->pix_x < (img->width-MB_BLOCK_SIZE ))
  545.   {
  546.     if(currMB->slice_nr == img->mb_data[mb_nr-mb_width+1].slice_nr)
  547.       // currMB->mb_available[0][1]=&(img->mb_data[mb_nr-mb_width+1]);
  548.       currMB->mb_available[0][2]=&(img->mb_data[mb_nr-mb_width+1]);
  549.   }
  550. }
  551. /*!
  552.  ************************************************************************
  553.  * brief
  554.  *    Performs 4x4 and 16x16 intra prediction and transform coding
  555.  *    of the prediction residue. The routine returns the best cost;
  556.  *    current cbp (for LUMA only) and intra pred modes are affected
  557.  ************************************************************************
  558.  */
  559. int MakeIntraPrediction(int *intra_pred_mode_2)
  560. {
  561.   int i,j;
  562.   int block_x, block_y;
  563.   int best_ipmode=0;
  564.   int tot_intra_sad, tot_intra_sad2, best_intra_sad, current_intra_sad;
  565.   int coeff_cost; // not used
  566.   int pic_pix_y,pic_pix_x,pic_block_y,pic_block_x;
  567.   int last_ipred=0;                       // keeps last chosen intra prediction mode for 4x4 intra pred
  568.   int ipmode;                           // intra pred mode
  569.   int cbp_mask;
  570.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  571.   // start making 4x4 intra prediction
  572.   currMB->cbp     = 0;
  573.   currMB->intraOrInter = INTRA_MB_4x4;
  574.   tot_intra_sad=QP2QUANT[img->qp]*24;// sum of intra sad values, start with a 'handicap'
  575.   for(block_y = 0 ; block_y < MB_BLOCK_SIZE ; block_y += BLOCK_MULTIPLE)
  576.   {
  577.     pic_pix_y=img->pix_y+block_y;
  578.     pic_block_y=pic_pix_y/BLOCK_SIZE;
  579.     for(block_x = 0 ; block_x < MB_BLOCK_SIZE  ; block_x += BLOCK_MULTIPLE)
  580.     {
  581.       cbp_mask=(1<<(2*(block_y/8)+block_x/8));
  582.       pic_pix_x=img->pix_x+block_x;
  583.       pic_block_x=pic_pix_x/BLOCK_SIZE;
  584.       /*
  585.       intrapred_luma() makes and returns 4x4 blocks with all 5 intra prediction modes.
  586.       Notice that some modes are not possible at frame edges.
  587.       */
  588.       intrapred_luma(pic_pix_x,pic_pix_y);
  589.       best_intra_sad=MAX_VALUE; // initial value, will be modified below
  590.       img->imod = INTRA_MB_OLD;  // for now mode set to intra, may be changed in motion_search()
  591.       // DM: has to be removed
  592.       for (ipmode=0; ipmode < NO_INTRA_PMODE; ipmode++)   // all intra prediction modes
  593.       {
  594.         // Horizontal pred from Y neighbour pix , vertical use X pix, diagonal needs both
  595.         if (ipmode==DC_PRED||ipmode==HOR_PRED||img->ipredmode[pic_block_x+1][pic_block_y] >= 0)// DC or vert pred or hor edge
  596.         {
  597.           if (ipmode==DC_PRED||ipmode==VERT_PRED||img->ipredmode[pic_block_x][pic_block_y+1] >= 0)// DC or hor pred or vert edge
  598.           {
  599.             for (j=0; j < BLOCK_SIZE; j++)
  600.             {
  601.               for (i=0; i < BLOCK_SIZE; i++)
  602.                 img->m7[i][j]=imgY_org[pic_pix_y+j][pic_pix_x+i]-img->mprr[ipmode][j][i]; // find diff
  603.             }
  604.             current_intra_sad=QP2QUANT[img->qp]*PRED_IPRED[img->ipredmode[pic_block_x+1][pic_block_y]+1][img->ipredmode[pic_block_x][pic_block_y+1]+1][ipmode]*2;
  605.             current_intra_sad += find_sad(input->hadamard, img->m7); // add the start 'handicap' and the computed SAD
  606.             if (current_intra_sad < best_intra_sad)
  607.             {
  608.               best_intra_sad=current_intra_sad;
  609.               best_ipmode=ipmode;
  610.               for (j=0; j < BLOCK_SIZE; j++)
  611.                 for (i=0; i < BLOCK_SIZE; i++)
  612.                   img->mpr[i+block_x][j+block_y]=img->mprr[ipmode][j][i];       // store the currently best intra prediction block
  613.             }
  614.           }
  615.         }
  616.       }
  617.       tot_intra_sad += best_intra_sad;
  618.       img->ipredmode[pic_block_x+1][pic_block_y+1]=best_ipmode;
  619.       if ((pic_block_x & 1) == 1) // just even blocks, two and two predmodes are sent together
  620.       {
  621.         currMB->intra_pred_modes[block_x/4+block_y]=PRED_IPRED[img->ipredmode[pic_block_x+1][pic_block_y]+1][img->ipredmode[pic_block_x][pic_block_y+1]+1][best_ipmode];
  622.         currMB->intra_pred_modes[block_x/4-1+block_y]=last_ipred;
  623.       }
  624.       last_ipred=PRED_IPRED[img->ipredmode[pic_block_x+1][pic_block_y]+1][img->ipredmode[pic_block_x][pic_block_y+1]+1][best_ipmode];
  625.       //  Make difference from prediction to be transformed
  626.       for (j=0; j < BLOCK_SIZE; j++)
  627.         for (i=0; i < BLOCK_SIZE; i++)
  628.           img->m7[i][j] =imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i] - img->mpr[i+block_x][j+block_y];
  629.         if( dct_luma(block_x,block_y,&coeff_cost) )          // if non zero coefficients
  630.           currMB->cbp     |= cbp_mask;      // set coded block pattern if nonzero coeffs
  631.     }
  632.   }
  633.   // 16x16 intra prediction
  634.   intrapred_luma_2(img);                        // make intra pred for the new 4 modes
  635.   tot_intra_sad2 = find_sad2(intra_pred_mode_2);        // find best SAD for new modes
  636.   if (tot_intra_sad2<tot_intra_sad)
  637.   {
  638.     currMB->cbp     = 0;              // cbp for 16x16 LUMA is signaled by the MB-mode
  639.     tot_intra_sad   = tot_intra_sad2;            // update best intra sad if necessary
  640.     img->imod = INTRA_MB_NEW;                          // one of the new modes is used
  641.     currMB->intraOrInter = INTRA_MB_16x16;
  642.     dct_luma2(*intra_pred_mode_2);
  643.     for (i=0;i<4;i++)
  644.       for (j=0;j<4;j++)
  645.         img->ipredmode[img->block_x+i+1][img->block_y+j+1]=0;
  646.   }
  647.   return tot_intra_sad;
  648. }
  649. /*!
  650.  ************************************************************************
  651.  * brief
  652.  *    Performs DCT, R-D constrained quantization, run/level
  653.  *    pre-coding and IDCT for the MC-compensated MB residue
  654.  *    of P-frame; current cbp (for LUMA only) is affected
  655.  ************************************************************************
  656.  */
  657. void LumaResidualCoding_P()
  658. {
  659.   int i,j;
  660.   int block_x, block_y;
  661.   int pic_pix_y,pic_pix_x,pic_block_y,pic_block_x;
  662.   int ii4,i2,jj4,j2;
  663.   int sum_cnt_nonz;
  664.   int mb_x, mb_y;
  665.   int cbp_mask, cbp_blk_mask ;
  666.   int coeff_cost;
  667.   int nonzero;
  668.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  669.   currMB->cbp     = 0 ;
  670.   currMB->cbp_blk = 0 ;
  671.   sum_cnt_nonz    = 0 ;
  672.   for (mb_y=0; mb_y < MB_BLOCK_SIZE; mb_y += BLOCK_SIZE*2)
  673.   {
  674.     for (mb_x=0; mb_x < MB_BLOCK_SIZE; mb_x += BLOCK_SIZE*2)
  675.     {
  676.       cbp_mask   = (1<<(mb_x/8+mb_y/4));
  677.       coeff_cost = 0;
  678.       for (block_y=mb_y; block_y < mb_y+BLOCK_SIZE*2; block_y += BLOCK_SIZE)
  679.       {
  680.         pic_pix_y=img->pix_y+block_y;
  681.         pic_block_y=pic_pix_y/BLOCK_SIZE;
  682.         for (block_x=mb_x; block_x < mb_x+BLOCK_SIZE*2; block_x += BLOCK_SIZE)
  683.         {
  684.           pic_pix_x    = img->pix_x+block_x;
  685.           pic_block_x  = pic_pix_x/BLOCK_SIZE;
  686.           cbp_blk_mask = (block_x>>2)+ block_y ;
  687.           img->ipredmode[pic_block_x+1][pic_block_y+1]=0;
  688.           if(input->mv_res)
  689.           {
  690.             ii4=(img->pix_x+block_x)*8+tmp_mv[0][pic_block_y][pic_block_x+4];
  691.             jj4=(img->pix_y+block_y)*8+tmp_mv[1][pic_block_y][pic_block_x+4];
  692.             for (j=0;j<4;j++)
  693.             {
  694.               j2=j*8;
  695.               for (i=0;i<4;i++)
  696.               {
  697.                 i2=i*8;
  698.                 img->mpr[i+block_x][j+block_y]=UMVPelY_18 (mref[img->multframe_no], jj4+j2, ii4+i2);
  699.               }
  700.             }
  701.           }
  702.           else
  703.           {
  704.             ii4=(img->pix_x+block_x)*4+tmp_mv[0][pic_block_y][pic_block_x+4];
  705.             jj4=(img->pix_y+block_y)*4+tmp_mv[1][pic_block_y][pic_block_x+4];
  706.             for (j=0;j<4;j++)
  707.             {
  708.               j2 = jj4+j*4;
  709.               for (i=0;i<4;i++)
  710.               {
  711.                 i2 = ii4+i*4;
  712.                 img->mpr[i+block_x][j+block_y]=UMVPelY_14 (mref[img->multframe_no], j2, i2);
  713.               }
  714.             }
  715.           }
  716.           for (j=0; j < BLOCK_SIZE; j++)
  717.           {
  718.             for (i=0; i < BLOCK_SIZE; i++)
  719.             {
  720.               img->m7[i][j] =imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i] - img->mpr[i+block_x][j+block_y];
  721.             }
  722.           }
  723.           if (img->types!=SP_IMG)
  724.             nonzero=dct_luma(block_x,block_y,&coeff_cost);
  725.           else nonzero=dct_luma_sp(block_x,block_y,&coeff_cost);
  726.           if (nonzero)
  727.           {
  728.             currMB->cbp_blk |= 1 << cbp_blk_mask ;            // one bit for every 4x4 block
  729.             currMB->cbp     |= cbp_mask;       // one bit for the 4x4 blocks of an 8x8 block
  730.           }
  731.         }
  732.       }
  733.       /*
  734.       The purpose of the action below is to prevent that single or 'expensive' coefficients are coded.
  735.       With 4x4 transform there is larger chance that a single coefficient in a 8x8 or 16x16 block may be nonzero.
  736.       A single small (level=1) coefficient in a 8x8 block will cost: 3 or more bits for the coefficient,
  737.       4 bits for EOBs for the 4x4 blocks,possibly also more bits for CBP.  Hence the total 'cost' of that single
  738.       coefficient will typically be 10-12 bits which in a RD consideration is too much to justify the distortion improvement.
  739.       The action below is to watch such 'single' coefficients and set the reconstructed block equal to the prediction according
  740.       to a given criterium.  The action is taken only for inter luma blocks.
  741.         Notice that this is a pure encoder issue and hence does not have any implication on the standard.
  742.         coeff_cost is a parameter set in dct_luma() and accumulated for each 8x8 block.  If level=1 for a coefficient,
  743.         coeff_cost is increased by a number depending on RUN for that coefficient.The numbers are (see also dct_luma()): 3,2,2,1,1,1,0,0,...
  744.         when RUN equals 0,1,2,3,4,5,6, etc.
  745.         If level >1 coeff_cost is increased by 9 (or any number above 3). The threshold is set to 3. This means for example:
  746.         1: If there is one coefficient with (RUN,level)=(0,1) in a 8x8 block this coefficient is discarded.
  747.         2: If there are two coefficients with (RUN,level)=(1,1) and (4,1) the coefficients are also discarded
  748.         sum_cnt_nonz is the accumulation of coeff_cost over a whole macro block.  If sum_cnt_nonz is 5 or less for the whole MB,
  749.         all nonzero coefficients are discarded for the MB and the reconstructed block is set equal to the prediction.
  750.       */
  751.       if (coeff_cost > 3)
  752.       {
  753.         sum_cnt_nonz += coeff_cost;
  754.       }
  755.       else //discard
  756.       {
  757.         currMB->cbp     &=  (63  -  cbp_mask ) ;
  758.         currMB->cbp_blk &= ~(51 << (mb_y + (mb_x>>2) )) ;
  759.         for (i=mb_x; i < mb_x+BLOCK_SIZE*2; i++)
  760.         {
  761.           for (j=mb_y; j < mb_y+BLOCK_SIZE*2; j++)
  762.           {
  763.             imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
  764.           }
  765.         }
  766.         if (img->types==SP_IMG)
  767.           for (i=mb_x; i < mb_x+BLOCK_SIZE*2; i+=BLOCK_SIZE)
  768.             for (j=mb_y; j < mb_y+BLOCK_SIZE*2; j+=BLOCK_SIZE)
  769.               copyblock_sp(i,j);
  770.       }
  771.     }
  772.   }
  773.   if (sum_cnt_nonz <= 5 )
  774.   {
  775.      currMB->cbp     &= 0xfffff0 ;
  776.      currMB->cbp_blk &= 0xff0000 ;
  777.      for (i=0; i < MB_BLOCK_SIZE; i++)
  778.      {
  779.        for (j=0; j < MB_BLOCK_SIZE; j++)
  780.        {
  781.          imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
  782.        }
  783.      }
  784.      if (img->types==SP_IMG)
  785.        for (i=0; i < MB_BLOCK_SIZE; i+=BLOCK_SIZE)
  786.          for (j=0; j < MB_BLOCK_SIZE; j+=BLOCK_SIZE)
  787.            copyblock_sp(i,j);
  788.    }
  789. }
  790. /*!
  791.  ************************************************************************
  792.  * brief
  793.  *    Performs DCT, quantization, run/level pre-coding and IDCT
  794.  *    for the chrominance of a I- of P-frame macroblock;
  795.  *    current cbp and cr_cbp are affected
  796.  ************************************************************************
  797.  */
  798. void ChromaCoding_P(int *cr_cbp)
  799. {
  800.   int i, j;
  801.   int uv, ii,jj,ii0,jj0,ii1,jj1,if1,jf1,if0,jf0,f1,f2,f3,f4;
  802.   int pic_block_y, pic_block_x;
  803.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  804.   if(input->mv_res)
  805.   {
  806.     f1=16;
  807.     f2=15;
  808.   }
  809.   else
  810.   {
  811.     f1=8;
  812.     f2=7;
  813.   }
  814.   f3=f1*f1;
  815.   f4=f3/2;
  816.   *cr_cbp=0;
  817.   for (uv=0; uv < 2; uv++)
  818.   {
  819.     if (img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
  820.     {
  821.       intrapred_chroma(img->pix_c_x,img->pix_c_y,uv);
  822.     }
  823.     else
  824.     {
  825.       for (j=0; j < MB_BLOCK_SIZE/2; j++)
  826.       {
  827.         pic_block_y=(img->pix_c_y+j)/2;
  828.         for (i=0; i < MB_BLOCK_SIZE/2; i++)
  829.         {
  830.           pic_block_x=(img->pix_c_x+i)/2;
  831.           ii=(img->pix_c_x+i)*f1+tmp_mv[0][pic_block_y][pic_block_x+4];
  832.           jj=(img->pix_c_y+j)*f1+tmp_mv[1][pic_block_y][pic_block_x+4];
  833.           ii0 = max (0, min (img->width_cr-1,ii/f1));
  834.           jj0 = max (0, min (img->height_cr-1,jj/f1));
  835.           ii1 = max (0, min (img->width_cr-1,(ii+f2)/f1));
  836.           jj1 = max (0, min (img->height_cr-1,(jj+f2)/f1));
  837.           if1=(ii & f2);
  838.           jf1=(jj & f2);
  839.           if0=f1-if1;
  840.           jf0=f1-jf1;
  841.           img->mpr[i][j]=(if0*jf0*mcef[img->multframe_no][uv][jj0][ii0]+
  842.             if1*jf0*mcef[img->multframe_no][uv][jj0][ii1]+
  843.             if0*jf1*mcef[img->multframe_no][uv][jj1][ii0]+
  844.             if1*jf1*mcef[img->multframe_no][uv][jj1][ii1]+f4)/f3;
  845.           img->m7[i][j]=imgUV_org[uv][img->pix_c_y+j][img->pix_c_x+i]-img->mpr[i][j];
  846.         }
  847.       }
  848.     }
  849.     if (img->types!=SP_IMG || (img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW) )
  850.       *cr_cbp=dct_chroma(uv,*cr_cbp);
  851.     else *cr_cbp=dct_chroma_sp(uv,*cr_cbp);
  852.   }
  853.   currMB->cbp += *cr_cbp*16;
  854. }
  855. /*!
  856.  ************************************************************************
  857.  * brief
  858.  *    Set reference frame information in global arrays
  859.  *    depending on mode decision. Used for motion vector prediction.
  860.  ************************************************************************
  861.  */
  862. void SetRefFrameInfo_P()
  863. {
  864.   int i,j;
  865.   if (img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
  866.   {
  867.     // Set the reference frame information for motion vector prediction as unavailable
  868.     for (j = 0;j < BLOCK_MULTIPLE;j++)
  869.     {
  870.       for (i = 0;i < BLOCK_MULTIPLE;i++)
  871.       {
  872.         refFrArr[img->block_y+j][img->block_x+i] = -1;
  873.       }
  874.     }
  875.   }
  876.   else
  877.   {
  878.     // Set the reference frame information for motion vector prediction
  879.     for (j = 0;j < BLOCK_MULTIPLE;j++)
  880.     {
  881.       for (i = 0;i < BLOCK_MULTIPLE;i++)
  882.       {
  883.         refFrArr[img->block_y+j][img->block_x+i] =  img->mb_data[img->current_mb_nr].ref_frame;
  884.       }
  885.     }
  886.   }
  887. }
  888. /*!
  889.  ************************************************************************
  890.  * brief
  891.  *    Encode one macroblock depending on chosen picture type
  892.  ************************************************************************
  893.  */
  894. void encode_one_macroblock()
  895. {
  896.   int cr_cbp;             // chroma coded block pattern
  897.   int tot_intra_sad;
  898.   int intra_pred_mode_2;  // best 16x16 intra mode
  899.   if (input->rdopt)
  900.   {
  901.     RD_Mode_Decision ();
  902.   }
  903.   else
  904.   {
  905.     Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  906.     tot_intra_sad = MakeIntraPrediction(&intra_pred_mode_2);     // Intra Prediction
  907.     if (img->type != B_IMG)         // I- or P-frame
  908.     {
  909.       if ((img->mb_y == img->mb_y_upd && img->mb_y_upd != img->mb_y_intra) || img->type == INTRA_IMG)
  910.       {
  911.         img->mb_mode=8*img->type+img->imod;  // Intra mode: set if intra image or if intra GOB for error robustness
  912.       }
  913.       else
  914.       {
  915.         currMB->ref_frame = motion_search(tot_intra_sad);      // P-frames MV-search
  916.       }
  917.     }
  918.     else                          // B-frame
  919.       currMB->ref_frame = motion_search_Bframe(tot_intra_sad); // B-frames MV-search
  920.     if (img->type == B_IMG)         // B-frame
  921.     {
  922.       LumaResidualCoding_B(img);           // Residual coding of Luma (B-modes only)
  923.       ChromaCoding_B(&cr_cbp);                              // Coding of Chrominance
  924.       SetRefFrameInfo_B();     // Set ref-frame info for mv-prediction of future MBs
  925.     }
  926.     else                  // I- or P-frame
  927.     {
  928.       if (currMB->intraOrInter == INTER_MB)
  929.         LumaResidualCoding_P();    // Residual coding of Luma (only for inter modes)
  930.       // Coding of Luma in intra mode is done implicitly in MakeIntraPredicition
  931.       ChromaCoding_P(&cr_cbp);                              // Coding of Chrominance
  932.       // Set reference frame information for motion vector prediction of future MBs
  933.       SetRefFrameInfo_P();
  934.       //  Check if a MB is skipped (no coeffs. only 0-vectors and prediction from the most recent frame)
  935.       if(   (currMB->ref_frame                      == 0) && (currMB->intraOrInter == INTER_MB)
  936.         && (tmp_mv[0][img->block_y][img->block_x+4]== 0) && (img->mb_mode         == M16x16_MB)
  937.         && (tmp_mv[1][img->block_y][img->block_x+4]== 0) && (currMB->cbp          == 0) )
  938.         img->mb_mode=COPY_MB;
  939.     }
  940.     currMB->qp = img->qp; // this should (or has to be) done somewere else. where?
  941.     DeblockMb(img, imgY, imgUV) ; // Deblock this MB ( pixels to the right and above are affected)
  942.     if (img->imod==INTRA_MB_NEW)        // Set 16x16 intra mode and make "intra CBP"
  943.     {
  944.       img->mb_mode += intra_pred_mode_2 + 4*cr_cbp + 12*img->kac;
  945.       currMB->cbp += 15*img->kac; //GB
  946.     }
  947.     if ((((img->type == INTER_IMG)||(img->types==SP_IMG))  && ((img->imod==INTRA_MB_NEW) || (img->imod==INTRA_MB_OLD)))
  948.       || (img->type == B_IMG && (img->imod==B_Backward || img->imod==B_Direct || img->imod==INTRA_MB_NEW || img->imod==INTRA_MB_OLD)))// gb b-frames too
  949.       currMB->ref_frame = 0;
  950.   }
  951. }
  952. /*!
  953.  ************************************************************************
  954.  * brief
  955.  *    Passes the chosen syntax elements to the NAL
  956.  ************************************************************************
  957.  */
  958. void write_one_macroblock()
  959. {
  960.   int i;
  961.   int mb_nr = img->current_mb_nr;
  962.   SyntaxElement *currSE = img->MB_SyntaxElements;
  963.   Macroblock *currMB = &img->mb_data[mb_nr];
  964.   int *bitCount = currMB->bitcounter;
  965.   Slice *currSlice = img->currentSlice;
  966.   DataPartition *dataPart;
  967.   int *partMap = assignSE2partition[input->partition_mode];
  968.   // Store imod for further use
  969.   currMB->mb_imode = img->imod;
  970.   // Store mb_mode for further use
  971.   currMB->mb_type = (currSE->value1 = img->mb_mode);
  972.   // choose the appropriate data partition
  973.   if (img->type == B_IMG)
  974.     dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  975.   else
  976.     dataPart = &(currSlice->partArr[partMap[SE_MBTYPE]]);
  977.   //  Bits for mode
  978.   if(img->type == INTRA_IMG || img->types == SP_IMG || input->symbol_mode == CABAC)
  979.   {
  980.     if (input->symbol_mode == UVLC)
  981.       currSE->mapping = n_linfo2;
  982.     else
  983.       currSE->writing = writeMB_typeInfo2Buffer_CABAC;
  984.     currSE->type = SE_MBTYPE;
  985. #if TRACE
  986.     if (img->type == B_IMG)
  987.       snprintf(currSE->tracestring, TRACESTRING_SIZE, "B_MB mode(%2d,%2d) = %3d",img->mb_x, img->mb_y, img->mb_mode);
  988.     else
  989.       snprintf(currSE->tracestring, TRACESTRING_SIZE, "MB mode(%2d,%2d) = %3d",img->mb_x, img->mb_y,img->mb_mode);
  990. #endif
  991.     dataPart->writeSyntaxElement( currSE, dataPart);
  992.     bitCount[BITS_MB_MODE]+=currSE->len;
  993.     currSE++;
  994.     currMB->currSEnr++;
  995.   }
  996.   else
  997.   {
  998.     if (img->mb_mode != COPY_MB || currMB->intraOrInter != INTER_MB || (img->type == B_IMG && currMB->cbp != 0))
  999.   {
  1000.       // Macroblock is coded, put out run and mbmode
  1001.       currSE->value1 = img->cod_counter;
  1002.       currSE->mapping = n_linfo2;
  1003.       currSE->type = SE_MBTYPE;
  1004. #if TRACE
  1005.       snprintf(currSE->tracestring, TRACESTRING_SIZE, "MB runlength = %3d",img->cod_counter);
  1006. #endif
  1007.       dataPart->writeSyntaxElement( currSE, dataPart);
  1008.       bitCount[BITS_MB_MODE]+=currSE->len;
  1009.       currSE++;
  1010.       currMB->currSEnr++;
  1011.     // Reset cod counter
  1012.       img->cod_counter = 0;
  1013.       // Put out mb mode
  1014.       currSE->value1 = img->mb_mode;
  1015.       if(img->type != B_IMG)
  1016.         currSE->value1--;
  1017.       currSE->mapping = n_linfo2;
  1018.       currSE->type = SE_MBTYPE;
  1019. #if TRACE
  1020.       if (img->type == B_IMG)
  1021.         snprintf(currSE->tracestring, TRACESTRING_SIZE, "B_MB mode(%2d,%2d) = %3d",img->mb_x, img->mb_y, img->mb_mode);
  1022.       else
  1023.         snprintf(currSE->tracestring, TRACESTRING_SIZE, "MB mode(%2d,%2d) = %3d",img->mb_x, img->mb_y,img->mb_mode);
  1024. #endif
  1025.       dataPart->writeSyntaxElement( currSE, dataPart);
  1026.       bitCount[BITS_MB_MODE]+=currSE->len;
  1027.       currSE++;
  1028.       currMB->currSEnr++;
  1029.     }
  1030.   else
  1031.   {
  1032.       // Macroblock is skipped, increase cod_counter
  1033.       img->cod_counter++;
  1034.       if(img->current_mb_nr == img->total_number_mb)
  1035.       {
  1036.         // Put out run
  1037.         currSE->value1 = img->cod_counter;
  1038.         currSE->mapping = n_linfo2;
  1039.         currSE->type = SE_MBTYPE;
  1040. #if TRACE
  1041.         snprintf(currSE->tracestring, TRACESTRING_SIZE, "MB runlength = %3d",img->cod_counter);
  1042. #endif
  1043.         dataPart->writeSyntaxElement( currSE, dataPart);
  1044.         bitCount[BITS_MB_MODE]+=currSE->len;
  1045.         currSE++;
  1046.         currMB->currSEnr++;
  1047.         // Reset cod counter
  1048.         img->cod_counter = 0;
  1049.       }
  1050.     }
  1051.   }
  1052.   if(input->UseConstrainedIntraPred)
  1053.   {
  1054.     if (img->type==INTER_IMG && img->types != SP_IMG)
  1055.       if(currMB->intraOrInter == INTER_MB)
  1056.         img->intra_mb[img->current_mb_nr] = 0;
  1057.   }
  1058.   //  Do nothing more if copy and inter mode
  1059.   if (img->mb_mode != COPY_MB || currMB->intraOrInter != INTER_MB ||
  1060.      (img->type == B_IMG && input->symbol_mode == CABAC) ||
  1061.      (img->type == B_IMG && input->symbol_mode == UVLC &&  currMB->cbp != 0))
  1062.   {
  1063.     //  Bits for intra prediction modes
  1064.     if (img->imod == INTRA_MB_OLD)
  1065.     {
  1066.       for (i=0; i < MB_BLOCK_SIZE/2; i++)
  1067.       {
  1068.         currSE->value1 = currMB->intra_pred_modes[2*i];
  1069.         currSE->value2 = currMB->intra_pred_modes[2*i+1];
  1070.         if (input->symbol_mode == UVLC)
  1071.           currSE->mapping = intrapred_linfo;
  1072.         else
  1073.           currSE->writing = writeIntraPredMode2Buffer_CABAC;
  1074.         currSE->type = SE_INTRAPREDMODE;
  1075.         // choose the appropriate data partition
  1076.         if (img->type != B_IMG)
  1077.         {
  1078. #if TRACE
  1079.           snprintf(currSE->tracestring, TRACESTRING_SIZE, "Intra mode     = %3d",IPRED_ORDER[currSE->value1][currSE->value2]);
  1080. #endif
  1081.           dataPart = &(currSlice->partArr[partMap[SE_INTRAPREDMODE]]);
  1082.         }
  1083.         else
  1084.         {
  1085. #if TRACE
  1086.           snprintf(currSE->tracestring, TRACESTRING_SIZE, "B_Intra mode = %3dt",IPRED_ORDER[currSE->value1][currSE->value2]);
  1087. #endif
  1088.           dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  1089.         }
  1090.         dataPart->writeSyntaxElement( currSE, dataPart);
  1091.         bitCount[BITS_COEFF_Y_MB]+=currSE->len;
  1092.         // proceed to next SE
  1093.         currSE++;
  1094.         currMB->currSEnr++;
  1095.       }
  1096.     }
  1097.     //  Bits for vector data
  1098.     if (img->type != B_IMG)
  1099.     {
  1100.       if (currMB->intraOrInter == INTER_MB) // inter
  1101.         writeMotionInfo2NAL_Pframe();
  1102.     }
  1103.     else
  1104.     {
  1105.       if(img->imod != B_Direct)
  1106.         writeMotionInfo2NAL_Bframe();
  1107.     }
  1108.     // Bits for CBP and Coefficients
  1109.     writeCBPandCoeffs2NAL();
  1110.   }
  1111.   bitCount[BITS_TOTAL_MB] = bitCount[BITS_MB_MODE] + bitCount[BITS_COEFF_Y_MB]  + bitCount[BITS_INTER_MB]
  1112.     + bitCount[BITS_CBP_MB] + bitCount[BITS_DELTA_QUANT_MB] + bitCount[BITS_COEFF_UV_MB];
  1113.   stat->bit_slice += bitCount[BITS_TOTAL_MB];
  1114. }
  1115. /*!
  1116.  ************************************************************************
  1117.  * brief
  1118.  *    Passes for a given MB of a P picture the reference frame
  1119.  *    parameter and the motion vectors to the NAL
  1120.  ************************************************************************
  1121.  */
  1122. int writeMotionInfo2NAL_Pframe()
  1123. {
  1124.   int i,j,k,l,m;
  1125.   int step_h,step_v;
  1126.   int curr_mvd;
  1127.   int mb_nr = img->current_mb_nr;
  1128.   Macroblock *currMB = &img->mb_data[mb_nr];
  1129.   SyntaxElement *currSE = &img->MB_SyntaxElements[currMB->currSEnr];
  1130.   int *bitCount = currMB->bitcounter;
  1131.   Slice *currSlice = img->currentSlice;
  1132.   DataPartition *dataPart;
  1133.   int *partMap = assignSE2partition[input->partition_mode];
  1134.   int no_bits = 0;
  1135.   //  If multiple ref. frames, write reference frame for the MB
  1136. #ifdef _ADDITIONAL_REFERENCE_FRAME_
  1137.   if (input->no_multpred > 1 || input->add_ref_frame > 0)
  1138. #else
  1139.     if (input->no_multpred > 1)
  1140. #endif
  1141.     {
  1142.       currSE->value1 = currMB->ref_frame ;
  1143.       currSE->type = SE_REFFRAME;
  1144.       if (input->symbol_mode == UVLC)
  1145.         currSE->mapping = n_linfo2;
  1146.       else
  1147.         currSE->writing = writeRefFrame2Buffer_CABAC;
  1148.       dataPart = &(currSlice->partArr[partMap[currSE->type]]);
  1149.       dataPart->writeSyntaxElement( currSE, dataPart);
  1150.       bitCount[BITS_INTER_MB]+=currSE->len;
  1151.       no_bits += currSE->len;
  1152. #if TRACE
  1153.       snprintf(currSE->tracestring, TRACESTRING_SIZE, "Reference frame no %d", currMB->ref_frame);
  1154. #endif
  1155.       // proceed to next SE
  1156.       currSE++;
  1157.       currMB->currSEnr++;
  1158.     }
  1159.     // Write motion vectors
  1160.     step_h=img->blc_size_h/BLOCK_SIZE;      // horizontal stepsize
  1161.     step_v=img->blc_size_v/BLOCK_SIZE;      // vertical stepsize
  1162.     for (j=0; j < BLOCK_SIZE; j += step_v)
  1163.     {
  1164.       for (i=0;i < BLOCK_SIZE; i += step_h)
  1165.       {
  1166.         for (k=0; k < 2; k++)
  1167.         {
  1168.           curr_mvd = tmp_mv[k][img->block_y+j][img->block_x+i+4]-img->mv[i][j][currMB->ref_frame][img->mb_mode][k];
  1169.           img->subblock_x = i; // position used for context determination
  1170.           img->subblock_y = j; // position used for context determination
  1171.           currSE->value1 = curr_mvd;
  1172.           // store (oversampled) mvd
  1173.           for (l=0; l < step_v; l++)
  1174.             for (m=0; m < step_h; m++)
  1175.               currMB->mvd[0][j+l][i+m][k] =  curr_mvd;
  1176.           currSE->value2 = k; // identifies the component; only used for context determination
  1177.           currSE->type = SE_MVD;
  1178.           if (input->symbol_mode == UVLC)
  1179.             currSE->mapping = mvd_linfo2;
  1180.           else
  1181.             currSE->writing = writeMVD2Buffer_CABAC;
  1182.           dataPart = &(currSlice->partArr[partMap[currSE->type]]);
  1183.           dataPart->writeSyntaxElement( currSE, dataPart);
  1184.           bitCount[BITS_INTER_MB]+=currSE->len;
  1185.           no_bits += currSE->len;
  1186. #if TRACE
  1187.           snprintf(currSE->tracestring, TRACESTRING_SIZE, " MVD(%d) = %3d",k, curr_mvd);
  1188. #endif
  1189.           // proceed to next SE
  1190.           currSE++;
  1191.           currMB->currSEnr++;
  1192.         }
  1193.       }
  1194.     }
  1195.     return no_bits;
  1196. }
  1197. /*!
  1198.  ************************************************************************
  1199.  * brief
  1200.  *    Passes coded block pattern and coefficients (run/level)
  1201.  *    to the NAL
  1202.  ************************************************************************
  1203.  */
  1204. void
  1205. writeCBPandCoeffs2NAL ()
  1206. {
  1207.   Macroblock    *currMB    = &img->mb_data[img->current_mb_nr];
  1208.   if (img->imod != INTRA_MB_NEW)
  1209.   {
  1210.     // Bits for CBP
  1211.     writeMB_bits_for_CBP  ();
  1212.     // Bits for Delta quant
  1213.     if (currMB->cbp != 0)
  1214.       writeMB_bits_for_Dquant  ();
  1215.     // Bits for luma coefficients
  1216.     writeMB_bits_for_luma (1);
  1217.   }
  1218.   else // 16x16 based intra modes
  1219.   {
  1220.     writeMB_bits_for_Dquant  ();
  1221.     writeMB_bits_for_16x16_luma ();
  1222.   }
  1223.   // Bits for chroma 2x2 DC transform coefficients
  1224.   writeMB_bits_for_DC_chroma (1);
  1225.   // Bits for chroma AC-coeffs.
  1226.   writeMB_bits_for_AC_chroma (1);
  1227. }
  1228. int
  1229. writeMB_bits_for_CBP ()
  1230. {
  1231.   int           no_bits    = 0;
  1232.   Macroblock    *currMB    = &img->mb_data[img->current_mb_nr];
  1233.   SyntaxElement *currSE    = &img->MB_SyntaxElements[currMB->currSEnr];
  1234.   int           *bitCount  = currMB->bitcounter;
  1235.   DataPartition *dataPart;
  1236.   int           *partMap   = assignSE2partition[input->partition_mode];
  1237.   currSE->value1 = currMB->cbp;
  1238. #if TRACE
  1239.   snprintf(currSE->tracestring, TRACESTRING_SIZE, "CBP (%2d,%2d) = %3d",img->mb_x, img->mb_y, currMB->cbp);
  1240. #endif
  1241.   if (img->imod == INTRA_MB_OLD)
  1242.   {
  1243.     if (input->symbol_mode == UVLC)
  1244.       currSE->mapping = cbp_linfo_intra;
  1245.     currSE->type = SE_CBP_INTRA;
  1246.   }
  1247.   else
  1248.   {
  1249.     if (input->symbol_mode == UVLC)
  1250.       currSE->mapping = cbp_linfo_inter;
  1251.     currSE->type = SE_CBP_INTER;
  1252.   }
  1253.   if (input->symbol_mode == CABAC)
  1254.     currSE->writing = writeCBP2Buffer_CABAC;
  1255.   // choose the appropriate data partition
  1256.   if (img->type != B_IMG)
  1257.     dataPart = &(img->currentSlice->partArr[partMap[currSE->type]]);
  1258.   else
  1259.     dataPart = &(img->currentSlice->partArr[partMap[SE_BFRAME]]);
  1260.   dataPart->writeSyntaxElement(currSE, dataPart);
  1261.   bitCount[BITS_CBP_MB]+=currSE->len;
  1262.   no_bits              +=currSE->len;
  1263.   // proceed to next SE
  1264.   currSE++;
  1265.   currMB->currSEnr++;
  1266.   return no_bits;
  1267. }
  1268. int
  1269. writeMB_bits_for_Dquant ()
  1270. {
  1271.   int           no_bits    = 0;
  1272.   Macroblock    *currMB    = &img->mb_data[img->current_mb_nr];
  1273.   SyntaxElement *currSE    = &img->MB_SyntaxElements[currMB->currSEnr];
  1274.   int           *bitCount  = currMB->bitcounter;
  1275.   DataPartition *dataPart;
  1276.   int           *partMap   = assignSE2partition[input->partition_mode];
  1277.   currSE->value1 = currMB->delta_qp;
  1278. #if TRACE
  1279.   snprintf(currSE->tracestring, TRACESTRING_SIZE, "Delta QP (%2d,%2d) = %3d",img->mb_x, img->mb_y, currMB->delta_qp);
  1280. #endif
  1281.   if (input->symbol_mode == UVLC)
  1282.      currSE->mapping = dquant_linfo;
  1283.   else if (input->symbol_mode == CABAC)
  1284.      currSE->writing = writeDquant_CABAC;// writeMVD2Buffer_CABAC;
  1285.    currSE->type = SE_DELTA_QUANT;
  1286.    // choose the appropriate data partition
  1287.    if (img->type != B_IMG)
  1288.      dataPart = &(img->currentSlice->partArr[partMap[currSE->type]]);
  1289.    else
  1290.      dataPart = &(img->currentSlice->partArr[partMap[SE_BFRAME]]);
  1291.    dataPart->writeSyntaxElement(  currSE, dataPart);
  1292.    bitCount[BITS_DELTA_QUANT_MB]+=currSE->len;
  1293.    no_bits              +=currSE->len;
  1294.     // proceed to next SE
  1295.    currSE++;
  1296.    currMB->currSEnr++;
  1297.    return no_bits;
  1298. }
  1299. int
  1300. writeMB_bits_for_luma (int  filtering)
  1301. {
  1302.   int no_bits = 0;
  1303.   int cbp     = img->mb_data [img->current_mb_nr].cbp;
  1304.   int mb_y, mb_x, i, j, ii, jj, bits;
  1305.   for (mb_y=0; mb_y < 4; mb_y += 2)
  1306.   {
  1307.     for (mb_x=0; mb_x < 4; mb_x += 2)
  1308.     {
  1309.       for (j=mb_y; j < mb_y+2; j++)
  1310.       {
  1311.         jj=j/2;
  1312.         for (i=mb_x; i < mb_x+2; i++)
  1313.         {
  1314.           ii=i/2;
  1315.           if ((cbp & (1<<(ii+jj*2))) != 0)        // check for any coefficients
  1316.           {
  1317.             no_bits += (bits = writeMB_bits_for_4x4_luma (i, j, filtering));
  1318.           }
  1319.           else bits = 0;
  1320. #ifdef _RD_DEBUG_I4MODE_
  1321.           rcdebug_set_luma_rate_4x4 (i, j, bits);
  1322. #endif
  1323.         }
  1324.       }
  1325.     }
  1326.   }
  1327.   return no_bits;
  1328. }
  1329. int
  1330. writeMB_bits_for_4x4_luma (int i, int j, int  filtering)
  1331. {
  1332.   int           no_bits    = 0;
  1333.   Macroblock    *currMB    = &img->mb_data[img->current_mb_nr];
  1334.   SyntaxElement *currSE    = &img->MB_SyntaxElements[currMB->currSEnr];
  1335.   int           *bitCount  = currMB->bitcounter;
  1336.   Slice         *currSlice = img->currentSlice;
  1337.   DataPartition *dataPart;
  1338.   int           *partMap   = assignSE2partition[input->partition_mode];
  1339.   int kk,kbeg,kend;
  1340.   int level, run;
  1341.   int k;
  1342.   if (img->imod == INTRA_MB_OLD && img->qp < 24)  // double scan
  1343.   {
  1344.     for(kk=0;kk<2;kk++)
  1345.     {
  1346.       kbeg=kk*9;
  1347.       kend=kbeg+8;
  1348.       level=1; // get inside loop
  1349.       for(k=kbeg;k <= kend && level !=0; k++)
  1350.       {
  1351.         level = currSE->value1 = img->cof[i][j][k][0][DOUBLE_SCAN]; // level
  1352.         run   = currSE->value2 = img->cof[i][j][k][1][DOUBLE_SCAN]; // run
  1353.         if (input->symbol_mode == UVLC)
  1354.           currSE->mapping = levrun_linfo_intra;
  1355.         else
  1356.         {
  1357.           currSE->context = 0; // for choosing context model
  1358.           currSE->writing = writeRunLevel2Buffer_CABAC;
  1359.         }
  1360.         if (k == kbeg)
  1361.         {
  1362.           currSE->type  = SE_LUM_DC_INTRA; // element is of type DC
  1363.           // choose the appropriate data partition
  1364.           if (img->type != B_IMG)
  1365.             dataPart = &(currSlice->partArr[partMap[SE_LUM_DC_INTRA]]);
  1366.           else
  1367.             dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  1368.         }
  1369.         else
  1370.         {
  1371.           currSE->type  = SE_LUM_AC_INTRA;   // element is of type AC
  1372.           // choose the appropriate data partition
  1373.           if (img->type != B_IMG)
  1374.             dataPart = &(currSlice->partArr[partMap[SE_LUM_AC_INTRA]]);
  1375.           else
  1376.             dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  1377.         }
  1378.         dataPart->writeSyntaxElement (currSE, dataPart);
  1379.         bitCount[BITS_COEFF_Y_MB]+=currSE->len;
  1380.         no_bits                  +=currSE->len;
  1381. #if TRACE
  1382.         snprintf(currSE->tracestring, TRACESTRING_SIZE, "Luma dbl(%2d,%2d)  level=%3d Run=%2d",kk,k,level,run);
  1383. #endif
  1384.         // proceed to next SE
  1385.         currSE++;
  1386.         currMB->currSEnr++;
  1387.       }
  1388.     }
  1389.   }
  1390.   else     // single scan
  1391.   {
  1392.     level=1; // get inside loop
  1393.     for(k=0;k<=16 && level !=0; k++)
  1394.     {
  1395.       level = currSE->value1 = img->cof[i][j][k][0][SINGLE_SCAN]; // level
  1396.       run   = currSE->value2 = img->cof[i][j][k][1][SINGLE_SCAN]; // run
  1397.       if (input->symbol_mode == UVLC)
  1398.         currSE->mapping = levrun_linfo_inter;
  1399.       else
  1400.         currSE->writing = writeRunLevel2Buffer_CABAC;
  1401.       if (k == 0)
  1402.       {
  1403.         if (img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
  1404.         {
  1405.           currSE->context = 2; // for choosing context model
  1406.           currSE->type  = SE_LUM_DC_INTRA;
  1407.         }
  1408.         else
  1409.         {
  1410.           currSE->context = 1; // for choosing context model
  1411.           currSE->type  = SE_LUM_DC_INTER;
  1412.         }
  1413.       }
  1414.       else
  1415.       {
  1416.         if (img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
  1417.         {
  1418.           currSE->context = 2; // for choosing context model
  1419.           currSE->type  = SE_LUM_AC_INTRA;
  1420.         }
  1421.         else
  1422.         {
  1423.           currSE->context = 1; // for choosing context model
  1424.           currSE->type  = SE_LUM_AC_INTER;
  1425.         }
  1426.       }
  1427.       // choose the appropriate data partition
  1428.       if (img->type != B_IMG)
  1429.         dataPart = &(currSlice->partArr[partMap[currSE->type]]);
  1430.       else
  1431.         dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  1432.       dataPart->writeSyntaxElement (currSE, dataPart);
  1433.       bitCount[BITS_COEFF_Y_MB]+=currSE->len;
  1434.       no_bits                  +=currSE->len;
  1435. #if TRACE
  1436.       snprintf(currSE->tracestring, TRACESTRING_SIZE, "Luma sng(%2d) level =%3d run =%2d", k, level,run);
  1437. #endif
  1438.       // proceed to next SE
  1439.       currSE++;
  1440.       currMB->currSEnr++;
  1441.     }
  1442.   }
  1443.   return no_bits;
  1444. }
  1445. int
  1446. writeMB_bits_for_16x16_luma ()
  1447. {
  1448.   int           no_bits    = 0;
  1449.   Macroblock    *currMB    = &img->mb_data[img->current_mb_nr];
  1450.   SyntaxElement *currSE    = &img->MB_SyntaxElements[currMB->currSEnr];
  1451.   int           *bitCount  = currMB->bitcounter;
  1452.   Slice         *currSlice = img->currentSlice;
  1453.   DataPartition *dataPart;
  1454.   int           *partMap   = assignSE2partition[input->partition_mode];
  1455.   int level, run;
  1456.   int i, j, k, mb_x, mb_y;
  1457.   // DC coeffs
  1458.   level=1; // get inside loop
  1459.   for (k=0;k<=16 && level !=0;k++)
  1460.   {
  1461.     level = currSE->value1 = img->cof[0][0][k][0][1]; // level
  1462.     run   = currSE->value2 = img->cof[0][0][k][1][1]; // run
  1463.     if (input->symbol_mode == UVLC)
  1464.       currSE->mapping = levrun_linfo_inter;
  1465.     else
  1466.     {
  1467.       currSE->context = 3; // for choosing context model
  1468.       currSE->writing = writeRunLevel2Buffer_CABAC;
  1469.     }
  1470.     currSE->type  = SE_LUM_DC_INTRA;   // element is of type DC
  1471.     // choose the appropriate data partition
  1472.     if (img->type != B_IMG)
  1473.       dataPart = &(currSlice->partArr[partMap[currSE->type]]);
  1474.     else
  1475.       dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  1476.     dataPart->writeSyntaxElement (currSE, dataPart);
  1477.     bitCount[BITS_COEFF_Y_MB]+=currSE->len;
  1478.     no_bits                  +=currSE->len;
  1479. #if TRACE
  1480.     snprintf(currSE->tracestring, TRACESTRING_SIZE, "DC luma 16x16 sng(%2d) level =%3d run =%2d", k, level, run);
  1481. #endif
  1482.     // proceed to next SE
  1483.     currSE++;
  1484.     currMB->currSEnr++;
  1485.   }
  1486.   // AC coeffs
  1487.   if (img->kac==1)
  1488.   {
  1489.     for (mb_y=0; mb_y < 4; mb_y += 2)
  1490.     {
  1491.       for (mb_x=0; mb_x < 4; mb_x += 2)
  1492.       {
  1493.         for (j=mb_y; j < mb_y+2; j++)
  1494.         {
  1495.           for (i=mb_x; i < mb_x+2; i++)
  1496.           {
  1497.             level=1; // get inside loop
  1498.             for (k=0;k<16 && level !=0;k++)
  1499.             {
  1500.               level = currSE->value1 = img->cof[i][j][k][0][SINGLE_SCAN]; // level
  1501.               run   = currSE->value2 = img->cof[i][j][k][1][SINGLE_SCAN]; // run
  1502.               if (input->symbol_mode == UVLC)
  1503.                 currSE->mapping = levrun_linfo_inter;
  1504.               else
  1505.               {
  1506.                 currSE->context = 4; // for choosing context model
  1507.                 currSE->writing = writeRunLevel2Buffer_CABAC;
  1508.               }
  1509.               currSE->type  = SE_LUM_AC_INTRA;   // element is of type AC
  1510.               // choose the appropriate data partition
  1511.               if (img->type != B_IMG)
  1512.                 dataPart = &(currSlice->partArr[partMap[currSE->type]]);
  1513.               else
  1514.                 dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  1515.               dataPart->writeSyntaxElement (currSE, dataPart);
  1516.               bitCount[BITS_COEFF_Y_MB]+=currSE->len;
  1517.               no_bits                  +=currSE->len;
  1518. #if TRACE
  1519.               snprintf(currSE->tracestring, TRACESTRING_SIZE, "AC luma 16x16 sng(%2d) level =%3d run =%2d", k, level, run);
  1520. #endif
  1521.               // proceed to next SE
  1522.               currSE++;
  1523.               currMB->currSEnr++;
  1524.             }
  1525.           }
  1526.         }
  1527.       }
  1528.     }
  1529.   }
  1530.   return no_bits;
  1531. }
  1532. int
  1533. writeMB_bits_for_DC_chroma (int filtering)
  1534. {
  1535.   int           no_bits    = 0;
  1536.   Macroblock    *currMB    = &img->mb_data[img->current_mb_nr];
  1537.   SyntaxElement *currSE    = &img->MB_SyntaxElements[currMB->currSEnr];
  1538.   int           *bitCount  = currMB->bitcounter;
  1539.   Slice         *currSlice = img->currentSlice;
  1540.   DataPartition *dataPart;
  1541.   int           *partMap   = assignSE2partition[input->partition_mode];
  1542.   int cbp = img->mb_data [img->current_mb_nr].cbp;
  1543.   int level, run;
  1544.   int k, uv;
  1545.   if (cbp > 15)  // check if any chroma bits in coded block pattern is set
  1546.   {
  1547.     for (uv=0; uv < 2; uv++)
  1548.     {
  1549.       level=1;
  1550.       for (k=0; k < 5 && level != 0; ++k)
  1551.       {
  1552.         level = currSE->value1 = img->cofu[k][0][uv]; // level
  1553.         run   = currSE->value2 = img->cofu[k][1][uv]; // run
  1554.         if (input->symbol_mode == UVLC)
  1555.           currSE->mapping = levrun_linfo_c2x2;
  1556.         else
  1557.           currSE->writing = writeRunLevel2Buffer_CABAC;
  1558.         if (img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
  1559.         {
  1560.           currSE->context = 6; // for choosing context model
  1561.           currSE->type  = SE_CHR_DC_INTRA;
  1562.         }
  1563.         else
  1564.         {
  1565.           currSE->context = 5; // for choosing context model
  1566.           currSE->type  = SE_CHR_DC_INTER;
  1567.         }
  1568.         // choose the appropriate data partition
  1569.         if (img->type != B_IMG)
  1570.           dataPart = &(currSlice->partArr[partMap[currSE->type]]);
  1571.         else
  1572.           dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  1573.         dataPart->writeSyntaxElement (currSE, dataPart);
  1574.         bitCount[BITS_COEFF_UV_MB]+=currSE->len;
  1575.         no_bits                   +=currSE->len;
  1576. #if TRACE
  1577.         snprintf(currSE->tracestring, TRACESTRING_SIZE, "2x2 DC Chroma %2d: level =%3d run =%2d",k, level, run);
  1578. #endif
  1579.         // proceed to next SE
  1580.         currSE++;
  1581.         currMB->currSEnr++;
  1582.       }
  1583.     }
  1584.   }
  1585.   return no_bits;
  1586. }
  1587. int
  1588. writeMB_bits_for_AC_chroma (int  filtering)
  1589. {
  1590.   int           no_bits    = 0;
  1591.   Macroblock    *currMB    = &img->mb_data[img->current_mb_nr];
  1592.   SyntaxElement *currSE    = &img->MB_SyntaxElements[currMB->currSEnr];
  1593.   int           *bitCount  = currMB->bitcounter;
  1594.   Slice         *currSlice = img->currentSlice;
  1595.   DataPartition *dataPart;
  1596.   int           *partMap   = assignSE2partition[input->partition_mode];
  1597.   int cbp = img->mb_data [img->current_mb_nr].cbp;
  1598.   int level, run;
  1599.   int i, j, k, mb_x, mb_y, i1, ii, j1, jj;
  1600.   if (cbp >> 4 == 2) // check if chroma bits in coded block pattern = 10b
  1601.   {
  1602.     for (mb_y=4; mb_y < 6; mb_y += 2)
  1603.     {
  1604.       for (mb_x=0; mb_x < 4; mb_x += 2)
  1605.       {
  1606.         for (j=mb_y; j < mb_y+2; j++)
  1607.         {
  1608.           jj=j/2;
  1609.           j1=j-4;
  1610.           for (i=mb_x; i < mb_x+2; i++)
  1611.           {
  1612.             ii=i/2;
  1613.             i1=i%2;
  1614.             level=1;
  1615.             for (k=0; k < 16 && level != 0; k++)
  1616.             {
  1617.               level = currSE->value1 = img->cof[i][j][k][0][0]; // level
  1618.               run   = currSE->value2 = img->cof[i][j][k][1][0]; // run
  1619.               if (input->symbol_mode == UVLC)
  1620.                 currSE->mapping = levrun_linfo_inter;
  1621.               else
  1622.                 currSE->writing = writeRunLevel2Buffer_CABAC;
  1623.               if (img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
  1624.               {
  1625.                 currSE->context = 8; // for choosing context model
  1626.                 currSE->type  = SE_CHR_AC_INTRA;
  1627.               }
  1628.               else
  1629.               {
  1630.                 currSE->context = 7; // for choosing context model
  1631.                 currSE->type  = SE_CHR_AC_INTER;
  1632.               }
  1633.               // choose the appropriate data partition
  1634.               if (img->type != B_IMG)
  1635.                 dataPart = &(currSlice->partArr[partMap[currSE->type]]);
  1636.               else
  1637.                 dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  1638.               dataPart->writeSyntaxElement (currSE, dataPart);
  1639.               bitCount[BITS_COEFF_UV_MB]+=currSE->len;
  1640.               no_bits                   +=currSE->len;
  1641. #if TRACE
  1642.               snprintf(currSE->tracestring, TRACESTRING_SIZE, "AC Chroma %2d: level =%3d run =%2d",k, level, run);
  1643. #endif
  1644.               // proceed to next SE
  1645.               currSE++;
  1646.               currMB->currSEnr++;
  1647.             }
  1648.           }
  1649.         }
  1650.       }
  1651.     }
  1652.   }
  1653.   return no_bits;
  1654. }
  1655. /*!
  1656.  ************************************************************************
  1657.  * brief
  1658.  *    Find best 16x16 based intra mode
  1659.  *
  1660.  * par Input:
  1661.  *    Image parameters, pointer to best 16x16 intra mode
  1662.  *
  1663.  * par Output:
  1664.  *    best 16x16 based SAD
  1665.  ************************************************************************/
  1666. int find_sad2(int *intra_mode)
  1667. {
  1668.   int current_intra_sad_2,best_intra_sad2;
  1669.   int M1[16][16],M0[4][4][4][4],M3[4],M4[4][4];
  1670.   int i,j,k;
  1671.   int ii,jj;
  1672.   best_intra_sad2=MAX_VALUE;
  1673.   for (k=0;k<4;k++)
  1674.   {
  1675.     int mb_nr = img->current_mb_nr;
  1676.     int mb_width = img->width/16;
  1677.     int mb_available_up = (img->mb_y == 0) ? 0 : (img->slice_numbers[mb_nr] == img->slice_numbers[mb_nr-mb_width]);
  1678.     int mb_available_left = (img->mb_x == 0) ? 0 : (img->slice_numbers[mb_nr] == img->slice_numbers[mb_nr-1]);
  1679.     if(input->UseConstrainedIntraPred)
  1680.     {
  1681.       if (mb_available_up && (img->intra_mb[mb_nr-mb_width] ==0))
  1682.         mb_available_up = 0;
  1683.       if (mb_available_left && (img->intra_mb[mb_nr-1] ==0))
  1684.         mb_available_left = 0;
  1685.     }
  1686.     //check if there are neighbours to predict from
  1687.     if ((k==0 && !mb_available_up) || (k==1 && !mb_available_left) || (k==3 && (!mb_available_left || !mb_available_up)))
  1688.     {
  1689.       ; // edge, do nothing
  1690.     }
  1691.     else
  1692.     {
  1693.       for (j=0;j<16;j++)
  1694.       {
  1695.         for (i=0;i<16;i++)
  1696.         {
  1697.           M1[i][j]=imgY_org[img->pix_y+j][img->pix_x+i]-img->mprr_2[k][j][i];
  1698.           M0[i%4][i/4][j%4][j/4]=M1[i][j];
  1699.         }
  1700.       }
  1701.       current_intra_sad_2=0;              // no SAD start handicap here
  1702.       for (jj=0;jj<4;jj++)
  1703.       {
  1704.         for (ii=0;ii<4;ii++)
  1705.         {
  1706.           for (j=0;j<4;j++)
  1707.           {
  1708.             M3[0]=M0[0][ii][j][jj]+M0[3][ii][j][jj];
  1709.             M3[1]=M0[1][ii][j][jj]+M0[2][ii][j][jj];
  1710.             M3[2]=M0[1][ii][j][jj]-M0[2][ii][j][jj];
  1711.             M3[3]=M0[0][ii][j][jj]-M0[3][ii][j][jj];
  1712.             M0[0][ii][j][jj]=M3[0]+M3[1];
  1713.             M0[2][ii][j][jj]=M3[0]-M3[1];
  1714.             M0[1][ii][j][jj]=M3[2]+M3[3];
  1715.             M0[3][ii][j][jj]=M3[3]-M3[2];
  1716.           }
  1717.           for (i=0;i<4;i++)
  1718.           {
  1719.             M3[0]=M0[i][ii][0][jj]+M0[i][ii][3][jj];
  1720.             M3[1]=M0[i][ii][1][jj]+M0[i][ii][2][jj];
  1721.             M3[2]=M0[i][ii][1][jj]-M0[i][ii][2][jj];
  1722.             M3[3]=M0[i][ii][0][jj]-M0[i][ii][3][jj];
  1723.             M0[i][ii][0][jj]=M3[0]+M3[1];
  1724.             M0[i][ii][2][jj]=M3[0]-M3[1];
  1725.             M0[i][ii][1][jj]=M3[2]+M3[3];
  1726.             M0[i][ii][3][jj]=M3[3]-M3[2];
  1727.             for (j=0;j<4;j++)
  1728.               if ((i+j)!=0)
  1729.                 current_intra_sad_2 += abs(M0[i][ii][j][jj]);
  1730.           }
  1731.         }
  1732.       }
  1733.       for (j=0;j<4;j++)
  1734.         for (i=0;i<4;i++)
  1735.           M4[i][j]=M0[0][i][0][j]/4;
  1736.         // Hadamard of DC koeff
  1737.         for (j=0;j<4;j++)
  1738.         {
  1739.           M3[0]=M4[0][j]+M4[3][j];
  1740.           M3[1]=M4[1][j]+M4[2][j];
  1741.           M3[2]=M4[1][j]-M4[2][j];
  1742.           M3[3]=M4[0][j]-M4[3][j];
  1743.           M4[0][j]=M3[0]+M3[1];
  1744.           M4[2][j]=M3[0]-M3[1];
  1745.           M4[1][j]=M3[2]+M3[3];
  1746.           M4[3][j]=M3[3]-M3[2];
  1747.         }
  1748.         for (i=0;i<4;i++)
  1749.         {
  1750.           M3[0]=M4[i][0]+M4[i][3];
  1751.           M3[1]=M4[i][1]+M4[i][2];
  1752.           M3[2]=M4[i][1]-M4[i][2];
  1753.           M3[3]=M4[i][0]-M4[i][3];
  1754.           M4[i][0]=M3[0]+M3[1];
  1755.           M4[i][2]=M3[0]-M3[1];
  1756.           M4[i][1]=M3[2]+M3[3];
  1757.           M4[i][3]=M3[3]-M3[2];
  1758.           for (j=0;j<4;j++)
  1759.             current_intra_sad_2 += abs(M4[i][j]);
  1760.         }
  1761.         if(current_intra_sad_2 < best_intra_sad2)
  1762.         {
  1763.           best_intra_sad2=current_intra_sad_2;
  1764.           *intra_mode = k; // update best intra mode
  1765.         }
  1766.     }
  1767.   }
  1768.   best_intra_sad2 = best_intra_sad2/2;
  1769.   return best_intra_sad2;
  1770. }