--- a/videoeditorengine/mp3aacManipLib/MP3Gain/src/layer3.cpp Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,733 +0,0 @@
-/*
-* Copyright (c) 2010 Ixonos Plc.
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - Initial contribution
-*
-* Contributors:
-* Ixonos Plc
-*
-* Description:
-*
-*/
-
-
-/**************************************************************************
-layer3.cpp - MPEG-1, MPEG-2 LSF and MPEG-2.5 layer III bitstream parsing.
-
- Author(s): Juha Ojanpera
- Copyright (c) 1999-2004 by Nokia Research Center, Speech and Audio Systems.
-*************************************************************************/
-
-/**************************************************************************
-External Objects Needed
-*************************************************************************/
-
-/*-- Project Headers --*/
-#include "mpaud.h"
-#include "mpheader.h"
-#include "mp3tables.h"
-
-
-
-//uint8 scalefac_buffer[54];
-
-/**************************************************************************
-Title : III_get_side_info
-
- Purpose : Reads Layer III side information from the bitstream.
-
- Usage : y = III_get_side_info(mp, bs)
-
- Input : mp - MP3 decoder handle
- bs - input bitstream
-
- Output : y - TRUE on success, FALSE otherwise
-
- Author(s) : Juha Ojanpera
-*************************************************************************/
-
-
-BOOL
-III_get_side_info(CMP_Stream *mp, TBitStream *bs)
-{
- uint16 i, j, k, flag;
- TGranule_Info *gr_info;
-
- /*-- Get the protected bits for the crc error checking. --*/
- if(bs->dsp_buffer)
- {
- int16 sideLen = (GetSideInfoSlots(mp->header) >> 1) + 1;
-
- if(bs->bit_counter == 8)
- for(i = bs->buf_index, j = 0; j < sideLen; i++, j++)
- {
- DSP_BYTE wTmp = bs->dsp_buffer[MOD_OPCODE(i, bs->buf_mask)] << 8;
- wTmp |= (bs->dsp_buffer[MOD_OPCODE((i + 1), bs->buf_mask)] >> 8) & 255;
- mp->mp3_crc.crc_payload[j + 2] = wTmp;
- }
- else
- for(i = bs->buf_index, j = 0; j < sideLen; i++, j++)
- mp->mp3_crc.crc_payload[j + 2] = bs->dsp_buffer[MOD_OPCODE(i, bs->buf_mask)];
- }
-
- if(version(mp->header) == MPEG_AUDIO_ID) /* MPEG-1 */
- {
- mp->side_info->main_data_begin = BsGetBits(bs, 9);
- if(channels(mp->header) == 1)
- {
- mp->side_info->private_bits = BsGetBits(bs, 5);
- for(i = 0; i < 4; i++)
- mp->side_info->scfsi[0][i] = BsGetBits(bs, 1);
- }
- else
- {
- mp->side_info->private_bits = BsGetBits(bs, 3);
- for(i = 0; i < 2; i++)
- for(j = 0; j < 4; j++)
- mp->side_info->scfsi[i][j] = int16(BsGetBits(bs, 1));
- }
-
- for(i = 0; i < 2; i++)
- {
- for(j = 0; j < channels(mp->header); j++)
- {
- gr_info = mp->side_info->ch_info[j]->gr_info[i];
-
- gr_info->part2_3_length = BsGetBits(bs, 12);
- gr_info->big_values = BsGetBits(bs, 9) << 1;
- gr_info->global_gain = BsGetBits(bs, 8);
- gr_info->scalefac_compress = BsGetBits(bs, 4);
-
- gr_info->flags = 0;
- gr_info->flags |= (BsGetBits(bs, 1)) ? WINDOW_SWITCHING_FLAG : 0;
-
- if(win_switch(gr_info))
- {
- /* block_type */
- gr_info->flags |= BsGetBits(bs, 2);
-
- /* mixed_block_flag */
- flag = BsGetBits(bs, 1);
- gr_info->flags |= (flag) ? MIXED_BLOCK_FLAG : 0;
-
- for(k = 0; k < 2; k++)
- gr_info->table_select[k] = BsGetBits(bs, 5);
-
- for(k = 0; k < 3; k++)
- gr_info->subblock_gain[k] = BsGetBits(bs, 3);
-
- /* Set region_count parameters since they are implicit in this case. */
- if((gr_info->flags & 3) == 0)
- return (FALSE); /* This will trigger resync */
- else
- if(short_block(gr_info) && !mixed_block(gr_info))
- {
- gr_info->block_mode = SHORT_BLOCK_MODE;
- gr_info->region0_count = 7;
- }
- else
- {
- if(short_block(gr_info) && mixed_block(gr_info))
- return (FALSE); /* mixed block are not allowed => resync */
- else
- gr_info->block_mode = LONG_BLOCK_MODE;
-
- gr_info->region0_count = 7;
- }
-
- gr_info->region1_count = 20 - gr_info->region0_count;
- }
- else
- {
- gr_info->block_mode = LONG_BLOCK_MODE;
- for(k = 0; k < 3; k++)
- gr_info->table_select[k] = BsGetBits(bs, 5);
- gr_info->region0_count = BsGetBits(bs, 4);
- gr_info->region1_count = BsGetBits(bs, 3);
-
- gr_info->flags &= ~(uint32)3; /* block_type == 0 (LONG) */
- }
-
- flag = BsGetBits(bs, 3);
- gr_info->flags |= (flag & 4) ? PRE_FLAG : 0;
- gr_info->flags |= (flag & 2) ? SCALEFAC_SCALE : 0;
- gr_info->flags |= (flag & 1) ? COUNT_1_TABLE_SELECT : 0;
- }
- }
- }
- else /* MPEG-2 LSF and MPEG-2.5 */
- {
- mp->side_info->main_data_begin = BsGetBits(bs, 8);
-
- if(channels(mp->header) == 1)
- mp->side_info->private_bits = BsGetBits(bs, 1);
- else
- mp->side_info->private_bits = BsGetBits(bs, 2);
-
- for(i = 0; i < channels(mp->header); i++)
- {
- gr_info = mp->side_info->ch_info[i]->gr_info[0];
-
- gr_info->part2_3_length = BsGetBits(bs, 12);
- gr_info->big_values = BsGetBits(bs, 9) << 1;
- gr_info->global_gain = BsGetBits(bs, 8);
- gr_info->scalefac_compress = BsGetBits(bs, 9);
- gr_info->flags = 0;
- gr_info->flags |= (BsGetBits(bs, 1)) ? WINDOW_SWITCHING_FLAG : 0;
-
- if(win_switch(gr_info))
- {
- /* block_type */
- gr_info->flags |= BsGetBits(bs, 2);
-
- /* mixed_block_flag */
- flag = BsGetBits(bs, 1);
- gr_info->flags |= (flag) ? MIXED_BLOCK_FLAG : 0;
-
- for(k = 0; k < 2; k++)
- gr_info->table_select[k] = BsGetBits(bs, 5);
-
- for(k = 0; k < 3; k++)
- gr_info->subblock_gain[k] = BsGetBits(bs, 3);
-
- /* Set region_count parameters since they are implicit in this case. */
- if((gr_info->flags & 3) == 0)
- return (FALSE);
- else
- if(short_block(gr_info) && !mixed_block(gr_info))
- {
- gr_info->block_mode = SHORT_BLOCK_MODE;
- gr_info->region0_count = 5;
- }
- else
- {
- if(short_block(gr_info) && mixed_block(gr_info))
- return (FALSE);
- else
- gr_info->block_mode = LONG_BLOCK_MODE;
-
- gr_info->region0_count = 7;
- }
-
- gr_info->region1_count = 20 - gr_info->region0_count;
- }
- else
- {
- gr_info->block_mode = LONG_BLOCK_MODE;
- for(k = 0; k < 3; k++)
- gr_info->table_select[k] = BsGetBits(bs, 5);
- gr_info->region0_count = BsGetBits(bs, 4);
- gr_info->region1_count = BsGetBits(bs, 3);
-
- gr_info->flags &= ~(uint32)3; /* block_type == 0 (LONG) */
- }
-
- flag = BsGetBits(bs, 2);
- gr_info->flags |= (flag & 2) ? SCALEFAC_SCALE : 0;
- gr_info->flags |= (flag & 1) ? COUNT_1_TABLE_SELECT : 0;
- }
- }
-
- return (TRUE);
-}
-
-/*
-* Writes layer 3 side information (excluding granule specific info)
-* to the specified bitstream. For writing granule specific
-* parameters 'L3WriteGranule()' function should be used.
-*/
-INLINE void
-L3WriteCommonSideInfo(TBitStream *bs, CIII_Side_Info *sideInfo, TMPEG_Header *header)
-{
- int16 bits;
- uint32 dWord;
-
- bits = 9;
- dWord = sideInfo->main_data_begin;
-
- /*-- MPEG-1. --*/
- if(version(header) == MPEG_AUDIO_ID)
- {
- if(channels(header) == 1)
- {
- bits = 18;
- dWord <<= 5; dWord |= sideInfo->private_bits;
- dWord <<= 1; dWord |= sideInfo->scfsi[0][0];
- dWord <<= 1; dWord |= sideInfo->scfsi[0][1];
- dWord <<= 1; dWord |= sideInfo->scfsi[0][2];
- dWord <<= 1; dWord |= sideInfo->scfsi[0][3];
- }
- else
- {
- bits = 20;
- dWord <<= 3; dWord |= sideInfo->private_bits;
- dWord <<= 1; dWord |= sideInfo->scfsi[0][0];
- dWord <<= 1; dWord |= sideInfo->scfsi[0][1];
- dWord <<= 1; dWord |= sideInfo->scfsi[0][2];
- dWord <<= 1; dWord |= sideInfo->scfsi[0][3];
- dWord <<= 1; dWord |= sideInfo->scfsi[1][0];
- dWord <<= 1; dWord |= sideInfo->scfsi[1][1];
- dWord <<= 1; dWord |= sideInfo->scfsi[1][2];
- dWord <<= 1; dWord |= sideInfo->scfsi[1][3];
- }
- }
-
- /*-- MPEG-2 LSF, MPEG-2.5. --*/
- else
- {
- if(channels(header) == 1)
- { bits = 9; dWord <<= 1; }
- else
- { bits = 10; dWord <<= 2; }
-
- dWord |= sideInfo->private_bits;
- }
-
- BsPutBits(bs, bits, dWord);
-}
-
-/*
-* Writes granule specific parameters to the specified bitstream.
-* Please note that the MPEG frame may contain more than one granule
-* depending on the number of channels and version. So this function
-* may need to be called multiple times.
-*/
-INLINE void
-L3WriteGranule(TBitStream *bs, TGranule_Info *gr_info, BOOL mpeg1)
-{
- uint32 dWord;
-
- dWord = gr_info->part2_3_length << 9;
- dWord |= gr_info->big_values >> 1;
- dWord <<= 8; dWord |= gr_info->global_gain;
-
- BsPutBits(bs, 29, dWord);
-
- dWord = gr_info->scalefac_compress << 1;
- if(win_switch(gr_info))
- {
- dWord |= 1;
- dWord <<= 2; dWord |= (gr_info->flags & 3);
- dWord <<= 1; if(mixed_block(gr_info)) dWord |= 1;
- dWord <<= 5; dWord |= gr_info->table_select[0];
- dWord <<= 5; dWord |= gr_info->table_select[1];
- dWord <<= 3; dWord |= gr_info->subblock_gain[0];
- dWord <<= 3; dWord |= gr_info->subblock_gain[1];
- dWord <<= 3; dWord |= gr_info->subblock_gain[2];
- }
- else
- {
- dWord <<= 5; dWord |= gr_info->table_select[0];
- dWord <<= 5; dWord |= gr_info->table_select[1];
- dWord <<= 5; dWord |= gr_info->table_select[2];
- dWord <<= 4; dWord |= gr_info->region0_count;
- dWord <<= 3; dWord |= gr_info->region1_count;
- }
-
- if(mpeg1) { dWord <<= 1; if(pre_flag(gr_info)) dWord |= 1; }
- else { BsPutBits(bs, 32, dWord); dWord = 0; }
-
- dWord <<= 1; if(scalefac_scale(gr_info)) dWord |= 1;
- dWord <<= 1; if(gr_info->flags & COUNT_1_TABLE_SELECT) dWord |= 1;
-
- BsPutBits(bs, (mpeg1) ? 30 : 2, dWord);
-}
-
-/*
-* Writes layer 3 side info to the specified bitstream. The side info
-* in this context includes the header and the actual side info
-* parameters.
-*/
-void
-L3WriteSideInfo(TBitStream *bs, CIII_Side_Info *sideInfo, TMPEG_Header *header)
-{
- BOOL mpeg1;
- int16 i, j, max_gr;
-
- mpeg1 = (version(header) == MPEG_AUDIO_ID) ? TRUE : FALSE;
- max_gr = (mpeg1) ? 2 : 1;
-
- /*-- Write common side info. --*/
- L3WriteCommonSideInfo(bs, sideInfo, header);
-
- /*-- Write granule parameters. --*/
- for(i = 0; i < max_gr; i++)
- for(j = 0; j < channels(header); j++)
- {
- TGranule_Info *gr_info = sideInfo->ch_info[j]->gr_info[i];
- L3WriteGranule(bs, gr_info, mpeg1);
- }
-}
-
-/**************************************************************************
-Title : III_get_LSF_scale_data
-
- Purpose : Decodes scalafactors of MPEG-2 LSF and MPEG-2.5 bitstreams.
-
- Usage : III_get_LSF_scale_data(mp, gr, ch)
-
- Input : mp - MP3 stream parameters
- gr - granule number
- ch - channel number (left or right)
-
- Explanation : -
-
- Author(s) : Juha Ojanpera
-*************************************************************************/
-
-static void
-III_get_LSF_scale_data(CMP_Stream *mp, int16 gr, int16 ch, uint8* scalefac_buffer)
-{
- int16 i, j, k, m = 0;
- int16 blocktypenumber = 0, blocknumber = 0;
- int16 scalefac_comp, int_scalefac_comp, new_slen[4] = {0, 0, 0, 0};
- TGranule_Info *gr_info;
-
- gr_info = mp->side_info->ch_info[ch]->gr_info[gr];
- scalefac_comp = gr_info->scalefac_compress;
-
- switch(gr_info->block_mode)
- {
- case SHORT_BLOCK_MODE:
- blocktypenumber = 1;
- break;
-
- case LONG_BLOCK_MODE:
- blocktypenumber = 0;
- break;
-
- default:
- break;
- }
-
- if(!((mode_extension(mp->header) == 1 ||
- mode_extension(mp->header) == 3) && ch == 1))
- {
-
- if(scalefac_comp < 400)
- {
- new_slen[0] = (scalefac_comp >> 4) / 5;
- new_slen[1] = (scalefac_comp >> 4) % 5;
- new_slen[2] = (scalefac_comp & 15) >> 2;
- new_slen[3] = (scalefac_comp & 3);
-
- blocknumber = 0;
- m = 4;
- }
- else if(scalefac_comp < 500)
- {
- scalefac_comp -= 400;
-
- new_slen[0] = (scalefac_comp >> 2) / 5;
- new_slen[1] = (scalefac_comp >> 2) % 5;
- new_slen[2] = scalefac_comp & 3;
-
- blocknumber = 1;
- m = 3;
- }
- else /*if(scalefac_comp < 512)*/
- {
- scalefac_comp -= 500;
-
- new_slen[0] = scalefac_comp / 3;
- new_slen[1] = scalefac_comp % 3;
-
- gr_info->flags |= (uint32)PRE_FLAG; /* pre_flag = 1 */
-
- blocknumber = 2;
- m = 2;
- }
- }
-
- if(((mode_extension(mp->header) == 1 ||
- mode_extension(mp->header) == 3) && ch == 1))
- {
-
- int_scalefac_comp = scalefac_comp >> 1;
-
- if(int_scalefac_comp < 180)
- {
- int16 tmp = int_scalefac_comp % 36;
-
- new_slen[0] = int_scalefac_comp / 36;
- new_slen[1] = tmp / 6;
- new_slen[2] = tmp % 6;
-
- blocknumber = 3;
- m = 3;
- }
- else if(int_scalefac_comp < 244)
- {
- int_scalefac_comp -= 180;
-
- new_slen[0] = (int_scalefac_comp & 63) >> 4;
- new_slen[1] = (int_scalefac_comp & 15) >> 2;
- new_slen[2] = int_scalefac_comp & 3;
-
- blocknumber = 4;
- m = 3;
- }
- else /*if(int_scalefac_comp < 255)*/
- {
- int_scalefac_comp -= 244;
-
- new_slen[0] = int_scalefac_comp / 3;
- new_slen[1] = int_scalefac_comp % 3;
-
- blocknumber = 5;
- m = 2;
- }
-
- TIS_Info *is_info = &mp->side_info->is_info;
- is_info->is_len[0] = (1 << new_slen[0]) - 1;
- is_info->is_len[1] = (1 << new_slen[1]) - 1;
- is_info->is_len[2] = (1 << new_slen[2]) - 1;
- is_info->nr_sfb[0] = nr_of_sfb_block[blocknumber][blocktypenumber][0];
- is_info->nr_sfb[1] = nr_of_sfb_block[blocknumber][blocktypenumber][1];
- is_info->nr_sfb[2] = nr_of_sfb_block[blocknumber][blocktypenumber][2];
-
- }
-
-
- Mem::Fill(scalefac_buffer, 54, 0);
-
-
- for(i = k = 0; i < m; i++)
- {
-
- if(new_slen[i] != 0)
- for(j = 0; j < nr_of_sfb_block[blocknumber][blocktypenumber][i]; j++, k++)
- {
-
-
-
- scalefac_buffer[k] = BsGetBits(mp->br, new_slen[i]);
-
-
- }
- else
- {
-
-
- if (i < 4)
- {
- k += nr_of_sfb_block[blocknumber][blocktypenumber][i];
- }
- else
- {
- k += 0;
- }
-
- }
-
- }
-
-}
-
-/**************************************************************************
-Title : III_get_scale_factors
-
-Purpose : Reads the scale factors of layer III.
-
-Usage : III_get_scale_factors(mp, gr, ch)
-
-Input : mp - MP3 stream parameters
-gr - granule number
-ch - channel number (left or right)
-
-Author(s) : Juha Ojanpera
-*************************************************************************/
-
-void III_get_scale_factors(CMP_Stream *mp, int16 gr, int16 ch)
- {
- uint8 *sf[3];
- int16 i, sfb, bits, idx;
- TGranule_Info *gr_info;
- CIII_Scale_Factors *scale_fac;
-
- uint8* scalefac_buffer = NULL;
- TRAPD(error, scalefac_buffer = new (ELeave) uint8[54]);
- if (error != KErrNone)
- return;
-
- Mem::Fill(scalefac_buffer, 54, 0);
-
- gr_info = mp->side_info->ch_info[ch]->gr_info[gr];
-
- scale_fac = mp->side_info->ch_info[ch]->scale_fac;
-
- idx = 0;
- if(mp->side_info->lsf)
- {
- III_get_LSF_scale_data(mp, gr, ch, scalefac_buffer);
- }
-
-
- switch(gr_info->block_mode)
- {
- case SHORT_BLOCK_MODE:
- sf[0] = scale_fac->scalefac_short[0];
- sf[1] = scale_fac->scalefac_short[1];
- sf[2] = scale_fac->scalefac_short[2];
- if(mp->side_info->lsf)
- for(sfb = 0; sfb < 12; sfb++)
- {
- *sf[0]++ = scalefac_buffer[idx++];
- *sf[1]++ = scalefac_buffer[idx++];
- *sf[2]++ = scalefac_buffer[idx++];
- }
- else
- for(i = 0; i < 2; i++)
- {
- bits = slen[i][gr_info->scalefac_compress];
- if(bits)
- for(sfb = sfbtable.s[i]; sfb < sfbtable.s[i + 1]; sfb++)
- {
- *sf[0]++ = BsGetBits(mp->br, bits);
- *sf[1]++ = BsGetBits(mp->br, bits);
- *sf[2]++ = BsGetBits(mp->br, bits);
- }
- else
- for(sfb = sfbtable.s[i]; sfb < sfbtable.s[i + 1]; sfb++)
- {
- *sf[0]++ = 0; *sf[1]++ = 0; *sf[2]++ = 0;
- }
- }
- break;
-
- case LONG_BLOCK_MODE:
- sf[0] = scale_fac->scalefac_long;
-
-
- if(mp->side_info->lsf)
- for(i = 0; i < 21; i++)
- *sf[0]++ = scalefac_buffer[idx++];
- else
- for(i = 0; i < 4; i++)
- {
-
- if(mp->side_info->scfsi[ch][i] == 0 || gr == 0)
- {
- bits = slen[i >> 1][gr_info->scalefac_compress];
- if(bits)
- for(sfb = sfbtable.l[i]; sfb < sfbtable.l[i + 1]; sfb++)
- {
-
- *sf[0]++ = BsGetBits(mp->br, bits);
-
- }
- else
- for(sfb = sfbtable.l[i]; sfb < sfbtable.l[i + 1]; sfb++)
- *sf[0]++ = 0;
- }
- else
- sf[0] += sfbtable.l[i + 1] - sfbtable.l[i];
- }
- break;
-
- default:
- break;
- }
-
- delete[] scalefac_buffer;
-
-}
-
-
-void
- init_III_reorder(int16 reorder_idx[2][MAX_MONO_SAMPLES], int16 *sfb_table,
- int16 *sfb_width_table)
-{
- int32 sfb, sfb_start, i;
- int32 window, freq, src_line, des_line;
-
- for(i = sfb = 0; sfb < MAX_SHORT_SFB_BANDS; sfb++)
- {
- sfb_start = sfb_table[sfb];
-
- for(window = 0; window < 3; window++)
- for(freq = 0; freq < sfb_width_table[sfb]; freq++)
- {
- src_line = sfb_start * 3 + window * sfb_width_table[sfb] + freq;
- des_line = (sfb_start * 3) + window + (freq * 3);
-
- reorder_idx[0][i] =
- ((des_line / SSLIMIT) * SSLIMIT) + (des_line % SSLIMIT);
-
- reorder_idx[1][i++] =
- ((src_line / SSLIMIT) * SSLIMIT) + (src_line % SSLIMIT);
- }
- }
-}
-
-
-
-/**************************************************************************
-Title : III_reorder
-
- Purpose : Re-orders the input frame if short blocks are present.
-
- Usage : III_reorder(mp, gr, ch)
-
- Input : mp - MP3 stream parameters
- ch - channel number (left or right)
- gr - granule number
-
- Explanation : -
-
- Author(s) : Juha Ojanpera
-*************************************************************************/
-
-void
- III_reorder(CMP_Stream *mp, int16 ch, int16 gr)
-{
- int16 i, sb_start;
- register int16 *id1, *id2;
-
- FLOAT* xr = NULL;
- TRAPD(error, xr = new (ELeave) FLOAT[MAX_MONO_SAMPLES]);
- if (error != KErrNone)
- return;
-
- register FLOAT *src, *dst;
-
- if(mp->side_info->ch_info[ch]->gr_info[gr]->block_mode == LONG_BLOCK_MODE)
- {
- delete[] xr;
- return;
-
- }
-
- sb_start = 0;
-
- id1 = &mp->reorder_idx[0][sb_start];
- id2 = &mp->reorder_idx[1][sb_start];
-
- /*
- * First re-order the short block to a temporary buffer
- * and then copy back to the input buffer. Not fully optimal,
- * a better way would be perhaps to do the re-ordering during the
- * dequantization but to my opinion that would complicate the code
- * too much. We also have to remember that short blocks do not occur
- * very frequently, so the penalty of having a separate re-ordering
- * routine is not so time consuming from the overall decoder complexity
- * point of view.
- */
- src = &mp->buffer->ch_reconstructed[ch][0];
- dst = &xr[0];
-
- for(i = sb_start; i < MAX_MONO_SAMPLES; i++)
- dst[*id1++] = src[*id2++];
-
- /* Copy back. */
- for(i = sb_start; i < MAX_MONO_SAMPLES; i++)
- src[i] = dst[i];
-
- delete[] xr;
-}