summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/aacdec/apply_ms_synt.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2009-12-07 09:56:32 -0800
committerAndreas Huber <andih@google.com>2009-12-07 11:02:28 -0800
commitf44de515d3b6098a0b585865c1a0c7b20d3075a6 (patch)
tree028b1d81643bbb332464b42b50a0f79ba5359142 /media/libstagefright/codecs/aacdec/apply_ms_synt.cpp
parentbf697e37550d9e8376089b0b5e498613bede798c (diff)
downloadframeworks_av-f44de515d3b6098a0b585865c1a0c7b20d3075a6.zip
frameworks_av-f44de515d3b6098a0b585865c1a0c7b20d3075a6.tar.gz
frameworks_av-f44de515d3b6098a0b585865c1a0c7b20d3075a6.tar.bz2
Initial check in of stagefright software AAC decoder based on PV source code.
Diffstat (limited to 'media/libstagefright/codecs/aacdec/apply_ms_synt.cpp')
-rw-r--r--media/libstagefright/codecs/aacdec/apply_ms_synt.cpp454
1 files changed, 454 insertions, 0 deletions
diff --git a/media/libstagefright/codecs/aacdec/apply_ms_synt.cpp b/media/libstagefright/codecs/aacdec/apply_ms_synt.cpp
new file mode 100644
index 0000000..ab36c6a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/apply_ms_synt.cpp
@@ -0,0 +1,454 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/apply_ms_synt.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated pseudocode to correct capitalized format for the IF
+ FOR and WHILE statements.
+
+ Description: Delete local variable start_indx, since it is never used.
+
+ Who: Date:
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+ pFrameInfo = Pointer to structure that holds information about each group.
+ (long block flag, number of windows, scalefactor bands
+ per group, etc.)
+ [const pFrameInfo * const]
+
+ group = Array that contains indexes of the
+ first window in the next group.
+ [const Int *, length 8]
+
+ mask_map = Array that denotes whether M/S stereo is turned on for
+ each grouped scalefactor band.
+ [const Int *, length MAX_SFB]
+
+ codebook_map = Array that denotes which Huffman codebook was used for
+ the encoding of each grouped scalefactor band.
+ [const Int *, length MAX_SFB]
+
+ coefLeft = Array containing the fixed-point spectral coefficients
+ for the left channel.
+ [Int32 *, length 1024]
+
+ coefRight = Array containing the fixed-point spectral coefficients
+ for the right channel.
+ [Int32 *, length 1024]
+
+ q_formatLeft = The Q-format for the left channel's fixed-point spectral
+ coefficients, on a per-scalefactor band, non-grouped basis.
+ [Int *, length MAX_SFB]
+
+ q_formatRight = The Q-format for the right channel's fixed-point spectral
+ coefficients, on a per-scalefactor band, non-grouped basis.
+ [Int *, length MAX_SFB]
+
+ Local Stores/Buffers/Pointers Needed:
+ None
+
+ Global Stores/Buffers/Pointers Needed:
+ None
+
+ Outputs:
+ None
+
+ Pointers and Buffers Modified:
+ coefLeft = Contains the new spectral information.
+
+ coefRight = Contains the new spectral information.
+
+ q_formatLeft = Q-format may be updated with changed to fixed-point
+ data in coefLeft.
+
+ q_formatRight = Q-format may be updated with changed to fixed-point
+ data in coefRight.
+
+ Local Stores Modified:
+ None
+
+ Global Stores Modified:
+ None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function steps through all of the tools that are applied on a
+ scalefactor band basis.
+
+ The use of M/S stereo is checked for. For M/S decoding to take
+ place, ms_mask_map must be TRUE for that particular SFB, AND the Huffman
+ codebook used must be < NOISE_HCB.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+ Part 3
+ Subpart 4.6.7.1 M/S stereo
+ Subpart 4.6.2 ScaleFactors
+
+ (2) MPEG-2 NBC Audio Decoder
+ "This software module was originally developed by AT&T, Dolby
+ Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+ of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+ 3. This software module is an implementation of a part of one or more
+ MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+ Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+ standards free license to this software module or modifications thereof
+ for use in hardware or software products claiming conformance to the
+ MPEG-2 NBC/MPEG-4 Audio standards. Those intending to use this software
+ module in hardware or software products are advised that this use may
+ infringe existing patents. The original developer of this software
+ module and his/her company, the subsequent editors and their companies,
+ and ISO/IEC have no liability for use of this software module or
+ modifications thereof in an implementation. Copyright is not released
+ for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+ developer retains full right to use the code for his/her own purpose,
+ assign or donate the code to a third party and to inhibit third party
+ from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+ This copyright notice must be included in all copies or derivative
+ works."
+ Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ pCoefRight = coefRight;
+ pCoefLeft = coefLeft;
+
+ window_start = 0;
+ tot_sfb = 0;
+
+ coef_per_win = pFrameInfo->coef_per_win[0];
+
+ sfb_per_win = pFrameInfo->sfb_per_win[0];
+
+ DO
+
+ pBand = pFrameInfo->win_sfb_top[window_start];
+
+ partition = *(pGroup);
+
+ pGroup = pGroup + 1;
+
+ band_start = 0;
+
+ wins_in_group = (partition - window_start);
+
+ FOR (sfb = sfb_per_win; sfb > 0; sfb--)
+
+ band_stop = *(pBand);
+
+ pBand = pBand + 1;
+
+ codebook = *(pCodebookMap);
+
+ pCodebookMap = pCodebookMap + 1;
+
+ mask_enabled = *(pMaskMap);
+
+ pMaskMap = pMaskMap + 1;
+
+ IF (codebook < NOISE_HCB)
+ THEN
+ IF (mask_enabled != FALSE)
+ THEN
+ band_length = band_stop - band_start;
+
+ CALL
+ ms_synt(
+ wins_in_group,
+ coef_per_win,
+ sfb_per_win,
+ band_length,
+ &(pCoefLeft[band_start]),
+ &(pCoefRight[band_start]),
+ &(q_formatLeft[tot_sfb]),
+ &(q_formatRight[tot_sfb]) );
+
+ MODIFYING
+ &(pCoefLeft[band_start]),
+ &(pCoefRight[band_start]),
+ &(q_formatLeft[tot_sfb]),
+ &(q_formatRight[tot_sfb])
+
+ RETURNING
+ None
+ ENDIF
+ ENDIF
+ band_start = band_stop;
+
+ tot_sfb = tot_sfb + 1;
+
+ ENDFOR
+
+ pCoefRight = pCoefRight + coef_per_win * wins_in_group;
+ pCoefLeft = pCoefLeft + coef_per_win * wins_in_group;
+
+ wins_in_group = wins_in_group - 1;
+
+ tot_sfb = tot_sfb + sfb_per_win * wins_in_group;
+
+ window_start = partition;
+
+ WHILE (partition < pFrameInfo->num_win);
+
+ return;
+------------------------------------------------------------------------------
+ RESOURCES USED
+ When the code is written for a specific target processor the
+ resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+ stack usage for each subroutine called]
+
+ where: [stack usage variable] = stack usage for [subroutine
+ name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+ used to represent cycle count for each subroutine
+ called]
+
+ where: [cycle count variable] = cycle count for [subroutine
+ name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "apply_ms_synt.h"
+#include "e_huffmanconst.h"
+#include "ms_synt.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void apply_ms_synt(
+ const FrameInfo * const pFrameInfo,
+ const Int group[],
+ const Bool mask_map[],
+ const Int codebook_map[],
+ Int32 coefLeft[],
+ Int32 coefRight[],
+ Int q_formatLeft[MAXBANDS],
+ Int q_formatRight[MAXBANDS])
+
+{
+
+ Int32 *pCoefRight;
+
+ Int32 *pCoefLeft;
+
+ Int tot_sfb;
+ Int sfb;
+
+ Int band_length;
+ Int band_start;
+ Int band_stop;
+ Int coef_per_win;
+
+ Int codebook;
+ Int partition;
+ Int window_start;
+
+ Int sfb_per_win;
+ Int wins_in_group;
+
+ const Int16 *pBand;
+ const Int *pCodebookMap = codebook_map;
+ const Int *pGroup = group;
+ const Bool *pMaskMap = mask_map;
+
+ Bool mask_enabled;
+
+ pCoefRight = coefRight;
+ pCoefLeft = coefLeft;
+
+ window_start = 0;
+ tot_sfb = 0;
+
+ /*
+ * Each window in the frame should have the same number of coef's,
+ * so coef_per_win is constant in all the loops
+ */
+ coef_per_win = pFrameInfo->coef_per_win[0];
+
+ /*
+ * Because the number of scalefactor bands per window should be
+ * constant for each frame, sfb_per_win can be determined outside
+ * of the loop.
+ *
+ * For 44.1 kHz sampling rate sfb_per_win = 14 for short windows
+ * sfb_per_win = 49 for long windows
+ */
+
+ sfb_per_win = pFrameInfo->sfb_per_win[0];
+
+ do
+ {
+ pBand = pFrameInfo->win_sfb_top[window_start];
+
+ /*
+ * Partition is equal to the first window in the next group
+ *
+ * { Group 0 }{ Group 1 }{ Group 2 }{Group 3}
+ * [win 0][win 1][win 2][win 3][win 4][win 5][win 6][win 7]
+ *
+ * pGroup[0] = 2
+ * pGroup[1] = 5
+ * pGroup[2] = 7
+ * pGroup[3] = 8
+ */
+
+ partition = *(pGroup++);
+
+ band_start = 0;
+
+ wins_in_group = (partition - window_start);
+
+ for (sfb = sfb_per_win; sfb > 0; sfb--)
+ {
+ /* band is offset table, band_stop is last coef in band */
+ band_stop = *(pBand++);
+
+ codebook = *(pCodebookMap++);
+
+ mask_enabled = *(pMaskMap++);
+
+ /*
+ * When a codebook < NOISE_HCB is found, apply M/S to that
+ * scalefactorband.
+ *
+ * Example... sfb[3] == NOISE_HCB
+ *
+ * [ Group 1 ]
+ * [win 0 ][win 1 ]
+ * [0][1][2][X][4][5][6][7][0][1][2][X][4][5][6][7]
+ *
+ * The for(sfb) steps through the sfb's 0-7 in win 0.
+ *
+ * Finding sfb[3]'s codebook == NOISE_HCB, the code
+ * steps through all the windows in the group (they share
+ * the same scalefactors) and replaces that sfb with noise.
+ */
+
+ if (codebook < NOISE_HCB)
+ {
+ if (mask_enabled != FALSE)
+ {
+ band_length = band_stop - band_start;
+
+ ms_synt(
+ wins_in_group,
+ coef_per_win,
+ sfb_per_win,
+ band_length,
+ &(pCoefLeft[band_start]),
+ &(pCoefRight[band_start]),
+ &(q_formatLeft[tot_sfb]),
+ &(q_formatRight[tot_sfb]));
+ }
+ }
+ band_start = band_stop;
+
+ tot_sfb++;
+
+ } /* for (sfb) */
+
+ /*
+ * Increment pCoefRight and pCoefLeft by
+ * coef_per_win * the number of windows
+ */
+
+ pCoefRight += coef_per_win * wins_in_group;
+ pCoefLeft += coef_per_win * wins_in_group--;
+
+ /*
+ * Increase tot_sfb by sfb_per_win times the number of windows minus 1.
+ * The minus 1 comes from the fact that tot_sfb is already pointing
+ * to the first sfb in the 2nd window of the group.
+ */
+ tot_sfb += sfb_per_win * wins_in_group;
+
+ window_start = partition;
+
+ }
+ while (partition < pFrameInfo->num_win);
+
+ /* pFrameInfo->num_win = 1 for long windows, 8 for short_windows */
+
+ return;
+
+} /* apply_ms_synt() */
+
+