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
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()
|
|
|
|
|