📄 esram.c
字号:
*scf++ = getbits_fast(num0);
*scf++ = getbits_fast(num0);
*scf++ = getbits_fast(num0);
*scf++ = getbits_fast(num0);
*scf++ = getbits_fast(num0);
*scf++ = getbits_fast(num0);
numbits += num0 * 6;
}
else {
*scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
*scf++ = 0; *scf++ = 0; *scf++ = 0;
}
if(!(scfsi & 0x4)) {
// for (i=5;i;i--)
*scf++ = getbits_fast(num0);
*scf++ = getbits_fast(num0);
*scf++ = getbits_fast(num0);
*scf++ = getbits_fast(num0);
*scf++ = getbits_fast(num0);
numbits += num0 * 5;
}
else {
*scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
*scf++ = 0; *scf++ = 0;
}
if(!(scfsi & 0x2)) {
// for(i=5;i;i--)
*scf++ = getbits_fast(num1);
*scf++ = getbits_fast(num1);
*scf++ = getbits_fast(num1);
*scf++ = getbits_fast(num1);
*scf++ = getbits_fast(num1);
numbits += num1 * 5;
}
else {
*scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
*scf++ = 0; *scf++ = 0;
}
if(!(scfsi & 0x1)) {
// for (i=5;i;i--)
*scf++ = getbits_fast(num1);
*scf++ = getbits_fast(num1);
*scf++ = getbits_fast(num1);
*scf++ = getbits_fast(num1);
*scf++ = getbits_fast(num1);
numbits += num1 * 5;
}
else {
*scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
*scf++ = 0; *scf++ = 0;
}
}
*scf++ = 0; /* no l[21] in original sources */
}
return numbits;
}
#endif
/*
* new DCT12
*/
#if 1
void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts)
{
#define DCT12_PART1 \
in5 = in[5*3]; \
in5 += (in4 = in[4*3]); \
in4 += (in3 = in[3*3]); \
in3 += (in2 = in[2*3]); \
in2 += (in1 = in[1*3]); \
in1 += (in0 = in[0*3]); \
\
in5 += in3; in3 += in1; \
\
in2 = MUL24(in2, COS6_1); \
in3 = MUL24(in3, COS6_1); \
#define DCT12_PART2 \
in0 += MUL24(in4, COS6_2); \
\
in4 = in0 + in2; \
in0 -= in2; \
\
in1 += MUL24(in5, COS6_2); \
\
in5 = MUL24((in1 + in3), tfcos12[0]); \
in1 = MUL24((in1 - in3), tfcos12[2]); \
\
in3 = in4 + in5; \
in4 -= in5; \
\
in2 = in0 + in1; \
in0 -= in1;
{
real in0,in1,in2,in3,in4,in5;
register real *out1 = rawout1;
ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2];
ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5];
DCT12_PART1
{
real tmp0,tmp1 = (in0 - in4);
{
real tmp2 = MUL24((in1 - in5), tfcos12[1]);
tmp0 = tmp1 + tmp2;
tmp1 -= tmp2;
}
ts[(17-1)*SBLIMIT] = out1[17-1] + MUL24(tmp0, wi[11-1]);
ts[(12+1)*SBLIMIT] = out1[12+1] + MUL24(tmp0, wi[6+1]);
ts[(6 +1)*SBLIMIT] = out1[6 +1] + MUL24(tmp1, wi[1]);
ts[(11-1)*SBLIMIT] = out1[11-1] + MUL24(tmp1, wi[5-1]);
}
DCT12_PART2
ts[(17-0)*SBLIMIT] = out1[17-0] + MUL24(in2, wi[11-0]);
ts[(12+0)*SBLIMIT] = out1[12+0] + MUL24(in2, wi[6+0]);
ts[(12+2)*SBLIMIT] = out1[12+2] + MUL24(in3, wi[6+2]);
ts[(17-2)*SBLIMIT] = out1[17-2] + MUL24(in3, wi[11-2]);
ts[(6+0)*SBLIMIT] = out1[6+0] + MUL24(in0, wi[0]);
ts[(11-0)*SBLIMIT] = out1[11-0] + MUL24(in0, wi[5-0]);
ts[(6+2)*SBLIMIT] = out1[6+2] + MUL24(in4, wi[2]);
ts[(11-2)*SBLIMIT] = out1[11-2] + MUL24(in4, wi[5-2]);
}
in++;
{
real in0,in1,in2,in3,in4,in5;
register real *out2 = rawout2;
DCT12_PART1
{
real tmp0,tmp1 = (in0 - in4);
{
real tmp2 = MUL24((in1 - in5), tfcos12[1]);
tmp0 = tmp1 + tmp2;
tmp1 -= tmp2;
}
out2[5-1] = MUL24(tmp0, wi[11-1]);
out2[0+1] = MUL24(tmp0, wi[6+1]);
ts[(12+1)*SBLIMIT] += MUL24(tmp1, wi[1]);
ts[(17-1)*SBLIMIT] += MUL24(tmp1, wi[5-1]);
}
DCT12_PART2
out2[5-0] = MUL24(in2, wi[11-0]);
out2[0+0] = MUL24(in2, wi[6+0]);
out2[0+2] = MUL24(in3, wi[6+2]);
out2[5-2] = MUL24(in3, wi[11-2]);
ts[(12+0)*SBLIMIT] += MUL24(in0, wi[0]);
ts[(17-0)*SBLIMIT] += MUL24(in0, wi[5-0]);
ts[(12+2)*SBLIMIT] += MUL24(in4, wi[2]);
ts[(17-2)*SBLIMIT] += MUL24(in4, wi[5-2]);
}
in++;
{
real in0,in1,in2,in3,in4,in5;
register real *out2 = rawout2;
out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0;
DCT12_PART1
{
real tmp0,tmp1 = (in0 - in4);
{
real tmp2 = MUL24((in1 - in5), tfcos12[1]);
tmp0 = tmp1 + tmp2;
tmp1 -= tmp2;
}
out2[11-1] = MUL24(tmp0, wi[11-1]);
out2[6 +1] = MUL24(tmp0, wi[6+1]);
out2[0+1] += MUL24(tmp1, wi[1]);
out2[5-1] += MUL24(tmp1, wi[5-1]);
}
DCT12_PART2
out2[11-0] = MUL24(in2, wi[11-0]);
out2[6 +0] = MUL24(in2, wi[6+0]);
out2[6 +2] = MUL24(in3, wi[6+2]);
out2[11-2] = MUL24(in3, wi[11-2]);
out2[0+0] += MUL24(in0, wi[0]);
out2[5-0] += MUL24(in0, wi[5-0]);
out2[0+2] += MUL24(in4, wi[2]);
out2[5-2] += MUL24(in4, wi[5-2]);
}
}
#endif
#if 1
/*
* III_hybrid
*/
void III_hybrid(real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT],
int ch,struct gr_info_s *gr_info)
{
real *tspnt = (real *) tsOut;
real (*block)[2][SBLIMIT*SSLIMIT] = gmp.hybrid_block;
int *blc = gmp.hybrid_blc;
real *rawout1,*rawout2;
int bt;
int sb = 0;
{
int b = blc[ch];
rawout1=block[b][ch];
b=-b+1;
rawout2=block[b][ch];
blc[ch] = b;
}
if(gr_info->mixed_block_flag) {
sb = 2;
dct36(fsIn[0],rawout1,rawout2,win[0],tspnt);
dct36(fsIn[1],rawout1+18,rawout2+18,win1[0],tspnt+1);
rawout1 += 36; rawout2 += 36; tspnt += 2;
}
bt = gr_info->block_type;
if(bt == 2) {
for (; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
dct12(fsIn[sb],rawout1,rawout2,win[2],tspnt);
dct12(fsIn[sb+1],rawout1+18,rawout2+18,win1[2],tspnt+1);
}
}
else {
for (; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
dct36(fsIn[sb],rawout1,rawout2,win[bt],tspnt);
dct36(fsIn[sb+1],rawout1+18,rawout2+18,win1[bt],tspnt+1);
}
}
/*
* Modified by DSA 2003.10.31 ok
*/
/*for(;sb<SBLIMIT;sb++,tspnt++) {
int i;
for(i=0;i<SSLIMIT;i++) {
tspnt[i*SBLIMIT] = *rawout1++;
*rawout2++ = 0;
}
}*/
for(;sb<SBLIMIT;sb++,tspnt++) {
tspnt[0*SBLIMIT] = *rawout1++;
tspnt[1*SBLIMIT] = *rawout1++;
tspnt[2*SBLIMIT] = *rawout1++;
tspnt[3*SBLIMIT] = *rawout1++;
tspnt[4*SBLIMIT] = *rawout1++;
tspnt[5*SBLIMIT] = *rawout1++;
tspnt[6*SBLIMIT] = *rawout1++;
tspnt[7*SBLIMIT] = *rawout1++;
tspnt[8*SBLIMIT] = *rawout1++;
tspnt[9*SBLIMIT] = *rawout1++;
tspnt[10*SBLIMIT] = *rawout1++;
tspnt[11*SBLIMIT] = *rawout1++;
tspnt[12*SBLIMIT] = *rawout1++;
tspnt[13*SBLIMIT] = *rawout1++;
tspnt[14*SBLIMIT] = *rawout1++;
tspnt[15*SBLIMIT] = *rawout1++;
tspnt[16*SBLIMIT] = *rawout1++;
tspnt[17*SBLIMIT] = *rawout1++;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
}
}
#endif
//#if 0
unsigned int getbits_fast(int number_of_bits)
{
unsigned long rval;
{
rval = bufpointer[0];
rval <<= 8;
rval |= bufpointer[1];
rval <<= bitindex;
rval &= 0xffff;
bitindex += number_of_bits;
rval >>= (16-number_of_bits);
bufpointer += (bitindex>>3);
bitindex &= 7;
}
return rval;
}
//#endif
#if 0
void III_get_side_info_1(struct III_sideinfo *si,int stereo,
int ms_stereo,long sfreq,int single)
{
int ch, gr;
int powdiff = (single == 3) ? 4 : 0;
si->main_data_begin = getbits(9);
if (stereo == 1)
si->private_bits = getbits_fast(5);
else
si->private_bits = getbits_fast(3);
for (ch=0; ch<stereo; ch++) {
si->ch[ch].gr[0].scfsi = -1;
si->ch[ch].gr[1].scfsi = getbits_fast(4);
}
for (gr=0; gr<2; gr++)
{
for (ch=0; ch<stereo; ch++)
{
register struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]);
gr_info->part2_3_length = getbits(12);
gr_info->big_values = getbits_fast(9);
if(gr_info->big_values > 288) {
// fprintf(stderr,"big_values too large!\n");
gr_info->big_values = 288;
}
gr_info->pow2gain = -46 + 256 - getbits_fast(8) + powdiff;
if(ms_stereo)
gr_info->pow2gain += 2;
gr_info->scalefac_compress = getbits_fast(4);
/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
GET1BIT();
if(rval)
{
gr_info->block_type = getbits_fast(2);
GET1BIT();
gr_info->mixed_block_flag = rval;
//get_1bit(&(gr_info->mixed_block_flag));
gr_info->table_select[0] = getbits_fast(5);
gr_info->table_select[1] = getbits_fast(5);
/*
* table_select[2] not needed, because there is no region2,
* but to satisfy some verifications tools we set it either.
*/
gr_info->table_select[2] = 0;
/*
* Modified by DSA 2003.10.31 ok
*/
// for(i=0;i<3;i++)
// gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(3)<<3);
gr_info->full_gain[0] = gr_info->pow2gain + (getbits_fast(3)<<3);
gr_info->full_gain[1] = gr_info->pow2gain + (getbits_fast(3)<<3);
gr_info->full_gain[2] = gr_info->pow2gain + (getbits_fast(3)<<3);
if(gr_info->block_type == 0) {
// fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n");
// exit(1);
return;
}
/* region_count/start parameters are implicit in this case. */
gr_info->region1start = 36>>1;
gr_info->region2start = 576>>1;
}
else
{
int r0c,r1c;
/*
* Modified by DSA 2003.10.31 ok
*/
// for (i=0; i<3; i++)
// gr_info->table_select[i] = getbits_fast(5);
gr_info->table_select[0] = getbits_fast(5);
gr_info->table_select[1] = getbits_fast(5);
gr_info->table_select[2] = getbits_fast(5);
r0c = getbits_fast(4);
r1c = getbits_fast(3);
gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
gr_info->block_type = 0;
gr_info->mixed_block_flag = 0;
}
GET1BIT();
gr_info->preflag = rval;
GET1BIT();
gr_info->scalefac_scale = rval;
GET1BIT();
gr_info->count1table_select = rval;
//get_1bit(&(gr_info->preflag));
//get_1bit(&(gr_info->scalefac_scale));
//get_1bit(&(gr_info->scalefac_scale));
}
}
}
#endif
unsigned int getbits(int number_of_bits)
{
unsigned long rval;
if(!number_of_bits)
return 0;
{
rval = bufpointer[0];
rval <<= 8;
rval |= bufpointer[1];
rval <<= 8;
rval |= bufpointer[2];
rval <<= bitindex;
rval &= 0xffffff;
bitindex += number_of_bits;
rval >>= (24-number_of_bits);
bufpointer += (bitindex>>3);
bitindex &= 7;
}
return rval;
}
void
Write16BitsHighLow(unsigned char *buf, int i)
{
*buf++ = (i>>8)&0xff;
*buf++ = i&0xff;
}
void Write32BitsHighLow(unsigned char *buf, int i)
{
Write16BitsHighLow(buf,(int)((i>>16)&0xffffL));
Write16BitsHighLow(buf+2,(int)(i&0xffffL));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -