Windows2003-3790/enduser/netmeeting/av/codecs/dec/dech261/cdd6.c
2020-09-30 16:53:55 +02:00

215 lines
6.2 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* File: sv_h261_cdd6.c */
/*****************************************************************************
** Copyright (c) Digital Equipment Corporation, 1995, 1997 **
** **
** All Rights Reserved. Unpublished rights reserved under the copyright **
** laws of the United States. **
** **
** The software contained on this media is proprietary to and embodies **
** the confidential technology of Digital Equipment Corporation. **
** Possession, use, duplication or dissemination of the software and **
** media is authorized only pursuant to a valid written license from **
** Digital Equipment Corporation. **
** **
** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. **
** Government is subject to restrictions as set forth in Subparagraph **
** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. **
******************************************************************************/
/* Some Modifications were done to incorporate a scaled IDCT scheme
on the DecodeXXX routines. These modifications are to
improve the performance -S.I.S. September 29, 1993.
*/
/*************************************************************
This file contains the routines to run-length encode the ac and dc
coefficients.
*************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "sv_intrn.h"
#include "SC_err.h"
#include "sv_h261.h"
#include "proto.h"
#ifndef WIN32
long __CVTTQ(double);
#endif /* !WIN32 */
/* Scaled stuff - S.I.S. */
extern const unsigned int tdzz[];
extern const unsigned int tzz[];
float static quantiscale[32][64];
float static qs[64];
float DCIscale;
/*PRIVATE*/
extern int bit_set_mask[];
extern int extend_mask[];
#define MYPI 3.1415926535897931
void DGenScaleMat()
{
double dbli, dblj;
float dij;
int i, j, k, quantindex;
for(k=0;k<64;k++)
quantiscale[0][k] = (float)1.0;
for(quantindex=1;quantindex<2;quantindex++) {
k=0;
for(i=0;i<8;i++) {
for(j=0;j<8;j++) {
dbli = MYPI*i/16.0;
dblj = MYPI*j/16.0;
dij = (float)(16.0*(float)cos(dbli)*cos(dblj));
if(i==0) dij = (float)(dij/sqrt(2.0));
if(j==0) dij = (float)(dij/sqrt(2.0));
qs[tdzz[k]] = (float)(1.0/dij);
k++;
}
}
}
DCIscale = (float)(4.0*quantiscale[1][0]);
}
SvStatus_t DecodeAC_Scale(SvH261Info_t *H261, ScBitstream_t *bs, int index,
int QuantUse, float *fmatrix)
{
float *mptr;
register int k, r, l, temp;
register unsigned short cb;
DHUFF *huff = H261->T1DHuff;
for(mptr=fmatrix+index; mptr<fmatrix+H261_BLOCKSIZE; mptr++)
*mptr = (float)0.0;
for(k=index; k<H261_BLOCKSIZE; k++) /* JPEG Mistake */
{
DecodeHuffB(bs, huff, r, l, cb, temp);
if (l & bit_set_mask[7])
l |= extend_mask[7];
k += r;
if (k < H261_BLOCKSIZE)
{
if (QuantUse&1)
temp = (l>0) ? ( ((l<<1)+1)*QuantUse ) : ( ((l<<1)-1)*QuantUse );
else
temp = (l>0) ? ( ((l<<1)+1)*QuantUse -1 ) : ( ((l<<1)-1)*QuantUse +1 );
fmatrix[tzz[k]] = temp*qs[k];
H261->NumberNZ++;
}
}
DecodeHuffA(bs, huff, r, cb, temp);
return(SvErrorVideoInput);
}
SvStatus_t CBPDecodeAC_Scale(SvH261Info_t *H261, ScBitstream_t *bs,
int index, int QuantUse, int BlockType,
float *fmatrix)
{
int k,r,l, temp;
float *mptr, *local_qptr;
register unsigned short cb;
DHUFF *huff = H261->T2DHuff;
local_qptr = &quantiscale[QuantUse][0];
for(mptr=fmatrix+index;mptr<fmatrix+H261_BLOCKSIZE;mptr++) {*mptr = (float)0.0;}
k = index;
DecodeHuffB(bs, huff, r, l, cb, temp);
if (l & bit_set_mask[7])
l |= extend_mask[7];
k += r;
if(((k==0) & (BlockType==1)))
fmatrix[0] = (float) l;
else {
if(QuantUse&1) {
temp = (l>0) ? ( ((l<<1)+1)*QuantUse ) : ( ((l<<1)-1)*QuantUse );
}
else {
temp = (l>0) ? ( ((l<<1)+1)*QuantUse-1) : ( ((l<<1)-1)*QuantUse+1);
}
fmatrix[tzz[k]] = temp*qs[k];
}
k++;
H261->NumberNZ++;
huff=H261->T1DHuff;
while(k<H261_BLOCKSIZE)
{
DecodeHuffB(bs, huff, r, l, cb, temp);
if (l & bit_set_mask[7]) {l |= extend_mask[7];}
k += r;
if (k < H261_BLOCKSIZE)
{
if(QuantUse&1)
{
temp = (l>0) ? ( ((l<<1)+1)*QuantUse ) : ( ((l<<1)-1)*QuantUse );
}
else
{
temp = (l>0) ? ( ((l<<1)+1)*QuantUse -1 ) : ( ((l<<1)-1)*QuantUse +1 );
}
fmatrix[tzz[k]] = temp*qs[k];
k++;
H261->NumberNZ++;
}
}
DecodeHuffA(bs, huff, r, cb, temp);
return (SvErrorVideoInput);
}
/*
** Function: DecodeDC_Scale()
** Purpose: Decodes a dc element from the stream.
*/
float DecodeDC_Scale(SvH261Info_t *H261, ScBitstream_t *bs,
int BlockType, int QuantUse)
{
int l, temp;
l = (int)ScBSGetBits(bs,8);
if (bs->EOI) return ((float)l);
if (l==255) {l=128;}
if (l!=1){H261->NumberNZ++;}
if(BlockType) {
return ((float) l);
}
else {
if(QuantUse&1) {
if(l>0) {
temp = ((l<<1)+1)*QuantUse;
return((float)temp*qs[0]);
}
else if(l<0) {
temp = ((l<<1)-1)*QuantUse;
return((float)temp*qs[0]);
}
}
else {
if(l>0) {
temp = ((l<<1)+1)*QuantUse -1;
return((float)temp*qs[0]);
}
else if(l<0) {
temp = ((l<<1)-1)*QuantUse +1;
return((float)temp*qs[0]);
}
}
}
return((float)0);
}
int DecodeDC(SvH261Info_t *H261, ScBitstream_t *bs)
{
int l;
l = (int)ScBSGetBits(bs,8);
if (l==255) {l=128;}
if (l!=1){H261->NumberNZ++;}
return(l);
}