52 |
|
|
53 |
#include <stdlib.h> |
#include <stdlib.h> |
54 |
#include "../portab.h" |
#include "../portab.h" |
55 |
|
#include "../global.h" |
56 |
#include "bitstream.h" |
#include "bitstream.h" |
57 |
#include "zigzag.h" |
#include "zigzag.h" |
58 |
#include "vlc_codes.h" |
#include "vlc_codes.h" |
60 |
|
|
61 |
#include "../utils/mbfunctions.h" |
#include "../utils/mbfunctions.h" |
62 |
|
|
63 |
#define ABS(X) (((X)>0)?(X):-(X)) |
VLC intra_table[4*2048*64]; |
64 |
#define CLIP(X,A) (X > A) ? (A) : (X) |
VLC inter_table[4*2048*64]; |
|
|
|
|
VLC intra_table[524032]; |
|
|
VLC inter_table[524032]; |
|
65 |
|
|
66 |
VLC DCT3Dintra[4096]; |
VLC DCT3Dintra[4096]; |
67 |
VLC DCT3Dinter[4096]; |
VLC DCT3Dinter[4096]; |
438 |
if (frame->global_flags & XVID_INTERLACING) { |
if (frame->global_flags & XVID_INTERLACING) { |
439 |
if (pMB->cbp) { |
if (pMB->cbp) { |
440 |
BitstreamPutBit(bs, pMB->field_dct); |
BitstreamPutBit(bs, pMB->field_dct); |
441 |
DEBUG1("codep: field_dct: ", pMB->field_dct); |
DPRINTF(DPRINTF_MB,"codep: field_dct: %i", pMB->field_dct); |
442 |
} |
} |
443 |
|
|
444 |
// if inter block, write field ME flag |
// if inter block, write field ME flag |
445 |
if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) { |
if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) { |
446 |
BitstreamPutBit(bs, pMB->field_pred); |
BitstreamPutBit(bs, pMB->field_pred); |
447 |
DEBUG1("codep: field_pred: ", pMB->field_pred); |
DPRINTF(DPRINTF_MB,"codep: field_pred: %i", pMB->field_pred); |
448 |
|
|
449 |
// write field prediction references |
// write field prediction references |
450 |
if (pMB->field_pred) { |
if (pMB->field_pred) { |
681 |
|
|
682 |
uint32_t index; |
uint32_t index; |
683 |
|
|
684 |
index = CLIP(BitstreamShowBits(bs, 9), 256); |
index = MIN(BitstreamShowBits(bs, 9), 256); |
685 |
|
|
686 |
BitstreamSkip(bs, mcbpc_inter_table[index].len); |
BitstreamSkip(bs, mcbpc_inter_table[index].len); |
687 |
|
|
829 |
do { |
do { |
830 |
level = get_coeff(bs, &run, &last, 1, 0); |
level = get_coeff(bs, &run, &last, 1, 0); |
831 |
if (run == -1) { |
if (run == -1) { |
832 |
DEBUG("fatal: invalid run"); |
DPRINTF(DPRINTF_ERROR,"fatal: invalid run"); |
833 |
break; |
break; |
834 |
} |
} |
835 |
coeff += run; |
coeff += run; |
838 |
DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[coeff], level); |
DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[coeff], level); |
839 |
//DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32)); |
//DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32)); |
840 |
|
|
841 |
if (level < -127 || level > 127) { |
if (level < -2047 || level > 2047) { |
842 |
DEBUG1("warning: intra_overflow", level); |
DPRINTF(DPRINTF_ERROR,"warning: intra_overflow %i", level); |
843 |
} |
} |
844 |
coeff++; |
coeff++; |
845 |
} while (!last); |
} while (!last); |
862 |
do { |
do { |
863 |
level = get_coeff(bs, &run, &last, 0, 0); |
level = get_coeff(bs, &run, &last, 0, 0); |
864 |
if (run == -1) { |
if (run == -1) { |
865 |
DEBUG("fatal: invalid run"); |
DPRINTF(DPRINTF_ERROR,"fatal: invalid run"); |
866 |
break; |
break; |
867 |
} |
} |
868 |
p += run; |
p += run; |
872 |
DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[p], level); |
DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[p], level); |
873 |
// DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[p], level, BitstreamShowBits(bs, 32)); |
// DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[p], level, BitstreamShowBits(bs, 32)); |
874 |
|
|
875 |
if (level < -127 || level > 127) { |
if (level < -2047 || level > 2047) { |
876 |
DEBUG1("warning: inter_overflow", level); |
DPRINTF(DPRINTF_ERROR,"warning: inter overflow %i", level); |
877 |
} |
} |
878 |
p++; |
p++; |
879 |
} while (!last); |
} while (!last); |