Leaked source code of windows server 2003
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.
 
 
 
 
 
 

209 lines
5.8 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\d3gob.cpv 1.13 20 Oct 1996 15:51:00 AGUPTA2 $
* $Log: S:\h26x\src\dec\d3gob.cpv $
//
// Rev 1.13 20 Oct 1996 15:51:00 AGUPTA2
// Adjusted DbgLog trace levels; 4:Frame, 5:GOB, 6:MB, 8:everything
//
// Rev 1.12 20 Oct 1996 13:21:00 AGUPTA2
// Changed DBOUT into DbgLog. ASSERT is not changed to DbgAssert.
//
//
// Rev 1.11 03 May 1996 13:07:26 CZHU
//
// Remove assertion of GOB number because of packet loss
//
// Rev 1.10 28 Apr 1996 17:34:12 BECHOLS
// Fixed warning due to iLength declaration. This variable was only used
// by a piece of code that was wrapped with IFDEF DEBUG_GOB, so I wrapped
// it with the same define.
//
// Rev 1.9 08 Mar 1996 16:46:14 AGUPTA2
// Changed defines to const int declarations. Added pragmas code_seg and
// data_seg. ifdef'd wsprintf call.
//
//
// Rev 1.8 27 Dec 1995 14:36:04 RMCKENZX
// Added copyright notice
*/
#include "precomp.h"
/* BIT field Constants
*/
#define BITS_GOB_STARTCODE 17
#define BITS_GROUP_NUMBER 5
#define BITS_GFID 2
#define BITS_GQUANT 5
#define MAX_GBSC_LOOKAHEAD_NUMBER 7
/* GBSC_VALUE - 0000 0000 0000 0000 - 1xxx xxxx xxxx xxxx
*/
#define GBSC_VALUE (0x00008000 >> (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 data_seg("IADATA1")
#pragma code_seg("IACODE1")
extern I32 H263DecodeGOBHeader(
T_H263DecoderCatalog FAR * DC,
BITSTREAM_STATE FAR * fpbsState,
U32 uAssumedGroupNumber)
{
U8 FAR * fpu8;
U32 uBitsReady = 0;
U32 uWork = 0;
I32 iReturn;
U32 uResult;
int iLookAhead;
U32 uData;
FX_ENTRY("H263DecodeGOBHeader")
// Decrement group number since the standard counts from 0
// but this decoder counts from 1.
--uAssumedGroupNumber;
DC->bGOBHeaderPresent=0;
if (uAssumedGroupNumber == 0) {
// Initialize the flag
DC->bFoundGOBFrameID = 0;
}
else
{
// 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);
iLookAhead = 0;
while (uResult != GBSC_VALUE)
{
uResult = uResult << 1;
uResult &= GetBitsMask[BITS_GOB_STARTCODE];
GET_ONE_BIT(fpu8, uWork, uBitsReady, uData);
uResult |= uData;
iLookAhead++;
if (iLookAhead >= MAX_GBSC_LOOKAHEAD_NUMBER) {
break; // only look ahead so far
}
}
if (uResult == GBSC_VALUE)
{
DC->bGOBHeaderPresent=1;
}
}
if (DC->bGOBHeaderPresent)
{
// GN
GET_FIXED_BITS((U32) BITS_GROUP_NUMBER, fpu8, uWork, uBitsReady,
uResult);
// ASSERT(uResult == uAssumedGroupNumber);
DC->uGroupNumber = uResult;
/* I am assuming that GOB numbers start at 1 because if it starts at
* zero it makes the GOB start code look like a picture start code.
* Correction by TRG: GOB numbers start at 0, but there can't be a
* GOB header for the 0th GOB.
*/
// ASSERT(DC->uGroupNumber > 0);
if (DC->uGroupNumber == 0)
{
ERRORMESSAGE(("%s: There can't be a GOB header for the 0th GOB\r\n", _fx_));
iReturn = ICERR_ERROR;
goto done;
}
// GLCI
if (DC->bCPM)
{
ERRORMESSAGE(("%s: CPM is not supported\r\n", _fx_));
iReturn = ICERR_ERROR;
goto done;
}
// GFID
GET_FIXED_BITS((U32) BITS_GFID, fpu8, uWork, uBitsReady, uResult);
if (DC->bFoundGOBFrameID)
{
if (uResult != DC->uGOBFrameID)
{
ERRORMESSAGE(("%s: GOBFrameID mismatch\r\n", _fx_));
iReturn = ICERR_ERROR;
goto done;
}
/* Should we also check it against the GOBFrameID of the previous
* picture when the PTYPE has not changed?
*/
}
DC->uGOBFrameID = uResult;
DC->bFoundGOBFrameID = 1;
// GQUANT
GET_FIXED_BITS((U32) BITS_GQUANT, fpu8, uWork, uBitsReady, uResult);
DC->uGQuant = uResult;
DC->uPQuant = uResult;
// Save the modified bitstream state
GET_BITS_SAVE_STATE(fpu8, uWork, uBitsReady, fpbsState)
}
else
{
// We can only assume
DC->uGroupNumber = uAssumedGroupNumber;
/* If we already found the GOBFrameID leave it alone. Otherwise
* clear it using a value indicating that it is not valid.
*/
if (! DC->bFoundGOBFrameID)
DC->uGOBFrameID = 12345678;
// Default the group Quantization to the picture Quant
DC->uGQuant = DC->uPQuant;
}
DEBUGMSG(ZONE_DECODE_GOB_HEADER, (" %s: HeaderPresent=%ld GN=%ld GFID=%ld GQ=%ld\r\n", _fx_, DC->bGOBHeaderPresent, DC->uGroupNumber, DC->uGOBFrameID, DC->uGQuant));
iReturn = ICERR_OK;
done:
return iReturn;
} /* end H263DecodeGOBHeader() */
#pragma code_seg()