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

📄 imdct.c.svn-base

📁 MP3 for ARM codec. [asm+C]
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
/* ***** BEGIN LICENSE BLOCK *****   * Source last modified: $Id: imdct.c,v 1.1 2005/02/26 01:47:35 jrecker Exp $  *    * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved.   *        * The contents of this file, and the files included with this file,  * are subject to the current version of the RealNetworks Public  * Source License (the "RPSL") available at  * http://www.helixcommunity.org/content/rpsl unless you have licensed  * the file under the current version of the RealNetworks Community  * Source License (the "RCSL") available at  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL  * will apply. You may also obtain the license terms directly from  * RealNetworks.  You may not use this file except in compliance with  * the RPSL or, if you have a valid RCSL with RealNetworks applicable  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for  * the rights, obligations and limitations governing use of the  * contents of the file.  *    * This file is part of the Helix DNA Technology. RealNetworks is the  * developer of the Original Code and owns the copyrights in the  * portions it created.  *    * This file, and the files included with this file, is distributed  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET  * ENJOYMENT OR NON-INFRINGEMENT.  *   * Technology Compatibility Kit Test Suite(s) Location:   *    http://www.helixcommunity.org/content/tck   *   * Contributor(s):   *    * ***** END LICENSE BLOCK ***** */  /************************************************************************************** * Fixed-point HE-AAC decoder * Jon Recker (jrecker@real.com) * February 2005 * * imdct.c - inverse MDCT **************************************************************************************/#include "coder.h"#include "assembly.h"#define RND_VAL		(1 << (FBITS_OUT_IMDCT-1))#ifndef AAC_ENABLE_SBR/************************************************************************************** * Function:    DecWindowOverlap * * Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, *                for winSequence LONG-LONG * * Inputs:      input buffer (output of type-IV DCT) *              overlap buffer (saved from last time) *              number of channels *              window type (sin or KBD) for input buffer *              window type (sin or KBD) for overlap buffer * * Outputs:     one channel, one frame of 16-bit PCM, interleaved by nChans * * Return:      none * * Notes:       this processes one channel at a time, but skips every other sample in *                the output buffer (pcm) for stereo interleaving *              this should fit in registers on ARM * * TODO:        ARM5E version with saturating overlap/add (QADD) *              asm code with free pointer updates, better load scheduling **************************************************************************************/__attribute__ ((section (".data"))) static void DecWindowOverlap(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev){	int in, w0, w1, f0, f1;	int *buf1, *over1;	short *pcm1;	const int *wndPrev, *wndCurr;	buf0 += (1024 >> 1);	buf1  = buf0  - 1;	pcm1  = pcm0 + (1024 - 1) * nChans;	over1 = over0 + 1024 - 1;	wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]);	if (winTypeCurr == winTypePrev) {		/* cut window loads in half since current and overlap sections use same symmetric window */		do {			w0 = *wndPrev++;			w1 = *wndPrev++;			in = *buf0++;			f0 = MULSHIFT32(w0, in);			f1 = MULSHIFT32(w1, in);			in = *over0;				*pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT );			pcm0 += nChans;			in = *over1;				*pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT );			pcm1 -= nChans;			in = *buf1--;			*over1-- = MULSHIFT32(w0, in);			*over0++ = MULSHIFT32(w1, in);		} while (over0 < over1);	} else {		/* different windows for current and overlap parts - should still fit in registers on ARM w/o stack spill */		wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]);		do {			w0 = *wndPrev++;			w1 = *wndPrev++;			in = *buf0++;			f0 = MULSHIFT32(w0, in);			f1 = MULSHIFT32(w1, in);			in = *over0;				*pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT );			pcm0 += nChans;			in = *over1;				*pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT );			pcm1 -= nChans;			w0 = *wndCurr++;			w1 = *wndCurr++;			in = *buf1--;			*over1-- = MULSHIFT32(w0, in);			*over0++ = MULSHIFT32(w1, in);		} while (over0 < over1);	}}/************************************************************************************** * Function:    DecWindowOverlapLongStart * * Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, *                for winSequence LONG-START * * Inputs:      input buffer (output of type-IV DCT) *              overlap buffer (saved from last time) *              number of channels *              window type (sin or KBD) for input buffer *              window type (sin or KBD) for overlap buffer * * Outputs:     one channel, one frame of 16-bit PCM, interleaved by nChans * * Return:      none * * Notes:       this processes one channel at a time, but skips every other sample in *                the output buffer (pcm) for stereo interleaving *              this should fit in registers on ARM * * TODO:        ARM5E version with saturating overlap/add (QADD) *              asm code with free pointer updates, better load scheduling **************************************************************************************/ __attribute__ ((section (".data"))) static void DecWindowOverlapLongStart(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev){	int i,  in, w0, w1, f0, f1;	int *buf1, *over1;	short *pcm1;	const int *wndPrev, *wndCurr;	buf0 += (1024 >> 1);	buf1  = buf0  - 1;	pcm1  = pcm0 + (1024 - 1) * nChans;	over1 = over0 + 1024 - 1;	wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]);	i = 448;	/* 2 outputs, 2 overlaps per loop */	do {		w0 = *wndPrev++;		w1 = *wndPrev++;		in = *buf0++;		f0 = MULSHIFT32(w0, in);		f1 = MULSHIFT32(w1, in);		in = *over0;			*pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT );		pcm0 += nChans;		in = *over1;			*pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT );		pcm1 -= nChans;		in = *buf1--;		*over1-- = 0;		/* Wn = 0 for n = (2047, 2046, ... 1600) */		*over0++ = in >> 1;	/* Wn = 1 for n = (1024, 1025, ... 1471) */	} while (--i);	wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]);	/* do 64 more loops - 2 outputs, 2 overlaps per loop */	do {		w0 = *wndPrev++;		w1 = *wndPrev++;		in = *buf0++;		f0 = MULSHIFT32(w0, in);		f1 = MULSHIFT32(w1, in);		in = *over0;			*pcm0 = CLIPTOSHORT( (in - f0 + RND_VAL) >> FBITS_OUT_IMDCT );		pcm0 += nChans;		in = *over1;			*pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT );		pcm1 -= nChans;		w0 = *wndCurr++;	/* W[0], W[1], ... --> W[255], W[254], ... */		w1 = *wndCurr++;	/* W[127], W[126], ... --> W[128], W[129], ... */		in = *buf1--;		*over1-- = MULSHIFT32(w0, in);	/* Wn = short window for n = (1599, 1598, ... , 1536) */		*over0++ = MULSHIFT32(w1, in);	/* Wn = short window for n = (1472, 1473, ... , 1535) */	} while (over0 < over1);}/************************************************************************************** * Function:    DecWindowOverlapLongStop * * Description: apply synthesis window, do overlap-add, clip to 16-bit PCM, *                for winSequence LONG-STOP * * Inputs:      input buffer (output of type-IV DCT) *              overlap buffer (saved from last time) *              number of channels *              window type (sin or KBD) for input buffer *              window type (sin or KBD) for overlap buffer * * Outputs:     one channel, one frame of 16-bit PCM, interleaved by nChans * * Return:      none * * Notes:       this processes one channel at a time, but skips every other sample in *                the output buffer (pcm) for stereo interleaving *              this should fit in registers on ARM * * TODO:        ARM5E version with saturating overlap/add (QADD) *              asm code with free pointer updates, better load scheduling **************************************************************************************/ __attribute__ ((section (".data"))) static void DecWindowOverlapLongStop(int *buf0, int *over0, short *pcm0, int nChans, int winTypeCurr, int winTypePrev){	int i, in, w0, w1, f0, f1;	int *buf1, *over1;	short *pcm1;	const int *wndPrev, *wndCurr;	buf0 += (1024 >> 1);	buf1  = buf0  - 1;	pcm1  = pcm0 + (1024 - 1) * nChans;	over1 = over0 + 1024 - 1;	wndPrev = (winTypePrev == 1 ? kbdWindow + kbdWindowOffset[0] : sinWindow + sinWindowOffset[0]);	wndCurr = (winTypeCurr == 1 ? kbdWindow + kbdWindowOffset[1] : sinWindow + sinWindowOffset[1]);	i = 448;	/* 2 outputs, 2 overlaps per loop */	do {		/* Wn = 0 for n = (0, 1, ... 447) */		/* Wn = 1 for n = (576, 577, ... 1023) */		in = *buf0++;		f1 = in >> 1;	/* scale since skipping multiply by Q31 */		in = *over0;			*pcm0 = CLIPTOSHORT( (in + RND_VAL) >> FBITS_OUT_IMDCT );		pcm0 += nChans;		in = *over1;			*pcm1 = CLIPTOSHORT( (in + f1 + RND_VAL) >> FBITS_OUT_IMDCT );		pcm1 -= nChans;		w0 = *wndCurr++;		w1 = *wndCurr++;		in = *buf1--;		*over1-- = MULSHIFT32(w0, in);		*over0++ = MULSHIFT32(w1, in);	} while (--i);	/* do 64 more loops - 2 outputs, 2 overlaps per loop */	do {		w0 = *wndPrev++;	/* W[0], W[1], ...W[63] */		w1 = *wndPrev++;	/* W[127], W[126], ... W[64] */		in = *buf0++;		f0 = MULSHIFT32(w0, in);		f1 = MULSHIFT32(w1, in);

⌨️ 快捷键说明

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