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

📄 tmndec.c

📁 视频的h263解码
💻 C
📖 第 1 页 / 共 2 页
字号:
		break;	}			mb_width = horizontal_size/16;	mb_height = vertical_size/16;	coded_picture_width = horizontal_size;	coded_picture_height = vertical_size;	chrom_width =  coded_picture_width>>1;	chrom_height = coded_picture_height>>1;	blk_cnt = 6;		for (cc=0; cc<3; cc++) {//为什么是3呢???????????		if (cc==0)			size = coded_picture_width*coded_picture_height;		else			size = chrom_width*chrom_height;				if (!(refframe[cc] = (unsigned char *)malloc(size)))			error("malloc failed\n");				if (!(oldrefframe[cc] = (unsigned char *)malloc(size)))			error("malloc failed\n");				if (!(bframe[cc] = (unsigned char *)malloc(size)))			error("malloc failed\n");	}		for (cc=0; cc<3; cc++) {		if (cc==0) {			size = (coded_picture_width+64)*(coded_picture_height+64);			if (!(edgeframeorig[cc] = (unsigned char *)malloc(size)))				error("malloc failed\n");			edgeframe[cc] = edgeframeorig[cc] + (coded_picture_width+64) * 32 + 32;		}		else {			size = (chrom_width+32)*(chrom_height+32);			if (!(edgeframeorig[cc] = (unsigned char *)malloc(size)))				error("malloc failed\n");			edgeframe[cc] = edgeframeorig[cc] + (chrom_width+32) * 16 + 16;		}	}		if (expand) {		for (cc=0; cc<3; cc++) {			if (cc==0)				size = coded_picture_width*coded_picture_height*4;			else				size = chrom_width*chrom_height*4;						if (!(exnewframe[cc] = (unsigned char *)malloc(size)))				error("malloc failed\n");		}	}		/* Clear output file for concatenated storing */	if (outtype == T_YUV_CONC) {//得到正常的命令清空文件		if ((cleared = fopen(outputname,"wb")) == NULL) 			error("couldn't clear outputfile\n");		else			fclose(cleared);	}	/* IDCT */
	if (refidct)		init_idctref();	else		init_idct();	#ifdef DISPLAY	if (outtype==T_X11) {		init_display("");	}#endif#ifdef WINDOWS	if (outtype==T_WIN) {		initDisplay(coded_picture_width, coded_picture_height);	}#endif		}void error(text)char *text;{	fprintf(stderr,text);	exit(1);}
//出错处理程序/* trace output */void printbits(code,bits,len)int code,bits,len;{	int i;	for (i=0; i<len; i++)		printf("%d",(code>>(bits-1-i))&1);}/* option processing */static void options(argcp,argvp)//处理输入的命令行int *argcp;char **argvp[];{	while (*argcp>1 && (*argvp)[1][0]=='-')	{		while ((*argvp)[1][1])		{			switch (toupper((*argvp)[1][1]))			{#ifdef USE_TIME			case 'F':				framerate = getval(*argvp);				break;#endif			case 'V':				verbose = getval(*argvp);				break;			case 'O':				outtype = getval(*argvp);//确定输出的格式				break;			case 'R':				refidct = 1;				break;			case 'L':				loopflag = 1;//若执行此命令则输出分立的.y .u .v文件				break;			case 'X':				expand = 1;				break;			case 'T':				trace = 1;				break;			case 'Q':				quiet = 1;				break;			default:				fprintf(stderr,"undefined option -%c ignored\n",(*argvp)[1][1]);			}						(*argvp)[1]++;		}				(*argvp)++;		(*argcp)--;	}			if (outtype != T_X11 && outtype != T_WIN) {		loopflag = 0;  /* No looping for output to file */
		//如果给出的输出类型outtype==0即设loopflag = 0可以正常执行解码过程#ifdef USE_TIME		framerate = 0; /* No delay necessary when output to file */#endif	}#ifdef DISPLAY	if (outtype==T_X11)	{		(*argcp)++; /* fake outfile parameter */	}#endif#ifdef WINDOWS	if (outtype==T_WIN)	{		(*argcp)++; /* fake outfile parameter */	}#endif//以上是对输出类型即是否解码成yuv文件		if (*argcp!=3 && *argcp!=4)//对命令的出错处理	{		printf("\n%s\n",version);		printf("Usage:   tmndecode {options} bitstream {outputfilename%%d}\n\			   Options: -vn  verbose output (n: level)\n\			   -on  output format \n\			   n=0 : YUV\n\			   n=1 : SIF\n\			   n=2 : TGA\n\			   n=3 : PPM\n");#ifdef DISPLAY			   printf("\				   n=4 : X11 Display\n");#endif				   printf("\					   n=5 : YUV concatenated\n");#ifdef WINDOWS					   printf("\						   n=6 : Windows 95/NT Display\n");#endif						   printf("\								  You have to choose one output format!\n\								  -q   disable warnings to stderr\n\								  -r   use double precision reference IDCT\n\								  -t   enable low level tracing\n");#ifdef DISPLAY								  printf("\									  -x   interpolate pictures to double size before display\n");#endif#ifdef USE_TIME									  printf("\											 -fn  frame rate\n\											 n=0  : as fast as possible\n\											 n=99 : read frame rate from bitstream (default)\n");#endif    #ifdef DISPLAY											 printf("\												 -l   loop sequence\n");#endif											 exit(0);	}}//命令出错则不进行解码,直接返回static int getval(argv)char *argv[];{	int val;	if (sscanf(argv[1]+2,"%d",&val)!=1)		return 0;		while (isdigit(argv[1][2]))		argv[1]++;		return val;}#ifdef USE_TIME#ifndef WINDOWS/* Unix version */void doframerate(int pb){	struct timeval tfdiff;	const float REF_FRAME_RATE = 29.97;		/* Compute desired frame rate */	if (framerate <= 0)		return;		if (framerate != 99) {		tftarget.tv_usec += 1000000 / framerate;	}	else {		if (pb) {			tftarget.tv_usec += 1000000 / (REF_FRAME_RATE/trb);		}		else {			tftarget.tv_usec += 1000000 / (REF_FRAME_RATE/(trd-trb));		}	}		/* this is where we should be */	if (tftarget.tv_usec >= 1000000)	{		tftarget.tv_usec -= 1000000;		tftarget.tv_sec++;	}		/* this is where we are */	gettimeofday(&tfdiff,(struct timezone *)NULL);		tfdiff.tv_usec = tftarget.tv_usec - tfdiff.tv_usec;	tfdiff.tv_sec  = tftarget.tv_sec  - tfdiff.tv_sec;	if (tfdiff.tv_usec < 0)	{		tfdiff.tv_usec += 1000000;		tfdiff.tv_sec--;	}		/* See if we are already lagging behind */	if (tfdiff.tv_sec < 0 || (tfdiff.tv_sec == 0 && tfdiff.tv_usec <= 0))		return;		/* Spin for awhile */	select(0,NULL,NULL,NULL,&tfdiff);}#else /* Win32 version */void doframerate(int pb){	DWORD currentTime;	int diffTime;	const float REF_FRAME_RATE = (float)29.97;		/* Compute desired frame rate */
	//估算帧频	if (framerate <= 0)		return;		if (framerate != 99) {		targetTime += 1000 / framerate;	}	else {		if (pb) {			targetTime += (int)(1000 / (REF_FRAME_RATE/trb));		}		else {			targetTime += (int)(1000 / (REF_FRAME_RATE/(trd-trb)));		}	}		/* this is where we are */	currentTime = timeGetTime();			diffTime = targetTime - currentTime;		/* See if we are already lagging behind */	if (diffTime <= 0)		return;		/* Spin for awhile */	Sleep(diffTime);   	/* this is not a very accurate timer */}#endif#endif

⌨️ 快捷键说明

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