⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 putvlc.c

📁 quicktime linux播放器v1
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************** *                                                                        * * 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 + -