diff -r 951a5db380a0 -r e0b5df5c0969 videoeditorengine/h263decoder/src/viddemux.cpp --- 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 -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