Ejemplo n.º 1
0
static NOINLINE void Rescale(planes data, fix_t v, int ramp, size_t length, int channels)
{
	fix_t dv;
	int n;

	if (length < 4*sizeof(fix_t)) return;
	while ((sizeof(fix_t)<<ramp) > length) --ramp;

#ifdef FIXED_POINT
	dv = (v-FIXC(1)) >> ramp;
#else
	dv = (fix_t)ldexp(v-FIXC(1),-ramp);
#endif

	for (n=0;n<channels;++n)
	{
		fix_t* i=data[n];
		fix_t* ie=i+(1<<ramp);

		v = FIXC(1);
		for (;i!=ie;++i,v+=dv)
			i[0] = fix_mul(i[0],v);

		ie = (fix_t*)((uint8_t*)ie+length)-(1<<ramp);
		for (;i!=ie;i+=4)
		{
			i[0] = fix_mul(i[0],v);
			i[1] = fix_mul(i[1],v);
			i[2] = fix_mul(i[2],v);
			i[3] = fix_mul(i[3],v);
		}
	}
}
Ejemplo n.º 2
0
/// <summary>
/// Inverse irreversible MCT.
/// </summary>
void mct_decode_real(int *c0, int *c1, int *c2, int n)
{
    int i;
    for (i=0; i<n; i++) {
        int y, u, v, r, g, b;
        y=c0[i]; u=c1[i]; v=c2[i];
        r=y+fix_mul(v, 11485);
        g=y-fix_mul(u, 2819)-fix_mul(v, 5850);
        b=y+fix_mul(u, 14516);
        c0[i]=r; c1[i]=g; c2[i]=b;
    }
}
Ejemplo n.º 3
0
static NOINLINE void UpdateScale(equalizer* p)
{
	fix_t Scale;
	int n;

	if (!p->Attenuate)
		p->Scale=FIXC(1.);
	if (p->Scale<FIXC(1./65556))
		p->Scale=FIXC(1./65556);
	Scale = fix_mul(p->Scale,p->ScalePreamp);
	p->ScaleFinal = FIXFAST_BSHIFT(Scale);
	for (n=0;n<MAXFILTER;++n)
		p->Filter[n].alpha = ACCFAST_BSHIFT(fix_mul(p->Filter[n].alpha0,Scale));
}
Ejemplo n.º 4
0
/// <summary>
/// Foward irreversible MCT.
/// </summary>
void mct_encode_real(int *c0, int *c1, int *c2, int n)
{
    int i;
    for (i=0; i<n; i++) {
        int r, g, b, y, u, v;
        r=c0[i]; g=c1[i]; b=c2[i];
        y=fix_mul(r, 2449)+fix_mul(g, 4809)+fix_mul(b, 934);
        u=-fix_mul(r, 1382)-fix_mul(g, 2714)+fix_mul(b, 4096);
        v=fix_mul(r, 4096)-fix_mul(g, 3430)-fix_mul(b, 666);
        c0[i]=y; c1[i]=u; c2[i]=v;
    }
}
Ejemplo n.º 5
0
static NOINLINE int UpdateParam(equalizer* p)
{
	if (p->Codec.In.Format.Type == PACKET_AUDIO)
	{
		int n;
		const eqfilter *src;
		eqfilter *dst;

		src = Band44100;
		dst = p->Filter;
		for (n=0;n<MAXFILTER;++n,++src,++dst)
		{
			dst->alpha0 = fix_mul(src->alpha,Pow(p->Eq[n])-FIXC(1.));
			dst->beta = ACCFAST_BSHIFT(src->beta);
			dst->gamma = ACCFAST_BSHIFT(src->gamma);
		}

		p->ScalePreamp = Pow(p->Amplify);
		UpdateScale(p);
	}
	return ERR_NONE;
}
Ejemplo n.º 6
0
static int Process(equalizer* p, const packet* Packet, const flowstate* State)
{
	fix_t* s;
	int n,DstLength,SrcLength,Channels;
	if (!Packet)
		return ERR_NEED_MORE_DATA;

	Channels = p->Codec.In.Format.Format.Audio.Channels;
	SrcLength = Packet->Length;
	DstLength = PCMDstLength(p->PCM,SrcLength);
	if (DstLength*Channels*2 > p->Buffer.Allocated)
	{
		uint8_t* Data;
		if (!BufferAlloc(&p->Buffer,DstLength*Channels*2,1024))
			return ERR_OUT_OF_MEMORY;

		Data = p->Buffer.Data;
		for (n=0;n<Channels;++n)
		{
			p->Codec.Packet.Data[n] = Data; 
			Data += DstLength;
			p->Tmp[n] = Data; 
			Data += DstLength;
		}
	}

	PCMConvert(p->PCM,*(planes*)&p->Codec.Packet.Data,Packet->Data,&DstLength,&SrcLength,SPEED_ONE,256);
	p->Codec.Packet.RefTime = Packet->RefTime;
	p->Codec.Packet.Length = DstLength;

	s = p->State[0];
	for (n=0;n<Channels;++n)
	{
		eqfilter* f;
		fix_t* i=(fix_t*)p->Codec.Packet.Data[n];
		fix_t* ie=(fix_t*)((uint8_t*)i+DstLength);
		fix_t* j=(fix_t*)p->Tmp[n];
		fix_t a,b,c,d,e;
		e = p->ScaleFinal;
		a = s[2];
		b = s[1];
		c = s[0];
		for (ie-=3;i<ie;i+=4,j+=4)
		{
			d=i[0];
			i[0]=fixfast_mul(c,e);
			j[0]=ACCFAST_ASHIFT(c-a,ACCFAST_ADJUST);
			a=i[1];
			i[1]=fixfast_mul(d,e);
			j[1]=ACCFAST_ASHIFT(d-b,ACCFAST_ADJUST);
			b=i[2];
			i[2]=fixfast_mul(a,e);
			j[2]=ACCFAST_ASHIFT(a-c,ACCFAST_ADJUST);
			c=i[3];
			i[3]=fixfast_mul(b,e);
			j[3]=ACCFAST_ASHIFT(b-d,ACCFAST_ADJUST);
		}
		for (ie+=3;i!=ie;++i,++j)
		{
			j[0]=ACCFAST_ASHIFT(c-a,ACCFAST_ADJUST);
			a=b;
			b=c;
			c=i[0];
			i[0]=fixfast_mul(b,e);
		}
		s[2] = a;
		s[1] = b;
		s[0] = c;
		s += 3;

		for (f=p->Filter;f!=p->Filter+MAXFILTER;f+=2,s+=2*2)
			if (f[0].alpha!=0 || f[1].alpha!=0)
			{
				accfast_var(v0);
				accfast_var(v1);

				i=(fix_t*)p->Codec.Packet.Data[n];
				ie=(fix_t*)((uint8_t*)i+DstLength);
				j=(fix_t*)p->Tmp[n];
				a = s[0];
				c = s[1];
				b = s[2];
				d = s[3];
				for (--ie;i<ie;i+=2,j+=2)
				{
					accfast_mul(v0,a,f[0].beta);
					accfast_mul(v1,b,f[1].beta);
					accfast_mla(v0,j[0],f[0].alpha);
					accfast_mla(v1,j[0],f[1].alpha);
					accfast_mla(v0,c,f[0].gamma);
					accfast_mla(v1,d,f[1].gamma);
					a = accfast_get(v0,ACCFAST_ADJUST);
					b = accfast_get(v1,ACCFAST_ADJUST);
					i[0] += a+b;
					a = ACCFAST_ASHIFT(a,ACCFAST_ADJUST);
					b = ACCFAST_ASHIFT(b,ACCFAST_ADJUST);
					accfast_mul(v0,c,f[0].beta);
					accfast_mul(v1,d,f[1].beta);
					accfast_mla(v0,j[1],f[0].alpha);
					accfast_mla(v1,j[1],f[1].alpha);
					accfast_mla(v0,a,f[0].gamma);
					accfast_mla(v1,b,f[1].gamma);
					c = accfast_get(v0,ACCFAST_ADJUST);
					d = accfast_get(v1,ACCFAST_ADJUST);
					i[1] += c+d;
					c = ACCFAST_ASHIFT(c,ACCFAST_ADJUST);
					d = ACCFAST_ASHIFT(d,ACCFAST_ADJUST);
				}
				if (i==ie)
				{
					accfast_mul(v0,a,f[0].beta);
					accfast_mul(v1,b,f[1].beta);
					accfast_mla(v0,j[0],f[0].alpha);
					accfast_mla(v1,j[0],f[1].alpha);
					accfast_mla(v0,c,f[0].gamma);
					accfast_mla(v1,d,f[1].gamma);
					a = c; c = accfast_get(v0,ACCFAST_ADJUST);
					b = d; d = accfast_get(v1,ACCFAST_ADJUST);
					i[0] += c+d;
					c = ACCFAST_ASHIFT(c,ACCFAST_ADJUST);
					d = ACCFAST_ASHIFT(d,ACCFAST_ADJUST);
				}
				s[0] = a;
				s[1] = c;
				s[2] = b;
				s[3] = d;
			}
	}

	if (p->Attenuate)
	{
		fix_t Max = 0;
		for (n=0;n<Channels;++n)
		{
			fix_t* i=(fix_t*)p->Codec.Packet.Data[n];
			fix_t* ie=(fix_t*)((uint8_t*)i+DstLength);
			for (;i!=ie;++i)
			{
				fix_t v = *i;
				if (v<0) v=-v;
				if (v>Max) Max=v;
			}
		}

		if (Max > FIXC(1.))
		{
			Max = fix_mul(fix_1div(Max),FIXC(15./16));
			Rescale(*(planes*)&p->Codec.Packet.Data,Max,5,DstLength,Channels);
			
			p->Scale = fix_mul(p->Scale,Max);
			UpdateScale(p);
		}
		else
		if (Max < FIXC(6./8) && p->Scale < FIXC(1-1./256))
		{
			Max = FIXC(32./31);
			if (fix_mul(p->Scale,Max) > FIXC(1))
				Max = fix_1div(p->Scale);
			Rescale(*(planes*)&p->Codec.Packet.Data,Max,10,DstLength,Channels);
		
			p->Scale = fix_mul(p->Scale,Max);
			UpdateScale(p);
		}
	}
	else
	if (p->Scale != FIXC(1.))
		UpdateScale(p);

	return ERR_NONE;
}
Ejemplo n.º 7
0
void Ibniz::parse(QImage *src, const QString &program, int cx, int cy)
{
	QByteArray str_data;
	char *str;

	fix_t a, b, c;
	fix_t value;

	int x;
	int y;

	value = 0;

	str_data = program.toAscii();
	str = str_data.data();

	while ( *str )
	{

		switch ( *str )
		{
			/* arithmetic */
			case '+':
				b = stack.pop();
				stack.push( fix_add(stack.pop(), b) );
				break;
			case '-':
				b = stack.pop();
				stack.push( fix_sub(stack.pop(), b) );
				break;
			case '*':
				b = stack.pop();
				stack.push( fix_mul(stack.pop(), b) );
				break;
			case '/':
				b = stack.pop();
				stack.push( fix_div(stack.pop(), b) );
				break;
			case '%':
				b = stack.pop();
				stack.push( fix_mod(stack.pop(), b) );
				break;

			case 'q':
				stack.push( fix_sqrt(stack.pop()) );
				break;

			/* trigonometry */
			case 'a':
				b = stack.pop();
				stack.push( fix_atan2(stack.pop(), b) );
				break;
			case 's':
				stack.push( fix_sin(stack.pop()) );
				break;
			case 'c':
				stack.push( fix_cos(stack.pop()) );
				break;
			case 'j': /* Y X - r phi */
				b = stack.pop();
				a = stack.pop();

				stack.push( fix_sqrt( fix_add(fix_mul(b, b), fix_mul(a, a)) ) );
				stack.push( fix_atan2(b, a) );
				break;

			case 'J': /* r phi - Y X */
				b = stack.pop();
				a = stack.pop();

				stack.push(fix_mul(a, fix_sin(b)));
				stack.push(fix_mul(a, fix_cos(b)));
				break;

			case 'b':
				b = stack.pop();
				stack.push( (b >= 0) ? b : -b );
				break;

			case '&':
				b = stack.pop();
				stack.push( stack.pop() & b );
				break;
			case '|':
				b = stack.pop();
				stack.push( stack.pop() | b );
				break;
			case '^':
				b = stack.pop();
				stack.push( stack.pop() ^ b );
				break;
			case '~':
				stack.push( ~stack.pop() );
				break;

			/*case '>':
				STACK_TOP = (*b > 0) ? *b : 0;
				break;
			case '<':
				STACK_TOP = (*b < 0) ? *b : 0;
				break;
			case '=':
				STACK_TOP = (*b == 0) ? 1 : 0;
				break;*/

			/* stack manipulation */
			case 'd':
				stack.push( stack.top() );
				break;
			case 'p':
				stack.pop();
				break;
			case 'x':
				b = stack.pop();
				a = stack.pop();

				stack.push(b);
				stack.push(a);
				break;
			case 'v':
				c = stack.pop();
				b = stack.pop();
				a = stack.pop();

				stack.push(b);
				stack.push(c);
				stack.push(a);
				break;

			case 'G':
				b = stack.pop();
				a = stack.pop();

				x = FIX_TO_INT(b) + cx;
				y = FIX_TO_INT(a) + cy;

				if (x >= 0 && x < src->width() && y >= 0 && y < src->height() )
					stack.push( src->pixel(x, y) );
				else
					stack.push( 0 );
				break;

			/* data */
			case '0':case '1':case '2':case '3':case '4':
			case '5':case '6':case '7':case '8':case '9':
				value <<= 4;
				value |= *str - '0';
				break;
			case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':
				value <<= 4;
				value |= *str - 'A' + 0xA;
				break;

			case '.':
				stack.push(value);
				value = 0;
				break;

			case ' ':
				/* nop */
				break;
		}

		str++;
	}
}