aboutsummaryrefslogtreecommitdiff
path: root/Src/f263/Block.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/f263/Block.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/f263/Block.cpp')
-rw-r--r--Src/f263/Block.cpp144
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;
+ }
+ }}