--- mbcoding.c 2002/09/08 15:40:02 1.28 +++ mbcoding.c 2002/11/17 00:57:57 1.33 @@ -5,18 +5,10 @@ * * Copyright(C) 2002 Michael Militzer * + * This file is part of XviD, a free MPEG-4 video encoder/decoder * - * This program is an implementation of a part of one or more MPEG-4 - * Video tools as specified in ISO/IEC 14496-2 standard. Those intending - * to use this software module in hardware or software products are - * advised that its use may infringe existing patents or copyrights, and - * any such use would be at such party's own risk. The original - * developer of this software module and his/her company, and subsequent - * editors and their companies, will have no liability for use of this - * software or modifications or derivatives thereof. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by + * XviD is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * @@ -29,7 +21,36 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: mbcoding.c,v 1.28 2002/09/08 15:40:02 edgomez Exp $ + * Under section 8 of the GNU General Public License, the copyright + * holders of XVID explicitly forbid distribution in the following + * countries: + * + * - Japan + * - United States of America + * + * Linking XviD statically or dynamically with other modules is making a + * combined work based on XviD. Thus, the terms and conditions of the + * GNU General Public License cover the whole combination. + * + * As a special exception, the copyright holders of XviD give you + * permission to link XviD with independent modules that communicate with + * XviD solely through the VFW1.1 and DShow interfaces, regardless of the + * license terms of these independent modules, and to copy and distribute + * the resulting combined work under terms of your choice, provided that + * every copy of the combined work is accompanied by a complete copy of + * the source code of XviD (the version of XviD used to produce the + * combined work), being distributed under the terms of the GNU General + * Public License plus this exception. An independent module is a module + * which is not derived from or based on XviD. + * + * Note that people who make modified versions of XviD are not obligated + * to grant this special exception for their modified versions; it is + * their choice whether to do so. The GNU General Public License gives + * permission to release a modified version without this exception; this + * exception also makes it possible to release a modified version which + * carries forward this exception. + * + * $Id: mbcoding.c,v 1.33 2002/11/17 00:57:57 edgomez Exp $ * ****************************************************************************/ @@ -49,8 +70,9 @@ * Local data ****************************************************************************/ -static VLC intra_table[524032]; -static VLC inter_table[524032]; +/* msvc sp5+pp gets confused if they globals are made static */ +VLC intra_table[524032]; +VLC inter_table[524032]; static VLC DCT3Dintra[4096]; static VLC DCT3Dinter[4096]; @@ -65,7 +87,7 @@ int32_t k, l, i, intra, last; VLC *vlc[2]; - VLC **coeff_ptr; + VLC const **coeff_ptr; VLC *vlc1, *vlc2; vlc1 = DCT3Dintra; @@ -86,8 +108,8 @@ coeff_ptr = coeff_vlc[last + 2 * intra]; for (k = -2047; k < 2048; k++) { // level - int8_t *max_level_ptr = max_level[last + 2 * intra]; - int8_t *max_run_ptr = max_run[last + 2 * intra]; + int8_t const *max_level_ptr = max_level[last + 2 * intra]; + int8_t const *max_run_ptr = max_run[last + 2 * intra]; for (l = 0; l < 64; l++) { // run int32_t level = k; @@ -373,13 +395,13 @@ if (frame->global_flags & XVID_INTERLACING) { if (pMB->cbp) { BitstreamPutBit(bs, pMB->field_dct); - DEBUG1("codep: field_dct: ", pMB->field_dct); + DPRINTF(DPRINTF_DEBUG, "codep: field_dct: %d", pMB->field_dct); } // if inter block, write field ME flag if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) { BitstreamPutBit(bs, pMB->field_pred); - DEBUG1("codep: field_pred: ", pMB->field_pred); + DPRINTF(DPRINTF_DEBUG, "codep: field_pred: %d", pMB->field_pred); // write field prediction references if (pMB->field_pred) { @@ -437,144 +459,6 @@ return; } -#if 0 -/*************************************************************** - * bframe encoding start - ***************************************************************/ - -/* - mbtype - 0 1b direct(h263) mvdb - 1 01b interpolate mc+q dbquant, mvdf, mvdb - 2 001b backward mc+q dbquant, mvdb - 3 0001b forward mc+q dbquant, mvdf -*/ - -void -put_bvop_mbtype(Bitstream * bs, - int value) -{ - switch (value) { - case 0: - BitstreamPutBit(bs, 1); - return; - - case 1: - BitstreamPutBit(bs, 0); - BitstreamPutBit(bs, 1); - return; - - case 2: - BitstreamPutBit(bs, 0); - BitstreamPutBit(bs, 0); - BitstreamPutBit(bs, 1); - return; - - case 3: - BitstreamPutBit(bs, 0); - BitstreamPutBit(bs, 0); - BitstreamPutBit(bs, 0); - BitstreamPutBit(bs, 1); - return; - - default:; // invalid! - - } - -} - -/* - dbquant - -2 10b - 0 0b - +2 11b -*/ - -void -put_bvop_dbquant(Bitstream * bs, - int value) -{ - switch (value) { - case 0: - BitstreamPutBit(bs, 0); - return; - - case -2: - BitstreamPutBit(bs, 1); - BitstreamPutBit(bs, 0); - return; - - case 2: - BitstreamPutBit(bs, 1); - BitstreamPutBit(bs, 1); - return; - - default:; // invalid - } -} - -void -MBCodingBVOP(const MACROBLOCK * mb, - const int16_t qcoeff[6 * 64], - const int32_t fcode, - const int32_t bcode, - Bitstream * bs, - Statistics * pStat) -{ - int i; - -/* ------------------------------------------------------------------ - when a block is skipped it is decoded DIRECT(0,0) - hence is interpolated from forward & backward frames - ------------------------------------------------------------------ */ - - if (mb->mode == MODE_DIRECT_NONE_MV) { - BitstreamPutBit(bs, 1); // skipped - return; - } - - BitstreamPutBit(bs, 0); // not skipped - - if (mb->cbp == 0) { - BitstreamPutBit(bs, 1); // cbp == 0 - } else { - BitstreamPutBit(bs, 0); // cbp == xxx - } - - put_bvop_mbtype(bs, mb->mode); - - if (mb->cbp) { - BitstreamPutBits(bs, mb->cbp, 6); - } - - if (mb->mode != MODE_DIRECT && mb->cbp != 0) { - put_bvop_dbquant(bs, 0); // todo: mb->dquant = 0 - } - - if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_FORWARD) { - CodeVector(bs, mb->pmvs[0].x, fcode, pStat); - CodeVector(bs, mb->pmvs[0].y, fcode, pStat); - } - - if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_BACKWARD) { - CodeVector(bs, mb->b_pmvs[0].x, bcode, pStat); - CodeVector(bs, mb->b_pmvs[0].y, bcode, pStat); - } - - if (mb->mode == MODE_DIRECT) { - CodeVector(bs, mb->deltamv.x, 1, pStat); /* fcode is always 1 for delta vector */ - CodeVector(bs, mb->deltamv.y, 1, pStat); /* prediction is always (0,0) */ - } - - for (i = 0; i < 6; i++) { - if (mb->cbp & (1 << (5 - i))) { - CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_tables[0], 0); - } - } -} -#endif - - /***************************************************************************** * decoding stuff starts here ****************************************************************************/ @@ -808,7 +692,7 @@ level = BitstreamGetBits(bs, 8); if (level == 0 || level == 128) - DEBUG1("Illegal LEVEL for ESCAPE mode 4:", level); + DPRINTF(DPRINTF_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d", level); return (level >= 128 ? -(256 - level) : level); } @@ -876,7 +760,7 @@ do { level = get_coeff(bs, &run, &last, 1, 0); if (run == -1) { - DEBUG("fatal: invalid run"); + DPRINTF(DPRINTF_DEBUG, "fatal: invalid run"); break; } coeff += run; @@ -886,7 +770,7 @@ //DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32)); if (level < -127 || level > 127) { - DEBUG1("warning: intra_overflow", level); + DPRINTF(DPRINTF_DEBUG, "warning: intra_overflow: %d", level); } coeff++; } while (!last); @@ -908,7 +792,7 @@ do { level = get_coeff(bs, &run, &last, 0, 0); if (run == -1) { - DEBUG("fatal: invalid run"); + DPRINTF(DPRINTF_ERROR, "fatal: invalid run"); break; } p += run; @@ -916,10 +800,9 @@ block[scan[p]] = level; DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[p], level); - // DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[p], level, BitstreamShowBits(bs, 32)); if (level < -127 || level > 127) { - DEBUG1("warning: inter_overflow", level); + DPRINTF(DPRINTF_DEBUG, "warning: inter_overflow: %d", level); } p++; } while (!last);