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

📄 mp4_vld.c

📁 VC++视频开发实例集锦(包括“远程视频监控”"语音识别系统"等13个经典例子)
💻 C
字号:


#include <stdio.h>

#include "mp4_vars.h"

#include "getbits.h"
#include "mp4_vld.h"

/**
 * 
**/

/***/

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

	tab = vldTableB16(showbits(12));
	if (!tab) { 
		event.run   = 
		event.level = 
		event.last  = -1;
		return event;
	} 

	if (tab->val != ESCAPE) {
		event.run   = (tab->val >>  6) & 63;
		event.level =  tab->val        & 63;
		event.last  = (tab->val >> 12) &  1;
		event.level = getbits(1) ? -event.level : event.level;
	} else {

		switch (showbits(2)) {
			case 0x0 :  
			case 0x1 :  
				flushbits(1);
				tab = vldTableB16(showbits(12));  
				if (!tab) { 
					event.run   = 
					event.level = 
					event.last  = -1;
					return event;
				}
				event.run   = (tab->val >>  6) & 63;
				event.level =  tab->val        & 63;
				event.last  = (tab->val >> 12) &  1;
				lmax = vldTableB19(event.last, event.run);  
				event.level += lmax;
				event.level =  getbits(1) ? -event.level : event.level;
				break;
			case 0x2 :  
				flushbits(2);
				tab = vldTableB16(showbits(12));  
				if (!tab) { 
					event.run   = 
					event.level = 
					event.last  = -1;
					break;
				}
				event.run   = (tab->val >>  6) & 63;
				event.level =  tab->val        & 63;
				event.last  = (tab->val >> 12) &  1;
				rmax = vldTableB21(event.last, event.level);  
				event.run = event.run + rmax + 1;
				event.level = getbits(1) ? -event.level : event.level;
				break;
			case 0x3 :  
				flushbits(2);
				event.last  = getbits(1);
				event.run   = getbits(6);  
				getbits(1); 
				event.level = getbits(12); 
				
				event.level = (event.level & 0x800) ? (event.level | (-1 ^ 0xfff)) : event.level;
				getbits(1); 
				break;
		}
	}

	return event;
}

/***/

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

	tab = vldTableB17(showbits(12));
	if (!tab) { 
		event.run   = 
		event.level = 
		event.last  = -1;
		return event;
	} 
	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 {

		int mode = showbits(2);
		switch (mode) {
			case 0x0 :  
			case 0x1 : 
				flushbits(1);
				tab = vldTableB17(showbits(12));  
				if (!tab) { 
					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);  
				event.level += lmax;
				event.level = getbits(1) ? -event.level : event.level;
				break;
			case 0x2 :  
				flushbits(2);
				tab = vldTableB17(showbits(12));  
				if (!tab) { 
					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);  
				event.run = event.run + rmax + 1;
				event.level = getbits(1) ? -event.level : event.level;
				break;
			case 0x3 : 
				flushbits(2);
				event.last  = getbits(1);
				event.run   = getbits(6);   
				getbits(1); 
				event.level = getbits(12); 
				
				event.level = (event.level & 0x800) ? (event.level | (-1 ^ 0xfff)) : event.level;
				getbits(1); 
				break;
		}
	}

	return event;
}

/***/

event_t vld_event(int intraFlag) 
{
	if (intraFlag) {
		return vld_intra_dct();
	} else {
		return vld_inter_dct();
	}
}

/***/


int vldTableB19(int last, int run) {
	if (!last){ 
		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 { 
			return  0; 
		}
	} else {    
		if        (run ==  0) {
			return  8;
		} else if (run ==  1) {
			return  3;
		} else if (run <=  6) {
			return  2;
		} else if (run <= 20) {
			return  1;
		} else { 
			return  0; 
		}		
	}
}

/***/


int vldTableB20(int last, int run) {
	if (!last){ 
		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 {
			return  0; 
		}
	} else {   
		if        (run ==  0) {
			return  3;
		} else if (run ==  1) {
			return  2;
		} else if (run <= 40) {
			return  1;
		} else { 
			return  0; 
		}		
	}
}

/***/


int vldTableB21(int last, int level) {
	if (!last){ 
		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 { 
			return  0; 
		}
	} else {   
		if        (level ==  1) {
			return  20;
		} else if (level ==  2) {
			return  6;
		} else if (level ==  3) {
			return  1;
		} else if (level <=  8) {
			return  0;
		} else { 
			return  0; 
		}		
	}
}

/***/


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 { 
			return  0; 
		}
	} else {   
		if        (level ==  1) {
			return  40;
		} else if (level ==  2) {
			return  1;
		} else if (level ==  3) {
			return  0;
		} else { 
			return  0; 
		}		
	}
}

/***/

tab_type *vldTableB16(int code) {
	tab_type *tab;

	if (code >= 512) {
		tab = &(mp4_tables->tableB16_1[(code >> 5) - 16]);
	} else if (code >= 128) {
		tab = &(mp4_tables->tableB16_2[(code >> 2) - 32]);
	} else if (code >= 8) {
		tab = &(mp4_tables->tableB16_3[(code >> 0) - 8]);
	} else {
		
		return (tab_type *) NULL;
	}
	flushbits(tab->len);
	return tab;
}

/***/

tab_type *vldTableB17(int code) {
	tab_type *tab;

	if (code >= 512) {
		tab = &(mp4_tables->tableB17_1[(code >> 5) - 16]);
	} else if (code >= 128) {
		tab = &(mp4_tables->tableB17_2[(code >> 2) - 32]);
	} else if (code >= 8) {
		tab = &(mp4_tables->tableB17_3[(code >> 0) - 8]);
	} else {
	
		return (tab_type *) NULL;
	}
	flushbits(tab->len);
	return tab;
}

/***/

⌨️ 快捷键说明

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