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

431 lines
13 KiB
C

/* File: sv_h263_getvlc.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. **
******************************************************************************/
#include <stdio.h>
#include "sv_h263.h"
#include "sv_intrn.h"
#include "SC_err.h"
#include "proto.h"
/* From getvlc.h */
typedef struct {
int val, len;
} VLCtab;
typedef struct {
char run, level, len;
} DCTtab;
static VLCtab TMNMVtab0[] = {
{3,4}, {61,4}, {2,3}, {2,3}, {62,3}, {62,3},
{1,2}, {1,2}, {1,2}, {1,2}, {63,2}, {63,2}, {63,2}, {63,2}
};
static VLCtab TMNMVtab1[] = {
{12,10}, {52,10}, {11,10}, {53,10}, {10,9}, {10,9},
{54,9}, {54,9}, {9,9}, {9,9}, {55,9}, {55,9},
{8,9}, {8,9}, {56,9}, {56,9}, {7,7}, {7,7},
{7,7}, {7,7}, {7,7}, {7,7}, {7,7}, {7,7},
{57,7}, {57,7}, {57,7}, {57,7}, {57,7}, {57,7},
{57,7}, {57,7}, {6,7}, {6,7}, {6,7}, {6,7},
{6,7}, {6,7}, {6,7}, {6,7}, {58,7}, {58,7},
{58,7}, {58,7}, {58,7}, {58,7}, {58,7}, {58,7},
{5,7}, {5,7}, {5,7}, {5,7}, {5,7}, {5,7},
{5,7}, {5,7}, {59,7}, {59,7}, {59,7}, {59,7},
{59,7}, {59,7}, {59,7}, {59,7}, {4,6}, {4,6},
{4,6}, {4,6}, {4,6}, {4,6}, {4,6}, {4,6},
{4,6}, {4,6}, {4,6}, {4,6}, {4,6}, {4,6},
{4,6}, {4,6}, {60,6}, {60,6},{60,6},{60,6},
{60,6},{60,6},{60,6},{60,6},{60,6},{60,6},
{60,6},{60,6},{60,6},{60,6},{60,6},{60,6}
};
static VLCtab TMNMVtab2[] = {
{32,12}, {31,12}, {33,12}, {30,11}, {30,11}, {34,11},
{34,11}, {29,11}, {29,11}, {35,11}, {35,11}, {28,11},
{28,11}, {36,11}, {36,11}, {27,11}, {27,11}, {37,11},
{37,11}, {26,11}, {26,11}, {38,11}, {38,11}, {25,11},
{25,11}, {39,11}, {39,11}, {24,10}, {24,10}, {24,10},
{24,10}, {40,10}, {40,10}, {40,10}, {40,10}, {23,10},
{23,10}, {23,10}, {23,10}, {41,10}, {41,10}, {41,10},
{41,10}, {22,10}, {22,10}, {22,10}, {22,10}, {42,10},
{42,10}, {42,10}, {42,10}, {21,10}, {21,10}, {21,10},
{21,10}, {43,10}, {43,10}, {43,10}, {43,10}, {20,10},
{20,10}, {20,10}, {20,10}, {44,10}, {44,10}, {44,10},
{44,10}, {19,10}, {19,10}, {19,10}, {19,10}, {45,10},
{45,10}, {45,10}, {45,10}, {18,10}, {18,10}, {18,10},
{18,10}, {46,10}, {46,10}, {46,10}, {46,10}, {17,10},
{17,10}, {17,10}, {17,10}, {47,10}, {47,10}, {47,10},
{47,10}, {16,10}, {16,10}, {16,10}, {16,10}, {48,10},
{48,10}, {48,10}, {48,10}, {15,10}, {15,10}, {15,10},
{15,10}, {49,10}, {49,10}, {49,10}, {49,10}, {14,10},
{14,10}, {14,10}, {14,10}, {50,10}, {50,10}, {50,10},
{50,10}, {13,10}, {13,10}, {13,10}, {13,10}, {51,10},
{51,10}, {51,10}, {51,10}
};
static VLCtab MCBPCtab[] = {
{-1,0},
{255,9}, {52,9}, {36,9}, {20,9}, {49,9}, {35,8}, {35,8}, {19,8}, {19,8},
{50,8}, {50,8}, {51,7}, {51,7}, {51,7}, {51,7}, {34,7}, {34,7}, {34,7},
{34,7}, {18,7}, {18,7}, {18,7}, {18,7}, {33,7}, {33,7}, {33,7}, {33,7},
{17,7}, {17,7}, {17,7}, {17,7}, {4,6}, {4,6}, {4,6}, {4,6}, {4,6},
{4,6}, {4,6}, {4,6}, {48,6}, {48,6}, {48,6}, {48,6}, {48,6}, {48,6},
{48,6}, {48,6}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5},
{3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5},
{32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4},
{32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4},
{32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4},
{32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {16,4}, {16,4}, {16,4}, {16,4},
{16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4},
{16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4},
{16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4},
{16,4}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
{2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
{2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
{2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
{2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
{2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
{2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
{2,3}, {2,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
{1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
{1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
{1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
{1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
{1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
{1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
{1,3}, {1,3}, {1,3},
};
static VLCtab MCBPCtabintra[] = {
{-1,0},
{20,6}, {36,6}, {52,6}, {4,4}, {4,4}, {4,4},
{4,4}, {19,3}, {19,3}, {19,3}, {19,3}, {19,3},
{19,3}, {19,3}, {19,3}, {35,3}, {35,3}, {35,3},
{35,3}, {35,3}, {35,3}, {35,3}, {35,3}, {51,3},
{51,3}, {51,3}, {51,3}, {51,3}, {51,3}, {51,3},
{51,3},
};
static VLCtab CBPYtab[48] =
{ {-1,0}, {-1,0}, {9,6}, {6,6}, {7,5}, {7,5}, {11,5}, {11,5},
{13,5}, {13,5}, {14,5}, {14,5}, {15,4}, {15,4}, {15,4}, {15,4},
{3,4}, {3,4}, {3,4}, {3,4}, {5,4},{5,4},{5,4},{5,4},
{1,4}, {1,4}, {1,4}, {1,4}, {10,4}, {10,4}, {10,4}, {10,4},
{2,4}, {2,4}, {2,4}, {2,4}, {12,4}, {12,4}, {12,4}, {12,4},
{4,4}, {4,4}, {4,4}, {4,4}, {8,4}, {8,4}, {8,4}, {8,4},
};
VLCtab DCT3Dtab0[] = {
{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},
};
VLCtab DCT3Dtab1[] = {
{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},
};
VLCtab DCT3Dtab2[] = {
{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}, };
int sv_H263GetTMNMV(SvH263DecompressInfo_t *H263Info, ScBitstream_t *BSIn)
{
int code;
if (H263Info->trace)
printf("motion_code (");
if (ScBSGetBit(BSIn))
{
if (H263Info->trace)
printf("1): 0\n");
return 0;
}
if ((code = (int)ScBSPeekBits(BSIn, 12))>=512)
{
code = (code>>8) - 2;
ScBSSkipBits(BSIn, TMNMVtab0[code].len);
#if 0
if (H263Info->trace)
{
printf("0");
svH263Printbits(code+2,4,TMNMVtab0[code].len);
printf("): %d\n", TMNMVtab0[code].val);
}
#endif
return TMNMVtab0[code].val;
}
if (code>=128)
{
code = (code>>2) -32;
ScBSSkipBits(BSIn, TMNMVtab1[code].len);
#if 0
if (H263Info->trace)
{
printf("0");
svH263Printbits(code+32,10,TMNMVtab1[code].len);
printf("): %d\n",TMNMVtab1[code].val);
}
#endif
return TMNMVtab1[code].val;
}
if ((code-=5)<0)
{
if (!H263Info->quiet)
fprintf(stderr,"Invalid motion_vector code\n");
H263Info->expand=1;
return 0;
}
ScBSSkipBits(BSIn, TMNMVtab2[code].len);
#if 0
if (H263Info->trace)
{
printf("0");
svH263Printbits(code+5,12,TMNMVtab2[code].len);
printf("): %d\n",TMNMVtab2[code].val);
}
#endif
return TMNMVtab2[code].val;
}
int sv_H263GetMCBPC(SvH263DecompressInfo_t *H263Info, ScBitstream_t *BSIn)
{
int code;
if (H263Info->trace)
printf("MCBPC (");
code = (int)ScBSPeekBits(BSIn, 9);
if (code == 1) {
/* macroblock stuffing */
if (H263Info->trace)
printf("000000001): stuffing\n");
ScBSSkipBits(BSIn, 9);
return 255;
}
if (code == 0) {
if (!H263Info->quiet)
fprintf(stderr,"Invalid MCBPC code\n");
H263Info->expand = 1;
return 0;
}
if (code>=256)
{
ScBSSkipBits(BSIn, 1);
if (H263Info->trace)
printf("1): %d\n",0);
return 0;
}
ScBSSkipBits(BSIn, MCBPCtab[code].len);
#if 0
if (H263Info->trace)
{
svH263Printbits(code,9,MCBPCtab[code].len);
printf("): %d\n",MCBPCtab[code].val);
}
#endif
return MCBPCtab[code].val;
}
int sv_H263GetMODB(SvH263DecompressInfo_t *H263Info, ScBitstream_t *BSIn)
{
int code;
int MODB;
if (H263Info->trace)
printf("MODB (");
code = (int)ScBSPeekBits(BSIn, 2);
if (code < 2) {
if (H263Info->trace)
printf("0): MODB = 0\n");
MODB = 0;
ScBSSkipBits(BSIn, 1);
}
else if (code == 2) {
if (H263Info->trace)
printf("10): MODB = 1\n");
MODB = 1;
ScBSSkipBits(BSIn, 2);
}
else { /* code == 3 */
if (H263Info->trace)
printf("11): MODB = 2\n");
MODB = 2;
ScBSSkipBits(BSIn, 2);
}
return MODB;
}
int sv_H263GetMCBPCintra(SvH263DecompressInfo_t *H263Info, ScBitstream_t *BSIn)
{
int code;
if (H263Info->trace)
printf("MCBPCintra (");
code = (int)ScBSPeekBits(BSIn, 9);
if (code == 1) {
/* macroblock stuffing */
if (H263Info->trace)
printf("000000001): stuffing\n");
ScBSSkipBits(BSIn, 9);
return 255;
}
if (code < 8) {
if (!H263Info->quiet)
fprintf(stderr,"Invalid MCBPCintra code\n");
H263Info->expand = 1;
return 0;
}
code >>= 3;
if (code>=32)
{
ScBSSkipBits(BSIn, 1);
if (H263Info->trace)
printf("1): %d\n",3);
return 3;
}
ScBSSkipBits(BSIn, MCBPCtabintra[code].len);
#if 0
if (H263Info->trace)
{
svH263Printbits(code,6,MCBPCtabintra[code].len);
printf("): %d\n",MCBPCtabintra[code].val);
}
#endif
return MCBPCtabintra[code].val;
}
int sv_H263GetCBPY(SvH263DecompressInfo_t *H263Info, ScBitstream_t *BSIn)
{
int code;
if (H263Info->trace)
printf("CBPY (");
code = (int)ScBSPeekBits(BSIn, 6);
if (code < 2) {
if (!H263Info->quiet)
fprintf(stderr,"Invalid CBPY code\n");
H263Info->expand = 1;
return -1;
}
if (code>=48)
{
ScBSSkipBits(BSIn, 2);
if (H263Info->trace)
printf("11): %d\n",0);
return 0;
}
ScBSSkipBits(BSIn, CBPYtab[code].len);
#if 0
if (H263Info->trace)
{
svH263Printbits(code,6,CBPYtab[code].len);
printf("): %d\n",CBPYtab[code].val);
}
#endif
return CBPYtab[code].val;
}