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

📄 csc.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
字号:
/******************************************************************** Copyright (c) 2002 Sigma Designs Inc. All rights reserved. ********************************************************************//*  @file   csc.c  See licensing details in LICENSING file  */#include "common.h"#define START 0#define END 65536#define PRECISION 20// u=0; while [ $u -lt 21 ]; do echo $u; u=$[$u+1]; done |awk '{printf("%d,\n",65536*($1/20)^2.2);}'static unsigned long powertwodottwotable[PRECISION+1]={0,89,413,1008,1899,3104,4636,6507,8729,11312,14263,17590,21301,25403,29901,34802,40112,45835,51977,58542,65536};static unsigned long invertofpowertwodottwotable[PRECISION+1]={0,16792,23010,27667,31533,34899,37914,40666,43211,45587,47824,49941,51956,53881,55727,57502,59214,60869,62471,64025,65536};// computes y/65536=f(x/65536) with 0<=x,y<65536 with f=^2.2 or ^(1/2.2) given as a unsigned long table (have to code the 65536 case)static unsigned short compute_f(unsigned long beg,unsigned long end,unsigned long prec,unsigned long *table,unsigned short x){	long a,b,fa,fb,entry;		if (beg==end) {		printk("memory corrupted beg=%ld end=%ld\n",beg,end);		return;	}	entry=(x-beg)*prec/(end-beg);	if ((entry<0)||(entry>=20)) {		printk("memory corrupted x=%hd beg=%ld end=%ld prec=%ld\n",x,beg,end,prec);		return;	}	a=entry*(end-beg)/prec+beg;	b=(entry+1)*(end-beg)/prec+beg;	fa=table[entry];	fb=table[entry+1];	return (unsigned short)(fa+(fb-fa)*(x-a)/(b-a));}// see video demystified page 43static void gammacorrectedrgbtoyuv(unsigned short R,unsigned short G,unsigned short B,unsigned short *y,unsigned short *u,unsigned short *v){	long yraw,uraw,vraw;		yraw=( 257*R  +504*G + 98*B)/1000 + RANGE8TO16(16);	uraw=(-148*R  -291*G +439*B)/1000 + RANGE8TO16(128);	vraw=( 439*R  -368*G - 71*B)/1000 + RANGE8TO16(128);	/* Obviously the computation of yraw garantees >= RANGE8TO16(16) ;-)	   This is also true for uraw and vraw */		*y=MAX(MIN(yraw,RANGE8TO16(235)),RANGE8TO16(16)); 	*u=MAX(MIN(uraw,RANGE8TO16(240)),RANGE8TO16(16));	*v=MAX(MIN(vraw,RANGE8TO16(240)),RANGE8TO16(16));}static void yuvtorgbgammacorrected(unsigned short y,unsigned short u,unsigned short v,unsigned short *R,unsigned short *G,unsigned short *B){	long Rraw,Graw,Braw;	long ym=y-RANGE8TO16(16),um=u-RANGE8TO16(128),vm=v-RANGE8TO16(128);	Rraw=(1164*ym        +1596*vm)/1000;	Graw=(1164*ym+ 392*um- 813*vm)/1000;	Braw=(1164*ym+2017*um        )/1000;	*R=MAX(0,MIN(Rraw,RANGE8TO16(255)));	*G=MAX(0,MIN(Graw,RANGE8TO16(255)));	*B=MAX(0,MIN(Braw,RANGE8TO16(255)));}void vgargbtotvyuv(unsigned short R,unsigned short G,unsigned short B,unsigned short *y,unsigned short *u,unsigned short *v){	unsigned short Rc,Gc,Bc;	Rc=compute_f(START,END,PRECISION,powertwodottwotable,R);	Gc=compute_f(START,END,PRECISION,powertwodottwotable,G);	Bc=compute_f(START,END,PRECISION,powertwodottwotable,B);	gammacorrectedrgbtoyuv(Rc,Gc,Bc,y,u,v);}void tvyuvtovgargb(unsigned short y,unsigned short u,unsigned short v,unsigned short *R,unsigned short *G,unsigned short *B){	unsigned short Ruc,Guc,Buc;	yuvtorgbgammacorrected(y,u,v,&Ruc,&Guc,&Buc);	*R=compute_f(START,END,PRECISION,invertofpowertwodottwotable,Ruc);	*G=compute_f(START,END,PRECISION,invertofpowertwodottwotable,Guc);	*B=compute_f(START,END,PRECISION,invertofpowertwodottwotable,Buc);}

⌨️ 快捷键说明

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