⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vld.c

📁 代码实现了基于ARM7的MPEG-4视频解码器
💻 C
字号:
//********************************************
//File name: vld.c
//Author:    Anna
//Date:
//********************************************

#define ESCAPE 7167
#define NULL    0

extern unsigned int showbits (int n);
extern void flushbits (int n);
extern unsigned int getbits (int n);

extern int last;
extern int run;
extern int level;

extern int val;
extern int len;

int vldTableB16(int code);
int vldTableB19(int last, int run);
int vldTableB20(int last, int run);
int vldTableB21(int last, int level);
int vldTableB22(int last, int level);
extern int tableB16_1_val[112];
extern int tableB16_1_len[112];
extern int tableB16_2_val[96];
extern int tableB16_2_len[96];
extern int tableB16_3_val[120];
extern int tableB16_3_len[120];

typedef struct {
	int last;
	int run;
	int level;
} event_t;

typedef struct {
	int val, len;
} tab_type;

tab_type *vldTableB17(int code);
extern	tab_type tableB17_1[112];
extern	tab_type tableB17_2[96];
extern	tab_type tableB17_3[120];

void  vld_intra_dct() 
{
 
 int lmax,rmax;
 int tab_val;
 int x;
 x=showbits(12);
 
 // tab_val = vldTableB16(showbits(12));
  tab_val = vldTableB16(x);
  
  if (tab_val != ESCAPE) {
	   run = (val >>  6) & 63;
	   level =  val        & 63;
	   last  = (val >> 12) &  1;
	   level = getbits(1) ? -level : level;
	} else {
	  
	  int mode =showbits(2);
	  switch (mode){
	    case 0x0:
	    case 0x1:  //type 1
	         flushbits(1);
	         tab_val = vldTableB16(showbits(12));  /* use table B-16 */
	        
	         run   = (val >>  6) & 63;
			 level =  val        & 63;
			 last  = (val >> 12) &  1;
			 lmax = vldTableB19(last, run);  /* use table B-19 */
			 level += lmax;
			 level =  getbits(1) ? -level : level;
			 break;
			 
		 case 0x2: //type 2
		      flushbits(2);
			  tab_val = vldTableB16(showbits(12));  /* use table B-16 */
			  
			  run   = (val >>  6) & 63;
			  level =  val        & 63;
			  last  = (val >> 12) &  1;
			  rmax = vldTableB21(last, level);  /* use table B-21 */
			  run = run + rmax + 1;
			  level = getbits(1) ? -level : level;
		      break;
		      
		  case 0x3:  //type 3
		      flushbits(2);
			  last  = getbits(1);
			  run   = getbits(6);  /* table B-18 */ 
			  getbits(1); /* marker bit */
			  level = getbits(12); /* table B-18 */
		      /* sign extend level... */
			  level = (level & 0x800) ? (level | (-1 ^ 0xfff)) : level;
	          getbits(1); /* marker bit */
			  break;
	    
	   }//switch
	}//else  
}

/***/
event_t vld_inter_dct() 
{
	event_t event;
	tab_type *tab = (tab_type *) NULL;	
	int lmax, rmax;

	tab = vldTableB17(showbits(12));
	
	if (tab->val != ESCAPE) {
		event.run   = (tab->val >>  4) & 255;
		event.level =  tab->val        & 15;
		event.last  = (tab->val >> 12) &  1;
		event.level = getbits(1) ? -event.level : event.level;
	} else {
		/* this value is escaped - see para 7.4.1.3 */
		/* assuming short_video_header == 0 */
		int mode = showbits(2);
		switch (mode) {
			case 0x0 :  /* Type 1 */
			case 0x1 :  /* Type 1 */
				flushbits(1);
				tab = vldTableB17(showbits(12));  /* use table B-17 */
				if (!tab) { /* bad code */
					event.run   = 
					event.level = 
					event.last  = -1;
					return event;
				}
				event.run   = (tab->val >>  4) & 255;
				event.level =  tab->val        & 15;
				event.last  = (tab->val >> 12) &  1;
				lmax = vldTableB20(event.last, event.run);  /* use table B-20 */
				event.level += lmax;
				event.level = getbits(1) ? -event.level : event.level;
				break;
			case 0x2 :  /* Type 2 */
				flushbits(2);
				tab = vldTableB17(showbits(12));  /* use table B-16 */
				if (!tab) { /* bad code */
					event.run   = 
					event.level = 
					event.last  = -1;
					break;
				}
				event.run   = (tab->val >>  4) & 255;
				event.level =  tab->val        & 15;
				event.last  = (tab->val >> 12) &  1;
				rmax = vldTableB22(event.last, event.level);  /* use table B-22 */
				event.run = event.run + rmax + 1;
				event.level = getbits(1) ? -event.level : event.level;
				break;
			case 0x3 :  /* Type 3  - fixed length codes */
				flushbits(2);
				event.last  = getbits(1);
				event.run   = getbits(6);  /* table B-18 */ 
				getbits(1); /* marker bit */
				event.level = getbits(12); /* table B-18 */
				/* sign extend level... */
				event.level = (event.level & 0x800) ? (event.level | (-1 ^ 0xfff)) : event.level;
				getbits(1); /* marker bit */
				break;
		}//switch
	}//else

	return event;
}

/* Table B-19 -- ESCL(a), LMAX values of intra macroblocks */
int vldTableB19(int last, int run) {
	if (!last){ /* LAST == 0 */
		if        (run ==  0) {
			return 27;
		} else if (run ==  1) {
			return 10;
		} else if (run ==  2) {
			return  5;
		} else if (run ==  3) {
			return  4;
		} else if (run <=  7) {
			return  3;
		} else if (run <=  9) {
			return  2;
		} else if (run <= 14) {
			return  1;
		} else { /* illegal? */
			return  0; 
		}
	} else {    /* LAST == 1 */
		if        (run ==  0) {
			return  8;
		} else if (run ==  1) {
			return  3;
		} else if (run <=  6) {
			return  2;
		} else if (run <= 20) {
			return  1;
		} else { /* illegal? */
			return  0; 
		}		
	}
}

/* Table B-20 -- ESCL(b), LMAX values of inter macroblocks */
int vldTableB20(int last, int run) {
	if (!last){ /* LAST == 0 */
		if        (run ==  0) {
			return 12;
		} else if (run ==  1) {
			return  6;
		} else if (run ==  2) {
			return  4;
		} else if (run <=  6) {
			return  3;
		} else if (run <= 10) {
			return  2;
		} else if (run <= 26) {
			return  1;
		} else { /* illegal? */
			return  0; 
		}
	} else {    /* LAST == 1 */
		if        (run ==  0) {
			return  3;
		} else if (run ==  1) {
			return  2;
		} else if (run <= 40) {
			return  1;
		} else { /* illegal? */
			return  0; 
		}		
	}
}

/* Table B-21 -- ESCR(a), RMAX values of intra macroblocks */
int vldTableB21(int last, int level) {
	if (!last){ /* LAST == 0 */
		if        (level ==  1) {
			return 14;
		} else if (level ==  2) {
			return  9;
		} else if (level ==  3) {
			return  7;
		} else if (level ==  4) {
			return  3;
		} else if (level ==  5) {
			return  2;
		} else if (level <= 10) {
			return  1;
		} else if (level <= 27) {
			return  0;
		} else { /* illegal? */
			return  0; 
		}
	} else {    /* LAST == 1 */
		if        (level ==  1) {
			return  20;
		} else if (level ==  2) {
			return  6;
		} else if (level ==  3) {
			return  1;
		} else if (level <=  8) {
			return  0;
		} else { /* illegal? */
			return  0; 
		}		
	}
}

/* Table B-22 -- ESCR(b), RMAX values of inter macroblocks */
int vldTableB22(int last, int level) {
	if (!last){ /* LAST == 0 */
		if        (level ==  1) {
			return 26;
		} else if (level ==  2) {
			return 10;
		} else if (level ==  3) {
			return  6;
		} else if (level ==  4) {
			return  2;
		} else if (level <=  6) {
			return  1;
		} else if (level <= 12) {
			return  0;
		} else { /* illegal? */
			return  0; 
		}
	} else {    /* LAST == 1 */
		if        (level ==  1) {
			return  40;
		} else if (level ==  2) {
			return  1;
		} else if (level ==  3) {
			return  0;
		} else { /* illegal? */
			return  0; 
		}		
	}
}



/***/
int vldTableB16(int code) {
 
 if (code >= 512) {
		val = tableB16_1_val[(code >> 5) - 16];
		len = tableB16_1_len[(code >> 5) - 16];
		
	} else if (code >= 128) {
	
		val = tableB16_2_val[(code >> 2) - 32];
		len =  tableB16_2_len[(code >> 2) - 32];
		
	} else if (code >= 8) {
	
		val = tableB16_3_val[(code >> 0) - 8];
		len = tableB16_3_len[(code >> 0) - 8];
	} 
	
	flushbits(len);
	
	return val;
 
}

/***/
tab_type *vldTableB17(int code) {
	tab_type *tab;
	int m=0;

	if (code >= 512) {
		tab = &(tableB17_1[(code >> 5) - 16]);
	} else if (code >= 128) {
		tab = &(tableB17_2[(code >> 2) - 32]);
	} else if (code >= 8) {
		tab = &(tableB17_3[(code >> 0) - 8]);
	} else {

		/* invalid Huffman code */
		return (tab_type *) NULL;
	}
	flushbits(tab->len);
	return tab;
}

⌨️ 快捷键说明

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