diff options
Diffstat (limited to 'Src/f263/Block.cpp')
-rw-r--r-- | Src/f263/Block.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/Src/f263/Block.cpp b/Src/f263/Block.cpp new file mode 100644 index 00000000..3155e561 --- /dev/null +++ b/Src/f263/Block.cpp @@ -0,0 +1,144 @@ +#include "Decoder.h" +#include "indices.h" +#include "vlc_table.h" + +static unsigned char zig_zag_scan[64]={ + 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5, + 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28, + 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51, + 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63 +}; + +#define ESCAPE 7167 +// mode 1 = Inter (or Intra in advanced intra coding mode) +// mode 0 = Intra +void Decoder::getblock(int comp, int mode) +{ + int val, i, j, sign; + unsigned int code; + VLCtab *tab; + short *bp; + int run, last, level, QP; + short *qval; + + + /* TODO: benski> + i think this whole function can get replaced with + ippiDecodeCoeffsIntra_H263_1u16s (mode==0) + or + ippiDecodeCoeffsInter_H263_1u16s (mode == 1) + with pCoef = bp + modQuantFlag = escapemode>=1 + scan = IPPVC_SCAN_ZIGZAG + + */ + bp = block[comp]; + + /* decode AC coefficients (or all coefficients in advanced intra coding + * mode) */ + + for (i = (mode == 0);; i++) + { + + code = buffer.showbits(12); + + + if (code >= 512) + tab = &DCT3Dtab0[(code >> 5) - 16]; + else if (code >= 128) + tab = &DCT3Dtab1[(code >> 2) - 32]; + else if (code >= 8) + tab = &DCT3Dtab2[(code >> 0) - 8]; + else + { + fault = 1; + return; + } + + run = (tab->val >> 4) & 255; + level = tab->val & 15; + last = (tab->val >> 12) & 1; + + buffer.flushbits(tab->len); + if (tab->val == ESCAPE) + { + /* escape */ + if (escapemode >= 1) + { + int is11 = buffer.getbits1(); + sign=0; + last = buffer.getbits1(); + i+=run = buffer.getbits(6); + if (is11) + { + level = buffer.getbits(11); + if ((sign = (level>=1024))) + val = 2048 - level; + else + val = level; + } + else + { + level = buffer.getbits(7); + if ((sign = (level>=64))) + val = 128 - level; + else + val = level; + } + } + else + { + last = buffer.getbits1(); + i += run = buffer.getbits(6); + level = buffer.getbits(8); + + if ((sign = (level >= 128))) + val = 256 - level; + else + val = level; + } + } + else + { + i += run; + val = level; + sign = buffer.getbits(1); + } + + + if (i >= 64) + { + fault = 1; + return; + } + + /* Descan in the proper order in advanced intra coding mode */ + + + j = zig_zag_scan[i]; + qval = &bp[j]; + QP = quant; + + + + /* TODO: benski> + ippiQuantInvIntra_H263_16s_C1I + or + ippiQuantInvInter_H263_16s_C1I (mode == 1) + but outside the loop + pSrcDst = bp + QP = quant + modQuantFlag = escapemode >= 1 + */ + /* TMN3 dequantization */ + if ((QP % 2) == 1) + *qval = (sign ? -(QP * (2 * val + 1)) : QP * (2 * val + 1)); + else + *qval = (sign ? -(QP * (2 * val + 1) - 1) : QP * (2 * val + 1) - 1); + + if (last) + { + /* That's it */ + return; + } + }} |