📄 csc.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 + -