macroblock.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:117k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file macroblock.c
  4.  *
  5.  * brief
  6.  *    Process one macroblock
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Inge Lille-Langoy               <inge.lille-langoy@telenor.com>
  11.  *    - Rickard Sjoberg                 <rickard.sjoberg@era.ericsson.se>
  12.  *    - Jani Lainema                    <jani.lainema@nokia.com>
  13.  *    - Sebastian Purreiter             <sebastian.purreiter@mch.siemens.de>
  14.  *    - Detlev Marpe                    <marpe@hhi.de>
  15.  *    - Thomas Wedi                     <wedi@tnt.uni-hannover.de>
  16.  *    - Ragip Kurceren                  <ragip.kurceren@nokia.com>
  17.  *    - Alexis Michael Tourapis         <alexismt@ieee.org>
  18.  *************************************************************************************
  19.  */
  20. #include "contributors.h"
  21. #include <limits.h>
  22. #include <math.h>
  23. #include "global.h"
  24. #include "enc_statistics.h"
  25. #include "elements.h"
  26. #include "macroblock.h"
  27. #include "mc_prediction.h"
  28. #include "refbuf.h"
  29. #include "fmo.h"
  30. #include "vlc.h"
  31. #include "image.h"
  32. #include "mb_access.h"
  33. #include "ratectl.h"              // header file for rate control
  34. #include "cabac.h"
  35. #include "transform8x8.h"
  36. #include "transform.h"
  37. #include "me_fullsearch.h"
  38. #include "me_fullfast.h"
  39. #include "symbol.h"
  40. #include "rdoq.h"
  41. #include "mv-search.h"
  42. #if TRACE
  43. #define TRACE_SE(trace,str)  snprintf(trace,TRACESTRING_SIZE,str)
  44. #else
  45. #define TRACE_SE(trace,str)
  46. #endif
  47. const byte QP_SCALE_CR[52]=
  48. {
  49.   0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,
  50.   12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,
  51.   28,29,29,30,31,32,32,33,34,34,35,35,36,36,37,37,
  52.   37,38,38,38,39,39,39,39
  53. };
  54. static const int block8x8_idx[3][4][4] = 
  55. {
  56.   { {0, 1, 0, 0},
  57.   {2, 3, 0, 0},
  58.   {0, 0, 0, 0},
  59.   {0, 0, 0, 0},
  60.   },
  61.   { {0, 1, 0, 0},
  62.   {0, 1, 0, 0},
  63.   {2, 3, 0, 0},
  64.   {2, 3, 0, 0},
  65.   },
  66.   { {0, 0, 1, 1},
  67.   {0, 0, 1, 1},
  68.   {2, 2, 3, 3},
  69.   {2, 2, 3, 3}
  70.   }
  71. };
  72. static int  slice_too_big(Slice *currSlice, int rlc_bits);
  73. static int  writeChromaIntraPredMode (Macroblock* currMB);
  74. static int  writeMotionInfo2NAL      (Macroblock* currMB);
  75. static int  writeChromaCoeff         (Macroblock* currMB);
  76. static int  writeCBPandDquant        (Macroblock* currMB);
  77. static int diff  [16];
  78. static int diff64[64];
  79. const unsigned char subblk_offset_x[3][8][4] =
  80. {
  81.   {
  82.     {0, 4, 0, 4},
  83.     {0, 4, 0, 4},
  84.     {0, 0, 0, 0},
  85.     {0, 0, 0, 0},
  86.     {0, 0, 0, 0},
  87.     {0, 0, 0, 0},
  88.     {0, 0, 0, 0},
  89.     {0, 0, 0, 0}, 
  90.   },
  91.   { 
  92.     {0, 4, 0, 4},
  93.     {0, 4, 0, 4},
  94.     {0, 4, 0, 4},
  95.     {0, 4, 0, 4},
  96.     {0, 0, 0, 0},
  97.     {0, 0, 0, 0},
  98.     {0, 0, 0, 0},
  99.     {0, 0, 0, 0}, 
  100.   },
  101.   {
  102.     {0, 4, 0, 4},
  103.     {8,12, 8,12},
  104.     {0, 4, 0, 4},
  105.     {8,12, 8,12},
  106.     {0, 4, 0, 4},
  107.     {8,12, 8,12},
  108.     {0, 4, 0, 4},
  109.     {8,12, 8,12}  
  110.   }
  111. };
  112. const unsigned char subblk_offset_y[3][8][4] =
  113. {
  114.   {
  115.     {0, 0, 4, 4},
  116.     {0, 0, 4, 4},
  117.     {0, 0, 0, 0},
  118.     {0, 0, 0, 0},
  119.     {0, 0, 0, 0},
  120.     {0, 0, 0, 0},
  121.     {0, 0, 0, 0},
  122.     {0, 0, 0, 0}, 
  123.   },
  124.   { 
  125.     {0, 0, 4, 4},
  126.     {8, 8,12,12},
  127.     {0, 0, 4, 4},
  128.     {8, 8,12,12},
  129.     {0, 0, 0, 0},
  130.     {0, 0, 0, 0},
  131.     {0, 0, 0, 0},
  132.     {0, 0, 0, 0},
  133.   },
  134.   { 
  135.     {0, 0, 4, 4},
  136.     {0, 0, 4, 4},
  137.     {8, 8,12,12},
  138.     {8, 8,12,12},
  139.     {0, 0, 4, 4},
  140.     {0, 0, 4, 4},
  141.     {8, 8,12,12},
  142.     {8, 8,12,12},
  143.   }
  144. };
  145. extern ColocatedParams *Co_located;
  146. extern ColocatedParams *Co_located_JV[MAX_PLANE];  //!< Co_located to be used during 4:4:4 independent mode encoding
  147.  /*!
  148.  ************************************************************************
  149.  * brief
  150.  *    updates the coordinates for the next macroblock to be processed
  151.  *
  152.  * param mb_addr
  153.  *    macroblock address in scan order
  154.  ************************************************************************
  155.  */
  156. void set_MB_parameters (int mb_addr)
  157. {
  158.   img->current_mb_nr = mb_addr;
  159.   get_mb_block_pos(mb_addr, &img->mb_x, &img->mb_y);
  160.   img->block_x = img->mb_x << 2;
  161.   img->block_y = img->mb_y << 2;
  162.   img->pix_x   = img->block_x << 2;
  163.   img->pix_y   = img->block_y << 2;
  164.   img->opix_x  = img->pix_x;
  165.   if (img->MbaffFrameFlag)
  166.   {
  167.     if (img->mb_data[mb_addr].mb_field)
  168.     {
  169.       pCurImg    = (mb_addr & 0x01) ? img_org_bot[0]  : img_org_top[0];
  170.       pImgOrg[0] = pCurImg;
  171.       if ((img->yuv_format != YUV400) && !IS_INDEPENDENT(params))
  172.       {
  173.         if (mb_addr & 0x01)
  174.         {
  175.           pImgOrg[1] = img_org_bot[1];
  176.           pImgOrg[2] = img_org_bot[2];
  177.         }
  178.         else
  179.         {
  180.           pImgOrg[1] = img_org_top[1];
  181.           pImgOrg[2] = img_org_top[2];
  182.         }
  183.       }
  184.       img->opix_y   = (img->mb_y >> 1 ) << 4;
  185.       img->mb_data[mb_addr].list_offset = (mb_addr % 2) ? 4 : 2;
  186.     }
  187.     else
  188.     {
  189.       pCurImg    = img_org_frm[0];      
  190.       pImgOrg[0] = img_org_frm[0];
  191.       if ((img->yuv_format != YUV400) && !IS_INDEPENDENT(params))
  192.       {
  193.         pImgOrg[1] = img_org_frm[1];
  194.         pImgOrg[2] = img_org_frm[2];
  195.       }
  196.       img->opix_y   = img->block_y << 2;
  197.       img->mb_data[mb_addr].list_offset = 0;
  198.     }
  199.   }
  200.   else
  201.   {
  202.     img->opix_y   = img->block_y << 2;
  203.     img->mb_data[mb_addr].list_offset = 0;
  204.   }
  205.   if (img->yuv_format != YUV400)
  206.   {
  207.     img->pix_c_x = (img->mb_cr_size_x * img->pix_x) >> 4;
  208.     img->pix_c_y = (img->mb_cr_size_y * img->pix_y) >> 4;
  209.     img->opix_c_x = (img->mb_cr_size_x * img->opix_x) >> 4;
  210.     img->opix_c_y = (img->mb_cr_size_y * img->opix_y) >> 4;
  211.   }
  212.   //  printf ("set_MB_parameters: mb %d,  mb_x %d,  mb_y %dn", mb_addr, img->mb_x, img->mb_y);
  213. }
  214. /*!
  215.  ************************************************************************
  216.  * brief
  217.  *    updates the coordinates and statistics parameter for the
  218.  *    next macroblock
  219.  ************************************************************************
  220.  */
  221. void proceed2nextMacroblock(Macroblock *currMB)
  222. {
  223. #if TRACE
  224.   int use_bitstream_backing = (params->slice_mode == FIXED_RATE || params->slice_mode == CALL_BACK);
  225. #endif
  226.   int *bitCount = currMB->bitcounter;
  227.   int i;
  228.   StatParameters *cur_stats = &enc_picture->stats;
  229.   if (bitCount[BITS_TOTAL_MB] > img->max_bitCount)
  230.     printf("Warning!!! Number of bits (%d) of macroblock_layer() data seems to exceed defined limit (%d).n", bitCount[BITS_TOTAL_MB],img->max_bitCount);
  231.   // Update the statistics
  232.   cur_stats->bit_use_mb_type[img->type]      += bitCount[BITS_MB_MODE       ];
  233.   cur_stats->tmp_bit_use_cbp[img->type]      += bitCount[BITS_CBP_MB        ];
  234.   cur_stats->bit_use_coeffC[img->type]       += bitCount[BITS_COEFF_UV_MB   ];
  235.   cur_stats->bit_use_coeff[0][img->type]     += bitCount[BITS_COEFF_Y_MB    ];
  236.   cur_stats->bit_use_coeff[1][img->type]     += bitCount[BITS_COEFF_CB_MB   ]; 
  237.   cur_stats->bit_use_coeff[2][img->type]     += bitCount[BITS_COEFF_CR_MB   ]; 
  238.   cur_stats->bit_use_delta_quant[img->type]  += bitCount[BITS_DELTA_QUANT_MB];
  239.   cur_stats->bit_use_stuffingBits[img->type] += bitCount[BITS_STUFFING      ];
  240.   if (IS_INTRA(currMB))
  241.   {
  242.     ++cur_stats->intra_chroma_mode[currMB->c_ipred_mode];
  243.     if ((currMB->cbp&15) != 0)
  244.     {
  245.       ++cur_stats->mode_use_transform[img->type][currMB->mb_type][currMB->luma_transform_size_8x8_flag];
  246.     }
  247.   }
  248.   ++cur_stats->mode_use[img->type][currMB->mb_type];
  249.   cur_stats->bit_use_mode[img->type][currMB->mb_type] += bitCount[BITS_INTER_MB];
  250.   if (img->type != I_SLICE)
  251.   {
  252.     if (currMB->mb_type == P8x8)
  253.     {
  254.       for(i=0;i<4;i++)
  255.       {
  256.         if (currMB->b8mode[i] > 0)
  257.           ++cur_stats->mode_use[img->type][currMB->b8mode[i]];
  258.         else
  259.           ++cur_stats->b8_mode_0_use[img->type][currMB->luma_transform_size_8x8_flag];
  260.         if (currMB->b8mode[i]==4)
  261.         {
  262.           if ((currMB->luma_transform_size_8x8_flag && (currMB->cbp&15) != 0) || params->Transform8x8Mode == 2)
  263.             ++cur_stats->mode_use_transform[img->type][4][1];
  264.           else
  265.             ++cur_stats->mode_use_transform[img->type][4][0];
  266.         }
  267.       }
  268.     }
  269.     else if (currMB->mb_type >= 0 && currMB->mb_type <=3 && ((currMB->cbp&15) != 0))
  270.     {
  271.       ++cur_stats->mode_use_transform[img->type][currMB->mb_type][currMB->luma_transform_size_8x8_flag];
  272.     }
  273.   }
  274.   // Statistics
  275.   cur_stats->quant[img->type] += currMB->qp;
  276.   cur_stats->num_macroblocks[img->type]++;
  277. }
  278. void set_chroma_qp(ImageParameters *img, Macroblock* currMB)
  279. {
  280.   int i;
  281.   for (i=0; i<2; i++)
  282.   {
  283.     currMB->qpc[i] = iClip3 ( -img->bitdepth_chroma_qp_scale, 51, currMB->qp + img->chroma_qp_offset[i] );
  284.     currMB->qpc[i] = currMB->qpc[i] < 0 ? currMB->qpc[i] : QP_SCALE_CR[currMB->qpc[i]];
  285.     currMB->qp_scaled[i + 1] = currMB->qpc[i] + img->bitdepth_chroma_qp_scale;
  286.   }  
  287. }
  288. /*!
  289. ************************************************************************
  290. * brief
  291. *    updates chroma QP according to luma QP and bit depth
  292. ************************************************************************
  293. */
  294. void update_qp(ImageParameters *img, Macroblock *currMB)
  295. {
  296.   currMB->qp_scaled[0] = currMB->qp + img->bitdepth_luma_qp_scale;
  297.   set_chroma_qp(img, currMB);
  298.   select_dct(img, currMB);
  299. }
  300. /*!
  301.  ************************************************************************
  302.  * brief
  303.  *    resets info for the current macroblock
  304.  *
  305.  * param currMB
  306.  *    current macroblock
  307.  * param prev_mb
  308.  *    previous macroblock address
  309.  ************************************************************************
  310.  */
  311. void reset_macroblock(Macroblock *currMB, int prev_mb)
  312. {
  313.   int i,j,l;
  314.   // Reset vectors and reference indices
  315.   for (l=0; l<2; l++)
  316.   {
  317.     for (j=img->block_y; j < img->block_y + BLOCK_MULTIPLE; j++)
  318.     {
  319.       memset(&enc_picture->motion.ref_idx[l][j][img->block_x], -1, BLOCK_MULTIPLE * sizeof(char));
  320.       memset(enc_picture->motion.mv [l][j][img->block_x], 0, 2 * BLOCK_MULTIPLE * sizeof(short));
  321.       for (i=img->block_x; i < img->block_x + BLOCK_MULTIPLE; i++)
  322.         enc_picture->motion.ref_pic_id[l][j][i]= -1;
  323.     }
  324.   }
  325.   // Reset syntax element entries in MB struct
  326.   currMB->mb_type      = 0;
  327.   currMB->cbp_blk      = 0;
  328.   currMB->cbp          = 0;  
  329.   currMB->c_ipred_mode = DC_PRED_8;
  330.   cmp_cbp[1] = cmp_cbp[2] = curr_cbp[0] = curr_cbp[1] = 0;
  331.   memset(currMB->cbp_bits    , 0, 3 * sizeof(int64));
  332.   memset(currMB->cbp_bits_8x8, 0, 3 * sizeof(int64));
  333.   memset (currMB->mvd, 0, BLOCK_CONTEXT * sizeof(short));
  334.   memset (currMB->intra_pred_modes, DC_PRED, MB_BLOCK_PARTITIONS * sizeof(char)); // changing this to char would allow us to use memset
  335.   memset (currMB->intra_pred_modes8x8, DC_PRED, MB_BLOCK_PARTITIONS * sizeof(char));
  336.   memset (currMB->bipred_me, 0, 4* sizeof(short));
  337.   //initialize the whole MB as INTRA coded
  338.   //Blocks are set to notINTRA in write_one_macroblock
  339.   if (params->UseConstrainedIntraPred)
  340.   {
  341.     img->intra_block[img->current_mb_nr] = 1;
  342.   }
  343.   // Initialize bitcounters for this macroblock
  344.   if(prev_mb < 0) // No slice header to account for
  345.   {
  346.     currMB->bitcounter[BITS_HEADER] = 0;
  347.   }
  348.   else if (currMB->slice_nr == img->mb_data[prev_mb].slice_nr) // current MB belongs to the
  349.     // same slice as the last MB
  350.   {
  351.     currMB->bitcounter[BITS_HEADER] = 0;
  352.   }
  353.   currMB->bitcounter[BITS_MB_MODE       ] = 0;
  354.   currMB->bitcounter[BITS_INTER_MB      ] = 0;
  355.   currMB->bitcounter[BITS_CBP_MB        ] = 0;
  356.   currMB->bitcounter[BITS_COEFF_Y_MB    ] = 0;    
  357.   currMB->bitcounter[BITS_COEFF_UV_MB   ] = 0;    
  358.   currMB->bitcounter[BITS_COEFF_CB_MB   ] = 0; 
  359.   currMB->bitcounter[BITS_COEFF_CR_MB   ] = 0;
  360.   currMB->bitcounter[BITS_DELTA_QUANT_MB] = 0;
  361.   currMB->bitcounter[BITS_STUFFING ]      = 0;
  362. }
  363. /*!
  364.  ************************************************************************
  365.  * brief
  366.  *    initializes the current macroblock
  367.  *
  368.  * param currMB
  369.  *    current macroblock
  370.  * param mb_addr
  371.  *    current macroblock address
  372.  * param mb_field
  373.  *    true for field macroblock coding
  374.  ************************************************************************
  375.  */
  376. void start_macroblock(Slice *curr_slice, Macroblock **currMB, int mb_addr, byte mb_field)
  377. {
  378.   int i, mb_qp;
  379.   int use_bitstream_backing = (params->slice_mode == FIXED_RATE || params->slice_mode == CALL_BACK);
  380.   DataPartition *dataPart;
  381.   Bitstream *currStream;
  382.   int prev_mb;
  383.   *currMB = &img->mb_data[mb_addr];
  384.   (*currMB)->mbAddrX = mb_addr;
  385.   (*currMB)->mb_field = mb_field;
  386.   enc_picture->motion.mb_field[mb_addr] = mb_field;
  387.   (*currMB)->is_field_mode = (img->field_picture || ( img->MbaffFrameFlag && (*currMB)->mb_field));
  388.   set_MB_parameters (mb_addr);
  389.   prev_mb = FmoGetPreviousMBNr(img->current_mb_nr);
  390.   if ( params->ChromaMCBuffer )
  391.     OneComponentChromaPrediction4x4 = OneComponentChromaPrediction4x4_retrieve;
  392.   else
  393.     OneComponentChromaPrediction4x4 = OneComponentChromaPrediction4x4_regenerate;
  394.   if(use_bitstream_backing)
  395.   {
  396.     if ((!params->MbInterlace)||((mb_addr & 0x01)==0)) // KS: MB AFF -> store stream positions for 1st MB only
  397.     {
  398.       // Keep the current state of the bitstreams
  399.       if(!img->cod_counter)
  400.       {
  401.         for (i=0; i<curr_slice->max_part_nr; i++)
  402.         {
  403.           dataPart = &(curr_slice->partArr[i]);
  404.           currStream = dataPart->bitstream;
  405.           currStream->stored_bits_to_go = currStream->bits_to_go;
  406.           currStream->stored_byte_pos   = currStream->byte_pos;
  407.           currStream->stored_byte_buf   = currStream->byte_buf;
  408.           stats->stored_bit_slice       = stats->bit_slice;
  409.           if (curr_slice->symbol_mode ==CABAC)
  410.           {
  411.             dataPart->ee_recode = dataPart->ee_cabac;
  412.           }
  413.         }
  414.       }
  415.     }
  416.   }
  417.   // Save the slice number of this macroblock. When the macroblock below
  418.   // is coded it will use this to decide if prediction for above is possible
  419.   (*currMB)->slice_nr = img->current_slice_nr;
  420.   // Initialize delta qp change from last macroblock. Feature may be used for future rate control
  421.   // Rate control
  422.   (*currMB)->qpsp       = img->qpsp;
  423.   if (prev_mb > -1 && (img->mb_data[prev_mb].slice_nr == img->current_slice_nr))
  424.   {
  425.     (*currMB)->prev_qp  = img->mb_data[prev_mb].qp;
  426.     (*currMB)->prev_dqp = img->mb_data[prev_mb].delta_qp;
  427.   }
  428.   else
  429.   {
  430.     (*currMB)->prev_qp  = curr_slice->qp;
  431.     (*currMB)->prev_dqp = 0;
  432.   }
  433.   if(params->RCEnable)
  434.     mb_qp = rc_handle_mb( prev_mb, *currMB, curr_slice );
  435.   else
  436.   {
  437.     mb_qp = img->qp;
  438.   }
  439.   mb_qp = iClip3(-img->bitdepth_luma_qp_scale, 51, mb_qp);
  440.   (*currMB)->qp       = img->qp = mb_qp;
  441.   (*currMB)->delta_qp = (*currMB)->qp - (*currMB)->prev_qp;
  442.   update_qp (img, *currMB);
  443.   // deblocking filter parameter
  444.   if (active_pps->deblocking_filter_control_present_flag)
  445.   {
  446.     (*currMB)->DFDisableIdc    = img->DFDisableIdc;
  447.     (*currMB)->DFAlphaC0Offset = img->DFAlphaC0Offset;
  448.     (*currMB)->DFBetaOffset    = img->DFBetaOffset;
  449.   }
  450.   else
  451.   {
  452.     (*currMB)->DFDisableIdc    = 0;
  453.     (*currMB)->DFAlphaC0Offset = 0;
  454.     (*currMB)->DFBetaOffset    = 0;
  455.   }
  456.   // If MB is next to a slice boundary, mark neighboring blocks unavailable for prediction
  457.   CheckAvailabilityOfNeighbors(*currMB);
  458.   if (curr_slice->symbol_mode == CABAC)
  459.     CheckAvailabilityOfNeighborsCABAC(*currMB);
  460.   reset_macroblock(*currMB, prev_mb);
  461.   if ((params->SearchMode == FAST_FULL_SEARCH) && (!params->IntraProfile))
  462.     ResetFastFullIntegerSearch ();
  463.   // disable writing of trace file
  464. #if TRACE
  465.   for (i=0; i<curr_slice->max_part_nr; i++ )
  466.   {
  467.     curr_slice->partArr[i].bitstream->trace_enabled = FALSE;
  468.   }  
  469. #endif
  470. }
  471. /*!
  472.  ************************************************************************
  473.  * brief
  474.  *    terminates processing of the current macroblock depending
  475.  *    on the chosen slice mode
  476.  ************************************************************************
  477.  */
  478. void terminate_macroblock(Slice *currSlice,           //!< Current slice
  479.                           Macroblock *currMB,         //!< Current Macroblock
  480.                           Boolean *end_of_slice,      //!< returns true for last macroblock of a slice, otherwise false
  481.                           Boolean *recode_macroblock  //!< returns true if max. slice size is exceeded an macroblock must be recoded in next slice
  482.                           )
  483. {
  484.   int i;
  485.   SyntaxElement se;
  486.   int *partMap = assignSE2partition[params->partition_mode];
  487.   DataPartition *dataPart;
  488.   Bitstream *currStream;
  489.   int rlc_bits=0;
  490.   int use_bitstream_backing = (params->slice_mode == FIXED_RATE || params->slice_mode == CALL_BACK);
  491.   static int skip = FALSE;
  492.   int new_slice = 0;
  493.   // if previous mb in the same slice group has different slice number as the current, it's the
  494.   // the start of new slice
  495.   if ((img->current_mb_nr==0) || (FmoGetPreviousMBNr(img->current_mb_nr)<0) || ( img->mb_data[FmoGetPreviousMBNr(img->current_mb_nr)].slice_nr != img->current_slice_nr ))
  496.     new_slice=1;
  497.   *recode_macroblock=FALSE;
  498.   switch(params->slice_mode)
  499.   {
  500.   case NO_SLICES:
  501.     currSlice->num_mb++;
  502.     *recode_macroblock = FALSE;
  503.     if ((currSlice->num_mb) == (int)img->PicSizeInMbs) // maximum number of MBs reached
  504.       *end_of_slice = TRUE;
  505.     // if it's end of current slice group, slice ends too
  506.     *end_of_slice = (Boolean) (*end_of_slice | (img->current_mb_nr == FmoGetLastCodedMBOfSliceGroup (FmoMB2SliceGroup (img->current_mb_nr))));
  507.     break;
  508.   case FIXED_MB:
  509.     // For slice mode one, check if a new slice boundary follows
  510.     currSlice->num_mb++;
  511.     *recode_macroblock = FALSE;
  512.     //! Check end-of-slice group condition first
  513.     *end_of_slice = (Boolean) (img->current_mb_nr == FmoGetLastCodedMBOfSliceGroup (FmoMB2SliceGroup (img->current_mb_nr)));
  514.     //! Now check maximum # of MBs in slice
  515.     *end_of_slice = (Boolean) (*end_of_slice | (currSlice->num_mb >= params->slice_argument));
  516.     break;
  517.     // For slice modes two and three, check if coding of this macroblock
  518.     // resulted in too many bits for this slice. If so, indicate slice
  519.     // boundary before this macroblock and code the macroblock again
  520.   case FIXED_RATE:
  521.     // in case of skip MBs check if there is a slice boundary
  522.     // only for CAVLC (img->cod_counter is always 0 in case of CABAC)
  523.     if(img->cod_counter)
  524.     {
  525.       // write out the skip MBs to know how many bits we need for the RLC
  526.       se.value1 = img->cod_counter;
  527.       se.value2 = 0;
  528.       se.type = SE_MBTYPE;
  529.       dataPart = &(currSlice->partArr[partMap[se.type]]);
  530.       TRACE_SE (se.tracestring, "mb_skip_run");
  531.       writeSE_UVLC(&se, dataPart);
  532.       rlc_bits=se.len;
  533.       currStream = dataPart->bitstream;
  534.       // save the bitstream as it would be if we write the skip MBs
  535.       currStream->bits_to_go_skip  = currStream->bits_to_go;
  536.       currStream->byte_pos_skip    = currStream->byte_pos;
  537.       currStream->byte_buf_skip    = currStream->byte_buf;
  538.       // restore the bitstream
  539.       currStream->bits_to_go = currStream->stored_bits_to_go;
  540.       currStream->byte_pos   = currStream->stored_byte_pos;
  541.       currStream->byte_buf   = currStream->stored_byte_buf;
  542.       skip = TRUE;
  543.     }
  544.     //! Check if the last coded macroblock fits into the size of the slice
  545.     //! But only if this is not the first macroblock of this slice
  546.     if (!new_slice)
  547.     {
  548.       if(slice_too_big(currSlice, rlc_bits))
  549.       {
  550.         *recode_macroblock = TRUE;
  551.         *end_of_slice      = TRUE;
  552.       }
  553.       else if(!img->cod_counter)
  554.         skip = FALSE;
  555.     }
  556.     // maximum number of MBs
  557.     // check if current slice group is finished
  558.     if ((*recode_macroblock == FALSE) && (img->current_mb_nr == FmoGetLastCodedMBOfSliceGroup (FmoMB2SliceGroup (img->current_mb_nr))))
  559.     {
  560.       *end_of_slice = TRUE;
  561.       if(!img->cod_counter)
  562.         skip = FALSE;
  563.     }
  564.     //! (first MB OR first MB in a slice) AND bigger that maximum size of slice
  565.     if (new_slice && slice_too_big(currSlice, rlc_bits))
  566.     {
  567.       *end_of_slice = TRUE;
  568.       if(!img->cod_counter)
  569.         skip = FALSE;
  570.     }
  571.     if (!*recode_macroblock)
  572.       currSlice->num_mb++;
  573.     break;
  574.   case  CALL_BACK:
  575.     if (img->current_mb_nr > 0 && !new_slice)
  576.     {
  577.       if (currSlice->slice_too_big(rlc_bits))
  578.       {
  579.         *recode_macroblock = TRUE;
  580.         *end_of_slice = TRUE;
  581.       }
  582.     }
  583.     if ( (*recode_macroblock == FALSE) && (img->current_mb_nr == FmoGetLastCodedMBOfSliceGroup (FmoMB2SliceGroup (img->current_mb_nr))))
  584.       *end_of_slice = TRUE;
  585.     break;
  586.   default:
  587.     snprintf(errortext, ET_SIZE, "Slice Mode %d not supported", params->slice_mode);
  588.     error(errortext, 600);
  589.   }
  590.   if (*recode_macroblock == TRUE)
  591.   {
  592.     // Restore everything
  593.     for (i=0; i<currSlice->max_part_nr; i++)
  594.     {
  595.       dataPart = &(currSlice->partArr[i]);
  596.       currStream = dataPart->bitstream;
  597.       currStream->bits_to_go = currStream->stored_bits_to_go;
  598.       currStream->byte_pos  = currStream->stored_byte_pos;
  599.       currStream->byte_buf  = currStream->stored_byte_buf;
  600.       stats->bit_slice      = stats->stored_bit_slice;
  601.       if (currSlice->symbol_mode == CABAC)
  602.       {
  603.         dataPart->ee_cabac = dataPart->ee_recode;
  604.       }
  605.     }
  606.   }
  607.   if (currSlice->symbol_mode == CAVLC)
  608.   {
  609.     // Skip MBs at the end of this slice
  610.     dataPart = &(currSlice->partArr[partMap[SE_MBTYPE]]);
  611.     if(*end_of_slice == TRUE  && skip == TRUE)
  612.     {
  613.       // only for Slice Mode 2 or 3
  614.       // If we still have to write the skip, let's do it!
  615.       if(img->cod_counter && *recode_macroblock == TRUE) // MB that did not fit in this slice
  616.       {
  617.         // If recoding is true and we have had skip,
  618.         // we have to reduce the counter in case of recoding
  619.         img->cod_counter--;
  620.         if(img->cod_counter)
  621.         {
  622.           se.value1 = img->cod_counter;
  623.           se.value2 = 0;
  624.           se.type = SE_MBTYPE;
  625. #if TRACE
  626.           snprintf(se.tracestring, TRACESTRING_SIZE, "Final MB runlength = %3d",img->cod_counter);
  627. #endif
  628.           writeSE_UVLC(&se, dataPart);
  629.           rlc_bits=se.len;
  630.           currMB->bitcounter[BITS_MB_MODE]+=rlc_bits;
  631.           img->cod_counter = 0;
  632.         }
  633.       }
  634.       else //! MB that did not fit in this slice anymore is not a Skip MB
  635.       {
  636.         currStream = dataPart->bitstream;
  637.         // update the bitstream
  638.         currStream->bits_to_go = currStream->bits_to_go_skip;
  639.         currStream->byte_pos  = currStream->byte_pos_skip;
  640.         currStream->byte_buf  = currStream->byte_buf_skip;
  641.         // update the statistics
  642.         img->cod_counter = 0;
  643.         skip = FALSE;
  644.       }
  645.     }
  646.     // Skip MBs at the end of this slice for Slice Mode 0 or 1
  647.     if(*end_of_slice == TRUE && img->cod_counter && !use_bitstream_backing)
  648.     {
  649.       se.value1 = img->cod_counter;
  650.       se.value2 = 0;
  651.       se.type = SE_MBTYPE;
  652.       TRACE_SE (se.tracestring, "mb_skip_run");
  653.       writeSE_UVLC(&se, dataPart);
  654.       rlc_bits=se.len;
  655.       currMB->bitcounter[BITS_MB_MODE]+=rlc_bits;
  656.       img->cod_counter = 0;
  657.     }
  658.   }
  659. }
  660. /*!
  661.  *****************************************************************************
  662.  *
  663.  * brief
  664.  *    For Slice Mode 2: Checks if one partition of one slice exceeds the
  665.  *    allowed size
  666.  *
  667.  * return
  668.  *    FALSE if all Partitions of this slice are smaller than the allowed size
  669.  *    TRUE is at least one Partition exceeds the limit
  670.  *
  671.  * par Side effects
  672.  *    none
  673.  *
  674.  * date
  675.  *    4 November 2001
  676.  *
  677.  * author
  678.  *    Tobias Oelbaum      drehvial@gmx.net
  679.  *****************************************************************************/
  680. int slice_too_big(Slice *currSlice, int rlc_bits)
  681. {
  682.   DataPartition *dataPart;
  683.   Bitstream *currStream;
  684.   EncodingEnvironmentPtr eep;
  685.   int i;
  686.   int size_in_bytes;
  687.   //! CAVLC
  688.   if (currSlice->symbol_mode == CAVLC)
  689.   {
  690.     for (i=0; i<currSlice->max_part_nr; i++)
  691.     {
  692.       dataPart = &(currSlice->partArr[i]);
  693.       currStream = dataPart->bitstream;
  694.       size_in_bytes = currStream->byte_pos /*- currStream->tmp_byte_pos*/;
  695.       if (currStream->bits_to_go < 8)
  696.         size_in_bytes++;
  697.       if (currStream->bits_to_go < rlc_bits)
  698.         size_in_bytes++;
  699.       if(size_in_bytes > params->slice_argument)
  700.         return TRUE;
  701.     }
  702.   }
  703.   else //! CABAC
  704.   {
  705.     for (i=0; i<currSlice->max_part_nr; i++)
  706.     {
  707.       dataPart= &(currSlice->partArr[i]);
  708.       eep = &(dataPart->ee_cabac);
  709.       if( arienco_bits_written(eep) > (params->slice_argument*8))
  710.         return TRUE;
  711.     }
  712.   }
  713.   
  714.   return FALSE;
  715. }
  716. /*!
  717.  ************************************************************************
  718.  * brief
  719.  *    Residual Coding of an 8x8 Luma block (not for intra)
  720.  *
  721.  * return
  722.  *    coefficient cost
  723.  ************************************************************************
  724.  */
  725. int LumaResidualCoding8x8 ( Macroblock* currMB, //!< Current Macroblock to be coded
  726.                             int   *cbp,         //!< Output: cbp (updated according to processed 8x8 luminance block)
  727.                             int64 *cbp_blk,     //!< Output: block cbp (updated according to processed 8x8 luminance block)
  728.                             int   block8x8,     //!< block number of 8x8 block
  729.                             short p_dir,        //!< prediction direction
  730.                             int   l0_mode,      //!< list0 prediction mode (1-7, 0=DIRECT)
  731.                             int   l1_mode,      //!< list1 prediction mode (1-7, 0=DIRECT)
  732.                             short l0_ref_idx,   //!< reference picture for list0 prediction
  733.                             short l1_ref_idx,   //!< reference picture for list0 prediction
  734.                             int   is_cavlc      //!< entropy mode?
  735.                            )
  736. {
  737.   int    block_y, block_x, pic_pix_y, pic_pix_x, i, j, nonzero = 0, cbp_blk_mask;
  738.   int    coeff_cost = 0;
  739.   int    mb_y       = (block8x8 >> 1) << 3;
  740.   int    mb_x       = (block8x8 & 0x01) << 3;
  741.   int    cbp_mask   = 1 << block8x8;
  742.   int    bxx, byy;                   // indexing curr_blk
  743.   int    skipped    = (l0_mode == 0 && l1_mode == 0 && (img->type != B_SLICE));
  744.    
  745.   //set transform size
  746.   int    need_8x8_transform = currMB->luma_transform_size_8x8_flag;
  747.   int    uv, nonzerocr[3]={0,0,0};  
  748.   short bipred_me = currMB->bipred_me[block8x8];
  749.   coeff_cost_cr[1] = coeff_cost_cr[2] = 0;
  750.   //===== loop over 4x4 blocks =====
  751.   if(!need_8x8_transform)
  752.   {
  753.     if (((p_dir == 0 || p_dir == 2 )&& l0_mode < 5) || ((p_dir == 1 || p_dir == 2 ) && l1_mode < 5))
  754.     {
  755.       LumaPrediction (currMB, mb_x, mb_y, 8, 8, p_dir, l0_mode, l1_mode, l0_ref_idx, l1_ref_idx, bipred_me); 
  756.       //===== compute prediction residual ======            
  757.       ComputeResidue (pCurImg, img->mb_pred[0], img->mb_ores[0], mb_y, mb_x, img->opix_y, img->opix_x + mb_x, 8, 8);
  758.     }
  759.     for (byy=0, block_y=mb_y; block_y<mb_y+8; byy+=4, block_y+=4)
  760.     {
  761.       for (bxx=0, block_x=mb_x; block_x<mb_x+8; bxx+=4, block_x+=4)
  762.       {
  763.         pic_pix_x = img->opix_x + block_x;
  764.         cbp_blk_mask = (block_x >> 2) + block_y;
  765.         //===== prediction of 4x4 block =====
  766.         if (!(((p_dir == 0 || p_dir == 2 )&& l0_mode < 5) || ((p_dir == 1 || p_dir == 2 ) && l1_mode < 5)))
  767.         {
  768.           LumaPrediction (currMB, block_x, block_y, 4, 4, p_dir, l0_mode, l1_mode, l0_ref_idx, l1_ref_idx, bipred_me);
  769.           //===== compute prediction residual ======            
  770.           ComputeResidue(pCurImg, img->mb_pred[0], img->mb_ores[0], block_y, block_x, img->opix_y, pic_pix_x, 4, 4);
  771.         }
  772.         if (img->P444_joined)
  773.         {
  774.           for (uv = PLANE_U; uv <= PLANE_V; uv++)
  775.           {
  776.             select_plane((ColorPlane) (uv));
  777.             ChromaPrediction (currMB, uv - 1, block_x, block_y, 4, 4, p_dir, l0_mode, l1_mode, l0_ref_idx, l1_ref_idx, bipred_me);
  778.             
  779.             //===== compute prediction residual ======            
  780.             ComputeResidue(pImgOrg[uv], img->mb_pred[uv], img->mb_ores[uv], block_y, block_x, img->opix_y, pic_pix_x, 4, 4);
  781.           }
  782.           select_plane(PLANE_Y);
  783.         }
  784.         //===== DCT, Quantization, inverse Quantization, IDCT, Reconstruction =====
  785.         if ( (img->NoResidueDirect != 1 && !skipped  ) ||
  786.           ((currMB->qp_scaled[0])==0 && img->lossless_qpprime_flag==1) )
  787.         {
  788.           //===== DCT, Quantization, inverse Quantization, IDCT, Reconstruction =====
  789.           nonzero = pDCT_4x4 (currMB, PLANE_Y, block_x, block_y, &coeff_cost, 0, is_cavlc);
  790.           if (nonzero)
  791.           {
  792.             (*cbp_blk) |= (int64)1 << cbp_blk_mask;  // one bit for every 4x4 block
  793.             (*cbp)     |= cbp_mask;           // one bit for the 4x4 blocks of an 8x8 block
  794.           }
  795.           if (img->P444_joined)
  796.           {
  797.             if (img->type!=SP_SLICE)  
  798.             {
  799.               for (uv = PLANE_U; uv <= PLANE_V; uv++)
  800.               {
  801.                 select_plane((ColorPlane) uv);
  802.                 nonzerocr[uv] = pDCT_4x4( currMB, (ColorPlane) uv, block_x, block_y, &coeff_cost_cr[uv], 0, is_cavlc);
  803.                 if (nonzerocr[uv])
  804.                 {
  805.                   (cur_cbp_blk[uv]) |= (int64) 1 << cbp_blk_mask;  // one bit for every 4x4 block
  806.                   (cmp_cbp[uv]) |= cbp_mask;           // one bit for the 4x4 blocks of an 8x8 block
  807.                 }
  808.               }
  809.               select_plane(PLANE_Y);
  810.             }
  811.             else
  812.             {
  813.               assert(img->type==SP_SLICE);   //SP_SLICE not implementd for FREXT_AD444
  814.             }
  815.           }
  816.         }
  817.       }
  818.     }
  819.   }
  820.   else
  821.   {
  822.     for (block_y = mb_y; block_y < mb_y + 8; block_y += 8)
  823.     {
  824.       pic_pix_y = img->opix_y + block_y;
  825.       for (block_x = mb_x; block_x < mb_x + 8; block_x += 8)
  826.       {
  827.         pic_pix_x = img->opix_x + block_x;
  828.         cbp_blk_mask = (block_x>>2) + block_y;
  829.         //===== prediction of 4x4 block =====
  830.         LumaPrediction (currMB, block_x, block_y, 8, 8, p_dir, l0_mode, l1_mode, l0_ref_idx, l1_ref_idx, bipred_me);
  831.         //===== compute prediction residual ======            
  832.         ComputeResidue (pCurImg, img->mb_pred[0], img->mb_ores[0], block_y, block_x, img->opix_y, pic_pix_x, 8, 8);
  833.         if (img->P444_joined) 
  834.         {
  835.           for (uv = PLANE_U; uv <= PLANE_V; uv++)
  836.           {
  837.             select_plane((ColorPlane) uv);
  838.             ChromaPrediction (currMB, uv - 1, block_x, block_y, 8, 8, p_dir, l0_mode, l1_mode, l0_ref_idx, l1_ref_idx, bipred_me);
  839.             //===== compute prediction residual ======            
  840.             ComputeResidue (pImgOrg[uv], img->mb_pred[uv], img->mb_ores[uv], block_y, block_x, img->opix_y, pic_pix_x, 8, 8);
  841.           }
  842.           select_plane(PLANE_Y);
  843.         }
  844.       }
  845.     }
  846.     if (img->NoResidueDirect != 1 && !skipped)
  847.     {
  848.       if (img->type!=SP_SLICE)
  849.         nonzero = pDCT_8x8 (currMB, PLANE_Y, block8x8, &coeff_cost, 0);
  850.       if (nonzero)
  851.       {
  852.         (*cbp_blk) |= 51 << (4*block8x8 - 2*(block8x8 & 0x01)); // corresponds to 110011, as if all four 4x4 blocks contain coeff, shifted to block position
  853.         (*cbp)     |= cbp_mask;                               // one bit for the 4x4 blocks of an 8x8 block
  854.       }
  855.       
  856.       if(img->P444_joined) 
  857.       {
  858.         if (img->type!=SP_SLICE)
  859.         {
  860.           for (uv = PLANE_U; uv <= PLANE_V; uv++)
  861.           {
  862.             select_plane((ColorPlane) uv);
  863.             nonzerocr[uv] = pDCT_8x8( currMB, (ColorPlane) uv, block8x8, &coeff_cost_cr[uv], 0);
  864.             if (nonzerocr[uv])
  865.             {
  866.               (cur_cbp_blk[uv]) |= 51 << (4*block8x8-2*(block8x8 & 0x01)); // corresponds to 110011, as if all four 4x4 blocks contain coeff, shifted to block position
  867.               (cmp_cbp[uv])     |= cbp_mask;           // one bit for the 4x4 blocks of an 8x8 block
  868.             }
  869.           }
  870.           select_plane(PLANE_Y);
  871.         }        
  872.       }
  873.     }
  874.   }
  875.   /*
  876.   The purpose of the action below is to prevent that single or 'expensive' coefficients are coded.
  877.   With 4x4 transform there is larger chance that a single coefficient in a 8x8 or 16x16 block may be nonzero.
  878.   A single small (level=1) coefficient in a 8x8 block will cost: 3 or more bits for the coefficient,
  879.   4 bits for EOBs for the 4x4 blocks,possibly also more bits for CBP.  Hence the total 'cost' of that single
  880.   coefficient will typically be 10-12 bits which in a RD consideration is too much to justify the distortion improvement.
  881.   The action below is to watch such 'single' coefficients and set the reconstructed block equal to the prediction according
  882.   to a given criterium.  The action is taken only for inter luma blocks.
  883.   Notice that this is a pure encoder issue and hence does not have any implication on the standard.
  884.   coeff_cost is a parameter set in dct_4x4() and accumulated for each 8x8 block.  If level=1 for a coefficient,
  885.   coeff_cost is increased by a number depending on RUN for that coefficient.The numbers are (see also dct_4x4()): 3,2,2,1,1,1,0,0,...
  886.   when RUN equals 0,1,2,3,4,5,6, etc.
  887.   If level >1 coeff_cost is increased by 9 (or any number above 3). The threshold is set to 3. This means for example:
  888.   1: If there is one coefficient with (RUN,level)=(0,1) in a 8x8 block this coefficient is discarded.
  889.   2: If there are two coefficients with (RUN,level)=(1,1) and (4,1) the coefficients are also discarded
  890.   sum_cnt_nonz[0] is the accumulation of coeff_cost over a whole macro block.  If sum_cnt_nonz[0] is 5 or less for the whole MB,
  891.   all nonzero coefficients are discarded for the MB and the reconstructed block is set equal to the prediction.
  892.   */
  893.   if (img->NoResidueDirect != 1 && !skipped && coeff_cost <= _LUMA_COEFF_COST_ &&
  894.     ((currMB->qp_scaled[0])!=0 || img->lossless_qpprime_flag==0)&&
  895.     !(img->type==SP_SLICE && (si_frame_indicator==1 || sp2_frame_indicator==1 )))// last set of conditions
  896.     // cannot skip when perfect reconstruction is as in switching pictures or SI pictures
  897.   {
  898.     coeff_cost  = 0;
  899.     (*cbp)     &=  (63 - cbp_mask);
  900.     (*cbp_blk) &= ~(51 << (4*block8x8-2*(block8x8 & 0x01)));
  901.     
  902.     memset( img->cofAC[block8x8][0][0], 0, 4 * 2 * 65 * sizeof(int));
  903.     
  904.     for (j=mb_y; j<mb_y+8; j++)
  905.       memcpy(&enc_picture->imgY[img->pix_y + j][img->pix_x + mb_x], &img->mb_pred[0][j][mb_x], 2 * BLOCK_SIZE * sizeof(imgpel));
  906.     if (img->type==SP_SLICE)
  907.     {
  908.       for (i=mb_x; i < mb_x + BLOCK_SIZE_8x8; i+=BLOCK_SIZE)
  909.         for (j=mb_y; j < mb_y + BLOCK_SIZE_8x8; j+=BLOCK_SIZE)
  910.           copyblock_sp(currMB, PLANE_Y, i, j);
  911.     }
  912.   }
  913.   if(img->P444_joined)
  914.   {
  915.     for (uv = PLANE_U; uv <= PLANE_V; uv++)
  916.     {
  917.       if (img->NoResidueDirect != 1 && !skipped && coeff_cost_cr[uv] <= _LUMA_COEFF_COST_ &&
  918.         (currMB->qp_scaled[uv]!=0 || img->lossless_qpprime_flag==0))// last set of conditions
  919.       {
  920.         coeff_cost_cr[uv] = 0;
  921.         cmp_cbp[uv] &= (63 - cbp_mask);
  922.         cur_cbp_blk[uv] &= ~(51 << (4*block8x8-2*(block8x8 & 0x01)));
  923.         memset( img->cofAC[block8x8 + 4 * uv][0][0], 0, 4 * 2 * 65 * sizeof(int));
  924.         for (j=mb_y; j<mb_y+8; j++)
  925.           memcpy(&enc_picture->imgUV[uv - 1][img->pix_y + j][img->pix_x + mb_x], &img->mb_pred[uv][j][mb_x], 2 * BLOCK_SIZE * sizeof(imgpel));
  926.       }
  927.     }
  928.   }
  929.   return coeff_cost;
  930. }
  931. /*!
  932.  ************************************************************************
  933.  * brief
  934.  *    Set mode parameters and reference frames for an 8x8 block
  935.  ************************************************************************
  936.  */
  937. void SetModesAndRefframe (Macroblock* currMB, int b8, short* p_dir, int list_mode[2], short list_ref_idx[2])
  938. {
  939.   int j = 2*(b8>>1);
  940.   int i = 2*(b8 & 0x01);
  941.   list_mode[0] = list_mode[1] = list_ref_idx[0] = list_ref_idx[1] = -1;
  942.   *p_dir  = currMB->b8pdir[b8];
  943.   if (img->type!=B_SLICE)
  944.   {
  945.     list_ref_idx[0] = enc_picture->motion.ref_idx[LIST_0][img->block_y+j][img->block_x+i];
  946.     list_ref_idx[1] = 0;
  947.     list_mode[0] = currMB->b8mode[b8];
  948.     list_mode[1] = 0;
  949.   }
  950.   else
  951.   {
  952.     if (currMB->b8pdir[b8]==-1)
  953.     {
  954.       list_ref_idx[0] = -1;
  955.       list_ref_idx[1] = -1;
  956.       list_mode[0] =  0;
  957.       list_mode[1] =  0;
  958.     }
  959.     else if (currMB->b8pdir[b8]==0)
  960.     {
  961.       list_ref_idx[0] = enc_picture->motion.ref_idx[LIST_0][img->block_y+j][img->block_x+i];
  962.       list_ref_idx[1] = 0;
  963.       list_mode[0] = currMB->b8mode[b8];
  964.       list_mode[1] = 0;
  965.     }
  966.     else if (currMB->b8pdir[b8]==1)
  967.     {
  968.       list_ref_idx[0] = 0;
  969.       list_ref_idx[1] = enc_picture->motion.ref_idx[LIST_1][img->block_y+j][img->block_x+i];
  970.       list_mode[0] = 0;
  971.       list_mode[1] = currMB->b8mode[b8];
  972.     }
  973.     else
  974.     {
  975.       list_ref_idx[0] = enc_picture->motion.ref_idx[LIST_0][img->block_y+j][img->block_x+i];
  976.       list_ref_idx[1] = enc_picture->motion.ref_idx[LIST_1][img->block_y+j][img->block_x+i];
  977.       list_mode[0] = currMB->b8mode[b8];
  978.       list_mode[1] = currMB->b8mode[b8];
  979.     }
  980.   }
  981. }
  982. /*!
  983.  ************************************************************************
  984.  * brief
  985.  *    Residual Coding of a Luma macroblock (not for intra)
  986.  ************************************************************************
  987.  */
  988. void LumaResidualCoding (Macroblock *currMB, int is_cavlc)
  989. {
  990.   int uv, i,j,block8x8,b8_x,b8_y;
  991.   int list_mode[2];
  992.   short list_ref_idx[2];
  993.   short p_dir;
  994.   int sum_cnt_nonz[3] = {0 ,0, 0};
  995.   //imgpel (*mb_pred)[16] = img->mb_pred[0];
  996.   currMB->cbp     = 0;
  997.   currMB->cbp_blk = 0;
  998.   cmp_cbp[1] = cmp_cbp[2] = 0;
  999.   cur_cbp_blk[1] = cur_cbp_blk[2] = 0;
  1000.   for (block8x8=0; block8x8<4; block8x8++)
  1001.   {    
  1002.     SetModesAndRefframe (currMB, block8x8, &p_dir, list_mode, list_ref_idx);
  1003.     
  1004.     sum_cnt_nonz[0] += LumaResidualCoding8x8 (currMB, &(currMB->cbp), &(currMB->cbp_blk), block8x8,
  1005.       p_dir, list_mode[0], list_mode[1], list_ref_idx[0], list_ref_idx[1], is_cavlc);
  1006.     
  1007.     if(img->P444_joined) 
  1008.     {
  1009.       sum_cnt_nonz[1] += coeff_cost_cr[1];
  1010.       sum_cnt_nonz[2] += coeff_cost_cr[2];
  1011.     }
  1012.   }
  1013.   if (sum_cnt_nonz[0] <= _LUMA_MB_COEFF_COST_ &&
  1014.     ((currMB->qp_scaled[0])!=0 || img->lossless_qpprime_flag==0) &&
  1015.     !(img->type==SP_SLICE && (si_frame_indicator==1 || sp2_frame_indicator==1)))// modif ES added last set of conditions
  1016.     //cannot skip if SI or switching SP frame perfect reconstruction is needed
  1017.   {
  1018.     currMB->cbp     &= 0xfffff0 ;
  1019.     currMB->cbp_blk &= 0xff0000 ;
  1020.     for (j=0; j < MB_BLOCK_SIZE; j++)
  1021.       memcpy(&enc_picture->imgY[img->pix_y+j][img->pix_x], img->mb_pred[0][j], MB_BLOCK_SIZE * sizeof (imgpel));
  1022.         
  1023.     memset( img->cofAC[0][0][0], 0, 4 * 4 * 2 * 65 * sizeof(int));
  1024.     if (img->type==SP_SLICE)
  1025.     {
  1026.       for(block8x8=0;block8x8<4;block8x8++)
  1027.       {
  1028.         b8_x=(block8x8&1)<<3;
  1029.         b8_y=(block8x8&2)<<2;
  1030.         for (i = b8_x; i < b8_x + BLOCK_SIZE_8x8; i += 4)
  1031.           for (j = b8_y; j < b8_y + BLOCK_SIZE_8x8;j += 4)
  1032.             copyblock_sp(currMB, PLANE_Y, i, j);
  1033.       }
  1034.     }
  1035.   }
  1036.   if (img->P444_joined)
  1037.   {
  1038.     for (uv = PLANE_U; uv <= PLANE_V; uv++)
  1039.     {
  1040.       if(sum_cnt_nonz[uv] <= _LUMA_MB_COEFF_COST_ &&
  1041.         ((currMB->qp_scaled[uv])!=0 ||img->lossless_qpprime_flag==0)) 
  1042.       {
  1043.         cmp_cbp[uv] &= 0xfffff0 ;
  1044.         cur_cbp_blk[uv] &= 0xff0000 ;
  1045.         for (j=0; j < MB_BLOCK_SIZE; j++)
  1046.           memcpy(&enc_picture->p_img[uv][img->pix_y+j][img->pix_x], img->mb_pred[uv][j], MB_BLOCK_SIZE * sizeof (imgpel));
  1047.         memset( img->cofAC[4 * uv][0][0], 0, 4 * 4 * 2 * 65 * sizeof(int));
  1048.       }
  1049.       currMB->cbp |= cmp_cbp[uv];
  1050.     }
  1051.   }
  1052. }
  1053. /*!
  1054.  ************************************************************************
  1055.  * brief
  1056.  *    Makes the decision if 8x8 tranform will be used (for RD-off)
  1057.  ************************************************************************
  1058.  */
  1059. int TransformDecision (Macroblock *currMB, int block_check, int *cost)
  1060. {
  1061.   int    block_y, block_x, i, j, k;
  1062.   int    mb_y, mb_x, block8x8;  
  1063.   int    list_mode[2];
  1064.   short  list_ref_idx[2], p_dir;
  1065.   int    num_blks;
  1066.   int    cost8x8=0, cost4x4=0;
  1067.   int    *diff_ptr;
  1068.   short bipred_me;
  1069.   imgpel (*mb_pred)[16] = img->mb_pred[0];
  1070.   if(block_check==-1)
  1071.   {
  1072.     block8x8 = 0;
  1073.     num_blks = 4;
  1074.   }
  1075.   else
  1076.   {
  1077.     block8x8 = block_check;
  1078.     num_blks = block_check + 1;
  1079.   }
  1080.   
  1081.   for (; block8x8<num_blks; block8x8++)
  1082.   {
  1083.     SetModesAndRefframe (currMB, block8x8, &p_dir, list_mode, list_ref_idx);
  1084.     bipred_me = currMB->bipred_me[block8x8]; 
  1085.     mb_y = (block8x8 >> 1) << 3;
  1086.     mb_x = (block8x8 & 0x01) << 3;
  1087.         
  1088.     //===== prediction of 8x8 block =====
  1089.     LumaPrediction (currMB, mb_x, mb_y, 8, 8, p_dir, list_mode[0], list_mode[1], list_ref_idx[0], list_ref_idx[1], bipred_me);
  1090.     //===== loop over 4x4 blocks =====
  1091.     for (k=0, block_y=mb_y; block_y<mb_y+8; block_y+=4)
  1092.     {     
  1093.       for (block_x=mb_x; block_x<mb_x+8; block_x+=4)
  1094.       {
  1095.         //===== get displaced frame difference ======
  1096.         diff_ptr=&diff64[k];
  1097.         for (j=block_y; j<block_y + 4; j++)
  1098.         {
  1099.           for (i = block_x; i < block_x + 4; i++, k++)
  1100.             diff64[k] = pCurImg[img->opix_y+j][img->opix_x + i] - mb_pred[j][i];
  1101.         }
  1102.         cost4x4 += distortion4x4 (diff_ptr);
  1103.       }
  1104.     }
  1105.     cost8x8 += distortion8x8 (diff64);
  1106.   }
  1107.   if(params->Transform8x8Mode==2) //always allow 8x8 transform
  1108.     return 1;
  1109.   else if(cost8x8 < cost4x4)
  1110.     return 1;
  1111.   else
  1112.   {
  1113.     *cost += (cost4x4 - cost8x8);
  1114.     return 0;
  1115.   }
  1116. }
  1117. /*!
  1118.  ************************************************************************
  1119.  * brief
  1120.  *    Chroma residual coding for an macroblock
  1121.  ************************************************************************
  1122.  */
  1123. void ChromaResidualCoding (Macroblock *currMB, int is_cavlc)
  1124. {
  1125.   int chroma_cbp;
  1126.   static int   uv, block8, block_y, block_x, j, i;
  1127.   static int   list_mode[2];
  1128.   static short p_dir, list_ref_idx[2];
  1129.   int   skipped = (currMB->mb_type == 0 && (img->type == P_SLICE || img->type == SP_SLICE));
  1130.   int   yuv = img->yuv_format - 1; 
  1131.   short bipred_me;
  1132.   imgpel (*mb_pred)[16] = NULL;
  1133.   
  1134.   for (chroma_cbp = 0, uv=0; uv<2; uv++)
  1135.   {
  1136.     mb_pred = img->mb_pred[ uv + 1];
  1137.     //===== prediction of chrominance blocks ===d==
  1138.     block8 = 0;
  1139.     for (block_y=0; block_y < img->mb_cr_size_y; block_y+=4)
  1140.     for (block_x=0; block_x < img->mb_cr_size_x; block_x+=4)
  1141.     {
  1142.       block8 = block8x8_idx[yuv][block_y>>2][block_x>>2];
  1143.       bipred_me = currMB->bipred_me[block8];
  1144.       SetModesAndRefframe (currMB, block8, &p_dir, list_mode, list_ref_idx);
  1145.       ChromaPrediction4x4 (currMB, uv, block_x, block_y, p_dir, list_mode[0], list_mode[1], list_ref_idx[0], list_ref_idx[1], bipred_me);
  1146.       //ChromaPrediction    (currMB, uv, block_x, block_y, 4, 4, p_dir, l0_mode, l1_mode, l0_ref_idx, l1_ref_idx);
  1147.     }
  1148.     // ==== set chroma residue to zero for skip Mode in SP frames
  1149.     if (img->NoResidueDirect)
  1150.     {
  1151.       for (j=0; j<img->mb_cr_size_y; j++)
  1152.         memcpy(&enc_picture->imgUV[uv][img->pix_c_y+j][img->pix_c_x], mb_pred[j], img->mb_cr_size_x * sizeof(imgpel));
  1153.     }
  1154.     else if (skipped && img->type==SP_SLICE)
  1155.     {
  1156.       for (j=0; j<img->mb_cr_size_y; j++)
  1157.         memset(img->mb_ores[uv + 1][j], 0 , img->mb_cr_size_x * sizeof(int));
  1158.       for (j=0; j<img->mb_cr_size_y; j++)
  1159.         memset(img->mb_rres[uv + 1][j], 0 , img->mb_cr_size_x * sizeof(int));
  1160.     }
  1161.     else if (skipped)
  1162.     {
  1163.       for (j=0; j<img->mb_cr_size_y; j++)
  1164.         memcpy(&enc_picture->imgUV[uv][img->pix_c_y+j][img->pix_c_x], mb_pred[j], img->mb_cr_size_x * sizeof(imgpel));
  1165.     }
  1166.     else
  1167.     {
  1168.       for (j=0; j<img->mb_cr_size_y; j++)
  1169.         for (i=0; i<img->mb_cr_size_x; i++)
  1170.         {
  1171.           img->mb_ores[uv + 1][j][i] = pImgOrg[uv + 1][img->opix_c_y+j][img->opix_c_x+i] - mb_pred[j][i];
  1172.         }
  1173.     }
  1174.     //===== DCT, Quantization, inverse Quantization, IDCT, and Reconstruction =====
  1175.     //===== Call function for skip mode in SP frames to properly process frame ====
  1176.     if (skipped && img->type==SP_SLICE)
  1177.     {
  1178.       if(si_frame_indicator || sp2_frame_indicator)
  1179.         chroma_cbp = dct_chroma_sp2(currMB, uv,chroma_cbp, is_cavlc);
  1180.       else
  1181.         chroma_cbp = dct_chroma_sp(currMB, uv,chroma_cbp, is_cavlc);
  1182.     }
  1183.     else
  1184.     {
  1185.       if (!img->NoResidueDirect && !skipped)
  1186.       {
  1187.         if (img->type!=SP_SLICE || (currMB->mb_type==I16MB ))
  1188.         {
  1189.           //even if the block is intra it should still be treated as SP
  1190.           chroma_cbp = dct_cr_4x4[uv] (currMB, uv,chroma_cbp, is_cavlc);
  1191.         }
  1192.         else
  1193.         {
  1194.           if(si_frame_indicator||sp2_frame_indicator)
  1195.             chroma_cbp=dct_chroma_sp2(currMB, uv,chroma_cbp, is_cavlc);// SI frames or switching SP frames
  1196.           else
  1197.             chroma_cbp=dct_chroma_sp(currMB, uv,chroma_cbp, is_cavlc);
  1198.         }
  1199.       }
  1200.     }
  1201.   }
  1202.   //===== update currMB->cbp =====
  1203.   currMB->cbp += ((chroma_cbp)<<4);
  1204. }
  1205. /*!
  1206.  **************************************************************************************
  1207.  * brief
  1208.  *    RD Decision for Intra prediction mode of the chrominance layers of one macroblock
  1209.  **************************************************************************************
  1210.  */
  1211. void IntraChromaRDDecision (Macroblock *currMB, RD_PARAMS enc_mb)
  1212. {
  1213.   int      i, j, k;
  1214.   imgpel** image;
  1215.   int      block_x, block_y;  
  1216.   int      mb_available_up;
  1217.   int      mb_available_left[2];
  1218.   int      mb_available_up_left;
  1219.   int      uv;
  1220.   int      mode;
  1221.   int      best_mode = DC_PRED_8;  //just an initialization here, should always be overwritten
  1222.   int      cost;
  1223.   int      min_cost;
  1224.   PixelPos up;        //!< pixel position  p(0,-1)
  1225.   PixelPos left[17];  //!< pixel positions p(-1, -1..15)
  1226.   int      cr_MB_x = img->mb_cr_size_x;
  1227.   int      cr_MB_y = img->mb_cr_size_y;
  1228.   static imgpel *img_org, *img_prd;
  1229.   static imgpel (*curr_mpr_16x16)[16][16];
  1230.   for (i=0;i<cr_MB_y+1;i++)
  1231.   {
  1232.     getNeighbour(currMB, -1 , i-1 , img->mb_size[IS_CHROMA], &left[i]);
  1233.   }
  1234.   getNeighbour(currMB, 0 , -1 , img->mb_size[IS_CHROMA], &up);
  1235.   mb_available_up                             = up.available;
  1236.   mb_available_up_left                        = left[0].available;
  1237.   mb_available_left[0] = mb_available_left[1] = left[1].available;
  1238.   if(params->UseConstrainedIntraPred)
  1239.   {
  1240.     mb_available_up = up.available ? img->intra_block[up.mb_addr] : 0;
  1241.     for (i=1, mb_available_left[0] = 1; i < (cr_MB_y>>1) + 1; i++)
  1242.       mb_available_left[0]  &= left[i].available ? img->intra_block[left[i].mb_addr]: 0;
  1243.     for (i=(cr_MB_y>>1) + 1, mb_available_left[1]=1; i < cr_MB_y + 1;i++)
  1244.       mb_available_left[1] &= left[i].available ? img->intra_block[left[i].mb_addr]: 0;
  1245.     mb_available_up_left = left[0].available ? img->intra_block[left[0].mb_addr]: 0;
  1246.   }
  1247.   // pick lowest cost prediction mode
  1248.   min_cost = INT_MAX;
  1249.   for (i=0;i<cr_MB_y;i++)
  1250.   {
  1251.     getNeighbour(currMB, 0, i, img->mb_size[IS_CHROMA], &left[i]);
  1252.   }
  1253.   if ( img->MbaffFrameFlag && img->field_mode )
  1254.   {
  1255.     for (i=0;i<cr_MB_y;i++)
  1256.     {
  1257.       left[i].pos_y = left[i].pos_y >> 1;
  1258.     }
  1259.   }
  1260.   for (mode=DC_PRED_8; mode<=PLANE_8; mode++)
  1261.   {
  1262.     if ((mode==VERT_PRED_8 && !mb_available_up) ||
  1263.       (mode==HOR_PRED_8 && (!mb_available_left[0] || !mb_available_left[1])) ||
  1264.       (mode==PLANE_8 && (!mb_available_left[0] || !mb_available_left[1] || !mb_available_up || !mb_available_up_left)))
  1265.       continue;
  1266.     cost = 0;
  1267.     for (uv = 1; uv < 3; uv++)
  1268.     {
  1269.       image = pImgOrg[uv];
  1270.       curr_mpr_16x16 = img->mpr_16x16[uv];
  1271.       for (block_y=0; block_y<cr_MB_y; block_y+=4)
  1272.       {
  1273.         for (block_x=0; block_x<cr_MB_x; block_x+=4)
  1274.         {
  1275.           for (k=0,j=block_y; j<block_y+4; j++)
  1276.           {
  1277.             img_prd = curr_mpr_16x16[mode][j];
  1278.             img_org = &image[left[j].pos_y][left[j].pos_x];
  1279.             for (i = block_x; i < block_x + 4; i++)
  1280.               diff[k++] = img_org[i] - img_prd[i];
  1281.           }
  1282.           cost += distortion4x4(diff);
  1283.         }
  1284.         if (cost > min_cost) break;
  1285.       }
  1286.       if (cost > min_cost) break;
  1287.     }
  1288.     cost += (int) (enc_mb.lambda_me[Q_PEL] * mvbits[ mode ]); // exp golomb coding cost for mode signaling
  1289.     if (cost < min_cost)
  1290.     {
  1291.       best_mode = mode;
  1292.       min_cost = cost;
  1293.     }
  1294.   }
  1295.   currMB->c_ipred_mode = best_mode;
  1296. }
  1297. /*!
  1298.  ************************************************************************
  1299.  * brief
  1300.  *    Check if all reference frames for a macroblock are zero
  1301.  ************************************************************************
  1302.  */
  1303. int ZeroRef (Macroblock* currMB)
  1304. {
  1305.   int i,j;
  1306.   for (j=img->block_y; j<img->block_y + BLOCK_MULTIPLE; j++)
  1307.   {
  1308.     for (i=img->block_x; i<img->block_x + BLOCK_MULTIPLE; i++)
  1309.     {
  1310.       if (enc_picture->motion.ref_idx[LIST_0][j][i]!=0)
  1311.         return 0;
  1312.     }
  1313.   }
  1314.   return 1;
  1315. }
  1316. /*!
  1317.  ************************************************************************
  1318.  * brief
  1319.  *    Converts macroblock type to coding value
  1320.  ************************************************************************
  1321.  */
  1322. int MBType2Value (Macroblock* currMB)
  1323. {
  1324.   static const int dir1offset[3]    =  { 1,  2, 3};
  1325.   static const int dir2offset[3][3] = {{ 0,  4,  8},   // 1. block forward
  1326.                                        { 6,  2, 10},   // 1. block backward
  1327.                                        {12, 14, 16}};  // 1. block bi-directional
  1328.   int mbtype, pdir0, pdir1;
  1329.   if (img->type!=B_SLICE)
  1330.   {
  1331.     if      (currMB->mb_type==I8MB ||currMB->mb_type==I4MB)
  1332.       return (img->type==I_SLICE ? 0 : 6);
  1333.     else if (currMB->mb_type==I16MB) return (img->type==I_SLICE ? 0 : 6) + img->i16offset;
  1334.     else if (currMB->mb_type==IPCM)  return (img->type==I_SLICE ? 25 : 31);
  1335.     else if (currMB->mb_type==P8x8)
  1336.     {
  1337.       if (img->currentSlice->symbol_mode==CAVLC
  1338.         && ZeroRef (currMB))         return 5;
  1339.       else                           return 4;
  1340.     }
  1341.     else                             return currMB->mb_type;
  1342.   }
  1343.   else
  1344.   {
  1345.     mbtype = currMB->mb_type;
  1346.     pdir0  = currMB->b8pdir[0];
  1347.     pdir1  = currMB->b8pdir[3];
  1348.     if      (mbtype==0)                    return 0;
  1349.     else if (mbtype==I4MB || mbtype==I8MB) return 23;
  1350.     else if (mbtype==I16MB)                return 23 + img->i16offset;
  1351.     else if (mbtype==IPCM)                 return 48;
  1352.     else if (mbtype==P8x8)                 return 22;
  1353.     else if (mbtype==1)                    return dir1offset[pdir0];
  1354.     else if (mbtype==2)                    return 4 + dir2offset[pdir0][pdir1];
  1355.     else                                   return 5 + dir2offset[pdir0][pdir1];
  1356.   }
  1357. }
  1358. /*!
  1359. ************************************************************************
  1360. * brief
  1361. *    Writes 4x4 intra prediction modes for a macroblock
  1362. ************************************************************************
  1363. */
  1364. int writeIntra4x4Modes(Macroblock *currMB)
  1365. {
  1366.   int i;
  1367.   SyntaxElement se;
  1368.   int           *bitCount   = currMB->bitcounter;
  1369.   Slice         *currSlice  = img->currentSlice;
  1370.   const int     *partMap    = assignSE2partition[params->partition_mode];
  1371.   DataPartition *dataPart   = &(currSlice->partArr[partMap[SE_INTRAPREDMODE]]);
  1372.   int rate = 0;
  1373.   currMB->IntraChromaPredModeFlag = 1;
  1374.   for(i=0;i<16;i++)
  1375.   {
  1376.     se.context = i;
  1377.     se.value1  = currMB->intra_pred_modes[i];
  1378.     se.value2  = 0;
  1379. #if TRACE
  1380.     if (se.value1 < 0 )
  1381.       snprintf(se.tracestring, TRACESTRING_SIZE, "Intra 4x4 mode  = predicted (context: %d)",se.context);
  1382.     else
  1383.       snprintf(se.tracestring, TRACESTRING_SIZE, "Intra 4x4 mode  = %3d (context: %d)",se.value1,se.context);
  1384. #endif
  1385.     // set symbol type and function pointers
  1386.     se.type = SE_INTRAPREDMODE;
  1387.     // encode and update rate
  1388.     writeIntraPredMode (&se, dataPart);
  1389.     bitCount[BITS_COEFF_Y_MB]+=se.len;
  1390.     rate += se.len;
  1391.   }
  1392.   return rate;
  1393. }
  1394. /*!
  1395. ************************************************************************
  1396. * brief
  1397. *    Writes 8x8 intra prediction modes for a macroblock
  1398. ************************************************************************
  1399. */
  1400. int writeIntra8x8Modes(Macroblock *currMB)
  1401. {
  1402.   int block8x8;
  1403.   SyntaxElement se;
  1404.   int           *bitCount   = currMB->bitcounter;
  1405.   Slice         *currSlice  = img->currentSlice;
  1406.   const int     *partMap    = assignSE2partition[params->partition_mode];
  1407.   DataPartition *dataPart   = &(currSlice->partArr[partMap[SE_INTRAPREDMODE]]);
  1408.   int rate = 0;
  1409.   currMB->IntraChromaPredModeFlag = 1;
  1410.   for(block8x8 = 0;block8x8 < 16; block8x8 += 4)
  1411.   {
  1412.     se.context = block8x8;
  1413.     se.value1  = currMB->intra_pred_modes8x8[block8x8];
  1414.     se.value2  = 0;
  1415. #if TRACE
  1416.     if (se.value1 < 0 )
  1417.       snprintf(se.tracestring, TRACESTRING_SIZE, "Intra 8x8 mode  = predicted (context: %d)",se.context);
  1418.     else
  1419.       snprintf(se.tracestring, TRACESTRING_SIZE, "Intra 8x8 mode  = %3d (context: %d)",se.value1,se.context);
  1420. #endif
  1421.     // set symbol type and function pointers
  1422.     se.type = SE_INTRAPREDMODE;
  1423.     // encode and update rate
  1424.     writeIntraPredMode (&se, dataPart);
  1425.     bitCount[BITS_COEFF_Y_MB]+=se.len;
  1426.     rate += se.len;
  1427.   }
  1428.   return rate;
  1429. }
  1430. int writeIntraModes(Macroblock *currMB)
  1431. {
  1432.   switch (currMB->mb_type)
  1433.   {
  1434.   case I4MB:
  1435.     return writeIntra4x4Modes(currMB);
  1436.     break;
  1437.   case I8MB:
  1438.     return writeIntra8x8Modes(currMB);
  1439.     break;
  1440.   default:
  1441.     return 0;
  1442.     break;
  1443.   }
  1444. }
  1445. /*!
  1446.  ************************************************************************
  1447.  * brief
  1448.  *    Converts 8x8 block type to coding value
  1449.  ************************************************************************
  1450.  */
  1451. int B8Mode2Value (short b8mode, short b8pdir)
  1452. {
  1453.   static const int b8start[8] = {0,0,0,0, 1, 4, 5, 10};
  1454.   static const int b8inc  [8] = {0,0,0,0, 1, 2, 2, 1};
  1455.   return (img->type!=B_SLICE) ? (b8mode - 4) : b8start[b8mode] + b8inc[b8mode] * b8pdir;
  1456. }
  1457. static int writeIPCMLuma (ImageParameters *img, imgpel **imgY, Bitstream *currStream, SyntaxElement *se, int *bitCount)
  1458. {
  1459.   int i, j;
  1460.   int bit_size = MB_BLOCK_SIZE * MB_BLOCK_SIZE * img->bitdepth_luma;
  1461.   bitCount[BITS_COEFF_Y_MB] += bit_size;
  1462.   se->len   = img->bitdepth_luma;
  1463.   se->type  = SE_MBTYPE;   
  1464.   for (j = img->pix_y; j < img->pix_y + MB_BLOCK_SIZE; j++)
  1465.   {      
  1466.     for (i = img->pix_x; i < img->pix_x + MB_BLOCK_SIZE; i++)
  1467.     {
  1468.       se->bitpattern = imgY[j][i];
  1469.       se->value1 = se->bitpattern;      
  1470. #if TRACE
  1471.       snprintf(se->tracestring, TRACESTRING_SIZE, "pcm_sample_luma (%d %d) = %d", j, i, se->bitpattern);
  1472. #endif
  1473.       writeSE_Fix(se, currStream);
  1474.     }
  1475.   }
  1476.   return bit_size;
  1477. }
  1478. static int writeIPCMChroma (ImageParameters *img, imgpel **imgUV, Bitstream *currStream, SyntaxElement *se, int *bitCount)
  1479. {
  1480.   int i, j;
  1481.   int bit_size = img->mb_cr_size_y * img->mb_cr_size_x * img->bitdepth_luma;
  1482.   bitCount[BITS_COEFF_UV_MB] += bit_size;
  1483.   se->len   = img->bitdepth_chroma;
  1484.   se->type  = SE_MBTYPE;
  1485.   for (j = img->pix_c_y; j < img->pix_c_y + img->mb_cr_size_y; j++)
  1486.   {
  1487.     for (i = img->pix_c_x; i < img->pix_c_x + img->mb_cr_size_x; i++)
  1488.     {
  1489.       se->bitpattern = imgUV[j][i];
  1490.       se->value1 = se->bitpattern;
  1491. #if TRACE
  1492.       //snprintf(se.tracestring, TRACESTRING_SIZE, "pcm_sample_chroma (%s) (%d %d) = %d", uv?"v":"u", j,i,se->bitpattern);
  1493.       snprintf(se->tracestring, TRACESTRING_SIZE, "pcm_sample_chroma (%d %d) = %d", j, i, se->bitpattern);
  1494. #endif
  1495.       writeSE_Fix(se, currStream);
  1496.     }
  1497.   }
  1498.   return bit_size;
  1499. }
  1500. static int writeIPCMByteAlign(Bitstream *currStream, SyntaxElement *se, int *bitCount)
  1501. {
  1502.   if (currStream->bits_to_go < 8)
  1503.   {
  1504.     // This will only happen in the CAVLC case, CABAC is already padded
  1505.     se->type  = SE_MBTYPE;
  1506.     se->len   = currStream->bits_to_go;      
  1507.     bitCount[BITS_COEFF_Y_MB]+= se->len;
  1508.     se->bitpattern = 0;
  1509. #if TRACE
  1510.     snprintf(se->tracestring, TRACESTRING_SIZE, "pcm_alignment_zero_bits = %d", se->len);
  1511. #endif
  1512.     writeSE_Fix(se, currStream);
  1513.     return se->len;
  1514.   }
  1515.   else 
  1516.     return 0;
  1517. }
  1518. /*!
  1519. ************************************************************************
  1520. * brief
  1521. *    Codes macroblock header
  1522. * param currMB
  1523. *    current macroblock
  1524. * param rdopt
  1525. *    true for calls during RD-optimization
  1526. * param coeff_rate
  1527. *    bitrate of Luma and Chroma coeff
  1528. ************************************************************************
  1529. */
  1530. int writeMBLayer (Macroblock *currMB, int rdopt, int *coeff_rate)
  1531. {
  1532.   int             i,j;
  1533.   int             mb_nr      = img->current_mb_nr;
  1534.   int             prev_mb_nr = FmoGetPreviousMBNr(img->current_mb_nr);
  1535.   Macroblock*     prevMB     = mb_nr ? (&img->mb_data[prev_mb_nr]) : NULL;
  1536.   SyntaxElement   se;
  1537.   int*            bitCount   = currMB->bitcounter;
  1538.   Slice*          currSlice  = img->currentSlice;
  1539.   DataPartition*  dataPart;
  1540.   const int*      partMap    = assignSE2partition[params->partition_mode];
  1541.   int             no_bits    = 0;
  1542.   int             skip       = currMB->mb_type ? 0:((img->type == B_SLICE) ? !currMB->cbp:1);
  1543.   int             mb_type;
  1544.   int             prevMbSkipped = 0;
  1545.   int             mb_field_tmp;
  1546.   Macroblock      *topMB = NULL;
  1547.   int             WriteFrameFieldMBInHeader = 0;
  1548.   if (img->MbaffFrameFlag)
  1549.   {
  1550.     if (0==(mb_nr & 0x01))
  1551.     {
  1552.       WriteFrameFieldMBInHeader = 1; // top field
  1553.       prevMbSkipped = 0;
  1554.     }
  1555.     else
  1556.     {
  1557.       if (prevMB->mb_type ? 0:((img->type == B_SLICE) ? !prevMB->cbp:1))
  1558.       {
  1559.         WriteFrameFieldMBInHeader = 1; // bottom, if top was skipped
  1560.       }
  1561.       topMB= &img->mb_data[prev_mb_nr];
  1562.       prevMbSkipped = topMB->skip_flag;
  1563.     }
  1564.   }
  1565.   currMB->IntraChromaPredModeFlag = IS_INTRA(currMB);
  1566.   // choose the appropriate data partition
  1567.   dataPart = &(currSlice->partArr[partMap[SE_MBTYPE]]);
  1568.   if(img->type == I_SLICE)
  1569.   {
  1570.     //========= write mb_aff (I_SLICE) =========
  1571.     if(WriteFrameFieldMBInHeader)
  1572.     {
  1573.       se.value1 = currMB->mb_field;
  1574.       se.value2 = 0;
  1575.       se.type   = SE_MBTYPE;
  1576.       TRACE_SE (se.tracestring, "mb_field_decoding_flag");
  1577.       writeFieldModeInfo(&se, dataPart);
  1578.       bitCount[BITS_MB_MODE] += se.len;
  1579.       no_bits                += se.len;
  1580.     }
  1581.     //========= write mb_type (I_SLICE) =========
  1582.     se.value1  = MBType2Value (currMB);
  1583.     se.value2  = 0;
  1584.     se.type    = SE_MBTYPE;
  1585. #if TRACE
  1586.     snprintf(se.tracestring, TRACESTRING_SIZE,   "mb_type (I_SLICE) (%2d,%2d) = %3d",img->mb_x, img->mb_y, currMB->mb_type);
  1587. #endif
  1588.     writeMB_typeInfo (&se, dataPart);
  1589.     bitCount[BITS_MB_MODE] += se.len;
  1590.     no_bits                += se.len;
  1591.   }
  1592.   // not I_SLICE, CABAC
  1593.   else if (currSlice->symbol_mode == CABAC)
  1594.   {
  1595.     if (img->MbaffFrameFlag && ((img->current_mb_nr & 0x01) == 0||prevMbSkipped))
  1596.     {
  1597.       mb_field_tmp = currMB->mb_field;
  1598.       currMB->mb_field = field_flag_inference(currMB);
  1599.       CheckAvailabilityOfNeighborsCABAC(currMB);
  1600.       currMB->mb_field = mb_field_tmp;
  1601.     }
  1602.     //========= write mb_skip_flag (CABAC) =========
  1603.     mb_type    = MBType2Value (currMB);
  1604.     se.value1  = mb_type;
  1605.     se.value2  = currMB->cbp;
  1606.     se.type    = SE_MBTYPE;
  1607.     TRACE_SE (se.tracestring, "mb_skip_flag");
  1608.     writeMB_skip_flagInfo_CABAC(currMB, &se, dataPart);
  1609.     bitCount[BITS_MB_MODE] += se.len;
  1610.     no_bits                += se.len;
  1611.     CheckAvailabilityOfNeighborsCABAC(currMB);
  1612.     //========= write mb_aff (CABAC) =========
  1613.     if(img->MbaffFrameFlag && !skip) // check for copy mode
  1614.     {
  1615.       if(WriteFrameFieldMBInHeader)
  1616.       {
  1617.         se.value1 = currMB->mb_field;
  1618.         se.value2 = 0;
  1619.         se.type   =  SE_MBTYPE;
  1620.         TRACE_SE(se.tracestring, "mb_field_decoding_flag");
  1621.         writeFieldModeInfo(&se, dataPart);
  1622.         bitCount[BITS_MB_MODE] += se.len;
  1623.         no_bits                += se.len;
  1624.       }
  1625.     }
  1626.     //========= write mb_type (CABAC) =========
  1627.     if (currMB->mb_type != 0 || ((img->type == B_SLICE) && (currMB->cbp != 0 || cmp_cbp[1] !=0 || cmp_cbp[2]!=0 )))
  1628.     {
  1629.       se.value1  = mb_type;
  1630.       se.value2  = 0;
  1631.       se.type    = SE_MBTYPE;
  1632. #if TRACE
  1633.       if (img->type == B_SLICE)
  1634.         snprintf(se.tracestring, TRACESTRING_SIZE, "mb_type (B_SLICE) (%2d,%2d) = %3d",img->mb_x, img->mb_y, currMB->mb_type);
  1635.       else
  1636.         snprintf(se.tracestring, TRACESTRING_SIZE, "mb_type (P_SLICE) (%2d,%2d) = %3d",img->mb_x, img->mb_y, currMB->mb_type);
  1637. #endif
  1638.       writeMB_typeInfo( &se, dataPart);
  1639.       bitCount[BITS_MB_MODE] += se.len;
  1640.       no_bits                += se.len;
  1641.     }
  1642.   }
  1643.   // VLC not intra
  1644.   else if (currMB->mb_type != 0 || ((img->type == B_SLICE) && (currMB->cbp != 0 || cmp_cbp[1] != 0 || cmp_cbp[2]!=0 )))
  1645.   {
  1646.     //===== Run Length Coding: Non-Skipped macroblock =====
  1647.     se.value1  = img->cod_counter;
  1648.     se.value2  = 0;
  1649.     se.type    = SE_MBTYPE;
  1650.     TRACE_SE (se.tracestring, "mb_skip_run");
  1651.     writeSE_UVLC(&se, dataPart);
  1652.     bitCount[BITS_MB_MODE] += se.len;
  1653.     no_bits                += se.len;
  1654.     // Reset cod counter
  1655.     img->cod_counter = 0;
  1656.     // write mb_aff
  1657.     if(img->MbaffFrameFlag && !skip) // check for copy mode
  1658.     {
  1659.       if(WriteFrameFieldMBInHeader)
  1660.       {
  1661.         se.value1 = currMB->mb_field;
  1662.         se.type   =  SE_MBTYPE;
  1663.         TRACE_SE(se.tracestring, "mb_field_decoding_flag");
  1664.         writeSE_Flag (&se, dataPart);
  1665.         bitCount[BITS_MB_MODE] += se.len;
  1666.         no_bits                += se.len;
  1667.       }
  1668.     }
  1669.     // Put out mb mode
  1670.     se.value1  = MBType2Value (currMB);
  1671.     if (img->type != B_SLICE)
  1672.     {
  1673.       se.value1--;
  1674.     }
  1675.     se.type    = SE_MBTYPE;
  1676.     se.value2  = 0;
  1677. #if TRACE
  1678.     if (img->type == B_SLICE)
  1679.       snprintf(se.tracestring, TRACESTRING_SIZE, "mb_type (B_SLICE) (%2d,%2d) = %3d",img->mb_x, img->mb_y, currMB->mb_type);
  1680.     else
  1681.       snprintf(se.tracestring, TRACESTRING_SIZE, "mb_type (P_SLICE) (%2d,%2d) = %3d",img->mb_x, img->mb_y, currMB->mb_type);
  1682. #endif
  1683.     writeMB_typeInfo(&se, dataPart);
  1684.     bitCount[BITS_MB_MODE] += se.len;
  1685.     no_bits                += se.len;
  1686.   }
  1687.   else
  1688.   {
  1689.     //Run Length Coding: Skipped macroblock
  1690.     img->cod_counter++;
  1691.     currMB->skip_flag = 1;
  1692.     // CAVLC
  1693.     for (j=0; j < (4 + img->num_blk8x8_uv); j++)
  1694.       for (i=0; i < 4; i++)
  1695.         img->nz_coeff [img->current_mb_nr][i][j]=0;
  1696.     if(FmoGetNextMBNr(img->current_mb_nr) == -1 && img->cod_counter>0)
  1697.     {
  1698.       // Put out run
  1699.       se.value1  = img->cod_counter;
  1700.       se.value2  = 0;
  1701.       se.type    = SE_MBTYPE;
  1702.       TRACE_SE(se.tracestring, "mb_skip_run");
  1703.       writeSE_UVLC(&se, dataPart);
  1704.       bitCount[BITS_MB_MODE] += se.len;
  1705.       no_bits                += se.len;
  1706.       // Reset cod counter
  1707.       img->cod_counter = 0;
  1708.     }
  1709.   }
  1710.   //init NoMbPartLessThan8x8Flag
  1711.   currMB->NoMbPartLessThan8x8Flag = (IS_DIRECT(currMB) && !(active_sps->direct_8x8_inference_flag))? 0: 1;
  1712.   if (currMB->mb_type == IPCM)
  1713.   {
  1714.     dataPart = &(currSlice->partArr[partMap[SE_LUM_DC_INTRA]]);
  1715.     if (currSlice->symbol_mode == CABAC)
  1716.     {
  1717.       int len;
  1718.       EncodingEnvironmentPtr eep = &dataPart->ee_cabac;
  1719.       len = arienco_bits_written(eep);
  1720.       arienco_done_encoding(eep); // This pads to byte
  1721.       len = arienco_bits_written(eep) - len;
  1722.       no_bits += len;
  1723.       // Now restart the encoder
  1724.       arienco_start_encoding(eep, dataPart->bitstream->streamBuffer, &(dataPart->bitstream->byte_pos));
  1725.     }
  1726.     writeIPCMByteAlign(dataPart->bitstream, &se, bitCount);
  1727.     no_bits += writeIPCMLuma (img, enc_picture->imgY, dataPart->bitstream, &se, bitCount);
  1728.     if ((active_sps->chroma_format_idc != YUV400) && !IS_INDEPENDENT(params))
  1729.     {
  1730.       int uv;
  1731.       for (uv = 0; uv < 2; uv ++)
  1732.       {
  1733.         no_bits += writeIPCMChroma (img, enc_picture->imgUV[uv], dataPart->bitstream, &se, bitCount);
  1734.       }
  1735.     }
  1736.     return no_bits;
  1737.   }
  1738.   dataPart = &(currSlice->partArr[partMap[SE_MBTYPE]]);
  1739.   //===== BITS FOR 8x8 SUB-PARTITION MODES =====
  1740.   if (IS_P8x8 (currMB))
  1741.   {
  1742.     for (i=0; i<4; i++)
  1743.     {
  1744.       se.value1  = B8Mode2Value (currMB->b8mode[i], currMB->b8pdir[i]);
  1745.       se.value2  = 0;
  1746.       se.type    = SE_MBTYPE;
  1747. #if TRACE
  1748.       snprintf(se.tracestring, TRACESTRING_SIZE, "8x8 mode/pdir(%2d) = %3d/%d", i, currMB->b8mode[i], currMB->b8pdir[i]);
  1749. #endif
  1750.       writeB8_typeInfo (&se, dataPart);
  1751.       bitCount[BITS_MB_MODE]+= se.len;
  1752.       no_bits               += se.len;
  1753.       //set NoMbPartLessThan8x8Flag for P8x8 mode
  1754.       currMB->NoMbPartLessThan8x8Flag &= (currMB->b8mode[i]==0 && active_sps->direct_8x8_inference_flag) ||
  1755.         (currMB->b8mode[i]==4);
  1756.     }
  1757.     no_bits += writeMotionInfo2NAL  (currMB);
  1758.   }
  1759.   //============= Transform size flag for INTRA MBs =============
  1760.   //-------------------------------------------------------------
  1761.   //transform size flag for INTRA_4x4 and INTRA_8x8 modes
  1762.   if ((currMB->mb_type == I8MB || currMB->mb_type == I4MB) && params->Transform8x8Mode)
  1763.   {
  1764.     se.value1 = currMB->luma_transform_size_8x8_flag;
  1765.     se.type   = SE_MBTYPE;
  1766. #if TRACE
  1767.     snprintf(se.tracestring, TRACESTRING_SIZE, "transform_size_8x8_flag = %3d", currMB->luma_transform_size_8x8_flag);
  1768. #endif
  1769.     writeMB_transform_size(&se, dataPart);
  1770.     bitCount[BITS_MB_MODE] += se.len;
  1771.     no_bits                += se.len;
  1772.   }
  1773.   //===== BITS FOR INTRA PREDICTION MODES ====
  1774.   no_bits += writeIntraModes(currMB);
  1775.   //===== BITS FOR CHROMA INTRA PREDICTION MODE ====
  1776.   if (currMB->IntraChromaPredModeFlag && ((active_sps->chroma_format_idc != YUV400) && (active_sps->chroma_format_idc != YUV444)))
  1777.     no_bits += writeChromaIntraPredMode(currMB);
  1778.   else if(!rdopt) //GB CHROMA !!!!!
  1779.     currMB->c_ipred_mode = DC_PRED_8; //setting c_ipred_mode to default is not the right place here
  1780.                                       //resetting in rdopt.c (but where ??)
  1781.                                       //with cabac and bframes maybe it could crash without this default
  1782.                                       //since cabac needs the right neighborhood for the later MBs
  1783.   //----- motion information -----
  1784.   if (currMB->mb_type !=0 && currMB->mb_type !=P8x8)
  1785.   {
  1786.     no_bits  += writeMotionInfo2NAL  (currMB);
  1787.   }
  1788.   if ((currMB->mb_type!=0) || (img->type==B_SLICE && (currMB->cbp!=0 || cmp_cbp[1]!=0 || cmp_cbp[2]!=0)))
  1789.   {
  1790.     *coeff_rate = writeCBPandDquant (currMB);
  1791.     *coeff_rate += writeCoeff16x16 ( currMB, PLANE_Y, currMB->cbp );
  1792.     if ((active_sps->chroma_format_idc != YUV400) && (!IS_INDEPENDENT(params)))
  1793.     {
  1794.       if(active_sps->chroma_format_idc==YUV444)
  1795.       {
  1796.         *coeff_rate += writeCoeff16x16(currMB,PLANE_U, currMB->cbp);
  1797.         *coeff_rate += writeCoeff16x16(currMB,PLANE_V, currMB->cbp);
  1798.       }
  1799.       else
  1800.         *coeff_rate  += writeChromaCoeff (currMB);
  1801.     }
  1802.     no_bits  += *coeff_rate;
  1803.   }
  1804.   return no_bits;
  1805. }
  1806. void write_terminating_bit (short bit)
  1807. {
  1808.   DataPartition*          dataPart;
  1809.   const int*              partMap   = assignSE2partition[params->partition_mode];
  1810.   EncodingEnvironmentPtr  eep_dp;
  1811.   //--- write non-slice termination symbol if the macroblock is not the first one in its slice ---
  1812.   dataPart = &(img->currentSlice->partArr[partMap[SE_MBTYPE]]);
  1813.   dataPart->bitstream->write_flag = 1;
  1814.   eep_dp                          = &(dataPart->ee_cabac);
  1815.   biari_encode_symbol_final(eep_dp, bit);
  1816. #if TRACE
  1817.   fprintf (p_trace, "      CABAC terminating bit = %dn",bit);
  1818. #endif
  1819. }
  1820. /*!
  1821.  ************************************************************************
  1822.  * brief
  1823.  *    Write chroma intra prediction mode.
  1824.  ************************************************************************
  1825.  */
  1826. int writeChromaIntraPredMode(Macroblock* currMB)
  1827. {
  1828.   SyntaxElement   se;
  1829.   Slice*          currSlice = img->currentSlice;
  1830.   int*            bitCount  = currMB->bitcounter;
  1831.   const int*      partMap   = assignSE2partition[params->partition_mode];
  1832.   int             rate      = 0;
  1833.   DataPartition*  dataPart;
  1834.   //===== BITS FOR CHROMA INTRA PREDICTION MODES
  1835.   se.value1 = currMB->c_ipred_mode;
  1836.   se.value2 = 0;
  1837.   se.type = SE_INTRAPREDMODE;
  1838.   dataPart = &(currSlice->partArr[partMap[SE_INTRAPREDMODE]]);
  1839.   TRACE_SE(se.tracestring, "intra_chroma_pred_mode");
  1840.   writeCIPredMode(&se, dataPart);
  1841.   bitCount[BITS_COEFF_UV_MB] += se.len;
  1842.   rate                       += se.len;
  1843.   return rate;
  1844. }
  1845. /*!
  1846.  ************************************************************************
  1847.  * brief
  1848.  *    Passes the chosen syntax elements to the NAL
  1849.  ************************************************************************
  1850.  */
  1851. void write_one_macroblock (Macroblock* currMB, int eos_bit, Boolean prev_recode_mb)
  1852. {
  1853.   int*        bitCount = currMB->bitcounter;
  1854.   int i;
  1855.   extern int cabac_encoding;
  1856.   // enable writing of trace file
  1857. #if TRACE
  1858.   Slice *curr_slice = img->currentSlice;
  1859.   if ( prev_recode_mb == FALSE )
  1860.   {
  1861.     for (i=0; i<curr_slice->max_part_nr; i++)
  1862.     {
  1863.       curr_slice->partArr[i].bitstream->trace_enabled = TRUE;
  1864.     }
  1865.   }
  1866. #endif
  1867.   //--- constrain intra prediction ---
  1868.   if(params->UseConstrainedIntraPred && (img->type==P_SLICE || img->type==B_SLICE))
  1869.   {
  1870.     img->intra_block[img->current_mb_nr] = IS_INTRA(currMB);
  1871.   }
  1872.   //===== init and update number of intra macroblocks =====
  1873.   if (img->current_mb_nr==0)
  1874.     intras=0;
  1875.   if (IS_INTRA(currMB))
  1876.     intras++;
  1877.   //--- write non-slice termination symbol if the macroblock is not the first one in its slice ---
  1878.   if (img->currentSlice->symbol_mode==CABAC && img->current_mb_nr!=img->currentSlice->start_mb_nr && eos_bit)
  1879.   {
  1880.     write_terminating_bit (0);
  1881.   }
  1882. #if TRACE
  1883.   // trace: write macroblock header
  1884.   if (p_trace)
  1885.   {
  1886.     fprintf(p_trace, "n*********** Pic: %i (I/P) MB: %i Slice: %i **********nn", frame_no, img->current_mb_nr, img->current_slice_nr);
  1887.   }
  1888. #endif
  1889.   cabac_encoding = 1;
  1890.   //--- write macroblock ---
  1891.   writeMBLayer (currMB, 0, &i);  // i is temporary
  1892.   if (!((currMB->mb_type !=0 ) || ((img->type==B_SLICE) && currMB->cbp != 0) ))
  1893.   {
  1894.     for (i=0; i < 4; i++)
  1895.       memset(img->nz_coeff [img->current_mb_nr][i], 0, (4 + img->num_blk8x8_uv) * sizeof(int));  // CAVLC
  1896.   }
  1897.   //--- set total bit-counter ---
  1898.   bitCount[BITS_TOTAL_MB] = bitCount[BITS_MB_MODE       ]  
  1899.                           + bitCount[BITS_COEFF_Y_MB    ]
  1900.                           + bitCount[BITS_INTER_MB      ] 
  1901.                           + bitCount[BITS_CBP_MB        ]
  1902.                           + bitCount[BITS_DELTA_QUANT_MB] 
  1903.                           + bitCount[BITS_COEFF_UV_MB   ]
  1904.                           + bitCount[BITS_COEFF_CB_MB   ] 
  1905.                           + bitCount[BITS_COEFF_CR_MB   ];
  1906.   if ( params->RCEnable )
  1907.     rc_update_mb_stats( currMB, bitCount );  
  1908.   /*record the total number of MBs*/
  1909.   img->NumberofCodedMacroBlocks++;
  1910.   stats->bit_slice += bitCount[BITS_TOTAL_MB];
  1911.   cabac_encoding = 0;
  1912. }
  1913. /*!
  1914.  ************************************************************************
  1915.  * brief
  1916.  *    Codes the reference frame
  1917.  ************************************************************************
  1918.  */
  1919. int writeReferenceFrame (Macroblock* currMB, int mode, int i, int j, int fwd_flag, int  ref)
  1920. {
  1921.   SyntaxElement   se;
  1922.   Slice*          currSlice = img->currentSlice;
  1923.   int*            bitCount  = currMB->bitcounter;
  1924.   const int*      partMap   = assignSE2partition[params->partition_mode];
  1925.   int             rate      = 0;
  1926.   DataPartition*  dataPart  = &(currSlice->partArr[partMap[SE_REFFRAME]]);
  1927.   int             list       = ( fwd_flag ? LIST_0 + currMB->list_offset: LIST_1 + currMB->list_offset);
  1928.   se.value1  = ref;
  1929.   se.type    = SE_REFFRAME;
  1930.   se.value2 = (fwd_flag)? LIST_0: LIST_1;
  1931.   img->subblock_x = i; // position used for context determination
  1932.   img->subblock_y = j; // position used for context determination
  1933. #if TRACE
  1934.   if (fwd_flag)
  1935.     snprintf(se.tracestring, TRACESTRING_SIZE, "ref_idx_l0 = %d", se.value1);
  1936.   else
  1937.     snprintf(se.tracestring, TRACESTRING_SIZE, "ref_idx_l1 = %d", se.value1);
  1938. #endif
  1939.   writeRefFrame[list](&se, dataPart);
  1940.   bitCount[BITS_INTER_MB] += se.len;
  1941.   rate                    += se.len;
  1942.   return rate;
  1943. }
  1944. /*!
  1945.  ************************************************************************
  1946.  * brief
  1947.  *    Writes motion vectors of an 8x8 block
  1948.  ************************************************************************
  1949.  */
  1950. int writeMotionVector8x8 (Macroblock *currMB, 
  1951.                           int  i0,
  1952.                           int  j0,
  1953.                           int  i1,
  1954.                           int  j1,
  1955.                           int  refframe,
  1956.                           int  list_idx,
  1957.                           int  mv_mode,
  1958.                           short bipred_me
  1959.                           )
  1960. {
  1961.   int            i, j, k, l, m;
  1962.   int            curr_mvd;
  1963.   DataPartition* dataPart;
  1964.   int            rate       = 0;
  1965.   int            step_h     = params->part_size[mv_mode][0];
  1966.   int            step_v     = params->part_size[mv_mode][1];
  1967.   SyntaxElement  se;
  1968.   Slice*         currSlice  = img->currentSlice;
  1969.   int*           bitCount   = currMB->bitcounter;
  1970.   const int*     partMap    = assignSE2partition[params->partition_mode];
  1971.   int            refindex   = refframe;
  1972.   short******    all_mv     = img->all_mv;
  1973.   short******    pred_mv    = img->pred_mv;  
  1974.   if (bipred_me && is_bipred_enabled(mv_mode) && refindex == 0)
  1975.     all_mv = img->bipred_mv[bipred_me - 1]; 
  1976.   for (j = j0; j < j1; j += step_v)
  1977.   {
  1978.     img->subblock_y = j; // position used for context determination    
  1979.     for (i = i0; i < i1; i += step_h)
  1980.     {
  1981.       img->subblock_x = i; // position used for context determination      
  1982.       for (k=0; k<2; k++)
  1983.       {
  1984.         curr_mvd = all_mv[list_idx][refindex][mv_mode][j][i][k] - pred_mv[list_idx][refindex][mv_mode][j][i][k];
  1985.         //--- store (oversampled) mvd ---
  1986.         for (l = j; l < j + step_v; l++)
  1987.         {
  1988.           for (m = i; m < i + step_h; m++)
  1989.           {
  1990.             currMB->mvd[list_idx][l][m][k] = curr_mvd;
  1991.           }
  1992.         }
  1993.         dataPart = &(currSlice->partArr[partMap[SE_MVD]]);        
  1994.         se.value1 = curr_mvd;
  1995.         se.value2  = 2 * k + list_idx; // identifies the component and the direction; only used for context determination
  1996.         se.type   = SE_MVD;
  1997. #if TRACE
  1998.         if (!list_idx)
  1999.           snprintf(se.tracestring, TRACESTRING_SIZE, "mvd_l0 (%d) = %3d  (org_mv %3d pred_mv %3d)",k, curr_mvd, all_mv[list_idx][refindex][mv_mode][j][i][k], pred_mv[list_idx][refindex][mv_mode][j][i][k]);
  2000.         else
  2001.           snprintf(se.tracestring, TRACESTRING_SIZE, "mvd_l1 (%d) = %3d  (org_mv %3d pred_mv %3d)",k, curr_mvd, all_mv[list_idx][refindex][mv_mode][j][i][k], pred_mv[list_idx][refindex][mv_mode][j][i][k]);
  2002. #endif
  2003.         writeMVD (&se, dataPart);
  2004.         bitCount[BITS_INTER_MB] += se.len;
  2005.         rate                    += se.len;
  2006.       }
  2007.     }
  2008.   }
  2009.   return rate;
  2010. }
  2011. /*!
  2012.  ************************************************************************
  2013.  * brief
  2014.  *    Writes motion info
  2015.  ************************************************************************
  2016.  */
  2017. int writeMotionInfo2NAL (Macroblock* currMB)
  2018. {
  2019.   int   k, j0, i0;
  2020.   int   no_bits         = 0;
  2021.   int   bframe          = (img->type==B_SLICE);
  2022.   int   step_h0         = (params->blc_size[IS_P8x8(currMB) ? 4 : currMB->mb_type][0] >> 2);
  2023.   int   step_v0         = (params->blc_size[IS_P8x8(currMB) ? 4 : currMB->mb_type][1] >> 2);
  2024.   char  *cref_idx;
  2025.   //=== If multiple ref. frames, write reference frame for the MB ===
  2026.   if (IS_INTERMV (currMB))
  2027.   {
  2028.     // if CAVLC is turned on, a 8x8 macroblock with all ref=0 in a P-frame is signalled in macroblock mode
  2029.     if (!IS_P8x8 (currMB) || !ZeroRef (currMB) || img->currentSlice->symbol_mode==CABAC || bframe)
  2030.     {
  2031.       for (j0 = 0; j0 < 4; j0 += step_v0)
  2032.       {
  2033.         cref_idx = &enc_picture->motion.ref_idx[LIST_0][img->block_y + j0][img->block_x];
  2034.         for (i0 = 0; i0 < 4; i0 += step_h0)
  2035.         {
  2036.           k = j0 + (i0 >> 1);
  2037.           if ((currMB->b8pdir[k]==0 || currMB->b8pdir[k]==2) && currMB->b8mode[k]!=0)//has forward vector
  2038.           {
  2039.             no_bits += writeReferenceFrame (currMB, currMB->b8mode[k], i0, j0, 1, cref_idx[i0]);
  2040.           }
  2041.         }
  2042.       }
  2043.       for (j0 = 0; j0 < 4; j0 += step_v0)
  2044.       {        
  2045.         cref_idx = &enc_picture->motion.ref_idx[LIST_1][img->block_y + j0][img->block_x];
  2046.         for (i0 = 0; i0 < 4; i0 += step_h0)
  2047.         {
  2048.           k = j0 + (i0 >> 1);
  2049.           if ((currMB->b8pdir[k] == 1 || currMB->b8pdir[k] == 2) && currMB->b8mode[k]!=0)//has backward vector
  2050.           {
  2051.             no_bits += writeReferenceFrame (currMB, currMB->b8mode[k], i0, j0, 0, cref_idx[i0]);
  2052.           }
  2053.         }
  2054.       }
  2055.     }
  2056.   }
  2057.   //===== write forward motion vectors =====
  2058.   if (IS_INTERMV (currMB))
  2059.   {
  2060.     for (j0=0; j0<4; j0+=step_v0)
  2061.     {
  2062.       cref_idx = &enc_picture->motion.ref_idx[LIST_0][img->block_y + j0][img->block_x];
  2063.       for (i0=0; i0<4; i0+=step_h0)
  2064.       {
  2065.         k=j0+(i0 >> 1);
  2066.         if ((currMB->b8pdir[k]==0 || currMB->b8pdir[k]==2) && currMB->b8mode[k]!=0)//has forward vector
  2067.         {
  2068.           no_bits  += writeMotionVector8x8 (currMB, i0, j0, i0 + step_h0, j0 + step_v0, cref_idx[i0], LIST_0, currMB->b8mode[k], currMB->bipred_me[k]);
  2069.         }
  2070.       }
  2071.     }
  2072.   }
  2073.   //===== write backward motion vectors =====
  2074.   if (IS_INTERMV (currMB) && bframe)
  2075.   {
  2076.     for (j0=0; j0<4; j0+=step_v0)
  2077.     {
  2078.       cref_idx = &enc_picture->motion.ref_idx[LIST_1][img->block_y + j0][img->block_x];
  2079.       for (i0=0; i0<4; i0+=step_h0)
  2080.       {
  2081.         k=j0+(i0 >> 1);
  2082.         if ((currMB->b8pdir[k]==1 || currMB->b8pdir[k]==2) && currMB->b8mode[k]!=0)//has backward vector
  2083.         {          
  2084.           no_bits  += writeMotionVector8x8 (currMB, i0, j0, i0+step_h0, j0+step_v0, cref_idx[i0], LIST_1, currMB->b8mode[k], currMB->bipred_me[k]);
  2085.         }
  2086.       }
  2087.     }
  2088.   }
  2089.   return no_bits;
  2090. }
  2091. /*!
  2092.  ************************************************************************
  2093.  * brief
  2094.  *    Writes chrominance coefficients
  2095.  ************************************************************************
  2096.  */
  2097. int writeChromaCoeff (Macroblock* currMB)
  2098. {
  2099.   int             rate      = 0;
  2100.   SyntaxElement   se;
  2101.   int*            bitCount  = currMB->bitcounter;
  2102.   Slice*          currSlice = img->currentSlice;
  2103.   const int*      partMap   = assignSE2partition[params->partition_mode];
  2104.   int             cbp       = currMB->cbp;
  2105.   DataPartition*  dataPart;
  2106.   int   level, run;
  2107.   int   k, uv;
  2108.   int   b8, b4, param;
  2109.   int*  ACLevel;
  2110.   int*  ACRun;
  2111.   int*  DCLevel;
  2112.   int*  DCRun;
  2113.   static const int   chroma_dc_context[3]={CHROMA_DC, CHROMA_DC_2x4, CHROMA_DC_4x4};
  2114.   int   yuv = img->yuv_format - 1;
  2115.   static const unsigned char chroma_ac_param[3][8][4] =
  2116.   {
  2117.    {{ 4, 20,  5, 21},
  2118.     {36, 52, 37, 53},
  2119.     { 0,  0,  0,  0},
  2120.     { 0,  0,  0,  0},
  2121.     { 0,  0,  0,  0},
  2122.     { 0,  0,  0,  0},
  2123.     { 0,  0,  0,  0},
  2124.     { 0,  0,  0,  0}},
  2125.    {{ 4, 20,  5, 21},
  2126.     { 6, 22,  7, 23},
  2127.     {36, 52, 37, 53},
  2128.     {38, 54, 39, 55},
  2129.     { 0,  0,  0,  0},
  2130.     { 0,  0,  0,  0},
  2131.     { 0,  0,  0,  0},
  2132.     { 0,  0,  0,  0}},
  2133.    {{ 4, 20,  5, 21},
  2134.     {36, 52, 37, 53},
  2135.     { 6, 22,  7, 23},
  2136.     {38, 54, 39, 55},
  2137.     { 8, 24,  9, 25},
  2138.     {40, 56, 41, 57},
  2139.     {10, 26, 11, 27},
  2140.     {42, 58, 43, 59}}
  2141.   };
  2142.   //=====
  2143.   //=====   D C - C O E F F I C I E N T S
  2144.   //=====
  2145.   if (cbp > 15)  // check if any chroma bits in coded block pattern is set
  2146.   {
  2147.     if (currSlice->symbol_mode == CAVLC)
  2148.     {
  2149.       for (uv=0; uv < 2; uv++)
  2150.       {
  2151.         param = uv;
  2152.         rate += writeCoeff4x4_CAVLC (currMB, CHROMA_DC, 0, 0, param);
  2153.         // CAVLC
  2154.       }
  2155.     }
  2156.     else
  2157.     {
  2158.       for (uv=0; uv < 2; uv++)
  2159.       {
  2160.         DCLevel = img->cofDC[uv+1][0];
  2161.         DCRun   = img->cofDC[uv+1][1];
  2162.         level=1;
  2163.         for (k=0; k <= img->num_cdc_coeff && level != 0; ++k)
  2164.         {
  2165.           level = se.value1 = DCLevel[k]; // level
  2166.           run   = se.value2 = DCRun  [k]; // run
  2167.           se.context         = chroma_dc_context[yuv];
  2168.           se.type             = (IS_INTRA(currMB) ? SE_CHR_DC_INTRA : SE_CHR_DC_INTER);
  2169.           img->is_intra_block =  IS_INTRA(currMB);
  2170.           img->is_v_block     = uv;
  2171.           // choose the appropriate data partition
  2172.           dataPart = &(currSlice->partArr[partMap[se.type]]);
  2173. #if TRACE
  2174.           snprintf(se.tracestring, TRACESTRING_SIZE, "DC Chroma %2d: level =%3d run =%2d",k, level, run);
  2175. #endif
  2176.           writeRunLevel_CABAC(currMB, &se, dataPart);
  2177.           bitCount[BITS_COEFF_UV_MB] += se.len;
  2178.           rate                       += se.len;
  2179.         }
  2180.       }
  2181.     }
  2182.   }
  2183.   //=====
  2184.   //=====   A C - C O E F F I C I E N T S
  2185.   //=====
  2186.   uv=-1;
  2187.   if (cbp >> 4 == 2) // check if chroma bits in coded block pattern = 10b
  2188.   {
  2189.     if (currSlice->symbol_mode == CAVLC)
  2190.     {
  2191.       for (b8=4; b8 < (4+img->num_blk8x8_uv); b8++)
  2192.       {
  2193.         for (b4=0; b4 < 4; b4++)
  2194.         {
  2195.           param = chroma_ac_param[yuv][b8-4][b4];
  2196.           rate += writeCoeff4x4_CAVLC (currMB, CHROMA_AC, b8, b4, param);
  2197.           // CAVLC
  2198.         }
  2199.       }
  2200.     }
  2201.     else
  2202.     {
  2203.       for (b8=4; b8 < (4+img->num_blk8x8_uv); b8++)
  2204.       {
  2205.         for (b4=0; b4 < 4; b4++)
  2206.         {
  2207.           ACLevel = img->cofAC[b8][b4][0];
  2208.           ACRun   = img->cofAC[b8][b4][1];
  2209.           level=1;
  2210.           uv++;
  2211.           img->subblock_y = subblk_offset_y[yuv][b8-4][b4]>>2;
  2212.           img->subblock_x = subblk_offset_x[yuv][b8-4][b4]>>2;
  2213.           for (k=0; k < 16 && level != 0; k++)
  2214.           {
  2215.             level = se.value1 = ACLevel[k]; // level
  2216.             run   = se.value2 = ACRun  [k]; // run
  2217.             se.context          = CHROMA_AC;
  2218.             se.type             = (IS_INTRA(currMB) ? SE_CHR_AC_INTRA : SE_CHR_AC_INTER);
  2219.             img->is_intra_block =  IS_INTRA(currMB);
  2220.             img->is_v_block     = (uv>=(img->num_blk8x8_uv<<1));
  2221.             // choose the appropriate data partition
  2222.             dataPart = &(currSlice->partArr[partMap[se.type]]);
  2223. #if TRACE
  2224.             snprintf(se.tracestring, TRACESTRING_SIZE, "AC Chroma %2d: level =%3d run =%2d",k, level, run);
  2225. #endif
  2226.             writeRunLevel_CABAC(currMB, &se, dataPart);
  2227.             bitCount[BITS_COEFF_UV_MB] += se.len;
  2228.             rate                       += se.len;
  2229.           }
  2230.         }
  2231.       }
  2232.     }
  2233.   }
  2234.   return rate;
  2235. }
  2236. /*!
  2237.  ************************************************************************
  2238.  * brief
  2239.  *    Writes Coeffs of an 4x4 block
  2240.  ************************************************************************
  2241.  */
  2242. int writeCoeff4x4_CABAC (Macroblock* currMB, ColorPlane plane, int b8, int b4, int intra4x4mode)
  2243. {
  2244.   int             rate      = 0;
  2245.   SyntaxElement   se;
  2246.   Slice*          currSlice = img->currentSlice;
  2247.   const int*      partMap   = assignSE2partition[params->partition_mode];
  2248.   int*            bitCount  = currMB->bitcounter;
  2249.   DataPartition*  dataPart;
  2250.   int level, run;
  2251.   int k;
  2252.   int pl_off=plane<<2;
  2253.   int bits_coeff_mb = ((plane==0) ? (BITS_COEFF_Y_MB) : ((plane==1) ? BITS_COEFF_CB_MB : BITS_COEFF_CR_MB));
  2254.   int*  ACLevel = img->cofAC[b8+pl_off][b4][0];
  2255.   int*  ACRun   = img->cofAC[b8+pl_off][b4][1];
  2256.   img->subblock_x = ((b8&0x1)==0) ? (((b4&0x1)==0)? 0: 1) : (((b4&0x1)==0)? 2: 3); // horiz. position for coeff_count context
  2257.   img->subblock_y = (b8<2)        ? ((b4<2)       ? 0: 1) : ((b4<2)       ? 2: 3); // vert.  position for coeff_count context
  2258.   level=1; // get inside loop
  2259.   for(k=0; k<=16 && level !=0; k++)
  2260.   {
  2261.     level = se.value1 = ACLevel[k]; // level
  2262.     run   = se.value2 = ACRun  [k]; // run
  2263.     se.context     = ((plane==0)?(LUMA_4x4):((plane==1)?CB_4x4:CR_4x4));
  2264.     se.type        = (k==0
  2265.       ? (intra4x4mode ? SE_LUM_DC_INTRA : SE_LUM_DC_INTER)
  2266.       : (intra4x4mode ? SE_LUM_AC_INTRA : SE_LUM_AC_INTER));
  2267.     img->is_intra_block = intra4x4mode;
  2268.     // choose the appropriate data partition
  2269.     dataPart = &(currSlice->partArr[partMap[se.type]]);
  2270. #if TRACE
  2271.     if (plane == 0)
  2272.     snprintf(se.tracestring, TRACESTRING_SIZE, "Luma sng(%2d) level =%3d run =%2d", k, level,run);
  2273.     else if (plane == 1)
  2274.     snprintf(se.tracestring, TRACESTRING_SIZE, "Cb   sng(%2d) level =%3d run =%2d", k, level,run);
  2275.     else
  2276.     snprintf(se.tracestring, TRACESTRING_SIZE, "Cr   sng(%2d) level =%3d run =%2d", k, level,run);        
  2277. #endif
  2278.     writeRunLevel_CABAC(currMB, &se, dataPart);
  2279.     bitCount[bits_coeff_mb] += se.len;
  2280.     rate                    += se.len;
  2281.   }
  2282.   return rate;
  2283. }
  2284. /*!
  2285. ************************************************************************
  2286. * brief
  2287. *    Writes coefficients of an 8x8 block (CABAC)
  2288. ************************************************************************
  2289. */
  2290. int writeCoeff8x8_CABAC (Macroblock* currMB, ColorPlane plane, int b8, int intra_mode)
  2291. {
  2292.   int             rate      = 0;
  2293.   SyntaxElement   se;
  2294.   Slice*          currSlice = img->currentSlice;
  2295.   const int*      partMap   = assignSE2partition[params->partition_mode];
  2296.   int*            bitCount  = currMB->bitcounter;
  2297.   DataPartition*  dataPart;
  2298.   int   level, run;
  2299.   int   k;
  2300.   int pl_off=plane<<2;
  2301.   int bits_coeff_mb = ((plane == 0) ? (BITS_COEFF_Y_MB) : ((plane == 1) ? BITS_COEFF_CB_MB : BITS_COEFF_CR_MB));
  2302.   int*  ACLevel = img->cofAC[b8+pl_off][0][0];
  2303.   int*  ACRun   = img->cofAC[b8+pl_off][0][1];
  2304.   img->subblock_x = ((b8&0x1)==0)?0:2;  // horiz. position for coeff_count context
  2305.   img->subblock_y = (b8<2)?0:2;     // vert.  position for coeff_count context
  2306.   level=1; // get inside loop
  2307.   for(k=0; k<=64 && level !=0; k++)
  2308.   {
  2309.     level = se.value1 = ACLevel[k]; // level
  2310.     run   = se.value2 = ACRun  [k]; // run
  2311.     se.context     = ((plane==0)?(LUMA_8x8):((plane==1)?CB_8x8:CR_8x8));
  2312.     se.type        = (k==0
  2313.       ? (intra_mode ? SE_LUM_DC_INTRA : SE_LUM_DC_INTER)
  2314.       : (intra_mode ? SE_LUM_AC_INTRA : SE_LUM_AC_INTER));
  2315.     img->is_intra_block = intra_mode;
  2316.     // choose the appropriate data partition
  2317.     dataPart = &(currSlice->partArr[partMap[img->type != B_SLICE ? se.type : SE_BFRAME]]);
  2318. #if TRACE
  2319.     if (plane == 0)
  2320.     snprintf(se.tracestring, TRACESTRING_SIZE, "Luma8x8 sng(%2d) level =%3d run =%2d", k, level,run);
  2321.     else if (plane == 1)
  2322.     snprintf(se.tracestring, TRACESTRING_SIZE, "Cb8x8   sng(%2d) level =%3d run =%2d", k, level,run);
  2323.     else
  2324.     snprintf(se.tracestring, TRACESTRING_SIZE, "Cr8x8   sng(%2d) level =%3d run =%2d", k, level,run);        
  2325. #endif
  2326.     writeRunLevel_CABAC(currMB, &se, dataPart);
  2327.     bitCount[bits_coeff_mb] += se.len;
  2328.     rate                      += se.len;
  2329.   }
  2330.   return rate;
  2331. }
  2332. /*!
  2333. ************************************************************************
  2334. * brief
  2335. *    Writes Luma Coeff of an 8x8 block
  2336. ************************************************************************
  2337. */
  2338. int writeCoeff8x8 (Macroblock* currMB, ColorPlane pl, int block8x8, int block_mode, int transform_size_flag)
  2339. {
  2340.   int  block4x4, rate = 0;
  2341.   int  intra4x4mode = (block_mode==IBLOCK);
  2342.   int  block_color_type=((pl == 0) ? LUMA : ((pl == 1) ? CB : CR));
  2343.   if (block_mode == I8MB)
  2344.     assert(transform_size_flag == 1);
  2345.   if((!transform_size_flag) || img->currentSlice->symbol_mode == CAVLC) // allow here if 4x4 or CAVLC
  2346.   {
  2347.     if (img->currentSlice->symbol_mode == CAVLC )
  2348.     {
  2349.       for (block4x4=0; block4x4<4; block4x4++)
  2350.         rate += writeCoeff4x4_CAVLC (currMB, block_color_type, block8x8, block4x4, (transform_size_flag)?(block_mode==I8MB):intra4x4mode);// CAVLC, pass new intra
  2351.     }
  2352.     else
  2353.     {
  2354.       for (block4x4=0; block4x4<4; block4x4++)
  2355.         rate += writeCoeff4x4_CABAC (currMB, pl, block8x8, block4x4, intra4x4mode);
  2356.     }
  2357.   }
  2358.   else
  2359.     rate += writeCoeff8x8_CABAC (currMB, pl, block8x8, (block_mode == I8MB));
  2360.   return rate;
  2361. }
  2362. /*!
  2363.  ************************************************************************
  2364.  * brief
  2365.  *    Writes CBP, DQUANT of an macroblock
  2366.  ************************************************************************
  2367.  */
  2368. int writeCBPandDquant (Macroblock* currMB)
  2369. {
  2370.   int             rate      = 0;
  2371.   int*            bitCount  = currMB->bitcounter;
  2372.   SyntaxElement   se;
  2373.   Slice*          currSlice = img->currentSlice;
  2374.   const int*      partMap   = assignSE2partition[params->partition_mode];
  2375.   int             cbp       = currMB->cbp;
  2376.   DataPartition*  dataPart;
  2377.   int             need_transform_size_flag;   //ADD-VG-24062004
  2378.   if (!IS_NEWINTRA (currMB))
  2379.   {
  2380.     //=====   C B P   =====
  2381.     //---------------------
  2382.     se.value1 = cbp;
  2383.     se.type   = SE_CBP;
  2384.     // choose the appropriate data partition
  2385.     dataPart = &(currSlice->partArr[partMap[se.type]]);
  2386. #if TRACE
  2387.     snprintf(se.tracestring, TRACESTRING_SIZE, "CBP (%2d,%2d) = %3d",img->mb_x, img->mb_y, cbp);
  2388. #endif
  2389.     writeCBP (currMB, &se, dataPart);
  2390.     bitCount[BITS_CBP_MB] += se.len;
  2391.     rate                  += se.len;
  2392.     //============= Transform Size Flag for INTER MBs =============
  2393.     //-------------------------------------------------------------
  2394.     need_transform_size_flag = (((currMB->mb_type >= 1 && currMB->mb_type <= 3)||
  2395.                                 (IS_DIRECT(currMB) && active_sps->direct_8x8_inference_flag) ||
  2396.                                 (currMB->NoMbPartLessThan8x8Flag))
  2397.                                 && currMB->mb_type != I8MB && currMB->mb_type != I4MB
  2398.                                 && (currMB->cbp&15 || cmp_cbp[1]&15 || cmp_cbp[2] & 15)
  2399.                                 && params->Transform8x8Mode);
  2400.     if (need_transform_size_flag)
  2401.     {
  2402.       se.value1 = currMB->luma_transform_size_8x8_flag;
  2403.       se.type   = SE_MBTYPE;
  2404. #if TRACE
  2405.       snprintf(se.tracestring, TRACESTRING_SIZE, "transform_size_8x8_flag = %3d", currMB->luma_transform_size_8x8_flag);
  2406. #endif
  2407.       writeMB_transform_size(&se, dataPart);
  2408.       bitCount[BITS_MB_MODE] += se.len;
  2409.       rate                   += se.len;
  2410.     }
  2411.   }
  2412.   //=====   DQUANT   =====
  2413.   //----------------------
  2414.   if (cbp!=0 || IS_NEWINTRA (currMB))
  2415.   {
  2416.     se.value1 = currMB->delta_qp;
  2417.     se.type = SE_DELTA_QUANT;
  2418.     // choose the appropriate data partition
  2419.     dataPart = &(img->currentSlice->partArr[partMap[se.type]]);
  2420. #if TRACE
  2421.     snprintf(se.tracestring, TRACESTRING_SIZE, "Delta QP (%2d,%2d) = %3d",img->mb_x, img->mb_y, currMB->delta_qp);
  2422. #endif
  2423.     writeDquant (&se, dataPart);
  2424.     bitCount[BITS_DELTA_QUANT_MB] += se.len;
  2425.     rate                          += se.len;
  2426.   }
  2427.   return rate;
  2428. }
  2429. /*!
  2430. ************************************************************************
  2431. * brief
  2432. *    Write Luma Coeffcients, as well as Cb and Cr Coefficients in the 
  2433. *    case of 444 common mode, of an macroblock
  2434. ************************************************************************
  2435. */
  2436. int writeCoeff16x16 (Macroblock* currMB, ColorPlane plane, int cbp)
  2437. {
  2438.   int             mb_x, mb_y, i, j, k;
  2439.   int             level, run;
  2440.   int             rate      = 0;
  2441.   int*            bitCount  = currMB->bitcounter;
  2442.   SyntaxElement   se;
  2443.   Slice*          currSlice = img->currentSlice;
  2444.   const int*      partMap   = assignSE2partition[params->partition_mode];
  2445.   int   pl_off = plane<<2; 
  2446.   DataPartition*  dataPart;
  2447.   int   b8, b4;
  2448.   int*  DCLevel = img->cofDC[plane][0];
  2449.   int*  DCRun   = img->cofDC[plane][1];
  2450.   int*  ACLevel;
  2451.   int*  ACRun;
  2452.   int   data_type; 
  2453.   int   bits_coeff_mb = ((plane == 0) ? (BITS_COEFF_Y_MB) : ((plane == 1) ? (BITS_COEFF_CB_MB) : (BITS_COEFF_CR_MB)));
  2454.   if (img->P444_joined)
  2455.   {
  2456.     for (i=0; i < 4; i++)
  2457.       for (k=4*plane; k<4*(plane+1); k++)
  2458.         img->nz_coeff [img->current_mb_nr][i][k] = 0;
  2459.   }
  2460.   else
  2461.   {
  2462.     for (i=0; i < 4; i++)
  2463.       memset(img->nz_coeff [img->current_mb_nr][i], 0, (4 + img->num_blk8x8_uv) * sizeof(int));
  2464.   }
  2465.   if (!IS_NEWINTRA (currMB))
  2466.   {
  2467.     //=====  L U M I N A N C E   =====
  2468.     //--------------------------------
  2469.     for (i=0; i<4; i++)  
  2470.     {
  2471.       if (cbp & (1<<i))
  2472.       {
  2473.         rate += writeCoeff8x8 (currMB, plane, i, currMB->b8mode[i], currMB->luma_transform_size_8x8_flag);
  2474.       }
  2475.     }
  2476.   }
  2477.   else
  2478.   {
  2479.     //=====  L U M I N A N C E   f o r   1 6 x 1 6   =====
  2480.     //----------------------------------------------------
  2481.     // DC coeffs
  2482.     if (currSlice->symbol_mode == CAVLC)
  2483.     {
  2484.       switch (plane)
  2485.       {
  2486.       case 0:
  2487.       default:
  2488.         data_type = LUMA_INTRA16x16DC;
  2489.         break;
  2490.       case 1:
  2491.         data_type = CB_INTRA16x16DC;
  2492.         break;
  2493.       case 2:
  2494.         data_type = CR_INTRA16x16DC;
  2495.         break;            
  2496.       }
  2497.       rate += writeCoeff4x4_CAVLC (currMB, data_type, 0, 0, 0);  // CAVLC
  2498.     }
  2499.     else
  2500.     {
  2501.       level=1; // get inside loop
  2502.       img->is_intra_block = TRUE;
  2503.       switch (plane)
  2504.       {
  2505.       case 0:
  2506.       default:
  2507.         data_type = LUMA_16DC;
  2508.         break;
  2509.       case 1:
  2510.         data_type = CB_16DC;
  2511.         break;
  2512.       case 2:
  2513.         data_type = CR_16DC;
  2514.         break;            
  2515.       }
  2516.       for (k=0; k<=16 && level!=0; k++)
  2517.       {
  2518.         level = se.value1 = DCLevel[k]; // level
  2519.         run   = se.value2 = DCRun  [k]; // run   
  2520.         se.context = data_type;
  2521.         se.type    = SE_LUM_DC_INTRA;   // element is of type DC
  2522.         // choose the appropriate data partition
  2523.         dataPart = &(currSlice->partArr[partMap[se.type]]);
  2524. #if TRACE
  2525.         if (plane == 0)
  2526.           snprintf(se.tracestring, TRACESTRING_SIZE, "DC luma 16x16 sng(%2d) level =%3d run =%2d", k, level, run);
  2527.         else if (plane == 1)
  2528.           snprintf(se.tracestring, TRACESTRING_SIZE, "DC cb   16x16 sng(%2d) level =%3d run =%2d", k, level, run);
  2529.         else
  2530.           snprintf(se.tracestring, TRACESTRING_SIZE, "DC cr   16x16 sng(%2d) level =%3d run =%2d", k, level, run);
  2531. #endif
  2532.         writeRunLevel_CABAC(currMB, &se, dataPart);
  2533.         bitCount[bits_coeff_mb] += se.len;
  2534.         rate                    += se.len;
  2535.       }
  2536.     }
  2537.     // AC coeffs
  2538.     if (cbp & 15)
  2539.     {
  2540.       if (currSlice->symbol_mode == CAVLC)
  2541.       {
  2542.         switch (plane)
  2543.         {
  2544.         case 0:
  2545.         default:
  2546.           data_type = LUMA_INTRA16x16AC;
  2547.           break;
  2548.         case 1:
  2549.           data_type = CB_INTRA16x16AC;
  2550.           break;
  2551.         case 2:
  2552.           data_type = CR_INTRA16x16AC;
  2553.           break;            
  2554.         }
  2555.         for (mb_y=0; mb_y < 4; mb_y += 2)
  2556.         {
  2557.           for (mb_x=0; mb_x < 4; mb_x += 2)
  2558.           {
  2559.             for (j=mb_y; j < mb_y+2; j++)
  2560.             {
  2561.               int j1 = 2*(j >> 1);
  2562.               int j2 = 2*(j & 0x01);
  2563.               for (i=mb_x; i < mb_x+2; i++)
  2564.               {
  2565.                 rate += writeCoeff4x4_CAVLC (currMB, data_type, j1 + (i >> 1), j2 + (i & 0x01), 0);  // CAVLC
  2566.               }
  2567.             }
  2568.           }
  2569.         }
  2570.       }
  2571.       else
  2572.       {
  2573.         img->is_intra_block = TRUE;
  2574.         switch (plane)
  2575.         {
  2576.         case 0:
  2577.         default:
  2578.           data_type = LUMA_16AC;
  2579.           break;
  2580.         case 1:
  2581.           data_type = CB_16AC;
  2582.           break;
  2583.         case 2:
  2584.           data_type = CR_16AC;
  2585.           break;            
  2586.         }
  2587.         for (mb_y=0; mb_y < 4; mb_y += 2)
  2588.         {
  2589.           for (mb_x=0; mb_x < 4; mb_x += 2)
  2590.           {
  2591.             for (j=mb_y; j < mb_y+2; j++)
  2592.             {              
  2593.               int j1 = 2*(j >> 1);
  2594.               int j2 = 2*(j & 0x01);
  2595.               img->subblock_y = j;
  2596.               for (i=mb_x; i < mb_x+2; i++)
  2597.               {
  2598.                 img->subblock_x = i;
  2599.                 b8      = j1 + (i >> 1) + pl_off;
  2600.                 b4      = j2 + (i & 0x01);
  2601.                 ACLevel = img->cofAC[b8][b4][0];
  2602.                 ACRun   = img->cofAC[b8][b4][1];
  2603.                               
  2604.                 level=1; // get inside loop
  2605.                 for (k=0; k < 16 && level !=0; k++)
  2606.                 {
  2607.                   level = se.value1 = ACLevel[k]; // level
  2608.                   run   = se.value2 = ACRun  [k]; // run
  2609.                   se.context = data_type;
  2610.                   se.type    = SE_LUM_AC_INTRA;   // element is of type AC
  2611.                   // choose the appropriate data partition
  2612.                   dataPart = &(currSlice->partArr[partMap[se.type]]);
  2613. #if TRACE
  2614.                   if (plane == 0)
  2615.                     snprintf(se.tracestring, TRACESTRING_SIZE, "AC luma 16x16 sng(%2d) level =%3d run =%2d", k, level, run);
  2616.                   else if (plane == 1)
  2617.                     snprintf(se.tracestring, TRACESTRING_SIZE, "AC cb   16x16 sng(%2d) level =%3d run =%2d", k, level, run);
  2618.                   else
  2619.                     snprintf(se.tracestring, TRACESTRING_SIZE, "AC cr   16x16 sng(%2d) level =%3d run =%2d", k, level, run);
  2620. #endif
  2621.                   writeRunLevel_CABAC(currMB, &se, dataPart);
  2622.                   bitCount[bits_coeff_mb] += se.len;
  2623.                   rate                    += se.len;
  2624.                 }
  2625.               }
  2626.             }
  2627.           }
  2628.         }
  2629.       }
  2630.     }
  2631.   }
  2632.   return rate;
  2633. }
  2634. /*!
  2635.  ************************************************************************
  2636.  * brief
  2637.  *    Get the Prediction from the Neighboring Blocks for Number of Nonzero Coefficients
  2638.  *
  2639.  *    Luma Blocks
  2640.  ************************************************************************
  2641.  */
  2642. int predict_nnz(Macroblock *currMB, int block_type, int i,int j)
  2643. {
  2644.   PixelPos pix;
  2645.   int pred_nnz = 0;
  2646.   int cnt      = 0;
  2647.   // left block
  2648.   get4x4Neighbour(currMB, (i << 2) - 1, (j << 2), img->mb_size[IS_LUMA], &pix);
  2649.   if (IS_INTRA(currMB) && pix.available && active_pps->constrained_intra_pred_flag && ((params->partition_mode != 0) && !img->currentPicture->idr_flag))
  2650.   {
  2651.     pix.available &= img->intra_block[pix.mb_addr];
  2652.     if (!pix.available)
  2653.       cnt++;
  2654.   }
  2655.   if (pix.available)
  2656.   {
  2657.     switch (block_type)
  2658.     {
  2659.     case LUMA:
  2660.       pred_nnz += img->nz_coeff [pix.mb_addr ][pix.x][pix.y];
  2661.       cnt++;
  2662.       break;
  2663.     case CB:
  2664.       pred_nnz += img->nz_coeff [pix.mb_addr ][pix.x][4+pix.y];
  2665.       cnt++;
  2666.       break;
  2667.     case CR:
  2668.       pred_nnz += img->nz_coeff [pix.mb_addr ][pix.x][8+pix.y];
  2669.       cnt++;
  2670.       break;
  2671.     default:
  2672.       error("writeCoeff4x4_CAVLC: Invalid block type", 600);
  2673.       break;
  2674.     }
  2675.   }
  2676.   // top block
  2677.   get4x4Neighbour(currMB, (i<<2), (j<<2) - 1, img->mb_size[IS_LUMA], &pix);
  2678.   if (IS_INTRA(currMB) && pix.available && active_pps->constrained_intra_pred_flag && ((params->partition_mode != 0) && !img->currentPicture->idr_flag))
  2679.   {
  2680.     pix.available &= img->intra_block[pix.mb_addr];
  2681.     if (!pix.available)
  2682.       cnt++;
  2683.   }
  2684.   if (pix.available)
  2685.   {
  2686.     switch (block_type)
  2687.     {
  2688.     case LUMA:
  2689.       pred_nnz += img->nz_coeff [pix.mb_addr ][pix.x][pix.y];
  2690.       cnt++;
  2691.       break;
  2692.     case CB:
  2693.       pred_nnz += img->nz_coeff [pix.mb_addr ][pix.x][4+pix.y];
  2694.       cnt++;
  2695.       break;
  2696.     case CR:
  2697.       pred_nnz += img->nz_coeff [pix.mb_addr ][pix.x][8+pix.y];
  2698.       cnt++;
  2699.       break;
  2700.     default:
  2701.       error("writeCoeff4x4_CAVLC: Invalid block type", 600);
  2702.       break;
  2703.     }
  2704.   }
  2705.   if (cnt==2)
  2706.   {
  2707.     pred_nnz++;
  2708.     pred_nnz>>=1;
  2709.   }
  2710.   return pred_nnz;
  2711. }
  2712. /*!
  2713.  ************************************************************************
  2714.  * brief
  2715.  *    Get the Prediction from the Neighboring Blocks for Number of Nonzero Coefficients
  2716.  *
  2717.  *    Chroma Blocks
  2718.  ************************************************************************
  2719.  */
  2720. int predict_nnz_chroma(Macroblock *currMB, int i,int j)
  2721. {
  2722.   PixelPos pix;
  2723.   int pred_nnz = 0;
  2724.   int cnt      = 0;
  2725.   if (img->yuv_format != YUV444)
  2726.   {
  2727.     //YUV420 and YUV422
  2728.     // left block
  2729.     get4x4Neighbour(currMB, ((i & 0x01)<<2) - 1, ((j-4)<<2), img->mb_size[IS_CHROMA], &pix);
  2730.     if (IS_INTRA(currMB) && pix.available && active_pps->constrained_intra_pred_flag && ((params->partition_mode != 0) && !img->currentPicture->idr_flag))
  2731.     {
  2732.       pix.available &= img->intra_block[pix.mb_addr];
  2733.       if (!pix.available)
  2734.         cnt++;
  2735.     }
  2736.     if (pix.available)
  2737.     {
  2738.       pred_nnz = img->nz_coeff [pix.mb_addr ][2 * (i >> 1) + pix.x][4 + pix.y];
  2739.       cnt++;
  2740.     }
  2741.     // top block
  2742.     get4x4Neighbour(currMB, ((i & 0x01)<<2), ((j-4)<<2) -1, img->mb_size[IS_CHROMA],  &pix);
  2743.     if (IS_INTRA(currMB) && pix.available && active_pps->constrained_intra_pred_flag && ((params->partition_mode != 0) && !img->currentPicture->idr_flag))
  2744.     {
  2745.       pix.available &= img->intra_block[pix.mb_addr];
  2746.       if (!pix.available)
  2747.         cnt++;
  2748.     }
  2749.     if (pix.available)
  2750.     {
  2751.       pred_nnz += img->nz_coeff [pix.mb_addr ][2 * (i >> 1) + pix.x][4 + pix.y];
  2752.       cnt++;
  2753.     }
  2754.   }
  2755.   if (cnt==2)
  2756.   {
  2757.     pred_nnz++;
  2758.     pred_nnz>>=1;
  2759.   }
  2760.   return pred_nnz;
  2761. }
  2762. /*!
  2763.  ************************************************************************
  2764.  * brief
  2765.  *    Writes coeff of an 4x4 block (CAVLC)
  2766.  *
  2767.  * author
  2768.  *    Karl Lillevold <karll@real.com>
  2769.  *    contributions by James Au <james@ubvideo.com>
  2770.  ************************************************************************
  2771.  */
  2772. int writeCoeff4x4_CAVLC (Macroblock* currMB, int block_type, int b8, int b4, int param)
  2773. {
  2774.   int           no_bits    = 0;
  2775.   SyntaxElement se;
  2776.   int           *bitCount  = currMB->bitcounter;
  2777.   Slice         *currSlice = img->currentSlice;
  2778.   DataPartition *dataPart;
  2779.   int           *partMap   = assignSE2partition[params->partition_mode];
  2780.   int k,level = 1,run,vlcnum;
  2781.   int numcoeff = 0, lastcoeff = 0, numtrailingones = 0; 
  2782.   int numones = 0, totzeros = 0, zerosleft, numcoef;
  2783.   int numcoeff_vlc;
  2784.   int code, level_two_or_higher;
  2785.   int dptype = 0, bitcounttype = 0;
  2786.   int nnz, max_coeff_num = 0, cdc = 0, cac = 0;
  2787.   int subblock_x, subblock_y;
  2788. #if TRACE
  2789.   char type[15];
  2790. #endif
  2791.   static const int incVlc[] = {0, 3, 6, 12, 24, 48, 32768};  // maximum vlc = 6
  2792.   int*  pLevel = NULL;
  2793.   int*  pRun = NULL;
  2794.   switch (block_type)
  2795.   {
  2796.   case LUMA:
  2797.     max_coeff_num = 16;
  2798.     bitcounttype = BITS_COEFF_Y_MB;
  2799.     pLevel = img->cofAC[b8][b4][0];
  2800.     pRun   = img->cofAC[b8][b4][1];
  2801. #if TRACE
  2802.     sprintf(type, "%s", "Luma");
  2803. #endif
  2804.     dptype = (IS_INTRA (currMB)) ? SE_LUM_AC_INTRA : SE_LUM_AC_INTER;
  2805.     break;
  2806.   case LUMA_INTRA16x16DC:
  2807.     max_coeff_num = 16;
  2808.     bitcounttype = BITS_COEFF_Y_MB;
  2809.     pLevel = img->cofDC[0][0];
  2810.     pRun   = img->cofDC[0][1];
  2811. #if TRACE
  2812.     sprintf(type, "%s", "Lum16DC");
  2813. #endif
  2814.     dptype = SE_LUM_DC_INTRA;
  2815.     break;
  2816.   case LUMA_INTRA16x16AC:
  2817.     max_coeff_num = 15;
  2818.     bitcounttype = BITS_COEFF_Y_MB;
  2819.     pLevel = img->cofAC[b8][b4][0];
  2820.     pRun   = img->cofAC[b8][b4][1];
  2821. #if TRACE
  2822.     sprintf(type, "%s", "Lum16AC");
  2823. #endif
  2824.     dptype = SE_LUM_AC_INTRA;
  2825.     break;
  2826.   case CB:
  2827.     max_coeff_num = 16;
  2828.     bitcounttype = BITS_COEFF_CB_MB;
  2829.     pLevel = img->cofAC[4+b8][b4][0];
  2830.     pRun   = img->cofAC[4+b8][b4][1];
  2831. #if TRACE    
  2832.     sprintf(type, "%s", "CB");
  2833. #endif
  2834.     dptype = (IS_INTRA (currMB)) ? SE_LUM_AC_INTRA : SE_LUM_AC_INTER;
  2835.     break;
  2836.   case CB_INTRA16x16DC:
  2837.     max_coeff_num = 16;
  2838.     bitcounttype = BITS_COEFF_CB_MB;
  2839.     pLevel = img->cofDC[1][0];
  2840.     pRun   = img->cofDC[1][1];
  2841. #if TRACE    
  2842.     sprintf(type, "%s", "CB_16DC");
  2843. #endif
  2844.     dptype = SE_LUM_DC_INTRA;
  2845.     break;
  2846.   case CB_INTRA16x16AC:
  2847.     max_coeff_num = 15;
  2848.     bitcounttype = BITS_COEFF_CB_MB;
  2849.     pLevel = img->cofAC[4+b8][b4][0];
  2850.     pRun   = img->cofAC[4+b8][b4][1];
  2851. #if TRACE    
  2852.     sprintf(type, "%s", "CB_16AC");
  2853. #endif
  2854.     dptype = SE_LUM_AC_INTRA;
  2855.     break;
  2856.   case CR:
  2857.     max_coeff_num = 16;
  2858.     bitcounttype = BITS_COEFF_CR_MB;
  2859.     pLevel = img->cofAC[8+b8][b4][0];
  2860.     pRun   = img->cofAC[8+b8][b4][1];
  2861. #if TRACE    
  2862.     sprintf(type, "%s", "CR");
  2863. #endif
  2864.     dptype = (IS_INTRA (currMB)) ? SE_LUM_AC_INTRA : SE_LUM_AC_INTER;
  2865.     break;
  2866.   case CR_INTRA16x16DC:
  2867.     max_coeff_num = 16;
  2868.     bitcounttype = BITS_COEFF_CR_MB;
  2869.     pLevel = img->cofDC[2][0];
  2870.     pRun   = img->cofDC[2][1];
  2871. #if TRACE    
  2872.     sprintf(type, "%s", "CR_16DC");
  2873. #endif
  2874.     dptype = SE_LUM_DC_INTRA;
  2875.     break;
  2876.   case CR_INTRA16x16AC:
  2877.     max_coeff_num = 15;
  2878.     bitcounttype = BITS_COEFF_CR_MB;
  2879.     pLevel = img->cofAC[8+b8][b4][0];
  2880.     pRun   = img->cofAC[8+b8][b4][1];
  2881. #if TRACE    
  2882.     sprintf(type, "%s", "CR_16AC");
  2883. #endif
  2884.     dptype = SE_LUM_AC_INTRA;
  2885.     break;
  2886.   case CHROMA_DC:
  2887.     max_coeff_num = img->num_cdc_coeff;
  2888.     bitcounttype = BITS_COEFF_UV_MB;
  2889.     cdc = 1;
  2890.     pLevel = img->cofDC[param+1][0];
  2891.     pRun   = img->cofDC[param+1][1];
  2892. #if TRACE
  2893.     sprintf(type, "%s", "ChrDC");
  2894. #endif
  2895.     dptype = (IS_INTRA (currMB)) ? SE_CHR_DC_INTRA : SE_CHR_DC_INTER;
  2896.     break;
  2897.   case CHROMA_AC:
  2898.     max_coeff_num = 15;
  2899.     bitcounttype = BITS_COEFF_UV_MB;
  2900.     cac = 1;
  2901.     pLevel = img->cofAC[b8][b4][0];
  2902.     pRun   = img->cofAC[b8][b4][1];
  2903. #if TRACE
  2904.     sprintf(type, "%s", "ChrAC");
  2905. #endif
  2906.     dptype = (IS_INTRA (currMB)) ? SE_CHR_AC_INTRA : SE_CHR_AC_INTER;
  2907.     break;
  2908.   default:
  2909.     error("writeCoeff4x4_CAVLC: Invalid block type", 600);
  2910.     break;
  2911.   }
  2912.   dataPart = &(currSlice->partArr[partMap[dptype]]);
  2913.   for(k = 0; (k <= ((cdc) ? img->num_cdc_coeff : 16)) && level != 0; k++)
  2914.   {
  2915.     level = pLevel[k]; // level
  2916.     run   = pRun[k];   // run
  2917.     if (level)
  2918.     {
  2919.       totzeros += run; // lets add run always (even if zero) to avoid conditional
  2920.       if (iabs(level) == 1)
  2921.       {
  2922.         numones ++;
  2923.         numtrailingones ++;
  2924.         numtrailingones = imin(numtrailingones, 3); // clip to 3
  2925.       }
  2926.       else
  2927.       {
  2928.         numtrailingones = 0;
  2929.       }
  2930.       numcoeff ++;
  2931.       lastcoeff = k;
  2932.     }
  2933.   }
  2934.   if (!cdc)
  2935.   {
  2936.     if(block_type==LUMA || block_type==LUMA_INTRA16x16DC || block_type==LUMA_INTRA16x16AC
  2937.       ||block_type==CHROMA_AC)
  2938.     {
  2939.       if (!cac)
  2940.       {
  2941.         // luma
  2942.         subblock_x = ((b8 & 0x1) == 0) ? (((b4 & 0x1) == 0) ? 0 : 1) : (((b4 & 0x1) == 0) ? 2 : 3);
  2943.         // horiz. position for coeff_count context
  2944.         subblock_y = (b8 < 2) ? ((b4 < 2) ? 0 : 1) : ((b4 < 2) ? 2 : 3);
  2945.         // vert.  position for coeff_count context
  2946.         nnz = predict_nnz(currMB, LUMA, subblock_x,subblock_y);
  2947.       }
  2948.       else
  2949.       {
  2950.         // chroma AC
  2951.         subblock_x = param >> 4;
  2952.         subblock_y = param & 15;
  2953.         nnz = predict_nnz_chroma(currMB, subblock_x, subblock_y);
  2954.       }
  2955.       img->nz_coeff [img->current_mb_nr ][subblock_x][subblock_y] = numcoeff;
  2956.     }
  2957.     else if (block_type==CB || block_type==CB_INTRA16x16DC 
  2958.       || block_type==CB_INTRA16x16AC)
  2959.     {   //CB in the common mode in 4:4:4 profiles
  2960.       subblock_x = ((b8 & 0x1) == 0)?(((b4 & 0x1) == 0) ? 0 : 1):(((b4 & 0x1) == 0) ? 2 : 3); 
  2961.       // horiz. position for coeff_count context
  2962.       subblock_y = (b8 < 2) ? ((b4 < 2) ? 0 : 1) : ((b4 < 2) ? 2 : 3); 
  2963.       // vert.  position for coeff_count context
  2964.       nnz = predict_nnz(currMB, CB, subblock_x,subblock_y);
  2965.       img->nz_coeff [img->current_mb_nr ][subblock_x][4+subblock_y] = numcoeff;
  2966.     }
  2967.     else
  2968.     { //CR in the common mode in 4:4:4 profiles 
  2969.       subblock_x = ((b8 & 0x1) == 0)?(((b4 & 0x1) == 0) ? 0 : 1) : (((b4 & 0x1) == 0) ? 2 : 3); 
  2970.       // horiz. position for coeff_count context
  2971.       subblock_y = (b8 < 2) ? ((b4 < 2) ? 0 : 1) : ((b4 < 2) ? 2 : 3); 
  2972.       // vert.  position for coeff_count context
  2973.       nnz = predict_nnz(currMB, CR, subblock_x,subblock_y);
  2974.       img->nz_coeff [img->current_mb_nr ][subblock_x][8+subblock_y] = numcoeff;
  2975.     }
  2976.     if (nnz < 2)
  2977.     {
  2978.       numcoeff_vlc = 0;
  2979.     }
  2980.     else if (nnz < 4)
  2981.     {
  2982.       numcoeff_vlc = 1;
  2983.     }
  2984.     else if (nnz < 8)
  2985.     {
  2986.       numcoeff_vlc = 2;
  2987.     }
  2988.     else
  2989.     {
  2990.       numcoeff_vlc = 3;
  2991.     }
  2992.   }
  2993.   else
  2994.   {
  2995.     // chroma DC (has its own VLC)
  2996.     // numcoeff_vlc not relevant
  2997.     numcoeff_vlc = 0;
  2998.     subblock_x = param;
  2999.     subblock_y = param;
  3000.   }
  3001.   se.type  = dptype;
  3002.   se.value1 = numcoeff;
  3003.   se.value2 = numtrailingones;
  3004.   se.len    = numcoeff_vlc; /* use len to pass vlcnum */
  3005. #if TRACE
  3006.   snprintf(se.tracestring,
  3007.     TRACESTRING_SIZE, "%s # c & tr.1s(%d,%d) vlc=%d #c=%d #t1=%d",
  3008.     type, subblock_x, subblock_y, numcoeff_vlc, numcoeff, numtrailingones);
  3009. #endif
  3010.   if (!cdc)
  3011.     writeSyntaxElement_NumCoeffTrailingOnes(&se, dataPart);
  3012.   else
  3013.     writeSyntaxElement_NumCoeffTrailingOnesChromaDC(&se, dataPart);
  3014.   bitCount[bitcounttype] += se.len;
  3015.   no_bits                += se.len;
  3016.   if (!numcoeff)
  3017.     return no_bits;
  3018.   if (numcoeff)
  3019.   {
  3020.     code = 0;
  3021.     for (k = lastcoeff; k > lastcoeff - numtrailingones; k--)
  3022.     {
  3023.       level = pLevel[k]; // level
  3024.       
  3025.       if (iabs(level) > 1)
  3026.       {
  3027.         printf("ERROR: level > 1n");
  3028.         exit(-1);
  3029.       }
  3030.       code <<= 1;
  3031.       if (level < 0)
  3032.       {
  3033.         code |= 0x1;
  3034.       }
  3035.     }
  3036.     if (numtrailingones)
  3037.     {
  3038.       se.type  = dptype;
  3039.       se.value2 = numtrailingones;
  3040.       se.value1 = code;
  3041. #if TRACE
  3042.       snprintf(se.tracestring,
  3043.         TRACESTRING_SIZE, "%s trailing ones sign (%d,%d)",
  3044.         type, subblock_x, subblock_y);
  3045. #endif
  3046.       writeSyntaxElement_VLC (&se, dataPart);
  3047.       bitCount[bitcounttype] += se.len;
  3048.       no_bits                += se.len;
  3049.     }
  3050.     // encode levels
  3051.     level_two_or_higher = (numcoeff > 3 && numtrailingones == 3) ? 0 : 1;
  3052.     vlcnum = (numcoeff > 10 && numtrailingones < 3) ? 1 : 0;
  3053.     for (k = lastcoeff - numtrailingones; k >= 0; k--)
  3054.     {
  3055.       level = pLevel[k]; // level
  3056.       se.value1 = level;
  3057.       se.type  = dptype;
  3058. #if TRACE
  3059.       snprintf(se.tracestring,
  3060.         TRACESTRING_SIZE, "%s lev (%d,%d) k=%d vlc=%d lev=%3d",
  3061.         type, subblock_x, subblock_y, k, vlcnum, level);
  3062. #endif
  3063.       if (level_two_or_higher)
  3064.       {
  3065.         level_two_or_higher = 0;
  3066.         if (se.value1 > 0)
  3067.           se.value1 --;
  3068.         else
  3069.           se.value1 ++;        
  3070.       }
  3071.       //    encode level
  3072.       if (vlcnum == 0)
  3073.         writeSyntaxElement_Level_VLC1(&se, dataPart, active_sps->profile_idc);
  3074.       else
  3075.         writeSyntaxElement_Level_VLCN(&se, vlcnum, dataPart, active_sps->profile_idc);
  3076.       // update VLC table
  3077.       if (iabs(level) > incVlc[vlcnum])
  3078.         vlcnum++;
  3079.       if ((k == lastcoeff - numtrailingones) && iabs(level) > 3)
  3080.         vlcnum = 2;
  3081.       bitCount[bitcounttype] += se.len;
  3082.       no_bits                += se.len;
  3083.     }
  3084.     // encode total zeroes
  3085.     if (numcoeff < max_coeff_num)
  3086.     {
  3087.       se.type  = dptype;
  3088.       se.value1 = totzeros;
  3089.       vlcnum = numcoeff - 1;
  3090.       se.len = vlcnum;
  3091. #if TRACE
  3092.       snprintf(se.tracestring,
  3093.         TRACESTRING_SIZE, "%s totalrun (%d,%d) vlc=%d totzeros=%3d",
  3094.         type, subblock_x, subblock_y, vlcnum, totzeros);
  3095. #endif
  3096.       if (!cdc)
  3097.         writeSyntaxElement_TotalZeros(&se, dataPart);
  3098.       else
  3099.         writeSyntaxElement_TotalZerosChromaDC(&se, dataPart);
  3100.       bitCount[bitcounttype] += se.len;
  3101.       no_bits                += se.len;
  3102.     }
  3103.     // encode run before each coefficient
  3104.     zerosleft = totzeros;
  3105.     numcoef = numcoeff;
  3106.     for (k = lastcoeff; k >= 0; k--)
  3107.     {
  3108.       run = pRun[k]; // run
  3109.       se.value1 = run;
  3110.       se.type   = dptype;
  3111.       // for last coeff, run is remaining totzeros
  3112.       // when zerosleft is zero, remaining coeffs have 0 run
  3113.       if ((!zerosleft) || (numcoeff <= 1 ))
  3114.         break;
  3115.       if (numcoef > 1 && zerosleft)
  3116.       {
  3117.         vlcnum = imin(zerosleft - 1, RUNBEFORE_NUM_M1);
  3118.         se.len = vlcnum;
  3119. #if TRACE
  3120.         snprintf(se.tracestring,
  3121.           TRACESTRING_SIZE, "%s run (%d,%d) k=%d vlc=%d run=%2d",
  3122.           type, subblock_x, subblock_y, k, vlcnum, run);
  3123. #endif
  3124.         writeSyntaxElement_Run(&se, dataPart);
  3125.         bitCount[bitcounttype]+=se.len;
  3126.         no_bits               +=se.len;
  3127.         zerosleft -= run;
  3128.         numcoef --;
  3129.       }
  3130.     }
  3131.   }
  3132.   return no_bits;
  3133. }
  3134. int distortion_hadamard(imgpel **img_org, imgpel pred_img[16][16])
  3135. {
  3136.   imgpel *cur_img, *prd_img;
  3137.   int current_intra_sad_2 = 0;
  3138.   int ii, jj, i, j;
  3139.   static int M0[4][4][4][4], M4[4][4];
  3140.   static int (*M7)[4];
  3141.   for (j=0;j<16;j++)
  3142.   {
  3143.     cur_img = &img_org[img->opix_y + j][img->opix_x];
  3144.     prd_img = pred_img[j];
  3145.     for (i=0;i<16;i++)
  3146.     {
  3147.       M0[j >> 2][i >> 2][j & 0x03][i & 0x03] = cur_img[i] - prd_img[i];
  3148.     }
  3149.   }
  3150.   for (jj=0;jj<4;jj++)
  3151.   {
  3152.     for (ii=0;ii<4;ii++)
  3153.     {
  3154.       M7 = M0[jj][ii];
  3155.       hadamard4x4(M7, M7);
  3156.       for (j=0;j<4;j++)
  3157.       {
  3158.         for (i=0;i<4;i++)
  3159.         {
  3160.           if((i + j) != 0)
  3161.             current_intra_sad_2 += iabs(M7[j][i]);
  3162.         }
  3163.       }
  3164.     }
  3165.   }
  3166.   for (j=0;j<4;j++)
  3167.   {
  3168.     for (i=0;i<4;i++)
  3169.       M4[j][i] = (M0[j][i][0][0] >> 1);
  3170.   }
  3171.   // Hadamard of DC coeff
  3172.   hadamard4x4(M4, M4);
  3173.   for (j=0;j<4;j++)
  3174.   {
  3175.     for (i=0;i<4;i++)
  3176.     {
  3177.       current_intra_sad_2 += iabs(M4[j][i]);
  3178.     }
  3179.   }
  3180.   return current_intra_sad_2;
  3181. }
  3182. int distortion_sad(imgpel **img_org, imgpel pred_img[16][16])
  3183. {
  3184.   imgpel *cur_img, *prd_img;
  3185.   int current_intra_sad_2 = 0;
  3186.   int i, j; 
  3187.   for (j=0;j<16;j++)
  3188.   {
  3189.     cur_img = &img_org[img->opix_y + j][img->opix_x];
  3190.     prd_img = pred_img[j];
  3191.     for (i=0;i<16;i++)
  3192.     {
  3193.       current_intra_sad_2 += iabs( *cur_img++ - *prd_img++ );
  3194.     }
  3195.   }
  3196.   return current_intra_sad_2;
  3197. }
  3198. int distortion_sse(imgpel **img_org, imgpel pred_img[16][16])
  3199. {
  3200.   imgpel *cur_img, *prd_img;
  3201.   int current_intra_sad_2 = 0;
  3202.   int i, j; 
  3203.   for (j=0;j<16;j++)
  3204.   {
  3205.     cur_img = &img_org[img->opix_y + j][img->opix_x];
  3206.     prd_img = pred_img[j];
  3207.     for (i=0;i<16;i++)
  3208.     {
  3209.       current_intra_sad_2 += img->quad[ *cur_img++ - *prd_img++ ];
  3210.     }
  3211.   }
  3212.   return current_intra_sad_2;
  3213. }
  3214. /*!
  3215.  ************************************************************************
  3216.  * brief
  3217.  *    Find best 16x16 based intra mode
  3218.  *
  3219.  * par Input:
  3220.  *    Image parameters, pointer to best 16x16 intra mode
  3221.  *
  3222.  * par Output:
  3223.  *    best 16x16 based SAD
  3224.  ************************************************************************/
  3225. double find_sad_16x16_JM(Macroblock *currMB, int *intra_mode)
  3226. {
  3227.   double current_intra_sad_2, best_intra_sad2 = 1e30;
  3228.   int i,k;
  3229.   imgpel  (*curr_mpr_16x16)[16][16] = img->mpr_16x16[0];
  3230.   PixelPos up;          //!< pixel position p(0,-1)
  3231.   PixelPos left[17];    //!< pixel positions p(-1, -1..15)
  3232.   int up_avail, left_avail, left_up_avail;
  3233.   for (i=0;i<17;i++)
  3234.   {
  3235.     getNeighbour(currMB, -1 ,  i - 1 , img->mb_size[IS_LUMA], &left[i]);
  3236.   }
  3237.   getNeighbour(currMB, 0     ,  -1 , img->mb_size[IS_LUMA], &up);
  3238.   if (!(params->UseConstrainedIntraPred))
  3239.   {
  3240.     up_avail   = up.available;
  3241.     left_avail = left[1].available;
  3242.     left_up_avail = left[0].available;
  3243.   }
  3244.   else
  3245.   {
  3246.     up_avail      = up.available ? img->intra_block[up.mb_addr] : 0;
  3247.     for (i = 1, left_avail = 1; i < 17;i++)
  3248.       left_avail  &= left[i].available ? img->intra_block[left[i].mb_addr]: 0;
  3249.     left_up_avail = left[0].available ? img->intra_block[left[0].mb_addr]: 0;
  3250.   }
  3251.   *intra_mode = DC_PRED_16;
  3252.   for (k = 0;k < 4; k++)
  3253.   {
  3254.     if (params->IntraDisableInterOnly == 0 || img->type != I_SLICE)
  3255.     {
  3256.       if (params->Intra16x16ParDisable && (k==VERT_PRED_16||k==HOR_PRED_16))
  3257.         continue;
  3258.       if (params->Intra16x16PlaneDisable && k==PLANE_16)
  3259.         continue;
  3260.     }
  3261.     //check if there are neighbours to predict from
  3262.     if (!((k==0 && !up_avail) || (k==1 && !left_avail) || (k==3 && (!left_avail || !up_avail || !left_up_avail))))
  3263.     {
  3264.       switch(params->ModeDecisionMetric)
  3265.       {
  3266.       case ERROR_SAD:
  3267.         current_intra_sad_2 = distortion_sad(pCurImg, curr_mpr_16x16[k]);
  3268.         if (img->P444_joined)
  3269.         {
  3270.           current_intra_sad_2 += distortion_sad(pImgOrg[1], img->mpr_16x16[1][k]);
  3271.           current_intra_sad_2 += distortion_sad(pImgOrg[2], img->mpr_16x16[2][k]);
  3272.         }
  3273.         break;
  3274.       case ERROR_SSE:
  3275.         current_intra_sad_2 = distortion_sse(pCurImg, curr_mpr_16x16[k]);
  3276.         if (img->P444_joined)
  3277.         {
  3278.           current_intra_sad_2 += distortion_sse(pImgOrg[1], img->mpr_16x16[1][k]);
  3279.           current_intra_sad_2 += distortion_sse(pImgOrg[2], img->mpr_16x16[2][k]);
  3280.         }
  3281.         break;
  3282.       case ERROR_SATD :
  3283.       default:
  3284.         current_intra_sad_2 = distortion_hadamard(pCurImg, curr_mpr_16x16[k]);
  3285.         if (img->P444_joined)
  3286.         {
  3287.           current_intra_sad_2 += distortion_hadamard(pImgOrg[1], img->mpr_16x16[1][k]);
  3288.           current_intra_sad_2 += distortion_hadamard(pImgOrg[2], img->mpr_16x16[2][k]);
  3289.         }
  3290.         break;
  3291.       }
  3292.       if(current_intra_sad_2 < best_intra_sad2)
  3293.       {
  3294.         best_intra_sad2 = current_intra_sad_2;
  3295.         *intra_mode = k; // update best intra mode
  3296.       }
  3297.     }
  3298.   }
  3299.   return best_intra_sad2;
  3300. }
  3301. /*!
  3302.  ************************************************************************
  3303.  * brief
  3304.  *    Change color plane for 4:4:4 Independent Mode
  3305.  *
  3306.  * par Input:
  3307.  *    plane number
  3308.  ************************************************************************/
  3309. void change_plane_JV( int nplane )
  3310. {
  3311.   img->colour_plane_id = nplane;
  3312.   img->mb_data = img->mb_data_JV[nplane];
  3313.   enc_picture  = enc_frame_picture_JV[nplane];
  3314.   pCurImg      = img_org_frm[nplane];
  3315.   Co_located   = Co_located_JV[nplane];
  3316. }
  3317. /*!
  3318.  ************************************************************************
  3319.  * brief
  3320.  *    Make one frame picture from 4:4:4 plane
  3321.  ************************************************************************/
  3322. void make_frame_picture_JV()
  3323. {
  3324.   int uv, line;
  3325.   int nsize;
  3326.   int nplane;
  3327.   enc_frame_picture[0] = enc_frame_picture_JV[0];
  3328.   for( nplane=0; nplane<MAX_PLANE; nplane++ )
  3329.   {
  3330.     copy_storable_param_JV( nplane, enc_frame_picture[0], enc_frame_picture_JV[nplane] );
  3331.   }
  3332.   for( uv=0; uv<2; uv++ )
  3333.   {
  3334.     for( line=0; line<img->height; line++ )
  3335.     {
  3336.       nsize = sizeof(imgpel) * img->width;
  3337.       memcpy( enc_frame_picture[0]->imgUV[uv][line], enc_frame_picture_JV[uv+1]->imgY[line], nsize );
  3338.     }
  3339.     free_storable_picture(enc_frame_picture_JV[uv+1]);
  3340.   }
  3341. }