videoeditorengine/avcedit/src/vld.cpp
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/avcedit/src/vld.cpp	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,1796 @@
+/*
+* Copyright (c) 2010 Ixonos Plc.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - Initial contribution
+*
+* Contributors:
+* Ixonos Plc
+*
+* Description:
+*
+*/
+
+
+//#include "epoclib.h"
+#include "globals.h"
+#include "bitbuffer.h"
+#include "vld.h"
+
+
+#define VLD_MAX_CW_LEN              33
+#define VLD_MAX_LONG_CW_LEN         65
+
+#define VLD_MAX_UVLC_CODE_NUM       65535         /* 2^16-1 */
+#define VLD_MAX_LONG_UVLC_CODE_NUM  4294967295U    /* 2^32-1 */
+
+#define VLD_NUM_MB_CODES_INTRA      (1+4*3*2+1)   /* 1 4x4, 24 16x16, 1 PCM */
+#define VLD_NUM_MB_CODES_INTER      (5+1+4*3*2+1) /* 5 inter, 1 4x4, 24 16x16, 1 PCM */
+
+#define VLD_MAX_SUB_MB_MODE         3
+
+#define VLD_MAX_IPR_CHROMA_MODE     3
+
+#define VLD_MAX_CBP_CODE            47
+#define VLD_MAX_DELTA_QP_CODE       52
+
+
+#ifdef VIDEOEDITORENGINE_AVC_EDITING
+/*
+ * Static tables for VLD decoder
+ */
+
+
+/* gives CBP value from codeword number, both for intra and inter */
+static const int8 code2cbp[VLD_MAX_CBP_CODE+1][2] = {  
+  {47, 0},{31,16},{15, 1},{ 0, 2},{23, 4},{27, 8},{29,32},{30, 3},{ 7, 5},{11,10},{13,12},{14,15}, 
+  {39,47},{43, 7},{45,11},{46,13},{16,14},{ 3, 6},{ 5, 9},{10,31},{12,35},{19,37},{21,42},{26,44},
+  {28,33},{35,34},{37,36},{42,40},{44,39},{ 1,43},{ 2,45},{ 4,46},{ 8,17},{17,18},{18,20},{20,24},
+  {24,19},{ 6,21},{ 9,26},{22,28},{25,23},{32,27},{33,29},{34,30},{36,22},{40,25},{38,38},{41,41}    
+};
+
+static const int numRefIndices[5] = {
+  0, 1, 2, 2, 4
+};
+
+/* Look-up table for determining the number of leading zero bits in a 7-bit bumber */
+static const int8 numLeadZerosTab[128] = {
+  7,6,5,5,4,4,4,4,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+
+/*
+ * Structure of the code is XXYYYYZZ, where XX is the length of the code
+ * minus (number of leading zero bits plus 1), YYYY is totalCoef-1 and
+ * ZZ is numTrailingOnes. Code xx000010 means that there are no coefficients.
+ * 0 is illegal.
+ */
+static const u_int8 numCoefTrailTab[3][16][8] = {
+  {
+    {  2,  2,  2,  2,  2,  2,  2,  2}, {  1,  1,  1,  1,  1,  1,  1,  1},
+    {  6,  6,  6,  6,  6,  6,  6,  6}, {133,133,128,128, 75, 75, 75, 75},
+    {147,147,138,138, 79, 79, 79, 79}, {151,151,142,142,137,137,132,132},
+    {155,155,146,146,141,141,136,136}, {159,159,150,150,145,145,140,140},
+    {163,163,154,154,149,149,144,144}, {220,226,221,216,231,222,217,212},
+    {239,234,229,228,235,230,225,224}, {247,242,237,236,243,238,233,232},
+    {255,250,249,244,251,246,245,240}, {188,188,190,190,189,189,184,184},
+    { 49, 49, 49, 49, 49, 49, 49, 49}, {  0,  0,  0,  0,  0,  0,  0,  0}
+  },
+  {
+    { 65, 65, 65, 65, 66, 66, 66, 66}, {143,143,139,139, 70, 70, 70, 70},
+    {215,202,201,192,147,147,133,133}, {155,155,142,142,141,141,132,132},
+    {159,159,146,146,145,145,136,136}, {144,144,150,150,149,149,140,140},
+    {163,163,154,154,153,153,148,148}, {235,226,225,220,231,222,221,216},
+    {232,234,233,228,239,230,229,224}, {247,242,241,240,243,238,237,236},
+    {249,248,250,245,182,182,180,180}, {191,191,190,190,189,189,188,188},
+    { 59, 59, 59, 59, 59, 59, 59, 59}, {  0,  0,  0,  0,  0,  0,  0,  0},
+    {  0,  0,  0,  0,  0,  0,  0,  0}, {  0,  0,  0,  0,  0,  0,  0,  0}
+  },
+  {
+    {219,215,211,207,203,198,193,194}, {209,210,205,206,201,223,202,197},
+    {200,218,217,196,227,214,213,192}, {216,212,226,208,231,222,221,204},
+    {239,234,229,224,235,230,225,220}, {236,242,237,232,243,238,233,228},
+    {249,244,247,246,245,240,177,177}, {189,189,184,184,187,187,186,186},
+    {127,127,127,127,126,126,126,126}, { 60, 60, 60, 60, 60, 60, 60, 60},
+    {  0,  0,  0,  0,  0,  0,  0,  0}, {  0,  0,  0,  0,  0,  0,  0,  0},
+    {  0,  0,  0,  0,  0,  0,  0,  0}, {  0,  0,  0,  0,  0,  0,  0,  0},
+    {  0,  0,  0,  0,  0,  0,  0,  0}, {  0,  0,  0,  0,  0,  0,  0,  0}
+  }
+};
+
+
+/*
+ * The structure of the code is XXXYYYXX where XXX is the length of the code
+ * minus 1, YYY is total number of non-zero coefficients and XX is
+ * the number of trailing ones.
+ */
+static const u_int8 numCoefTrailTabChroma[8][4] = {
+  {  5,  5,  5,  5},
+  { 32, 32, 32, 32},
+  { 74, 74, 74, 74},
+  {168,175,169,164},
+  {176,176,172,172},
+  {206,206,205,205},
+  {242,242,241,241},
+  {211,211,211,211}
+};
+
+
+/* Offsets for 15 Huffman tables in totalZerosTab */
+static const int totalZerosTabOffset[15] = {
+  0, 40, 72, 104, 136, 168,
+  184, 200, 216, 232, 248, 264, 280,
+  288, 296
+};
+
+/*
+ * The meaning of the code in the table is the following:
+ *  If (code > 0xc0) then (code - 0xc0) is an offset to the next position 
+ *  in the Huffman tree
+ *  Otherwise, code structure is XXXXYYYY where XXXX is the length of the code
+ *  and YYYY is the number of zero coefficients.
+ */
+static const u_int8 totalZerosTab[304] = {
+  0xC8, 0xD0, 0x32, 0x31, 0x10, 0x10, 0x10, 0x10,  /* totalCoef==1 */
+  0xD8, 0xE0, 0x68, 0x67, 0x56, 0x56, 0x55, 0x55,  /* prefix 000 */
+  0x44, 0x44, 0x44, 0x44, 0x43, 0x43, 0x43, 0x43,  /* prefix 001 */
+  0x00, 0x9f, 0x9e, 0x9d, 0x8c, 0x8c, 0x8b, 0x8b,  /* prefix 000000 */
+  0x7a, 0x7a, 0x7a, 0x7a, 0x79, 0x79, 0x79, 0x79,  /* prefix 000001 */
+  0xC8, 0xD0, 0xD8, 0x34, 0x33, 0x32, 0x31, 0x30,  /* totalCoef==2 */
+  0x6e, 0x6d, 0x6c, 0x6b, 0x5a, 0x5a, 0x59, 0x59,  /* prefix 000 */
+  0x48, 0x48, 0x48, 0x48, 0x47, 0x47, 0x47, 0x47,  /* prefix 001 */
+  0x46, 0x46, 0x46, 0x46, 0x45, 0x45, 0x45, 0x45,  /* prefix 010 */
+  0xC8, 0xD0, 0xD8, 0x37, 0x36, 0x33, 0x32, 0x31,  /* totalCoef==3 */
+  0x6d, 0x6b, 0x5c, 0x5c, 0x5a, 0x5a, 0x59, 0x59,  /* prefix 000 */
+  0x48, 0x48, 0x48, 0x48, 0x45, 0x45, 0x45, 0x45,  /* prefix 001 */
+  0x44, 0x44, 0x44, 0x44, 0x40, 0x40, 0x40, 0x40,  /* prefix 010 */
+  0xC8, 0xD0, 0xD8, 0x38, 0x36, 0x35, 0x34, 0x31,  /* totalCoef==4 */
+  0x5c, 0x5c, 0x5b, 0x5b, 0x5a, 0x5a, 0x50, 0x50,  /* prefix 000 */
+  0x49, 0x49, 0x49, 0x49, 0x47, 0x47, 0x47, 0x47,  /* prefix 001 */
+  0x43, 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x42,  /* prefix 010 */
+  0xC8, 0xD0, 0xD8, 0x37, 0x36, 0x35, 0x34, 0x33,  /* totalCoef==5 */
+  0x5b, 0x5b, 0x59, 0x59, 0x4a, 0x4a, 0x4a, 0x4a,  /* prefix 000 */
+  0x48, 0x48, 0x48, 0x48, 0x42, 0x42, 0x42, 0x42,  /* prefix 001 */
+  0x41, 0x41, 0x41, 0x41, 0x40, 0x40, 0x40, 0x40,  /* prefix 010 */
+  0xC8, 0x39, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32,  /* totalCoef==6 */
+  0x6a, 0x60, 0x51, 0x51, 0x48, 0x48, 0x48, 0x48,  /* prefix 000 */
+  0xC8, 0x38, 0x36, 0x34, 0x33, 0x32, 0x25, 0x25,  /* totalCoef==7 */
+  0x69, 0x60, 0x51, 0x51, 0x47, 0x47, 0x47, 0x47,  /* prefix 000 */
+  0xC8, 0x37, 0x36, 0x33, 0x25, 0x25, 0x24, 0x24,  /* totalCoef==8 */
+  0x68, 0x60, 0x52, 0x52, 0x41, 0x41, 0x41, 0x41,  /* prefix 000 */
+  0xC8, 0x35, 0x26, 0x26, 0x24, 0x24, 0x23, 0x23,  /* totalCoef==9 */
+  0x61, 0x60, 0x57, 0x57, 0x42, 0x42, 0x42, 0x42,  /* prefix 000 */
+  0xC8, 0x32, 0x25, 0x25, 0x24, 0x24, 0x23, 0x23,  /* totalCoef==10 */
+  0x51, 0x51, 0x50, 0x50, 0x46, 0x46, 0x46, 0x46,  /* prefix 000 */
+  0xC8, 0x32, 0x33, 0x35, 0x14, 0x14, 0x14, 0x14,  /* totalCoef==11 */
+  0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41,  /* prefix 000 */
+  0xC8, 0x34, 0x22, 0x22, 0x13, 0x13, 0x13, 0x13,  /* totalCoef==12 */
+  0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41,  /* prefix 000 */
+  0x30, 0x31, 0x23, 0x23, 0x12, 0x12, 0x12, 0x12,  /* totalCoef==13 */
+  0x20, 0x20, 0x21, 0x21, 0x12, 0x12, 0x12, 0x12,  /* totalCoef==14 */
+  0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11,  /* totalCoef==15 */
+};
+
+
+/*
+ * The structure of the code is XXXXYYYY where XXXX is the length of the code
+ * and YYYY is the number of zero coefficients.
+ */
+static const u_int8 totalZerosTabChroma[3][8] = {
+  {0x33, 0x32, 0x21, 0x21, 0x10, 0x10, 0x10, 0x10},
+  {0x22, 0x22, 0x21, 0x21, 0x10, 0x10, 0x10, 0x10},
+  {0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10}
+};
+
+
+/*
+ * The structure of the code is XXXXYYYY where XXXX is the length of the code
+ * and YYYY is run length.
+ */
+static const u_int8 runBeforeTab[7][8] = {
+  {0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10},
+  {0x22, 0x22, 0x21, 0x21, 0x10, 0x10, 0x10, 0x10},
+  {0x23, 0x23, 0x22, 0x22, 0x21, 0x21, 0x20, 0x20},
+  {0x34, 0x33, 0x22, 0x22, 0x21, 0x21, 0x20, 0x20},
+  {0x35, 0x34, 0x33, 0x32, 0x21, 0x21, 0x20, 0x20},
+  {0x31, 0x32, 0x34, 0x33, 0x36, 0x35, 0x20, 0x20},
+  {0x00, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30},
+};
+
+
+
+/*
+ * Static function prototypes
+ */
+
+static int getCoefLevelVLC0(bitbuffer_s *bitbuf);
+
+static int getCoefLevelVLCN(bitbuffer_s *bitbuf, int tabNum);
+
+static int get4x4coefs(bitbuffer_s *bitbuf, int coef[4][4],
+                       int blkIdxX, int blkIdxY, int8 *numCoefUpPred,
+                       int8 *numCoefLeftPred, int mbAvailbits, int dcSkip);
+
+static int get2x2coefsCDC(bitbuffer_s *bitbuf, int coef[4], int *numCoef);
+
+#endif  // VIDEOEDITORENGINE_AVC_EDITING
+
+/*
+ * Functions begin here
+ */
+
+/*
+ *
+ * vldGetFLC:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      len                   Length of the code
+ *
+ * Function:
+ *      Get Fixed Length Code (max length 16 bits).
+ *
+ * Returns:
+ *      Code
+ *
+ */
+unsigned int vldGetFLC(bitbuffer_s *bitbuf, int len)
+{
+  u_int32 code;
+
+  bibGetMax16bits(bitbuf, len, &code);
+
+  return (unsigned int)code;
+}
+
+/*
+ *
+ * vldGetUVLC:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *
+ * Function:
+ *      Decode an UVLC codeword, UVLC codeword is of the form:
+ *      code          codeword
+ *      0                1
+ *      1               010
+ *      2               011
+ *      3              00100
+ *      4              00101
+ *      5              00110
+ *      6              00111
+ *      7             0001000
+ *      8             0001001
+ *      ...             ...
+ *
+ * Returns:
+ *      Codenumber in the range [0, 65535]
+ *
+ */
+#if 1
+unsigned int vldGetUVLC(bitbuffer_s *bitbuf)
+{
+  u_int32 c;
+  int prefixLen;
+  int bit;
+
+  bibGetBit(bitbuf, &bit);
+
+  if (bit == 1)
+    return 0;
+
+  prefixLen = 0;
+
+  do {
+    bibGetBit(bitbuf, &bit);
+    prefixLen += 1;
+
+    /* Maximum prefix length is VLD_MAX_CW_LEN/2 */
+    if (prefixLen == VLD_MAX_CW_LEN/2) {
+      bibGetMax16bits(bitbuf, VLD_MAX_CW_LEN/2, &c);
+      if (bit != 1 || c != 0) {
+        /* We encoutered overlong codeword or we encoutered too big code */
+        bibRaiseError(bitbuf, BIB_ERR_BIT_ERROR);
+        return 0;
+      }
+      else
+        return VLD_MAX_UVLC_CODE_NUM;  /* Otherwise, return maximum 16-bit code number */
+    }
+
+  } while (bit == 0);
+
+  bibGetMax16bits(bitbuf, prefixLen, &c);
+
+  return (unsigned int)(c + (1<<prefixLen)-1);
+}
+#else
+unsigned int vldGetUVLC(bitbuffer_s *bitbuf)
+{
+  int prefixLen, len;
+  u_int32 bits;
+
+  bibShowMax16bits(bitbuf, 16, &bits);
+
+  if (bits >= 0x0100) {
+    prefixLen = numLeadZerosTab[bits>>9];
+    len = 2*prefixLen+1;
+    bibSkipBits(bitbuf, len);
+    return (unsigned int)((bits >> (16-len)) - 1);
+  }
+  else {
+    if (bits >= 0x0001)
+      prefixLen = 8 + numLeadZerosTab[bits>>1];
+    else
+      prefixLen = 16;
+
+    bibSkipBits(bitbuf, prefixLen);
+    bibGetBits(bitbuf, prefixLen+1, &bits);
+    return (unsigned int)(bits - 1);
+  }
+}
+#endif
+
+/*
+ *
+ * vldGetSignedUVLClong:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *
+ * Function:
+ *      Decode an UVLC codeword and produce signed 32-bit integer
+ *
+ * Returns:
+ *      Code in the range [-2^31, 2^31-1]
+ *
+ */
+int32 vldGetSignedUVLClong(bitbuffer_s *bitbuf)
+{
+  u_int32 codeNum;
+  int32 code;
+
+  codeNum = vldGetUVLClong(bitbuf);
+
+  /* Decode magnitude */
+  code = (int32)((codeNum >> 1) + (codeNum & 1));
+
+  /* Decode sign */
+  if ((codeNum & 1) == 0)
+    code = -code;
+
+  return code;
+}
+
+/*
+ *
+ * vldGetUVLClong:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      code                  Return pointer for code
+ *
+ * Function:
+ *      Decode long UVLC codeword.
+ *
+ * Returns:
+ *      Codenumber in the range [0, 2^32-1]
+ *
+ */
+u_int32 vldGetUVLClong(bitbuffer_s *bitbuf)
+{
+  u_int32 c, cLo;
+  int prefixLen, len0;
+  int bits;
+
+  prefixLen = -1;
+
+  do {
+    bibGetBit(bitbuf, &bits);
+    prefixLen += 1;
+
+    /* Is codeword too long? */
+    if (prefixLen > VLD_MAX_LONG_CW_LEN/2) {
+      bibRaiseError(bitbuf, BIB_ERR_BIT_ERROR);
+      return 0;
+    }
+
+  } while (bits == 0);
+
+  len0 = min(24, prefixLen);
+  bibGetBits(bitbuf, len0, &c);
+
+  if (prefixLen > 24) {
+    /* We have to read bits in two pieces because bibGetBits can only fetch */
+    /* max. 24 bits */
+    bibGetMax16bits(bitbuf, prefixLen-24, &cLo);
+    c = (c << (prefixLen-24)) | cLo;  /* Combine two pieces */
+
+    if (prefixLen == VLD_MAX_LONG_CW_LEN/2) {
+      /* Is codeword too big? */
+      if (c != 0) {
+        bibRaiseError(bitbuf, BIB_ERR_BIT_ERROR);
+        return 0;
+      }
+      else
+        return (u_int32)VLD_MAX_LONG_UVLC_CODE_NUM;  /* Otherwise, return maximum 32-bit code number */
+    }
+  }
+
+  return (c + (1<<prefixLen)-1);
+}
+    
+
+#ifdef VIDEOEDITORENGINE_AVC_EDITING
+
+/*
+ *
+ * vldGetSignedUVLC:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *
+ * Function:
+ *      Decode an UVLC codeword and produce signed integer.
+ *
+ * Returns:
+ *      Code is in the range [-32768,32767].
+ *
+ */
+int vldGetSignedUVLC(bitbuffer_s *bitbuf)
+{
+  unsigned int codeNum;
+  int code;
+
+  codeNum = vldGetUVLC(bitbuf);
+
+  /* Decode magnitude */
+  code = (int)(((int32)codeNum+1)>>1);
+
+  /* Decode sign */
+  if ((codeNum & 1) == 0)
+    code = -code;
+
+  return code;
+}
+
+/*
+ *
+ * setChromaCbp:
+ *
+ * Parameters:
+ *      nc                    If 0, all CBP are zero
+ *      cbpDC                 Coded Bit Pattern for chroma DC
+ *      cbp                   Coded Bit Pattern for chroma AC
+ *
+ * Function:
+ *      Set chroma DC and AC CBP values
+ *      nc = 0:   No coefficients
+ *      nc = 1:   Only nonzero DC coefficients
+ *      nc = 2:   Nonzero AC and DC coefficients
+ *
+ * Returns:
+ *      -
+ */
+void setChromaCbp(int nc, int *cbpDC, int *cbp)
+{
+  if (nc == 0)
+    *cbpDC = *cbp = 0;
+  else if (nc == 1)
+    *cbpDC = 3, *cbp = 0;
+  else
+    *cbpDC = 3, *cbp = (1<<2*BLK_PER_MB/2*BLK_PER_MB/2)-1;
+}
+
+
+/*
+ *
+ * getLumaBlkCbp:
+ *
+ * Parameters:
+ *      cbpY                  CBP for 8x8 blocks
+ *
+ * Function:
+ *      Convert Codec Block Pattern of 8x8 blocks to Codec Block Pattern for
+ *      4x4 blocks. If 8x8 block has nonzero coefficients then all 4x4 blocks
+ *      within that 8x8 block are marked nonzero.
+ *
+ * Returns:
+ *      CBP for 4x4 blocks
+ *
+ */
+int getLumaBlkCbp(int cbpY)
+{
+  int cbp;
+
+  cbp  = (cbpY & (1<<0)) == 0 ? 0 : 0x0033;
+  cbp |= (cbpY & (1<<1)) == 0 ? 0 : 0x00cc;
+  cbp |= (cbpY & (1<<2)) == 0 ? 0 : 0x3300;
+  cbp |= (cbpY & (1<<3)) == 0 ? 0 : 0xcc00;
+
+  return cbp;
+}
+
+
+/*
+ *
+ * vldGetRunIndicator:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *
+ * Function:
+ *      Get the amount of copy macroblocks.
+ *
+ * Returns:
+ *      The number of copy MBs
+ *
+ */
+unsigned int vldGetRunIndicator(bitbuffer_s *bitbuf)
+{
+  return vldGetUVLC(bitbuf);
+}
+
+
+/*
+ *
+ * vldGetMBtype:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      hdr                   Return pointer for MB params
+ *      picType               Type of current picture (intra/inter)
+ *
+ * Function:
+ *      Get macroblock type. If MB is 16x16 intra then form cbp. Subblock
+ *      mode are also fetched if main mode is 8x8 inter.
+ *
+ * Returns:
+ *      VLD_OK for no error and VLD_ERROR for error.
+ *
+ */
+int vldGetMBtype(bitbuffer_s *bitbuf, vldMBtype_s *hdr, int picType)
+{
+  unsigned int code;
+  int nc;
+  int i;
+
+  /* Get macroblock mode */
+  code = vldGetUVLC(bitbuf);
+
+  if (IS_SLICE_I(picType)) {
+    /* INTRA macroblock in INTRA slice */
+    if (code >= VLD_NUM_MB_CODES_INTRA)
+      return VLD_ERROR;
+
+    hdr->type = MBK_INTRA;
+  }
+  else {
+    if (code >= VLD_NUM_MB_CODES_INTER)
+      return VLD_ERROR;
+
+    if (code >= 5) {
+      /* INTRA macroblock in INTER slice */
+      hdr->type = MBK_INTRA;
+      code -= 5;
+    }
+    else {
+      /* INTER macroblock in INTER slice */
+      hdr->type = MBK_INTER;
+      hdr->interMode = code+1;
+
+      if (hdr->interMode >= 4) {
+
+        /*
+         * Get sub-macroblock mode modes
+         */
+
+        for (i = 0; i < 4; i++) {
+          code = vldGetUVLC(bitbuf);
+
+          if (code > VLD_MAX_SUB_MB_MODE)
+            return VLD_ERROR;
+
+          hdr->inter8x8modes[i] = code;
+        }
+
+      }
+
+      if (bibGetStatus(bitbuf) < 0)
+        return VLD_ERROR;
+
+      return VLD_OK;
+    }
+  }
+
+  if (bibGetStatus(bitbuf) < 0)
+    return VLD_ERROR;
+
+  /*
+   * This is INTRA macroblock, find out INTRA type
+   */
+
+  if (code == 0)
+    hdr->intraType = MBK_INTRA_TYPE1;
+  else if (code != VLD_NUM_MB_CODES_INTRA-1) {
+    /* 16x16 INTRA - compose cbp value */
+    hdr->intraType = MBK_INTRA_TYPE2;
+    code -= 1;
+    hdr->intraMode = code & 3;
+    code >>= 2;
+    if (code < 3) {
+      nc = code;
+      hdr->cbpY = 0;
+    }
+    else {
+      nc = code-3;
+      hdr->cbpY = 0xffff;
+    }
+    setChromaCbp(nc, &hdr->cbpChromaDC, &hdr->cbpC);
+  }
+  else {
+    hdr->intraType = MBK_INTRA_TYPE_PCM;
+    hdr->cbpY = 0xffff;
+    hdr->cbpC = 0xff;
+    hdr->cbpChromaDC = 0x3;
+  }
+
+
+  return VLD_OK;
+}
+
+
+/*
+ *
+ * vldGetIntraPred:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      ipTab                 Return pointer for intra pred. modes
+ *
+ * Function:
+ *      Get 4x4 intra prediction modes. First a one bit flag is read. If flag
+ *      is 1, mode is predicted from neighborin blocks. If flag is 0,
+ *      additional 3 bit mode code is read. Process is repeated for 16 blocks.
+ *
+ * Returns:
+ *      VLD_OK for no error and VLD_ERROR for error.
+ *
+ */
+int vldGetIntraPred(bitbuffer_s *bitbuf, int8 *ipTab)
+{
+  int i, j, k, l;
+  int bit;
+  int modeCode;
+
+  for (j = 0; j < BLK_PER_MB; j+=2) {
+    for (i = 0; i < BLK_PER_MB; i+=2) {
+      for (k = 0; k < 2; k++) {
+        for (l = 0; l < 2; l++) {
+          bibGetBit(bitbuf, &bit);    /* Read flag */
+          if (bit == 1)               /* If 1, predict from neighbors */
+            ipTab[(j+k)*4+i+l] = -1;
+          else {                      /* If 0, read mode code */
+            bibGetMax8bits(bitbuf, 3, &modeCode);
+            ipTab[(j+k)*4+i+l] = (int8)modeCode;
+          }
+        }
+      }
+    }
+  }
+
+  /* Check if error occured */
+  if (bibGetStatus(bitbuf) < 0)
+    return VLD_ERROR;
+  else
+    return VLD_OK;
+}
+
+
+/*
+ *
+ * vldGetChromaIntraPred:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *
+ * Function:
+ *      Get chroma intra prediction mode.
+ *
+ * Returns:
+ *      Prediction mode.
+ *
+ */
+int vldGetChromaIntraPred(bitbuffer_s *bitbuf)
+{
+  unsigned int mode;
+
+  mode = vldGetUVLC(bitbuf);
+
+  if (bibGetStatus(bitbuf) < 0 || mode > VLD_MAX_IPR_CHROMA_MODE)
+    return VLD_ERROR;
+
+  return (int)mode;
+}
+
+
+/*
+ *
+ * vldGetMotVecs:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      interMode             Motion mode (16x16, 8x16, ...)
+ *      hasRef                Flag for multiple ref. frames
+ *      refNum                Return pointer for ref. indices
+ *      predVecs              Return pointer for delta vectors
+ *      numVecs               Number of vectors to read
+ *
+ * Function:
+ *      Get reference indices and delta motion vectors for MB
+ *
+ * Returns:
+ *      VLD_OK for no error and VLD_ERROR for error
+ *
+ */
+int vldGetMotVecs(bitbuffer_s *bitbuf, int interMode, int numRefFrames,
+                  int *refNum, int predVecs[][2], int numVecs)
+{
+  int i, j;
+  int code;
+  int refIdx;
+
+  if (numRefFrames > 1 && interMode < 5) {
+    if (numRefFrames == 2) {
+      for (i = 0; i < numRefIndices[interMode]; i++) {
+        bibGetBit(bitbuf, &refIdx);
+        refNum[i] = 1 - refIdx;
+      }
+    }
+    else {
+      for (i = 0; i < numRefIndices[interMode]; i++) {
+        if ((refNum[i] = (int)vldGetUVLC(bitbuf)) >= numRefFrames)
+          return VLD_ERROR;
+      }
+    }
+  }
+  else
+    refNum[0] = 0;
+
+  for(j = 0; j < numVecs; j++) {
+    for(i = 0; i < 2; i++) {
+      code = vldGetUVLC(bitbuf);
+      predVecs[j][i] = (code+1)>>1;
+      if ((code & 1) == 0)
+        predVecs[j][i] = -predVecs[j][i];
+    }
+  }
+
+  if (bibGetStatus(bitbuf) < 0)
+    return VLD_ERROR;
+  else
+    return VLD_OK;
+}
+
+
+/*
+ *
+ * vldGetCBP:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      mbType                Macroblock type (intra/inter)
+ *      cbpY                  Return pointer for luma CBP
+ *      cbpChromaDC           Return pointer for chroma DC CBP
+ *      cbpC                  Return pointer for chroma CBP
+ *
+ * Function:
+ *      Get Coded Block Patterns for both luma and chroma
+ *
+ * Returns:
+ *      VLD_OK for no error and VLD_ERROR for error
+ *
+ */
+int vldGetCBP(bitbuffer_s *bitbuf, int mbType,
+              int *cbpY, int *cbpChromaDC, int *cbpC)
+{
+  unsigned int code;
+  int cbp;
+
+  code = vldGetUVLC(bitbuf);
+
+  if (bibGetStatus(bitbuf) < 0 || code > VLD_MAX_CBP_CODE)
+    return VLD_ERROR;
+
+  if (mbType ==  MBK_INTRA)
+    cbp = code2cbp[code][0];
+  else
+    cbp = code2cbp[code][1];
+
+  *cbpY = getLumaBlkCbp(cbp%16);
+  setChromaCbp(cbp>>4, cbpChromaDC, cbpC);
+
+  return VLD_OK;
+}
+
+
+/*
+ *
+ * vldGetDeltaqp:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      delta_qp              Return pointer for delta QP
+ *
+ * Function:
+ *      Get macroblock delta QP
+ *
+ * Returns:
+ *      VLD_OK for no error and VLD_ERROR for error
+ *
+ */
+int vldGetDeltaqp(bitbuffer_s *bitbuf, int *delta_qp)
+{
+  unsigned int code;
+
+  code = vldGetUVLC(bitbuf);
+
+  if (bibGetStatus(bitbuf) < 0 || code > VLD_MAX_DELTA_QP_CODE)
+    return VLD_ERROR;
+
+  *delta_qp = (code+1)>>1;
+
+  if ((code & 1) == 0)
+    *delta_qp = -(*delta_qp);
+
+  return VLD_OK;
+}
+
+
+/*
+ *
+ * getCoefLevelVLC0:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *
+ * Function:
+ *      Get CAVLC coefficient level for VLC0 code format
+ *
+ * Returns:
+ *      Coefficient level
+ *
+ */
+static int getCoefLevelVLC0(bitbuffer_s *bitbuf)
+{
+  int numLeadingZeroBits;
+  u_int32 bits;
+  int len;
+  int coef;
+
+  bibShowMax16bits(bitbuf, 16, &bits);
+
+  if (bits > 0x0003) {
+    if (bits > 0x00ff)
+      numLeadingZeroBits = numLeadZerosTab[(int)(bits>>(16-7))];
+    else
+      numLeadingZeroBits = 7 + numLeadZerosTab[(int)(bits>>(16-7-7))];
+
+    coef = (numLeadingZeroBits >> 1) + 1;
+    if (numLeadingZeroBits & 1)
+      coef = -coef;
+
+    len = numLeadingZeroBits + 1;
+    bibSkipBits(bitbuf, len);
+  }
+  else if (bits > 0x0001) {
+    bibGetBits(bitbuf, 19, &bits);
+    coef = 8 + (((int)bits & 15) >> 1);
+    if (bits & 1)
+      coef = -coef;
+  }
+  else if (bits == 0x0001) {
+    bibSkipBits(bitbuf, 16);
+    bibGetMax16bits(bitbuf, 12, &bits);
+    coef = 16 + ((int)bits >> 1);
+    if (bits & 1)
+      coef = -coef;
+  }
+  else {
+    bibRaiseError(bitbuf, BIB_ERR_BIT_ERROR);
+    coef = 0;
+  }
+
+  return coef;
+}
+
+/*
+ *
+ * getCoefLevelVLCN:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      tabNum                VLC table number to be used
+ *
+ * Function:
+ *      Get CAVLC coefficient level for VLC1-6 code format
+ *
+ * Returns:
+ *      Coefficient level
+ *
+ */
+static int getCoefLevelVLCN(bitbuffer_s *bitbuf, int tabNum)
+{
+  int numLeadingZeroBits;
+  u_int32 bits;
+  int len;
+  int coef;
+
+  bibShowBits(bitbuf, 21, &bits);
+
+  if (bits > 0x00003f) {
+    if (bits > 0x001fff)
+      numLeadingZeroBits = numLeadZerosTab[(int)(bits>>(21-7))];
+    else
+      numLeadingZeroBits = 7 + numLeadZerosTab[(int)(bits>>(21-7-7))];
+
+    len = numLeadingZeroBits + 1 + tabNum;
+    bits = (bits >> (21 - len)) & ((1 << tabNum) - 1);
+    coef = (int)((numLeadingZeroBits << (tabNum - 1)) + (bits >> 1) +  1);
+    if (bits & 1)
+      coef = -coef;
+
+    bibSkipBits(bitbuf, len);
+  }
+  else if (bits > 0x00001f) {
+    bibSkipBits(bitbuf, 16);
+    bibGetMax16bits(bitbuf, 12, &bits);
+    coef = (15 << (tabNum - 1)) + ((int)bits >> 1) + 1;
+    if (bits & 1)
+      coef = -coef;
+  }
+  else {
+    bibRaiseError(bitbuf, BIB_ERR_BIT_ERROR);
+    coef = 0;
+  }
+
+  return coef;
+}
+
+
+/*
+ *
+ * get4x4coefs:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      coef                  Return pointer for 4x4 coefficients
+ *      blkIdxX               Horizontal block pos. within MB
+ *      blkIdxY               Vertical block pos. within MB
+ *      numCoefUpPred         Block coefficients counts of upper block
+ *      numCoefLeftPred       Block coefficients counts of left block
+ *      mbAvailBits           Macroblock availability flags
+ *      dcSkip                if 1, there's no DC coefficient
+ *
+ * Function:
+ *      Decode coefficients for 4x4 block.
+ *
+ * Returns:
+ *      VLD_OK for no error, VLD_ERROR for error
+ *
+ */
+static int get4x4coefs(bitbuffer_s *bitbuf, int coef[4][4],
+                       int blkIdxX, int blkIdxY, int8 *numCoefUpPred,
+                       int8 *numCoefLeftPred, int mbAvailBits, int dcSkip)
+{
+  int numCoefPred;
+  int tabNum;
+  u_int32 bits;
+  int code;
+  int numTrailingOnes;
+  int numLeadingZeroBits;
+  int totalCoef;
+  int numBits;
+  u_int32 flc;
+  int tmpLevel[16];
+  int level;
+  int numBigCoef;
+  u_int32 signs;
+  int s;
+  int i;
+  const u_int8 *totalZerosPtr;
+  int offset;
+  int totalZeros;
+  int zerosLeft;
+  int run;
+  int coefPos;
+  int coefNum;
+
+  static const int vlcNumTab[8] = {
+    0, 0, 1, 1, 2, 2, 2, 2
+  };
+
+  static const unsigned int incVlc[7] = {
+    0,3,6,12,24,48,32768          /* maximum vlc = 6 */
+  };
+
+  static const int zigZagPos[16] = {
+    0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
+  };
+
+  /*
+   * Decode number of coefficients and number of trailing ones
+   */
+
+  /* Predict number of coefficients from neighboring blocks */
+  if (blkIdxX || (mbAvailBits & 1)) {
+    numCoefPred = numCoefLeftPred[0];
+    if (blkIdxY || (mbAvailBits & 2))
+      numCoefPred = (numCoefPred + numCoefUpPred[0] + 1) >> 1;
+  }
+  else
+    numCoefPred = (blkIdxY || (mbAvailBits & 2)) ? numCoefUpPred[0] : 0;
+
+  /* Select variable length code or fixed length decoding */
+  if (numCoefPred < 8) {
+
+    /* Use variable length code  */
+
+    /* Select table number based on the prediction */
+    tabNum = vlcNumTab[numCoefPred];
+
+    bibShowBits(bitbuf, 18, &bits);
+
+    /* Compute number of leading zeros using look-up table */
+    if (bits >= 0x00400)
+      numLeadingZeroBits = numLeadZerosTab[(int)(bits>>(18-7))];
+    else
+      numLeadingZeroBits = 7 + numLeadZerosTab[(int)(bits>>(18-7-7))];
+
+    /* Shift excess bits away */
+    bits >>= 18-4-numLeadingZeroBits;
+
+    /* numTrailingOnes, totalCoef and length of the codeword are codec in one code */
+    code = numCoefTrailTab[tabNum][numLeadingZeroBits][(int)bits&7];
+
+    /* Total number of bits in codeword is sum of the number of leading zero bits,     */
+    /* 1 one bit and the number of bits in postfix. We know the number of leading zero */
+    /* bits. Postfix length is extracted from 2 highest bits of code.                  */
+    numBits = numLeadingZeroBits + 1 + (code >> 6);
+
+    bibSkipBits(bitbuf, numBits);
+
+    if ((code & 0x3f) == 2) {
+      /* All coefficients are zero */
+      numCoefUpPred[0] = numCoefLeftPred[0] = 0;
+      return VLD_OK;
+    }
+    else {
+      /* 2 lowest bits contains number of trailing ones */
+      numTrailingOnes = code & 3;
+      /* 4 middle bits contain total number of coefficients minus 1 */
+      totalCoef = ((code >> 2) & 15) + 1;
+    }
+  }
+  else {
+
+    /* Use fixed length code  */
+
+    bibGetMax8bits(bitbuf, 6, &flc);
+
+    if (flc != 3) {
+      /* 2 lowest bits contains number of trailing ones */
+      numTrailingOnes = (int)flc & 0x03;
+      /* high bits contain total number of coefficients minus 1 */
+      totalCoef = ((int)flc >> 2) + 1;
+      if (totalCoef < numTrailingOnes)
+        return VLD_ERROR;
+    }
+    else {
+      /* All coefficients are zero */
+      numCoefUpPred[0] = numCoefLeftPred[0] = 0;
+      return VLD_OK;
+    }
+  }
+
+  numCoefUpPred[0] = numCoefLeftPred[0] = (int8) totalCoef;
+
+
+  /*
+   * Decode signs for trailing ones and store trailing ones in tmpLevel.
+   */
+
+  numBigCoef = totalCoef - numTrailingOnes; 
+
+  if (numTrailingOnes != 0) {
+
+    /* Get signs for trailing ones. There can be maximum of 3 of them */
+    bibGetMax8bits(bitbuf, numTrailingOnes, &signs);
+
+    for (i = numTrailingOnes-1; i >= 0; i--) {
+      s = ((int)signs >> i) & 1;
+      tmpLevel[numBigCoef+i] = 1 - 2*s;
+    }
+  }
+
+  if (numBigCoef != 0) {
+
+    /*
+     * Decode first "big" level
+     */
+
+    if (totalCoef > 10 && numTrailingOnes < 3)
+      level = getCoefLevelVLCN(bitbuf, 1);
+    else
+      level = getCoefLevelVLC0(bitbuf);
+
+    if (numTrailingOnes < 3)
+      level += (level > 0) ? 1 : -1;
+
+    tmpLevel[numBigCoef-1] = level;
+
+    tabNum = (Abs((int32)level) > 3) ? 2 : 1;
+
+    /*
+     * Decode rest of the "big" levels
+     */
+
+    for (i = numBigCoef - 2; i >= 0; i--) {
+
+      level = getCoefLevelVLCN(bitbuf, tabNum);
+
+      tmpLevel[i] = level;
+
+      /* update VLC table number */
+      if (Abs((int32)level) > (int32)incVlc[tabNum])
+        tabNum++;
+    }
+
+  }
+
+  /*
+   * Get total number of zero coefficients
+   */
+
+  if (totalCoef < 16-dcSkip) {
+
+    bibShowMax16bits(bitbuf, 9, &bits);
+
+    totalZerosPtr = &totalZerosTab[totalZerosTabOffset[totalCoef-1]];
+    code = totalZerosPtr[(int)bits>>6];
+
+    if (code > 0xc0) {
+      offset = code - 0xc0;
+      code = totalZerosPtr[offset+(((int)bits>>3)&7)];
+      if (code > 0xc0) {
+        offset = code - 0xc0;
+        code = totalZerosPtr[offset+((int)bits&7)];
+      }
+    }
+
+    totalZeros = code & 15;
+
+    numBits = code >> 4;
+    bibSkipBits(bitbuf, numBits);
+  }
+  else
+    totalZeros = 0;
+
+  if (dcSkip + totalCoef + totalZeros > 16)
+    return VLD_ERROR;
+
+  /* All coefficients are initially zero */
+  for (i = 0; i < 4; i++) {
+    coef[i][0] = 0;
+    coef[i][1] = 0;
+    coef[i][2] = 0;
+    coef[i][3] = 0;
+  }
+
+  /*
+   * Get run of zeros before each coefficient and store coeffs. in tmpCoef
+   */
+
+  zerosLeft = totalZeros;
+  coefPos = dcSkip + totalCoef + totalZeros - 1;
+  coefNum = totalCoef - 1;
+
+  while (zerosLeft > 0 && coefNum > 0) {
+
+    coef[0][zigZagPos[coefPos]] = tmpLevel[coefNum];
+
+    // select VLC for runbefore
+    tabNum = zerosLeft <= 7 ? zerosLeft-1 : 6;
+
+    bibShowMax8bits(bitbuf, 3, &bits);
+
+    if (tabNum == 6 && bits == 0) {
+      bibShowMax16bits(bitbuf, 11, &bits);
+      if (bits == 0)
+        return VLD_ERROR;
+      numLeadingZeroBits = numLeadZerosTab[(int)bits>>1];
+      run = 7 + numLeadingZeroBits;
+      if (run > zerosLeft)
+        return VLD_ERROR;
+      numBits = 4 + numLeadingZeroBits;
+    }
+    else {
+      code = runBeforeTab[tabNum][(int)bits];
+      run = code & 15;
+      numBits = code >> 4;
+    }
+
+    bibSkipBits(bitbuf, numBits);
+
+    zerosLeft -= run;
+    coefPos -= run + 1;
+    coefNum--;
+  }
+
+  do {
+    coef[0][zigZagPos[coefPos]] = tmpLevel[coefNum];
+    coefPos--;
+    coefNum--;
+  } while (coefNum >= 0);
+
+  return VLD_OK;
+}
+
+
+/*
+ *
+ * get2x2coefsCDC:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      coef                  Return pointer for 2x2 coefficients
+ *      numCoef               Return pointer number of nonzero cefficients
+ *
+ * Function:
+ *      Decode coefficients for 2x2 DC block.
+ *
+ * Returns:
+ *      VLD_OK for no error, VLD_ERROR for error
+ *
+ */
+static int get2x2coefsCDC(bitbuffer_s *bitbuf, int coef[4], int *numCoef)
+{
+  int tabNum;
+  u_int32 bits;
+  int code;
+  int numTrailingOnes;
+  int numLeadingZeroBits;
+  int totalCoef;
+  int numBits;
+  int tmpLevel[4];
+  int level;
+  int numBigCoef;
+  u_int32 signs;
+  int s;
+  int i;
+  int totalZeros;
+  int zerosLeft;
+  int run;
+  int coefPos;
+  int coefNum;
+
+  static const unsigned int incVlc[7] = {
+    0,3,6,12,24,48,32768          /* maximum vlc = 6 */
+  };
+
+
+  /*
+   * Decode number of coefficients and number of trailing ones
+   */
+
+  bibShowMax16bits(bitbuf, 10, &bits);
+
+  /* Compute number of leading zeros using look-up table */
+  numLeadingZeroBits = numLeadZerosTab[(int)bits>>(10-7)];
+
+  /* Shift excess bits away */
+  bits >>= 10-3-numLeadingZeroBits;
+
+  /* Fetch numTrailingOnes and totalCoef */
+  code = numCoefTrailTabChroma[numLeadingZeroBits][(int)bits&3];
+
+  numTrailingOnes = code & 3;
+  totalCoef = (code >> 2) & 7;
+
+  numBits = (code >> 5) + 1;
+
+  bibSkipBits(bitbuf, numBits);
+
+  *numCoef = totalCoef;
+
+  if (totalCoef == 0)
+    return VLD_OK;
+
+
+  /*
+   * Decode signs for trailing ones
+   */
+
+  numBigCoef = totalCoef - numTrailingOnes; 
+
+  if (numTrailingOnes != 0) {
+
+    /* Get signs for trailing ones. There can be maximum of 3 of them */
+    bibGetMax8bits(bitbuf, numTrailingOnes, &signs);
+
+    for (i = numTrailingOnes-1; i >= 0; i--) {
+      s = ((int)signs >> i) & 1;
+      tmpLevel[numBigCoef+i] = 1 - 2*s;
+    }
+  }
+
+  if (numBigCoef != 0) {
+
+    /*
+     * Decode first level
+     */
+
+    level = getCoefLevelVLC0(bitbuf);
+
+    if (numTrailingOnes < 3)
+      level += (level > 0) ? 1 : -1;
+
+    tmpLevel[numBigCoef-1] = level;
+
+    tabNum = (Abs((int32)level) > 3) ? 2 : 1;
+
+    /*
+     * Decode rest of the levels
+     */
+
+    for (i = numBigCoef - 2; i >= 0; i--) {
+
+      level = getCoefLevelVLCN(bitbuf, tabNum);
+
+      tmpLevel[i] = level;
+
+      /* update VLC table number */
+      if (Abs((int32)level) > (int32)incVlc[tabNum])
+        tabNum++;
+    }
+
+  }
+
+  /*
+   * Get total zeros
+   */
+
+  if (totalCoef < 4) {
+    bibShowMax8bits(bitbuf, 3, &bits);
+    code = totalZerosTabChroma[totalCoef-1][(int)bits];
+    totalZeros = code & 15;
+    numBits = code >> 4;
+    bibSkipBits(bitbuf, numBits);
+  }
+  else
+    totalZeros = 0;
+
+  /* All coefficients are initially zero */
+  coef[0] = 0;
+  coef[1] = 0;
+  coef[2] = 0;
+  coef[3] = 0;
+
+  /*
+   * Get run before each coefficient
+   */
+
+  zerosLeft = totalZeros;
+  coefPos = totalCoef + totalZeros - 1;
+  coefNum = totalCoef - 1;
+
+  while (zerosLeft > 0 && coefNum > 0) {
+
+    coef[coefPos] = tmpLevel[coefNum];
+
+    bibShowMax8bits(bitbuf, 3, &bits);
+
+    code = runBeforeTab[zerosLeft-1][(int)bits];
+    run = code & 15;
+    numBits = code >> 4;
+
+    bibSkipBits(bitbuf, numBits);
+
+    zerosLeft -= run;
+    coefPos -= run + 1;
+    coefNum--;
+  }
+
+  do {
+    coef[coefPos] = tmpLevel[coefNum];
+    coefPos--;
+    coefNum--;
+  } while (coefNum >= 0);
+
+
+  return VLD_OK;
+}
+
+
+/*
+ *
+ * vldGetLumaDCcoeffs:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      coef                  Return pointer for 4x4 coefficients
+ *      numCoefUpPred         Block coefficients counts of upper block
+ *      numCoefLeftPred       Block coefficient counts of blocks to the left
+ *      mbAvailBits           Macroblock availability flags
+ *
+ * Function:
+ *      Decode coefficients for 4x4 luma DC block.
+ *
+ * Returns:
+ *      VLD_OK for no error, negative value for error
+ *
+ */
+int vldGetLumaDCcoeffs(bitbuffer_s *bitbuf, int coef[4][4],
+                       int8 *numCoefUpPred, int8 *numCoefLeftPred,
+                       int mbAvailBits)
+{
+  int j;
+  int8 numCoef   = *numCoefUpPred;
+  int8 numCoefLP = *numCoefLeftPred;
+  int retCode;
+
+  retCode = get4x4coefs(bitbuf, coef, 0, 0, &numCoef, &numCoefLP, mbAvailBits, 0);
+
+  if (retCode < 0)
+    return retCode;
+
+  if (numCoef == 0) {
+    for (j = 0; j < 4; j++) {
+      coef[j][0] = 0;
+      coef[j][1] = 0;
+      coef[j][2] = 0;
+      coef[j][3] = 0;
+    }
+  }
+
+  if (bibGetStatus(bitbuf) < 0)
+    return VLD_ERROR;
+  else
+    return VLD_OK;
+}
+
+
+/*
+ *
+ * vldGetLumaCoeffs:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      mbType                Macroblock type (intra/inter)
+ *      intraType             Intra type (16x16 or 4x4 intra pred)
+ *      cbpY                  Return pointer coded block pattern
+ *      coef                  Return pointer for 16x4x4 coefficients
+ *      numCoefUpPred         Block coefficients counts of upper block
+ *      numCoefLeftPred       Block coefficient counts of blocks to the left
+ *      mbAvailBits           Macroblock availability flags
+ *
+ * Function:
+ *      Decode coefficients for 16 4x4 luma blocks.
+ *
+ * Returns:
+ *      VLD_OK for no error, negative value for error
+ *
+ */
+int vldGetLumaCoeffs(bitbuffer_s *bitbuf, int mbType, int intraType,
+                     int *cbpY, int coef[4][4][4][4], int8 *numCoefUpPred,
+                     int8 *numCoefLeftPred, int mbAvailBits)
+{
+  int bx, by;
+  int blkIdxX, blkIdxY;
+  int i, j;
+  int cbp, cbpTemp;
+  int dcSkip;
+  int retCode;
+
+  dcSkip = mbType == MBK_INTRA && intraType == MBK_INTRA_TYPE2 ? 1 : 0;
+
+  cbp = cbpTemp = *cbpY;
+
+  for (by = 0; by < 4; by+=2) {
+    for (bx = 0; bx < 4; bx+=2) {
+
+      /* Check if any of the blocks in the current 8x8 block is codec */
+      if ((cbpTemp & 33) != 0) {
+        for (j = 0; j < 2; j++) {
+          for (i = 0; i < 2; i++) {
+
+            blkIdxX = bx + i;
+            blkIdxY = by + j;
+
+            retCode = get4x4coefs(bitbuf, coef[blkIdxY][blkIdxX], blkIdxX, blkIdxY,
+                                  &numCoefUpPred[blkIdxX], &numCoefLeftPred[blkIdxY],
+                                  mbAvailBits, dcSkip);
+
+            if (retCode < 0)
+              return retCode;
+
+            if (numCoefUpPred[blkIdxX] == 0)
+              cbp &= ~(1<<(blkIdxY*BLK_PER_MB+blkIdxX));
+          }
+
+        }
+      }
+      else {
+        numCoefUpPred[bx]   = 0;
+        numCoefUpPred[bx+1] = 0;
+        numCoefLeftPred[by]   = 0;
+        numCoefLeftPred[by+1] = 0;
+      }
+
+      cbpTemp >>= 2;
+    }
+    cbpTemp >>= 4;
+  }
+
+  *cbpY = cbp;
+
+  if (bibGetStatus(bitbuf) < 0)
+    return VLD_ERROR;
+  else
+    return VLD_OK;
+}
+
+
+/*
+ *
+ * vldGetChromaDCcoeffs:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      coef                  Return pointer for 2x2x2 coefficients
+ *      cbpYDC                Return pointer chroma DC coded block pattern
+ *
+ * Function:
+ *      Decode coefficients for 2 2x2 chroma DC blocks.
+ *
+ * Returns:
+ *      VLD_OK for no error, negative value for error
+ *
+ */
+int vldGetChromaDCcoeffs(bitbuffer_s *bitbuf, int coef[2][2][2], int *cbpDC)
+{
+  int comp;
+  int numCoef;
+  int retCode;
+
+  for (comp = 0; comp < 2; comp++) {
+
+    retCode = get2x2coefsCDC(bitbuf, &coef[comp][0][0], &numCoef);
+
+    if (retCode < 0)
+      return retCode;
+      
+    if (numCoef == 0)
+      *cbpDC &= ~(1<<comp);
+  }
+
+  if (bibGetStatus(bitbuf) < 0)
+    return VLD_ERROR;
+  else
+    return VLD_OK;
+}
+
+
+/*
+ *
+ * vldGetChromaCoeffs:
+ *
+ * Parameters:
+ *      bitbuf                Bitbuffer object
+ *      coef                  Return pointer for 2x2x2x4x4 coefficients
+ *      cbp                   Return pointer chroma coded block pattern
+ *      numCoefUpPred         Block coefficients counts of upper block for U frame
+ *      numCoefUpPredV        Block coefficients counts of upper block for V frame
+ *      numCoefLeftPred       Block coefficient counts of blocks to the left for U frame
+ *      numCoefLeftPredV      Block coefficient counts of blocks to the left for V frame
+ *      mbAvailBits           Macroblock availability flags
+ *
+ * Function:
+ *      Decode coefficients for 8 4x4 chroma blocks.
+ *
+ * Returns:
+ *      VLD_OK for no error, negative value for error
+ *
+ */
+int vldGetChromaCoeffs(bitbuffer_s *bitbuf, int coef[2][2][2][4][4], int *cbp,
+                       int8 *numCoefUpPred, int8 *numCoefUpPredV,
+                       int8 *numCoefLeftPred, int8 *numCoefLeftPredV,
+                       int mbAvailBits)
+{
+  int comp;
+  int i, j;
+  int retCode;
+
+  for (comp = 0; comp < 2; comp++) {
+
+    for (j = 0; j < 2; j++) {
+      for (i = 0; i < 2; i++) {
+
+        retCode = get4x4coefs(bitbuf, coef[comp][j][i], i, j, &numCoefUpPred[i],
+                              &numCoefLeftPred[j], mbAvailBits, 1);
+
+        if (retCode < 0)
+          return retCode;
+
+        if (numCoefUpPred[i] == 0)
+          *cbp &= ~(1<<(comp*4+j*2+i));
+      }
+
+    }
+
+    /* Switch to V frame */
+    numCoefUpPred = numCoefUpPredV;
+    numCoefLeftPred = numCoefLeftPredV;
+  }
+
+  if (bibGetStatus(bitbuf) < 0)
+    return VLD_ERROR;
+  else
+    return VLD_OK;
+}
+
+
+/*
+ *
+ * vldGetZeroLumaCoeffs:
+ *
+ * Parameters:
+ *      numCoefUpPred         Block coefficient counts of upper block
+ *      numCoefLeftPred       Block coefficient counts of blocks to the left
+ *
+ * Function:
+ *      Called when there are no luma coefficients.
+ *      Sets luma cefficient counts to zero for current MB.
+ *
+ * Returns:
+ *      -
+ */
+void vldGetZeroLumaCoeffs(int8 *numCoefUpPred, int8 *numCoefLeftPred)
+{
+  int i;
+
+  for (i = 0; i < 4; i++) {
+    numCoefUpPred[i] = 0;
+    numCoefLeftPred[i] = 0;
+  }
+}
+
+
+/*
+ *
+ * vldGetZeroChromaCoeffs:
+ *
+ * Parameters:
+ *      numCoefUpPredU        Block coefficient counts of upper block for U frame
+ *      numCoefUpPredV        Block coefficient counts of upper block for V frame
+ *      numCoefLeftPred       Block coefficient counts of blocks to the left
+ *
+ * Function:
+ *      Called when there are no chroma coefficients.
+ *      Sets chroma cefficient counts to zero for current MB.
+ *
+ * Returns:
+ *      -
+ */
+void vldGetZeroChromaCoeffs(int8 *numCoefUpPredU, int8 *numCoefUpPredV,
+                            int8 numCoefLeftPred[2][2])
+{
+  int i;
+
+  for (i = 0; i < 2; i++) {
+    numCoefUpPredU[i] = 0;
+    numCoefUpPredV[i] = 0;
+    numCoefLeftPred[0][i] = 0;
+    numCoefLeftPred[1][i] = 0;
+  }
+}
+
+
+/*
+ *
+ * vldGetAllCoeffs:
+ *
+ * Parameters:
+ *      numCoefUpPredY        Block coefficient counts for Y frame
+ *      numCoefUpPredU        Block coefficient counts for U frame
+ *      numCoefUpPredV        Block coefficient counts for V frame
+ *      numCoefLeftPredY      Luma block coefficient counts of blocks to the left
+ *      numCoefLeftPredC      Chroma block coefficient counts of blocks to the left
+ *
+ * Function:
+ *      Called when all coefficients are non-zero (e.g. PCM mactroblock).
+ *      Sets cefficient counts to "all coded".
+ *
+ * Returns:
+ *      -
+ */
+void vldGetAllCoeffs(int8 *numCoefUpPredY, int8 *numCoefUpPredU,
+                     int8 *numCoefUpPredV, int8 *numCoefLeftPredY,
+                     int8 numCoefLeftPredC[2][2])
+{
+  int i;
+
+  for (i = 0; i < 4; i++) {
+    numCoefUpPredY[i] = 16;
+    numCoefLeftPredY[i] = 16;
+  }
+
+  for (i = 0; i < 2; i++) {
+    numCoefUpPredU[i] = 16;
+    numCoefUpPredV[i] = 16;
+    numCoefLeftPredC[0][i] = 16;
+    numCoefLeftPredC[1][i] = 16;
+  }
+}
+
+
+/*
+ *
+ * vldSetUVLC:
+ *
+ * Parameters:
+ *      codeNumber         value to encode - range [0, 65535]
+ *      codeword           output codeword
+ *      codewordLength     length of output codeword
+ *
+ * Function:
+ *      Encode a value to an UVLC codeword, UVLC codeword is of the form:
+ *      code          codeword
+ *      0                1
+ *      1               010
+ *      2               011
+ *      3              00100
+ *      4              00101
+ *      5              00110
+ *      6              00111
+ *      7             0001000
+ *      8             0001001
+ *      ...             ...
+ *
+ * Returns:
+ *      1 on error, 0 on none    
+ *
+ */
+int vldSetUVLC(int codeNumber, int* codeword, int* codewordLength)
+{
+  int c;
+  int bits;
+
+  if (codeNumber < 0 || codeNumber > 65535)
+  	return 1; 
+  	
+  c = codeNumber+1; 
+  bits = 0;
+  
+  do 
+  {
+    c >>= 1;
+    bits++;
+  }
+  while (c);
+  
+  *codeword = codeNumber + 1;
+  *codewordLength = (bits << 1) - 1;
+  
+  return 0;
+}
+ 
+#endif  //VIDEOEDITORENGINE_AVC_EDITING