--- a/videoeditorengine/h263decoder/src/viddemux.cpp Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4111 +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:
-* 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],
- ¶meterData[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