1 |
/***************************************************************************** |
/***************************************************************************** |
2 |
* |
* |
3 |
* XVID MPEG-4 VIDEO CODEC |
* XVID MPEG-4 VIDEO CODEC |
4 |
* - Vector Length Coding tables - |
* - Macro Block coding functions - |
5 |
* |
* |
6 |
* Copyright(C) 2002 Michael Militzer <isibaar@xvid.org> |
* Copyright(C) 2002 Michael Militzer <isibaar@xvid.org> |
7 |
* |
* |
29 |
* along with this program; if not, write to the Free Software |
* along with this program; if not, write to the Free Software |
30 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
31 |
* |
* |
32 |
* $Id: mbcoding.c,v 1.26 2002-09-08 14:43:04 edgomez Exp $ |
* $Id: mbcoding.c,v 1.27 2002-09-08 15:39:01 edgomez Exp $ |
33 |
* |
* |
34 |
****************************************************************************/ |
****************************************************************************/ |
35 |
|
|
56 |
static VLC DCT3Dinter[4096]; |
static VLC DCT3Dinter[4096]; |
57 |
|
|
58 |
/***************************************************************************** |
/***************************************************************************** |
59 |
* Functions |
* Vector Length Coding Initialization |
60 |
****************************************************************************/ |
****************************************************************************/ |
61 |
|
|
62 |
void |
void |
180 |
|
|
181 |
} |
} |
182 |
|
|
183 |
|
/***************************************************************************** |
184 |
|
* Local inlined functions for MB coding |
185 |
|
****************************************************************************/ |
186 |
|
|
187 |
static __inline void |
static __inline void |
188 |
CodeVector(Bitstream * bs, |
CodeVector(Bitstream * bs, |
189 |
int32_t value, |
int32_t value, |
239 |
|
|
240 |
} |
} |
241 |
|
|
|
|
|
242 |
static __inline void |
static __inline void |
243 |
CodeCoeff(Bitstream * bs, |
CodeCoeff(Bitstream * bs, |
244 |
const int16_t qcoeff[64], |
const int16_t qcoeff[64], |
277 |
|
|
278 |
} |
} |
279 |
|
|
280 |
|
/***************************************************************************** |
281 |
|
* Local functions |
282 |
|
****************************************************************************/ |
283 |
|
|
284 |
static void |
static void |
285 |
CodeBlockIntra(const FRAMEINFO * frame, |
CodeBlockIntra(const FRAMEINFO * frame, |
406 |
|
|
407 |
} |
} |
408 |
|
|
409 |
|
/***************************************************************************** |
410 |
|
* Macro Block bitstream encoding functions |
411 |
|
****************************************************************************/ |
412 |
|
|
413 |
void |
void |
414 |
MBCoding(const FRAMEINFO * frame, |
MBCoding(const FRAMEINFO * frame, |
513 |
} |
} |
514 |
} |
} |
515 |
|
|
516 |
|
#if 0 |
|
|
|
517 |
void |
void |
518 |
MBCodingBVOP(const MACROBLOCK * mb, |
MBCodingBVOP(const MACROBLOCK * mb, |
519 |
const int16_t qcoeff[6 * 64], |
const int16_t qcoeff[6 * 64], |
573 |
} |
} |
574 |
} |
} |
575 |
} |
} |
576 |
|
#endif |
577 |
|
|
578 |
|
|
579 |
|
/***************************************************************************** |
580 |
|
* decoding stuff starts here |
581 |
|
****************************************************************************/ |
582 |
|
|
583 |
/*************************************************************** |
/* |
584 |
* decoding stuff starts here * |
* For IVOP addbits == 0 |
585 |
***************************************************************/ |
* For PVOP addbits == fcode - 1 |
586 |
|
* For BVOP addbits == max(fcode,bcode) - 1 |
587 |
|
* returns true or false |
588 |
|
*/ |
589 |
|
|
|
// for IVOP addbits == 0 |
|
|
// for PVOP addbits == fcode - 1 |
|
|
// for BVOP addbits == max(fcode,bcode) - 1 |
|
|
// returns true or false |
|
590 |
int |
int |
591 |
check_resync_marker(Bitstream * bs, int addbits) |
check_resync_marker(Bitstream * bs, int addbits) |
592 |
{ |
{ |
763 |
|
|
764 |
} |
} |
765 |
|
|
766 |
|
/***************************************************************************** |
767 |
|
* Local inlined function to "decode" written vlc codes |
768 |
|
****************************************************************************/ |
769 |
|
|
770 |
|
static __inline int |
771 |
|
get_coeff(Bitstream * bs, |
772 |
|
int *run, |
773 |
|
int *last, |
774 |
|
int intra, |
775 |
|
int short_video_header) |
776 |
|
{ |
777 |
|
|
778 |
|
uint32_t mode; |
779 |
|
const VLC *tab; |
780 |
|
int32_t level; |
781 |
|
|
782 |
|
if (short_video_header) // inter-VLCs will be used for both intra and inter blocks |
783 |
|
intra = 0; |
784 |
|
|
785 |
|
tab = &DCT3D[intra][BitstreamShowBits(bs, 12)]; |
786 |
|
|
787 |
|
if (tab->code == -1) |
788 |
|
goto error; |
789 |
|
|
790 |
|
BitstreamSkip(bs, tab->len); |
791 |
|
|
792 |
|
if (tab->code != ESCAPE) { |
793 |
|
if (!intra) { |
794 |
|
*run = (tab->code >> 4) & 255; |
795 |
|
level = tab->code & 15; |
796 |
|
*last = (tab->code >> 12) & 1; |
797 |
|
} else { |
798 |
|
*run = (tab->code >> 8) & 255; |
799 |
|
level = tab->code & 255; |
800 |
|
*last = (tab->code >> 16) & 1; |
801 |
|
} |
802 |
|
return BitstreamGetBit(bs) ? -level : level; |
803 |
|
} |
804 |
|
|
805 |
|
if (short_video_header) { |
806 |
|
// escape mode 4 - H.263 type, only used if short_video_header = 1 |
807 |
|
*last = BitstreamGetBit(bs); |
808 |
|
*run = BitstreamGetBits(bs, 6); |
809 |
|
level = BitstreamGetBits(bs, 8); |
810 |
|
|
811 |
|
if (level == 0 || level == 128) |
812 |
|
DEBUG1("Illegal LEVEL for ESCAPE mode 4:", level); |
813 |
|
|
814 |
|
return (level >= 128 ? -(256 - level) : level); |
815 |
|
} |
816 |
|
|
817 |
|
mode = BitstreamShowBits(bs, 2); |
818 |
|
|
819 |
|
if (mode < 3) { |
820 |
|
BitstreamSkip(bs, (mode == 2) ? 2 : 1); |
821 |
|
|
822 |
|
tab = &DCT3D[intra][BitstreamShowBits(bs, 12)]; |
823 |
|
if (tab->code == -1) |
824 |
|
goto error; |
825 |
|
|
826 |
|
BitstreamSkip(bs, tab->len); |
827 |
|
|
828 |
|
if (!intra) { |
829 |
|
*run = (tab->code >> 4) & 255; |
830 |
|
level = tab->code & 15; |
831 |
|
*last = (tab->code >> 12) & 1; |
832 |
|
} else { |
833 |
|
*run = (tab->code >> 8) & 255; |
834 |
|
level = tab->code & 255; |
835 |
|
*last = (tab->code >> 16) & 1; |
836 |
|
} |
837 |
|
|
838 |
|
if (mode < 2) // first escape mode, level is offset |
839 |
|
level += max_level[*last + (!intra << 1)][*run]; // need to add back the max level |
840 |
|
else if (mode == 2) // second escape mode, run is offset |
841 |
|
*run += max_run[*last + (!intra << 1)][level] + 1; |
842 |
|
|
843 |
|
return BitstreamGetBit(bs) ? -level : level; |
844 |
|
} |
845 |
|
// third escape mode - fixed length codes |
846 |
|
BitstreamSkip(bs, 2); |
847 |
|
*last = BitstreamGetBits(bs, 1); |
848 |
|
*run = BitstreamGetBits(bs, 6); |
849 |
|
BitstreamSkip(bs, 1); // marker |
850 |
|
level = BitstreamGetBits(bs, 12); |
851 |
|
BitstreamSkip(bs, 1); // marker |
852 |
|
|
853 |
|
return (level & 0x800) ? (level | (-1 ^ 0xfff)) : level; |
854 |
|
|
855 |
|
error: |
856 |
|
*run = VLC_ERROR; |
857 |
|
return 0; |
858 |
|
|
859 |
|
} |
860 |
|
|
861 |
|
/***************************************************************************** |
862 |
|
* MB reading functions |
863 |
|
****************************************************************************/ |
864 |
|
|
865 |
void |
void |
866 |
get_intra_block(Bitstream * bs, |
get_intra_block(Bitstream * bs, |
867 |
int16_t * block, |
int16_t * block, |