videoeditorengine/avcedit/src/slice.cpp
branchRCL_3
changeset 3 e0b5df5c0969
parent 0 951a5db380a0
child 5 4c409de21d23
--- a/videoeditorengine/avcedit/src/slice.cpp	Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1124 +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:
-*
-*/
-
-
-#include <string.h>
-#include "globals.h"
-#include "bitbuffer.h"
-#include "vld.h"
-#include "macroblock.h"
-#include "parameterset.h"
-#include "framebuffer.h"
-#include "dpb.h"
-#include "slice.h"
-#include "sequence.h"
-
-
-#define MIN_ALPHA_BETA_OFFSET   -6
-#define MAX_ALPHA_BETA_OFFSET   6
-
-/*
- * AVC syntax functions as specified in specification
- */
-
-
-/*
- * Static functions
- */
-
-static int getRefPicListReorderingCmds(slice_s *slice, unsigned int numRefFrames,
-                                       bitbuffer_s *bitbuf);
-
-static int getDecRefPicMarkingCmds(slice_s *slice, unsigned int numRefFrames,
-                                   bitbuffer_s *bitbuf);
-
-static int refPicListReordering(slice_s *slice, dpb_s *dpb,
-                                 frmBuf_s *refPicList[], int numRefPicActive,
-                                 sliceRefPicListReorderCmd_s reorderCmdList[]);
-
-
-
-/*
- * AVC syntax functions as specified in specification
- */
-
-/* Return fixed length code */
-static int u_n(bitbuffer_s *bitbuf, int len, unsigned int *val)
-{
-  *val = vldGetFLC(bitbuf, len);
-
-  if (bibGetStatus(bitbuf) < 0)
-    return SLICE_ERROR;
-
-  return SLICE_OK;
-}
-
-/* Return unsigned UVLC code */
-static int ue_v(bitbuffer_s *bitbuf, unsigned int *val, unsigned int maxVal)
-{
-  *val = vldGetUVLC(bitbuf);
-
-  if (bibGetStatus(bitbuf) < 0)
-    return SLICE_ERROR;
-
-  if (*val > maxVal)
-    return SLICE_ERR_ILLEGAL_VALUE;
-
-  return SLICE_OK;
-}
-
-/* Return signed UVLC code */
-static int se_v(bitbuffer_s *bitbuf, int *val, int minVal, int maxVal)
-{
-  *val = vldGetSignedUVLC(bitbuf);
-
-  if (bibGetStatus(bitbuf) < 0)
-    return SLICE_ERROR;
-
-  if (*val < minVal || *val > maxVal)
-    return SLICE_ERR_ILLEGAL_VALUE;
-
-  return SLICE_OK;
-}
-
-/* Return long signed UVLC code */
-static int se_v_long(bitbuffer_s *bitbuf, int32 *val)
-{
-  *val = vldGetSignedUVLClong(bitbuf);
-
-  if (bibGetStatus(bitbuf) < 0)
-    return SLICE_ERROR;
-
-  return SLICE_OK;
-}
-
-
-/*
- *
- * sliceOpen:
- *
- * Parameters:
- *
- * Function:
- *      Allocate and initialize a slice.
- *
- * Returns:
- *      Pointer to slice
- *
- */
-slice_s *sliceOpen()
-{
-  slice_s *slice;
-
-  slice = (slice_s *)User::Alloc(sizeof(slice_s));
-
-  if (slice != NULL)
-    memset(slice, 0, sizeof(slice_s));
-
-  return slice;
-}
-
-
-/*
- *
- * sliceClose:
- *
- * Parameters:
- *      slice                 Slice object
- *
- * Function:
- *      Deallocate slice
- *
- * Returns:
- *      Nothing
- *
- */
-void sliceClose(slice_s *slice)
-{
-  User::Free(slice);
-}
-
-
-/*
- * getRefPicListReorderingCmds:
- *
- * Parameters:
- *     slice               Slice object
- *     bitbuf              Bitbuffer object
- *     numRefFrames        Number of reference frames in used
- *
- * Function:
- *     Parse and store the ref pic reordering commands
- *
- * Return:
- *     The number of bits being parsed
- */
-static int getRefPicListReorderingCmds(slice_s *slice, unsigned int numRefFrames,
-                                       bitbuffer_s *bitbuf)
-{
-  int i;
-  unsigned int reordering_of_pic_nums_idc;
-  int retCode;
-
-  if (!IS_SLICE_I(slice->slice_type)) {
-
-    if ((retCode = u_n(bitbuf, 1, &slice->ref_pic_list_reordering_flag0)) < 0)
-      return retCode;
-
-    if (slice->ref_pic_list_reordering_flag0) {
-
-      i = 0;
-      do {
-        /* Get command */
-        if ((retCode = ue_v(bitbuf, &reordering_of_pic_nums_idc, 3)) < 0)
-          return retCode;
-
-        slice->reorderCmdList[i].reordering_of_pic_nums_idc = reordering_of_pic_nums_idc;
-
-        /* Get command parameters */
-        if (reordering_of_pic_nums_idc == 0 || reordering_of_pic_nums_idc == 1) {
-          unsigned int maxDiff = slice->maxFrameNum/2-1;
-          if (reordering_of_pic_nums_idc == 1)
-            maxDiff = maxDiff - 1;
-          if ((retCode = ue_v(bitbuf, &slice->reorderCmdList[i].abs_diff_pic_num_minus1, maxDiff)) < 0)
-            return retCode;
-        }
-        else if (reordering_of_pic_nums_idc == 2) {
-          /* longTermPicNum be in the range of 0 to num_ref_frames, inclusive. */
-          if ((retCode = ue_v(bitbuf, &slice->reorderCmdList[i].long_term_pic_num, numRefFrames)) < 0)
-            return retCode;
-        }
-
-        i++;
-      } while (reordering_of_pic_nums_idc != 3 && i < MAX_NUM_OF_REORDER_CMDS);
-    }
-  }
-
-  return SLICE_OK;
-}
-
-
-/*
- * getDecRefPicMarkingCmds:
- *
- * Parameters:
- *     slice               Slice object
- *     bitbuf              Bitbuffer object
- *     numRefFrames        Number of reference frames in used
- *
- * Function:
- *     Parse and store the MMCO commands
- *
- * Return:
- *     The number of bits being parsed
- */
-static int getDecRefPicMarkingCmds(slice_s *slice, unsigned int numRefFrames,
-                                   bitbuffer_s *bitbuf)
-{
-  int i;
-  unsigned int mmco;
-  int retCode;
-
-  /* MMCO commands can exist only in slice header of a reference picture */
-  if (slice->nalRefIdc != 0) {
-    if (slice->isIDR) {
-      if ((retCode = u_n(bitbuf, 1, &slice->no_output_of_prior_pics_flag)) < 0)
-        return retCode;
-      if ((retCode = u_n(bitbuf, 1, &slice->long_term_reference_flag)) < 0)
-        return retCode;
-    }
-    else {
-      if ((retCode = u_n(bitbuf, 1, &slice->adaptive_ref_pic_marking_mode_flag)) < 0)
-        return retCode;
-
-      if (slice->adaptive_ref_pic_marking_mode_flag) {
-
-        i = 0;
-        do {
-          /* Get MMCO command */
-          if ((retCode = ue_v(bitbuf, &mmco, 6)) < 0)
-            return retCode;
-
-          slice->mmcoCmdList[i].memory_management_control_operation = mmco;
-
-          /* Get command parameter (if any) */
-          if (mmco == 1 || mmco == 3) {
-            if ((retCode = ue_v(bitbuf, &slice->mmcoCmdList[i].difference_of_pic_nums_minus1, 65535)) < 0)
-              return retCode;
-          }
-          if (mmco == 2) {
-            if ((retCode = ue_v(bitbuf, &slice->mmcoCmdList[i].long_term_pic_num, numRefFrames)) < 0)
-              return retCode;
-          }
-          if (mmco == 3 || mmco == 6) {
-            if ((retCode = ue_v(bitbuf, &slice->mmcoCmdList[i].long_term_frame_idx, numRefFrames)) < 0)
-              return retCode;
-          }
-          if (mmco == 4) {
-            if ((retCode = ue_v(bitbuf, &slice->mmcoCmdList[i].max_long_term_frame_idx_plus1, numRefFrames)) < 0)
-              return retCode;
-          }
-          if (mmco == 5) {
-            slice->picHasMMCO5 = 1;
-          }
-
-          i++;
-        } while (mmco != 0 && i < MAX_NUM_OF_MMCO_OPS);
-      }
-    }
-  }
-  else
-    slice->adaptive_ref_pic_marking_mode_flag = 0;
-
-  return 1;
-}
-
-
-/*
- * sliceInitRefPicList:
- *
- * Parameters:
- *     dpb                  DPB buffer
- *     refPicList           Reference picture list (output)
- *
- * Fucntion:
- *     Initialize reference picture list.
- *
- * Return:
- *     Number of reference frames in the list
- */
-int sliceInitRefPicList(dpb_s *dpb, frmBuf_s *refPicList[])
-{
-  int numRef, numShort;
-  frmBuf_s *refTmp;
-  int i, j;
-
-  /*
-   * Select the reference pictures from the DPB
-   */
-  j = 0;
-  /* Put short term pictures first in the list */
-  for (i = 0; i < dpb->fullness; i++) {
-    if (dpb->buffers[i]->refType == FRM_SHORT_TERM_PIC) 
-      refPicList[j++] = dpb->buffers[i];
-  }
-  numShort = j;
-  /* Put long term pictures after the short term pictures */
-  for (i = 0; i < dpb->fullness; i++) {
-    if (dpb->buffers[i]->refType == FRM_LONG_TERM_PIC) 
-      refPicList[j++] = dpb->buffers[i];
-  }
-  numRef = j;
-  /* numLong = numRef - numShort; */
-
-  /*
-   * Initialisation process for reference picture lists
-   */
-  /* Sort short term pictures in the order of descending picNum */
-  for (i = 0; i < numShort; i++) {
-    for (j = i+1; j < numShort; j++) {
-      if (refPicList[i]->picNum < refPicList[j]->picNum) {
-        /* exchange refPicList[i] and refPicList[j] */
-        refTmp = refPicList[i];
-        refPicList[i] = refPicList[j];
-        refPicList[j] = refTmp;
-      }
-    }
-  }
-  /* Sort long term pictures in the order of ascending longTermPicNum */
-  for (i = numShort; i < numRef; i++) {
-    for (j = i+1; j < numRef; j++) {
-      if (refPicList[i]->longTermPicNum > refPicList[j]->longTermPicNum) {
-        /* exchange refPicList[i] and refPicList[j] */
-        refTmp = refPicList[i];
-        refPicList[i] = refPicList[j];
-        refPicList[j] = refTmp;
-      }
-    }
-  }
-
-  return numRef;
-}
-
-
-/*
- * sliceFixRefPicList:
- *
- * Parameters:
- *     dpb                  DPB buffer
- *     refPicList           Reference picture list (output)
- *     numRefPicActive      Number of active reference frames
- *     numExistingRefFrames Number of reference frames in refPicList
- *
- * Fucntion:
- *     If numExistingRefFrames < numRefPicActive, try to fill up the
- *     reference frame list
- *
- * Return:
- *     0 for no pictures exist in reference frame list
- *     1 for pictures exist in reference frame list
- */
-int sliceFixRefPicList(dpb_s *dpb, frmBuf_s *refPicList[],
-                       int numRefPicActive, int numExistingRefFrames,
-                       int width, int height)
-{
-  int i;
-
-  if (numExistingRefFrames == 0) {
-    /* Try to find any picture in DPB, even non-reference frame */
-    for (i = 0; i < dpb->size; i++) {
-      if (dpb->buffers[i] != NULL && dpb->buffers[i]->width == width && dpb->buffers[i]->height == height)
-        break;
-    }
-
-    if (i < dpb->size) {
-      refPicList[0] = dpb->buffers[i];
-      numExistingRefFrames = 1;
-    }
-    else
-      return 0;
-  }
-
-  /* Duplicate last extry of the reference frame list so that list becomes full */
-  for (i = numExistingRefFrames; i < numRefPicActive; i++)
-    refPicList[i] = refPicList[numExistingRefFrames-1];
-
-  return 1;
-}
-
-/*
- * refPicListReordering:
- *
- * Parameters:
- *     slice                Current slice object
- *     dpb                  DPB buffer
- *     refPicList           Reference picture list (modified by this function)
- *     numRefPicActive      Number of active reference frames
- *     reorderCmdList       Reordering command list
- *
- * Fucntion:
- *     Reorder the reference picture list for current slice
- *
- * Return:
- *     SLICE_OK for no error and negative value for error
- */
-static int refPicListReordering(slice_s *slice, dpb_s *dpb,
-                                frmBuf_s *refPicList[], int numRefPicActive,
-                                sliceRefPicListReorderCmd_s reorderCmdList[])
-{
-  int i;
-  int reordering_of_pic_nums_idc, longTermPicNum;
-  int32 absDiffPicNum;
-  int refIdx;
-  int32 currPicNum, picNumPred, picNumNoWrap;
-  int32 maxPicNum, picNum;
-  int cmdNum;
-  int cIdx, nIdx;
-
-  /*
-   * 3. Reordering process for reference picture list
-   */
-
-  maxPicNum = slice->maxFrameNum;   /* for frame coding only */
-  currPicNum = slice->frame_num;
-  picNumPred = currPicNum;
-  refIdx = 0;
-  cmdNum = 0;
-
-  do {
-    reordering_of_pic_nums_idc = reorderCmdList[cmdNum].reordering_of_pic_nums_idc;
-
-    if (reordering_of_pic_nums_idc == 0 || reordering_of_pic_nums_idc == 1) {
-
-      /*
-       * reorder short-term ref pic  -subclause 8.2.4.3.1
-       */
-
-      absDiffPicNum = reorderCmdList[cmdNum].abs_diff_pic_num_minus1 + 1;
-
-      /* Derive picNumNoWrap */
-      if (reordering_of_pic_nums_idc == 0) {
-        if (picNumPred - absDiffPicNum < 0)
-          picNumNoWrap = picNumPred - absDiffPicNum + maxPicNum;
-        else
-          picNumNoWrap = picNumPred - absDiffPicNum;
-      }
-      else { /* reordering_of_pic_nums_idc == 1 */
-        if (picNumPred + absDiffPicNum >= maxPicNum) 
-          picNumNoWrap = picNumPred + absDiffPicNum - maxPicNum;
-        else
-          picNumNoWrap = picNumPred + absDiffPicNum;
-      }
-
-      /* Derive picNum */
-      if (picNumNoWrap > currPicNum)
-        picNum = picNumNoWrap - maxPicNum;
-      else
-        picNum = picNumNoWrap;
-
-      /* Find short term picture with picture number picNum */
-      for (i = 0; i < dpb->fullness; i++) {
-        if (!dpb->buffers[i]->nonExisting &&
-            dpb->buffers[i]->refType == FRM_SHORT_TERM_PIC &&
-            dpb->buffers[i]->picNum == picNum)
-          break;
-      }
-
-      /* If picNum was not found */
-      if (i == dpb->fullness) {
-        PRINT((_L("The short term ref pic(%d) is not found!\n"), picNum));
-        return SLICE_ERR_ILLEGAL_VALUE;
-      }
-
-      /* Shift remaining pictures later in the list */
-      for (cIdx = numRefPicActive; cIdx > refIdx; cIdx--)
-        refPicList[cIdx] = refPicList[cIdx - 1];
-
-      /* Place picture with number picNum into the index position refIdx */
-      refPicList[refIdx++] = dpb->buffers[i];
-
-      /* Remove duplicate of the inserted picture */
-      nIdx = refIdx;
-      for (cIdx = refIdx; cIdx <= numRefPicActive; cIdx++)
-        if (refPicList[cIdx]->refType == FRM_LONG_TERM_PIC || refPicList[cIdx]->picNum != picNum)
-          refPicList[nIdx++] = refPicList[cIdx];
-
-      picNumPred = picNumNoWrap;
-    }
-
-    else if (reordering_of_pic_nums_idc == 2) {
-
-      /*
-       * reorder long-term ref pic  -subclause 8.2.4.3.2
-       */
-
-      /* Get long-term picture number */
-      longTermPicNum = reorderCmdList[cmdNum].long_term_pic_num;
-
-      /* Find long-term picture with picture number longTermPicNum */
-      for (i = 0; i < dpb->fullness; i++)
-        if (dpb->buffers[i]->refType == FRM_LONG_TERM_PIC &&
-            dpb->buffers[i]->longTermPicNum == longTermPicNum)
-          break;
-
-      if (i == dpb->fullness) {
-        // something wrong !
-        PRINT((_L("The long term ref pic(%d) is not found!\n"), longTermPicNum));
-        return SLICE_ERR_ILLEGAL_VALUE;
-      }
-
-      /* Shift remaining pictures later in the list */
-      for (cIdx = numRefPicActive; cIdx > refIdx; cIdx--)
-        refPicList[cIdx] = refPicList[cIdx - 1];
-
-      /* Place picture with number longTermPicNum into the index position refIdx */
-      refPicList[refIdx++] = dpb->buffers[i];
-
-      /* Remove duplicate of the inserted picture */
-      nIdx = refIdx;
-      for (cIdx = refIdx; cIdx <= numRefPicActive; cIdx++)
-        if (refPicList[cIdx]->refType == FRM_SHORT_TERM_PIC ||
-            refPicList[cIdx]->longTermPicNum != longTermPicNum)
-        {
-          refPicList[nIdx++] = refPicList[cIdx];
-        }
-    }
-
-    cmdNum++;
-
-  } while (reordering_of_pic_nums_idc != 3 && cmdNum < MAX_NUM_OF_REORDER_CMDS);
-
-
-  refPicList[numRefPicActive] = 0;
-
-  return SLICE_OK;
-}
-
-
-// sliceParseMacroblocks
-// Parses the macroblocks one by one in the input slice. 
-TInt sliceParseMacroblocks(slice_s *slice, frmBuf_s *recoBuf, dpb_s *dpb,
-                           pic_parameter_set_s *pps,
-                           mbAttributes_s *mbData, TInt sliceID,
-                           bitbuffer_s *bitbuf,
-                           TBool aBitShiftInSlice)
-{
-  	frmBuf_s *refPicList0[DPB_MAX_SIZE+1];
-  	macroblock_s mb;
-  	TInt numRefFrames;
-  	TInt numExistingRefFrames;
-//  	TInt refFramesExist;
-  	TInt mbIdxY;
-  	TInt mbIdxX;
-  	TInt mbksPerLine;
-  	TInt mbksPerCol;
-  	TInt picSizeInMbs;
-  	TInt currMbAddr;
-  	TInt sliceGroupNum;
-  	void *stream;
-  	TInt retCode;
-
-  	// Choose number of reference frames and build reference picture list 
-  	numRefFrames   = 0;
-//  	refFramesExist = 0;
-  	if (!IS_SLICE_I(slice->slice_type)) 
-  	{	
-    	if (slice->num_ref_idx_active_override_flag)
-      		numRefFrames = slice->num_ref_idx_l0_active_minus1 + 1;
-    	else
-      		numRefFrames = pps->num_ref_idx_l0_active_minus1 + 1;
-
-    	numExistingRefFrames = sliceInitRefPicList(dpb, refPicList0);
-
-    	if (numExistingRefFrames < numRefFrames) 
-    	{
-//      		refFramesExist = sliceFixRefPicList(dpb, refPicList0, numRefFrames, numExistingRefFrames,
-//            	                                recoBuf->width, recoBuf->height);
-    	}
-    	else
-//      		refFramesExist = 1;
-
-    	if (slice->ref_pic_list_reordering_flag0 && numExistingRefFrames > 0) 
-    	{
-      		retCode = refPicListReordering(slice, dpb, refPicList0, numRefFrames, slice->reorderCmdList);
-      		
-      		if (retCode < 0)
-        		return retCode;
-    	}
-  	}
-
-  	mbksPerLine = recoBuf->width/MBK_SIZE;
-  	mbksPerCol  = recoBuf->height/MBK_SIZE;
-  	picSizeInMbs = mbksPerLine*mbksPerCol;
-
-  	currMbAddr = slice->first_mb_in_slice;
-  	sliceGroupNum = sliceID & 0xF;
-
-  	mbIdxY = currMbAddr / mbksPerLine;
-  	mbIdxX = currMbAddr - mbIdxY*mbksPerLine;
-
-  	mbkSetInitialQP(&mb, slice->qp, pps->chroma_qp_index_offset);
-
-  	stream = bitbuf;
-
-  	// Loop until all macroblocks in current slice have been decoded 
-  	// If there has been a bitshift in the slice, we must go through 
-  	// the macroblocks to see if any PCM coded MB are used.
-  	if(aBitShiftInSlice)
-  	{
-  	
-  		do 
-  		{
-
-    		// Store slice ID for current macroblock 
-    		mbData->sliceMap[currMbAddr] = sliceID;
-
-    		// Store loopfilter mode 
-    		mbData->filterModeTab[currMbAddr] = (int8) slice->disable_deblocking_filter_idc;
-    		mbData->alphaOffset[currMbAddr]   = (int8) (slice->slice_alpha_c0_offset_div2*2);
-    		mbData->betaOffset[currMbAddr]    = (int8) (slice->slice_beta_offset_div2*2);
-
-    		retCode = mbkParse(&mb, numRefFrames,
-            		           mbData, recoBuf->width, 
-                    		   slice->slice_type, pps->constrained_intra_pred_flag,
-                       		   pps->chroma_qp_index_offset,
-		                       mbIdxX, mbIdxY, stream, slice->bitOffset);
-
-			if (retCode == MBK_PCM_FOUND)
-			{
-				// We can stop parsing this slice
-				// Check later if this is the case also if we have slices in more than one NAL (is it even possible?)!!!
-				return SLICE_OK;
-			}
-	
-    		if (retCode < 0)
-      			return SLICE_ERROR;
-
-      		// If end of slice data has been reached and there are no 
-      		// skipped macroblocks left, stop decoding slice.         
-      		if (!bibMoreRbspData(bitbuf) && mb.numSkipped <= 0)
-        		break;
-
-    		// Find next mb address in the current slice group 
-    		do 
-    		{
-      			// Next mb address 
-      			currMbAddr++;
-
-      			// If end of frame was reached, stop search 
-      			if (currMbAddr == picSizeInMbs)
-        			break;
-
-      			// Update mb location 
-      			mbIdxX++;
-      			if (mbIdxX == mbksPerLine) 
-      			{
-        			mbIdxX = 0;
-        			mbIdxY++;
-      			}
-
-    		} while ((mbData->sliceMap[currMbAddr] & 0xF) != sliceGroupNum);
-
-    	// If end of frame was reached, stop decoding slice 
-  		} while (currMbAddr < picSizeInMbs);
-  	}
-
-  	return SLICE_OK;
-}
-
-
-// EncodeUnsignedNBits
-// Encodes the input aValue to the bit buffer with aLength bits.
-void EncodeUnsignedNBits(bitbuffer_s *aBitBuffer, TUint aValue, TUint aLength)
-{
-	TUint tempValue;
-	TInt i;
-	TUint8 byteValue;
-	 
-	if(aBitBuffer->bitpos == 0)
-	{
-		// Get the next byte
-		aBitBuffer->currentBits = aBitBuffer->data[aBitBuffer->bytePos];
-		aBitBuffer->bytePos++;
-		aBitBuffer->bitpos = 8;
-	}
-		
-	// Write aValue bit by bit to the bit buffer
-	for (i=aLength-1; i>=0; i--)
-	{
-		// Get the ith bit from aValue
-		tempValue = (aValue & (1 << i)) >> i;
-		
-		// Zero out the bitpos bit
-		byteValue = aBitBuffer->data[aBitBuffer->bytePos-1] & ~(1<<(aBitBuffer->bitpos-1));
-		byteValue |= tempValue << (aBitBuffer->bitpos-1);
-		
-		aBitBuffer->data[aBitBuffer->bytePos-1] = byteValue;
-		aBitBuffer->bitpos--;
-		
-		if(aBitBuffer->bitpos == 0)
-		{
-			// Get the next byte
-			aBitBuffer->currentBits = aBitBuffer->data[aBitBuffer->bytePos];
-
-			aBitBuffer->bytePos++;
-			aBitBuffer->bitpos = 8;
-		}
-	}
-	
-	// Make sure the bit buffer currentBits is up-to-date
-	aBitBuffer->currentBits = aBitBuffer->data[aBitBuffer->bytePos-1];
-}
-
-
-// ParseSliceHeader
-// Parses the input slice header. PPS Id, frame numbering and POC LSB are modified if required.
-TInt ParseSliceHeader(slice_s *slice, seq_parameter_set_s *spsList[],
-                      pic_parameter_set_s *ppsList[], bitbuffer_s *bitbuf, 
-                      TUint* aFrameNumber, TUint aFrameFromEncoder)
-{
-  	seq_parameter_set_s *sps;
-  	pic_parameter_set_s *pps;
-  	TUint picSizeInMapUnits;
-  	TUint temp, temp2;
-  	TInt sliceQp, len1;
-  	TInt retCode;
-  	TInt shiftedBits = 0;
-
-
-  	slice->picHasMMCO5 = 0;
-  
-  	// Initialize the bit offset to zero
-  	slice->bitOffset = 0;
-
-  	// First macroblock in slice 
-  	if ((retCode = ue_v(bitbuf, &slice->first_mb_in_slice, 65535)) < 0)
-    	return retCode;
-
-  	// Slice type 
-  	if ((retCode = ue_v(bitbuf, &slice->slice_type, SLICE_MAX)) < 0)
-    	return retCode;
-
-  	// PPS id 
-  	if ((retCode = ue_v(bitbuf, &slice->pic_parameter_set_id, PS_MAX_NUM_OF_PPS-1)) < 0)
-    	return retCode;
-  
-  	pps = ppsList[slice->pic_parameter_set_id];
-
-  	if (pps == NULL) 
-  	{
-    	PRINT((_L("Error: referring to non-existing PPS.\n")));     
-    		return SLICE_ERR_NON_EXISTING_PPS;
-  	}
-
-	syncBitBufferBitpos(bitbuf);
-	
-  	// If the index has been changed the new index must be coded instead of 
-  	// the old one to the slice header
-  	if (pps->indexChanged)
-  	{
-  		// We have to encode the new PPS Id to the bitbuffer
-  		TUint oldPPSId = slice->pic_parameter_set_id;
-  		TUint newPPSId;
-  	
-  		if ( aFrameFromEncoder )
-  			newPPSId = pps->encPPSId;
-  		else
-  			newPPSId = pps->origPPSId;
-  	
-		TUint trailingBits = GetNumTrailingBits(bitbuf);
-		TInt diff = 0;
-	
-		TUint oldIdLength = ReturnUnsignedExpGolombCodeLength(oldPPSId);
-		TUint newIdLength = ReturnUnsignedExpGolombCodeLength(newPPSId);
-	
-		// Signal that the slice data has been modified
-		slice->sliceDataModified = 1;    
-    
-		// Get the new pps
-		pps = ppsList[newPPSId];
-		
-		if(trailingBits > 8)
-		{
-			trailingBits = 8;
-		}
-		
-		if ( oldIdLength == newIdLength )	
-		{
-			// Just encode the new Id on top of the old Id
-			bitbuf->bitpos += oldIdLength;
-			
-			if(bitbuf->bitpos > 8)
-			{	
-				// Go to the right byte and bit position
-				bitbuf->bytePos -= bitbuf->bitpos / 8;
-				bitbuf->bitpos = bitbuf->bitpos % 8;
-			}
-			
-			EncodeUnsignedExpGolombCode(bitbuf, newPPSId);
-		}
-		else if ( oldIdLength < newIdLength )
-		{
-			diff = newIdLength - oldIdLength;
-		
-			// Positive bit offset indicates bit-wise shift to right
-			slice->bitOffset = (diff % 8);
-		
-			ShiftBufferRight(bitbuf, diff, trailingBits, oldIdLength);
-		
-			// After shifting, encode the new value to the bit buffer
-			EncodeUnsignedExpGolombCode(bitbuf, newPPSId);
-		}
-		else
-		{
-			// New id's length is smaller than old id's length
-			diff = oldIdLength - newIdLength;
-	
-			// Negative bit offset indicates bit-wise shift to left
-			slice->bitOffset = -(diff % 8);
-		
-			ShiftBufferLeft(bitbuf, diff, oldIdLength);
-		
-			// After shifting, encode the new value to the bit buffer
-			EncodeUnsignedExpGolombCode(bitbuf, newPPSId);
-		}
-	
-		shiftedBits = diff;
-  	}
-
-  	sps = spsList[pps->seq_parameter_set_id];
-  	
-  	if (sps == NULL) 
-  	{
-    	PRINT((_L("Error: referring to non-existing SPS.\n")));     
-    	return SLICE_ERR_NON_EXISTING_SPS;
-  	}
-
-  	picSizeInMapUnits = (sps->pic_width_in_mbs_minus1+1) * (sps->pic_height_in_map_units_minus1+1);
-
-  	if (slice->first_mb_in_slice >= picSizeInMapUnits)
-    	return SLICE_ERR_ILLEGAL_VALUE;
-
-  	// Maximum frame number 
-  	slice->maxFrameNum = (TUint)1 << (sps->log2_max_frame_num_minus4+4);
-  
-  	// IDR type NAL unit shall have frame number as zero
-	if ( slice->nalType == NAL_TYPE_CODED_SLICE_IDR )
-	{
-		// Reset frame number for an IDR slice
-	 	*aFrameNumber = 0;	
-	}
-	else if ( *aFrameNumber == (slice->maxFrameNum - 1 ) )
-	{
-		// Reset frame number if maximum frame number has been reached
-	 	*aFrameNumber = 0;	
-	}
-	else if( !slice->first_mb_in_slice )
-	{
-	    (*aFrameNumber)++;	// Increment frame number only if this is the first mb in slice
-	}
-	
-
-  	if (sps->maxFrameNumChanged)
-  	{
-  		// Frame number field size
-  		TUint oldFrameNum;
-  		TUint newFrameNum = sps->log2_max_frame_num_minus4+4;
-  	
-  		if ( aFrameFromEncoder )
-  			oldFrameNum = sps->encMaxFrameNum+4;
-  		else
-  			oldFrameNum = sps->origMaxFrameNum+4;
-  	
-		TUint trailingBits = GetNumTrailingBits(bitbuf);
-		TInt diff = 0;
-	
-		// Signal that the slice data has been modified
-		slice->sliceDataModified = 1;    
-    
-		if(trailingBits > 8)
-		{
-			trailingBits = 8;
-		}
-		
-		// If the size of the frame number field has changed then shift bits in the buffer
-		if ( oldFrameNum < newFrameNum )
-		{
-			diff = newFrameNum - oldFrameNum;
-		
-			// Positive bit offset indicates bit-wise shift to right
-			slice->bitOffset += (diff % 8);
-		
-			ShiftBufferRight(bitbuf, diff, trailingBits, 0);
-		}
-		else if ( oldFrameNum > newFrameNum )
-		{
-			// New id's length is smaller than old id's length
-			diff = oldFrameNum - newFrameNum;
-	
-			// Negative bit offset indicates bit-wise shift to left
-			slice->bitOffset -= (diff % 8);
-		
-			ShiftBufferLeft(bitbuf, diff, 0);
-		}
-	
-		shiftedBits += diff;
-  	}
-  
-  	// Encode the new frame number here
-  	EncodeUnsignedNBits(bitbuf, *aFrameNumber, sps->log2_max_frame_num_minus4+4);
-  
-  	slice->frame_num = *aFrameNumber;
-
-  	// IDR picture 
-  	if (slice->isIDR) 
-  	{
-    	if ((retCode = ue_v(bitbuf, &slice->idr_pic_id, 65535)) < 0)
-      		return retCode;
-  	}
-
-	syncBitBufferBitpos(bitbuf);
-	
-  	// POC parameters 
-	if (sps->pic_order_cnt_type == 0) 
-  	{
-	  	if (sps->maxPOCNumChanged)
-  		{
-  			// POC lsb number 
-  			TUint oldPOCNum;
-  			TUint newPOCNum = sps->log2_max_pic_order_cnt_lsb_minus4+4;
-  	
-  			if ( aFrameFromEncoder )
-  				oldPOCNum = sps->encMaxPOCNum+4;
-  			else
-  				oldPOCNum = sps->origMaxPOCNum+4;
-  	
-			TUint trailingBits = GetNumTrailingBits(bitbuf);
-			TInt diff = 0;
-	
-			// Signal that the slice data has been modified
-			slice->sliceDataModified = 1;    
-    
-			if (trailingBits > 8)
-			{
-				trailingBits = 8;
-			}
-		
-			// If the size of the POC lsb field has changed then shift bits in the buffer
-			if ( oldPOCNum < newPOCNum )
-			{	
-				diff = newPOCNum - oldPOCNum;
-		
-				// Positive bit offset indicates bit-wise shift to right
-				slice->bitOffset += (diff % 8);
-		
-				ShiftBufferRight(bitbuf, diff, trailingBits, 0);
-
-			}
-			else if ( oldPOCNum > newPOCNum )
-			{
-				// New id's length is smaller than old id's length
-				diff = oldPOCNum - newPOCNum;
-	
-				// Negative bit offset indicates bit-wise shift to left
-				slice->bitOffset -= (diff % 8);
-		
-				ShiftBufferLeft(bitbuf, diff, 0);
-			
-			}
-	
-			shiftedBits += diff;
-  		}
-  
-	  	// For now encode the POC as the frame number
-  		EncodeUnsignedNBits(bitbuf, *aFrameNumber, sps->log2_max_pic_order_cnt_lsb_minus4+4);
-  
-   		slice->delta_pic_order_cnt_bottom = 0;
-    	
-    	if (pps->pic_order_present_flag) 
-    	{ //  && !field_pic_flag 
-      		if ((retCode = se_v_long(bitbuf, &slice->delta_pic_order_cnt_bottom)) < 0)
-        		return retCode;
-    	}
-  	}
-  	else if (sps->pic_order_cnt_type == 1) 
-  	{
-    	slice->delta_pic_order_cnt_0 = 0;
-    	slice->delta_pic_order_cnt_1 = 0;
-    	// Read delta_pic_order_cnt[ 0 ] and delta_pic_order_cnt[ 1 ]
-    	if (!sps->delta_pic_order_always_zero_flag) 
-    	{
-      		// delta_pic_order_cnt[ 0 ] 
-      		if ((retCode = se_v_long(bitbuf, &slice->delta_pic_order_cnt_0)) < 0)
-        		return retCode;
-      		if (pps->pic_order_present_flag) 
-      		{ //  delta_pic_order_cnt[ 1 ] 
-        		if ((retCode = se_v_long(bitbuf, &slice->delta_pic_order_cnt_1)) < 0)
-          			return retCode;
-      		}
-    	}
-  	}
-
-	// If we don't have to do any bit shifting (left or right) with the slice header, 
-	// we can just stop parsing the header and return.
-	if (shiftedBits == 0)
-	{
-		return SLICE_STOP_PARSING;
-	}
-	
-  	// Redundant picture count
-  	if (pps->redundant_pic_cnt_present_flag) 
-  	{
-    	if ((retCode = ue_v(bitbuf, &slice->redundant_pic_cnt, 127)) < 0)
-      		return retCode;
-  	}
-  	else
-    	slice->redundant_pic_cnt = 0;
-
-  	// Reference picture management 
-  	if (IS_SLICE_P(slice->slice_type)) 
-  	{
-    	if ((retCode = u_n(bitbuf, 1, &slice->num_ref_idx_active_override_flag)) < 0)
-      		return retCode;
-    	if (slice->num_ref_idx_active_override_flag) 
-    	{
-      		if ((retCode = ue_v(bitbuf, &slice->num_ref_idx_l0_active_minus1, DPB_MAX_SIZE-1)) < 0)
-        		return retCode;
-    	}
-  	}
-
-  	// Reordering the reference picture list 
-  	retCode = getRefPicListReorderingCmds(slice, sps->num_ref_frames, bitbuf);
-
-	if (retCode < 0)
-    	return retCode;
-
-  	// Read the MMCO commands, but not do the operations until all the slices in current picture are decoded 
-  	if (slice->nalRefIdc) 
-  	{
-    	retCode = getDecRefPicMarkingCmds(slice, sps->num_ref_frames, bitbuf);
-    	if (retCode < 0)
-      		return retCode;
-  	}
-
-  	// Slice quant 
-  	if ((retCode = se_v(bitbuf, &slice->slice_qp_delta, -MAX_QP, MAX_QP)) < 0)
-    	return retCode;
-
-  	sliceQp = pps->pic_init_qp_minus26 + 26 + slice->slice_qp_delta;
-  	if (sliceQp < MIN_QP || sliceQp > MAX_QP) 
-  	{
-    	PRINT((_L("Error: illegal slice quant.\n")));     
-    	return SLICE_ERR_ILLEGAL_VALUE;
-  	}
-  	
-  	slice->qp = sliceQp;
-
-  	// Deblocking filter 
-  	slice->disable_deblocking_filter_idc = 0;
-  	slice->slice_alpha_c0_offset_div2    = 0;
-  	slice->slice_beta_offset_div2        = 0;
-
-  	if (pps->deblocking_filter_parameters_present_flag == 1) 
-  	{
-
-    	if ((retCode = ue_v(bitbuf, &slice->disable_deblocking_filter_idc, 2)) < 0)
-      		return retCode;
-
-    	if (slice->disable_deblocking_filter_idc != 1) 
-    	{
-      		if ((retCode = se_v(bitbuf, &slice->slice_alpha_c0_offset_div2, MIN_ALPHA_BETA_OFFSET, MAX_ALPHA_BETA_OFFSET)) < 0)
-        		return retCode;
-      		if ((retCode = se_v(bitbuf, &slice->slice_beta_offset_div2, MIN_ALPHA_BETA_OFFSET, MAX_ALPHA_BETA_OFFSET)) < 0)
-        		return retCode;
-    	}
-  	}
-
-  	// Read slice_group_change_cycle 
-  	if (pps->num_slice_groups_minus1 > 0 && pps->slice_group_map_type >= 3 &&
-        pps->slice_group_map_type <= 5)
-  	{
-    	// len = Ceil( Log2( PicSizeInMapUnits / SliceGroupChangeRate + 1 ) ) 
-	    // PicSizeInMapUnits / SliceGroupChangeRate 
-    	temp = picSizeInMapUnits / (pps->slice_group_change_rate_minus1+1);
-
-    	// Calculate Log2 
-    	temp2 = (temp + 1) >> 1;
-    	for (len1 = 0; len1 < 16 && temp2 != 0; len1++)
-      		temp2 >>= 1;
-
-    	// Calculate Ceil 
-    	if ( (((unsigned)1) << len1) < (temp + 1) )
-      		len1++;
-
-    	if ((retCode = u_n(bitbuf, len1, &slice->slice_group_change_cycle)) < 0)
-      		return retCode;
-
-    	// Ceil( PicSizeInMapUnits/SliceGroupChangeRate ) 
-    	if (temp * (pps->slice_group_change_rate_minus1+1) != picSizeInMapUnits)
-      		temp++;
-
-    	// The value of slice_group_change_cycle shall be in the range of  
-    	// 0 to Ceil( PicSizeInMapUnits/SliceGroupChangeRate ), inclusive. 
-    	if (slice->slice_group_change_cycle > temp)
-      		return SLICE_ERR_ILLEGAL_VALUE;
-  	}
-
-  	return SLICE_OK;
-}
-