📄 putvlc.c
字号:
/************************************************************************** * * * This code is developed by Adam Li. This software 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 (including Project Mayo), will have no liability for use of * * this software or modifications or derivatives thereof. * * * * Project Mayo gives users of the Codec a license to this software * * module or modifications thereof for use in hardware or software * * products claiming conformance to the MPEG-4 Video Standard as * * described in the Open DivX license. * * * * The complete Open DivX license can be found at * * http://www.projectmayo.com/opendivx/license.php . * * * **************************************************************************//************************************************************************** * * putvlc.c * * Copyright (C) 2001 Project Mayo * * Adam Li * * DivX Advance Research Center <darc@projectmayo.com> * **************************************************************************//* This file contains some functions to code the RVLC code for bitstream. *//* Some codes of this project come from MoMuSys MPEG-4 implementation. *//* Please see seperate acknowledgement file for a list of contributors. */#include "vlc_codes.h"#include "putvlc.h"#include "max_level.h"#include <assert.h>/***********************************************************CommentBegin****** * * -- Putxxx -- Write bits from huffman tables to file * * Purpose : * Writes bits from huffman tables to bitstream * * Arguments in : * various * * Return values : * Number of bits written * ***********************************************************CommentEnd********/int PutDCsize_lum(Bitstream * bitstream, int size){ assert(size >= 0 && size < 13); BitstreamPutBits(bitstream, DCtab_lum[size].code, DCtab_lum[size].len); return DCtab_lum[size].len;}int PutDCsize_chrom(Bitstream * bitstream, int size){ assert(size >= 0 && size < 13); BitstreamPutBits(bitstream, DCtab_chrom[size].code, DCtab_chrom[size].len); return DCtab_chrom[size].len;}int PutMV(Bitstream * bitstream, int mvint){ int sign = 0; int absmv; if (mvint > 32) { absmv = -mvint + 65; sign = 1; } else absmv = mvint; BitstreamPutBits(bitstream, mvtab[absmv].code, mvtab[absmv].len); if (mvint != 0) { BitstreamPutBits(bitstream, sign, 1); return mvtab[absmv].len + 1; } else return mvtab[absmv].len;}int PutMCBPC_intra(Bitstream * bitstream, int cbpc, int mode){ int ind; ind = ((mode >> 1) & 3) | ((cbpc & 3) << 2); BitstreamPutBits(bitstream, mcbpc_intra_tab[ind].code, mcbpc_intra_tab[ind].len); return mcbpc_intra_tab[ind].len;}int PutMCBPC_inter(Bitstream * bitstream, int cbpc, int mode){ int ind; ind = (mode & 7) | ((cbpc & 3) << 3); BitstreamPutBits(bitstream, mcbpc_inter_tab[ind].code, mcbpc_inter_tab[ind].len); return mcbpc_inter_tab[ind].len;}int PutMCBPC_Sprite(Bitstream * bitstream, int cbpc, int mode){ int ind; ind = (mode & 7) | ((cbpc & 3) << 3); BitstreamPutBits(bitstream, mcbpc_sprite_tab[ind].code, mcbpc_sprite_tab[ind].len); return mcbpc_sprite_tab[ind].len;}int PutCBPY(Bitstream * bitstream, int cbpy, bool intra){ if (intra == 0) cbpy = 15 - cbpy; BitstreamPutBits(bitstream, cbpy_tab[cbpy].code, cbpy_tab[cbpy].len); return cbpy_tab[cbpy].len;}int PutCoeff_inter(Bitstream * bitstream, int run, int level, int last){ int length = 0; assert(last >= 0 && last < 2); assert(run >= 0 && run < 64); assert(level > 0 && level < 128); if (last == 0) { if (run < 2 && level < 13) { BitstreamPutBits(bitstream, coeff_tab0[run][level - 1].code, coeff_tab0[run][level - 1].len); length = coeff_tab0[run][level - 1].len; } else if (run > 1 && run < 27 && level < 5) { BitstreamPutBits(bitstream, coeff_tab1[run - 2][level - 1].code, coeff_tab1[run - 2][level - 1].len); length = coeff_tab1[run - 2][level - 1].len; } } else if (last == 1) { if (run < 2 && level < 4) { BitstreamPutBits(bitstream, coeff_tab2[run][level - 1].code, coeff_tab2[run][level - 1].len); length = coeff_tab2[run][level - 1].len; } else if (run > 1 && run < 42 && level == 1) { BitstreamPutBits(bitstream, coeff_tab3[run - 2].code, coeff_tab3[run - 2].len); length = coeff_tab3[run - 2].len; } } return length;}int PutCoeff_intra(Bitstream * bitstream, int run, int level, int last){ int length = 0; assert(last >= 0 && last < 2); assert(run >= 0 && run < 64); assert(level > 0 && level < 128); if (last == 0) { if (run == 0 && level < 28) { BitstreamPutBits(bitstream, coeff_tab4[level - 1].code, coeff_tab4[level - 1].len); length = coeff_tab4[level - 1].len; } else if (run == 1 && level < 11) { BitstreamPutBits(bitstream, coeff_tab5[level - 1].code, coeff_tab5[level - 1].len); length = coeff_tab5[level - 1].len; } else if (run > 1 && run < 10 && level < 6) { BitstreamPutBits(bitstream, coeff_tab6[run - 2][level - 1].code, coeff_tab6[run - 2][level - 1].len); length = coeff_tab6[run - 2][level - 1].len; } else if (run > 9 && run < 15 && level == 1) { BitstreamPutBits(bitstream, coeff_tab7[run - 10].code, coeff_tab7[run - 10].len); length = coeff_tab7[run - 10].len; } } else if (last == 1) { if (run == 0 && level < 9) { BitstreamPutBits(bitstream, coeff_tab8[level - 1].code, coeff_tab8[level - 1].len); length = coeff_tab8[level - 1].len; } else if (run > 0 && run < 7 && level < 4) { BitstreamPutBits(bitstream, coeff_tab9[run - 1][level - 1].code, coeff_tab9[run - 1][level - 1].len); length = coeff_tab9[run - 1][level - 1].len; } else if (run > 6 && run < 21 && level == 1) { BitstreamPutBits(bitstream, coeff_tab10[run - 7].code, coeff_tab10[run - 7].len); length = coeff_tab10[run - 7].len; } } return length;}int PutCoeff_inter_RVLC(Bitstream * bitstream, int run, int level, int last){ int length = 0; assert(last >= 0 && last < 2); assert(run >= 0 && run < 64); assert(level > 0 && level < 128); if (last == 0) { if (run == 0 && level < 20) { BitstreamPutBits(bitstream, coeff_RVLCtab14[level - 1].code, coeff_RVLCtab14[level - 1].len); length = coeff_RVLCtab14[level - 1].len; } else if (run == 1 && level < 11) { BitstreamPutBits(bitstream, coeff_RVLCtab15[level - 1].code, coeff_RVLCtab15[level - 1].len); length = coeff_RVLCtab15[level - 1].len; } else if (run > 1 && run < 4 && level < 8) { BitstreamPutBits(bitstream, coeff_RVLCtab16[run - 2][level - 1].code, coeff_RVLCtab16[run - 2][level - 1].len); length = coeff_RVLCtab16[run - 2][level - 1].len; } else if (run == 4 && level < 6) { BitstreamPutBits(bitstream, coeff_RVLCtab17[level - 1].code, coeff_RVLCtab17[level - 1].len); length = coeff_RVLCtab17[level - 1].len; } else if (run > 4 && run < 8 && level < 5) { BitstreamPutBits(bitstream, coeff_RVLCtab18[run - 5][level - 1].code, coeff_RVLCtab18[run - 5][level - 1].len); length = coeff_RVLCtab18[run - 5][level - 1].len; } else if (run > 7 && run < 10 && level < 4) { BitstreamPutBits(bitstream, coeff_RVLCtab19[run - 8][level - 1].code, coeff_RVLCtab19[run - 8][level - 1].len); length = coeff_RVLCtab19[run - 8][level - 1].len; } else if (run > 9 && run < 18 && level < 3) { BitstreamPutBits(bitstream, coeff_RVLCtab20[run - 10][level - 1].code, coeff_RVLCtab20[run - 10][level - 1].len); length = coeff_RVLCtab20[run - 10][level - 1].len; } else if (run > 17 && run < 39 && level == 1) { BitstreamPutBits(bitstream, coeff_RVLCtab21[run - 18].code, coeff_RVLCtab21[run - 18].len); length = coeff_RVLCtab21[run - 18].len; } } else if (last == 1) { if (run >= 0 && run < 2 && level < 6) { BitstreamPutBits(bitstream, coeff_RVLCtab22[run][level - 1].code, coeff_RVLCtab22[run][level - 1].len); length = coeff_RVLCtab22[run][level - 1].len; } else if (run == 2 && level < 4) { BitstreamPutBits(bitstream, coeff_RVLCtab23[level - 1].code, coeff_RVLCtab23[level - 1].len); length = coeff_RVLCtab23[level - 1].len; } else if (run > 2 && run < 14 && level < 3) { BitstreamPutBits(bitstream, coeff_RVLCtab24[run - 3][level - 1].code, coeff_RVLCtab24[run - 3][level - 1].len); length = coeff_RVLCtab24[run - 3][level - 1].len; } else if (run > 13 && run < 46 && level == 1) { BitstreamPutBits(bitstream, coeff_RVLCtab25[run - 14].code, coeff_RVLCtab25[run - 14].len); length = coeff_RVLCtab25[run - 14].len; } } return length;}int PutCoeff_intra_RVLC(Bitstream * bitstream, int run, int level, int last){ int length = 0; assert(last >= 0 && last < 2); assert(run >= 0 && run < 64); assert(level > 0 && level < 128); if (last == 0) { if (run == 0 && level < 28) { BitstreamPutBits(bitstream, coeff_RVLCtab1[level - 1].code, coeff_RVLCtab1[level - 1].len); length = coeff_RVLCtab1[level - 1].len; } else if (run == 1 && level < 14) { BitstreamPutBits(bitstream, coeff_RVLCtab2[level - 1].code, coeff_RVLCtab2[level - 1].len); length = coeff_RVLCtab2[level - 1].len; } else if (run == 2 && level < 12) { BitstreamPutBits(bitstream, coeff_RVLCtab3[level - 1].code, coeff_RVLCtab3[level - 1].len); length = coeff_RVLCtab3[level - 1].len; } else if (run == 3 && level < 10) { BitstreamPutBits(bitstream, coeff_RVLCtab4[level - 1].code, coeff_RVLCtab4[level - 1].len); length = coeff_RVLCtab4[level - 1].len; } else if (run > 3 && run < 6 && level < 7) { BitstreamPutBits(bitstream, coeff_RVLCtab5[run - 4][level - 1].code, coeff_RVLCtab5[run - 4][level - 1].len); length = coeff_RVLCtab5[run - 4][level - 1].len; } else if (run > 5 && run < 8 && level < 6) { BitstreamPutBits(bitstream, coeff_RVLCtab6[run - 6][level - 1].code, coeff_RVLCtab6[run - 6][level - 1].len); length = coeff_RVLCtab6[run - 6][level - 1].len; } else if (run > 7 && run < 10 && level < 5) { BitstreamPutBits(bitstream, coeff_RVLCtab7[run - 8][level - 1].code, coeff_RVLCtab7[run - 8][level - 1].len); length = coeff_RVLCtab7[run - 8][level - 1].len; } else if (run > 9 && run < 13 && level < 3) { BitstreamPutBits(bitstream, coeff_RVLCtab8[run - 10][level - 1].code, coeff_RVLCtab8[run - 10][level - 1].len); length = coeff_RVLCtab8[run - 10][level - 1].len; } else if (run > 12 && run < 20 && level == 1) { BitstreamPutBits(bitstream, coeff_RVLCtab9[run - 13].code, coeff_RVLCtab9[run - 13].len); length = coeff_RVLCtab9[run - 13].len; } } else if (last == 1) { if (run >= 0 && run < 2 && level < 6) { BitstreamPutBits(bitstream, coeff_RVLCtab10[run][level - 1].code, coeff_RVLCtab10[run][level - 1].len); length = coeff_RVLCtab10[run][level - 1].len; } else if (run == 2 && level < 4) { BitstreamPutBits(bitstream, coeff_RVLCtab11[level - 1].code, coeff_RVLCtab11[level - 1].len); length = coeff_RVLCtab11[level - 1].len; } else if (run > 2 && run < 14 && level < 3) { BitstreamPutBits(bitstream, coeff_RVLCtab12[run - 3][level - 1].code, coeff_RVLCtab12[run - 3][level - 1].len); length = coeff_RVLCtab12[run - 3][level - 1].len; } else if (run > 13 && run < 46 && level == 1) { BitstreamPutBits(bitstream, coeff_RVLCtab13[run - 14].code, coeff_RVLCtab13[run - 14].len); length = coeff_RVLCtab13[run - 14].len; } } return length;}/* The following is for 3-mode VLC */int PutRunCoeff_inter(Bitstream * bitstream, int run, int level, int last){ int length = 0; assert(last >= 0 && last < 2); assert(run >= 0 && run < 64); assert(level > 0 && level < 128); if (last == 0) { if (run < 2 && level < 13) { length = coeff_tab0[run][level - 1].len; if (length != 0) { /* boon 120697 */ BitstreamPutBits(bitstream, 3L, 7L); /* boon 120697 */ BitstreamPutBits(bitstream, 2L, 2L); length += 9; /* boon */ BitstreamPutBits(bitstream, coeff_tab0[run][level - 1].code, coeff_tab0[run][level - 1].len); } } else if (run > 1 && run < 27 && level < 5) { length = coeff_tab1[run - 2][level - 1].len; if (length != 0) { /* boon 120697 */ BitstreamPutBits(bitstream, 3L, 7L); /* boon 120697 */ BitstreamPutBits(bitstream, 2L, 2L); length += 9; /* boon */ BitstreamPutBits(bitstream, coeff_tab1[run - 2][level - 1].code, coeff_tab1[run - 2][level - 1].len); } } } else if (last == 1) { if (run < 2 && level < 4) { length = coeff_tab2[run][level - 1].len; if (length != 0) { /* boon 120697 */ BitstreamPutBits(bitstream, 3L, 7L); /* boon 120697 */ BitstreamPutBits(bitstream, 2L, 2L); length += 9; /* boon */ BitstreamPutBits(bitstream, coeff_tab2[run][level - 1].code, coeff_tab2[run][level - 1].len); } } else if (run > 1 && run < 42 && level == 1) { length = coeff_tab3[run - 2].len; if (length != 0) { /* boon 120697 */ BitstreamPutBits(bitstream, 3L, 7L); /* boon 120697 */ BitstreamPutBits(bitstream, 2L, 2L); length += 9; /* boon */ BitstreamPutBits(bitstream, coeff_tab3[run - 2].code, coeff_tab3[run - 2].len); } } } return length;}int PutRunCoeff_intra(Bitstream * bitstream, int run, int level, int last){ int length = 0; assert(last >= 0 && last < 2); assert(run >= 0 && run < 64); assert(level > 0 && level < 128); if (last == 0) { if (run == 0 && level < 28) { length = coeff_tab4[level - 1].len; if (length != 0) { /* boon 120697 */ BitstreamPutBits(bitstream, 3L, 7L); /* boon 120697 */ BitstreamPutBits(bitstream, 2L, 2L); length += 9; /* boon */ BitstreamPutBits(bitstream, coeff_tab4[level - 1].code, coeff_tab4[level - 1].len);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -