You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
4.5 KiB
189 lines
4.5 KiB
/* *************************************************************************
|
|
** INTEL Corporation Proprietary Information
|
|
**
|
|
** This listing is supplied under the terms of a license
|
|
** agreement with INTEL Corporation and may not be copied
|
|
** nor disclosed except in accordance with the terms of
|
|
** that agreement.
|
|
**
|
|
** Copyright (c) 1995 Intel Corporation.
|
|
** All Rights Reserved.
|
|
**
|
|
** *************************************************************************
|
|
*/
|
|
|
|
/*
|
|
* d3gob.cpp
|
|
*
|
|
* Description:
|
|
* This modules contains the GOB header support routines
|
|
*
|
|
* Routines:
|
|
* H263SetGOBHeaderInfo
|
|
*
|
|
* Data:
|
|
*/
|
|
|
|
/* $Header: S:\h26x\src\dec\d1gob.cpv 1.15 10 Sep 1996 15:50:52 RHAZRA $
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
/* BIT field Constants
|
|
*/
|
|
const int BITS_GOB_STARTCODE = 16;
|
|
const int BITS_GROUP_NUMBER = 4;
|
|
const int BITS_GFID = 2;
|
|
const int BITS_GQUANT = 5;
|
|
const int MAX_GBSC_LOOKAHEAD_NUMBER = 7;
|
|
const int BITS_GSPARE = 8; // not including the following GEI
|
|
|
|
/* GBSC_VALUE - 0000 0000 0000 0001 xxxx xxxx xxxx xxxx
|
|
*/
|
|
const U32 GBSC_VALUE = (0x00010000 >> (32-BITS_GOB_STARTCODE));
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* H263DecodeGOBHeader
|
|
*
|
|
* Set the GOB header information in the decoder catalog. GOB numbers 2 thru
|
|
* N may have a GOB header. Look for one if it is there read it storing the
|
|
* information in the catalog. If a GOB header is not there set the information
|
|
* to default values.
|
|
*
|
|
* Returns an ICERR_STATUS
|
|
*/
|
|
#pragma code_seg("IACODE1")
|
|
extern I32 H263DecodeGOBHeader(
|
|
T_H263DecoderCatalog FAR * DC,
|
|
BITSTREAM_STATE FAR * fpbsState,
|
|
U32 uAssumedGroupNumber)
|
|
{
|
|
U8 FAR * fpu8;
|
|
U32 uBitsReady;
|
|
U32 uWork;
|
|
I32 iReturn;
|
|
U32 uResult;
|
|
U16 bFoundStartCode = 0;
|
|
int iSpareCount;
|
|
#ifndef RING0
|
|
char buf120[120];
|
|
int iLength;
|
|
#endif
|
|
|
|
GET_BITS_RESTORE_STATE(fpu8, uWork, uBitsReady, fpbsState)
|
|
|
|
/* GNum */
|
|
GET_FIXED_BITS((U32) BITS_GROUP_NUMBER, fpu8, uWork, uBitsReady, uResult);
|
|
DC->uGroupNumber = uResult;
|
|
|
|
//#ifndef LOSS_RECOVERY
|
|
#if 0
|
|
if (DC->uGroupNumber <= 0)
|
|
{
|
|
DBOUT("Bad GOB number");
|
|
iReturn = ICERR_ERROR;
|
|
goto done;
|
|
|
|
/* took out ASSERT so that can try and catch
|
|
** invalid bit streams and return error
|
|
*/
|
|
//ASSERT(DC->uGroupNumber > 0);
|
|
}
|
|
#else
|
|
if (DC->uGroupNumber <= 0)
|
|
{
|
|
DBOUT("Detected packet fault in GOB number");
|
|
DBOUT("Returning PACKET_FAULT_AT_MB_OR_GOB");
|
|
iReturn = PACKET_FAULT_AT_MB_OR_GOB;
|
|
goto done;
|
|
}
|
|
#endif
|
|
|
|
/* GQUANT */
|
|
GET_FIXED_BITS((U32) BITS_GQUANT, fpu8, uWork, uBitsReady, uResult);
|
|
|
|
//#ifndef LOSS_RECOVERY
|
|
#if 0
|
|
if (uResult < 1)
|
|
{
|
|
iReturn = ICERR_ERROR;
|
|
goto done;
|
|
}
|
|
DC->uGQuant = uResult;
|
|
DC->uMQuant = uResult;
|
|
#else
|
|
if (uResult < 1)
|
|
{
|
|
DBOUT("Detected packet fault in GOB quant");
|
|
DBOUT("Returning PACKET_FAULT_AT_PSC");
|
|
iReturn = PACKET_FAULT_AT_PSC;
|
|
GET_BITS_SAVE_STATE(fpu8, uWork, uBitsReady, fpbsState)
|
|
goto done;
|
|
}
|
|
|
|
DC->uGQuant = uResult;
|
|
DC->uMQuant = uResult;
|
|
#endif
|
|
|
|
|
|
/* skip spare bits */
|
|
iSpareCount = 0;
|
|
GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
|
|
while(uResult)
|
|
{
|
|
GET_FIXED_BITS((U32)BITS_GSPARE, fpu8, uWork, uBitsReady, uResult);
|
|
GET_ONE_BIT(fpu8, uWork, uBitsReady, uResult);
|
|
iSpareCount += BITS_GSPARE;
|
|
}
|
|
|
|
|
|
/* Save the modified bitstream state */
|
|
GET_BITS_SAVE_STATE(fpu8, uWork, uBitsReady, fpbsState)
|
|
|
|
#ifndef RING0
|
|
iLength = wsprintf(buf120,"GOB: HeaderPresent=%d GN=%ld GQ=%ld",
|
|
bFoundStartCode,
|
|
DC->uGroupNumber,
|
|
DC->uGQuant);
|
|
DBOUT(buf120);
|
|
ASSERT(iLength < 120);
|
|
#endif
|
|
|
|
iReturn = ICERR_OK;
|
|
|
|
done:
|
|
return iReturn;
|
|
} /* end H263DecodeGOBHeader() */
|
|
#pragma code_seg()
|
|
|
|
/* ******************************************** */
|
|
#pragma code_seg("IACODE1")
|
|
extern I32 H263DecodeGOBStartCode(
|
|
T_H263DecoderCatalog FAR * DC,
|
|
BITSTREAM_STATE FAR * fpbsState)
|
|
{
|
|
U8 FAR * fpu8;
|
|
U32 uBitsReady;
|
|
U32 uWork;
|
|
I32 iReturn;
|
|
U32 uResult;
|
|
|
|
/* Look for the GOB header Start Code */
|
|
GET_BITS_RESTORE_STATE(fpu8, uWork, uBitsReady, fpbsState)
|
|
|
|
GET_FIXED_BITS((U32) BITS_GOB_STARTCODE, fpu8, uWork, uBitsReady, uResult);
|
|
if (uResult != 1)
|
|
{
|
|
iReturn = ICERR_ERROR;
|
|
goto done;
|
|
}
|
|
GET_BITS_SAVE_STATE(fpu8, uWork, uBitsReady, fpbsState)
|
|
|
|
iReturn = ICERR_OK;
|
|
done:
|
|
return iReturn;
|
|
|
|
} /* end H263DecodeGOBStartCode() */
|
|
|
|
#pragma code_seg()
|