table_vld.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 146 行

C
146
字号
/*-----------------------------------------*//* File : table_vld.c, utilities for jfif view *//* Author : Pierre Guerrier, march 1998	   *//*-----------------------------------------*/#include <stdlib.h>#include <stdio.h>#include "jpeg.h"/*--------------------------------------*//* private huffman.c defines and macros *//*--------------------------------------*//* Memory size of HTables; */#define MAX_SIZE(hclass)		((hclass)?162:14)/*--------------------------------------*//* some static structures for storage *//*--------------------------------------*/static unsigned char	DC_Table0[MAX_SIZE(DC_CLASS)],			DC_Table1[MAX_SIZE(DC_CLASS)];static unsigned char	AC_Table0[MAX_SIZE(AC_CLASS)],			AC_Table1[MAX_SIZE(AC_CLASS)];static unsigned char   *HTable[4] = {				      &DC_Table0[0], &DC_Table1[0],				      &AC_Table0[0], &AC_Table1[0]				    };static int	MinCode[4][16];static int	MaxCode[4][16];static int	ValPtr[4][16];/*----------------------------------------------------------*//* Loading of Huffman table, with leaves drop ability	    *//*----------------------------------------------------------*/intload_huff_tables(FILE *fi){  char aux;  int size, hclass, id, max;  int LeavesN, LeavesT, i;  int AuxCode;  size = get_size(fi); /* this is the tables' size */  size -= 2;  while (size>0) {    aux = fgetc(fi);    hclass = first_quad(aux);	/* AC or DC */    id = second_quad(aux);	/* table no */    if (id>1) {       fprintf(stderr, "\tERROR:\tBad HTable identity %d!\n",id);      return -1;    }    id = HUFF_ID(hclass, id);    if (verbose)      fprintf(stderr, "\tINFO:\tLoading Table %d\n", id);    size--;    LeavesT = 0;    AuxCode = 0;    for (i=0; i<16; i++) {      LeavesN = fgetc(fi);      ValPtr[id][i] = LeavesT;      MinCode[id][i] = AuxCode*2;      AuxCode = MinCode[id][i] + LeavesN;      MaxCode[id][i] = (LeavesN) ? (AuxCode-1) : (-1);       LeavesT += LeavesN;    }    size-=16;    if (LeavesT>MAX_SIZE(hclass)) {      max = MAX_SIZE(hclass);      fprintf(stderr, "\tWARNING:\tTruncating Table by %d symbols\n",	      LeavesT-max);    }    else max = LeavesT;    for (i=0; i<max; i++)      HTable[id][i] = fgetc(fi);	/* load in raw order */    for (i=max; i<LeavesT; i++) fgetc(fi);	/* skip if we don't load */    size -= LeavesT;    if (verbose)      fprintf(stderr, "\tINFO:\tUsing %d words of table memory\n", LeavesT);    /*      -- this is usefule to display the content of uploaded tables --      for(i=0; i<16; i++)      fprintf(stderr, "size %d, valptr = %d, min = %x, max = %x\n", i,      ValPtr[id][i],      MinCode[id][i], MaxCode[id][i]);      for(i=0; i<max; i++)      fprintf(stderr, "entry %d, symbol %X\n", i, HTable[id][i]);      */  }	/* loop on tables */  return 0;}/*-----------------------------------*//* extract a single symbol from file *//* using specified huffman table ... *//*-----------------------------------*/unsigned charget_symbol(FILE *fi, int select){  long code = 0;  int length;  int index;   for (length = 0; length < 16; length++) {    code = (2*code) | get_one_bit(fi);#ifdef SPY    trace_bits(1, 0);#endif    if (code <= MaxCode[select][length]) break;  }  index = ValPtr[select][length] + code - MinCode[select][length]; #ifdef SPY  trace_bits(0, 0);#endif  if (index < MAX_SIZE(select/2)) return HTable[select][index];  fprintf(stderr, "%ld:\tWARNING:\tOverflowing symbol table !\n", ftell(fi));  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?