Doxygen Source Code Documentation
moutput.c File Reference
#include "all.h"#include "mtypes.h"#include "mproto.h"#include "huff.h"Go to the source code of this file.
Functions | |
| void | UnQuantZig (FlatBlock in, Block out, int qscale, boolean iblock) |
| boolean | mp_quant_zig_block (Block in, FlatBlock out, int qscale, int iblock) |
| void | mp_rle_huff_block (FlatBlock in, BitBucket *out) |
| void | mp_rle_huff_pblock (FlatBlock in, BitBucket *out) |
Variables | |
| int | ZAG [] |
| int | qtable [] |
Function Documentation
|
||||||||||||||||||||
|
Definition at line 196 of file moutput.c. References Block, DBG_PRINT, DCTSIZE_SQ, FlatBlock, i, int16, qtable, and ZAG. Referenced by main().
00197 {
00198 register int i;
00199 register int y, x;
00200 register int16 temp;
00201 register int qentry;
00202 int start;
00203 boolean nonZero = FALSE;
00204
00205 DBG_PRINT(("mp_quant_zig_block...\n"));
00206 if (iblock) {
00207 /*
00208 * the DC coefficient is handled specially -- it's not
00209 * sensitive to qscale, but everything else is
00210 */
00211 temp = ((int16 *) in)[ZAG[0]];
00212 qentry = qtable[ZAG[0]];
00213 if (temp < 0) {
00214 temp = -temp;
00215 temp += qentry >> 1;
00216 temp /= qentry;
00217 temp = -temp;
00218 } else {
00219 temp += qentry >> 1;
00220 temp /= qentry;
00221 }
00222 if ( temp != 0 )
00223 nonZero = TRUE;
00224 out[0] = temp;
00225 start = 1;
00226 } else
00227 start = 0;
00228
00229 for (i = start; i < DCTSIZE_SQ; i++) {
00230 x = ZAG[i] % 8;
00231 y = ZAG[i] / 8;
00232 temp = in[y][x];
00233 DBG_PRINT((" in[%d][%d] = %d; ", y, x, temp));
00234
00235 if (iblock)
00236 qentry = qtable[ZAG[i]] * qscale;
00237 else
00238 qentry = 16 * qscale;
00239
00240 DBG_PRINT(("quantized with %d = ", qentry));
00241
00242 if (temp < 0) {
00243 temp = -temp;
00244 temp *= 8;
00245 temp += qentry >> 1;
00246 temp /= qentry;
00247 temp = -temp;
00248 } else {
00249 temp *= 8;
00250 temp += qentry >> 1;
00251 temp /= qentry;
00252 }
00253 if ( temp != 0 )
00254 nonZero = TRUE;
00255 out[i] = temp;
00256 DBG_PRINT(("%d\n", temp));
00257 }
00258
00259 return nonZero;
00260 }
|
|
||||||||||||
|
Definition at line 278 of file moutput.c. References ABS, DBG_PRINT, DCTSIZE_SQ, FlatBlock, i, int16, uint32, and x2. Referenced by main().
00279 {
00280 register int i;
00281 register int nzeros = 0;
00282 register int16 cur;
00283 register int16 acur;
00284 register uint32 code;
00285 register int nbits;
00286
00287 /*
00288 * yes, Virginia, we start at 1. The DC coefficient is handled
00289 * specially, elsewhere. Not here.
00290 */
00291 for (i = 1; i < DCTSIZE_SQ; i++) {
00292 cur = in[i];
00293 acur = ABS(cur);
00294 if (cur) {
00295 if (nzeros < HUFF_MAXRUN && acur < huff_maxlevel[nzeros]) {
00296 /*
00297 * encode using the Huffman tables
00298 */
00299
00300 DBG_PRINT(("rle_huff %02d: Run %02d, Level %02d\n", i, nzeros, cur));
00301 assert(cur);
00302
00303 code = (huff_table[nzeros])[acur];
00304 nbits = (huff_bits[nzeros])[acur];
00305
00306 assert(nbits);
00307
00308 if (cur < 0)
00309 code |= 1; /* the sign bit */
00310 Bitio_Write(out, code, nbits);
00311 } else {
00312 /*
00313 * encode using the escape code
00314 */
00315 DBG_PRINT(("Escape\n"));
00316 Bitio_Write(out, 0x1, 6); /* ESCAPE */
00317 DBG_PRINT(("Run Length\n"));
00318 Bitio_Write(out, nzeros, 6); /* Run-Length */
00319
00320 assert(cur != 0);
00321
00322 /*
00323 * this shouldn't happen, but the other
00324 * choice is to bomb out and dump core...
00325 */
00326 if (cur < -255)
00327 cur = -255;
00328 else if (cur > 255)
00329 cur = 255;
00330
00331 DBG_PRINT(("Level\n"));
00332 if (acur < 128) {
00333 Bitio_Write(out, cur, 8);
00334 } else {
00335 if (cur < 0) {
00336 Bitio_Write(out, 0x8001 + cur + 255, 16);
00337 } else
00338 Bitio_Write(out, cur, 16);
00339 }
00340 }
00341 nzeros = 0;
00342 } else
00343 nzeros++;
00344 }
00345 DBG_PRINT(("End of block\n"));
00346 Bitio_Write(out, 0x2, 2); /* end of block marker */
00347 }
|
|
||||||||||||
|
Definition at line 364 of file moutput.c. References ABS, DBG_PRINT, DCTSIZE_SQ, FlatBlock, i, int16, uint32, and x2.
00365 {
00366 register int i;
00367 register int nzeros = 0;
00368 register int16 cur;
00369 register int16 acur;
00370 register uint32 code;
00371 register int nbits;
00372 boolean first_dct = TRUE;
00373
00374 /*
00375 * yes, Virginia, we start at 0.
00376 */
00377 for (i = 0; i < DCTSIZE_SQ; i++) {
00378 cur = in[i];
00379 acur = ABS(cur);
00380 if (cur) {
00381 if (nzeros < HUFF_MAXRUN && acur < huff_maxlevel[nzeros]) {
00382 /*
00383 * encode using the Huffman tables
00384 */
00385
00386 DBG_PRINT(("rle_huff %02d: Run %02d, Level %02d\n", i, nzeros, cur));
00387 assert(cur);
00388
00389 if ( first_dct && (nzeros == 0) && (acur == 1) )
00390 {
00391 /* actually, only needs = 0x2 */
00392 code = (cur == 1) ? 0x2 : 0x3;
00393 nbits = 2;
00394 }
00395 else
00396 {
00397 code = (huff_table[nzeros])[acur];
00398 nbits = (huff_bits[nzeros])[acur];
00399 }
00400
00401 assert(nbits);
00402
00403 if (cur < 0)
00404 code |= 1; /* the sign bit */
00405 Bitio_Write(out, code, nbits);
00406 first_dct = FALSE;
00407 } else {
00408 /*
00409 * encode using the escape code
00410 */
00411 DBG_PRINT(("Escape\n"));
00412 Bitio_Write(out, 0x1, 6); /* ESCAPE */
00413 DBG_PRINT(("Run Length\n"));
00414 Bitio_Write(out, nzeros, 6); /* Run-Length */
00415
00416 assert(cur != 0);
00417
00418 /*
00419 * this shouldn't happen, but the other
00420 * choice is to bomb out and dump core...
00421 */
00422 if (cur < -255)
00423 cur = -255;
00424 else if (cur > 255)
00425 cur = 255;
00426
00427 DBG_PRINT(("Level\n"));
00428 if (acur < 128) {
00429 Bitio_Write(out, cur, 8);
00430 } else {
00431 if (cur < 0) {
00432 Bitio_Write(out, 0x8001 + cur + 255, 16);
00433 } else
00434 Bitio_Write(out, cur, 16);
00435 }
00436
00437 first_dct = FALSE;
00438 }
00439 nzeros = 0;
00440 } else
00441 nzeros++;
00442 }
00443
00444 /* actually, should REALLY return FALSE and not use this! */
00445 if ( first_dct ) /* have to give a first_dct even if all 0's */
00446 {
00447 fprintf(stdout, "HUFF called with all-zero coefficients\n");
00448 fprintf(stdout, "exiting...\n");
00449 exit(1);
00450 }
00451
00452 DBG_PRINT(("End of block\n"));
00453 Bitio_Write(out, 0x2, 2); /* end of block marker */
00454 }
|
|
||||||||||||||||||||
|
Definition at line 136 of file moutput.c. References Block, DCTSIZE_SQ, FlatBlock, int16, position, qtable, and ZAG.
00137 {
00138 register int index;
00139 int start;
00140 int position;
00141 register int qentry;
00142 int level, coeff;
00143 register int16 temp;
00144
00145 if ( iblock )
00146 {
00147 ((int16 *)out)[0] = (int16)(in[0]*qtable[0]);
00148
00149 start = 1;
00150 }
00151 else
00152 start = 0;
00153
00154 for ( index = start; index < DCTSIZE_SQ; index++ )
00155 {
00156 position = ZAG[index];
00157
00158 if (iblock)
00159 qentry = qtable[position] * qscale;
00160 else
00161 qentry = 16 * qscale;
00162
00163 level = in[index];
00164 coeff = (level * qentry) >> 3;
00165 if (level < 0) {
00166 coeff += (coeff & 1);
00167 } else {
00168 coeff -= (coeff & 1);
00169 }
00170
00171 ((int16 *)out)[position] = coeff;
00172 }
00173
00174 #ifdef BLEAH
00175 for ( index = 0; index < 64; index++ )
00176 fprintf(stdout, "DCT[%d] = %d\n", index,
00177 ((int16 *)out)[index]);
00178 #endif
00179 }
|
Variable Documentation
|
|
Initial value:
{
8, 16, 19, 22, 26, 27, 29, 34,
16, 16, 22, 24, 27, 29, 34, 37,
19, 22, 26, 27, 29, 34, 34, 38,
22, 22, 26, 27, 29, 34, 37, 40,
22, 26, 27, 29, 32, 35, 40, 48,
26, 27, 29, 32, 35, 40, 48, 58,
26, 27, 29, 34, 38, 46, 56, 69,
27, 29, 35, 38, 46, 56, 69, 83}Definition at line 119 of file moutput.c. Referenced by mp_quant_zig_block(), and UnQuantZig(). |
|
|
Initial value:
{
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
}Definition at line 100 of file moutput.c. Referenced by mp_quant_zig_block(), and UnQuantZig(). |