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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***********************************************************************
  3.  * file macroblock.c
  4.  *
  5.  * brief
  6.  *     Decode a Macroblock
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Inge Lille-Lang鴜               <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.  *    - Thomas Wedi                     <wedi@tnt.uni-hannover.de>
  15.  *    - Detlev Marpe                    <marpe@hhi.de>
  16.  *    - Gabi Blaettermann
  17.  *    - Ye-Kui Wang                     <wyk@ieee.org>
  18.  *    - Lowell Winger                   <lwinger@lsil.com>
  19.  *    - Alexis Michael Tourapis         <alexismt@ieee.org>
  20.  ***********************************************************************
  21. */
  22. #include "contributors.h"
  23. #include <math.h>
  24. #include "global.h"
  25. #include "mbuffer.h"
  26. #include "elements.h"
  27. #include "errorconcealment.h"
  28. #include "macroblock.h"
  29. #include "fmo.h"
  30. #include "cabac.h"
  31. #include "vlc.h"
  32. #include "image.h"
  33. #include "mb_access.h"
  34. #include "biaridecod.h"
  35. #include "block.h"
  36. #include "transform8x8.h"
  37. #include "transform.h"
  38. #include "mc_prediction.h"
  39. #include "quant.h"
  40. #if TRACE
  41. #define TRACE_STRING(s) strncpy(currSE.tracestring, s, TRACESTRING_SIZE)
  42. #define TRACE_DECBITS(i) dectracebitcnt(1)
  43. #define TRACE_PRINTF(s) sprintf(type, "%s", s);
  44. #define TRACE_STRING_P(s) strncpy(currSE->tracestring, s, TRACESTRING_SIZE)
  45. #else
  46. #define TRACE_STRING(s)
  47. #define TRACE_DECBITS(i)
  48. #define TRACE_PRINTF(s) 
  49. #define TRACE_STRING_P(s)
  50. #endif
  51. //! single scan pattern
  52. static const byte SNGL_SCAN[16][2] =
  53. {
  54.   {0,0},{1,0},{0,1},{0,2},
  55.   {1,1},{2,0},{3,0},{2,1},
  56.   {1,2},{0,3},{1,3},{2,2},
  57.   {3,1},{3,2},{2,3},{3,3}
  58. };
  59. //! field scan pattern
  60. static const byte FIELD_SCAN[16][2] =
  61. {
  62.   {0,0},{0,1},{1,0},{0,2},
  63.   {0,3},{1,1},{1,2},{1,3},
  64.   {2,0},{2,1},{2,2},{2,3},
  65.   {3,0},{3,1},{3,2},{3,3}
  66. };
  67. //! used to control block sizes : Not used/16x16/16x8/8x16/8x8/8x4/4x8/4x4
  68. static const int BLOCK_STEP[8][2]=
  69. {
  70.   {0,0},{4,4},{4,2},{2,4},{2,2},{2,1},{1,2},{1,1}
  71. };
  72. const byte QP_SCALE_CR[52]=
  73. {
  74.     0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,
  75.    12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,
  76.    28,29,29,30,31,32,32,33,34,34,35,35,36,36,37,37,
  77.    37,38,38,38,39,39,39,39
  78. };
  79. //! single scan pattern
  80. const byte SNGL_SCAN8x8[64][2] = {
  81.   {0,0}, {1,0}, {0,1}, {0,2}, {1,1}, {2,0}, {3,0}, {2,1}, {1,2}, {0,3}, {0,4}, {1,3}, {2,2}, {3,1}, {4,0}, {5,0},
  82.   {4,1}, {3,2}, {2,3}, {1,4}, {0,5}, {0,6}, {1,5}, {2,4}, {3,3}, {4,2}, {5,1}, {6,0}, {7,0}, {6,1}, {5,2}, {4,3},
  83.   {3,4}, {2,5}, {1,6}, {0,7}, {1,7}, {2,6}, {3,5}, {4,4}, {5,3}, {6,2}, {7,1}, {7,2}, {6,3}, {5,4}, {4,5}, {3,6},
  84.   {2,7}, {3,7}, {4,6}, {5,5}, {6,4}, {7,3}, {7,4}, {6,5}, {5,6}, {4,7}, {5,7}, {6,6}, {7,5}, {7,6}, {6,7}, {7,7}
  85. };
  86. //! field scan pattern
  87. const byte FIELD_SCAN8x8[64][2] = {   // 8x8
  88.   {0,0}, {0,1}, {0,2}, {1,0}, {1,1}, {0,3}, {0,4}, {1,2}, {2,0}, {1,3}, {0,5}, {0,6}, {0,7}, {1,4}, {2,1}, {3,0},
  89.   {2,2}, {1,5}, {1,6}, {1,7}, {2,3}, {3,1}, {4,0}, {3,2}, {2,4}, {2,5}, {2,6}, {2,7}, {3,3}, {4,1}, {5,0}, {4,2},
  90.   {3,4}, {3,5}, {3,6}, {3,7}, {4,3}, {5,1}, {6,0}, {5,2}, {4,4}, {4,5}, {4,6}, {4,7}, {5,3}, {6,1}, {6,2}, {5,4},
  91.   {5,5}, {5,6}, {5,7}, {6,3}, {7,0}, {7,1}, {6,4}, {6,5}, {6,6}, {6,7}, {7,2}, {7,3}, {7,4}, {7,5}, {7,6}, {7,7}
  92. };
  93. //! single scan pattern
  94. const byte SCAN_YUV422[8][2] =
  95. {
  96.   {0,0},{0,1},
  97.   {1,0},{0,2},
  98.   {0,3},{1,1},
  99.   {1,2},{1,3}
  100. };
  101. static unsigned char cbp_blk_chroma[8][4] =
  102. { {16, 17, 18, 19},
  103.   {20, 21, 22, 23},
  104.   {24, 25, 26, 27},
  105.   {28, 29, 30, 31},
  106.   {32, 33, 34, 35},
  107.   {36, 37, 38, 39},
  108.   {40, 41, 42, 43},
  109.   {44, 45, 46, 47} };
  110. //! look up tables for FRExt_chroma support
  111. const unsigned char subblk_offset_x[3][8][4] =
  112. {
  113.   { {0, 4, 0, 4},
  114.     {0, 4, 0, 4},
  115.     {0, 0, 0, 0},
  116.     {0, 0, 0, 0},
  117.     {0, 0, 0, 0},
  118.     {0, 0, 0, 0},
  119.     {0, 0, 0, 0},
  120.     {0, 0, 0, 0}, },
  121.   { {0, 4, 0, 4},
  122.     {0, 4, 0, 4},
  123.     {0, 4, 0, 4},
  124.     {0, 4, 0, 4},
  125.     {0, 0, 0, 0},
  126.     {0, 0, 0, 0},
  127.     {0, 0, 0, 0},
  128.     {0, 0, 0, 0}, },
  129.   { {0, 4, 0, 4},
  130.     {8,12, 8,12},
  131.     {0, 4, 0, 4},
  132.     {8,12, 8,12},
  133.     {0, 4, 0, 4},
  134.     {8,12, 8,12},
  135.     {0, 4, 0, 4},
  136.     {8,12, 8,12}  }
  137. };
  138. const unsigned char subblk_offset_y[3][8][4] =
  139. { { {0, 0, 4, 4},
  140.     {0, 0, 4, 4},
  141.     {0, 0, 0, 0},
  142.     {0, 0, 0, 0},
  143.     {0, 0, 0, 0},
  144.     {0, 0, 0, 0},
  145.     {0, 0, 0, 0},
  146.     {0, 0, 0, 0}, },
  147.   { {0, 0, 4, 4},
  148.     {8, 8,12,12},
  149.     {0, 0, 4, 4},
  150.     {8, 8,12,12},
  151.     {0, 0, 0, 0},
  152.     {0, 0, 0, 0},
  153.     {0, 0, 0, 0},
  154.     {0, 0, 0, 0}  },
  155.   { {0, 0, 4, 4},
  156.     {0, 0, 4, 4},
  157.     {8, 8,12,12},
  158.     {8, 8,12,12},
  159.     {0, 0, 4, 4},
  160.     {0, 0, 4, 4},
  161.     {8, 8,12,12},
  162.     {8, 8,12,12} }
  163. };
  164. const unsigned char cofuv_blk_x[3][8][4] =
  165. { { {0, 1, 0, 1},
  166.     {0, 1, 0, 1},
  167.     {0, 0, 0, 0},
  168.     {0, 0, 0, 0},
  169.     {0, 0, 0, 0},
  170.     {0, 0, 0, 0},
  171.     {0, 0, 0, 0},
  172.     {0, 0, 0, 0} },
  173.   { {0, 1, 0, 1},
  174.     {0, 1, 0, 1},
  175.     {0, 1, 0, 1},
  176.     {0, 1, 0, 1},
  177.     {0, 0, 0, 0},
  178.     {0, 0, 0, 0},
  179.     {0, 0, 0, 0},
  180.     {0, 0, 0, 0} },
  181.   { {0, 1, 0, 1},
  182.     {2, 3, 2, 3},
  183.     {0, 1, 0, 1},
  184.     {2, 3, 2, 3},
  185.     {0, 1, 0, 1},
  186.     {2, 3, 2, 3},
  187.     {0, 1, 0, 1},
  188.     {2, 3, 2, 3} }
  189. };
  190. static const unsigned char cofuv_blk_y[3][8][4] =
  191. {
  192.   { { 0, 0, 1, 1},
  193.     { 0, 0, 1, 1},
  194.     { 0, 0, 0, 0},
  195.     { 0, 0, 0, 0},
  196.     { 0, 0, 0, 0},
  197.     { 0, 0, 0, 0},
  198.     { 0, 0, 0, 0},
  199.     { 0, 0, 0, 0} },
  200.   { { 0, 0, 1, 1},
  201.     { 2, 2, 3, 3},
  202.     { 0, 0, 1, 1},
  203.     { 2, 2, 3, 3},
  204.     { 0, 0, 0, 0},
  205.     { 0, 0, 0, 0},
  206.     { 0, 0, 0, 0},
  207.     { 0, 0, 0, 0} },
  208.   { { 0, 0, 1, 1},
  209.     { 0, 0, 1, 1},
  210.     { 2, 2, 3, 3},
  211.     { 2, 2, 3, 3},
  212.     { 0, 0, 1, 1},
  213.     { 0, 0, 1, 1},
  214.     { 2, 2, 3, 3},
  215.     { 2, 2, 3, 3}}
  216. };
  217. void dectracebitcnt(int count);
  218. extern int last_dquant;
  219. extern ColocatedParams *Co_located;
  220. extern ColocatedParams *Co_located_JV[MAX_PLANE];  //!< Co_located to be used during 4:4:4 independent mode decoding
  221. static void readMotionInfoFromNAL  (ImageParameters *img, Macroblock *currMB);
  222. static void read_ipred_modes       (ImageParameters *img, Macroblock *currMB);
  223. static void readCBPandCoeffsFromNAL(ImageParameters *img, Macroblock *currMB);
  224. static void readIPCMcoeffsFromNAL  (ImageParameters *img, struct datapartition *dP);
  225. // Interpret MB mode
  226. static void (*interpret_mb_mode)(Macroblock *currMB);
  227. /*!
  228.  ************************************************************************
  229.  * brief
  230.  *    Set context for reference frames
  231.  ************************************************************************
  232.  */
  233. int BType2CtxRef (int btype)
  234. {
  235.   return (btype >= 4);
  236. }
  237. /*!
  238.  ************************************************************************
  239.  * brief
  240.  *    Function pointer for reading the reference picture indices
  241.  ************************************************************************
  242.  */
  243. static char (*readRefPictureIdx)   (SyntaxElement *currSE, DataPartition *dP, char b8mode, int list);
  244. /*!
  245.  ************************************************************************
  246.  * brief
  247.  *    Function for reading the reference picture indices using VLC
  248.  ************************************************************************
  249.  */
  250. static char readRefPictureIdx_VLC(SyntaxElement *currSE, DataPartition *dP, char b8mode, int list)
  251. {
  252. #if TRACE
  253.   static char tstring[20];   
  254.   sprintf( tstring, "ref_idx_l%d", list); 
  255.   strncpy(currSE->tracestring, tstring, TRACESTRING_SIZE);
  256. #endif
  257.   currSE->context = BType2CtxRef (b8mode);
  258.   currSE->value2 = list;
  259.   dP->readSyntaxElement (currSE,img,dP);
  260.   return (char) currSE->value1;
  261. }
  262. /*!
  263.  ************************************************************************
  264.  * brief
  265.  *    Function for reading the reference picture indices using FLC
  266.  ************************************************************************
  267.  */
  268. static char readRefPictureIdx_FLC(SyntaxElement *currSE, DataPartition *dP, char b8mode, int list)
  269. {
  270. #if TRACE
  271.   static char tstring[20];   
  272.   sprintf( tstring, "ref_idx_l%d", list); 
  273.   strncpy(currSE->tracestring, tstring, TRACESTRING_SIZE);
  274. #endif
  275.   currSE->context = BType2CtxRef (b8mode);
  276.   currSE->len = 1;
  277.   readSyntaxElement_FLC(currSE, dP->bitstream);
  278.   currSE->value1 = 1 - currSE->value1;
  279.   return (char) currSE->value1;
  280. }
  281. /*!
  282.  ************************************************************************
  283.  * brief
  284.  *    Dummy Function for reading the reference picture indices
  285.  ************************************************************************
  286.  */
  287. static char readRefPictureIdx_Null(SyntaxElement *currSE, DataPartition *dP, char b8mode, int list)
  288. {
  289.   return 0;
  290. }
  291. /*!
  292.  ************************************************************************
  293.  * brief
  294.  *    Function to prepare reference picture indice function pointer
  295.  ************************************************************************
  296.  */
  297. static inline void prepareListforRefIdx ( SyntaxElement *currSE, DataPartition *dP, int num_ref_idx_active, int refidx_present)
  298. {
  299.   readRefPictureIdx = readRefPictureIdx_Null; // Initialize readRefPictureIdx
  300.   if(num_ref_idx_active > 1)
  301.   {
  302.     if (active_pps->entropy_coding_mode_flag == UVLC || dP->bitstream->ei_flag)
  303.     {
  304.       currSE->mapping = linfo_ue;
  305.       if (refidx_present)
  306.       {
  307.         if (num_ref_idx_active == 2)
  308.           readRefPictureIdx = readRefPictureIdx_FLC;        
  309.         else
  310.           readRefPictureIdx = readRefPictureIdx_VLC;
  311.       }
  312.     }
  313.     else
  314.     {
  315.       currSE->reading = readRefFrame_CABAC;
  316.       if (refidx_present)
  317.         readRefPictureIdx = readRefPictureIdx_VLC;
  318.     }
  319.   }    
  320. }
  321. void set_chroma_qp(ImageParameters *img, Macroblock* currMB)
  322. {
  323.   int i;
  324.   for (i=0; i<2; i++)
  325.   {
  326.     currMB->qpc[i] = iClip3 ( -img->bitdepth_chroma_qp_scale, 51, currMB->qp + dec_picture->chroma_qp_offset[i] );
  327.     currMB->qpc[i] = currMB->qpc[i] < 0 ? currMB->qpc[i] : QP_SCALE_CR[currMB->qpc[i]];
  328.     currMB->qp_scaled[i + 1] = currMB->qpc[i] + img->bitdepth_chroma_qp_scale;
  329.   }
  330. }
  331. /*!
  332. ************************************************************************
  333. * brief
  334. *    updates chroma QP according to luma QP and bit depth
  335. ************************************************************************
  336. */
  337. void update_qp(ImageParameters *img, Macroblock *currMB, int qp)
  338. {
  339.   currMB->qp = qp;
  340.   currMB->qp_scaled[0] = qp + img->bitdepth_luma_qp_scale;
  341.   set_chroma_qp(img, currMB);
  342. }
  343. static void read_delta_quant(SyntaxElement *currSE, DataPartition *dP, Slice *currSlice, ImageParameters *img, Macroblock *currMB, int *partMap, int type)
  344. {
  345.   currSE->type = type;
  346.   dP = &(currSlice->partArr[partMap[currSE->type]]);
  347.   if (active_pps->entropy_coding_mode_flag == UVLC || dP->bitstream->ei_flag)
  348.   {
  349.     currSE->mapping = linfo_se;
  350.   }
  351.   else
  352.     currSE->reading= readDquant_CABAC;
  353.   TRACE_STRING_P("mb_qp_delta");
  354.   dP->readSyntaxElement(currSE,img,dP);
  355.   currMB->delta_quant = currSE->value1;
  356.   if ((currMB->delta_quant < -(26 + img->bitdepth_luma_qp_scale/2)) || (currMB->delta_quant > (25 + img->bitdepth_luma_qp_scale/2)))
  357.     error ("mb_qp_delta is out of range", 500);
  358.   img->qp = ((img->qp + currMB->delta_quant + 52 + 2*img->bitdepth_luma_qp_scale)%(52+img->bitdepth_luma_qp_scale)) -
  359.     img->bitdepth_luma_qp_scale;
  360.   update_qp(img, currMB, img->qp);
  361. }
  362. /*!
  363.  ************************************************************************
  364.  * brief
  365.  *    Function to read reference picture indice values
  366.  ************************************************************************
  367.  */
  368. static inline void readMBRefPictureIdx (SyntaxElement *currSE, DataPartition *dP, Macroblock *currMB, ImageParameters *img, char  **cur_ref_idx, int list, int step_v0, int step_h0)
  369. {
  370.   static int k, j, j0, i0;
  371.   static char refframe;
  372.   for (j0 = 0; j0 < 4; j0 += step_v0)
  373.   {
  374.     img->subblock_y = j0;
  375.     for (i0 = 0; i0 < 4; i0 += step_h0)
  376.     {
  377.       img->subblock_x = i0;
  378.       k = 2 * (j0 >> 1) + (i0 >> 1);
  379.       if ((currMB->b8pdir[k] == list || currMB->b8pdir[k] == BI_PRED) && currMB->b8mode[k] != 0)
  380.       {
  381.         refframe = readRefPictureIdx(currSE, dP, currMB->b8mode[k], list);
  382.         for (j = j0; j < j0 + step_v0; j++)
  383.           memset(&cur_ref_idx[j][img->block_x + i0], refframe, step_h0 * sizeof(char));
  384.       }
  385.     }
  386.   }
  387. }
  388. /*!
  389.  ************************************************************************
  390.  * brief
  391.  *    Function to read reference picture indice values
  392.  ************************************************************************
  393.  */
  394. static inline void readMBMotionVectors (SyntaxElement *currSE, DataPartition *dP, Macroblock *currMB, ImageParameters *img, int list, int step_h0, int step_v0)
  395. {
  396.   static int i, j, k, i4, j4, ii, jj, kk, i0, j0;
  397.   static short curr_mvd[2], curr_mv[2], pred_mv[2];
  398.   static short (*mvd)[4][2];
  399.   static short ***mv;
  400.   static int mv_mode, step_h, step_v;
  401.   static char cur_ref_idx;
  402.   for (j0=0; j0<4; j0+=step_v0)
  403.   {
  404.     for (i0=0; i0<4; i0+=step_h0)
  405.     {       
  406.       kk = 2 * (j0 >> 1) + (i0 >> 1);
  407.       if ((currMB->b8pdir[kk]== list || currMB->b8pdir[kk]== BI_PRED) && (currMB->b8mode[kk] !=0))//has forward vector
  408.       {
  409.         cur_ref_idx = dec_picture->motion.ref_idx[list][img->block_y+j0][img->block_x+i0];
  410.         mv_mode  = currMB->b8mode[kk];
  411.         step_h = BLOCK_STEP [mv_mode][0];
  412.         step_v = BLOCK_STEP [mv_mode][1];
  413.         for (j = j0; j < j0 + step_v0; j += step_v)
  414.         {
  415.           img->subblock_y = j; // position used for context determination
  416.           j4 = img->block_y + j;
  417.           mv  = &dec_picture->motion.mv [list][j4];
  418.           mvd = &currMB->mvd     [list][j];
  419.           for (i = i0; i < i0 + step_h0; i += step_h)
  420.           {
  421.             img->subblock_x = i; // position used for context determination
  422.             i4 = img->block_x + i;
  423.             // first make mv-prediction
  424.             SetMotionVectorPredictor (img, currMB, pred_mv, cur_ref_idx, (byte) list, dec_picture->motion.ref_idx, dec_picture->motion.mv, BLOCK_SIZE * i, BLOCK_SIZE * j, 4*step_h, 4*step_v);
  425.             for (k=0; k < 2; k++)
  426.             {
  427. #if TRACE
  428.               static char tstring[20];   
  429.               sprintf( tstring, "mvd_l%d", list); 
  430.               strncpy(currSE->tracestring, tstring, TRACESTRING_SIZE);
  431. #endif
  432.               currSE->value2   = (k << 1) + list; // identifies the component; only used for context determination
  433.               dP->readSyntaxElement(currSE,img,dP);
  434.               curr_mvd[k] = (short) currSE->value1;
  435.               curr_mv [k] = (short)(curr_mvd[k] + pred_mv[k]);  // compute motion vector 
  436.             }
  437.             // Init first line (mv)
  438.             for(ii = i4; ii < i4 + step_h; ii++)
  439.             {
  440.               memcpy(&mv[0][ii][0], curr_mv,  2 * sizeof(short));
  441.             }              
  442.             // now copy all other lines
  443.             for(jj = 1; jj < step_v; jj++)
  444.             {
  445.               memcpy(&mv[jj][i4][0], &mv[0][i4][0],  2 * step_h * sizeof(short));
  446.             }
  447.             // Init first line (mvd)
  448.             for(ii = i; ii < i + step_h; ii++)
  449.             {
  450.               memcpy(&mvd[0][ii][0], curr_mvd,  2 * sizeof(short));
  451.             }              
  452.             // now copy all other lines
  453.             for(jj = 1; jj < step_v; jj++)
  454.             {
  455.               memcpy(&mvd[jj][i][0], &mvd[0][i][0],  2 * step_h * sizeof(short));
  456.             }
  457.           }
  458.         }
  459.       }
  460.     }
  461.   }
  462. }
  463. void invScaleCoeff(ImageParameters *img, Macroblock *currMB, int level, int run, int qp_per, int i, int j, int i0, int j0, int coef_ctr, const byte (*pos_scan4x4)[2], int (*InvLevelScale4x4)[4])
  464. {
  465.   if (level != 0)    /* leave if len=1 */
  466.   {
  467.     coef_ctr += run + 1;
  468.     i0=pos_scan4x4[coef_ctr][0];
  469.     j0=pos_scan4x4[coef_ctr][1];
  470.     currMB->cbp_blk |= (int64)1 << ((j << 2) + i) ;
  471.     img->cof[0][(j<<2) + j0][(i<<2) + i0]= rshift_rnd_sf((level * InvLevelScale4x4[j0][i0]) << qp_per, 4);
  472.   }
  473. }
  474. /*!
  475.  ************************************************************************
  476.  * brief
  477.  *    initializes the current macroblock
  478.  ************************************************************************
  479.  */
  480. void start_macroblock(ImageParameters *img, Macroblock **currMB)
  481. {
  482.   int mb_nr = img->current_mb_nr;
  483.   *currMB = &img->mb_data[mb_nr];   // intialization code deleted, see below, StW  
  484.   (*currMB)->mbAddrX = mb_nr;
  485.   assert (mb_nr < (int) img->PicSizeInMbs);
  486.   /* Update coordinates of the current macroblock */
  487.   if (img->MbaffFrameFlag)
  488.   {
  489.     img->mb_x =    (mb_nr) % ((2*img->width) / MB_BLOCK_SIZE);
  490.     img->mb_y = 2*((mb_nr) / ((2*img->width) / MB_BLOCK_SIZE));
  491.     img->mb_y += (img->mb_x & 0x01);
  492.     img->mb_x >>= 1;
  493.   }
  494.   else
  495.   {
  496.     img->mb_x = PicPos[mb_nr][0];
  497.     img->mb_y = PicPos[mb_nr][1];
  498.   }
  499.   /* Define vertical positions */
  500.   img->block_y = img->mb_y * BLOCK_SIZE;      /* luma block position */
  501.   img->block_y_aff = img->block_y;
  502.   img->pix_y   = img->mb_y * MB_BLOCK_SIZE;   /* luma macroblock position */
  503.   img->pix_c_y = img->mb_y * img->mb_cr_size_y; /* chroma macroblock position */
  504.   /* Define horizontal positions */
  505.   img->block_x = img->mb_x * BLOCK_SIZE;      /* luma block position */
  506.   img->pix_x   = img->mb_x * MB_BLOCK_SIZE;   /* luma pixel position */
  507.   img->pix_c_x = img->mb_x * img->mb_cr_size_x; /* chroma pixel position */
  508.   // Save the slice number of this macroblock. When the macroblock below
  509.   // is coded it will use this to decide if prediction for above is possible
  510.   (*currMB)->slice_nr = img->current_slice_nr;
  511.   if (img->current_slice_nr >= MAX_NUM_SLICES)
  512.   {
  513.     error ("Maximum number of supported slices exceeded. nPlease recompile with increased value for MAX_NUM_SLICES", 200);
  514.   }
  515.   dec_picture->slice_id[img->mb_y][img->mb_x] = (short) img->current_slice_nr;
  516.   dec_picture->max_slice_id = (short) imax(img->current_slice_nr, dec_picture->max_slice_id);
  517.   CheckAvailabilityOfNeighbors(*currMB);
  518.   // Reset syntax element entries in MB struct
  519.   (*currMB)->qp              = img->qp ;
  520.   (*currMB)->mb_type         = 0;
  521.   (*currMB)->delta_quant     = 0;
  522.   (*currMB)->cbp             = 0;
  523.   (*currMB)->cbp_blk         = 0;
  524.   (*currMB)->cbp_blk_CbCr[0] = 0;
  525.   (*currMB)->cbp_blk_CbCr[1] = 0;  
  526.   (*currMB)->c_ipred_mode    = DC_PRED_8; //GB
  527.   memset(&((*currMB)->mvd[0][0][0][0]),0, 2 * BLOCK_MULTIPLE * BLOCK_MULTIPLE * 2 * sizeof(short));
  528.   
  529.   memset((*currMB)->cbp_bits, 0, 3 * sizeof(int64));
  530.   memset((*currMB)->cbp_bits_8x8, 0, 3 * sizeof(int64));
  531.   // initialize img->mb_rres
  532.   memset(&(img->mb_rres[0][0][0]), 0, 3 * MB_PIXELS * sizeof(int));
  533.   // store filtering parameters for this MB
  534.   (*currMB)->DFDisableIdc = img->currentSlice->DFDisableIdc;
  535.   (*currMB)->DFAlphaC0Offset = img->currentSlice->DFAlphaC0Offset;
  536.   (*currMB)->DFBetaOffset = img->currentSlice->DFBetaOffset;
  537. }
  538. /*!
  539.  ************************************************************************
  540.  * brief
  541.  *    set coordinates of the next macroblock
  542.  *    check end_of_slice condition
  543.  ************************************************************************
  544.  */
  545. Boolean exit_macroblock(ImageParameters *img,int eos_bit)
  546. {
  547.  //! The if() statement below resembles the original code, which tested
  548.   //! img->current_mb_nr == img->PicSizeInMbs.  Both is, of course, nonsense
  549.   //! In an error prone environment, one can only be sure to have a new
  550.   //! picture by checking the tr of the next slice header!
  551. // printf ("exit_macroblock: FmoGetLastMBOfPicture %d, img->current_mb_nr %dn", FmoGetLastMBOfPicture(), img->current_mb_nr);
  552.   img->num_dec_mb++;
  553.   if (img->num_dec_mb == img->PicSizeInMbs)
  554.   {
  555.     return TRUE;
  556.   }
  557.   // ask for last mb in the slice  UVLC
  558.   else
  559.   {
  560.     img->current_mb_nr = FmoGetNextMBNr (img->current_mb_nr);
  561.     if (img->current_mb_nr == -1)     // End of Slice group, MUST be end of slice
  562.     {
  563.       assert (nal_startcode_follows (img->currentSlice, eos_bit) == TRUE);
  564.       return TRUE;
  565.     }
  566.     if(nal_startcode_follows(img->currentSlice, eos_bit) == FALSE)
  567.       return FALSE;
  568.     if(img->type == I_SLICE  || img->type == SI_SLICE || active_pps->entropy_coding_mode_flag == CABAC)
  569.       return TRUE;
  570.     if(img->cod_counter <= 0)
  571.       return TRUE;
  572.     return FALSE;
  573.   }
  574. }
  575. /*!
  576.  ************************************************************************
  577.  * brief
  578.  *    Interpret the mb mode for P-Frames
  579.  ************************************************************************
  580.  */
  581. static void interpret_mb_mode_P(Macroblock *currMB)
  582. {
  583.   const int ICBPTAB[6] = {0,16,32,15,31,47};
  584.   int         mbmode = currMB->mb_type;
  585. #define ZERO_P8x8     (mbmode==5)
  586. #define MODE_IS_P8x8  (mbmode==4 || mbmode==5)
  587. #define MODE_IS_I4x4  (mbmode==6)
  588. #define I16OFFSET     (mbmode-7)
  589. #define MODE_IS_IPCM  (mbmode==31)
  590.   if(mbmode <4)
  591.   {
  592.     currMB->mb_type = mbmode;
  593.     memset(&currMB->b8mode[0],mbmode,4 * sizeof(char));
  594.     memset(&currMB->b8pdir[0], 0, 4 * sizeof(char));
  595.   }
  596.   else if(MODE_IS_P8x8)
  597.   {
  598.     currMB->mb_type = P8x8;
  599.     img->allrefzero = ZERO_P8x8;
  600.   }
  601.   else if(MODE_IS_I4x4)
  602.   {
  603.     currMB->mb_type = I4MB;
  604.     memset(&currMB->b8mode[0],IBLOCK, 4 * sizeof(char));
  605.     memset(&currMB->b8pdir[0],    -1, 4 * sizeof(char));
  606.   }
  607.   else if(MODE_IS_IPCM)
  608.   {
  609.     currMB->mb_type = IPCM;
  610.     currMB->cbp = -1;
  611.     currMB->i16mode = 0;
  612.     memset(&currMB->b8mode[0], 0, 4 * sizeof(char));
  613.     memset(&currMB->b8pdir[0],-1, 4 * sizeof(char));
  614.   }
  615.   else
  616.   {
  617.     currMB->mb_type = I16MB;
  618.     currMB->cbp = ICBPTAB[(I16OFFSET)>>2];
  619.     currMB->i16mode = (I16OFFSET) & 0x03;
  620.     memset(&currMB->b8mode[0], 0, 4 * sizeof(char));
  621.     memset(&currMB->b8pdir[0],-1, 4 * sizeof(char));
  622.   }
  623. }
  624. /*!
  625.  ************************************************************************
  626.  * brief
  627.  *    Interpret the mb mode for I-Frames
  628.  ************************************************************************
  629.  */
  630. static void interpret_mb_mode_I(Macroblock *currMB)
  631. {
  632.   static const int ICBPTAB[6] = {0,16,32,15,31,47};
  633.   int         mbmode   = currMB->mb_type;
  634.   if (mbmode==0)
  635.   {
  636.     currMB->mb_type = I4MB;
  637.     memset(&currMB->b8mode[0],IBLOCK,4 * sizeof(char));
  638.     memset(&currMB->b8pdir[0],-1,4 * sizeof(char));
  639.   }
  640.   else if(mbmode==25)
  641.   {
  642.     currMB->mb_type=IPCM;
  643.     currMB->cbp= -1;
  644.     currMB->i16mode = 0;
  645.     memset(&currMB->b8mode[0],0,4 * sizeof(char));
  646.     memset(&currMB->b8pdir[0],-1,4 * sizeof(char));
  647.   }
  648.   else
  649.   {
  650.     currMB->mb_type = I16MB;
  651.     currMB->cbp= ICBPTAB[(mbmode-1)>>2];
  652.     currMB->i16mode = (mbmode-1) & 0x03;
  653.     memset(&currMB->b8mode[0], 0, 4 * sizeof(char));
  654.     memset(&currMB->b8pdir[0],-1, 4 * sizeof(char));
  655.   }
  656. }
  657. /*!
  658.  ************************************************************************
  659.  * brief
  660.  *    Interpret the mb mode for B-Frames
  661.  ************************************************************************
  662.  */
  663. static void interpret_mb_mode_B(Macroblock *currMB)
  664. {
  665.   static const int offset2pdir16x16[12]   = {0, 0, 1, 2, 0,0,0,0,0,0,0,0};
  666.   static const int offset2pdir16x8[22][2] = {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,1},{0,0},{0,1},{0,0},{1,0},
  667.                                              {0,0},{0,2},{0,0},{1,2},{0,0},{2,0},{0,0},{2,1},{0,0},{2,2},{0,0}};
  668.   static const int offset2pdir8x16[22][2] = {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,1},{0,0},{0,1},{0,0},
  669.                                              {1,0},{0,0},{0,2},{0,0},{1,2},{0,0},{2,0},{0,0},{2,1},{0,0},{2,2}};
  670.   const int ICBPTAB[6] = {0,16,32,15,31,47};
  671.   int i, mbmode;
  672.   int mbtype  = currMB->mb_type;
  673.   //--- set mbtype, b8type, and b8pdir ---
  674.   if (mbtype==0)       // direct
  675.   {
  676.     mbmode=0;
  677.     memset(&currMB->b8mode[0],0,4 * sizeof(char));
  678.     memset(&currMB->b8pdir[0],2,4 * sizeof(char));
  679.   }
  680.   else if (mbtype==23) // intra4x4
  681.   {
  682.     mbmode=I4MB;
  683.     memset(&currMB->b8mode[0],IBLOCK,4 * sizeof(char));
  684.     memset(&currMB->b8pdir[0],-1,4 * sizeof(char));
  685.   }
  686.   else if ((mbtype>23) && (mbtype<48) ) // intra16x16
  687.   {
  688.     mbmode=I16MB;
  689.     memset(&currMB->b8mode[0],0,4 * sizeof(char));
  690.     memset(&currMB->b8pdir[0],-1,4 * sizeof(char));
  691.     currMB->cbp     = ICBPTAB[(mbtype-24)>>2];
  692.     currMB->i16mode = (mbtype-24) & 0x03;
  693.   }
  694.   else if (mbtype==22) // 8x8(+split)
  695.   {
  696.     mbmode=P8x8;       // b8mode and pdir is transmitted in additional codewords
  697.   }
  698.   else if (mbtype<4)   // 16x16
  699.   {
  700.     mbmode=1;
  701.     memset(&currMB->b8mode[0], 1,4 * sizeof(char));
  702.     memset(&currMB->b8pdir[0],offset2pdir16x16[mbtype],4 * sizeof(char));
  703.   }
  704.   else if(mbtype==48)
  705.   {
  706.     mbmode=IPCM;
  707.     memset(&currMB->b8mode[0], 0,4 * sizeof(char));
  708.     memset(&currMB->b8pdir[0],-1,4 * sizeof(char));
  709.     currMB->cbp= -1;
  710.     currMB->i16mode = 0;
  711.   }
  712.   else if ((mbtype&0x01)==0) // 16x8
  713.   {
  714.     mbmode=2;
  715.     memset(&currMB->b8mode[0], 2,4 * sizeof(char));
  716.     for(i=0;i<4;i++)
  717.     {
  718.       currMB->b8pdir[i] = (char) offset2pdir16x8 [mbtype][i>>1];
  719.     }
  720.   }
  721.   else
  722.   {
  723.     mbmode=3;
  724.     memset(&currMB->b8mode[0], 3,4 * sizeof(char));
  725.     for(i=0;i<4;i++)
  726.     {
  727.       currMB->b8pdir[i] = (char) offset2pdir8x16 [mbtype][i&0x01];
  728.     }
  729.   }
  730.   currMB->mb_type = mbmode;
  731. }
  732. /*!
  733.  ************************************************************************
  734.  * brief
  735.  *    Interpret the mb mode for SI-Frames
  736.  ************************************************************************
  737.  */
  738. static void interpret_mb_mode_SI(Macroblock *currMB)
  739. {
  740.   const int ICBPTAB[6] = {0,16,32,15,31,47};
  741.   int         mbmode   = currMB->mb_type;
  742.   if (mbmode==0)
  743.   {
  744.     currMB->mb_type = SI4MB;
  745.     memset(&currMB->b8mode[0],IBLOCK,4 * sizeof(char));
  746.     memset(&currMB->b8pdir[0],-1,4 * sizeof(char));
  747.     img->siblock[img->mb_y][img->mb_x]=1;
  748.   }
  749.   else if (mbmode==1)
  750.   {
  751.     currMB->mb_type = I4MB;
  752.     memset(&currMB->b8mode[0],IBLOCK,4 * sizeof(char));
  753.     memset(&currMB->b8pdir[0],-1,4 * sizeof(char));
  754.   }
  755.   else if(mbmode==26)
  756.   {
  757.     currMB->mb_type=IPCM;
  758.     currMB->cbp= -1;
  759.     currMB->i16mode = 0;
  760.     memset(&currMB->b8mode[0],0,4 * sizeof(char));
  761.     memset(&currMB->b8pdir[0],-1,4 * sizeof(char));
  762.   }
  763.   else
  764.   {
  765.     currMB->mb_type = I16MB;
  766.     currMB->cbp= ICBPTAB[(mbmode-1)>>2];
  767.     currMB->i16mode = (mbmode-2) & 0x03;
  768.     memset(&currMB->b8mode[0],0,4 * sizeof(char));
  769.     memset(&currMB->b8pdir[0],-1,4 * sizeof(char));
  770.   }
  771. }
  772. /*!
  773.  ************************************************************************
  774.  * brief
  775.  *    Set mode interpretation based on slice type
  776.  ************************************************************************
  777.  */
  778. void set_interpret_mb_mode(int slice_type)
  779. {
  780.   switch (slice_type)
  781.   {
  782.   case P_SLICE: case SP_SLICE:
  783.     interpret_mb_mode = interpret_mb_mode_P;
  784.     break;
  785.   case B_SLICE:
  786.     interpret_mb_mode = interpret_mb_mode_B;
  787.     break;
  788.   case I_SLICE: 
  789.     interpret_mb_mode = interpret_mb_mode_I;
  790.     break;
  791.   case SI_SLICE: 
  792.     interpret_mb_mode = interpret_mb_mode_SI;
  793.     break;
  794.   default:
  795.     printf("Unsupported slice typen");
  796.     break;
  797.   }
  798. }
  799. /*!
  800.  ************************************************************************
  801.  * brief
  802.  *    init macroblock I and P frames
  803.  ************************************************************************
  804.  */
  805. static void init_macroblock(ImageParameters *img)
  806. {
  807.   int i, j, k;
  808.   for (k = LIST_0; k <= LIST_1; k++)
  809.   {
  810.     for(j = img->block_y; j < img->block_y + BLOCK_SIZE; j++)
  811.       memset(&img->ipredmode[j][img->block_x], DC_PRED, BLOCK_SIZE * sizeof(char));
  812.     for(j = img->block_y; j < img->block_y + BLOCK_SIZE; j++)
  813.     {                           // reset vectors and pred. modes
  814.       memset(&dec_picture->motion.mv[k][j][img->block_x][0], 0, 2 * BLOCK_SIZE * sizeof(short));
  815.       memset(&dec_picture->motion.ref_idx[k][j][img->block_x], -1, BLOCK_SIZE * sizeof(char));
  816.       for (i = img->block_x; i < img->block_x + BLOCK_SIZE;i++)
  817.       {
  818.         dec_picture->motion.ref_pic_id[k][j][i] = INT64_MIN;
  819.       }
  820.     }
  821.   }
  822. }
  823. /*!
  824.  ************************************************************************
  825.  * brief
  826.  *    Sets mode for 8x8 block
  827.  ************************************************************************
  828.  */
  829. void SetB8Mode (ImageParameters* img, Macroblock* currMB, int value, int i)
  830. {
  831.   static const int p_v2b8 [ 5] = {4, 5, 6, 7, IBLOCK};
  832.   static const int p_v2pd [ 5] = {0, 0, 0, 0, -1};
  833.   static const int b_v2b8 [14] = {0, 4, 4, 4, 5, 6, 5, 6, 5, 6, 7, 7, 7, IBLOCK};
  834.   static const int b_v2pd [14] = {2, 0, 1, 2, 0, 0, 1, 1, 2, 2, 0, 1, 2, -1};
  835.   if (img->type==B_SLICE)
  836.   {
  837.     currMB->b8mode[i] = (char) b_v2b8[value];
  838.     currMB->b8pdir[i] = (char) b_v2pd[value];
  839.   }
  840.   else
  841.   {
  842.     currMB->b8mode[i] = (char) p_v2b8[value];
  843.     currMB->b8pdir[i] = (char) p_v2pd[value];
  844.   }
  845. }
  846. void reset_coeffs(void)
  847. {
  848.   // reset all coeffs
  849.   memset(&img->fcf[0][0][0], 0, 3 * MB_PIXELS * sizeof(int));
  850.   memset(&img->cof[0][0][0], 0, 3 * MB_PIXELS * sizeof(int));
  851.   // CAVLC
  852.   if (active_pps->entropy_coding_mode_flag == UVLC)
  853.     memset(&img->nz_coeff[img->current_mb_nr][0][0][0], 0, 3 * BLOCK_SIZE * BLOCK_SIZE * sizeof(int));
  854. }
  855. void field_flag_inference(Macroblock *currMB)
  856. {
  857.   if (currMB->mbAvailA)
  858.   {
  859.     currMB->mb_field = img->mb_data[currMB->mbAddrA].mb_field;
  860.   }
  861.   else
  862.   {
  863.     // check top macroblock pair
  864.     currMB->mb_field = currMB->mbAvailB ? img->mb_data[currMB->mbAddrB].mb_field : 0;
  865.   }
  866. }
  867. void copy_macroblock(ImageParameters *img, Macroblock *currMB)
  868. {
  869.   short pred_mv[2];
  870.   int zeroMotionAbove;
  871.   int zeroMotionLeft;
  872.   PixelPos mb_a, mb_b;
  873.   int   i, j;
  874.   int   a_mv_y = 0;
  875.   int   a_ref_idx = 0;
  876.   int   b_mv_y = 0;
  877.   int   b_ref_idx = 0;
  878.   int   img_block_y   = img->block_y;
  879.   int   list_offset = ((img->MbaffFrameFlag)&&(currMB->mb_field))? (img->current_mb_nr & 0x01) ? 4 : 2 : 0;
  880.   short ***cur_mv = dec_picture->motion.mv[LIST_0];
  881.   get4x4Neighbour(currMB,-1, 0, img->mb_size[IS_LUMA], &mb_a);
  882.   get4x4Neighbour(currMB, 0,-1, img->mb_size[IS_LUMA], &mb_b);
  883.   if (mb_a.available)
  884.   {
  885.     a_mv_y    = cur_mv[mb_a.pos_y][mb_a.pos_x][1];
  886.     a_ref_idx = dec_picture->motion.ref_idx[LIST_0][mb_a.pos_y][mb_a.pos_x];
  887.     if (currMB->mb_field && !img->mb_data[mb_a.mb_addr].mb_field)
  888.     {
  889.       a_mv_y    /=2;
  890.       a_ref_idx *=2;
  891.     }
  892.     if (!currMB->mb_field && img->mb_data[mb_a.mb_addr].mb_field)
  893.     {
  894.       a_mv_y    *=2;
  895.       a_ref_idx >>=1;
  896.     }
  897.   }
  898.   if (mb_b.available)
  899.   {
  900.     b_mv_y    = cur_mv[mb_b.pos_y][mb_b.pos_x][1];
  901.     b_ref_idx = dec_picture->motion.ref_idx[LIST_0][mb_b.pos_y][mb_b.pos_x];
  902.     if (currMB->mb_field && !img->mb_data[mb_b.mb_addr].mb_field)
  903.     {
  904.       b_mv_y    /=2;
  905.       b_ref_idx *=2;
  906.     }
  907.     if (!currMB->mb_field && img->mb_data[mb_b.mb_addr].mb_field)
  908.     {
  909.       b_mv_y    *=2;
  910.       b_ref_idx >>=1;
  911.     }
  912.   }
  913.   zeroMotionLeft  = !mb_a.available ? 1 : a_ref_idx==0 && cur_mv[mb_a.pos_y][mb_a.pos_x][0]==0 && a_mv_y==0 ? 1 : 0;
  914.   zeroMotionAbove = !mb_b.available ? 1 : b_ref_idx==0 && cur_mv[mb_b.pos_y][mb_b.pos_x][0]==0 && b_mv_y==0 ? 1 : 0;
  915.   currMB->cbp = 0;
  916.   reset_coeffs();
  917.   if (zeroMotionAbove || zeroMotionLeft)
  918.   {
  919.     for(j = img_block_y; j < img_block_y + BLOCK_SIZE;j++)
  920.     {
  921.       memset(&cur_mv[j][img->block_x][0], 0, 2 * BLOCK_SIZE * sizeof(short));
  922.     }
  923.   }
  924.   else
  925.   {
  926.     SetMotionVectorPredictor (img, currMB, pred_mv, 0, LIST_0, dec_picture->motion.ref_idx, dec_picture->motion.mv, 0, 0, 16, 16);
  927.     for(j=img_block_y;j<img_block_y + BLOCK_SIZE;j++)
  928.     {        
  929.       for(i=img->block_x;i<img->block_x + BLOCK_SIZE;i++)
  930.         memcpy(&cur_mv[j][i][0], &pred_mv[0], 2 * sizeof(short));
  931.     }
  932.   }
  933.   for(j=img_block_y;j< img_block_y + BLOCK_SIZE;j++)
  934.   {
  935.     memset(&dec_picture->motion.ref_idx[LIST_0][j][img->block_x], 0, BLOCK_SIZE * sizeof(char));
  936.     for(i=img->block_x;i<img->block_x + BLOCK_SIZE;i++)
  937.     {        
  938.       dec_picture->motion.ref_pic_id[LIST_0][j][i] =
  939.         dec_picture->ref_pic_num[img->current_slice_nr][LIST_0 + list_offset][(short)dec_picture->motion.ref_idx[LIST_0][j][i]];
  940.     }
  941.   }  
  942. }
  943. /*!
  944.  ************************************************************************
  945.  * brief
  946.  *    Get the syntax elements from the NAL
  947.  ************************************************************************
  948.  */
  949. void read_one_macroblock(ImageParameters *img, Macroblock *currMB)
  950. {
  951.   int i;
  952.   SyntaxElement currSE;
  953.   int mb_nr = img->current_mb_nr; 
  954.   Slice *currSlice = img->currentSlice;
  955.   DataPartition *dP;
  956.   int *partMap = assignSE2partition[currSlice->dp_mode];
  957.   Macroblock *topMB = NULL;
  958.   int  prevMbSkipped = 0;
  959.   int  check_bottom, read_bottom, read_top;  
  960.   if (img->MbaffFrameFlag)
  961.   {
  962.     if (mb_nr&0x01)
  963.     {
  964.       topMB= &img->mb_data[mb_nr-1];
  965.       if(!(img->type == B_SLICE))
  966.         prevMbSkipped = (topMB->mb_type == 0);
  967.       else
  968.         prevMbSkipped = topMB->skip_flag;
  969.     }
  970.     else
  971.       prevMbSkipped = 0;
  972.   }
  973.   currMB->mb_field = ((mb_nr&0x01) == 0)? 0 : img->mb_data[mb_nr-1].mb_field;
  974.   update_qp(img, currMB, img->qp);
  975.   currSE.type = SE_MBTYPE;
  976.   //  read MB mode *****************************************************************
  977.   dP = &(currSlice->partArr[partMap[currSE.type]]);
  978.   if (active_pps->entropy_coding_mode_flag == UVLC || dP->bitstream->ei_flag)   
  979.     currSE.mapping = linfo_ue;
  980.   if(img->type == I_SLICE || img->type == SI_SLICE)
  981.   {
  982.     // read MB aff
  983.     if (img->MbaffFrameFlag && (mb_nr&0x01)==0)
  984.     {
  985.       TRACE_STRING("mb_field_decoding_flag");
  986.       if (active_pps->entropy_coding_mode_flag == UVLC || dP->bitstream->ei_flag)
  987.       {
  988.         currSE.len = (int64) 1;
  989.         readSyntaxElement_FLC(&currSE, dP->bitstream);
  990.       }
  991.       else
  992.       {
  993.         currSE.reading = readFieldModeInfo_CABAC;
  994.         dP->readSyntaxElement(&currSE,img,dP);
  995.       }
  996.       currMB->mb_field = currSE.value1;
  997.     }
  998.     
  999.     if(active_pps->entropy_coding_mode_flag  == CABAC)
  1000.       CheckAvailabilityOfNeighborsCABAC(currMB);
  1001.     //  read MB type
  1002.     TRACE_STRING("mb_type");
  1003.     currSE.reading = readMB_typeInfo_CABAC;
  1004.     dP->readSyntaxElement(&currSE,img,dP);
  1005.     currMB->mb_type = currSE.value1;
  1006.     if(!dP->bitstream->ei_flag)
  1007.       currMB->ei_flag = 0;
  1008.   }
  1009.   // non I/SI-slice CABAC
  1010.   else if (active_pps->entropy_coding_mode_flag == CABAC)
  1011.   {
  1012.     // read MB skip_flag
  1013.     if (img->MbaffFrameFlag && ((mb_nr&0x01) == 0||prevMbSkipped))
  1014.       field_flag_inference(currMB);
  1015.     CheckAvailabilityOfNeighborsCABAC(currMB);
  1016.     TRACE_STRING("mb_skip_flag");
  1017.     currSE.reading = readMB_skip_flagInfo_CABAC;
  1018.     dP->readSyntaxElement(&currSE,img,dP);
  1019.     currMB->mb_type   = currSE.value1;
  1020.     currMB->skip_flag = !(currSE.value1);
  1021.     if (img->type==B_SLICE)
  1022.       currMB->cbp = currSE.value2;
  1023.     if (!dP->bitstream->ei_flag)
  1024.       currMB->ei_flag = 0;
  1025.     if ((img->type==B_SLICE) && currSE.value1==0 && currSE.value2==0)
  1026.       img->cod_counter=0;
  1027.     // read MB AFF
  1028.     if (img->MbaffFrameFlag)
  1029.     {
  1030.       check_bottom=read_bottom=read_top=0;
  1031.       if ((mb_nr&0x01)==0)
  1032.       {
  1033.         check_bottom =  currMB->skip_flag;
  1034.         read_top = !check_bottom;
  1035.       }
  1036.       else
  1037.       {
  1038.         read_bottom = (topMB->skip_flag && (!currMB->skip_flag));
  1039.        }
  1040.       if (read_bottom || read_top)
  1041.       {
  1042.         TRACE_STRING("mb_field_decoding_flag");
  1043.         currSE.reading = readFieldModeInfo_CABAC;
  1044.         dP->readSyntaxElement(&currSE,img,dP);
  1045.         currMB->mb_field = currSE.value1;
  1046.       }
  1047.       if (check_bottom)
  1048.         check_next_mb_and_get_field_mode_CABAC(&currSE,img,dP);
  1049.     }
  1050.     CheckAvailabilityOfNeighborsCABAC(currMB);
  1051.     // read MB type
  1052.     if (currMB->mb_type != 0 )
  1053.     {
  1054.       currSE.reading = readMB_typeInfo_CABAC;
  1055.       TRACE_STRING("mb_type");
  1056.       dP->readSyntaxElement(&currSE,img,dP);
  1057.       currMB->mb_type = currSE.value1;
  1058.       if(!dP->bitstream->ei_flag)
  1059.         currMB->ei_flag = 0;
  1060.     }
  1061.   }
  1062.   // VLC Non-Intra
  1063.   else
  1064.   {
  1065.     if(img->cod_counter == -1)
  1066.     {
  1067.       TRACE_STRING("mb_skip_run");
  1068.       dP->readSyntaxElement(&currSE,img,dP);
  1069.       img->cod_counter = currSE.value1;
  1070.     }
  1071.     if (img->cod_counter==0)
  1072.     {
  1073.       // read MB aff
  1074.       if ((img->MbaffFrameFlag) && (((mb_nr&0x01)==0) || ((mb_nr&0x01) && prevMbSkipped)))
  1075.       {
  1076.         TRACE_STRING("mb_field_decoding_flag");
  1077.         currSE.len = (int64) 1;
  1078.         readSyntaxElement_FLC(&currSE, dP->bitstream);
  1079.         currMB->mb_field = currSE.value1;
  1080.       }
  1081.       // read MB type
  1082.       TRACE_STRING("mb_type");
  1083.       dP->readSyntaxElement(&currSE,img,dP);
  1084.       if(img->type == P_SLICE || img->type == SP_SLICE)
  1085.         currSE.value1++;
  1086.       currMB->mb_type = currSE.value1;
  1087.       if(!dP->bitstream->ei_flag)
  1088.         currMB->ei_flag = 0;
  1089.       img->cod_counter--;
  1090.       currMB->skip_flag = 0;
  1091.     }
  1092.     else
  1093.     {
  1094.       img->cod_counter--;
  1095.       currMB->mb_type = 0;
  1096.       currMB->ei_flag = 0;
  1097.       currMB->skip_flag = 1;
  1098.       // read field flag of bottom block
  1099.       if(img->MbaffFrameFlag)
  1100.       {
  1101.         if(img->cod_counter == 0 && ((mb_nr&0x01) == 0))
  1102.         {
  1103.           TRACE_STRING("mb_field_decoding_flag (of coded bottom mb)");
  1104.           currSE.len = (int64) 1;
  1105.           readSyntaxElement_FLC(&currSE, dP->bitstream);
  1106.           dP->bitstream->frame_bitoffset--;
  1107.           TRACE_DECBITS(1);
  1108.           currMB->mb_field = currSE.value1;
  1109.         }
  1110.         else if(img->cod_counter > 0 && ((mb_nr&0x01) == 0))
  1111.         {
  1112.           // check left macroblock pair first
  1113.           if (mb_is_available(mb_nr-2, currMB)&&((mb_nr%(img->PicWidthInMbs*2))!=0))
  1114.           {
  1115.             currMB->mb_field = img->mb_data[mb_nr-2].mb_field;
  1116.           }
  1117.           else
  1118.           {
  1119.             // check top macroblock pair
  1120.             if (mb_is_available(mb_nr - 2*img->PicWidthInMbs, currMB))
  1121.             {
  1122.               currMB->mb_field = img->mb_data[mb_nr-2*img->PicWidthInMbs].mb_field;
  1123.             }
  1124.             else
  1125.               currMB->mb_field = 0;
  1126.           }
  1127.         }
  1128.       }
  1129.     }
  1130.   }
  1131.   dec_picture->motion.mb_field[mb_nr] = (byte) currMB->mb_field;
  1132.   img->block_y_aff = ((img->MbaffFrameFlag) && (currMB->mb_field)) ? (mb_nr&0x01) ? (img->block_y - 4)>>1 : img->block_y >> 1 : img->block_y;
  1133.   img->siblock[img->mb_y][img->mb_x]=0;
  1134.   interpret_mb_mode(currMB);
  1135.   if(img->MbaffFrameFlag)
  1136.   {
  1137.     if(currMB->mb_field)
  1138.     {
  1139.       img->num_ref_idx_l0_active <<=1;
  1140.       img->num_ref_idx_l1_active <<=1;
  1141.     }
  1142.   }
  1143.   //init NoMbPartLessThan8x8Flag
  1144.   currMB->NoMbPartLessThan8x8Flag = (IS_DIRECT(currMB) && !(active_sps->direct_8x8_inference_flag))? 0: 1;
  1145.   //====== READ 8x8 SUB-PARTITION MODES (modes of 8x8 blocks) and Intra VBST block modes ======
  1146.   if (IS_P8x8 (currMB))
  1147.   {
  1148.     currSE.type    = SE_MBTYPE;
  1149.     dP = &(currSlice->partArr[partMap[SE_MBTYPE]]);
  1150.     if (active_pps->entropy_coding_mode_flag ==UVLC || dP->bitstream->ei_flag) 
  1151.       currSE.mapping = linfo_ue;
  1152.     else
  1153.       currSE.reading = readB8_typeInfo_CABAC;
  1154.     for (i=0; i<4; i++)
  1155.     {
  1156.       TRACE_STRING("sub_mb_type");
  1157.       dP->readSyntaxElement (&currSE, img, dP);
  1158.       SetB8Mode (img, currMB, currSE.value1, i);
  1159.       //set NoMbPartLessThan8x8Flag for P8x8 mode
  1160.       currMB->NoMbPartLessThan8x8Flag &= (currMB->b8mode[i]==0 && active_sps->direct_8x8_inference_flag) ||
  1161.                                          (currMB->b8mode[i]==4);
  1162.     }
  1163.     //--- init macroblock data ---
  1164.     init_macroblock       (img);
  1165.     readMotionInfoFromNAL (img, currMB);
  1166.   }
  1167.   //============= Transform Size Flag for INTRA MBs =============
  1168.   //-------------------------------------------------------------
  1169.   //transform size flag for INTRA_4x4 and INTRA_8x8 modes
  1170.   if (currMB->mb_type == I4MB && img->Transform8x8Mode)
  1171.   {
  1172.     currSE.type   =  SE_HEADER;
  1173.     dP = &(currSlice->partArr[partMap[SE_HEADER]]);
  1174.     currSE.reading = readMB_transform_size_flag_CABAC;
  1175.     TRACE_STRING("transform_size_8x8_flag");
  1176.     // read UVLC transform_size_8x8_flag
  1177.     if (active_pps->entropy_coding_mode_flag == UVLC || dP->bitstream->ei_flag)
  1178.     {
  1179.       currSE.len = (int64) 1;
  1180.       readSyntaxElement_FLC(&currSE, dP->bitstream);
  1181.     }
  1182.     else
  1183.     {
  1184.       dP->readSyntaxElement(&currSE,img,dP);
  1185.     }
  1186.     currMB->luma_transform_size_8x8_flag = currSE.value1;
  1187.     if (currMB->luma_transform_size_8x8_flag)
  1188.     {
  1189.       currMB->mb_type = I8MB;
  1190.       for (i=0;i<4;i++)
  1191.       {
  1192.         currMB->b8mode[i]=I8MB;
  1193.         currMB->b8pdir[i]=-1;
  1194.       }
  1195.     }
  1196.   }
  1197.   else
  1198.   {
  1199.     currMB->luma_transform_size_8x8_flag = 0;
  1200.   }
  1201.   if(active_pps->constrained_intra_pred_flag && (img->type==P_SLICE|| img->type==B_SLICE))        // inter frame
  1202.   {
  1203.     if( !IS_INTRA(currMB) )
  1204.     {
  1205.       img->intra_block[mb_nr] = 0;
  1206.     }
  1207.   }
  1208.   //! TO for error concealment
  1209.   //! If we have an INTRA Macroblock and we lost the partition
  1210.   //! which contains the intra coefficients Copy MB would be better
  1211.   //! than just a gray block.
  1212.   //! Seems to be a bit at the wrong place to do this right here, but for this case
  1213.   //! up to now there is no other way.
  1214. /*
  1215.  !!!KS
  1216.   dP = &(currSlice->partArr[partMap[SE_CBP_INTRA]]);
  1217.   if(IS_INTRA (currMB) && dP->bitstream->ei_flag && img->number)
  1218.   {
  1219.     currMB->mb_type = 0;
  1220.     currMB->ei_flag = 1;
  1221.     for (i=0;i<4;i++) {currMB->b8mode[i]=currMB->b8pdir[i]=0; }
  1222.   }
  1223.   dP = &(currSlice->partArr[partMap[currSE.type]]);
  1224.   //! End TO
  1225. */
  1226.   //--- init macroblock data ---
  1227.   if (!IS_P8x8 (currMB))
  1228.     init_macroblock(img);
  1229.   if (IS_DIRECT (currMB) && img->cod_counter >= 0)
  1230.   {
  1231.     currMB->cbp = 0;
  1232.     reset_coeffs();
  1233.     if (active_pps->entropy_coding_mode_flag ==CABAC)
  1234.       img->cod_counter=-1;
  1235.   }
  1236.   else if (IS_COPY (currMB)) //keep last macroblock
  1237.   {
  1238.     copy_macroblock(img, currMB);
  1239.   }
  1240.   else if(currMB->mb_type != IPCM)
  1241.   {
  1242.     // intra prediction modes for a macroblock 4x4 **********************************************
  1243.     if (IS_INTRA(currMB))
  1244.       read_ipred_modes(img, currMB);
  1245.     // read inter frame vector data *********************************************************
  1246.     if (IS_INTERMV (currMB) && (!IS_P8x8(currMB)))
  1247.     {
  1248.       readMotionInfoFromNAL (img, currMB);
  1249.     }
  1250.     // read CBP and Coeffs  ***************************************************************
  1251.     readCBPandCoeffsFromNAL (img, currMB);
  1252.   }
  1253.   else
  1254.   {
  1255.     //read pcm_alignment_zero_bit and pcm_byte[i]
  1256.     // here dP is assigned with the same dP as SE_MBTYPE, because IPCM syntax is in the
  1257.     // same category as MBTYPE
  1258.     if ( currSlice->dp_mode && currSlice->dpB_NotPresent )
  1259.     {
  1260.       concealIPCMcoeffs(img);
  1261.     }
  1262.     else
  1263.     {
  1264.       dP = &(currSlice->partArr[partMap[SE_LUM_DC_INTRA]]);
  1265.       readIPCMcoeffsFromNAL(img, dP);
  1266.     }
  1267.   }
  1268.   return;
  1269. }
  1270. /*!
  1271.  ************************************************************************
  1272.  * brief
  1273.  *    Initialize decoding engine after decoding an IPCM macroblock
  1274.  *    (for IPCM CABAC  28/11/2003)
  1275.  *
  1276.  * author
  1277.  *    Dong Wang <Dong.Wang@bristol.ac.uk>
  1278.  ************************************************************************
  1279.  */
  1280. void init_decoding_engine_IPCM(ImageParameters *img)
  1281. {
  1282.   Slice *currSlice = img->currentSlice;
  1283.   Bitstream *currStream;
  1284.   int ByteStartPosition;
  1285.   int PartitionNumber;
  1286.   int i;
  1287.   if(currSlice->dp_mode==PAR_DP_1)
  1288.     PartitionNumber=1;
  1289.   else if(currSlice->dp_mode==PAR_DP_3)
  1290.     PartitionNumber=3;
  1291.   else
  1292.   {
  1293.     printf("Partition Mode is not supportedn");
  1294.     exit(1);
  1295.   }
  1296.   for(i=0;i<PartitionNumber;i++)
  1297.   {
  1298.     currStream = currSlice->partArr[i].bitstream;
  1299.     ByteStartPosition = currStream->read_len;
  1300.     arideco_start_decoding (&currSlice->partArr[i].de_cabac, currStream->streamBuffer, ByteStartPosition, &currStream->read_len);
  1301.   }
  1302. }
  1303. /*!
  1304.  ************************************************************************
  1305.  * brief
  1306.  *    Read IPCM pcm_alignment_zero_bit and pcm_byte[i] from stream to img->cof
  1307.  *    (for IPCM CABAC and IPCM CAVLC)
  1308.  *
  1309.  * author
  1310.  *    Dong Wang <Dong.Wang@bristol.ac.uk>
  1311.  ************************************************************************
  1312.  */
  1313. static void readIPCMcoeffsFromNAL(ImageParameters *img, struct datapartition *dP)
  1314. {
  1315.   SyntaxElement currSE;
  1316.   int i,j;
  1317.   //For CABAC, we don't need to read bits to let stream byte aligned
  1318.   //  because we have variable for integer bytes position
  1319.   if(active_pps->entropy_coding_mode_flag  == CABAC)
  1320.   {
  1321.     readIPCM_CABAC(dP);
  1322.     init_decoding_engine_IPCM(img);
  1323.   }
  1324.   else
  1325.   {
  1326.     //read bits to let stream byte aligned
  1327.     if(((dP->bitstream->frame_bitoffset) & 0x07) != 0)
  1328.     {
  1329.       TRACE_STRING("pcm_alignment_zero_bit");
  1330.       currSE.len = (8 - ((dP->bitstream->frame_bitoffset) & 0x07));
  1331.       readSyntaxElement_FLC(&currSE, dP->bitstream);
  1332.     }
  1333.     //read luma and chroma IPCM coefficients
  1334.     currSE.len=img->bitdepth_luma;
  1335.     TRACE_STRING("pcm_sample_luma");
  1336.     for(i=0;i<MB_BLOCK_SIZE;i++)
  1337.     {
  1338.       for(j=0;j<MB_BLOCK_SIZE;j++)
  1339.       {
  1340.         readSyntaxElement_FLC(&currSE, dP->bitstream);
  1341.         img->cof[0][i][j] = currSE.value1;
  1342.         img->fcf[0][i][j] = currSE.value1;
  1343.       }
  1344.     }
  1345.     currSE.len=img->bitdepth_chroma;
  1346.     if ((dec_picture->chroma_format_idc != YUV400) && !IS_INDEPENDENT(img))
  1347.     {
  1348.       TRACE_STRING("pcm_sample_chroma (u)");
  1349.       for(i=0;i<img->mb_cr_size_y;i++)
  1350.       {
  1351.         for(j=0;j<img->mb_cr_size_x;j++)
  1352.         {
  1353.           readSyntaxElement_FLC(&currSE, dP->bitstream);
  1354.           img->cof[1][i][j] = currSE.value1;
  1355.           img->fcf[1][i][j] = currSE.value1;
  1356.         }
  1357.       }
  1358.       TRACE_STRING("pcm_sample_chroma (v)");
  1359.       for(i=0;i<img->mb_cr_size_y;i++)
  1360.       {
  1361.         for(j=0;j<img->mb_cr_size_x;j++)
  1362.         {
  1363.           readSyntaxElement_FLC(&currSE, dP->bitstream);
  1364.           img->cof[2][i][j] = currSE.value1;
  1365.           img->fcf[2][i][j] = currSE.value1;
  1366.         }
  1367.       }
  1368.     }
  1369.   }
  1370. }
  1371. /*!
  1372.  ************************************************************************
  1373.  * brief
  1374.  *    If data partition B is lost, conceal PCM sample values with DC.
  1375.  *
  1376.  ************************************************************************
  1377.  */
  1378. void concealIPCMcoeffs(ImageParameters *img)
  1379. {
  1380.   int i, j, k;
  1381.   for(i=0;i<MB_BLOCK_SIZE;i++)
  1382.   {
  1383.     for(j=0;j<MB_BLOCK_SIZE;j++)
  1384.     {
  1385.       img->cof[0][i][j] = img->dc_pred_value_comp[0];
  1386.       img->fcf[0][i][j] = img->dc_pred_value_comp[0];
  1387.     }
  1388.   }
  1389.   if ((dec_picture->chroma_format_idc != YUV400) && !IS_INDEPENDENT(img))
  1390.   {
  1391.     for (k = 0; k < 2; k++)
  1392.     {
  1393.       for(i=0;i<img->mb_cr_size_y;i++)
  1394.       {
  1395.         for(j=0;j<img->mb_cr_size_x;j++)
  1396.         {
  1397.           img->cof[k][i][j] = img->dc_pred_value_comp[k];
  1398.           img->fcf[k][i][j] = img->dc_pred_value_comp[k];
  1399.         }
  1400.       }
  1401.     }
  1402.   }
  1403. }
  1404. static void read_ipred_modes(ImageParameters *img, Macroblock *currMB)
  1405. {
  1406.   int b8,i,j,bi,bj,bx,by,dec;
  1407.   SyntaxElement currSE;
  1408.   DataPartition *dP;
  1409.   Slice *currSlice = img->currentSlice;
  1410.   int *partMap = assignSE2partition[currSlice->dp_mode];
  1411.   int ts, ls;
  1412.   int mostProbableIntraPredMode;
  1413.   int upIntraPredMode;
  1414.   int leftIntraPredMode;
  1415.   char IntraChromaPredModeFlag = IS_INTRA(currMB);
  1416.   int bs_x, bs_y;
  1417.   int ii,jj;
  1418.   
  1419.   PixelPos left_block, top_block;
  1420.   currSE.type = SE_INTRAPREDMODE;
  1421.   TRACE_STRING("intra4x4_pred_mode");
  1422.   dP = &(currSlice->partArr[partMap[currSE.type]]);
  1423.   if (!(active_pps->entropy_coding_mode_flag == UVLC || dP->bitstream->ei_flag))
  1424.     currSE.reading = readIntraPredMode_CABAC;
  1425.     
  1426.   for(b8 = 0; b8 < 4; b8++)  //loop 8x8 blocks
  1427.   {
  1428.     if((currMB->b8mode[b8]==IBLOCK )||(currMB->b8mode[b8]==I8MB))
  1429.     {
  1430.       bs_x = bs_y = (currMB->b8mode[b8] == I8MB)?8:4;
  1431.       IntraChromaPredModeFlag = 1;
  1432.       ii = (bs_x>>2);
  1433.       jj = (bs_y>>2);
  1434.       for(j=0;j<2;j+=jj)  //loop subblocks
  1435.       {
  1436.         by = (b8&2) + j;
  1437.         bj = img->block_y + by;
  1438.         for(i=0;i<2;i+=ii)
  1439.         {
  1440.           bx = ((b8&1)<<1) + i;
  1441.           bi = img->block_x + bx;
  1442.           //get from stream
  1443.           if (active_pps->entropy_coding_mode_flag == UVLC || dP->bitstream->ei_flag)
  1444.             readSyntaxElement_Intra4x4PredictionMode(&currSE,img,dP->bitstream);
  1445.           else
  1446.           {
  1447.             currSE.context=(b8<<2)+(j<<1) +i;
  1448.             dP->readSyntaxElement(&currSE,img,dP);
  1449.           }
  1450.           get4x4Neighbour(currMB, (bx<<2) - 1, (by<<2),     img->mb_size[IS_LUMA], &left_block);
  1451.           get4x4Neighbour(currMB, (bx<<2),     (by<<2) - 1, img->mb_size[IS_LUMA], &top_block );
  1452.           //get from array and decode
  1453.           if (active_pps->constrained_intra_pred_flag)
  1454.           {
  1455.             left_block.available = left_block.available ? img->intra_block[left_block.mb_addr] : 0;
  1456.             top_block.available  = top_block.available  ? img->intra_block[top_block.mb_addr]  : 0;
  1457.           }
  1458.           // !! KS: not sure if the following is still correct...
  1459.           ts = ls = 0;   // Check to see if the neighboring block is SI
  1460.           if (IS_OLDINTRA(currMB) && img->type == SI_SLICE)           // need support for MBINTLC1
  1461.           {
  1462.             if (left_block.available)
  1463.               if (img->siblock [left_block.pos_y][left_block.pos_x])
  1464.                 ls=1;
  1465.             if (top_block.available)
  1466.               if (img->siblock [top_block.pos_y][top_block.pos_x])
  1467.                 ts=1;
  1468.           }
  1469.           upIntraPredMode            = (top_block.available  &&(ts == 0)) ? img->ipredmode[top_block.pos_y ][top_block.pos_x ] : -1;
  1470.           leftIntraPredMode          = (left_block.available &&(ls == 0)) ? img->ipredmode[left_block.pos_y][left_block.pos_x] : -1;
  1471.           mostProbableIntraPredMode  = (upIntraPredMode < 0 || leftIntraPredMode < 0) ? DC_PRED : upIntraPredMode < leftIntraPredMode ? upIntraPredMode : leftIntraPredMode;
  1472.           dec = (currSE.value1 == -1) ? mostProbableIntraPredMode : currSE.value1 + (currSE.value1 >= mostProbableIntraPredMode);
  1473.           //set
  1474.           for(jj = 0; jj < (bs_y >> 2); jj++)   //loop 4x4s in the subblock for 8x8 prediction setting
  1475.           {
  1476.             memset(&(img->ipredmode[bj + jj][bi]), dec, (bs_x>>2) * sizeof(char));
  1477.           }
  1478.         }
  1479.       }
  1480.     }
  1481.   }
  1482.   if (IntraChromaPredModeFlag && (dec_picture->chroma_format_idc != YUV400) && (dec_picture->chroma_format_idc != YUV444))
  1483.   {
  1484.     currSE.type = SE_INTRAPREDMODE;
  1485.     TRACE_STRING("intra_chroma_pred_mode");
  1486.     dP = &(currSlice->partArr[partMap[currSE.type]]);
  1487.     if (active_pps->entropy_coding_mode_flag == UVLC || dP->bitstream->ei_flag) 
  1488.       currSE.mapping = linfo_ue;
  1489.     else
  1490.       currSE.reading = readCIPredMode_CABAC;
  1491.     dP->readSyntaxElement(&currSE,img,dP);
  1492.     currMB->c_ipred_mode = currSE.value1;
  1493.     if (currMB->c_ipred_mode < DC_PRED_8 || currMB->c_ipred_mode > PLANE_8)
  1494.     {
  1495.       error("illegal chroma intra pred mode!n", 600);
  1496.     }
  1497.   }
  1498. }
  1499. /*!
  1500.  ************************************************************************
  1501.  * brief
  1502.  *    Set motion vector predictor
  1503.  ************************************************************************
  1504.  */
  1505. void SetMotionVectorPredictor (ImageParameters  *img,
  1506.                                Macroblock *currMB,                               
  1507.                                short           pred_mv[2],
  1508.                                char            ref_frame,
  1509.                                byte            list,
  1510.                                char            ***refPic,
  1511.                                short           ****tmp_mv,
  1512.                                int             mb_x,
  1513.                                int             mb_y,
  1514.                                int             blockshape_x,
  1515.                                int             blockshape_y)
  1516. {
  1517.   int mv_a, mv_b, mv_c, pred_vec=0;
  1518.   int mvPredType, rFrameL, rFrameU, rFrameUR;
  1519.   int hv;
  1520.   PixelPos block_a, block_b, block_c, block_d;
  1521.   get4x4Neighbour(currMB, mb_x - 1,            mb_y,     img->mb_size[IS_LUMA], &block_a);
  1522.   get4x4Neighbour(currMB, mb_x,                mb_y - 1, img->mb_size[IS_LUMA], &block_b);
  1523.   get4x4Neighbour(currMB, mb_x + blockshape_x, mb_y - 1, img->mb_size[IS_LUMA], &block_c);
  1524.   get4x4Neighbour(currMB, mb_x - 1,            mb_y - 1, img->mb_size[IS_LUMA], &block_d);
  1525.   if (mb_y > 0)
  1526.   {
  1527.     if (mb_x < 8)  // first column of 8x8 blocks
  1528.     {
  1529.       if (mb_y==8)
  1530.       {
  1531.         if (blockshape_x == 16)      
  1532.           block_c.available  = 0;
  1533.       }
  1534.       else
  1535.       {
  1536.         if (mb_x + blockshape_x == 8)  
  1537.           block_c.available  = 0;
  1538.       }
  1539.     }
  1540.     else
  1541.     {
  1542.       if (mb_x + blockshape_x == 16)   
  1543.         block_c.available  = 0;
  1544.     }
  1545.   }
  1546.   if (!block_c.available)
  1547.   {
  1548.     block_c = block_d;
  1549.   }
  1550.   mvPredType = MVPRED_MEDIAN;
  1551.   if (!img->MbaffFrameFlag)
  1552.   {
  1553.     rFrameL  = block_a.available ? refPic[list][block_a.pos_y][block_a.pos_x] : -1;
  1554.     rFrameU  = block_b.available ? refPic[list][block_b.pos_y][block_b.pos_x] : -1;
  1555.     rFrameUR = block_c.available ? refPic[list][block_c.pos_y][block_c.pos_x] : -1;
  1556.   }
  1557.   else
  1558.   {
  1559.     if (img->mb_data[img->current_mb_nr].mb_field)
  1560.     {
  1561.       rFrameL    = block_a.available    ?
  1562.         img->mb_data[block_a.mb_addr].mb_field ?
  1563.         refPic[list][block_a.pos_y][block_a.pos_x]:
  1564.         refPic[list][block_a.pos_y][block_a.pos_x] * 2:
  1565.         -1;
  1566.       rFrameU    = block_b.available    ?
  1567.         img->mb_data[block_b.mb_addr].mb_field ?
  1568.         refPic[list][block_b.pos_y][block_b.pos_x]:
  1569.         refPic[list][block_b.pos_y][block_b.pos_x] * 2:
  1570.         -1;
  1571.       rFrameUR    = block_c.available    ?
  1572.         img->mb_data[block_c.mb_addr].mb_field ?
  1573.         refPic[list][block_c.pos_y][block_c.pos_x]:
  1574.         refPic[list][block_c.pos_y][block_c.pos_x] * 2:
  1575.         -1;
  1576.     }
  1577.     else
  1578.     {
  1579.       rFrameL    = block_a.available    ?
  1580.         img->mb_data[block_a.mb_addr].mb_field ?
  1581.         refPic[list][block_a.pos_y][block_a.pos_x] >>1:
  1582.         refPic[list][block_a.pos_y][block_a.pos_x] :
  1583.         -1;
  1584.       rFrameU    = block_b.available    ?
  1585.         img->mb_data[block_b.mb_addr].mb_field ?
  1586.         refPic[list][block_b.pos_y][block_b.pos_x] >>1:
  1587.         refPic[list][block_b.pos_y][block_b.pos_x] :
  1588.         -1;
  1589.       rFrameUR    = block_c.available    ?
  1590.         img->mb_data[block_c.mb_addr].mb_field ?
  1591.         refPic[list][block_c.pos_y][block_c.pos_x] >>1:
  1592.         refPic[list][block_c.pos_y][block_c.pos_x] :
  1593.         -1;
  1594.     }
  1595.   }
  1596.   /* Prediction if only one of the neighbors uses the reference frame
  1597.    * we are checking
  1598.    */
  1599.   if (rFrameL == ref_frame && rFrameU != ref_frame && rFrameUR != ref_frame)       
  1600.     mvPredType = MVPRED_L;
  1601.   else if(rFrameL != ref_frame && rFrameU == ref_frame && rFrameUR != ref_frame)  
  1602.     mvPredType = MVPRED_U;
  1603.   else if(rFrameL != ref_frame && rFrameU != ref_frame && rFrameUR == ref_frame)  
  1604.     mvPredType = MVPRED_UR;
  1605.   // Directional predictions
  1606.   if(blockshape_x == 8 && blockshape_y == 16)
  1607.   {
  1608.     if(mb_x == 0)
  1609.     {
  1610.       if(rFrameL == ref_frame)
  1611.         mvPredType = MVPRED_L;
  1612.     }
  1613.     else
  1614.     {
  1615.       if( rFrameUR == ref_frame)
  1616.         mvPredType = MVPRED_UR;
  1617.     }
  1618.   }
  1619.   else if(blockshape_x == 16 && blockshape_y == 8)
  1620.   {
  1621.     if(mb_y == 0)
  1622.     {
  1623.       if(rFrameU == ref_frame)
  1624.         mvPredType = MVPRED_U;
  1625.     }
  1626.     else
  1627.     {
  1628.       if(rFrameL == ref_frame)
  1629.         mvPredType = MVPRED_L;
  1630.     }
  1631.   }
  1632.   for (hv=0; hv < 2; hv++)
  1633.   {
  1634.     if (!img->MbaffFrameFlag || hv==0)
  1635.     {
  1636.       mv_a = block_a.available ? tmp_mv[list][block_a.pos_y][block_a.pos_x][hv] : 0;
  1637.       mv_b = block_b.available ? tmp_mv[list][block_b.pos_y][block_b.pos_x][hv] : 0;
  1638.       mv_c = block_c.available ? tmp_mv[list][block_c.pos_y][block_c.pos_x][hv] : 0;
  1639.     }
  1640.     else
  1641.     {
  1642.       if (img->mb_data[img->current_mb_nr].mb_field)
  1643.       {
  1644.         mv_a = block_a.available  ? img->mb_data[block_a.mb_addr].mb_field?
  1645.           tmp_mv[list][block_a.pos_y][block_a.pos_x][hv]:
  1646.           tmp_mv[list][block_a.pos_y][block_a.pos_x][hv] / 2:
  1647.           0;
  1648.         mv_b = block_b.available  ? img->mb_data[block_b.mb_addr].mb_field?
  1649.           tmp_mv[list][block_b.pos_y][block_b.pos_x][hv]:
  1650.           tmp_mv[list][block_b.pos_y][block_b.pos_x][hv] / 2:
  1651.           0;
  1652.         mv_c = block_c.available  ? img->mb_data[block_c.mb_addr].mb_field?
  1653.           tmp_mv[list][block_c.pos_y][block_c.pos_x][hv]:
  1654.           tmp_mv[list][block_c.pos_y][block_c.pos_x][hv] / 2:
  1655.           0;
  1656.       }
  1657.       else
  1658.       {
  1659.         mv_a = block_a.available  ? img->mb_data[block_a.mb_addr].mb_field?
  1660.           tmp_mv[list][block_a.pos_y][block_a.pos_x][hv] * 2:
  1661.           tmp_mv[list][block_a.pos_y][block_a.pos_x][hv]:
  1662.           0;
  1663.         mv_b = block_b.available  ? img->mb_data[block_b.mb_addr].mb_field?
  1664.           tmp_mv[list][block_b.pos_y][block_b.pos_x][hv] * 2:
  1665.           tmp_mv[list][block_b.pos_y][block_b.pos_x][hv]:
  1666.           0;
  1667.         mv_c = block_c.available  ? img->mb_data[block_c.mb_addr].mb_field?
  1668.           tmp_mv[list][block_c.pos_y][block_c.pos_x][hv] * 2:
  1669.           tmp_mv[list][block_c.pos_y][block_c.pos_x][hv]:
  1670.           0;
  1671.       }
  1672.     }
  1673.     switch (mvPredType)
  1674.     {
  1675.     case MVPRED_MEDIAN:
  1676.       if(!(block_b.available || block_c.available))
  1677.         pred_vec = mv_a;
  1678.       else
  1679.         pred_vec = mv_a + mv_b + mv_c - imin(mv_a,imin(mv_b,mv_c))-imax(mv_a,imax(mv_b,mv_c));
  1680.       break;
  1681.     case MVPRED_L:
  1682.       pred_vec = mv_a;
  1683.       break;
  1684.     case MVPRED_U:
  1685.       pred_vec = mv_b;
  1686.       break;
  1687.     case MVPRED_UR:
  1688.       pred_vec = mv_c;
  1689.       break;
  1690.     default:
  1691.       break;
  1692.     }
  1693.     pred_mv[hv] = (short) pred_vec;
  1694.   }
  1695. }
  1696. /*!
  1697.  ************************************************************************
  1698.  * brief
  1699.  *    Read motion info
  1700.  ************************************************************************
  1701.  */
  1702. static void readMotionInfoFromNAL (ImageParameters *img, Macroblock *currMB)
  1703. {
  1704.   int i,j,k;
  1705.   int mb_nr = img->current_mb_nr;
  1706.   SyntaxElement currSE;
  1707.   Slice *currSlice    = img->currentSlice;
  1708.   DataPartition *dP = NULL;
  1709.   int *partMap        = assignSE2partition[currSlice->dp_mode];
  1710.   int bslice          = (img->type==B_SLICE);
  1711.   int partmode        = (IS_P8x8(currMB)?4:currMB->mb_type);
  1712.   int step_h0         = BLOCK_STEP [partmode][0];
  1713.   int step_v0         = BLOCK_STEP [partmode][1];
  1714.   int i0, j0, j6;
  1715.   int j4, i4, ii;
  1716.   MotionParams *colocated;
  1717.   int mv_scale = 0;
  1718.   int list_offset = ((img->MbaffFrameFlag)&&(currMB->mb_field))? (mb_nr&0x01) ? 4 : 2 : 0;
  1719.   if (bslice)
  1720.   {
  1721.     if ((img->MbaffFrameFlag) && (currMB->mb_field))
  1722.     {
  1723.       if(mb_nr&0x01)
  1724.       {
  1725.         colocated = &Co_located->bottom;
  1726.       }
  1727.       else
  1728.       {
  1729.         colocated = &Co_located->top;
  1730.       }
  1731.     }
  1732.     else
  1733.     {
  1734.       colocated = &Co_located->frame;
  1735.     }
  1736.     if (IS_P8x8 (currMB))
  1737.     {
  1738.       if (img->direct_spatial_mv_pred_flag)
  1739.       {
  1740.         char  l0_rFrame, l1_rFrame;
  1741.         short pmvl0[2]={0,0}, pmvl1[2]={0,0};
  1742.         prepare_direct_params(currMB, dec_picture, img, pmvl0, pmvl1, &l0_rFrame, &l1_rFrame);
  1743.         for (k = 0; k < 4; k++)
  1744.         {        
  1745.           if (currMB->b8mode[k] == 0)
  1746.           {
  1747.             i = img->block_x + 2 * (k & 0x01);
  1748.             for(j = 2 * (k >> 1); j < 2 * (k >> 1)+2;j++)
  1749.             {
  1750.               j6 = img->block_y_aff + j;
  1751.               j4 = img->block_y     + j;
  1752.               for(i4 = i; i4 < i + 2; i4++)
  1753.               {
  1754.                 if (l0_rFrame >= 0)
  1755.                 {
  1756.                   if  (!l0_rFrame  && ((!colocated->moving_block[j6][i4]) && (!listX[LIST_1 + list_offset][0]->is_long_term)))
  1757.                   {
  1758.                     dec_picture->motion.mv  [LIST_0][j4][i4][0] = 0;
  1759.                     dec_picture->motion.mv  [LIST_0][j4][i4][1] = 0;
  1760.                     dec_picture->motion.ref_idx[LIST_0][j4][i4] = 0;
  1761.                   }
  1762.                   else
  1763.                   {
  1764.                     dec_picture->motion.mv  [LIST_0][j4][i4][0] = pmvl0[0];
  1765.                     dec_picture->motion.mv  [LIST_0][j4][i4][1] = pmvl0[1];
  1766.                     dec_picture->motion.ref_idx[LIST_0][j4][i4] = l0_rFrame;
  1767.                   }
  1768.                 }
  1769.                 else
  1770.                 {
  1771.                   dec_picture->motion.mv  [LIST_0][j4][i4][0] = 0;
  1772.                   dec_picture->motion.mv  [LIST_0][j4][i4][1] = 0;
  1773.                   dec_picture->motion.ref_idx[LIST_0][j4][i4] = -1;
  1774.                 }
  1775.                 if (l1_rFrame >= 0)
  1776.                 {
  1777.                   if  (l1_rFrame==0 && ((!colocated->moving_block[j6][i4])&& (!listX[LIST_1 + list_offset][0]->is_long_term)))
  1778.                   {
  1779.                     dec_picture->motion.mv  [LIST_1][j4][i4][0] = 0;
  1780.                     dec_picture->motion.mv  [LIST_1][j4][i4][1] = 0;
  1781.                     dec_picture->motion.ref_idx[LIST_1][j4][i4] = 0;
  1782.                   }
  1783.                   else
  1784.                   {
  1785.                     dec_picture->motion.mv  [LIST_1][j4][i4][0] = pmvl1[0];
  1786.                     dec_picture->motion.mv  [LIST_1][j4][i4][1] = pmvl1[1];
  1787.                     dec_picture->motion.ref_idx[LIST_1][j4][i4] = l1_rFrame;
  1788.                   }
  1789.                 }
  1790.                 else
  1791.                 {
  1792.                   dec_picture->motion.mv  [LIST_1][j4][i4][0] = 0;
  1793.                   dec_picture->motion.mv  [LIST_1][j4][i4][1] = 0;
  1794.                   dec_picture->motion.ref_idx[LIST_1][j4][i4] = -1;
  1795.                 }
  1796.                 if (l0_rFrame <0 && l1_rFrame <0)
  1797.                 {
  1798.                   dec_picture->motion.ref_idx[LIST_0][j4][i4] = 0;
  1799.                   dec_picture->motion.ref_idx[LIST_1][j4][i4] = 0;
  1800.                 }
  1801.               }
  1802.             }
  1803.           }
  1804.         }
  1805.       }
  1806.       else
  1807.       {
  1808.         for (k = 0; k < 4; k++) // Scan all blocks
  1809.         {
  1810.           if (currMB->b8mode[k] == 0)
  1811.           {
  1812.             for(j0 = 2 * (k >> 1); j0 < 2 * (k >> 1) + 2; j0 += step_v0)
  1813.             {
  1814.               for(i0 = img->block_x + 2*(k & 0x01); i0 < img->block_x + 2 * (k & 0x01)+2; i0 += step_h0)
  1815.               {
  1816.                 int refList = colocated->ref_idx[LIST_0 ][img->block_y_aff + j0][i0]== -1 ? LIST_1 : LIST_0;
  1817.                 int ref_idx = colocated->ref_idx[refList][img->block_y_aff + j0][i0];
  1818.                 int mapped_idx = -1, iref;
  1819.                 if (ref_idx == -1)
  1820.                 {
  1821.                   for (j4 = img->block_y + j0; j4 < img->block_y + j0 + step_v0; j4++)
  1822.                   {
  1823.                     memset(&dec_picture->motion.ref_idx [LIST_0][j4][i0],    0,     step_h0 * sizeof(char));
  1824.                     memset(&dec_picture->motion.ref_idx [LIST_1][j4][i0],    0,     step_h0 * sizeof(char));
  1825.                     memset(&dec_picture->motion.mv      [LIST_0][j4][i0][0], 0, 2 * step_h0 * sizeof(short));
  1826.                     memset(&dec_picture->motion.mv      [LIST_1][j4][i0][0], 0, 2 * step_h0 * sizeof(short));
  1827.                   }
  1828.                 }
  1829.                 else
  1830.                 {
  1831.                   for (iref = 0; iref < imin(img->num_ref_idx_l0_active,listXsize[LIST_0 + list_offset]); iref++)
  1832.                   {
  1833.                     int curr_mb_field = ((img->MbaffFrameFlag)&&(currMB->mb_field));
  1834.                     if(img->structure==0 && curr_mb_field==0)
  1835.                     {
  1836.                       // If the current MB is a frame MB and the colocated is from a field picture,
  1837.                       // then the colocated->ref_pic_id may have been generated from the wrong value of
  1838.                       // frame_poc if it references it's complementary field, so test both POC values
  1839.                       if(listX[0][iref]->top_poc * 2    == colocated->ref_pic_id[refList][img->block_y_aff + j0][i0]
  1840.                       || listX[0][iref]->bottom_poc * 2 == colocated->ref_pic_id[refList][img->block_y_aff + j0][i0])
  1841.                       {
  1842.                         mapped_idx=iref;
  1843.                         break;
  1844.                       }
  1845.                       else //! invalid index. Default to zero even though this case should not happen
  1846.                         mapped_idx=INVALIDINDEX;
  1847.                       continue;
  1848.                     }
  1849.                     if (dec_picture->ref_pic_num[img->current_slice_nr][LIST_0 + list_offset][iref]==colocated->ref_pic_id[refList][img->block_y_aff + j0][i0])
  1850.                     {
  1851.                       mapped_idx=iref;
  1852.                       break;
  1853.                     }
  1854.                     else //! invalid index. Default to zero even though this case should not happen
  1855.                       mapped_idx=INVALIDINDEX;
  1856.                   }
  1857.                   if (INVALIDINDEX == mapped_idx)
  1858.                   {
  1859.                     error("temporal direct errorncolocated block has ref that is unavailable",-1111);
  1860.                   }
  1861.                   for (j = j0; j < j0 + step_v0; j++)
  1862.                   {
  1863.                     j4 = img->block_y + j;
  1864.                     j6 = img->block_y_aff + j;
  1865.                     for (i4 = i0; i4 < i0 + step_h0; i4++)
  1866.                     {
  1867.                       mv_scale = img->mvscale[LIST_0 + list_offset][mapped_idx];
  1868.                       dec_picture->motion.ref_idx [LIST_0][j4][i4] = (char) mapped_idx;
  1869.                       dec_picture->motion.ref_idx [LIST_1][j4][i4] = 0;
  1870.                       for (ii=0; ii < 2; ii++)
  1871.                       {
  1872.                         if (mv_scale == 9999 || listX[LIST_0+list_offset][mapped_idx]->is_long_term)
  1873.                         {
  1874.                           dec_picture->motion.mv  [LIST_0][j4][i4][ii] = colocated->mv[refList][j6][i4][ii];
  1875.                           dec_picture->motion.mv  [LIST_1][j4][i4][ii] = 0;
  1876.                         }
  1877.                         else
  1878.                         {
  1879.                           dec_picture->motion.mv  [LIST_0][j4][i4][ii] = (short) ((mv_scale * colocated->mv[refList][j6][i4][ii] + 128 ) >> 8);
  1880.                           dec_picture->motion.mv  [LIST_1][j4][i4][ii] = (short) (dec_picture->motion.mv[LIST_0][j4][i4][ii] - colocated->mv[refList][j6][i4][ii]);
  1881.                         }
  1882.                       }
  1883.                     }
  1884.                   }
  1885.                 }
  1886.               }
  1887.             }
  1888.           }
  1889.         }
  1890.       }
  1891.     }
  1892.   }
  1893.   //=====  READ REFERENCE PICTURE INDICES =====
  1894.   currSE.type = SE_REFFRAME;
  1895.   dP = &(currSlice->partArr[partMap[SE_REFFRAME]]);
  1896.   //  For LIST_0, if multiple ref. pictures, read LIST_0 reference picture indices for the MB ***********
  1897.   prepareListforRefIdx (&currSE, dP, img->num_ref_idx_l0_active, !IS_P8x8 (currMB) || bslice || (!img->allrefzero));
  1898.   readMBRefPictureIdx  (&currSE, dP, currMB, img, &dec_picture->motion.ref_idx[LIST_0][img->block_y], LIST_0, step_v0, step_h0);
  1899.   //  For LIST_1, if multiple ref. pictures, read LIST_1 reference picture indices for the MB ***********
  1900.   prepareListforRefIdx (&currSE, dP, img->num_ref_idx_l1_active, !IS_P8x8 (currMB) || bslice || (!img->allrefzero));
  1901.   readMBRefPictureIdx  (&currSE, dP, currMB, img, &dec_picture->motion.ref_idx[LIST_1][img->block_y], LIST_1, step_v0, step_h0);
  1902.   //=====  READ MOTION VECTORS =====
  1903.   currSE.type = SE_MVD;
  1904.   dP = &(currSlice->partArr[partMap[SE_MVD]]);
  1905.   if (active_pps->entropy_coding_mode_flag == UVLC || dP->bitstream->ei_flag) 
  1906.     currSE.mapping = linfo_se;
  1907.   else                                                  
  1908.     currSE.reading = readMVD_CABAC;
  1909.   // LIST_0 Motion vectors
  1910.   readMBMotionVectors (&currSE, dP, currMB, img, LIST_0, step_h0, step_v0);
  1911.   // LIST_1 Motion vectors
  1912.   if (bslice)
  1913.     readMBMotionVectors (&currSE, dP, currMB, img, LIST_1, step_h0, step_v0);
  1914.   // record reference picture Ids for deblocking decisions
  1915.   for (k = LIST_0; k <= (bslice ? LIST_1: LIST_0); k++)
  1916.   {
  1917.     for(j4 = img->block_y; j4 < (img->block_y +4);j4++)
  1918.     {
  1919.       for(i4 = img->block_x; i4 < (img->block_x + 4);i4++)
  1920.       {
  1921.         if (dec_picture->motion.ref_idx[k][j4][i4]>=0)
  1922.           dec_picture->motion.ref_pic_id[k][j4][i4] = dec_picture->ref_pic_num[img->current_slice_nr][k + list_offset][(short)dec_picture->motion.ref_idx[k][j4][i4]];
  1923.         else
  1924.           dec_picture->motion.ref_pic_id[k][j4][i4] = INT64_MIN;
  1925.       }
  1926.     }
  1927.   }
  1928. }
  1929. /*!
  1930.  ************************************************************************
  1931.  * brief
  1932.  *    Get the Prediction from the Neighboring Blocks for Number of 
  1933.  *    Nonzero Coefficients
  1934.  *
  1935.  *    Luma Blocks
  1936.  ************************************************************************
  1937.  */
  1938. int predict_nnz(Macroblock *currMB, int block_type, ImageParameters *img, int i,int j)
  1939. {
  1940.   PixelPos pix;
  1941.   int pred_nnz = 0;
  1942.   int cnt      = 0;
  1943.   // left block
  1944.   get4x4Neighbour(currMB, i - 1, j, img->mb_size[IS_LUMA], &pix);
  1945.   if (IS_INTRA(currMB) && pix.available && active_pps->constrained_intra_pred_flag && (img->currentSlice->dp_mode==PAR_DP_3))
  1946.   {
  1947.     pix.available &= img->intra_block[pix.mb_addr];
  1948.     if (!pix.available)
  1949.       cnt++;
  1950.   }
  1951.   if (pix.available)
  1952.   { 
  1953.     switch (block_type)
  1954.     {
  1955.     case LUMA:
  1956.       pred_nnz = img->nz_coeff [pix.mb_addr ][0][pix.y][pix.x];
  1957.       cnt++;
  1958.       break;
  1959.     case CB:
  1960.       pred_nnz = img->nz_coeff [pix.mb_addr ][1][pix.y][pix.x];
  1961.       cnt++;
  1962.       break;
  1963.     case CR:
  1964.       pred_nnz = img->nz_coeff [pix.mb_addr ][2][pix.y][pix.x];
  1965.       cnt++;
  1966.       break;
  1967.     default:
  1968.       error("writeCoeff4x4_CAVLC: Invalid block type", 600);
  1969.       break;
  1970.     }
  1971.   }
  1972.   // top block
  1973.   get4x4Neighbour(currMB, i, j - 1, img->mb_size[IS_LUMA], &pix);
  1974.   if (IS_INTRA(currMB) && pix.available && active_pps->constrained_intra_pred_flag && (img->currentSlice->dp_mode==PAR_DP_3))
  1975.   {
  1976.     pix.available &= img->intra_block[pix.mb_addr];
  1977.     if (!pix.available)
  1978.       cnt++;
  1979.   }
  1980.   if (pix.available)
  1981.   {
  1982.     switch (block_type)
  1983.     {
  1984.     case LUMA:
  1985.       pred_nnz += img->nz_coeff [pix.mb_addr ][0][pix.y][pix.x];
  1986.       cnt++;
  1987.       break;
  1988.     case CB:
  1989.       pred_nnz += img->nz_coeff [pix.mb_addr ][1][pix.y][pix.x];
  1990.       cnt++;
  1991.       break;
  1992.     case CR:
  1993.       pred_nnz += img->nz_coeff [pix.mb_addr ][2][pix.y][pix.x];
  1994.       cnt++;
  1995.       break;
  1996.     default:
  1997.       error("writeCoeff4x4_CAVLC: Invalid block type", 600);
  1998.       break;
  1999.     }
  2000.   }
  2001.   if (cnt==2)
  2002.   {
  2003.     pred_nnz++;
  2004.     pred_nnz>>=1;
  2005.   }
  2006.   return pred_nnz;
  2007. }
  2008. /*!
  2009.  ************************************************************************
  2010.  * brief
  2011.  *    Get the Prediction from the Neighboring Blocks for Number of 
  2012.  *    Nonzero Coefficients
  2013.  *
  2014.  *    Chroma Blocks
  2015.  ************************************************************************
  2016.  */
  2017. int predict_nnz_chroma(Macroblock *currMB, ImageParameters *img, int i,int j)
  2018. {
  2019.   PixelPos pix;
  2020.   int pred_nnz = 0;
  2021.   int cnt      = 0;
  2022.   if (dec_picture->chroma_format_idc != YUV444)
  2023.   {
  2024.     //YUV420 and YUV422
  2025.     // left block
  2026.     get4x4Neighbour(currMB, ((i&0x01)<<2) - 1, j, img->mb_size[IS_CHROMA], &pix);
  2027.     if (IS_INTRA(currMB) && pix.available && active_pps->constrained_intra_pred_flag && (img->currentSlice->dp_mode==PAR_DP_3))
  2028.     {
  2029.       pix.available &= img->intra_block[pix.mb_addr];
  2030.       if (!pix.available)
  2031.         cnt++;
  2032.     }
  2033.     if (pix.available)
  2034.     {
  2035.       pred_nnz = img->nz_coeff [pix.mb_addr ][1][pix.y][2 * (i>>1) + pix.x];
  2036.       cnt++;
  2037.     }
  2038.     // top block
  2039.     get4x4Neighbour(currMB, ((i&0x01)<<2), j - 1, img->mb_size[IS_CHROMA], &pix);
  2040.     if (IS_INTRA(currMB) && pix.available && active_pps->constrained_intra_pred_flag && (img->currentSlice->dp_mode==PAR_DP_3))
  2041.     {
  2042.       pix.available &= img->intra_block[pix.mb_addr];
  2043.       if (!pix.available)
  2044.         cnt++;
  2045.     }
  2046.     if (pix.available)
  2047.     {
  2048.       pred_nnz += img->nz_coeff [pix.mb_addr ][1][pix.y][2 * (i>>1) + pix.x];
  2049.       cnt++;
  2050.     }
  2051.     if (cnt==2)
  2052.     {
  2053.       pred_nnz++;
  2054.       pred_nnz >>= 1;
  2055.     }
  2056.   }
  2057.   return pred_nnz;
  2058. }
  2059. /*!
  2060.  ************************************************************************
  2061.  * brief
  2062.  *    Reads coeff of an 4x4 block (CAVLC)
  2063.  *
  2064.  * author
  2065.  *    Karl Lillevold <karll@real.com>
  2066.  *    contributions by James Au <james@ubvideo.com>
  2067.  ************************************************************************
  2068.  */
  2069. void readCoeff4x4_CAVLC (Macroblock *currMB, ImageParameters *img,
  2070.                          int block_type,
  2071.                          int i, int j, int levarr[16], int runarr[16],
  2072.                          int *number_coefficients)
  2073. {
  2074.   int mb_nr = img->current_mb_nr;
  2075.   SyntaxElement currSE;
  2076.   Slice *currSlice = img->currentSlice;
  2077.   DataPartition *dP;
  2078.   int *partMap = assignSE2partition[currSlice->dp_mode];
  2079.   static Bitstream *currStream;
  2080.   int k, code, vlcnum;
  2081.   static int numcoeff, numtrailingones, numcoeff_vlc;
  2082.   static int level_two_or_higher;
  2083.   int numones, totzeros, abslevel, cdc=0, cac=0;
  2084.   int zerosleft, ntr, dptype = 0;
  2085.   int max_coeff_num = 0, nnz;
  2086.   static char type[15];
  2087.   static int incVlc[] = {0,3,6,12,24,48,32768};    // maximum vlc = 6
  2088.   numcoeff = 0;
  2089.   
  2090.   switch (block_type)
  2091.   {
  2092.   case LUMA:
  2093.     max_coeff_num = 16;
  2094.     TRACE_PRINTF("Luma");
  2095.     dptype = IS_INTRA (currMB) ? SE_LUM_AC_INTRA : SE_LUM_AC_INTER;
  2096.     img->nz_coeff[mb_nr][0][j][i] = 0; 
  2097.     break;
  2098.   case LUMA_INTRA16x16DC:
  2099.     max_coeff_num = 16;
  2100.     TRACE_PRINTF("Lum16DC");
  2101.     dptype = SE_LUM_DC_INTRA;
  2102.     img->nz_coeff[mb_nr][0][j][i] = 0; 
  2103.     break;
  2104.   case LUMA_INTRA16x16AC:
  2105.     max_coeff_num = 15;
  2106.     TRACE_PRINTF("Lum16AC");
  2107.     dptype = SE_LUM_AC_INTRA;
  2108.     img->nz_coeff[mb_nr][0][j][i] = 0; 
  2109.     break;
  2110.   case CB:
  2111.     max_coeff_num = 16;
  2112.     TRACE_PRINTF("Luma_add1");
  2113.     dptype = (IS_INTRA (currMB)) ? SE_LUM_AC_INTRA : SE_LUM_AC_INTER;
  2114.     img->nz_coeff[mb_nr][1][j][i] = 0; 
  2115.     break;
  2116.   case CB_INTRA16x16DC:
  2117.     max_coeff_num = 16;
  2118.     TRACE_PRINTF("Luma_add1_16DC");
  2119.     dptype = SE_LUM_DC_INTRA;
  2120.     img->nz_coeff[mb_nr][1][j][i] = 0; 
  2121.     break;
  2122.   case CB_INTRA16x16AC:
  2123.     max_coeff_num = 15;
  2124.     TRACE_PRINTF("Luma_add1_16AC");
  2125.     dptype = SE_LUM_AC_INTRA;
  2126.     img->nz_coeff[mb_nr][1][j][i] = 0; 
  2127.     break;
  2128.   case CR:
  2129.     max_coeff_num = 16;
  2130.     TRACE_PRINTF("Luma_add2");
  2131.     dptype = (IS_INTRA (currMB)) ? SE_LUM_AC_INTRA : SE_LUM_AC_INTER;
  2132.     img->nz_coeff[mb_nr][2][j][i] = 0; 
  2133.     break;
  2134.   case CR_INTRA16x16DC:
  2135.     max_coeff_num = 16;
  2136.     TRACE_PRINTF("Luma_add2_16DC");
  2137.     dptype = SE_LUM_DC_INTRA;
  2138.     img->nz_coeff[mb_nr][2][j][i] = 0; 
  2139.     break;
  2140.   case CR_INTRA16x16AC:
  2141.     max_coeff_num = 15;
  2142.     TRACE_PRINTF("Luma_add1_16AC");
  2143.     dptype = SE_LUM_AC_INTRA;
  2144.     img->nz_coeff[mb_nr][2][j][i] = 0; 
  2145.     break;        
  2146.   case CHROMA_DC:
  2147.     max_coeff_num = img->num_cdc_coeff;
  2148.     cdc = 1;
  2149.     TRACE_PRINTF("ChrDC");
  2150.     dptype = IS_INTRA (currMB) ? SE_CHR_DC_INTRA : SE_CHR_DC_INTER;
  2151.     img->nz_coeff[mb_nr][0][j][i] = 0; 
  2152.     break;
  2153.   case CHROMA_AC:
  2154.     max_coeff_num = 15;
  2155.     cac = 1;
  2156.     TRACE_PRINTF("ChrDC");
  2157.     dptype = IS_INTRA (currMB) ? SE_CHR_AC_INTRA : SE_CHR_AC_INTER;
  2158.     img->nz_coeff[mb_nr][0][j][i] = 0; 
  2159.     break;
  2160.   default:
  2161.     error ("readCoeff4x4_CAVLC: invalid block type", 600);
  2162.     img->nz_coeff[mb_nr][0][j][i] = 0; 
  2163.     break;
  2164.   }
  2165.   
  2166.   currSE.type = dptype;
  2167.   dP = &(currSlice->partArr[partMap[dptype]]);
  2168.   currStream = dP->bitstream;  
  2169.   
  2170.   if (!cdc)
  2171.   {    
  2172.     // luma or chroma AC    
  2173.     if(block_type==LUMA || block_type==LUMA_INTRA16x16DC || block_type==LUMA_INTRA16x16AC ||block_type==CHROMA_AC)
  2174.     {
  2175.       nnz = (!cac) ? predict_nnz(currMB, LUMA, img, i<<2, j<<2) : predict_nnz_chroma(currMB, img, i, ((j-4)<<2));
  2176.     }
  2177.     else if (block_type==CB || block_type==CB_INTRA16x16DC || block_type==CB_INTRA16x16AC)
  2178.     {   
  2179.       nnz = predict_nnz(currMB, CB, img, i<<2, j<<2);
  2180.     }
  2181.     else
  2182.     { 
  2183.       nnz = predict_nnz(currMB, CR, img, i<<2, j<<2);
  2184.     }
  2185.     
  2186.     if (nnz < 2)
  2187.     {
  2188.       numcoeff_vlc = 0;
  2189.     }
  2190.     else if (nnz < 4)
  2191.     {
  2192.       numcoeff_vlc = 1;
  2193.     }
  2194.     else if (nnz < 8)
  2195.     {
  2196.       numcoeff_vlc = 2;
  2197.     }
  2198.     else //
  2199.     {
  2200.       numcoeff_vlc = 3;
  2201.     }
  2202.     
  2203.     currSE.value1 = numcoeff_vlc;
  2204.     
  2205.     readSyntaxElement_NumCoeffTrailingOnes(&currSE, currStream, type);
  2206.     
  2207.     numcoeff        =  currSE.value1;
  2208.     numtrailingones =  currSE.value2;
  2209.     
  2210.     if(block_type==LUMA || block_type==LUMA_INTRA16x16DC || block_type==LUMA_INTRA16x16AC ||block_type==CHROMA_AC)
  2211.       img->nz_coeff[mb_nr][0][j][i] = numcoeff;
  2212.     else if (block_type==CB || block_type==CB_INTRA16x16DC || block_type==CB_INTRA16x16AC)
  2213.       img->nz_coeff[mb_nr][1][j][i] = numcoeff;
  2214.     else
  2215.       img->nz_coeff[mb_nr][2][j][i] = numcoeff;        
  2216.   }
  2217.   else
  2218.   {
  2219.     // chroma DC
  2220.     readSyntaxElement_NumCoeffTrailingOnesChromaDC(&currSE, currStream);
  2221.     
  2222.     numcoeff        =  currSE.value1;
  2223.     numtrailingones =  currSE.value2;
  2224.   }
  2225.   
  2226.   memset(levarr, 0, max_coeff_num * sizeof(int));
  2227.   memset(runarr, 0, max_coeff_num * sizeof(int));
  2228.   
  2229.   numones = numtrailingones;
  2230.   *number_coefficients = numcoeff;
  2231.   
  2232.   if (numcoeff)
  2233.   {
  2234.     if (numtrailingones)
  2235.     {      
  2236.       currSE.len = numtrailingones;
  2237.       
  2238. #if TRACE
  2239.       snprintf(currSE.tracestring,
  2240.         TRACESTRING_SIZE, "%s trailing ones sign (%d,%d)", type, i, j);
  2241. #endif
  2242.       
  2243.       readSyntaxElement_FLC (&currSE, currStream);
  2244.       
  2245.       code = currSE.inf;
  2246.       ntr = numtrailingones;
  2247.       for (k = numcoeff - 1; k > numcoeff - 1 - numtrailingones; k--)
  2248.       {
  2249.         ntr --;
  2250.         levarr[k] = (code>>ntr)&1 ? -1 : 1;
  2251.       }
  2252.     }
  2253.     
  2254.     // decode levels
  2255.     level_two_or_higher = (numcoeff > 3 && numtrailingones == 3)? 0 : 1;
  2256.     vlcnum = (numcoeff > 10 && numtrailingones < 3) ? 1 : 0;
  2257.     
  2258.     for (k = numcoeff - 1 - numtrailingones; k >= 0; k--)
  2259.     {
  2260.       
  2261. #if TRACE
  2262.       snprintf(currSE.tracestring,
  2263.        TRACESTRING_SIZE, "%s lev (%d,%d) k=%d vlc=%d ", type, i, j, k, vlcnum);
  2264. #endif
  2265.       
  2266.       if (vlcnum == 0)
  2267.         readSyntaxElement_Level_VLC0(&currSE, currStream);
  2268.       else
  2269.         readSyntaxElement_Level_VLCN(&currSE, vlcnum, currStream);
  2270.       
  2271.       if (level_two_or_higher)
  2272.       {
  2273.         currSE.inf += (currSE.inf > 0) ? 1 : -1;
  2274.         level_two_or_higher = 0;
  2275.       }
  2276.       
  2277.       levarr[k] = currSE.inf;
  2278.       abslevel = iabs(levarr[k]);
  2279.       if (abslevel  == 1)
  2280.         numones ++;
  2281.       
  2282.       // update VLC table
  2283.       if (abslevel  > incVlc[vlcnum])
  2284.         vlcnum++;
  2285.       
  2286.       if (k == numcoeff - 1 - numtrailingones && abslevel >3)
  2287.         vlcnum = 2;      
  2288.     }
  2289.     
  2290.     if (numcoeff < max_coeff_num)
  2291.     {
  2292.       // decode total run
  2293.       vlcnum = numcoeff - 1;
  2294.       currSE.value1 = vlcnum;
  2295.       
  2296. #if TRACE
  2297.       snprintf(currSE.tracestring,
  2298.         TRACESTRING_SIZE, "%s totalrun (%d,%d) vlc=%d ", type, i,j, vlcnum);
  2299. #endif
  2300.       if (cdc)
  2301.         readSyntaxElement_TotalZerosChromaDC(&currSE, currStream);
  2302.       else
  2303.         readSyntaxElement_TotalZeros(&currSE, currStream);
  2304.       
  2305.       totzeros = currSE.value1;
  2306.     }
  2307.     else
  2308.     {
  2309.       totzeros = 0;
  2310.     }
  2311.     
  2312.     // decode run before each coefficient
  2313.     zerosleft = totzeros;
  2314.     i = numcoeff - 1;
  2315.     if (zerosleft > 0 && i > 0)
  2316.     {
  2317.       do
  2318.       {
  2319.         // select VLC for runbefore
  2320.         vlcnum = imin(zerosleft - 1, RUNBEFORE_NUM_M1);
  2321.         currSE.value1 = vlcnum;
  2322. #if TRACE
  2323.         snprintf(currSE.tracestring,
  2324.           TRACESTRING_SIZE, "%s run (%d,%d) k=%d vlc=%d ",
  2325.           type, i, j, i, vlcnum);
  2326. #endif
  2327.         
  2328.         readSyntaxElement_Run(&currSE, currStream);
  2329.         runarr[i] = currSE.value1;
  2330.         
  2331.         zerosleft -= runarr[i];
  2332.         i --;
  2333.       } while (zerosleft != 0 && i != 0);
  2334.     }
  2335.     runarr[i] = zerosleft;    
  2336.   } // if numcoeff
  2337. }
  2338. /*!
  2339. ************************************************************************
  2340. * brief
  2341. *    Get coefficients (run/level) of one 8x8 block
  2342. *    from the NAL (CABAC Mode)
  2343. ************************************************************************
  2344. */
  2345. static void readLumaCoeff8x8_CABAC (ImageParameters *img, Macroblock *currMB, ColorPlane pl, int b8)
  2346. {
  2347.   static int (*tcoeffs)[16];
  2348.   int i,j,k;