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

📄 mantissa.c

📁 ac3的解码程序
💻 C
字号:
/*  *    mantissa.c * *	Copyright (C) Aaron Holtzman - May 1999 * *  This file is part of ac3dec, a free Dolby AC-3 stream decoder. *	 *  ac3dec 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, or (at your option) *  any later version. *    *  ac3dec is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. *    *  You should have received a copy of the GNU General Public License *  along with GNU Make; see the file COPYING.  If not, write to *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  * */#include <stdlib.h>#include <stdio.h>#include "ac3.h"#include "decode.h"#include "bitstream.h"#include "dither.h"#include "mantissa.h"//Lookup tables of 0.16 two's complement quantization valuesuint_16 q_1[3] = {( -2 << 15)/3, 0           ,(  2 << 15)/3 };uint_16 q_2[5] = {( -4 << 15)/5,( -2 << 15)/5,   0         ,	                (  2 << 15)/5,(  4 << 15)/5};uint_16 q_3[7] = {( -6 << 15)/7,( -4 << 15)/7,( -2 << 15)/7,	                   0         ,(  2 << 15)/7,(  4 << 15)/7,									(  6 << 15)/7};uint_16 q_4[11] = {(-10 << 15)/11,(-8 << 15)/11,(-6 << 15)/11,	                ( -4 << 15)/11,(-2 << 15)/11,  0          ,									(  2 << 15)/11,( 4 << 15)/11,( 6 << 15)/11,									(  8 << 15)/11,(10 << 15)/11};uint_16 q_5[15] = {(-14 << 15)/15,(-12 << 15)/15,(-10 << 15)/15,                   ( -8 << 15)/15,( -6 << 15)/15,( -4 << 15)/15,									 ( -2 << 15)/15,   0          ,(  2 << 15)/15,									 (  4 << 15)/15,(  6 << 15)/15,(  8 << 15)/15,									 ( 10 << 15)/15,( 12 << 15)/15,( 14 << 15)/15};//These store the persistent state of the packed mantissasstatic uint_16 m_1[3];static uint_16 m_2[3];static uint_16 m_4[2];static uint_16 m_1_pointer;static uint_16 m_2_pointer;static uint_16 m_4_pointer;//Conversion from bap to number of bits in the mantissas//zeros account for cases 0,1,2,4 which are special casedstatic uint_16 qnttztab[16] = { 0, 0, 0, 3, 0 , 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16};static uint_16 mantissa_get(bitstream_t *bs, uint_16 bap, uint_16 dithflag);static void mantissa_reset(void);voidmantissa_unpack(bsi_t *bsi, audblk_t *audblk,bitstream_t *bs){	uint_16 i,j;	uint_32 done_cpl = 0;	mantissa_reset();	for(i=0; i< bsi->nfchans; i++)	{		for(j=0; j < audblk->endmant[i]; j++)			audblk->chmant[i][j] = mantissa_get(bs,audblk->fbw_bap[i][j],audblk->dithflag[i]);		if(audblk->cplinu && audblk->chincpl[i] && !(done_cpl))		{			/* ncplmant is equal to 12 * ncplsubnd */			/* Don't dither coupling channel until channel separation so that			 * interchannel noise is uncorrelated */			for(j=audblk->cplstrtmant; j < audblk->cplendmant; j++)				audblk->cplmant[j] = mantissa_get(bs,audblk->cpl_bap[j],0);			done_cpl = 1;		}	}	if(bsi->lfeon)	{		/* There are always 7 mantissas for lfe, no dither for lfe */		for(j=0; j < 7 ; j++)			audblk->lfemant[j] = mantissa_get(bs,audblk->lfe_bap[j],0);	}}/* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */static uint_16mantissa_get(bitstream_t *bs, uint_16 bap, uint_16 dithflag){	uint_16 result;	uint_16 group_code;	//If the bap is 0-5 then we have special cases to take care of	switch(bap)	{		case 0:			if(dithflag)				result = dither_gen();			else				result = 0;			break;		case 1:			if(m_1_pointer > 2)			{				group_code = bitstream_get(bs,5);				if(group_code > 26)					//FIXME do proper block error handling					printf("\n!! Invalid mantissa !!\n");				m_1[0] = group_code / 9; 				m_1[1] = (group_code % 9) / 3; 				m_1[2] = (group_code % 9) % 3; 				m_1_pointer = 0;			}			result = m_1[m_1_pointer++];			result = q_1[result];			break;		case 2:			if(m_2_pointer > 2)			{				group_code = bitstream_get(bs,7);				if(group_code > 124)					//FIXME do proper block error handling					printf("\n!! Invalid mantissa !!\n");				m_2[0] = group_code / 25;				m_2[1] = (group_code % 25) / 5 ;				m_2[2] = (group_code % 25) % 5 ; 				m_2_pointer = 0;			}			result = m_2[m_2_pointer++];			result = q_2[result];			break;		case 3:			result = bitstream_get(bs,3);			if(result > 6)				//FIXME do proper block error handling				printf("\n!! Invalid mantissa !!\n");			result = q_3[result];			break;		case 4:			if(m_4_pointer > 1)			{				group_code = bitstream_get(bs,7);				if(group_code > 120)					//FIXME do proper block error handling					printf("\n!! Invalid mantissa !!\n");				m_4[0] = group_code / 11;				m_4[1] = group_code % 11;				m_4_pointer = 0;			}			result = m_4[m_4_pointer++];			result = q_4[result];			break;		case 5:			result = bitstream_get(bs,4);			if(result > 14)				//FIXME do proper block error handling				printf("\n!! Invalid mantissa !!\n");			result = q_5[result];			break;		default:			result = bitstream_get(bs,qnttztab[bap]);			result <<= 16 - qnttztab[bap];	}	return result;}static void mantissa_reset(void){	m_1[2] = m_1[1] = m_1[0] = 0;	m_2[2] = m_2[1] = m_2[0] = 0;	m_4[1] = m_4[0] = 0;	m_1_pointer = m_2_pointer = m_4_pointer = 3;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -