videoeditorengine/h263decoder/src/biblin.cpp
branchRCL_3
changeset 3 e0b5df5c0969
parent 0 951a5db380a0
child 7 4c409de21d23
--- a/videoeditorengine/h263decoder/src/biblin.cpp	Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1127 +0,0 @@
-/*
-* 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:  
-* Bit buffer reading operations.
-*
-*/
-
-
-
-
-/*
-* Includes
-*/
-
-#include "h263dConfig.h"
-#include "Biblin.h"
-#include "debug.h"
-
-#ifdef DEBUG_OUTPUT
-bibBuffer_t * buffer_global;
-#endif
-
-
-/*
-* Definitions
-*/
-
-#define bibMalloc malloc
-#define bibCalloc calloc
-#define bibRealloc realloc
-#define bibDealloc free
-
-#ifndef bibAssert
-#define bibAssert(exp) assert(exp);
-#endif
-
-
-/*
-* Local function prototypes
-*/
-
-static void bibInitialize(
-                                                    bibBuffer_t *bibBuffer,
-                                                    void *srcBuffer,
-                                                    unsigned srcBufferLength,
-                                                    int16 *errorCode);
-
-
-
-
-/*
-* Imported variables
-*/
-
-
-
-/*
-* Global functions
-*/
-
-/* {{-output"bibCreate.txt"}} */
-/*
-*
-* bibCreate
-*    
-*
-* Parameters:
-*    srcBuffer                  buffer containing the data
-*    srcBufferLength            the length of the buffer
-*    errorCode                  error code
-*
-* Function:
-*    This function creates a bit buffer from a buffer given as a parameter.
-*
-* Returns:
-*    The bibCreate function returns a pointer to a bibBuffer_t
-*    structure. If the function is unsuccessful NULL is returned.
-*
-* Error codes:
-*    ERR_BIB_STRUCT_ALLOC       if the bit buffer structure could not be
-*                               allocated
-*
-*/
-
-bibBuffer_t *bibCreate(void *srcBuffer, unsigned srcBufferLength, int16 *errorCode)
-/* {{-output"bibCreate.txt"}} */
-{
-    bibBuffer_t *bibBuffer = NULL;
-    int16 tmpError = 0;
-    
-    bibBuffer = (bibBuffer_t *) bibMalloc(sizeof(bibBuffer_t));
-    if (bibBuffer == NULL) {
-        *errorCode = ERR_BIB_STRUCT_ALLOC;
-        deb("bibCreate: ERROR - bibMalloc failed.\n");
-        return NULL;
-    }
-    
-    bibInitialize(bibBuffer, srcBuffer, srcBufferLength, &tmpError);
-    if (tmpError) {
-        bibDealloc(bibBuffer);
-        return NULL;
-    }
-    
-#ifdef DEBUG_OUTPUT
-    debLoad("deb_dec.log");
-    buffer_global = bibBuffer;
-#endif
-    
-    return bibBuffer;
-}
-
-
-
-
-bibBufferEdit_t *bibBufferEditCreate(int16 *errorCode)
-/* {{-output"bibCreate.txt"}} */
-{
-    bibBufferEdit_t *bufEdit = NULL;    
-    
-    bufEdit = (bibBufferEdit_t *) bibMalloc(sizeof(bibBufferEdit_t));
-    if (bufEdit == NULL) {
-        *errorCode = ERR_BIB_STRUCT_ALLOC;
-        deb("bibBufferEditCreate: ERROR - bibMalloc failed.\n");
-        return NULL;
-    }
-     bufEdit->copyMode = CopyWhole/*CopyWhole*/;
-     bufEdit->numChanges=0;
-     bufEdit->editParams=NULL;
-     
-   return bufEdit;
-}
-
-
-
-
-/* {{-output"bibDelete.txt"}} */
-/*
-*
-* bibDelete
-*    
-*
-* Parameters:
-*    buffer                     a pointer to a bit buffer structure
-*    errorCode                  error code
-*
-* Function:
-*    The bibDelete function frees the memory allocated for the buffer.
-*
-* Returns:
-*    Nothing
-*
-* Error codes:
-*    None
-*
-*/
-
-void bibDelete(bibBuffer_t *buffer, int16 * /*errorCode*/)
-/* {{-output"bibDelete.txt"}} */
-{
-    if (buffer) {
-        // note that the BaseAddr is just a reference to memory allocated elsewhere
-        // and there is no other dynamic allocations inside buffer
-        bibDealloc((void *) buffer);
-    }
-}
-
-
-
-void bibBufEditDelete(bibBufferEdit_t *bufEdit, int16 * /*errorCode*/)
-{
-     int i;
-   if (bufEdit) {
-         for(i=0; i<bufEdit->numChanges; i++)
-             bibDealloc((void *) bufEdit->editParams);
-         bibDealloc((void *) bufEdit);
-   }
-}
-
-
-/*
-*
-* bibFlushBits
-* bibGetBits
-* bibShowBits
-*    
-*
-* Parameters:
-*    numberOfBits               the number of bits wanted (1..32)
-*    buffer                     a pointer to a bit buffer structure
-*    numberOfBitsGot            the number of bits actually got
-*    syncStartIndex             the number of the first bit belonging to 
-*                               a synchronization code (1 .. numberOfBits).
-*                               Bits are numbered starting from 1 given to
-*                               the most significant bit of the returned code.
-*                               Thus, syncStartIndex - 1 most significant bits
-*                               of the returned code are valid coding
-*                               parameters (do not belong to a sync code).
-*                               0 is returned if the returned code does not
-*                               contain any part of a synchronization code.
-*    bitErrorIndication         indication code for bit errors,
-*                               see biterr.h for the possible values
-*    errorCode                  error code
-*
-* Function:
-*    The bibFlushBits function removes the next numberOfBits bits from
-*    the buffer.
-*
-*    The bibGetBits function gets the next numberOfBits bits from the buffer.
-*    The returned bits are removed.
-*
-*    The bibShowBits function gets the next numberOfBits bits from the
-*    buffer. The returned bits are not removed from the buffer.
-*
-* Returns:
-*   bibGetBits and bibShowBits:
-*       the next numberOfBits bits / the rest of the buffer if the end of
-*       the input file has been reached
-*
-* Error codes:
-*    ERR_BIB_NOT_ENOUGH_DATA    if one tries to get more bits from the buffer
-*                               than there is left
-*
-*/
-
-void bibFlushBits(int numberOfBits, bibBuffer_t *buffer)
-{
-    bibAssert(buffer != NULL);
-    bibAssert(numberOfBits > 0 && numberOfBits <= 32);
-    
-    /* Check if enough bits are available. */
-    if (buffer->bitsLeft < (u_int32) numberOfBits) {
-        goto flush_underflow;
-    }
-    buffer->bitsLeft -= numberOfBits;
-    
-    if ( buffer->bitIndex >= numberOfBits ) {
-        /* All in the current byte, bits still left */
-        buffer->bitIndex -= numberOfBits;
-    }
-    else if ( buffer->bitIndex == (numberOfBits-1) ) {
-        /* Current byte used completely */
-        buffer->bitIndex = 7;
-        buffer->getIndex++;
-        buffer->numBytesRead++;
-    }
-    else {
-        /* Current byte plus then some */
-        numberOfBits -= buffer->bitIndex + 1; /* this many bits after current byte */
-        buffer->getIndex += ((numberOfBits>>3) + 1);
-        buffer->numBytesRead += ((numberOfBits>>3) + 1);
-        buffer->bitIndex = 7 - (numberOfBits&7); 
-    }
-    return;
-flush_underflow:
-    buffer->error = ERR_BIB_NOT_ENOUGH_DATA;
-}
-
-
-
-/*
-*
-* bibGetAlignedByte
-*    
-*
-* A fast function to get one byte from byte-boundary.
-*
-*/
-inline u_int8 bibGetAlignedByte(bibBuffer_t *buffer)   
-    {
-    return buffer->baseAddr[buffer->getIndex++];
-    }
-
-
-/*
-*
-* bibGetBits
-*    
-*
-* See bibFlushBits.
-*
-*/
-
-u_int32 bibGetBits(int numberOfBits, bibBuffer_t *buffer)   
-{
-    static const u_char
-        msbMask[8] = {1, 3, 7, 15, 31, 63, 127, 255},
-        lsbMask[9] = {255, 254, 252, 248, 240, 224, 192, 128, 0};
-    u_char
-        *startAddr;
-    int32
-        bitIndex;
-    u_int32
-        endShift;         /* the number of shifts after masking the last byte */
-    u_int32
-        numBytesFlushed;  /* the number of bytes flushed from the buffer */
-    u_int32
-        returnValue = 0;
-    
-    bibAssert(buffer != NULL);
-    bibAssert(numberOfBits > 0 && numberOfBits <= 32);
-    
-    startAddr = buffer->baseAddr + buffer->getIndex;
-    bitIndex = buffer->bitIndex;
-    
-    /* Check if enough bits are available. */
-    if (buffer->bitsLeft < (u_int32) numberOfBits) {
-        goto get_underflow;
-    }
-    
-    buffer->bitsLeft -= numberOfBits;
-    
-    if ( bitIndex >= numberOfBits ) {
-        /* All in the current byte, bits still left */
-        endShift = bitIndex - numberOfBits + 1;
-        buffer->bitIndex -= numberOfBits;
-        return ((startAddr[0] & msbMask[bitIndex] & lsbMask[endShift]) >> endShift);
-    }
-    else if ( bitIndex == (numberOfBits-1) ) {
-        /* Current byte used completely */
-        buffer->bitIndex = 7;
-        buffer->getIndex++;
-        buffer->numBytesRead++;
-        return startAddr[0] & msbMask[bitIndex];
-    }
-    else {
-        /* Current byte plus then some */
-        
-        /* Remainder of this byte */
-        returnValue = *(startAddr++) & msbMask[bitIndex];
-        numberOfBits -= bitIndex + 1;
-        numBytesFlushed = 1 + (numberOfBits >> 3);
-        
-        /* Get full bytes */
-        while ( numberOfBits >= 8 ) {
-            returnValue = (returnValue << 8) | *(startAddr++);
-            numberOfBits -= 8;
-        }
-        
-        /* Get bits from last byte */
-        endShift = 8 - numberOfBits;
-        returnValue = (returnValue << numberOfBits) | ((startAddr[0] & lsbMask[endShift]) >> endShift);
-        /* (safe, since lsbMask[8]==0) */
-        
-        /* Update position in buffer */
-        buffer->bitIndex = 7 - numberOfBits;
-        buffer->getIndex += numBytesFlushed;
-        buffer->numBytesRead += numBytesFlushed;
-    }
-    
-    return returnValue;
-get_underflow:
-    buffer->error = ERR_BIB_NOT_ENOUGH_DATA;
-    return 0;
-}
-
-
-/* {{-output"bibNumberOfFlushedBits.txt"}} */
-/*
-*
-* bibNumberOfFlushedBits
-*    
-*
-* Parameters:
-*    buffer                     a pointer to a bit buffer structure
-*
-* Function:
-*    The bibNumberOfFlushedBytes returns the number of bits which
-*    are got (bibGetBits) or flushed (bibFlushBits) from the buffer since
-*    the buffer was created
-*
-* Returns:
-*    See above.
-*
-* Error codes:
-*    None.
-*
-*/
-
-u_int32 bibNumberOfFlushedBits(bibBuffer_t *buffer)
-/* {{-output"bibNumberOfFlushedBits.txt"}} */
-{
-    bibAssert(buffer != NULL);
-    
-    return ((buffer->numBytesRead<<3) + (7-buffer->bitIndex));
-}
-
-
-/* {{-output"bibNumberOfFlushedBytes.txt"}} */
-/*
-*
-* bibNumberOfFlushedBytes
-*    
-*
-* Parameters:
-*    buffer                     a pointer to a bit buffer structure
-*
-* Function:
-*    The bibNumberOfFlushedBytes returns the number of whole bytes which
-*    are got (bibGetBits) or flushed (bibFlushBits) from the buffer since
-*    bibCreate was called.
-*
-* Returns:
-*    See above.
-*
-* Error codes:
-*    None.
-*
-*/
-
-u_int32 bibNumberOfFlushedBytes(bibBuffer_t *buffer)
-/* {{-output"bibNumberOfFlushedBytes.txt"}} */
-{
-    bibAssert(buffer != NULL);
-    
-    return buffer->numBytesRead;
-}
-
-
-/* {{-output"bibNumberOfRewBits.txt"}} */
-/*
-*
-* bibNumberOfRewBits
-*    
-*
-* Parameters:
-*    buffer                     a pointer to a bit buffer structure
-*
-* Function:
-*    The bibNumberOfRewBits returns the number of bits which can be
-*    successfully rewinded.
-*
-* Returns:
-*    See above.
-*
-* Error codes:
-*    None.
-*
-*/
-
-u_int32 bibNumberOfRewBits(bibBuffer_t *buffer)
-/* {{-output"bibNumberOfRewBits.txt"}} */
-{
-    bibAssert(buffer != NULL);
-    
-    return ((buffer->numBytesRead<<3) + (7-buffer->bitIndex));
-}
-
-
-/* {{-output"bibRewindBits.txt"}} */
-/*
-*
-* bibRewindBits
-*    
-*
-* Parameters:
-*    numberOfBits               the number of bits to rewind
-*    buffer                     a pointer to a bit buffer structure
-*    errorCode                  error code
-*
-* Function:
-*    This function rewinds the pointers to the buffer
-*    so that already flushed or got bits can be read
-*    again.
-*
-* Returns:
-*    Nothing.
-*
-* Error codes:
-*    ERR_BIB_CANNOT_REWIND      if numberOfBits is larger than which is
-*                               possible to get (see also bibNumberOfRewBits).
-*
-*    ERR_BIB_BUFLIST            if there was a fatal error when handling
-*                               buffer lists
-*
-*/
-
-void bibRewindBits(u_int32 numberOfBits, bibBuffer_t *buffer, int16 *errorCode)
-/* {{-output"bibRewindBits.txt"}} */
-{
-    bibAssert(buffer != NULL);
-    
-    /* All bits to rewind are in the latest byte */
-    if (numberOfBits <= (u_int32) (7 - buffer->bitIndex)) {
-        buffer->bitIndex += numberOfBits;
-    }
-    /* Bits to rewind are within several bytes */
-    else {
-        u_int32
-            numBitsWithoutFirstByte = numberOfBits - (7 - buffer->bitIndex),
-            numWholeBytes = (numBitsWithoutFirstByte>>3),
-            numBitsInLastByte = numBitsWithoutFirstByte - (numWholeBytes<<3);
-        
-        if (numBitsInLastByte) {
-            if (buffer->getIndex >= numWholeBytes + 1) {
-                buffer->getIndex -= numWholeBytes + 1;
-                buffer->bitIndex = numBitsInLastByte - 1;
-                buffer->numBytesRead -= numWholeBytes + 1;
-            }
-            else {
-                *errorCode = ERR_BIB_CANNOT_REWIND;
-                deb("bibRewindBits: ERROR - cannot rewind.\n");
-            }
-        }
-        else {
-            if (buffer->getIndex >= numWholeBytes) {
-                buffer->getIndex -= numWholeBytes;
-                buffer->bitIndex = 7;
-                buffer->numBytesRead -= numWholeBytes;
-            }
-            else {
-                *errorCode = ERR_BIB_CANNOT_REWIND;
-                deb("bibRewindBits: ERROR - cannot rewind.\n");
-            }
-        }
-    }
-    buffer->bitsLeft += numberOfBits;
-}
-
-
-/* {{-output"bibShowBits.txt"}} */
-/*
-*
-* bibShowBits
-*    
-*
-* See bibFlushBits.
-*
-*/
-
-u_int32 bibShowBits(int numberOfBits, bibBuffer_t *buffer)  
-/* {{-output"bibShowBits.txt"}} */
-{
-    static const u_char
-        msbMask[8] = {1, 3, 7, 15, 31, 63, 127, 255},
-        lsbMask[9] = {255, 254, 252, 248, 240, 224, 192, 128, 0};
-    u_char
-        *startAddr;
-    int32
-        bitIndex;
-    u_int32
-        endShift;         /* the number of shifts after masking the last byte */
-    u_int32
-        returnValue = 0;
-    
-    bibAssert(buffer != NULL);
-    bibAssert(numberOfBits > 0 && numberOfBits <= 32);
-    
-    startAddr = buffer->baseAddr + buffer->getIndex;
-    bitIndex = buffer->bitIndex;
-    
-    /* Check if enough bits are available. */
-    if (buffer->bitsLeft < (u_int32) numberOfBits) {
-        goto show_underflow;
-    }
-    
-    if ( bitIndex >= numberOfBits ) {
-        /* All in the current byte, bits still left */
-        endShift = bitIndex - numberOfBits + 1;
-        return ((startAddr[0] & msbMask[bitIndex] & lsbMask[endShift]) >> endShift);
-    }
-    else if ( bitIndex == (numberOfBits-1) ) {
-        /* Current byte used completely */
-        return startAddr[0] & msbMask[bitIndex];
-    }
-    else {
-        /* Current byte plus then some */
-        
-        /* Remainder of this byte */
-        returnValue = *(startAddr++) & msbMask[bitIndex];
-        numberOfBits -= bitIndex + 1;
-        
-        /* Get full bytes */
-        while ( numberOfBits >= 8 )
-        {
-            returnValue = (returnValue << 8) | *(startAddr++);
-            numberOfBits -= 8;
-        }
-        
-        /* Get bits from last byte */
-        endShift = 8 - numberOfBits;
-        returnValue = (returnValue << numberOfBits) | ((startAddr[0] & lsbMask[endShift]) >> endShift);
-        /* (safe, since lsbMask[8]==0) */
-    }
-    
-    return returnValue;
-show_underflow:
-    buffer->error = ERR_BIB_NOT_ENOUGH_DATA;
-    return 0;
-}
-
-
-/*
-* Local functions
-*/
-
-/*
-*
-* bibInitialize
-*    
-*
-* Parameters:
-*    bibBuffer                  input bit buffer instance
-*    srcBuffer                  buffer containing the data
-*    srcBufferLength            the length of the buffer
-*    errorCode                  error code
-*
-* Function:
-*    This function initializes the values of the bibBuffer structure.
-*
-* Returns:
-*    Nothing.
-*
-* Error codes:
-*    ERR_BIB_BUFLIST            if the internal buffer list has been corrupted
-*
-*/
-
-static void bibInitialize(
-                            bibBuffer_t *bibBuffer,
-                            void *srcBuffer,
-                            unsigned srcBufferLength,
-                            int16 */*errorCode*/)
-{
-    bibBuffer->baseAddr = (u_char *) srcBuffer;
-    bibBuffer->size = srcBufferLength;
-    bibBuffer->getIndex = 0;
-    bibBuffer->bitIndex = 7;
-    bibBuffer->bitsLeft = (u_int32) (srcBufferLength<<3);
-    bibBuffer->numBytesRead = 0;
-    bibBuffer->error = 0;
-    
-    
-}
-
-
-
-/*
-*
-* CopyStream
-*    
-*
-* Function to copy stream from SrcBuffer to DestBuffer based on settings in bufEdit and ByteStart & BitStart
-*    
-*    
-*/
-
-void CopyStream(bibBuffer_t *SrcBuffer,bibBuffer_t *DestBuffer,bibBufferEdit_t *bufEdit, 
-                                int ByteStart, int BitStart)
-{
-    int32 temp;
-    unsigned tgetIndex;  
-    int tbitIndex;
-    u_int32 tbitsLeft;
-    u_int32 tnumBytesRead;
-    int tByteStart; 
-    int tBitStart;  
-    
-    bibEditParams_t *edParam;
-    
-    //Add assertions and checks here !!
-    bibAssert(SrcBuffer->baseAddr);
-    bibAssert(DestBuffer->baseAddr);
-    bibAssert(bufEdit);
-    
-    //Save the params of SrcBuffer to recover them later:
-    tgetIndex=SrcBuffer->getIndex;
-    tbitIndex=SrcBuffer->bitIndex;
-    tbitsLeft=SrcBuffer->bitsLeft;
-    tnumBytesRead=SrcBuffer->numBytesRead;
-    
-    
-    
-    // check to see if we need to change some header parameter
-    if(bufEdit->copyMode == CopyWithEdit/*CopyWithEdit*/)
-    {
-        bibAssert(bufEdit->editParams);
-        edParam = &(bufEdit->editParams[0]); 
-        
-        // check if the editing position is in the current range of bit data
-        temp=((SrcBuffer->getIndex<<3) + (7-SrcBuffer->bitIndex))-
-            ((edParam->StartByteIndex<<3) + 7-(edParam->StartBitIndex));
-        if (temp>=0)    // yes, it is
-        {
-            // copy upto the editing point
-            CopyBuffer(SrcBuffer, DestBuffer, ByteStart, BitStart, edParam->StartByteIndex, 
-                edParam->StartBitIndex);
-            
-            CopyBufferEdit(SrcBuffer, DestBuffer, &(bufEdit->editParams[0]));
-            
-            // store new starting copy position 
-            tByteStart = SrcBuffer->getIndex; 
-            tBitStart  = SrcBuffer->bitIndex; 
-            // restore original stop copy position 
-            SrcBuffer->getIndex=tgetIndex;
-            SrcBuffer->bitIndex=tbitIndex;
-            SrcBuffer->bitsLeft=tbitsLeft;
-            SrcBuffer->numBytesRead=tnumBytesRead;
-            
-            CopyBuffer(SrcBuffer, DestBuffer, tByteStart, tBitStart, tgetIndex, tbitIndex);
-
-        }
-        else                    // no
-        {
-            // put panic here !
-            return;
-        }
-    }
-    else if (bufEdit->copyMode == CopyWhole/*CopyWhole*/)
-    {
-        CopyBuffer(SrcBuffer, DestBuffer, ByteStart, BitStart, 
-            SrcBuffer->getIndex, SrcBuffer->bitIndex);
-    }
-    else if (bufEdit->copyMode == EditOnly /*EditOnly*/)
-    {
-        CopyBufferEdit(SrcBuffer, DestBuffer, &(bufEdit->editParams[0]));
-    }
-    else if(bufEdit->copyMode == CopyNone/*CopyNone*/)
-    {
-        return; 
-    }
-
-    
-  //4- Retrieve the original Srcbuffer params.
-    // Using getbits it should be equal to where we started
-    SrcBuffer->getIndex=tgetIndex;
-    SrcBuffer->bitIndex=tbitIndex;
-    SrcBuffer->bitsLeft=tbitsLeft;
-    SrcBuffer->numBytesRead=tnumBytesRead;
-    
-    //5- Update the destbuffer statistics:
-    DestBuffer->getIndex=DestBuffer->numBytesRead;
-
-    DestBuffer->bitsLeft -= (DestBuffer->getIndex<<3);
-
-}
-
-/*
-*
-* CopyBuffer
-*    
-*
-* Function to copy data from SrcBuffer to DestBuffer from ByteStart & BitStart to ByteEnd & BitEnd
-*    
-*    
-*/
-
-void CopyBuffer(bibBuffer_t *SrcBuffer,bibBuffer_t *DestBuffer,
-                                int ByteStart,int BitStart, int ByteEnd, int BitEnd)
-{
-    u_char *DestStartAddr;
-    u_int32 i;
-    u_int32 temp;
-    u_int32 BitsToRewind;
-    u_int32 BitsToCopy;
-    u_int32 BytesToCopy;
-    u_int32 Bytes4ToCopy;
-    u_int32 BitsRemaining;
-    int16 errorCode;
-    u_int32 bitshift;
-    u_int32 bitstoget;
-    static const u_char msbMask[8] = {1, 3, 7, 15, 31, 63, 127, 255};
-    
-    DestStartAddr = DestBuffer->baseAddr + DestBuffer->getIndex;
-    
-    //Rewind the src buffer to the start address(ByteStart,BitStart)
-    BitsToRewind=((SrcBuffer->getIndex<<3) + (7-SrcBuffer->bitIndex))-
-        ((ByteStart<<3) + (7-BitStart));
-    bibRewindBits(BitsToRewind,SrcBuffer, &errorCode);
-    
-    // evaluate the number of bits to copy
-    BitsToCopy = ((ByteEnd<<3) + (7-BitEnd))-((ByteStart<<3) + (7-BitStart));
-    if (BitsToCopy<=0)
-        return; 
-    else if (BitsToCopy > BitsToRewind) 
-        BitsToCopy = BitsToRewind;      // or else provide a panic here !!!
-    
-    //1- Fill the remaining of the byte in destination:
-    bitshift=0;
-    bitstoget=0;
-    if(DestBuffer->bitIndex!=7)
-        {
-        bitshift = DestBuffer->bitIndex+1;
-        bitstoget = ((BitsToCopy < bitshift) ? BitsToCopy : bitshift); 
-        temp = bibGetBits(bitstoget,SrcBuffer);
-        
-        // update statistics to take care of bit addition or byte completion 
-        if (BitsToCopy < bitshift)
-        {
-            // bits added but byte not completed
-            *(DestStartAddr)=(unsigned char)((((*DestStartAddr)>>bitshift)<<bitshift) |
-                ((temp << (bitshift-BitsToCopy)  ) & msbMask[bitshift-1]));
-            DestBuffer->bitIndex -= BitsToCopy;
-            bibAssert(DestBuffer->bitIndex >= 0)
-        }
-        else
-        {
-            // byte completed
-            *(DestStartAddr)=(unsigned char)((((*DestStartAddr)>>bitshift)<<(bitshift)) | 
-                (temp & msbMask[bitshift-1]));
-            DestStartAddr+=1; 
-            DestBuffer->numBytesRead++;
-            DestBuffer->bitIndex=7;
-        }
-    }
-    
-    //2- Extract all bytes (in 8 bits) from src to destination.
-    //Checks for BytesToCopy. 
-    BytesToCopy=(BitsToCopy-bitstoget)>>3;
-    if ( BytesToCopy > 0 )
-    {
-
-        if ( SrcBuffer->bitIndex == 7 )
-        {
-            // we can copy the data from src in full bytes, utilize faster inline method 
-            // and try to utilize pipelining in the for-loop
-            // truncate it to 4-byte-boundary
-            Bytes4ToCopy = BytesToCopy>>2;
-            for(i=0; i<Bytes4ToCopy; i++)
-            {
-                *(DestStartAddr++) = bibGetAlignedByte(SrcBuffer);
-                *(DestStartAddr++) = bibGetAlignedByte(SrcBuffer);
-                *(DestStartAddr++) = bibGetAlignedByte(SrcBuffer);
-                *(DestStartAddr++) = bibGetAlignedByte(SrcBuffer);
-            }
-            i <<= 2;
-            if ( BytesToCopy > i )
-            {
-                // copy the leftovers
-                for(;i<BytesToCopy;i++)
-                {
-                    *(DestStartAddr++) = bibGetAlignedByte(SrcBuffer);
-                }
-            }
-            SrcBuffer->numBytesRead+=i;
-        }
-        else
-        {
-            for(i=0;i<BytesToCopy;i++)
-            {
-                *(DestStartAddr++) = (unsigned char)bibGetBits(8,SrcBuffer);
-            }
-            
-        }
-    }
-    DestBuffer->numBytesRead+=BytesToCopy;
-    
-    //3- Fill the last byte:
-    BitsRemaining=((BitsToCopy-bitstoget))%8;
-    if(BitsRemaining!=0)
-    {
-        temp = bibGetBits(BitsRemaining,SrcBuffer);
-        *(DestStartAddr++)=(u_char)(temp<<(8-BitsRemaining)); 
-        DestBuffer->bitIndex=7-BitsRemaining;
-    }
-    
-    //5- Update the destbuffer statistics:
-    DestBuffer->getIndex=DestBuffer->numBytesRead;
-}
-
-/*
-*
-* CopyBufferEdit
-*    
-*
-* Function to copy data with editing from SrcBuffer to DestBuffer with settings in edParam
-*    
-*    
-*/
-
-void CopyBufferEdit(bibBuffer_t *SrcBuffer, bibBuffer_t *DestBuffer, 
-                                        bibEditParams_t *edParam, int updateSrcBufferStats)
-{
-    u_char *DestStartAddr;
-    u_int32 i;
-    u_int32 temp;
-    u_int32 BitsToSkip;
-    u_int32 BitsToEdit;
-    u_int32 BytesToSkip;
-    u_int32 BitsRemaining;
-    u_int32 BytesToEdit;
-    unsigned bitshift;
-    unsigned bitstoget;
-    unsigned bitstomove;
-    u_int32 StartBitPosition; 
-    static const u_char msbMask[8] = {1, 3, 7, 15, 31, 63, 127, 255};
-    
-    DestStartAddr = DestBuffer->baseAddr + DestBuffer->getIndex;
-    
-    // evaluate the number of bits to copy
-    BitsToEdit = edParam->newNumBits; 
-    StartBitPosition = edParam->newNumBits-1;
-    
-    //1- Fill the remaining of the byte in destination:
-    bitshift=0;
-    bitstoget=0;
-    if(DestBuffer->bitIndex!=7)
-    {
-        bitshift=DestBuffer->bitIndex+1;
-        bitstoget = ((BitsToEdit < bitshift) ? BitsToEdit : bitshift); 
-        
-        temp = bibGetBitsFromWord(edParam->newValue, bitstoget, &StartBitPosition, 
-            edParam->newNumBits); 
-        
-        // update statistics to take care of bit addition or byte completion 
-        if (BitsToEdit < bitshift)
-        {
-            // bits added but byte not completed
-            *(DestStartAddr)=(unsigned char)((((*DestStartAddr)>>bitshift)<<(bitshift)) |
-                ((temp << (bitshift-BitsToEdit)  ) & msbMask[bitshift-1]));
-            DestBuffer->bitIndex -= BitsToEdit;
-            bibAssert(DestBuffer->bitIndex >= 0)
-        }
-        else
-        {
-            // byte completed
-            *(DestStartAddr)=(unsigned char)((((*DestStartAddr)>>bitshift)<<(bitshift)) | 
-                (temp & msbMask[bitshift-1]));
-            DestStartAddr++; 
-            DestBuffer->numBytesRead++;
-            DestBuffer->bitIndex=7;
-        }
-    }
-    
-    
-    //2- Extract all bytes (in 8 bits) from src to destination.
-    //Checks for BytesToCopy
-    BytesToEdit=(BitsToEdit-bitstoget)>>3;
-    for(i=0;i<BytesToEdit;i++)
-    {
-        *(DestStartAddr++)=(unsigned char)bibGetBitsFromWord(edParam->newValue, 8, &StartBitPosition, edParam->newNumBits);
-    }
-    DestBuffer->numBytesRead+=BytesToEdit;
-    
-    //3- Fill the last byte:
-    BitsRemaining=((BitsToEdit-bitstoget))%8;
-    if(BitsRemaining!=0)
-    {
-        temp = bibGetBitsFromWord(edParam->newValue, BitsRemaining, &StartBitPosition, 
-            edParam->newNumBits); 
-        *(DestStartAddr++)=(u_char)(temp<<(8-BitsRemaining)); 
-        DestBuffer->bitIndex=7-BitsRemaining;
-    }
-    
-    //5- Update the destbuffer statistics:
-    DestBuffer->getIndex=DestBuffer->numBytesRead;
-    
-    
-    // update the src buffer statistics to reflect skipping of the value 
-    if(updateSrcBufferStats)
-    {
-        BitsToSkip = edParam->curNumBits; 
-        bitshift=0;
-        bitstomove=0;
-        if (SrcBuffer->bitIndex!=7)
-        {
-            bitshift=SrcBuffer->bitIndex+1;
-            bitstomove = ((BitsToSkip < bitshift) ? BitsToSkip : bitshift); 
-            // update statistics to take care of bit addition or byte completion 
-            if (BitsToSkip < bitshift)
-            {
-                // bits skipped but byte not completed
-                SrcBuffer->bitIndex -= bitstomove;
-                bibAssert(SrcBuffer->bitIndex >= 0)
-            }
-            else
-            {
-                // byte completed
-                SrcBuffer->numBytesRead++;
-                SrcBuffer->bitIndex=7;
-            }
-        }
-        // full bytes to skip
-        BytesToSkip=(BitsToSkip-bitstomove)>>3;
-        SrcBuffer->numBytesRead+=BytesToSkip;
-        
-        // skip the remaining bits
-        BitsRemaining=((BitsToSkip-bitstomove))%8;
-        if(BitsRemaining!=0)
-        {
-            SrcBuffer->bitIndex=7-BitsRemaining;
-        }
-        SrcBuffer->bitsLeft -= BitsToSkip;
-        SrcBuffer->getIndex=SrcBuffer->numBytesRead;
-    }
-}
-
-void ResetH263IntraDcUV(bibBuffer_t *DestBuffer, int uValue, int vValue)
-{
-    bibEditParams_t edParam;
-
-    edParam.curNumBits = edParam.newNumBits = 8;
-    edParam.StartByteIndex = edParam.StartBitIndex = 0; // used for source buffer only 
-
-  // u
-    edParam.newValue = uValue; 
-    CopyBufferEdit((bibBuffer_t*)NULL, DestBuffer, &edParam, 0); 
-    // v
-    edParam.newValue = vValue; 
-    CopyBufferEdit((bibBuffer_t*)NULL, DestBuffer, &edParam, 0); 
-}
-
-void ResetMPEG4IntraDcUV(bibBuffer_t *DestBuffer, int IntraDC_size)
-{
-    int i;
-    bibEditParams_t edParam;
-    const int DctDcSizeChrominanceNumBits[13] = { 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; 
-
-    // u,v
-    for(i=0; i<2; i++)
-    {
-        // change dct dc size chrominance - IntraDC for U.V is 0 (codeword '11')
-        edParam.curNumBits = DctDcSizeChrominanceNumBits[IntraDC_size]; 
-        edParam.newNumBits = 2;  
-        edParam.StartByteIndex = edParam.StartBitIndex = 0; // used or source buffer only 
-        edParam.newValue = 3; 
-        CopyBufferEdit((bibBuffer_t*)NULL, DestBuffer, &edParam, 0);    
-    }
-}
-
-// assume SrcValue is max 32 bits 
-u_int32 bibGetBitsFromWord(u_int32 SrcValue, u_int32 getBits, u_int32 *StartBit, 
-                                                     u_int32 MaxNumBits)
-{
-    int val;
-    u_int32 bitshift; 
-    static const u_int32 mask[32] = 
-            {0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 
-             0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
-             0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff, 
-             0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff};
-
-    bibAssert(MaxNumBits <= 32);
-    bibAssert(*StartBit < MaxNumBits);
-    bibAssert(getBits-1 <= *StartBit);
-    bibAssert(getBits > 0);
-    
-    bitshift = *StartBit - getBits + 1; 
-    val = (SrcValue>>bitshift) & mask[getBits-1]; 
-    if ( getBits > *StartBit )
-        {
-        // taking the last bits of the word; *StartBit is uint32, so it goes to max uint32 unless this special handling
-        // other cases asserted already above
-        *StartBit = 31;
-        }
-    else
-        {
-        *StartBit -= getBits; 
-        }
-
-    return val;
-}
-
-void bibForwardBits(u_int32 numberOfBits, bibBuffer_t *buffer)
-{
-    u_int32 BitsToForward;
-    u_int32 BytesToForward;
-    u_int32 BitsRemaining;
-    unsigned bitshift;
-    unsigned bitstomove;
-        
-    BitsToForward = numberOfBits; 
-    bitshift=0;
-    bitstomove=0;
-        
-    bibAssert(buffer != NULL);
-        
-        // complete the byte
-    if (buffer->bitIndex!=7)
-    {
-        bitshift=buffer->bitIndex+1;
-        bitstomove = ((BitsToForward < bitshift) ? BitsToForward : bitshift); 
-        // update statistics to take care of bit addition or byte completion 
-        if (BitsToForward < bitshift)
-        {
-            // bits skipped but byte not completed
-            buffer->bitIndex -= bitstomove;
-            bibAssert(buffer->bitIndex >= 0)
-        }
-        else
-        {
-            // byte completed
-            buffer->numBytesRead++;
-            buffer->bitIndex=7;
-        }
-    }
-        // full bytes to skip
-    BytesToForward=(BitsToForward-bitstomove)>>3;
-    buffer->numBytesRead+=BytesToForward;
-        
-        // skip the remaining bits
-    BitsRemaining=((BitsToForward-bitstomove))%8;
-    if(BitsRemaining!=0)
-    {
-        buffer->bitIndex=7-BitsRemaining;
-    }
-    buffer->bitsLeft -= BitsToForward;
-    buffer->getIndex=buffer->numBytesRead;
-}
-
-void bibStuffBits(bibBuffer_t *buffer)
-{
-    // the extra bits are already set to zero 
-    bibAssert(buffer->baseAddr);
-    if(buffer->bitIndex!=7)
-    {
-        buffer->bitIndex=7;
-        buffer->getIndex++;
-        buffer->numBytesRead++;
-    }
-}
-
-
-
-
-// End of File