| /* |
| ** Copyright 2003-2010, VisualOn, Inc. |
| ** |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| */ |
| /******************************************************************************* |
| File: bit_cnt.c |
| |
| Content: Huffman Bitcounter & coder functions |
| |
| *******************************************************************************/ |
| |
| #include "bit_cnt.h" |
| #include "aac_rom.h" |
| |
| #define HI_LTAB(a) (a>>8) |
| #define LO_LTAB(a) (a & 0xff) |
| |
| #define EXPAND(a) ((((Word32)(a&0xff00)) << 8)|(Word32)(a&0xff)) |
| |
| |
| /***************************************************************************** |
| * |
| * function name: count1_2_3_4_5_6_7_8_9_10_11 |
| * description: counts tables 1-11 |
| * returns: |
| * input: quantized spectrum |
| * output: bitCount for tables 1-11 |
| * |
| *****************************************************************************/ |
| |
| static void count1_2_3_4_5_6_7_8_9_10_11(const Word16 *values, |
| const Word16 width, |
| Word16 *bitCount) |
| { |
| Word32 t0,t1,t2,t3,i; |
| Word32 bc1_2,bc3_4,bc5_6,bc7_8,bc9_10; |
| Word16 bc11,sc; |
| |
| bc1_2=0; |
| bc3_4=0; |
| bc5_6=0; |
| bc7_8=0; |
| bc9_10=0; |
| bc11=0; |
| sc=0; |
| |
| for(i=0;i<width;i+=4){ |
| |
| t0= values[i+0]; |
| t1= values[i+1]; |
| t2= values[i+2]; |
| t3= values[i+3]; |
| |
| /* 1,2 */ |
| |
| bc1_2 = bc1_2 + EXPAND(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]); |
| |
| /* 5,6 */ |
| bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]); |
| bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t2+4][t3+4]); |
| |
| t0=ABS(t0); |
| t1=ABS(t1); |
| t2=ABS(t2); |
| t3=ABS(t3); |
| |
| |
| bc3_4 = bc3_4 + EXPAND(huff_ltab3_4[t0][t1][t2][t3]); |
| |
| bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); |
| bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t2][t3]); |
| |
| bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]); |
| bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t2][t3]); |
| |
| bc11 = bc11 + huff_ltab11[t0][t1]; |
| bc11 = bc11 + huff_ltab11[t2][t3]; |
| |
| |
| sc = sc + (t0>0) + (t1>0) + (t2>0) + (t3>0); |
| } |
| |
| bitCount[1]=extract_h(bc1_2); |
| bitCount[2]=extract_l(bc1_2); |
| bitCount[3]=extract_h(bc3_4) + sc; |
| bitCount[4]=extract_l(bc3_4) + sc; |
| bitCount[5]=extract_h(bc5_6); |
| bitCount[6]=extract_l(bc5_6); |
| bitCount[7]=extract_h(bc7_8) + sc; |
| bitCount[8]=extract_l(bc7_8) + sc; |
| bitCount[9]=extract_h(bc9_10) + sc; |
| bitCount[10]=extract_l(bc9_10) + sc; |
| bitCount[11]=bc11 + sc; |
| } |
| |
| |
| /***************************************************************************** |
| * |
| * function name: count3_4_5_6_7_8_9_10_11 |
| * description: counts tables 3-11 |
| * returns: |
| * input: quantized spectrum |
| * output: bitCount for tables 3-11 |
| * |
| *****************************************************************************/ |
| |
| static void count3_4_5_6_7_8_9_10_11(const Word16 *values, |
| const Word16 width, |
| Word16 *bitCount) |
| { |
| Word32 t0,t1,t2,t3, i; |
| Word32 bc3_4,bc5_6,bc7_8,bc9_10; |
| Word16 bc11,sc; |
| |
| bc3_4=0; |
| bc5_6=0; |
| bc7_8=0; |
| bc9_10=0; |
| bc11=0; |
| sc=0; |
| |
| for(i=0;i<width;i+=4){ |
| |
| t0= values[i+0]; |
| t1= values[i+1]; |
| t2= values[i+2]; |
| t3= values[i+3]; |
| |
| /* |
| 5,6 |
| */ |
| bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]); |
| bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t2+4][t3+4]); |
| |
| t0=ABS(t0); |
| t1=ABS(t1); |
| t2=ABS(t2); |
| t3=ABS(t3); |
| |
| |
| bc3_4 = bc3_4 + EXPAND(huff_ltab3_4[t0][t1][t2][t3]); |
| |
| bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); |
| bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t2][t3]); |
| |
| bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]); |
| bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t2][t3]); |
| |
| bc11 = bc11 + huff_ltab11[t0][t1]; |
| bc11 = bc11 + huff_ltab11[t2][t3]; |
| |
| |
| sc = sc + (t0>0) + (t1>0) + (t2>0) + (t3>0); |
| } |
| |
| bitCount[1]=INVALID_BITCOUNT; |
| bitCount[2]=INVALID_BITCOUNT; |
| bitCount[3]=extract_h(bc3_4) + sc; |
| bitCount[4]=extract_l(bc3_4) + sc; |
| bitCount[5]=extract_h(bc5_6); |
| bitCount[6]=extract_l(bc5_6); |
| bitCount[7]=extract_h(bc7_8) + sc; |
| bitCount[8]=extract_l(bc7_8) + sc; |
| bitCount[9]=extract_h(bc9_10) + sc; |
| bitCount[10]=extract_l(bc9_10) + sc; |
| bitCount[11]=bc11 + sc; |
| |
| } |
| |
| |
| |
| /***************************************************************************** |
| * |
| * function name: count5_6_7_8_9_10_11 |
| * description: counts tables 5-11 |
| * returns: |
| * input: quantized spectrum |
| * output: bitCount for tables 5-11 |
| * |
| *****************************************************************************/ |
| static void count5_6_7_8_9_10_11(const Word16 *values, |
| const Word16 width, |
| Word16 *bitCount) |
| { |
| |
| Word32 t0,t1,i; |
| Word32 bc5_6,bc7_8,bc9_10; |
| Word16 bc11,sc; |
| |
| bc5_6=0; |
| bc7_8=0; |
| bc9_10=0; |
| bc11=0; |
| sc=0; |
| |
| for(i=0;i<width;i+=2){ |
| |
| t0 = values[i+0]; |
| t1 = values[i+1]; |
| |
| bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]); |
| |
| t0=ABS(t0); |
| t1=ABS(t1); |
| |
| bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); |
| bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]); |
| bc11 = bc11 + huff_ltab11[t0][t1]; |
| |
| |
| sc = sc + (t0>0) + (t1>0); |
| } |
| bitCount[1]=INVALID_BITCOUNT; |
| bitCount[2]=INVALID_BITCOUNT; |
| bitCount[3]=INVALID_BITCOUNT; |
| bitCount[4]=INVALID_BITCOUNT; |
| bitCount[5]=extract_h(bc5_6); |
| bitCount[6]=extract_l(bc5_6); |
| bitCount[7]=extract_h(bc7_8) + sc; |
| bitCount[8]=extract_l(bc7_8) + sc; |
| bitCount[9]=extract_h(bc9_10) + sc; |
| bitCount[10]=extract_l(bc9_10) + sc; |
| bitCount[11]=bc11 + sc; |
| |
| } |
| |
| |
| /***************************************************************************** |
| * |
| * function name: count7_8_9_10_11 |
| * description: counts tables 7-11 |
| * returns: |
| * input: quantized spectrum |
| * output: bitCount for tables 7-11 |
| * |
| *****************************************************************************/ |
| |
| static void count7_8_9_10_11(const Word16 *values, |
| const Word16 width, |
| Word16 *bitCount) |
| { |
| Word32 t0,t1, i; |
| Word32 bc7_8,bc9_10; |
| Word16 bc11,sc; |
| |
| bc7_8=0; |
| bc9_10=0; |
| bc11=0; |
| sc=0; |
| |
| for(i=0;i<width;i+=2){ |
| |
| t0=ABS(values[i+0]); |
| t1=ABS(values[i+1]); |
| |
| bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); |
| bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]); |
| bc11 = bc11 + huff_ltab11[t0][t1]; |
| |
| |
| sc = sc + (t0>0) + (t1>0); |
| } |
| bitCount[1]=INVALID_BITCOUNT; |
| bitCount[2]=INVALID_BITCOUNT; |
| bitCount[3]=INVALID_BITCOUNT; |
| bitCount[4]=INVALID_BITCOUNT; |
| bitCount[5]=INVALID_BITCOUNT; |
| bitCount[6]=INVALID_BITCOUNT; |
| bitCount[7]=extract_h(bc7_8) + sc; |
| bitCount[8]=extract_l(bc7_8) + sc; |
| bitCount[9]=extract_h(bc9_10) + sc; |
| bitCount[10]=extract_l(bc9_10) + sc; |
| bitCount[11]=bc11 + sc; |
| |
| } |
| |
| /***************************************************************************** |
| * |
| * function name: count9_10_11 |
| * description: counts tables 9-11 |
| * returns: |
| * input: quantized spectrum |
| * output: bitCount for tables 9-11 |
| * |
| *****************************************************************************/ |
| static void count9_10_11(const Word16 *values, |
| const Word16 width, |
| Word16 *bitCount) |
| { |
| |
| Word32 t0,t1,i; |
| Word32 bc9_10; |
| Word16 bc11,sc; |
| |
| bc9_10=0; |
| bc11=0; |
| sc=0; |
| |
| for(i=0;i<width;i+=2){ |
| |
| t0=ABS(values[i+0]); |
| t1=ABS(values[i+1]); |
| |
| |
| bc9_10 += EXPAND(huff_ltab9_10[t0][t1]); |
| bc11 = bc11 + huff_ltab11[t0][t1]; |
| |
| |
| sc = sc + (t0>0) + (t1>0); |
| } |
| bitCount[1]=INVALID_BITCOUNT; |
| bitCount[2]=INVALID_BITCOUNT; |
| bitCount[3]=INVALID_BITCOUNT; |
| bitCount[4]=INVALID_BITCOUNT; |
| bitCount[5]=INVALID_BITCOUNT; |
| bitCount[6]=INVALID_BITCOUNT; |
| bitCount[7]=INVALID_BITCOUNT; |
| bitCount[8]=INVALID_BITCOUNT; |
| bitCount[9]=extract_h(bc9_10) + sc; |
| bitCount[10]=extract_l(bc9_10) + sc; |
| bitCount[11]=bc11 + sc; |
| |
| } |
| |
| /***************************************************************************** |
| * |
| * function name: count11 |
| * description: counts table 11 |
| * returns: |
| * input: quantized spectrum |
| * output: bitCount for table 11 |
| * |
| *****************************************************************************/ |
| static void count11(const Word16 *values, |
| const Word16 width, |
| Word16 *bitCount) |
| { |
| Word32 t0,t1,i; |
| Word16 bc11,sc; |
| |
| bc11=0; |
| sc=0; |
| for(i=0;i<width;i+=2){ |
| t0=ABS(values[i+0]); |
| t1=ABS(values[i+1]); |
| bc11 = bc11 + huff_ltab11[t0][t1]; |
| |
| |
| sc = sc + (t0>0) + (t1>0); |
| } |
| |
| bitCount[1]=INVALID_BITCOUNT; |
| bitCount[2]=INVALID_BITCOUNT; |
| bitCount[3]=INVALID_BITCOUNT; |
| bitCount[4]=INVALID_BITCOUNT; |
| bitCount[5]=INVALID_BITCOUNT; |
| bitCount[6]=INVALID_BITCOUNT; |
| bitCount[7]=INVALID_BITCOUNT; |
| bitCount[8]=INVALID_BITCOUNT; |
| bitCount[9]=INVALID_BITCOUNT; |
| bitCount[10]=INVALID_BITCOUNT; |
| bitCount[11]=bc11 + sc; |
| } |
| |
| /***************************************************************************** |
| * |
| * function name: countEsc |
| * description: counts table 11 (with Esc) |
| * returns: |
| * input: quantized spectrum |
| * output: bitCount for tables 11 (with Esc) |
| * |
| *****************************************************************************/ |
| |
| static void countEsc(const Word16 *values, |
| const Word16 width, |
| Word16 *bitCount) |
| { |
| Word32 t0,t1,t00,t01,i; |
| Word16 bc11,ec,sc; |
| |
| bc11=0; |
| sc=0; |
| ec=0; |
| for(i=0;i<width;i+=2){ |
| t0=ABS(values[i+0]); |
| t1=ABS(values[i+1]); |
| |
| |
| sc = sc + (t0>0) + (t1>0); |
| |
| t00 = min(t0,16); |
| t01 = min(t1,16); |
| bc11 = bc11 + huff_ltab11[t00][t01]; |
| |
| |
| if(t0 >= 16){ |
| ec = ec + 5; |
| while(sub(t0=(t0 >> 1), 16) >= 0) { |
| ec = ec + 2; |
| } |
| } |
| |
| |
| if(t1 >= 16){ |
| ec = ec + 5; |
| while(sub(t1=(t1 >> 1), 16) >= 0) { |
| ec = ec + 2; |
| } |
| } |
| } |
| bitCount[1]=INVALID_BITCOUNT; |
| bitCount[2]=INVALID_BITCOUNT; |
| bitCount[3]=INVALID_BITCOUNT; |
| bitCount[4]=INVALID_BITCOUNT; |
| bitCount[5]=INVALID_BITCOUNT; |
| bitCount[6]=INVALID_BITCOUNT; |
| bitCount[7]=INVALID_BITCOUNT; |
| bitCount[8]=INVALID_BITCOUNT; |
| bitCount[9]=INVALID_BITCOUNT; |
| bitCount[10]=INVALID_BITCOUNT; |
| bitCount[11]=bc11 + sc + ec; |
| } |
| |
| |
| typedef void (*COUNT_FUNCTION)(const Word16 *values, |
| const Word16 width, |
| Word16 *bitCount); |
| |
| static COUNT_FUNCTION countFuncTable[CODE_BOOK_ESC_LAV+1] = |
| { |
| |
| count1_2_3_4_5_6_7_8_9_10_11, /* 0 */ |
| count1_2_3_4_5_6_7_8_9_10_11, /* 1 */ |
| count3_4_5_6_7_8_9_10_11, /* 2 */ |
| count5_6_7_8_9_10_11, /* 3 */ |
| count5_6_7_8_9_10_11, /* 4 */ |
| count7_8_9_10_11, /* 5 */ |
| count7_8_9_10_11, /* 6 */ |
| count7_8_9_10_11, /* 7 */ |
| count9_10_11, /* 8 */ |
| count9_10_11, /* 9 */ |
| count9_10_11, /* 10 */ |
| count9_10_11, /* 11 */ |
| count9_10_11, /* 12 */ |
| count11, /* 13 */ |
| count11, /* 14 */ |
| count11, /* 15 */ |
| countEsc /* 16 */ |
| }; |
| |
| /***************************************************************************** |
| * |
| * function name: bitCount |
| * description: count bits |
| * |
| *****************************************************************************/ |
| Word16 bitCount(const Word16 *values, |
| const Word16 width, |
| Word16 maxVal, |
| Word16 *bitCount) |
| { |
| /* |
| check if we can use codebook 0 |
| */ |
| |
| if(maxVal == 0) |
| bitCount[0] = 0; |
| else |
| bitCount[0] = INVALID_BITCOUNT; |
| |
| maxVal = min(maxVal, CODE_BOOK_ESC_LAV); |
| countFuncTable[maxVal](values,width,bitCount); |
| |
| return(0); |
| } |
| |
| /***************************************************************************** |
| * |
| * function name: codeValues |
| * description: write huffum bits |
| * |
| *****************************************************************************/ |
| Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream) |
| { |
| |
| Word32 i, t0, t1, t2, t3, t00, t01; |
| UWord16 codeWord, codeLength; |
| Word16 sign, signLength; |
| |
| |
| switch (codeBook) { |
| case CODE_BOOK_ZERO_NO: |
| break; |
| |
| case CODE_BOOK_1_NO: |
| for(i=0; i<width; i+=4) { |
| t0 = values[i+0]; |
| t1 = values[i+1]; |
| t2 = values[i+2]; |
| t3 = values[i+3]; |
| codeWord = huff_ctab1[t0+1][t1+1][t2+1][t3+1]; |
| codeLength = HI_LTAB(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]); |
| WriteBits(hBitstream, codeWord, codeLength); |
| } |
| break; |
| |
| case CODE_BOOK_2_NO: |
| for(i=0; i<width; i+=4) { |
| t0 = values[i+0]; |
| t1 = values[i+1]; |
| t2 = values[i+2]; |
| t3 = values[i+3]; |
| codeWord = huff_ctab2[t0+1][t1+1][t2+1][t3+1]; |
| codeLength = LO_LTAB(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]); |
| WriteBits(hBitstream,codeWord,codeLength); |
| } |
| break; |
| |
| case CODE_BOOK_3_NO: |
| for(i=0; i<width; i+=4) { |
| sign=0; |
| signLength=0; |
| t0 = values[i+0]; |
| |
| if(t0 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t0 < 0){ |
| sign|=1; |
| t0=-t0; |
| } |
| } |
| t1 = values[i+1]; |
| |
| if(t1 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t1 < 0){ |
| sign|=1; |
| t1=-t1; |
| } |
| } |
| t2 = values[i+2]; |
| |
| if(t2 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t2 < 0){ |
| sign|=1; |
| t2=-t2; |
| } |
| } |
| t3 = values[i+3]; |
| if(t3 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t3 < 0){ |
| sign|=1; |
| t3=-t3; |
| } |
| } |
| |
| codeWord = huff_ctab3[t0][t1][t2][t3]; |
| codeLength = HI_LTAB(huff_ltab3_4[t0][t1][t2][t3]); |
| WriteBits(hBitstream,codeWord,codeLength); |
| WriteBits(hBitstream,sign,signLength); |
| } |
| break; |
| |
| case CODE_BOOK_4_NO: |
| for(i=0; i<width; i+=4) { |
| sign=0; |
| signLength=0; |
| t0 = values[i+0]; |
| |
| if(t0 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| if(t0 < 0){ |
| sign|=1; |
| t0=-t0; |
| } |
| } |
| t1 = values[i+1]; |
| |
| if(t1 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t1 < 0){ |
| sign|=1; |
| t1=-t1; |
| } |
| } |
| t2 = values[i+2]; |
| |
| if(t2 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t2 < 0){ |
| sign|=1; |
| t2=-t2; |
| } |
| } |
| t3 = values[i+3]; |
| |
| if(t3 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t3 < 0){ |
| sign|=1; |
| t3=-t3; |
| } |
| } |
| codeWord = huff_ctab4[t0][t1][t2][t3]; |
| codeLength = LO_LTAB(huff_ltab3_4[t0][t1][t2][t3]); |
| WriteBits(hBitstream,codeWord,codeLength); |
| WriteBits(hBitstream,sign,signLength); |
| } |
| break; |
| |
| case CODE_BOOK_5_NO: |
| for(i=0; i<width; i+=2) { |
| t0 = values[i+0]; |
| t1 = values[i+1]; |
| codeWord = huff_ctab5[t0+4][t1+4]; |
| codeLength = HI_LTAB(huff_ltab5_6[t0+4][t1+4]); |
| WriteBits(hBitstream,codeWord,codeLength); |
| } |
| break; |
| |
| case CODE_BOOK_6_NO: |
| for(i=0; i<width; i+=2) { |
| t0 = values[i+0]; |
| t1 = values[i+1]; |
| codeWord = huff_ctab6[t0+4][t1+4]; |
| codeLength = LO_LTAB(huff_ltab5_6[t0+4][t1+4]); |
| WriteBits(hBitstream,codeWord,codeLength); |
| } |
| break; |
| |
| case CODE_BOOK_7_NO: |
| for(i=0; i<width; i+=2){ |
| sign=0; |
| signLength=0; |
| t0 = values[i+0]; |
| |
| if(t0 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t0 < 0){ |
| sign|=1; |
| t0=-t0; |
| } |
| } |
| |
| t1 = values[i+1]; |
| |
| if(t1 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t1 < 0){ |
| sign|=1; |
| t1=-t1; |
| } |
| } |
| codeWord = huff_ctab7[t0][t1]; |
| codeLength = HI_LTAB(huff_ltab7_8[t0][t1]); |
| WriteBits(hBitstream,codeWord,codeLength); |
| WriteBits(hBitstream,sign,signLength); |
| } |
| break; |
| |
| case CODE_BOOK_8_NO: |
| for(i=0; i<width; i+=2) { |
| sign=0; |
| signLength=0; |
| t0 = values[i+0]; |
| |
| if(t0 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t0 < 0){ |
| sign|=1; |
| t0=-t0; |
| } |
| } |
| |
| t1 = values[i+1]; |
| |
| if(t1 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t1 < 0){ |
| sign|=1; |
| t1=-t1; |
| } |
| } |
| codeWord = huff_ctab8[t0][t1]; |
| codeLength = LO_LTAB(huff_ltab7_8[t0][t1]); |
| WriteBits(hBitstream,codeWord,codeLength); |
| WriteBits(hBitstream,sign,signLength); |
| } |
| break; |
| |
| case CODE_BOOK_9_NO: |
| for(i=0; i<width; i+=2) { |
| sign=0; |
| signLength=0; |
| t0 = values[i+0]; |
| |
| if(t0 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t0 < 0){ |
| sign|=1; |
| t0=-t0; |
| } |
| } |
| |
| t1 = values[i+1]; |
| |
| if(t1 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t1 < 0){ |
| sign|=1; |
| t1=-t1; |
| } |
| } |
| codeWord = huff_ctab9[t0][t1]; |
| codeLength = HI_LTAB(huff_ltab9_10[t0][t1]); |
| WriteBits(hBitstream,codeWord,codeLength); |
| WriteBits(hBitstream,sign,signLength); |
| } |
| break; |
| |
| case CODE_BOOK_10_NO: |
| for(i=0; i<width; i+=2) { |
| sign=0; |
| signLength=0; |
| t0 = values[i+0]; |
| |
| if(t0 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t0 < 0){ |
| sign|=1; |
| t0=-t0; |
| } |
| } |
| |
| t1 = values[i+1]; |
| |
| if(t1 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t1 < 0){ |
| sign|=1; |
| t1=-t1; |
| } |
| } |
| codeWord = huff_ctab10[t0][t1]; |
| codeLength = LO_LTAB(huff_ltab9_10[t0][t1]); |
| WriteBits(hBitstream,codeWord,codeLength); |
| WriteBits(hBitstream,sign,signLength); |
| } |
| break; |
| |
| case CODE_BOOK_ESC_NO: |
| for(i=0; i<width; i+=2) { |
| sign=0; |
| signLength=0; |
| t0 = values[i+0]; |
| |
| if(t0 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t0 < 0){ |
| sign|=1; |
| t0=-t0; |
| } |
| } |
| |
| t1 = values[i+1]; |
| |
| if(t1 != 0){ |
| signLength = signLength + 1; |
| sign = sign << 1; |
| |
| if(t1 < 0){ |
| sign|=1; |
| t1=-t1; |
| } |
| } |
| t00 = min(t0,16); |
| t01 = min(t1,16); |
| |
| codeWord = huff_ctab11[t00][t01]; |
| codeLength = huff_ltab11[t00][t01]; |
| WriteBits(hBitstream,codeWord,codeLength); |
| WriteBits(hBitstream,sign,signLength); |
| |
| if(t0 >= 16){ |
| Word16 n, p; |
| n=0; |
| p=t0; |
| while(sub(p=(p >> 1), 16) >= 0){ |
| |
| WriteBits(hBitstream,1,1); |
| n = n + 1; |
| } |
| WriteBits(hBitstream,0,1); |
| n = n + 4; |
| WriteBits(hBitstream,(t0 - (1 << n)),n); |
| } |
| |
| if(t1 >= 16){ |
| Word16 n, p; |
| n=0; |
| p=t1; |
| while(sub(p=(p >> 1), 16) >= 0){ |
| |
| WriteBits(hBitstream,1,1); |
| n = n + 1; |
| } |
| WriteBits(hBitstream,0,1); |
| n = n + 4; |
| WriteBits(hBitstream,(t1 - (1 << n)),n); |
| } |
| } |
| break; |
| |
| default: |
| break; |
| } |
| return(0); |
| } |
| |
| Word16 bitCountScalefactorDelta(Word16 delta) |
| { |
| return(huff_ltabscf[delta+CODE_BOOK_SCF_LAV]); |
| } |
| |
| Word16 codeScalefactorDelta(Word16 delta, HANDLE_BIT_BUF hBitstream) |
| { |
| Word32 codeWord; |
| Word16 codeLength; |
| |
| |
| if(delta > CODE_BOOK_SCF_LAV || delta < -CODE_BOOK_SCF_LAV) |
| return(1); |
| |
| codeWord = huff_ctabscf[delta + CODE_BOOK_SCF_LAV]; |
| codeLength = huff_ltabscf[delta + CODE_BOOK_SCF_LAV]; |
| WriteBits(hBitstream,codeWord,codeLength); |
| return(0); |
| } |