videoeditorengine/h263decoder/src/viddemux.cpp
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/h263decoder/src/viddemux.cpp	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,4111 @@
+/*
+* 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:  
+* H.263 bitstream parsing.
+*
+*/
+
+
+
+/*
+ * Includes
+ */
+
+#include "h263dConfig.h"
+#include "viddemux.h"
+#include "vdxint.h"
+#include "debug.h"
+#include "biblin.h"
+/* MVE */
+#include "MPEG4Transcoder.h"
+
+/*
+ * Defines
+ */
+
+#ifdef DEB_STDOUT
+/* Use back-channel debug output file when printing back-channel related 
+   messages. */
+#include <stdio.h>
+extern FILE *bcmDebFile;
+#endif
+
+ 
+/*
+ * Module-scope typedefs
+ */
+
+/* Another type for VLC (variable length code) lookup tables used in 
+   Annex I implementation.*/
+typedef struct {
+   u_char LAST;   /* see section 5.4.2 of the H.263 recommendation */
+   u_char RUN;    /* to understand LAST, RUN and LEVEL */
+   u_char LEVEL;
+   u_char len;    /* actual length of code in bits */
+} vdxVLCTableNew_t;
+
+
+/*
+ * Global constants
+ */
+
+/* Used to convert a luminance block index defined in section 4.2.1
+   of the H.263 recommendation to a coded block pattern mask (see sections
+   5.3.4 and 5.3.5 of the H.263 recommendation. 
+   See also macros section in viddemux.h. */
+const int vdxBlockIndexToCBPYMask[5] = {0, 8, 4, 2, 1};
+const int vdxYBlockIndexToCBPBMask[5] = {0, 32, 16, 8, 4};
+
+
+/*
+ * Local function prototypes
+ */
+
+/* Picture Layer */
+
+static int vdxActAfterIncorrectSEI(
+   bibBuffer_t *inBuffer,
+   int fPLUSPTYPE,
+   int *fLast,
+   int *bitErrorIndication);
+
+static void vdxStandardSourceFormatToFrameSize(int sourceFormat, int *width, int *height);
+
+/* Slice Layer */
+int vdxFrameSizeToPictureFormat(int width, int height);
+
+/* Macroblock Layer */
+
+static int vdxGetIntraMode(bibBuffer_t *inBuffer,int *index,
+   int *bitErrorIndication);
+
+static int vdxUMVGetMVD(bibBuffer_t *inBuffer,int *mvdx10,
+   int *bitErrorIndication);
+
+static int vdxGetNormalMODB(bibBuffer_t *inBuffer, int *index, 
+   int *bitErrorIndication);
+
+static int vdxGetImpPBMODB(bibBuffer_t *inBuffer, int *index,
+   int *bitErrorIndication);
+
+
+
+
+/*
+ * Picture Layer Global Functions
+ */
+
+/* {{-output"vdxGetPictureHeader.txt"}} */
+/*
+ * vdxGetPictureHeader
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    inpParam                   input parameters
+ *    header                     output parameters: picture header
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function reads the H.263 picture header.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+int vdxGetPictureHeader(
+   bibBuffer_t *inBuffer, 
+   const vdxGetPictureHeaderInputParam_t *inpParam,
+   vdxPictureHeader_t *header,
+   int *bitErrorIndication)
+/* {{-output"vdxGetPictureHeader.txt"}} */
+{
+   bibFlushBits_t
+      flushBits;
+   bibGetBits_t
+      getBits;
+   int
+      numBitsGot,
+      bits1To5OfPTYPE,
+      sourceFormat;
+   int16
+      bibError = 0;
+   u_int32 tmp = 0;          /* temporary variable for reading some redundant bits */
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(inpParam != NULL);
+   vdxAssert(inpParam->flushBits != NULL);
+   vdxAssert(inpParam->getBits != NULL);
+   vdxAssert(header != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   flushBits = inpParam->flushBits;
+   getBits = inpParam->getBits;
+
+   memset(header, 0, sizeof(vdxPictureHeader_t));
+   *bitErrorIndication = 0;
+
+   /* Assume that the existence of a PSC has been checked,
+      it is the next code in the buffer, and
+      its byte alignment has been checked */
+
+   /* Flush stuffing (PSTUF) */
+   if (inpParam->numStuffBits) {
+      flushBits(inpParam->numStuffBits, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+   }
+
+   /* Flush PSC */
+   flushBits(22, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+   /* PSC cannot contain fatal bit errors (checked earlier) */
+   header->numBits += 22;
+
+   *bitErrorIndication = 0;   
+
+   /* TR */
+   header->tr = (int) getBits(8, inBuffer, &numBitsGot, bitErrorIndication,
+      &bibError);
+   header->numBits += 8;
+
+
+   #ifdef DEB_STDOUT
+      if (bcmDebFile)
+         deb1f(bcmDebFile, "TR %d\n", header->tr);
+   #endif
+
+   /* The first 5 bits from PTYPE */
+   bits1To5OfPTYPE = (int) getBits(5, inBuffer, &numBitsGot,
+      bitErrorIndication, &bibError);
+   header->numBits += 5;
+
+
+   /* PTYPE bit 1 should be 1 */
+   if ((bits1To5OfPTYPE & 16) == 0 ) {
+      deb0p("ERROR. PTYPE bit 1 invalid.\n");
+      goto exitAfterBitError;
+   }
+
+   /* PTYPE bit 2 should be 0 for distinction with H.261 */
+   if (bits1To5OfPTYPE & 8) {
+      deb0p("ERROR. PTYPE bit 2 indicates H.261.\n");
+      goto exitAfterBitError;
+   }
+
+   /* PTYPE bit 3, Split Screen Indicator */
+   header->fSplitScreen = ((bits1To5OfPTYPE & 4) > 0);
+
+   /* PTYPE bit 4, Document camera indicator */
+   header->fDocumentCamera = ((bits1To5OfPTYPE & 2) > 0);
+
+   /* PTYPE bit 5, Freeze Picture Release */
+   header->fFreezePictureRelease = (bits1To5OfPTYPE & 1);
+
+   /* PTYPE bits 6 - 8, Source Format */
+   sourceFormat = (int) getBits(3, inBuffer, &numBitsGot,
+      bitErrorIndication, &bibError);
+   header->numBits += 3;
+
+
+   /* If H.263 version 1 */
+   if (sourceFormat >= 1 && sourceFormat <= 5) {
+      int bits9To13OfPTYPE;
+
+      header->fPLUSPTYPE = 0;
+
+      vdxStandardSourceFormatToFrameSize(sourceFormat, &header->lumWidth, &header->lumHeight);
+
+      /* PTYPE bits 9 - 13 */
+      bits9To13OfPTYPE = (int) getBits(5, inBuffer, &numBitsGot,
+         bitErrorIndication, &bibError);
+      header->numBits += 5;
+
+
+      /* PTYPE bit 9, Picture coding type */
+      header->pictureType = ((bits9To13OfPTYPE & 16) > 0);
+
+      /* PTYPE bit 10, Unrestricted motion vector mode */
+      header->fUMV = ((bits9To13OfPTYPE & 8) > 0);
+
+      /* PTYPE bit 11, Syntax-based Arithmetic Coding mode */
+      header->fSAC = ((bits9To13OfPTYPE & 4) > 0);
+
+      /* PTYPE bit 12, Advanced prediction mode */
+      header->fAP = ((bits9To13OfPTYPE & 2) > 0);
+
+      /* PTYPE bit 13, PB-frames mode */
+
+      /* If PTYPE bit 9 indicates a P-picture */
+      if (header->pictureType) {
+         /* Check if it is actually a PB-picture */
+         if (bits9To13OfPTYPE & 1)
+            header->pictureType = VDX_PIC_TYPE_PB;
+      }
+
+      /* Else PTYPE bit 9 indicates an I-picture */
+      else {
+         /* Check that bit 13 is 0 */
+         if (bits9To13OfPTYPE & 1) {
+            deb0p("ERROR. PTYPE bit 9 and 13 mismatch.\n");
+            goto exitAfterBitError;
+         }
+      }
+   }
+
+   /* Else if H.263 version 2 (PLUSPTYPE) */
+   else if (sourceFormat == 7) {
+      int bits4To9OfMPPTYPE;
+
+      header->fPLUSPTYPE = 1;
+
+      /* UFEP */
+      header->ufep = (int) getBits(3, inBuffer, &numBitsGot,
+         bitErrorIndication, &bibError);
+      header->numBits += 3;
+
+
+      if (header->ufep > 1) {
+         deb0p("ERROR. UFEP illegal.\n");
+         goto exitAfterBitError;
+      }
+
+      /* If UFEP = '001' */
+      if (header->ufep) {
+         int bits4To18OfOPPTYPE;
+
+         /* OPPTYPE bits 1 - 3, Source format */
+         sourceFormat = (int) getBits(3, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 3;
+
+
+
+         if (sourceFormat >= 1 && sourceFormat <= 5) {
+            header->fCustomSourceFormat = 0;
+            vdxStandardSourceFormatToFrameSize(sourceFormat, 
+               &header->lumWidth, &header->lumHeight);
+         }
+
+         else if (sourceFormat == 6)
+            header->fCustomSourceFormat = 1;
+
+         else {
+            deb0p("ERROR. Source format illegal.\n");
+            goto exitAfterBitError;
+         }
+
+         /* OPPTYPE bits 4 - 18 */
+         bits4To18OfOPPTYPE = (int) getBits(15, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 15;
+
+
+         /* OPPTYPE bit 4, Custom PCF */
+         header->fCustomPCF = ((bits4To18OfOPPTYPE & 0x4000) > 0);
+
+         /* OPPTYPE bit 5, Unrestricted Motion Vector mode */
+         header->fUMV = ((bits4To18OfOPPTYPE & 0x2000) > 0);
+
+         /* OPPTYPE bit 6, Syntax-based Arithmetic Coding mode */
+         header->fSAC = ((bits4To18OfOPPTYPE & 0x1000) > 0);
+
+         /* OPPTYPE bit 7, Advanced Prediction mode */
+         header->fAP = ((bits4To18OfOPPTYPE & 0x0800) > 0);
+
+         /* OPPTYPE bit 8, Advanced INTRA Coding mode */
+         header->fAIC = ((bits4To18OfOPPTYPE & 0x0400) > 0);
+
+         /* OPPTYPE bit 9, Deblocking filter mode */
+         header->fDF = ((bits4To18OfOPPTYPE & 0x0200) > 0);
+
+         /* OPPTYPE bit 10, Slice Structured mode */
+         header->fSS = ((bits4To18OfOPPTYPE & 0x0100) > 0);
+
+         /* OPPTYPE bit 11, Reference Picture Selection mode */
+         header->fRPS = ((bits4To18OfOPPTYPE & 0x0080) > 0);
+
+         /* OPPTYPE bit 12, Independent Segment Decoding mode */
+         header->fISD = ((bits4To18OfOPPTYPE & 0x0040) > 0);
+
+         /* OPPTYPE bit 13, Alternative Inter VLC mode */
+         header->fAIV = ((bits4To18OfOPPTYPE & 0x0020) > 0);
+
+         /* OPPTYPE bit 14, Modified Quantization mode */
+         header->fMQ = ((bits4To18OfOPPTYPE & 0x0010) > 0);
+
+         /* OPPTYPE bits 15 - 18 must be '1000' */
+         if ((bits4To18OfOPPTYPE & 0x000F) != 8) {
+            deb0p("ERROR. OPPTYPE bits 15 - 18 illegal.\n");
+            goto exitAfterBitError;
+         }
+
+         /* Mode interaction restrictions, see section 5.1.4.6 of 
+            the H.263 recommendation */
+         if (header->fSAC && (header->fAIV || header->fMQ || header->fUMV)) {
+            deb0p("ERROR. Illegal bit pattern (section 5.1.4.6).\n");
+            goto exitAfterBitError;
+         }
+      }
+
+      /* MPPTYPE, bits 1 - 3, Picture type code */
+      header->pictureType = (int) getBits(3, inBuffer, &numBitsGot,
+         bitErrorIndication, &bibError);
+      header->numBits += 3;
+
+
+      if (header->pictureType >= 6) {
+         deb0p("ERROR. Picture type code illegal.\n");
+         goto exitAfterBitError;
+      }
+
+      /* MPPTYPE, bits 4 - 9 */
+      bits4To9OfMPPTYPE = (int) getBits(6, inBuffer, &numBitsGot,
+         bitErrorIndication, &bibError);
+      header->numBits += 6;
+
+
+      /* MPPTYPE bit 4, Reference Picture Resampling mode */
+      header->fRPR = ((bits4To9OfMPPTYPE & 32) > 0);
+
+      /* MPPTYPE bit 5, Reduced-Resolution Update mode */
+      header->fRRU = ((bits4To9OfMPPTYPE & 16) > 0);
+
+      /* RPR/RRU must not be set for I or EI-pictures.
+         (See section 5.1.4.5 of the H.263 recommendation.) */
+      if ((header->fRPR || header->fRRU) &&
+         (header->pictureType == VDX_PIC_TYPE_I || 
+            header->pictureType == VDX_PIC_TYPE_EI)) {
+         deb0p("ERROR. RPR or RRU is set for I or EI.\n");
+         goto exitAfterBitError;
+      }
+
+      /* MPPTYPE bit 6, Rounding type */
+      header->rtype = ((bits4To9OfMPPTYPE & 8) > 0);
+
+      /* RTYPE must be 0 if other than P, Improved PB or EP picture
+         (see section 5.1.4.3 of the H.263 recommendation */
+
+      /* MPPTYPE bits 7 - 9, must be '001' */
+      if ((bits4To9OfMPPTYPE & 7) != 1) {
+         deb0p("ERROR. MPPTYPE bits 7 - 9 illegal.\n");
+         goto exitAfterBitError;
+      }
+
+      /* CPM */
+      header->cpm = (int) getBits(1, inBuffer, &numBitsGot,
+         bitErrorIndication, &bibError);
+      header->numBits += 1;
+
+
+      if (header->cpm) {
+         /* PSBI */
+         header->psbi = (int) getBits(2, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 2;
+
+
+      }
+
+      if (header->fCustomSourceFormat) {
+         int parCode, fExtendedPAR = 0, pwi, phi;
+
+         /* CPFMT bits 1 - 4, Pixel Aspect Ratio code */
+         parCode = (int) getBits(4, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 4;
+
+
+
+         switch (parCode) {
+
+            case 1: /* Square */
+               header->parWidth = 1;
+               header->parHeight = 1;
+               break;
+
+            case 2: /* CIF for 4:3 picture */
+               header->parWidth = 12;
+               header->parHeight = 11;
+               break;
+
+            case 3: /* 525-type for 4:3 picture */
+               header->parWidth = 10;
+               header->parHeight = 11;
+               break;
+
+            case 4: /* CIF stretched for 16:9 picture */
+               header->parWidth = 16;
+               header->parHeight = 11;
+               break;
+
+            case 5: /* 525-type stretched for 16:9 picture */
+               header->parWidth = 40;
+               header->parHeight = 33;
+               break;
+
+            case 15: /* extended PAR */
+               fExtendedPAR = 1;
+               break;
+
+            default:
+               deb0p("ERROR. PAR code illegal.\n");
+               goto exitAfterBitError;
+         }
+
+         /* CPFMT bits 5 - 13, picture width indication */
+         pwi = (int) getBits(9, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 9;
+
+
+         header->lumWidth = ((pwi + 1) <<2 /** 4*/);
+
+         /* CPFMT bit 14 must be 1 */
+         tmp = getBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+         header->numBits += 1;
+
+
+         if ( tmp == 0 ) {
+            deb0p("ERROR. CPFMT bit 14 is 0.\n");
+            goto exitAfterBitError;
+         }
+
+         /* CPFMT bits 15 - 23, picture height indication */
+         phi = (int) getBits(9, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 9;
+
+
+         if (phi == 0 || phi > 288) {
+            deb0p("ERROR. PHI illegal.\n");
+            goto exitAfterBitError;
+         }
+         header->lumHeight = (phi <<2 /** 4*/);
+
+         if (fExtendedPAR) {
+            /* EPAR bits 1 - 8, PAR Width */
+            header->parWidth = (int) getBits(8, inBuffer, &numBitsGot,
+               bitErrorIndication, &bibError);
+            header->numBits += 8;
+
+
+            if (header->parWidth == 0) {
+               deb0p("ERROR. PAR width illegal.\n");
+               goto exitAfterBitError;
+            }
+
+            /* EPAR bits 9 - 16, PAR Height */
+            header->parHeight = (int) getBits(8, inBuffer, &numBitsGot,
+               bitErrorIndication, &bibError);
+            header->numBits += 8;
+
+
+            if (header->parHeight == 0) {
+               deb0p("ERROR. PAR height illegal.\n");
+               goto exitAfterBitError;
+            }
+         }
+      } /* endif (customSourceFormat) */
+
+      if (header->fCustomPCF) {
+         int clockConversionCode;
+         u_int32 clockDivisor, conversionFactor;
+
+         /* CPCFC bit 1, Clock conversion code */
+         clockConversionCode = (int) getBits(1, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 1;
+
+
+         if (clockConversionCode)
+            conversionFactor = 1001;
+         else
+            conversionFactor = 1000;
+
+         /* CPCFC bits 2 - 8, Clock divisor */
+         clockDivisor = getBits(7, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 7;
+
+
+         if (clockDivisor == 0) {
+            deb0p("ERROR. Illegal clock divisor.\n");
+            goto exitAfterBitError;
+         }
+ 
+         header->pcfRate = 1800000LU;
+         header->pcfScale = clockDivisor * conversionFactor;
+      }
+
+      else {
+         /* CIF clock frequency */
+         header->pcfRate = 2997;
+         header->pcfScale = 100;
+      }
+
+      if (header->fCustomPCF || (!header->ufep && inpParam->fCustomPCF)) {
+         int etr;
+
+         /* ETR */
+         etr = (int) getBits(2, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 2;
+
+
+
+         header->tr |= (etr << 8);
+      }
+
+      if (header->fUMV) {
+         /* UUI */
+         tmp = getBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+         header->numBits += 1;
+
+
+         if ( tmp )
+            header->fUMVLimited = 1;
+
+         else {
+            tmp = getBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+            header->numBits += 1;
+
+
+            if ( tmp )
+               header->fUMVLimited = 0;
+            else {
+               /* '00' forbidden */
+               deb0p("ERROR. Illegal UUI.\n");
+               goto exitAfterBitError;
+            }
+         }
+
+
+      }
+
+      if (header->fSS) {
+         /* SSS */
+         tmp = (int) getBits(1, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+
+         header->fRectangularSlices = tmp;
+         header->numBits += 1;
+
+         header->fArbitrarySliceOrdering = (int) getBits(1, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 1;
+
+
+         /* Mode interaction restriction, see section 5.1.4.6 of 
+            the H.263 recommendation */
+         if (header->fISD && !header->fRectangularSlices) {
+            deb0p("ERROR. Illegal bit pattern (section 5.1.4.6).\n");
+            goto exitAfterBitError;
+         }
+      }
+
+      if (inpParam->fScalabilityMode) {
+         /* ELNUM */
+         header->elnum = (int) getBits(4, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 4;
+
+      }
+
+      if (inpParam->fScalabilityMode && header->ufep) {
+         /* RLNUM */
+         header->rlnum = (int) getBits(4, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 4;
+
+      }
+
+      if (header->fRPS) {
+         /* RPSMF */
+         header->rpsMode = (int) getBits(3, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 3;
+
+
+         if (header->rpsMode < 4) {
+            deb0p("ERROR. Illegal RPSMF.\n");
+            goto exitAfterBitError;
+         }
+
+         header->rpsMode -= 4; /* 4..7 --> 0..3 */
+      }
+
+      /* If no OPPTYPE but RPS was previously on or RPS signaled in OPPTYPE */
+      if ((inpParam->fRPS && header->ufep == 0) || header->fRPS) {
+         /* TRPI */
+         header->trpi = (int) getBits(1, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 1;
+
+
+         if (header->trpi) {
+            /* TRP */
+            header->trp = (int) getBits(10, inBuffer, &numBitsGot,
+               bitErrorIndication, &bibError);
+            header->numBits += 10;
+
+
+            deb2f(bcmDebFile, "TRPI in picture header. TR = %d, TRP = %d.\n", 
+               header->tr, header->trp);            
+         }
+
+            /* Code following the standard */
+
+            /* BCI */
+            tmp = getBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+            header->numBits += 1;
+
+
+            if ( tmp ) {
+               /* BCM not supported */
+               deb0p("ERROR. BCM not supported.\n");
+               goto exitAfterBitError;
+            }
+
+            else {
+               tmp = getBits(1, inBuffer, &numBitsGot,bitErrorIndication, &bibError);
+               header->numBits += 1;
+
+
+               if ( !tmp ) {
+                  /* BCI '00' is illegal */
+                  deb0p("ERROR. Illegal BCI.\n");
+                  goto exitAfterBitError;
+               }
+            }
+
+      }
+
+      if (header->fRPR) {
+         /* RPRP not supported */
+         deb0p("ERROR. RPRP not supported.\n");
+         goto exitAfterBitError;
+      }
+   }
+
+   else {
+      deb0p("ERROR. Source format illegal.\n");
+      goto exitAfterBitError;
+   }
+
+   /* PQUANT */
+   header->pquantPosition = header->numBits;
+   header->pquant = (int) getBits(5, inBuffer, &numBitsGot,
+      bitErrorIndication, &bibError);
+   header->numBits += 5;
+
+
+   if (header->pquant == 0) {
+      deb0p("ERROR. PQUANT illegal.\n");
+      goto exitAfterBitError;
+   }
+
+   if (!header->fPLUSPTYPE) {
+      /* CPM */
+      header->cpm = (int) getBits(1, inBuffer, &numBitsGot,
+         bitErrorIndication, &bibError);
+      header->numBits += 1;
+
+
+      if (header->cpm) {
+         /* PSBI */
+         header->psbi = (int) getBits(2, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError); 
+         header->numBits += 2;
+
+
+      }
+   }
+
+   /* If PB-frame */
+   if (header->pictureType == VDX_PIC_TYPE_PB || 
+      header->pictureType == VDX_PIC_TYPE_IPB) {
+
+      /* TRB */
+
+      /* If custom picture clock frequence is used */
+      if (header->fCustomPCF || inpParam->fCustomPCF) {
+         header->trb = (int) getBits(5, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 5;
+
+
+      }
+
+      else {
+         header->trb = (int) getBits(3, inBuffer, &numBitsGot,
+            bitErrorIndication, &bibError);
+         header->numBits += 3;
+
+
+      }
+
+      if (header->trb == 0) {
+         deb0p("ERROR. TRB illegal.\n");
+         goto exitAfterBitError;
+      }
+
+      /* DBQUANT */
+      header->dbquant = (int) getBits(2, inBuffer, &numBitsGot,
+         bitErrorIndication, &bibError);
+      header->numBits += 2;
+
+
+   }
+
+
+   /* Check success and return */
+
+
+
+   /* If no error in bit buffer functions */
+   if (!bibError)
+      return VDX_OK;
+
+   /* Else if ran out of data (i.e. decoding out of sync) */
+   else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
+      return VDX_OK_BUT_BIT_ERROR;
+   }
+
+   /* Else other error in bit buffer functions */
+   else
+      return VDX_ERR_BIB;
+
+   exitAfterBitError:
+      if (bibError && bibError != ERR_BIB_NOT_ENOUGH_DATA)
+         return VDX_ERR_BIB;
+      return VDX_OK_BUT_BIT_ERROR;
+}
+
+
+/* {{-output"vdxFlushSEI.txt"}} */
+/*
+ * vdxFlushSEI
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function discards (flushes) all consequent PEI/PSUPP pairs.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+int vdxFlushSEI(
+   bibBuffer_t *inBuffer,
+   int *bitErrorIndication )
+/* {{-output"vdxFlushSEI.txt"}} */
+{
+   int
+      numBitsGot;
+   int16
+      bibError = 0;
+   u_int32 
+      pei,
+      psupp;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   do {
+      /* PEI */
+      pei = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+      if (pei) {
+         /* PSUPP */
+         psupp = bibGetBits(8, inBuffer, &numBitsGot, bitErrorIndication, 
+            &bibError);
+         // ignore the value of psupp; this is flush-function
+         if ( psupp )
+            {
+            }
+
+
+      }
+   } while (pei);   
+
+   return VDX_OK;
+
+}
+
+
+/* {{-output"vdxGetSEI.txt"}} */
+/*
+ * vdxGetSEI
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *
+ *    ftype                      FTYPE field as defined in table L.1 of H.263,
+ *                               -1 if the value is not valid
+ *
+ *    dsize                      DSIZE as defined in section L.2 of H.263
+ *
+ *    parameterData              an array of (min) 16 entries,
+ *                               filled with dsize octets of parameter data
+ *
+ *    fLast                      set to 1 if the first PEI indicates that
+ *                               no PSUPPs follow. Otherwise 0.
+ *
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function gets supplemental enhancement information as defined
+ *    in Annex L of H.263.
+ *
+ * Note:
+ *    The start code emulation prevention necessity using "Do Nothing" function
+ *    is not checked. See section L.3 of H.263 for more details.
+ *    
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+int vdxGetSEI(
+   bibBuffer_t *inBuffer,
+   int *ftype,
+   int *dsize,
+   u_char *parameterData,
+   int *fLast,
+   int *bitErrorIndication)
+/* {{-output"vdxGetSEI.txt"}} */
+{
+   int
+      numBitsGot,
+      paramNum,
+      lftype, /* local FTYPE */
+      ldsize; /* local DSZIE */
+   int16
+      bibError = 0;
+   u_int32 
+      pei;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(ftype != NULL);
+   vdxAssert(dsize != NULL);
+   vdxAssert(parameterData != NULL);
+   vdxAssert(fLast != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   *ftype = -1;
+   *dsize = 0;   
+
+   /* PEI */
+   pei = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+   if (pei) {
+      *fLast = 0;
+
+      /* FTYPE */
+      lftype = (int) bibGetBits(4, inBuffer, &numBitsGot, bitErrorIndication, 
+         &bibError);
+
+
+      /* DSIZE */
+      ldsize = (int) bibGetBits(4, inBuffer, &numBitsGot, bitErrorIndication, 
+         &bibError);
+
+   }
+
+   else {
+      *fLast = 1;
+      return VDX_OK;
+   }
+
+   for (paramNum = 0; paramNum < ldsize; paramNum++) {
+      /* PEI */
+      pei = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+      if (!pei) {
+         deb0p("ERROR. DSIZE does not match with PEI.\n");
+         *fLast = 1;
+         return VDX_OK_BUT_BIT_ERROR;
+      }
+
+      /* PSUPP containing parameter data */
+      parameterData[paramNum] = (u_char) bibGetBits(8, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+   }
+
+   *ftype = lftype;
+   *dsize = ldsize;
+     
+   return VDX_OK;
+
+}
+
+
+/* {{-output"vdxGetAndParseSEI.txt"}} */
+/*
+ * vdxGetAndParseSEI
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *
+ *    fPLUSPTYPE                 indicates if PLUSPTYPE is in use
+ *
+ *    numScalabilityLayers       -1 if the very first picture,
+ *                               0 if Annex N scalability layers not in use,
+ *                               2..15 if Annex N scalability layers in use
+ *
+ *    sei                        parsed SEI data
+ *
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function gets supplemental enhancement information as defined
+ *    in Annex L and W of H.263 and returns the parsed data.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ */
+
+int vdxGetAndParseSEI(
+   bibBuffer_t *inBuffer,
+   int fPLUSPTYPE,
+   int numScalabilityLayers,
+   vdxSEI_t *sei,
+   int *bitErrorIndication)
+/* {{-output"vdxGetAndParseSEI.txt"}} */
+{
+   int 
+       ret = VDX_OK,              /* Temporary variable to carry return values */
+      fSecondFTYPESet = 0,       /* 1 = Extended FTYPE in use, 
+                                    0 = Annex L/W FTYPE in use,
+                                    see L.15 for further details */
+      ftype,                     /* FTYPE as in section L.2 of H.263 */
+      dsize,                     /* DSIZE as in section L.2 of H.263 */
+      fLast,                     /* 1 if PEI is zero, 0 otherwise */
+      cont = 0,                  /* CONT as in section W.6 of H.263 */ 
+      ebit,                      /* EBIT as in section W.6 of H.263 */
+      mtype,                     /* MTYPE as in section W.6 of H.263 */
+      prevCONT = 0,              /* CONT field in the previous picture msg */
+      prevMTYPE = -1;            /* MTYPE in the previous picture msg */
+      
+   u_char
+      parameterData[16];
+
+   /* Initialize output data */
+   sei->fFullPictureFreezeRequest = 0;
+   sei->fFullPictureSnapshot = 0;
+   sei->snapshotId = 0;
+   sei->snapshotStatus = 255;
+   sei->scalabilityLayer = -1;
+   sei->numScalabilityLayers = 0;
+   memset(sei->prevPicHeader, 0, VDX_MAX_BYTES_IN_PIC_HEADER);
+   sei->numBytesInPrevPicHeader = 0;
+   sei->numBitsInLastByteOfPrevPicHeader = 0;
+   sei->fPrevPicHeaderTooLarge = 0;
+
+   do {
+      /* Get supplemental enhancement information */
+      ret = vdxGetSEI(inBuffer, &ftype, &dsize, parameterData, &fLast, 
+         bitErrorIndication);
+
+      /* If fatal error or bit error */
+      if (ret != VDX_OK)
+         return ret;
+
+      /* If the previous FTYPE indicated Extended Function Type */
+      if (fSecondFTYPESet) {
+
+         /* Let's discard FTYPE/DSIZE and parameters as suggested in 
+            section L.15 of H.263 Recommendation to allow backward
+            compatibility to to-be-defined set of extended FTYPEs. */
+            
+         /* The next expected FTYPE is a normal one defined in Annex L/W. */
+         fSecondFTYPESet = 0;
+
+         continue;
+      }
+
+      switch (ftype) {
+
+         /* If "Reserved" */
+         case 0:
+            ret = vdxActAfterIncorrectSEI(
+               inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            break;
+
+         /* If "Do Nothing" */
+         case 1:
+
+            if (dsize != 0) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Full-Picture Freeze Request */
+         case 2:
+            if (dsize != 0) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            else
+               sei->fFullPictureFreezeRequest = 1;
+
+            break;
+
+         /* If Partial-Picture Freeze Request */
+         case 3:
+            if (dsize != 4) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Resizing Partial-Picture Freeze Request */
+         case 4:
+            if (dsize != 8) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Partial-Picture Freeze-Release Request */
+         case 5:
+            if (dsize != 4) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Full-Picture Snapshot Tag */
+         case 6:
+            if (dsize != 4) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            else {
+               int i;
+               sei->fFullPictureSnapshot = 1;
+               /* store 32-bit snapshot ID, first byte is the least significant */
+               for (i = 0; i < 4; i++)
+                  sei->snapshotId |= (parameterData[i] << (i<<3 /**8*/));
+            }
+
+            break;
+
+         /* If Partial-Picture Snapshot Tag */
+         case 7:
+            if (dsize != 8) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Video Time Segment Start Tag */
+         case 8:
+            if (dsize != 4) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Video Time Segment End Tag */
+         case 9:
+            if (dsize != 4) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Progressive Refinement Segment Start Tag */
+         case 10:
+            if (dsize != 4) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Progressive Refinement Segment End Tag */
+         case 11:
+            if (dsize != 4) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Chroma Keying Information */
+         case 12:
+            if (dsize < 1 || dsize > 9) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Fixed-Point IDCT */
+         case 13:
+            if (dsize != 1) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            break;
+
+         /* If Picture Message */
+         case 14:
+            /* DSIZE shall be at least 1 to carry CONT, EBIT, and MTYPE */
+            if (dsize < 1) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            else {
+               cont = ( (parameterData[0] & 0x80) >> 7 ); 
+               ebit = ( (parameterData[0] & 0x70) >> 4 ); 
+               mtype = (parameterData[0] & 0x0f);
+
+               if (mtype < 1 || mtype > 5) {
+                  /* Non-text message, check restriction in W.6.2 */
+                  if (ebit != 0 && (cont == 1 || dsize == 1)) {
+                     ret = vdxActAfterIncorrectSEI(
+                        inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+                     break;
+                  }
+               }
+
+               /* If the previous picture message indicated that the data
+                  continues in the next picture message, but the current
+                  message type differs from the previous one
+                  (restricted in section W.6.1 of the H.263 Recommendation */
+               if (prevCONT && mtype != prevMTYPE) {
+                  ret = vdxActAfterIncorrectSEI(
+                     inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+                  break;
+               }
+            
+               /* If arbitrary binary data */
+               if (mtype == 0) {
+
+                  /* Proprietary snapshot status indication */
+                  if (parameterData[1] == 83 && parameterData[2] == 115) {
+                     if (dsize != 4) {
+                        ret = vdxActAfterIncorrectSEI(
+                           inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+                        break;
+                     }
+                     sei->snapshotStatus = parameterData[3];
+                  }
+
+                  /* Proprietary Annex N scalability layer 
+                     indication */
+                  else if (parameterData[1] == 83 && parameterData[2] == 108) {
+                     if (dsize != 4) {
+                        ret = vdxActAfterIncorrectSEI(
+                           inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+                        break;
+                     }
+                     sei->scalabilityLayer = parameterData[3] >> 4;
+                     sei->numScalabilityLayers = parameterData[3] & 15;
+
+                     /* If less than two scalability layers or
+                        max number of scalability layers changes during
+                        the sequence */
+                     if (sei->numScalabilityLayers < 2 ||
+                        (numScalabilityLayers >= 0 &&
+                           sei->numScalabilityLayers != 
+                           numScalabilityLayers)) {
+
+                        ret = vdxActAfterIncorrectSEI(
+                           inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+                        break;
+                     } 
+                  }
+               }
+
+               /* Else if Previous Picture Header Repetition */
+               else if (mtype == 7) {
+                  int
+                     firstIndexToWrite,
+                     numBytesToWrite;
+                  
+                  if (sei->numBytesInPrevPicHeader == 0)
+                     /* The first two bytes of PSC = 0x00 0x00 */
+                     sei->numBytesInPrevPicHeader = 2;
+                     
+                  firstIndexToWrite = sei->numBytesInPrevPicHeader;
+                  numBytesToWrite = dsize - 1;
+                  sei->numBitsInLastByteOfPrevPicHeader = 8 - ebit;
+
+                  /* If buffer would overflow */
+                  if (firstIndexToWrite + numBytesToWrite > 
+                     VDX_MAX_BYTES_IN_PIC_HEADER) {
+                     numBytesToWrite = 
+                        VDX_MAX_BYTES_IN_PIC_HEADER - firstIndexToWrite;
+                     sei->numBitsInLastByteOfPrevPicHeader = 8;
+                     sei->fPrevPicHeaderTooLarge = 1;
+                  }
+
+                  if (numBytesToWrite) {
+                     memcpy(
+                        &sei->prevPicHeader[firstIndexToWrite], 
+                        &parameterData[1],
+                        numBytesToWrite);
+
+                     sei->numBytesInPrevPicHeader += numBytesToWrite;
+                  }
+               }
+
+               prevCONT = cont;
+               prevMTYPE = mtype;
+            }
+            break;
+
+         /* If Extended Function Type */
+         case 15:
+            if (dsize != 0) {
+               ret = vdxActAfterIncorrectSEI(
+                  inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+            }
+
+            fSecondFTYPESet = 1;
+
+            break;
+      }
+   } while (!fLast && ret == VDX_OK);
+
+   /* If a picture message was not completed and the fault has not been
+      tracked earlier */
+   if (prevCONT && ret == VDX_OK) {
+      ret = vdxActAfterIncorrectSEI(
+         inBuffer, fPLUSPTYPE, &fLast, bitErrorIndication);
+   }
+
+   return ret;
+}
+
+
+/*
+ * GOB Layer Global Functions
+ */
+
+/* {{-output"vdxGetGOBHeader.txt"}} */
+/*
+ * vdxGetGOBHeader
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    inpParam                   input parameters
+ *    header                     output parameters: GOB header
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ * Function:
+ *    This function reads the H.263 GOB header.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+int vdxGetGOBHeader(
+   bibBuffer_t *inBuffer, 
+   const vdxGetGOBHeaderInputParam_t *inpParam,
+   vdxGOBHeader_t *header,
+   int *bitErrorIndication,
+   int aColorEffect,
+   int* aStartByteIndex,
+   int* aStartBitIndex, CMPEG4Transcoder *hTranscoder)
+/* {{-output"vdxGetGOBHeader.txt"}} */
+{
+   int
+      numBitsGot;
+   int16
+      bibError = 0;
+   u_int32 
+      tmp = 0;          /* temporary variable for reading some redundant bits */
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(inpParam != NULL);
+   vdxAssert(header != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   memset(header, 0, sizeof(vdxGOBHeader_t));
+   *bitErrorIndication = 0;
+
+   /* Assume that the existence of a GBSC has been checked, and
+      it is the next code in the buffer */
+
+   /* Flush stuffing (GSTUF) */
+   if (inpParam->numStuffBits)
+   {
+      bibFlushBits(inpParam->numStuffBits, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+      // if chroma has been removed and GSTUF is there, skip GSTUF bits to point to byte-aligned GBSC
+      if(aColorEffect==1 || aColorEffect==2)
+      {
+         (*aStartByteIndex)++;
+         *aStartBitIndex = 7;
+      }
+   }
+
+   /* MVE */
+     hTranscoder->H263GOBSliceHeaderBegin();
+
+    /* Flush GBSC */
+   bibFlushBits(17, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+   /* GBSC cannot contain fatal bit errors (checked earlier) */
+
+   /* GN */
+   header->gn = (int) bibGetBits(5, inBuffer, &numBitsGot, 
+      bitErrorIndication, &bibError);
+
+
+   /* If the GN field contains a fatal bit error or
+      the value of GN is not in the valid range 1..24.
+      This range is defined in section 5.2.3 of the standard.
+
+      Notice that in general case one cannot assume that the maximum GN
+      of the picture is the same as in the previous picture (GOB) since
+      a picture header may have been lost and the header could have contained
+      an indication of a picture format change. Therefore we have to stick
+      to the overall maximum GN, equal to 24, here. */
+
+   if ( header->gn == 0 /* PSC */ || 
+      header->gn > 24) {
+      deb0p("ERROR. GN illegal.\n");
+      goto exitAfterBitError;
+   }
+
+   if (inpParam->fCPM) {
+      /* GSBI */
+      header->gsbi = (int) bibGetBits(2, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+
+   }
+   /* GFID */
+   header->gfid = (int) bibGetBits(2, inBuffer, &numBitsGot, 
+      bitErrorIndication, &bibError);
+
+
+   /* GQUANT */
+   header->gquant = (int) bibGetBits(5, inBuffer, &numBitsGot, 
+      bitErrorIndication, &bibError);
+
+
+   if (header->gquant == 0) {
+      deb0p("ERROR. Illegal GQUANT.\n");
+      goto exitAfterBitError;
+   }
+
+   if (inpParam->fRPS) {
+      /* TRI */
+      header->tri = (int) bibGetBits(1, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+
+      /* If TR present */
+      if (header->tri) {
+         /* TR */
+         if (inpParam->fCustomPCF)
+            header->tr = (int) bibGetBits(10, inBuffer, &numBitsGot, 
+               bitErrorIndication, &bibError);
+         else
+            header->tr = (int) bibGetBits(8, inBuffer, &numBitsGot, 
+               bitErrorIndication, &bibError);
+
+
+      }
+
+      /* TRPI */
+      header->trpi = (int) bibGetBits(1, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+
+      /* If TRP present */
+      if (header->trpi) {
+         /* TRP */
+         header->trp = (int) bibGetBits(10, inBuffer, &numBitsGot, 
+            bitErrorIndication, &bibError);
+
+
+         deb2f(bcmDebFile, "TRPI in GOB header. GN = %d, TRP = %d.\n", 
+            header->gn, header->trp);         
+      }
+
+      /* BCI */
+         /* Code following the standard */
+
+         /* BCI */
+         tmp = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+         if ( tmp ) {
+            /* BCM not supported */
+            deb0p("ERROR. BCM not supported.\n");
+            goto exitAfterBitError;
+         }
+
+         else {
+            tmp = bibGetBits(1, inBuffer, &numBitsGot,bitErrorIndication, &bibError);
+
+
+            if ( !tmp ) {
+               /* BCI '00' is illegal */
+               deb0p("ERROR. Illegal BCI.\n");
+               goto exitAfterBitError;
+            }
+         }
+
+
+   }
+
+   /* Check success and return */
+
+
+   /* If no error in bit buffer functions */
+   if (!bibError)
+      return VDX_OK;
+
+   /* Else if ran out of data (i.e. decoding out of sync) */
+   else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
+      return VDX_OK_BUT_BIT_ERROR;
+   }
+
+   /* Else other error in bit buffer functions */
+   else
+      return VDX_ERR_BIB;
+
+   exitAfterBitError:
+      if (bibError && bibError != ERR_BIB_NOT_ENOUGH_DATA)
+         return VDX_ERR_BIB;
+
+      return VDX_OK_BUT_BIT_ERROR;
+}
+
+/*
+ * Slice Layer Global Functions
+ */
+
+/* {{-output"vdxGetSliceHeader.txt"}} */
+/*
+ * vdxGetSliceHeader
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    inpParam                   input parameters
+ *    header                     output parameters: Slice header
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ * Function:
+ *    This function reads the H.263 Slice header.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ */
+
+int vdxGetSliceHeader(
+   bibBuffer_t *inBuffer, 
+   const vdxGetSliceHeaderInputParam_t *inpParam,
+   vdxSliceHeader_t *header,
+   int *bitErrorIndication)
+/* {{-output"vdxGetSliceHeader.txt"}} */
+{
+   int
+      numBitsGot;
+   int16
+      bibError = 0;
+   u_int32 
+      tmp = 0;          /* temporary variable for reading some redundant bits */
+
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(inpParam != NULL);
+   vdxAssert(header != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   memset(header, 0, sizeof(vdxSliceHeader_t));
+   *bitErrorIndication = 0;
+
+   if (!inpParam->sliceHeaderAfterPSC)  {
+      /* Flush stuffing (GSTUF) */
+      if (inpParam->numStuffBits)
+         bibFlushBits(inpParam->numStuffBits, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+      /* Flush SSC */
+      /* Assume that the existence of a SSC has been checked, and
+         it is the next code in the buffer */
+
+      bibFlushBits(17, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+      /* SSC cannot contain fatal bit errors (checked earlier) */
+   }
+
+   /* Read SEPB1 (K.2.3) */
+   tmp = (int) bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, 
+                           &bibError);
+   
+
+   if (tmp != 1)  {
+      deb0p("ERROR. SEPB1 illegal.\n");
+      goto exitAfterBitError;
+   }
+
+   /* SSBI */
+   if ((inpParam->fCPM) && (!inpParam->sliceHeaderAfterPSC))  {
+      header->ssbi = (int) bibGetBits(4, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+
+      /* If the SSBI field contains a fatal bit error or
+      the value of SSBI is not in the valid range 9..12.
+      This range is defined in Table K.1/H.263 */
+      if ( tmp < 9  || 
+         tmp > 12) {
+         deb0p("ERROR. SSBI illegal.\n");
+         goto exitAfterBitError;
+      }
+      /* Set emulated GN value */
+      header->gn = header->ssbi + 16;
+      /* Set sub-bitstream number */
+      if (header->gn < 29) 
+         header->sbn = header->ssbi - 9;
+      else
+         header->sbn = 3;
+   }
+
+
+   /* MBA */
+   header->mba = (int) bibGetBits(inpParam->mbaFieldWidth, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+
+   /* If the MBA field contains a fatal bit error or
+      the value of MBA is larger than Max Value defined in Table K.2/H.263 */
+   if ( header->mba > inpParam->mbaMaxValue) {
+      deb0p("ERROR. MBA illegal.\n");
+      goto exitAfterBitError;
+   }
+
+   /* SEPB2 */
+   if (inpParam->sliceHeaderAfterPSC)  {
+      if (inpParam->fRectangularSlices)   {
+         tmp = (int) bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, 
+                              &bibError);
+
+
+         if (tmp != 1)  {
+            deb0p("ERROR. SEPB1 illegal.\n");
+            goto exitAfterBitError;
+         }
+      }
+   }
+   else  {
+      if (inpParam->fCPM)  {
+         if (inpParam->mbaFieldWidth > 9) {
+            tmp = (int) bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, 
+                              &bibError);
+
+
+            if (tmp != 1)  {
+               deb0p("ERROR. SEPB1 illegal.\n");
+               goto exitAfterBitError;
+            }
+         }
+      }
+      else  {
+         if (inpParam->mbaFieldWidth > 11) {
+            tmp = (int) bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, 
+                              &bibError);
+
+
+            if (tmp != 1)  {
+               deb0p("ERROR. SEPB1 illegal.\n");
+               goto exitAfterBitError;
+            }
+         }
+      }
+   }
+
+   /* SQUANT */
+   if (!inpParam->sliceHeaderAfterPSC)  {
+      header->squant = (int) bibGetBits(5, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+      if ( bibError )
+            return VDX_ERR_BIB;
+
+      /* If the SQUANT field contains a fatal bit error or
+         the value of SQUANT is between 1 and 31 */
+      if ( header->squant == 0) {
+         deb0p("ERROR. SQUANT illegal.\n");
+         goto exitAfterBitError;
+      }
+   }
+
+   /* SWI */
+   if (inpParam->fRectangularSlices)   {
+      header->swi = (int) bibGetBits(inpParam->swiFieldWidth, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+
+      /* If the MBA field contains a fatal bit error or
+         the value of MBA is larger than Max Value defined in Table K.2/H.263 */
+      if ( header->swi > inpParam->swiMaxValue) {
+         deb0p("ERROR. SWI illegal.\n");
+         goto exitAfterBitError;
+      }
+   }
+
+   /* Read SEPB3 */
+   tmp = (int) bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, 
+                           &bibError);
+
+
+   if (tmp != 1)  {
+      deb0p("ERROR. SEPB3 illegal.\n");
+      goto exitAfterBitError;
+   }
+
+   /* GFID */
+   if (!inpParam->sliceHeaderAfterPSC)  {
+      header->gfid = (int) bibGetBits(2, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+
+   }
+
+   if (!inpParam->sliceHeaderAfterPSC && inpParam->fRPS) {
+      /* TRI */
+      header->tri = (int) bibGetBits(1, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+
+      /* If TR present */
+      if (header->tri) {
+         /* TR */
+/*         if (inpParam->fCustomPCF)
+            header->tr = (int) bibGetBits(10, inBuffer, &numBitsGot, 
+               bitErrorIndication, &bibError);
+         else*/
+            header->tr = (int) bibGetBits(8, inBuffer, &numBitsGot, 
+               bitErrorIndication, &bibError);
+
+
+      }
+
+      /* TRPI */
+      header->trpi = (int) bibGetBits(1, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+
+      /* If TRP present */
+      if (header->trpi) {
+         /* TRP */
+         header->trp = (int) bibGetBits(10, inBuffer, &numBitsGot, 
+            bitErrorIndication, &bibError);
+
+
+         deb2f(bcmDebFile, "TRPI in GOB header. GN = %d, TRP = %d.\n", 
+            header->gn, header->trp);         
+      }
+
+      /* BCI */
+         /* Code following the standard */
+
+         /* BCI */
+         tmp = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+         if ( tmp ) {
+            /* BCM not supported */
+            deb0p("ERROR. BCM not supported.\n");
+            goto exitAfterBitError;
+         }
+
+         else {
+            tmp = bibGetBits(1, inBuffer, &numBitsGot,bitErrorIndication, &bibError);
+
+
+            if ( !tmp ) {
+               /* BCI '00' is illegal */
+               deb0p("ERROR. Illegal BCI.\n");
+               goto exitAfterBitError;
+            }
+         }
+
+
+   }
+
+   /* Check success and return */
+
+
+   /* If no error in bit buffer functions */
+   if (!bibError)
+      return VDX_OK;
+
+   /* Else if ran out of data (i.e. decoding out of sync) */
+   else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
+      return VDX_OK_BUT_BIT_ERROR;
+   }
+
+   /* Else other error in bit buffer functions */
+   else
+      return VDX_ERR_BIB;
+   exitAfterBitError:
+      if (bibError && bibError != ERR_BIB_NOT_ENOUGH_DATA)
+         return VDX_ERR_BIB;
+
+      return VDX_OK_BUT_BIT_ERROR;
+}
+/* {{-output"vdxGetMBAandSWIValues.txt"}} */
+/*
+ * vdxGetIMBLayer
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    inpParam                   input parameters
+ *    outParam                   output parameters
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ * Function:
+ *    This function reads the macroblock layer data of an INTRA macroblock.
+ *
+ * Returns:
+ *    Nothing
+ *
+ */
+
+void vdxGetMBAandSWIValues(
+   int width,
+   int height,
+   int fRRU,
+   int *mbaFieldWidth,
+   int *mbaMaxValue,
+   int *swiFieldWidth,
+   int *swiMaxValue
+   )
+{
+   int 
+      pictureFormat;
+
+   pictureFormat = vdxFrameSizeToPictureFormat(width, height);
+ 
+   if (fRRU)  {
+      switch (pictureFormat)  {
+      case 0:
+         /* sub-QCIF */
+         *mbaFieldWidth = 5;
+         *mbaMaxValue = 11;
+         *swiFieldWidth = 3;
+         *swiMaxValue = 3;
+         break;
+      case 1:
+         /* QCIF */
+         *mbaFieldWidth = 6;
+         *mbaMaxValue = 29;
+         *swiFieldWidth = 3;
+         *swiMaxValue = 5;
+         break;
+      case 2:
+         /* CIF */
+         *mbaFieldWidth = 7;
+         *mbaMaxValue = 98;
+         *swiFieldWidth = 4;
+         *swiMaxValue = 10;
+         break;
+      case 3:
+         /* 4CIF */
+         *mbaFieldWidth = 9;
+         *mbaMaxValue = 395;
+         *swiFieldWidth = 5;
+         *swiMaxValue = 21;
+         break;
+      case 4:
+         /* 16CIF */
+         *mbaFieldWidth = 11;
+         *mbaMaxValue = 1583;
+         *swiFieldWidth = 6;
+         *swiMaxValue = 43;
+         break;
+      case 5:
+         /* 2048x1152 */
+         *mbaFieldWidth = 12;
+         *mbaMaxValue = 2303;
+         *swiFieldWidth = 6;
+         *swiMaxValue = 63;
+         break;
+      }
+   }
+   else  {
+      switch (pictureFormat)  {
+      case 0:
+         /* sub-QCIF */
+         *mbaFieldWidth = 6;
+         *mbaMaxValue = 47;
+         *swiFieldWidth = 4;
+         *swiMaxValue = 7;
+         break;
+      case 1:
+         /* QCIF */
+         *mbaFieldWidth = 7;
+         *mbaMaxValue = 98;
+         *swiFieldWidth = 4;
+         *swiMaxValue = 10;
+         break;
+      case 2:
+         /* CIF */
+         *mbaFieldWidth = 9;
+         *mbaMaxValue = 395;
+         *swiFieldWidth = 5;
+         *swiMaxValue = 21;
+         break;
+      case 3:
+         /* 4CIF */
+         *mbaFieldWidth = 11;
+         *mbaMaxValue = 1583;
+         *swiFieldWidth = 6;
+         *swiMaxValue = 43;
+         break;
+      case 4:
+         /* 16CIF */
+         *mbaFieldWidth = 13;
+         *mbaMaxValue = 6335;
+         *swiFieldWidth = 7;
+         *swiMaxValue = 87;
+         break;
+      case 5:
+         /* 2048x1152 */
+         *mbaFieldWidth = 14;
+         *mbaMaxValue = 9215;
+         *swiFieldWidth = 7;
+         *swiMaxValue = 127;
+         break;
+      }
+   }
+}
+
+/*
+ * Macroblock Layer Global Functions
+ */
+
+/* {{-output"vdxGetIMBLayer.txt"}} */
+/*
+ * vdxGetIMBLayer
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    inpParam                   input parameters
+ *    outParam                   output parameters
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ * Function:
+ *    This function reads the macroblock layer data of an INTRA macroblock.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+   
+int vdxGetIMBLayer(
+   bibBuffer_t *inBuffer, 
+   bibBuffer_t *outBuffer, 
+   bibBufferEdit_t *bufEdit,
+   int /*aColorEffect*/, 
+   int * /*aStartByteIndex*/, 
+   int * /*aStartBitIndex*/, 
+   TBool /*aGetDecodedFrame*/,
+   const vdxGetIMBLayerInputParam_t *inpParam,
+   vdxIMBLayer_t *outParam,
+   int *bitErrorIndication, CMPEG4Transcoder *hTranscoder)
+
+/* {{-output"vdxGetIMBLayer.txt"}} */
+{
+   int
+      mcbpcIndex,
+      cbpyIndex,
+      retValue = VDX_OK,
+      fDQUANT = 0,
+      fINTRAMODE,
+      bitsGot = 0;
+   int16 bibError = 0;
+
+   int StartByteIndex; 
+   int StartBitIndex;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(inpParam != NULL);
+   vdxAssert(outParam != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+     
+   /* MVE */
+     vdxIMBListItem_t *MBinstance;
+     // Create new MBInstance for the next MB 
+     MBinstance = (vdxIMBListItem_t *) malloc(sizeof(vdxIMBListItem_t));
+     if (!MBinstance)
+     {
+         deb("ERROR - vdxGetIMBLayer::MBinstance creation failed\n");
+         return H263D_ERROR;         
+     }
+     memset(MBinstance, 0, sizeof(vdxIMBListItem_t));
+     
+   /* Loop while MCBPC indicates stuffing */
+   do {
+     
+        StartByteIndex = inBuffer->getIndex; 
+        StartBitIndex  = inBuffer->bitIndex;
+         
+        /* MVE */
+        VDT_SET_START_POSITION(MBinstance,0,inBuffer->getIndex,inBuffer->bitIndex); // 0: mcbpc
+         
+        retValue = vdxGetMCBPCIntra(inBuffer, &mcbpcIndex, bitErrorIndication);
+        if (retValue != VDX_OK)
+             goto exitFunction;
+         
+        /* MVE */
+        /* remember to output the MB stufffing bits!! */
+        if (mcbpcIndex == 8) 
+        {
+            /* copy data from inbuffer to outbuffer  */
+            bufEdit->copyMode = CopyWhole; // copy whole
+            CopyStream(inBuffer,outBuffer,bufEdit,StartByteIndex,StartBitIndex);
+        }
+   } while (mcbpcIndex == 8);
+     
+    /* MVE */
+    VDT_SET_END_POSITION(MBinstance,0,inBuffer->getIndex,inBuffer->bitIndex); // 0: mcbpc
+     
+   /* CBPC (2 LSBs of MCBPC) */
+   outParam->cbpc = mcbpcIndex & 3;
+
+   /* DQUANT is given for MCBPC indexes 4..7 */
+   fDQUANT = mcbpcIndex & 4;
+
+   /* MB Type*/
+   outParam->mbType = (mcbpcIndex <4)?3:4;
+   
+   /* INTRA_MODE */
+   if (inpParam->fAIC)
+   {
+      retValue = vdxGetIntraMode(inBuffer,&fINTRAMODE,bitErrorIndication);
+      if (retValue != VDX_OK)
+         goto exitFunction;
+      outParam->predMode = fINTRAMODE;
+   }
+
+   /* ac_pred_flag (1 bit) */
+   if (inpParam->fMPEG4) {
+      outParam->ac_pred_flag = (u_char) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &bibError);
+
+   }
+
+     /* MVE */
+   VDT_SET_START_POSITION(MBinstance,2,inBuffer->getIndex,inBuffer->bitIndex); // 2: cbpy
+
+   /* CBPY */
+   retValue = vdxGetCBPY(inBuffer, &cbpyIndex, bitErrorIndication);
+   if (retValue != VDX_OK)
+      goto exitFunction;
+   outParam->cbpy = cbpyIndex;
+
+     /* MVE */
+   VDT_SET_END_POSITION(MBinstance,2,inBuffer->getIndex,inBuffer->bitIndex); // 2: cbpy
+   VDT_SET_START_POSITION(MBinstance,1,inBuffer->getIndex,inBuffer->bitIndex); // 1: dquant
+     
+   if (fDQUANT) {
+         retValue = vdxUpdateQuant(inBuffer, inpParam->fMQ, inpParam->quant,
+             &outParam->quant, bitErrorIndication);
+         if (retValue != VDX_OK)
+             goto exitFunction;
+   }
+     
+   /* Else no DQUANT */
+   else
+         outParam->quant = inpParam->quant;
+   
+   /* Color Toning */
+   hTranscoder->AfterMBLayer(outParam->quant);
+     
+exitFunction:
+     
+     /* MVE */
+   VDT_SET_END_POSITION(MBinstance,1,inBuffer->getIndex,inBuffer->bitIndex); // 1: dquant
+   outParam->mcbpc = mcbpcIndex;
+     
+   MBinstance->mcbpc = mcbpcIndex;
+   MBinstance->quant = outParam->quant;
+   MBinstance->cbpc  = outParam->cbpc;
+   MBinstance->cbpy  = outParam->cbpy;
+   MBinstance->ac_pred_flag = outParam->ac_pred_flag; 
+   MBinstance->dquant       = fDQUANT ?  outParam->quant - inpParam->quant : 0;
+     
+   hTranscoder->OneIMBDataStarted(MBinstance);
+   free(MBinstance);
+     
+   return retValue;
+}
+
+
+/* {{-output"vdxGetPPBMBLayer.txt"}} */
+/*
+ * vdxGetPPBMBLayer
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    inpParam                   input parameters
+ *    outParam                   output parameters
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ * Function:
+ *    This function reads the macroblock layer data of an INTER macroblock.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+
+int vdxGetPPBMBLayer(
+   bibBuffer_t *inBuffer, 
+   bibBuffer_t *outBuffer, 
+   bibBufferEdit_t *bufEdit,
+   int /*aColorEffect*/,
+   int */*aStartByteIndex*/, 
+   int */*aStartBitIndex*/, 
+   TBool /*aGetDecodedFrame*/, 
+   int * /*bwMBType*/, 
+   const vdxGetPPBMBLayerInputParam_t *inpParam,
+   vdxPPBMBLayer_t *outParam,
+   int *bitErrorIndication, CMPEG4Transcoder *hTranscoder)
+
+/* {{-output"vdxGetPPBMBLayer.txt"}} */
+{
+   static const int mbTypeToMBClass[6] = 
+      {VDX_MB_INTER, VDX_MB_INTER, VDX_MB_INTER, 
+       VDX_MB_INTRA, VDX_MB_INTRA, VDX_MB_INTER};
+
+   static const int mbTypeToDQUANTI[6] =
+      {0, 1, 0, 0, 1, 1};
+
+   int
+      numBitsGot,
+      retValue = VDX_OK,
+      mcbpc,
+      mbType,
+      mbClass,
+      fDQUANT = 0,
+      fMVD,
+      numMVs,
+      fCBPB,
+      fMVDB,
+      cbpyIndex,
+      fINTRAMODE;
+   int16
+      bibError = 0;
+   u_int32 
+      bits;
+
+   int StartByteIndex; 
+   int StartBitIndex;
+
+    vdxAssert(inBuffer != NULL);
+    vdxAssert(inpParam != NULL);
+    vdxAssert(inpParam->pictureType == VDX_PIC_TYPE_P ||
+        inpParam->pictureType == VDX_PIC_TYPE_PB||
+        inpParam->pictureType == VDX_PIC_TYPE_IPB);
+    vdxAssert(outParam != NULL);
+    vdxAssert(bitErrorIndication != NULL);
+     
+    /* MVE */
+//    int startByteIndex = inBuffer->getIndex;
+//    int startBitIndex  = inBuffer->bitIndex;
+     
+    vdxPMBListItem_t *MBinstance;
+     // Create new MBInstance for the next MB 
+     MBinstance = (vdxPMBListItem_t *) malloc(sizeof(vdxPMBListItem_t));
+     if (!MBinstance)
+     {
+         deb("ERROR - vdxGetPMBLayer::MBinstance creation failed\n");
+         goto exitFunction;
+     }
+     memset(MBinstance, 0, sizeof(vdxPMBListItem_t));
+     VDT_SET_START_POSITION(MBinstance,11,0,7); // 11: MB stuffing bits
+     VDT_SET_END_POSITION(MBinstance,11,0,7); // 11: MB stuffing bits
+     
+   /* Set default output values */
+   memset(outParam, 0, sizeof(vdxPPBMBLayer_t));
+   outParam->quant = inpParam->quant;
+     
+   /* Loop while MCBPC indicates stuffing */
+   do {
+         
+         // note: stufffing includes COD+MCBPC in P frames
+         StartByteIndex = inBuffer->getIndex; 
+         StartBitIndex  = inBuffer->bitIndex;
+         
+         /* COD */
+         bits = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, 
+             &bibError);
+         
+         
+         outParam->fCodedMB = (int) bits ^ 1;
+         
+         /* If not coded (i.e. if COD == 1) */
+         if (bits)
+             goto exitFunction;
+         
+         /* Else coded (i.e. if COD == 0) */
+         else {
+            /* MCBPC */
+
+            /* MVE */
+            VDT_SET_START_POSITION(MBinstance,0,inBuffer->getIndex,inBuffer->bitIndex); // 0: mcbpc
+
+            retValue = vdxGetMCBPCInter(
+                 inBuffer, 
+                 inpParam->fPLUSPTYPE,
+                 inpParam->fAP || inpParam->fDF,
+                 inpParam->fFirstMBOfPicture,
+                 &mcbpc, 
+                 bitErrorIndication);
+
+            if (retValue != VDX_OK)
+                 goto exitFunction;
+
+            /* See section 5.3.2 of the H.263 recommendation to find out 
+            the details of this illegal codeword check. */
+            if (mcbpc == 20 &&
+                 inpParam->pictureType == VDX_PIC_TYPE_IPB &&
+                 inpParam->fCustomSourceFormat &&
+                 inpParam->fFirstMBOfPicture) 
+            {
+                 deb0p("ERROR. Illegal MCBPC stuffing.\n");
+                 retValue = VDX_OK_BUT_BIT_ERROR;
+                 goto exitFunction;
+            }
+
+            /* MVE */
+            /* remember to output the MB stufffing bits!! */
+            if (mcbpc == 20) 
+            {
+                 // copy data from inbuffer to outbuffer 
+                 bufEdit->copyMode = CopyWhole; // copy whole
+                 CopyStream(inBuffer,outBuffer,bufEdit,StartByteIndex,StartBitIndex);
+            }
+         }
+   } while (mcbpc == 20);
+
+   /* Decrease indexes > 20 to enable consistent MCBPC handling */
+   if (mcbpc > 20)
+         mcbpc--;
+     
+    /* MVE */
+    VDT_SET_END_POSITION(MBinstance,0,inBuffer->getIndex,inBuffer->bitIndex); // 0: mcbpc
+   
+   /* CBPC (2 LSBs of MCBPC) */
+   outParam->cbpc = mcbpc & 3;
+     
+   /* MCBPC --> MB type & included data elements */
+   mbType = outParam->mbType = mcbpc / 4;
+   mbClass = outParam->mbClass = mbTypeToMBClass[mbType];
+   fDQUANT = mbTypeToDQUANTI[mbType];
+   /* MVD is included always for PB-frames and always if MB type is INTER */
+   fMVD = inpParam->pictureType != VDX_PIC_TYPE_P || mbClass == VDX_MB_INTER;
+   numMVs = outParam->numMVs = 
+      (fMVD) ?
+         ((mbType == 2 || mbType == 5) ? 4 : 1) :
+         0;
+
+   /* 4 MVs can be present only when in Advanced Prediction or Deblocking 
+      Filter mode */
+   if (numMVs == 4 && !inpParam->fAP && !inpParam->fDF) {
+      deb0p("ERROR. Illegal MCBPC.\n");
+      retValue = VDX_OK_BUT_BIT_ERROR;
+      goto exitFunction;
+   }
+
+   /* INTRA_MODE */
+   if ((inpParam->fAIC)&&((mbType == 3) || (mbType == 4)))
+   {
+      retValue = vdxGetIntraMode(inBuffer,&fINTRAMODE,bitErrorIndication);
+      if (retValue != VDX_OK)
+         goto exitFunction;
+      outParam->predMode = fINTRAMODE;
+   }
+
+   if (inpParam->pictureType == VDX_PIC_TYPE_PB) {
+      int modbIndex;
+      /* MODB */
+      retValue = vdxGetNormalMODB(inBuffer, &modbIndex, bitErrorIndication);
+      if (retValue != VDX_OK)
+         goto exitFunction;
+      fCBPB = (int) (modbIndex & 2);
+      fMVDB = outParam->fMVDB = (int) (modbIndex > 0);
+   }
+   else if (inpParam->pictureType == VDX_PIC_TYPE_IPB)
+   {
+      int modbIndex;
+      /* MODB in Improved PB mode */
+      retValue = vdxGetImpPBMODB(inBuffer,&modbIndex,bitErrorIndication);
+      fCBPB = (int) (modbIndex & 1);
+      fMVDB = outParam->fMVDB = (int) ((modbIndex & 2)>>1);
+      outParam->IPBPredMode = (int) (modbIndex / 2);
+   }
+   else {
+      fCBPB = 0;
+      fMVDB = outParam->fMVDB = 0;
+   }
+
+   if (fCBPB) {
+      /* CBPB */
+      outParam->cbpb = (int) bibGetBits(6, inBuffer, &numBitsGot, 
+         bitErrorIndication, &bibError);
+
+
+   }
+   else
+      outParam->cbpb = 0;
+
+   /* ac_pred_flag (1 bit) */
+   if (inpParam->fMPEG4) {
+      if (mbClass == VDX_MB_INTRA) {
+         outParam->ac_pred_flag = (u_char) bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+      }
+   }
+
+   /* MVE */
+   VDT_SET_START_POSITION(MBinstance,2,inBuffer->getIndex,inBuffer->bitIndex); // 2: cbpy
+
+   /* CBPY */
+   retValue = vdxGetCBPY(inBuffer, &cbpyIndex, bitErrorIndication);
+   if (retValue != VDX_OK)
+      goto exitFunction;
+
+   if (mbClass == VDX_MB_INTER)
+      /* Convert index to INTER CBPY */
+      outParam->cbpy = 15 - cbpyIndex;
+
+   else
+      outParam->cbpy = cbpyIndex;
+
+   /* MVE */
+   VDT_SET_END_POSITION(MBinstance,2,inBuffer->getIndex,inBuffer->bitIndex); // 2: cbpy
+   VDT_SET_START_POSITION(MBinstance,1,inBuffer->getIndex,inBuffer->bitIndex); // 1: dquant
+
+   if (fDQUANT) {
+      /* Get DQUANT and update QUANT */
+      retValue = vdxUpdateQuant(inBuffer, inpParam->fMQ, inpParam->quant,
+         &outParam->quant, bitErrorIndication);
+      if (retValue != VDX_OK)
+         goto exitFunction;
+   }
+
+   /* MVE */
+   VDT_SET_END_POSITION(MBinstance,1,inBuffer->getIndex,inBuffer->bitIndex); // 1: dquant
+   VDT_SET_START_POSITION(MBinstance,10,inBuffer->getIndex,inBuffer->bitIndex); // 10: mv
+
+   /* Color Toning */
+   hTranscoder->AfterMBLayer(outParam->quant);
+     
+
+   if (fMVD) {
+         int i;
+         
+         /* If no new Annex D is in use */
+         if (!inpParam->fPLUSPTYPE || !inpParam->fUMV) {
+             
+             if (inpParam->fMPEG4) {
+                 for (i = 0; i < numMVs; i++) {
+                     retValue = vdxGetScaledMVD(inBuffer,inpParam->f_code,&outParam->mvdx[i],bitErrorIndication);
+                     if (retValue != VDX_OK)
+                         goto exitFunction;
+                     
+                     retValue = vdxGetScaledMVD(inBuffer,inpParam->f_code,&outParam->mvdy[i],bitErrorIndication);
+                     if (retValue != VDX_OK)
+                         goto exitFunction;
+                 }
+             } else {
+                 for (i = 0; i < numMVs; i++) {
+                     retValue = vdxGetMVD(inBuffer, &outParam->mvdx[i], bitErrorIndication);
+                     if (retValue != VDX_OK)
+                         goto exitFunction;
+                     
+                     retValue = vdxGetMVD(inBuffer, &outParam->mvdy[i], bitErrorIndication);
+                     if (retValue != VDX_OK)
+                         goto exitFunction;
+                 }
+             }
+         }
+         
+         else if (inpParam->fPLUSPTYPE && inpParam->fUMV)   /* Annex D */
+         {
+             for (i = 0; i < numMVs; i++)
+             {
+                 retValue = vdxUMVGetMVD(inBuffer,&outParam->mvdx[i],bitErrorIndication);
+                 if (retValue != VDX_OK)
+                     goto exitFunction;
+                 
+                 retValue = vdxUMVGetMVD(inBuffer,&outParam->mvdy[i],bitErrorIndication);
+                 if (retValue != VDX_OK)
+                     goto exitFunction;
+                 
+                 if ((outParam->mvdx[i] == 5) && (outParam->mvdy[i] == 5))
+                     /* Read "Prevent Start Code Emulation bit" if 000000 occurs */
+                 {
+                     bits = bibGetBits(1,inBuffer,&numBitsGot,bitErrorIndication,
+                         &bibError);
+                     
+                     
+                     if (!bits) {
+                         retValue = VDX_OK_BUT_BIT_ERROR;
+                         goto exitFunction;
+                     }
+                 }
+             }
+         }
+   }
+     
+   if (fMVDB) {
+         int i;
+         if (!inpParam->fPLUSPTYPE || !inpParam->fUMV) 
+         {
+             retValue = vdxGetMVD(inBuffer,&outParam->mvdbx,bitErrorIndication);
+             if (retValue != VDX_OK)
+                 goto exitFunction;
+             
+             retValue = vdxGetMVD(inBuffer,&outParam->mvdby,bitErrorIndication);
+             if (retValue != VDX_OK)
+                 goto exitFunction;
+         }
+         else if (inpParam->fPLUSPTYPE && inpParam->fUMV)   /* Annex D */
+         {
+             for (i = 0; i < numMVs; i++)
+             {
+                 retValue = vdxUMVGetMVD(inBuffer,&outParam->mvdbx,bitErrorIndication);
+                 if (retValue != VDX_OK)
+                     goto exitFunction;
+                 
+                 retValue = vdxUMVGetMVD(inBuffer,&outParam->mvdby,bitErrorIndication);
+                 if (retValue != VDX_OK)
+                     goto exitFunction;
+                 
+                 if ((outParam->mvdbx == 5) && (outParam->mvdby == 5))
+                     /* Read "Prevent Start Code Emulation bit" if 000000 occurs */
+                 {
+                     bits = bibGetBits(1,inBuffer,&numBitsGot,bitErrorIndication,
+                         &bibError);
+                     
+                     if (!bits) {
+                         retValue = VDX_OK_BUT_BIT_ERROR;
+                         goto exitFunction;
+                     }
+                 }
+             }
+         }
+   }
+     
+     
+     
+exitFunction:
+     
+   /* MVE */
+   /* PB frame is not allowed !!! */
+   VDT_SET_END_POSITION(MBinstance,10,inBuffer->getIndex,inBuffer->bitIndex); // 10: mv
+   outParam->mcbpc = mcbpc;   
+
+   for (int i = 0; i < outParam->numMVs; i++)
+   {
+         MBinstance->mvx[i] = outParam->mvdx[i];
+         MBinstance->mvy[i] = outParam->mvdy[i];
+   }
+     
+   MBinstance->mcbpc        = outParam->mcbpc;
+   MBinstance->fCodedMB     = (unsigned char)outParam->fCodedMB ;           
+   MBinstance->mbType       = outParam->mbType;              
+   MBinstance->mbClass      = outParam->mbClass;             
+   MBinstance->quant        = outParam->quant;               
+   MBinstance->cbpc         = outParam->cbpc;                
+   MBinstance->cbpy         = outParam->cbpy;                
+   MBinstance->ac_pred_flag = outParam->ac_pred_flag;
+   MBinstance->numMVs       = outParam->numMVs; 
+   MBinstance->dquant       = fDQUANT ?  outParam->quant - inpParam->quant : 0;
+     
+   hTranscoder->OnePMBDataStarted(MBinstance);
+   free(MBinstance);
+     
+   return retValue;
+}
+
+
+/*
+ * Block Layer Global Functions
+ */
+
+/* {{-output"vdxGetIntraDCTBlock.txt"}} */
+/*
+ * vdxGetIntraDCTBlock
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    fCodedBlock                0 if COD is 1, 1 if COD is 0
+ *    block                      DCT coefficients of the block 
+ *                               in zigzag order
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *    fMQ                        flag for Modified Quantization
+ *    qp                         quantization parameter
+ *
+ * Function:
+ *    This function gets the DCT coefficients for one INTRA block.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+int vdxGetIntraDCTBlock(
+   bibBuffer_t *inBuffer, 
+   int fCodedBlock,
+   int *block,
+   int *bitErrorIndication,
+   int fMQ,
+   int qp)
+/* {{-output"vdxGetIntraDCTBlock.txt"}} */
+{
+   int
+      numBitsGot,
+      retValue = VDX_OK;
+   int16
+      bibError = 0;
+   u_int32 
+      bits;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(block != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   /* MVE */
+   int fEscapeCodeUsed = 0;
+
+   /* INTRADC */
+   bits = bibGetBits(8, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+   block[0] = (int) (bits << 3);
+
+   /* If (FLC == 1111 1111) */
+   if (block[0] == 2040)
+      block[0] = 1024;
+
+   
+   if (fCodedBlock)
+      retValue = vdxGetDCTBlock(inBuffer, 1, 0, block, bitErrorIndication, fMQ,qp, &fEscapeCodeUsed);
+
+   else
+      memset(block + 1, 0, 63 * sizeof(int));
+
+   return retValue;
+
+
+}
+
+
+/* {{-output"vdxGetDCTBlock.txt"}} */
+/*
+ * vdxGetDCTBlock
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    startIndex                 the first index in block where to put data
+ *    fMPEG4EscapeCodes          use MPEG-4 escape codes (3 alternatives)
+ *    block                      array for block (length 64)
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *    fMQ
+ *    qp
+ *    fEscapeCodeUsed            
+ * Function:
+ *    This function reads a block from bit buffer using Huffman codes listed
+ *    in TCOEF table. The place, where the block is read is given as a
+ *    pointer parameter.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ *
+ */
+
+int vdxGetDCTBlock(
+   bibBuffer_t *inBuffer, 
+   int startIndex,
+   u_char fMPEG4EscapeCodes,
+   int *block,
+   int *bitErrorIndication,
+   int fMQ,
+   int qp,
+   int *fEscapeCodeUsed)
+/* {{-output"vdxGetDCTBlock.txt"}} */
+{
+   /* Lookup tables: val field contains
+      1 bit for LAST, 8 bits for RUN and 4 bits for LEVEL */
+   static const vdxVLCTable_t tcoefTab0[] = {
+      {4225,7}, {4209,7}, {4193,7}, {4177,7}, {193,7}, {177,7},
+      {161,7}, {4,7}, {4161,6}, {4161,6}, {4145,6}, {4145,6},
+      {4129,6}, {4129,6}, {4113,6}, {4113,6}, {145,6}, {145,6},
+      {129,6}, {129,6}, {113,6}, {113,6}, {97,6}, {97,6},
+      {18,6}, {18,6}, {3,6}, {3,6}, {81,5}, {81,5},
+      {81,5}, {81,5}, {65,5}, {65,5}, {65,5}, {65,5},
+      {49,5}, {49,5}, {49,5}, {49,5}, {4097,4}, {4097,4},
+      {4097,4}, {4097,4}, {4097,4}, {4097,4}, {4097,4}, {4097,4},
+      {1,2}, {1,2}, {1,2}, {1,2}, {1,2}, {1,2},
+      {1,2}, {1,2}, {1,2}, {1,2}, {1,2}, {1,2},
+      {1,2}, {1,2}, {1,2}, {1,2}, {1,2}, {1,2},
+      {1,2}, {1,2}, {1,2}, {1,2}, {1,2}, {1,2},
+      {1,2}, {1,2}, {1,2}, {1,2}, {1,2}, {1,2},
+      {1,2}, {1,2}, {17,3}, {17,3}, {17,3}, {17,3},
+      {17,3}, {17,3}, {17,3}, {17,3}, {17,3}, {17,3},
+      {17,3}, {17,3}, {17,3}, {17,3}, {17,3}, {17,3},
+      {33,4}, {33,4}, {33,4}, {33,4}, {33,4}, {33,4},
+      {33,4}, {33,4}, {2,4}, {2,4}, {2,4}, {2,4},
+      {2,4}, {2,4}, {2,4}, {2,4}
+   };
+
+   static const vdxVLCTable_t tcoefTab1[] = {
+      {9,10}, {8,10}, {4481,9}, {4481,9}, {4465,9}, {4465,9},
+      {4449,9}, {4449,9}, {4433,9}, {4433,9}, {4417,9}, {4417,9},
+      {4401,9}, {4401,9}, {4385,9}, {4385,9}, {4369,9}, {4369,9},
+      {4098,9}, {4098,9}, {353,9}, {353,9}, {337,9}, {337,9},
+      {321,9}, {321,9}, {305,9}, {305,9}, {289,9}, {289,9},
+      {273,9}, {273,9}, {257,9}, {257,9}, {241,9}, {241,9},
+      {66,9}, {66,9}, {50,9}, {50,9}, {7,9}, {7,9},
+      {6,9}, {6,9}, {4353,8}, {4353,8}, {4353,8}, {4353,8},
+      {4337,8}, {4337,8}, {4337,8}, {4337,8}, {4321,8}, {4321,8},
+      {4321,8}, {4321,8}, {4305,8}, {4305,8}, {4305,8}, {4305,8},
+      {4289,8}, {4289,8}, {4289,8}, {4289,8}, {4273,8}, {4273,8},
+      {4273,8}, {4273,8}, {4257,8}, {4257,8}, {4257,8}, {4257,8},
+      {4241,8}, {4241,8}, {4241,8}, {4241,8}, {225,8}, {225,8},
+      {225,8}, {225,8}, {209,8}, {209,8}, {209,8}, {209,8},
+      {34,8}, {34,8}, {34,8}, {34,8}, {19,8}, {19,8},
+      {19,8}, {19,8}, {5,8}, {5,8}, {5,8}, {5,8}
+   };
+
+   static const vdxVLCTable_t tcoefTab2[] = {
+      {4114,11}, {4114,11}, {4099,11}, {4099,11}, {11,11}, {11,11},
+      {10,11}, {10,11}, {4545,10}, {4545,10}, {4545,10}, {4545,10},
+      {4529,10}, {4529,10}, {4529,10}, {4529,10}, {4513,10}, {4513,10},
+      {4513,10}, {4513,10}, {4497,10}, {4497,10}, {4497,10}, {4497,10},
+      {146,10}, {146,10}, {146,10}, {146,10}, {130,10}, {130,10},
+      {130,10}, {130,10}, {114,10}, {114,10}, {114,10}, {114,10},
+      {98,10}, {98,10}, {98,10}, {98,10}, {82,10}, {82,10},
+      {82,10}, {82,10}, {51,10}, {51,10}, {51,10}, {51,10},
+      {35,10}, {35,10}, {35,10}, {35,10}, {20,10}, {20,10},
+      {20,10}, {20,10}, {12,11}, {12,11}, {21,11}, {21,11},
+      {369,11}, {369,11}, {385,11}, {385,11}, {4561,11}, {4561,11},
+      {4577,11}, {4577,11}, {4593,11}, {4593,11}, {4609,11}, {4609,11},
+      {22,12}, {36,12}, {67,12}, {83,12}, {99,12}, {162,12},
+      {401,12}, {417,12}, {4625,12}, {4641,12}, {4657,12}, {4673,12},
+      {4689,12}, {4705,12}, {4721,12}, {4737,12}, {7167,7},
+      {7167,7}, {7167,7}, {7167,7}, {7167,7}, {7167,7}, {7167,7},
+      {7167,7}, {7167,7}, {7167,7}, {7167,7}, {7167,7}, {7167,7},
+      {7167,7}, {7167,7}, {7167,7}, {7167,7}, {7167,7}, {7167,7},
+      {7167,7}, {7167,7}, {7167,7}, {7167,7}, {7167,7}, {7167,7},
+      {7167,7}, {7167,7}, {7167,7}, {7167,7}, {7167,7}, {7167,7},
+      {7167,7}
+   };
+
+   static const int inter_max_level[2][64] = {
+                                     {12,  6,  4,  3,  3,  3,  3,  2,
+                                       2,  2,  2,  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},
+ 
+                                      {3,  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,  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}
+                                    };
+
+   static const int inter_max_run0[13] = { 999,
+                                   26, 10,  6,  2,  1,  1,
+                                    0,  0,  0,  0,  0,  0
+                                };
+  
+   static const int inter_max_run1[4] = { 999, 40,  1,  0 };
+
+   int
+      numBitsGot, /* number of bits got from bit buffer */
+      retValue = VDX_OK,
+      code,       /* bits got from bit buffer */
+      index,      /* index to zigzag table running from 1 to 63 */
+      run,        /* RUN code */
+      level;      /* LEVEL code */
+
+   int16
+      bibError = 0;
+
+   u_int32 
+      last,       /* LAST code (see standard) */
+      sign,       /* sign for level */
+      tmp;        /* temporary variable for reading some redundant bits */
+
+   vdxVLCTable_t const *tab; /* pointer to lookup table */
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(startIndex == 0 || startIndex == 1);
+   vdxAssert(block != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   /* Reset all coefficients to zero in order to avoid writing
+      zeros one by one during run-length decoding */
+   memset(&block[startIndex], 0, (64 - startIndex) * sizeof(int));
+
+   index = startIndex;
+
+   /* MVE */
+   *fEscapeCodeUsed = 0;
+
+   do {
+      /* Read next codeword */
+      code = (int) bibShowBits(12, inBuffer, &numBitsGot, bitErrorIndication,
+         &bibError);
+
+
+      /* Select the right table and index for the codeword */
+      if (code >= 512)
+         tab = &tcoefTab0[(code >> 5) - 16];
+      else if (code >= 128)
+         tab = &tcoefTab1[(code >> 2) - 32];
+      else if (code >= 8)
+         tab = &tcoefTab2[code - 8];
+      else {
+         deb("ERROR - illegal TCOEF\n");
+         retValue = VDX_OK_BUT_BIT_ERROR;
+         goto exitFunction;
+      }
+
+      /* Flush the codeword from the buffer */
+      bibFlushBits(tab->len, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+      if (tab->val == 7167)     /* ESCAPE */
+      {
+
+          
+        /* the following is modified for 3-mode escape */
+        if(fMPEG4EscapeCodes) {
+
+          int run_offset=0,
+              level_offset=0;
+
+          code = (int) bibShowBits(2, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+          if (code<=2) {
+
+              /* escape modes: level or run is offset */
+              if (code==2) run_offset=1;
+              else level_offset=1;
+
+              /* Flush the escape code from the buffer */
+              if (run_offset)
+                  bibFlushBits(2, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+              else
+                  bibFlushBits(1, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+              /* Read next codeword */
+              code = (int) bibShowBits(12, inBuffer, &numBitsGot, bitErrorIndication,
+                  &bibError);
+
+
+
+              /* Select the right table and index for the codeword */
+              if (code >= 512)
+                  tab = &tcoefTab0[(code >> 5) - 16];
+              else if (code >= 128)
+                  tab = &tcoefTab1[(code >> 2) - 32];
+              else if (code >= 8)
+                  tab = &tcoefTab2[code - 8];
+              else {
+                  deb("ERROR - illegal TCOEF\n");
+                  retValue = VDX_OK_BUT_BIT_ERROR;
+                  goto exitFunction;
+              }
+
+              bibFlushBits(tab->len, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+              run = (tab->val >> 4) & 255;
+              level = tab->val & 15;
+              last = (tab->val >> 12) & 1;
+
+              /* need to add back the max level */
+              if (level_offset)
+                  level = level + inter_max_level[last][run];
+              else if (last)
+                  run = run + inter_max_run1[level]+1;
+              else
+                  run = run + inter_max_run0[level]+1;
+
+              sign = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,
+                  &bibError);
+
+
+              
+              if (sign)
+                  level = -level;
+
+          } else {
+              
+              /* Flush the codeword from the buffer */
+              bibFlushBits(2, inBuffer, &numBitsGot, bitErrorIndication, &bibError);
+
+
+              /* LAST */
+              last = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, 
+                  &bibError);
+
+
+
+              /* RUN */
+              run = (int) bibGetBits(6, inBuffer, &numBitsGot, bitErrorIndication, 
+                  &bibError);
+
+
+              /* MARKER BIT */
+              tmp = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,&bibError);
+
+
+              if(!tmp) {
+                  retValue = VDX_OK_BUT_BIT_ERROR;
+                  goto exitFunction;
+              }
+              /* LEVEL */
+              level = (int) bibGetBits(12, inBuffer, &numBitsGot, bitErrorIndication, 
+                  &bibError);
+
+
+              /* MARKER BIT */
+              tmp = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,&bibError);
+
+
+              if ( !tmp ) {
+                  retValue = VDX_OK_BUT_BIT_ERROR;
+                  goto exitFunction;
+              }
+
+              /* 0000 0000 0000 and 1000 0000 0000 is forbidden unless in MQ mode */
+              if (level == 0 || level == 2048) {
+                  deb("ERROR - illegal level.\n");
+                  retValue = VDX_OK_BUT_BIT_ERROR;
+                  goto exitFunction;
+              }
+
+              /* Codes 1000 0000 0001 .. 1111 1111 1111 */
+              if (level > 2048)
+                  level -= 4096;
+              
+          } /* flc */
+
+        } else { /* !fMPEG4EscapeCodes */
+
+            /* MVE */
+            *fEscapeCodeUsed = 1;
+            
+            /* LAST */
+            last = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication, 
+                &bibError);
+
+
+            /* RUN */
+            run = (int) bibGetBits(6, inBuffer, &numBitsGot, bitErrorIndication, 
+                &bibError);
+
+
+            /* LEVEL */
+            level = (int) bibGetBits(8, inBuffer, &numBitsGot, bitErrorIndication, 
+                &bibError);
+            
+
+            /* Codes 1000 0001 .. 1111 1111 */
+            if (level > 128)
+                level -= 256;
+
+
+            /* 0000 0000 is forbidden, 1000 0000 is forbidden unless in MQ mode */
+            if (level == 0) {
+                deb("ERROR - illegal level.\n");
+                retValue = VDX_OK_BUT_BIT_ERROR;
+                goto exitFunction;
+            }
+            if (level == 128)
+            {
+               if (fMQ)
+               {
+                  level = (int) bibGetBits(11,inBuffer,&numBitsGot,
+                     bitErrorIndication,&bibError);
+
+
+                  level = ((level&0x003F) <<5) | (level >> 6);
+                  if (level>1023) level -= 2048;
+
+                  /* See section T.5 of the H.263 recommendation to understand
+                     this restriction. */
+                    if (((level > -127) && (level < 127)) || (qp >= 8))
+                    {
+                        deb("ERROR - illegal extended level.\n");
+                        retValue = VDX_OK_BUT_BIT_ERROR;
+                        goto exitFunction;
+                    }
+                }
+                else
+                {
+                    deb("ERROR - illegal level.\n");
+                    retValue = VDX_OK_BUT_BIT_ERROR;
+                    goto exitFunction;
+                }
+            }
+        } /* End fMPEG4EscapeCodes switch */        
+      }
+
+      else {
+         run = (tab->val >> 4) & 255;
+         level = tab->val & 15;
+         last = (tab->val >> 12) & 1;
+
+         sign = bibGetBits(1, inBuffer, &numBitsGot, bitErrorIndication,
+            &bibError);
+
+
+         if (sign)
+            level = -level;
+      }
+
+      /* If too many coefficients */
+      if (index + run > 63) {
+         deb("ERROR - too many TCOEFs.\n");
+         retValue = VDX_OK_BUT_BIT_ERROR;
+         goto exitFunction;
+      }
+
+      /* Do run-length decoding */
+
+      /* Note: No need to set coeffs to zero since they are already reset
+         in the beginning of the function */
+      index += run;
+
+         block[index++] = level;
+
+   } while (!last);
+
+   exitFunction:
+
+   /* Note: No need to set the rest of the coefficients to zero since
+      they are already reset in the beginning of the function */
+
+   if (!bibError)
+      return retValue;
+
+   else if (bibError == ERR_BIB_NOT_ENOUGH_DATA) {
+      return VDX_OK_BUT_BIT_ERROR;
+   }
+   else if ( *bitErrorIndication ) {
+      return VDX_OK_BUT_BIT_ERROR;
+   }
+   else
+      return VDX_ERR_BIB;
+}
+
+
+
+/*
+ * Picture Layer Local Functions
+ */
+
+/*
+ * vdxActAfterIncorrectSEI
+ *
+ * Parameters:
+ *    inBuffer                   B: Bit Buffer instance
+ *    fPLUSPTYPE                 I: signals the existence of PLUSPTYPE
+ *    fLast                      B: set to 1 if SEI flushed, 
+ *                                  otherwise not changed
+ *    bitErrorIndication         B: bit error indication, see biterr.h for
+ *                                  the possible values
+ *
+ * Function:
+ *    Problem: H.263 v1 did not specify FTYPE/DSIZE values, but rather
+ *    any data can be transfered in PSUPP. Section 5.1.3 of 
+ *    H.263 Recommendation specifies that Annex L and Annex W supplemental
+ *    enhancement functions can be used also if PLUSPTYPE is not in use.
+ *    Consequently, if PLUSPTYPE is not in use and if the bit-stream
+ *    violates FTYPE/DSIZE (or any other) rules defined in Annex L or 
+ *    Annex W, we do not know if the far-end encoder is transmitting
+ *    proprietary PSUPP values (allowed in H.263 v1) or if a bit error 
+ *    has hit the SEI data that actually follows Annex L/W. 
+ *
+ *    This function is called after an illegal Annex L/W parameter has
+ *    been detected. The function acts as follows:
+ *    - If PLUSPTYPE is in use, there must be
+ *      a bit error, and the function signals the error.
+ *    - If PLUSPTYPE is not in use, there is
+ *      a bit error or the far-end encoder uses proprietary PSUPP values.
+ *      The function flushes all PSUPP fields and returns without error
+ *      indication.
+ *      NOTE: This scheme could be improved if the decoder knows that
+ *      the far-end encoder is always following Annex L/W.
+ *
+ * Returns:
+ *    VDX_OK
+ *    VDX_OK_BUT_BIT_ERROR
+ *    VDX_ERR
+ */
+
+static int vdxActAfterIncorrectSEI(
+   bibBuffer_t *inBuffer,
+   int fPLUSPTYPE,
+   int *fLast,
+   int *bitErrorIndication)
+{
+   /* If Annex L/W is in use for sure */
+   if (fPLUSPTYPE) {
+
+      /* Return indication of bit error */
+      return VDX_OK_BUT_BIT_ERROR;
+   }
+
+   /* Else Annex L/W is not necessarily on */
+   else {
+      
+      /* We are out of sync due to bit error or 
+         do not understand the non-standard PEI/PSUPP syntax
+         --> flush the rest of PEI/PSUPP pairs */
+
+      *fLast = 1;
+
+      return vdxFlushSEI(inBuffer, bitErrorIndication);
+   }
+}
+
+
+/*
+ * vdxStandardSourceFormatToFrameSize
+ *    
+ *
+ * Parameters:
+ *    sourceFormat               the three source format bits
+ *    width                      luminance image width
+ *    height                     luminance image height
+ *
+ * Function:
+ *    This function converts the source format bits to luminance image size.
+ *
+ * Returns:
+ *    Nothing.
+ *
+ *    
+ *
+ */
+
+static void vdxStandardSourceFormatToFrameSize(int sourceFormat, int *width, int *height)
+{
+   vdxAssert(sourceFormat >= 1 && sourceFormat <= 5);
+
+   switch (sourceFormat) {
+      case 1:  /* sub-QCIF */
+         *width = 128;
+         *height = 96;
+         break;
+      case 2:  /* QCIF */
+         *width = 176;
+         *height = 144;
+         break;
+      case 3:  /* CIF */
+         *width = 352;
+         *height = 288;
+         break;
+      case 4:  /* 4CIF */
+         *width = 704;
+         *height = 576;
+         break;
+      case 5:  /* 16 CIF */
+         *width = 1408;
+         *height = 1152;
+         break;
+   }
+}
+
+
+/*
+ * Slice Layer Local Functions
+ */
+
+/*
+ * vdxFrameSizeToPictureFormat
+ *    
+ *
+ * Parameters:
+ *    width                      luminance image width
+ *    height                     luminance image height
+ *
+ * Function:
+ *    This function converts luminance image size to picture format.
+ *
+ * Returns:
+ *    Source format
+ *
+ *
+ */
+
+int vdxFrameSizeToPictureFormat(int width, int /*height*/)
+{
+   if (width <= 128) 
+      return 0;   /* sub-QCIF */
+   else if (width <= 176)
+      return 1;   /* QCIF */
+   else if (width <= 352)
+      return 2;   /* CIF */
+   else if (width <= 704)
+      return 3;   /* 4CIF */
+   else if (width <= 1408)
+      return 4;   /* 16CIF */
+   else if (width <= 2048)
+      return 5;   /* 2048x1152 */
+   else
+      return -1;  /* Should never happen */
+}
+
+/*
+ * Macroblock Layer Local Functions
+ */
+
+/*
+ * vdxGetCBPY
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    index                      index to the CBPY table of H.263
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function reads the CBPY code.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+int vdxGetCBPY(bibBuffer_t *inBuffer, int *index, 
+   int *bitErrorIndication)
+{
+   static const vdxVLCTable_t tabCBPY[48] = {
+      {-1,0}, {-1,0}, {6,6}, {9,6}, {8,5}, {8,5}, {4,5}, {4,5},
+      {2,5}, {2,5}, {1,5}, {1,5}, {0,4}, {0,4}, {0,4}, {0,4},
+      {12,4}, {12,4}, {12,4}, {12,4}, {10,4},{10,4},{10,4},{10,4},
+      {14,4}, {14,4}, {14,4}, {14,4}, {5,4}, {5,4}, {5,4}, {5,4},
+      {13,4}, {13,4}, {13,4}, {13,4}, {3,4}, {3,4}, {3,4}, {3,4},
+      {11,4}, {11,4}, {11,4}, {11,4}, {7,4}, {7,4}, {7,4}, {7,4}
+   };
+
+   int bitsGot, code;
+   int16 ownError = 0;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(index != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   code = (int) bibShowBits(6, inBuffer, &bitsGot, bitErrorIndication, 
+      &ownError);
+
+
+   if (code >= 48) {
+      /* bit pattern = 11xxxx */
+      bibFlushBits(2, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+      *index = 15;
+      return VDX_OK;
+   }
+
+   if (code < 2) {
+      deb("vlcGetCBPY: ERROR - illegal code.\n");
+      return VDX_OK_BUT_BIT_ERROR;
+   }
+
+   bibFlushBits(tabCBPY[code].len, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+
+   *index = tabCBPY[code].val;
+
+   if (ownError)
+      return VDX_ERR_BIB;
+
+   return VDX_OK;
+}
+
+
+/*
+ * vdxGetMCBPCInter
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    fPLUSPTYPE                 flag to indicate if PLUSPTYPE is present
+ *    fFourMVsPossible           flag to indicate if four motion vectors per
+ *                               macroblock is allowed
+ *    fFirstMBOfPicture          flag to indicate if the current macroblock
+ *                               is the first one of the picture in scan-order
+ *    index                      index to the MCBPC table for P-pictures
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function reads the MCBPC code for P-pictures.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ *    
+ */
+
+int vdxGetMCBPCInter(
+   bibBuffer_t *inBuffer, 
+   int fPLUSPTYPE,
+   int fFourMVsPossible,
+   int fFirstMBOfPicture,
+   int *index, 
+   int *bitErrorIndication)
+{
+   static const vdxVLCTable_t tabMCBPCInter[256] = {
+      {-1,0}, /* 0 = illegal */
+      {20,9}, /* 1 = 0000 0000 1 = stuffing */
+      {19,9}, /* 2 = 0000 0001 0 */
+      {18,9}, /* 3 = 0000 0001 1 */
+      {17,9}, /* 4 = 0000 0010 0 */
+      {7,9},  /* 5 = 0000 0010 1 */
+      {14,8}, {14,8}, /* 6..7 = 0000 0011 x */
+      {13,8}, {13,8}, /* 8..9 = 0000 0100 x */
+      {11,8}, {11,8}, /* 10..11 = 0000 0101 x */
+      {15,7}, {15,7}, {15,7}, {15,7}, /* 12..15 = 0000 011x x */
+      {10,7}, {10,7}, {10,7}, {10,7}, /* 16..19 = 0000 100x x */
+      { 9,7}, { 9,7}, { 9,7}, { 9,7}, /* 20..23 = 0000 101x x */
+      { 6,7}, { 6,7}, { 6,7}, { 6,7}, /* 24..27 = 0000 110x x */
+      { 5,7}, { 5,7}, { 5,7}, { 5,7}, /* 28..31 = 0000 111x x */
+      {16,6}, {16,6}, {16,6}, {16,6},
+      {16,6}, {16,6}, {16,6}, {16,6}, /* 32..39 = 0001 00xx x */
+      { 3,6}, { 3,6}, { 3,6}, { 3,6},
+      { 3,6}, { 3,6}, { 3,6}, { 3,6}, /* 40..47 = 0001 01xx x */
+      {12,5}, {12,5}, {12,5}, {12,5}, {12,5}, {12,5},
+      {12,5}, {12,5}, {12,5}, {12,5}, {12,5}, {12,5},
+      {12,5}, {12,5}, {12,5}, {12,5}, /* 48..63 = 0001 1xxx x */
+      { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4},
+      { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4},
+      { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4},
+      { 2,4}, { 2,4}, { 2,4}, { 2,4}, { 2,4}, /* 64..95 = 0010 xxxx x */
+      { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4},
+      { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4},
+      { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4},
+      { 1,4}, { 1,4}, { 1,4}, { 1,4}, { 1,4}, /* 96..127 = 0011 xxxx x */
+      {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3},
+      {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3},
+      {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3},
+      {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3},
+      {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3},
+      {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3},
+      {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3}, {8,3},
+      {8,3}, {8,3}, /* 128..191 = 010x xxxx x */
+      {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3},
+      {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3},
+      {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3},
+      {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3},
+      {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3},
+      {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3},
+      {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3}, {4,3},
+      {4,3}, {4,3}, {4,3} /* 192..255 = 011x xxxx x */
+   };
+
+   /* Indices 21 - 24 of the MCBPC table for P-pictures,
+      4 least significant bits from the maximum of 13 are used for indexing */
+   static const vdxVLCTable_t tabMCBPCInterIndices21To24[16] = {
+      {-1,0}, {-1,0}, {-1,0}, {-1,0}, 
+      {-1,0}, {-1,0}, {-1,0}, {-1,0},        /* 0000 0000 00xx x, illegal */
+      {21,11}, {21,11}, {21,11}, {21,11},    /* 0000 0000 010x x */
+      {22,13},                               /* 0000 0000 0110 0 */
+      {-1,0},                                /* 0000 0000 0110 1, illegal */
+      {23,13},                               /* 0000 0000 0111 0 */
+      {24,13}                                /* 0000 0000 0111 1 */
+   };
+
+   int bitsGot, code;
+   int16 ownError = 0;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(index != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   code = (int) bibShowBits(9, inBuffer, &bitsGot, bitErrorIndication, 
+      &ownError);
+
+
+   /* If index == 0 */
+   if (code >= 256) {
+      /* bit pattern = 1xxx xxxx x */
+      bibFlushBits(1, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+      *index = 0;
+      return VDX_OK;
+   }
+
+   /* If illegal code or indices 21 - 24 */
+   if (code == 0) {
+      /* 0000 0000 0 (indices 21 - 24 in MCBPC table for P-pictures)
+         can only be present if the conditions listed in  section 5.3.2 of 
+         the H.263 recommendation are fulfilled. Otherwise, the bit pattern
+         is considered an illegal codeword. */
+
+      /* If indices 21 - 24 */
+      if (fPLUSPTYPE && fFourMVsPossible && !fFirstMBOfPicture) {
+
+         /* Note: The following restriction is given in section 5.3.2 of 
+            the H.263 recommendation: "Also, encoders shall not allow an MCBPC
+            code for macroblock type 5 to immediately follow seven consecutive 
+            zeros in the bitstream (as can be caused by particular INTRADC codes
+            followed by COD=0), in order to prevent start code emulation."
+            This condition is not checked in the decoder, since it would require
+            relatively complex code structure and it is considered relatively
+            improbable. */
+
+         /* Read 13 bits */
+         code = (int) bibShowBits(13, inBuffer, &bitsGot, bitErrorIndication, 
+            &ownError);
+
+
+         /* Note: We already know that the first 9 bits are zero, thus code
+            cannot be larger than 15. */
+
+         *index = tabMCBPCInterIndices21To24[code].val;
+
+         /* If illegal bit pattern */
+         if (*index == -1) {
+            deb("vlcGetMCBPCInter: ERROR - illegal code.\n");
+            return VDX_OK_BUT_BIT_ERROR;
+         }
+
+         bibFlushBits(tabMCBPCInterIndices21To24[code].len, inBuffer, &bitsGot, 
+            bitErrorIndication, &ownError);
+      }
+
+      /* Else illegal code */
+      else {
+         deb("vlcGetMCBPCInter: ERROR - illegal code.\n");
+         return VDX_OK_BUT_BIT_ERROR;
+      }
+   }
+
+   /* Else indices 1 - 20 */
+   else {
+      bibFlushBits(tabMCBPCInter[code].len, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+   
+      *index = tabMCBPCInter[code].val;
+   }
+
+
+   if (ownError)
+      return VDX_ERR_BIB;
+
+   return VDX_OK;
+}
+
+
+/*
+ * vdxGetMCBPCIntra
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    index                      index to the MCBPC table for I-pictures
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function reads the MCBPC code for I-pictures.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+int vdxGetMCBPCIntra(bibBuffer_t *inBuffer, int *index, 
+   int *bitErrorIndication)
+{
+   static const vdxVLCTable_t tabMCBPCIntra[64] = {
+      {-1,0}, /* illegal */
+      {5,6},
+      {6,6},
+      {7,6},
+      {4,4}, {4,4}, {4,4}, {4,4},
+      {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
+      {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
+      {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}
+   };
+
+   int bitsGot, code;
+   int16 ownError = 0;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(index != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   code = (int) bibShowBits(9, inBuffer, &bitsGot, bitErrorIndication, 
+      &ownError);
+
+
+   if (code == 1) {
+      /* macroblock stuffing */
+      bibFlushBits(9, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+      *index = 8;
+      return VDX_OK;
+   }
+
+   code >>= 3; /* remove unnecessary bits */
+
+   if (code == 0) {
+      deb("vlcGetMCBPCIntra: ERROR - illegal code.\n");
+      return VDX_OK_BUT_BIT_ERROR;
+   }
+
+   if (code >= 32) {
+      /* bit pattern = 1xxxxx */
+      bibFlushBits(1, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+      *index = 0;
+      return VDX_OK;
+   }
+
+   bibFlushBits(tabMCBPCIntra[code].len, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+
+   *index = tabMCBPCIntra[code].val;
+
+   if (ownError)
+      return VDX_ERR_BIB;
+
+   return VDX_OK;
+}
+
+
+/*
+ * vdxGetMVD
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    mvdx10                     the leftmost vector value from the motion
+ *                               vector VLC table multiplied by 10 to avoid 
+ *                               non-integer numbers.
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function reads the MVD code.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+int vdxGetMVD(bibBuffer_t *inBuffer, int *mvdx10, 
+   int *bitErrorIndication)
+{
+   static const vdxVLCTable_t tabMVD0[14] = {
+      {15,4},  /* 0001 0 */
+      {-15,4}, /* 0001 1 */
+      {10,3}, {10,3},   /* 0010 */
+      {-10,3}, {-10,3}, /* 0011 */
+      {5,2}, {5,2}, {5,2}, {5,2},    /* 010 */
+      {-5,2}, {-5,2}, {-5,2}, {-5,2} /* 011 */
+   };
+
+   static const vdxVLCTable_t tabMVD1[96] = {
+      {60,10}, {-60,10},
+      {55,10}, {-55,10},
+      {50,9}, {50,9}, {-50,9}, {-50,9},
+      {45,9}, {45,9}, {-45,9}, {-45,9},
+      {40,9}, {40,9}, {-40,9}, {-40,9},
+      {35,7}, {35,7}, {35,7}, {35,7}, {35,7}, {35,7}, {35,7}, {35,7},
+      {-35,7}, {-35,7}, {-35,7}, {-35,7}, {-35,7}, {-35,7}, {-35,7}, {-35,7},
+      {30,7}, {30,7}, {30,7}, {30,7}, {30,7}, {30,7}, {30,7}, {30,7},
+      {-30,7}, {-30,7}, {-30,7}, {-30,7}, {-30,7}, {-30,7}, {-30,7}, {-30,7},
+      {25,7}, {25,7}, {25,7}, {25,7}, {25,7}, {25,7}, {25,7}, {25,7},
+      {-25,7}, {-25,7}, {-25,7}, {-25,7}, {-25,7}, {-25,7}, {-25,7}, {-25,7},
+      {20,6}, {20,6}, {20,6}, {20,6}, {20,6}, {20,6}, {20,6}, {20,6},
+      {20,6}, {20,6}, {20,6}, {20,6}, {20,6}, {20,6}, {20,6}, {20,6},
+      {-20,6}, {-20,6}, {-20,6}, {-20,6}, {-20,6}, {-20,6}, {-20,6}, {-20,6},
+      {-20,6}, {-20,6}, {-20,6}, {-20,6}, {-20,6}, {-20,6}, {-20,6}, {-20,6}
+   };
+
+   static const vdxVLCTable_t tabMVD2[] = {
+      {160,12}, {-160,12}, {155,12}, {-155,12},
+      {150,11}, {150,11}, {-150,11}, {-150,11},
+      {145,11}, {145,11}, {-145,11}, {-145,11},
+      {140,11}, {140,11}, {-140,11}, {-140,11},
+      {135,11}, {135,11}, {-135,11}, {-135,11},
+      {130,11}, {130,11}, {-130,11}, {-130,11},
+      {125,11}, {125,11}, {-125,11}, {-125,11},
+      {120,10}, {120,10}, {120,10}, {120,10},
+      {-120,10}, {-120,10}, {-120,10}, {-120,10},
+      {115,10}, {115,10}, {115,10}, {115,10},
+      {-115,10}, {-115,10}, {-115,10}, {-115,10},
+      {110,10}, {110,10}, {110,10}, {110,10},
+      {-110,10}, {-110,10}, {-110,10}, {-110,10},
+      {105,10}, {105,10}, {105,10}, {105,10},
+      {-105,10}, {-105,10}, {-105,10}, {-105,10},
+      {100,10}, {100,10}, {100,10}, {100,10},
+      {-100,10}, {-100,10}, {-100,10}, {-100,10},
+      {95,10}, {95,10}, {95,10}, {95,10},
+      {-95,10}, {-95,10}, {-95,10}, {-95,10},
+      {90,10}, {90,10}, {90,10}, {90,10},
+      {-90,10}, {-90,10}, {-90,10}, {-90,10},
+      {85,10}, {85,10}, {85,10}, {85,10},
+      {-85,10}, {-85,10}, {-85,10}, {-85,10},
+      {80,10}, {80,10}, {80,10}, {80,10},
+      {-80,10}, {-80,10}, {-80,10}, {-80,10},
+      {75,10}, {75,10}, {75,10}, {75,10},
+      {-75,10}, {-75,10}, {-75,10}, {-75,10},
+      {70,10}, {70,10}, {70,10}, {70,10},
+      {-70,10}, {-70,10}, {-70,10}, {-70,10},
+      {65,10}, {65,10}, {65,10}, {65,10},
+      {-65,10}, {-65,10}, {-65,10}, {-65,10}
+   };
+   int code, bitsGot;
+   int16 ownError = 0;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(mvdx10 != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   code = (int) bibGetBits(1, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+
+
+   if (code) {
+      *mvdx10 = 0;
+      return VDX_OK;
+   }
+
+   code = (int) bibShowBits(12, inBuffer, &bitsGot, bitErrorIndication, 
+      &ownError);
+
+   
+   if (code >= 512) {
+      code = (code >> 8) - 2;
+      bibFlushBits(tabMVD0[code].len, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+
+      *mvdx10 = tabMVD0[code].val;
+      return VDX_OK;
+   }
+
+   if (code >= 128) {
+      code = (code >> 2) - 32;
+      bibFlushBits(tabMVD1[code].len, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+
+
+      *mvdx10 = tabMVD1[code].val;
+      return VDX_OK;
+   }
+
+   /* If illegal code, return bit error.
+      In Table 14/H.263, the illegal codes are 0000 0000 000x x and 0000 0000 0010 0.
+      In Table B-12/MPEG-4 Visual, Section B.1.3, 0000 0000 0010 0 is legal.
+      To simplify the source code, 0000 0000 0010 0 is considered legal in  H.263 too */
+   if ((code -= 4) < 0) {
+      deb("vlcGetMVD: ERROR - illegal code.\n");
+      return VDX_OK_BUT_BIT_ERROR;
+   }
+
+   bibFlushBits(tabMVD2[code].len, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+
+
+   *mvdx10 = tabMVD2[code].val;
+   return VDX_OK;
+}
+
+
+/*
+ * vdxUMVGetMVD
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    mvdx10                     the leftmost vector value from the motion
+ *                               vector VLC table multiplied by 10 to avoid 
+ *                               non-integer numbers.
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function reads the MVD code when unrestricted motion vector mode
+ *    is in use and PLUSTYPE is present.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally,but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ */
+
+static int vdxUMVGetMVD(bibBuffer_t *inBuffer,int *mvdx10,
+   int *bitErrorIndication)
+{
+   int code,bitsGot;
+   int16 ownError = 0;
+   int sign;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(mvdx10 != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   code = (int) bibGetBits(1,inBuffer,&bitsGot,bitErrorIndication,&ownError);
+
+
+   if (code) {
+      *mvdx10 = 0;
+      return VDX_OK;
+   }
+
+   code = (int) bibGetBits(1,inBuffer,&bitsGot,bitErrorIndication,&ownError);
+
+   code += 2;
+
+   while (bibGetBits(1,inBuffer,&bitsGot,bitErrorIndication,&ownError) 
+   )
+   {
+      code <<=1;
+      code = code + bibGetBits(1,inBuffer,&bitsGot,bitErrorIndication,&ownError);
+   }
+
+   
+   sign = (code & 0x0001)?-5:5;
+   code >>=1;
+   *mvdx10 = sign*code;
+   return VDX_OK;
+}
+
+/*
+ * vdxGetNormalMODB
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    index                      index to the MODB table
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function reads the MODB code. The function should be used
+ *    in PB-frames mode (Annex G).
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ */
+
+static int vdxGetNormalMODB(bibBuffer_t *inBuffer, int *index, 
+   int *bitErrorIndication)
+{
+   int bitsGot, code;
+   int16 ownError = 0;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(index != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   code = (int) bibShowBits(2, inBuffer, &bitsGot, bitErrorIndication, 
+      &ownError);
+
+
+   if (code < 2) {
+      /* code = 0 */
+      bibFlushBits(1, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+      *index = 0;
+      return VDX_OK;
+   }
+   else {
+      /* code = 10 or 11 */
+      bibFlushBits(2, inBuffer, &bitsGot, bitErrorIndication, &ownError);
+      *index = code - 1;
+      return VDX_OK;
+   }
+}
+
+/*
+ * vdxGetImpPBMODB
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    index                      index to the MODB table
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function reads the MODB code. This function should be used
+ *    in improved PB-frames mode (Annex M).
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally,but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ */
+
+static int vdxGetImpPBMODB(bibBuffer_t *inBuffer,int *index,
+   int *bitErrorIndication)
+{
+   int bitsGot,code;
+   int16 ownError = 0;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(index != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   code = (int) bibGetBits(1,inBuffer,&bitsGot,bitErrorIndication,
+      &ownError);
+
+
+   
+   if (code == 0)
+   {
+      /* Bidirectional Prediction: code = 0 */
+      *index = 0;
+      return VDX_OK;      
+   }
+   else
+   {
+      code = (int) bibGetBits(1,inBuffer,&bitsGot,bitErrorIndication,
+         &ownError);
+
+      if (code == 0)
+      {
+         /* Bidirectional Prediction: code = 10 */
+         *index = 1;
+         return VDX_OK;
+      }
+      else
+      {
+         code = (int) bibGetBits(1,inBuffer,&bitsGot,bitErrorIndication,
+            &ownError);
+
+
+         if (code == 0)
+         {
+            /* Forward Prediction: code = 110 */
+            *index = 2;
+            return VDX_OK;
+         }
+         else
+         {
+            code = (int) bibGetBits(1,inBuffer,&bitsGot,bitErrorIndication,
+               &ownError);
+
+
+            if (code == 0)
+            {
+               /* Forward Prediction: code = 1110 */
+               *index = 3;
+               return VDX_OK;
+            }
+            else
+            {
+               code = (int) bibGetBits(1,inBuffer,&bitsGot,bitErrorIndication,
+                  &ownError);
+
+
+               /* Backward Prediction: code = 11110 or 11111 */
+               *index = 4+code;
+               return VDX_OK;
+            }
+         }
+      }
+    }
+}
+
+/*
+ * vdxUpdateQuant
+ *    
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    fMQ                        non-zero if the Modified Quantization mode
+ *                               (Annex T) is in use, otherwise zero
+ *    quant                      the quantization parameter for the previous
+ *                               macroblock
+ *    newQuant                   the updated quantization parameter for
+ *                               the current macroblock
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function reads the DQUANT field and updated the current quantization
+ *    parameter appropriately.
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally, but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ *    
+ *
+ */
+
+int vdxUpdateQuant(
+   bibBuffer_t *inBuffer, 
+   int fMQ,
+   int quant,
+   int *newQuant,
+   int *bitErrorIndication)
+{
+   int
+      numBitsGot;
+   int16
+      bibError = 0;
+   u_int32 
+      bits;
+   static const int changeOfQuant[2][32] = 
+      {{0,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-2,
+        -2,-2,-2,-2,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3},
+       {0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,2,1,-5}};
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(newQuant != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   /* DQUANT */
+   if (!fMQ) {
+      bits = bibGetBits(2, inBuffer, &numBitsGot, bitErrorIndication, 
+         &bibError);
+
+
+      switch (bits) {
+         case 0: *newQuant = quant - 1; break;
+         case 1: *newQuant = quant - 2; break;
+         case 2: *newQuant = quant + 1; break;
+         case 3: *newQuant = quant + 2; break;
+      }
+
+      /* Clip QUANT to legal range */
+      if (*newQuant < 1)
+         *newQuant = 1;
+      else if (*newQuant > 31)
+         *newQuant = 31;
+   }
+   else
+   {
+      bits = bibGetBits(1,inBuffer,&numBitsGot,bitErrorIndication,
+         &bibError);
+
+
+      if (bits)
+      {
+         bits = bibGetBits(1,inBuffer,&numBitsGot,bitErrorIndication,
+            &bibError);
+
+         *newQuant = quant + changeOfQuant[bits][quant];
+      }
+      else
+      {
+         bits = bibGetBits(5,inBuffer,&numBitsGot,bitErrorIndication,
+            &bibError);
+
+         *newQuant = bits;
+      }
+   }
+
+   return VDX_OK;
+}
+
+
+/*
+ * vdxGetIntraMode
+ *
+ * Parameters:
+ *    inBuffer                   pointer to bit buffer instance
+ *    index                      index to the INTRA_MODE parameter for I-pictures
+ *    bitErrorIndication         non-zero if a bit error has been detected
+ *                               within the bits accessed in this function,
+ *                               see biterr.h for possible values
+ *
+ * Function:
+ *    This function reads the INTRA_MODE field from the MB header..
+ *    This field exists iff annex I is in use..
+ *
+ * Returns:
+ *    VDX_OK                     the function was successful
+ *    VDX_OK_BUT_BIT_ERROR       the function behaved normally,but a bit error
+ *                               occured
+ *    VDX_ERR_BIB                an error occured when accessing bit buffer
+ *
+ */
+
+
+static int vdxGetIntraMode(bibBuffer_t *inBuffer,int *index,
+   int *bitErrorIndication)
+
+{
+   int bitsGot,code;
+   int16 ownError = 0;
+
+   vdxAssert(inBuffer != NULL);
+   vdxAssert(index != NULL);
+   vdxAssert(bitErrorIndication != NULL);
+
+   code = (int) bibShowBits(2,inBuffer,&bitsGot,bitErrorIndication,
+      &ownError);
+
+
+   if (code > 1) {
+      /* Bitpattern 1x */
+      bibFlushBits(2,inBuffer,&bitsGot,bitErrorIndication,&ownError);
+      *index = code - 1;
+      return VDX_OK;
+   }
+
+   bibFlushBits(1,inBuffer,&bitsGot,bitErrorIndication,&ownError);
+   *index = 0;
+   return VDX_OK;
+}
+
+
+/*
+ * Block Layer Local Functions
+ */
+
+
+
+
+
+int vdxChangeBlackAndWhiteHeaderIntraIMB(bibBufferEdit_t *bufEdit, 
+                                                 int mcbpcIndex,
+                                                 int StartByteIndex, 
+                                                 int StartBitIndex)
+{
+    int k, cur_index, new_index, cur_len, new_len, new_val;
+    
+    const tVLCTable sCBPCIType[9] = 
+    {
+    {1, 1}, {1, 3}, {2, 3}, {3, 3}, {1, 4},
+    {1, 6}, {2, 6}, {3, 6}, {1, 9}
+    };
+    
+     // evaluate MCBPC parameters
+    int cur_cbpc = mcbpcIndex & 3;      
+    int new_cbpc = 0;       // cpbc=0 indicates chroma is 0
+    int mbType = (mcbpcIndex <4)?3:4;
+
+    // evaluate indices in table
+    cur_index = (mbType == 3 ? 0 : 4) + cur_cbpc;   
+    new_index = (mbType == 3 ? 0 : 4) + new_cbpc;   
+    
+    // retrieve values
+    cur_len = sCBPCIType[cur_index].length;
+    new_len = sCBPCIType[new_index].length;
+    new_val = sCBPCIType[new_index].code;
+    
+    // allocate memory for storing the parameters
+    if (!bufEdit->editParams)
+    {
+                bufEdit->editParams = (bibEditParams_t *) malloc(sizeof(bibEditParams_t));
+                bufEdit->numChanges=1;
+                bufEdit->copyMode = CopyWithEdit/*CopyWithEdit*/;
+    }
+    k=bufEdit->numChanges-1;
+    bufEdit->copyMode = CopyWithEdit; 
+    // store the new parameters
+    bufEdit->editParams[k].StartByteIndex = StartByteIndex; 
+    bufEdit->editParams[k].StartBitIndex = StartBitIndex; 
+    bufEdit->editParams[k].curNumBits = cur_len; 
+    bufEdit->editParams[k].newNumBits = new_len; 
+    bufEdit->editParams[k].newValue = new_val; 
+
+    return 0;
+}
+
+int vdxChangeBlackAndWhiteHeaderInterPMB(bibBufferEdit_t *bufEdit, 
+                                                 int mcbpcIndex,
+                                                 int StartByteIndex, 
+                                                 int StartBitIndex)
+{
+    int k, cur_index, new_index, cur_len, new_len, new_val;
+        
+    const tVLCTable sCBPCPType[21] = 
+    {
+    {1, 1}, {3, 4}, {2, 4}, {5, 6},
+    {3, 3}, {7, 7}, {6, 7}, {5, 9}, 
+    {2, 3}, {5, 7}, {4, 7}, {5, 8},
+    {3, 5}, {4, 8}, {3, 8}, {3, 7},
+    {4, 6}, {4, 9}, {3, 9}, {2, 9}, 
+    {1, 9}
+    };
+    
+     // evaluate MCBPC parameters
+    int cur_cbpc = mcbpcIndex & 3;      
+    int new_cbpc = 0;       // cpbc=0 indicates chroma is 0
+    int mbType; 
+
+    mbType = mcbpcIndex / 4;
+     
+    // evaluate indices in table
+    cur_index = mbType * 4 + cur_cbpc;  
+    new_index = mbType * 4 + new_cbpc;  
+    
+    // retrieve values
+    cur_len = sCBPCPType[cur_index].length;
+    new_len = sCBPCPType[new_index].length;
+    new_val = sCBPCPType[new_index].code;
+    
+    // allocate memory for storing the parameters
+    if (!bufEdit->editParams)
+    {
+                bufEdit->editParams = (bibEditParams_t *) malloc(sizeof(bibEditParams_t));
+                bufEdit->numChanges=1;
+                bufEdit->copyMode = CopyWithEdit/*CopyWithEdit*/; 
+    }
+    k=bufEdit->numChanges-1;
+    bufEdit->copyMode = CopyWithEdit/*CopyWithEdit*/; 
+    // store the new parameters
+    bufEdit->editParams[k].StartByteIndex = StartByteIndex; 
+    bufEdit->editParams[k].StartBitIndex = StartBitIndex; 
+    bufEdit->editParams[k].curNumBits = cur_len; 
+    bufEdit->editParams[k].newNumBits = new_len; 
+    bufEdit->editParams[k].newValue = new_val; 
+
+    return mbType;
+}
+
+
+// End of File