diff -r 951a5db380a0 -r d87d32eab1a9 videoeditorengine/mp3aacManipLib/AACGain/src/nok_bits2.cpp --- a/videoeditorengine/mp3aacManipLib/AACGain/src/nok_bits2.cpp Fri Jan 29 14:08:33 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,677 +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: -* -*/ - - -/************************************************************************** - nok_bits2.c - Bitstream subroutines. - - Author(s): Juha Ojanpera - Copyright (c) 1999-2003 by Nokia Research Center, Speech and Audio Systems. - *************************************************************************/ - -/************************************************************************** - External Objects Needed - *************************************************************************/ - -/*-- Project Headers --*/ -#include "nok_bits.h" - -/************************************************************************** - Internal Objects - *************************************************************************/ - -#ifdef USE_ASSERT -#define BITSASSERT(x) { \ - MY_ASSERT(UpdateBufIdx(bs) == 1); \ -} -#else -#define BITSASSERT(x) { \ - UpdateBufIdx(bs); \ -} -#endif - -//typedef uint32 (*GETBITS_FUNCTION)(BitStream *bs, int16 n); - -const uint32 bitMask[] = -{0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, - 0x1FFFL, 0x3FFFL, 0x7FFFL, 0xFFFFL, 0x1FFFFL, 0x3FFFFL, 0x7FFFFL, 0xFFFFFL, - 0x1FFFFFL, 0x3FFFFFL, 0x7FFFFFL, 0xFFFFFFL, 0x1FFFFFFL, 0x3FFFFFFL, 0x7FFFFFFL, - 0xFFFFFFFL, 0x1FFFFFFFL, 0x3FFFFFFFL, 0x7FFFFFFFL, 0xFFFFFFFFL}; - - - -/* - * Updates the read index of the bit buffer. - */ -static INLINE int16 -UpdateBufIdx(TBitStream *bs) -{ - bs->buf_index++; - bs->buf_index = MOD_OPCODE(bs->buf_index, bs->buf_mask); - bs->slots_read++; -#if 0 - if(bs->slots_read == bs->buf_len) - return (0); -#endif - - return (1); -} - -/* - * Writes at most 8 bits to the bit buffer. - */ -void -PutBits(TBitStream *bs, uint16 n, uint32 word) -{ - uint8 *buf = (bs->mode == BIT8) ? bs->bit_buffer : bs->dsp_buffer; - /* - * The number of bits left in the current buffer slot is too low. - * Therefore, the input word needs to be splitted into two parts. - * Each part is stored separately. - */ - int16 tmp = bs->bit_counter - n; - if(tmp < 0) - { - /*-- Zero those bits that are to be modified. --*/ - buf[bs->buf_index] &= ~bitMask[bs->bit_counter]; - - /*-- Store the upper (MSB) part to the bitstream buffer. --*/ - tmp = -tmp; - buf[bs->buf_index] |= (word >> tmp); - - /* - * Explicitly update the bitstream buffer index. No need to - * test whether the bit counter is zero since it is known - * to be zero at this point. - */ - BITSASSERT(bs); - bs->bit_counter = bs->slotBits; - - /*-- Store the lower (LSB) part to the bitstream buffer. --*/ - bs->bit_counter = int16(bs->bit_counter - tmp); - buf[bs->buf_index] &= bitMask[bs->bit_counter]; - buf[bs->buf_index] |= ((word & bitMask[tmp]) << bs->bit_counter); - } - else - { - /* - * Obtain the bit mask for the part that is to be modified. For example, - * 'bit_counter' = 5 - * 'n' = 3, - * 'tmp' = 2 - * - * x x x m m m x x (x = ignore, m = bits to be modified) - * - * mask : - * - * 1 1 1 0 0 0 1 1 - * - */ - buf[bs->buf_index] &= (~bitMask[bs->bit_counter]) | bitMask[tmp]; - bs->bit_counter = tmp; - buf[bs->buf_index] |= (word << bs->bit_counter); - } - - /*-- Update the bitstream buffer index. --*/ - if(bs->bit_counter == 0) - { - BITSASSERT(bs); - bs->bit_counter = bs->slotBits; - } -} - -/* - * Reads at most 8 bits from the bit buffer. - */ -uint32 -GetBits(TBitStream *bs, int16 n) -{ - int16 idx; - uint32 tmp; - - idx = bs->bit_counter - n; - if(idx < 0) - { - /* Mask the unwanted bits to zero. */ - tmp = (bs->bit_buffer[bs->buf_index] & bitMask[bs->bit_counter]) << -idx; - - /* Update the bitstream buffer. */ - BITSASSERT(bs); - bs->bit_counter = bs->slotBits + idx; - tmp |= (bs->bit_buffer[bs->buf_index] >> bs->bit_counter) & bitMask[-idx]; - } - else - { - bs->bit_counter = idx; - tmp = (bs->bit_buffer[bs->buf_index] >> bs->bit_counter) & bitMask[n]; - } - - /* Update the bitstream buffer index. */ - if(bs->bit_counter == 0) - { - BITSASSERT(bs); - bs->bit_counter = bs->slotBits; - } - - return (tmp); -} - -/* - * Reads at most 16 bits from the bit buffer. - */ -uint32 -GetBitsDSP(TBitStream *bs, int16 n) -{ - int16 idx; - uint32 tmp; - - idx = bs->bit_counter - n; - if(idx < 0) - { - /* Mask the unwanted bits to zero. */ - tmp = (bs->dsp_buffer[bs->buf_index] & bitMask[bs->bit_counter]) << -idx; - - /* Update the bitstream buffer. */ - BITSASSERT(bs); - bs->bit_counter = bs->slotBits + idx; - tmp |= (bs->dsp_buffer[bs->buf_index] >> bs->bit_counter) & bitMask[-idx]; - } - else - { - bs->bit_counter = idx; - tmp = (bs->dsp_buffer[bs->buf_index] >> bs->bit_counter) & bitMask[n]; - } - - /* Update the bitstream buffer index. */ - if(bs->bit_counter == 0) - { - BITSASSERT(bs); - bs->bit_counter = bs->slotBits; - } - - return (tmp); -} - -//typedef uint32 (*GETBITS_FUNCTION)(BitStream *bs, int16 n); -//static GETBITS_FUNCTION GetFunc[2] = {GetBits, GetBitsDSP}; - -/* - * Returns the size of the buffer. - */ -EXPORT_C uint32 BsGetBufSize(TBitStream *bs) -{ return (bs->buf_len); } - -/* - * Returns the size of the original buffer. Note that it is - * possible that the update procedure of the bit buffer - * (which is up to the implementor to specify), reduces the size - * temporarily for some reasons. - */ -EXPORT_C uint32 BsGetBufOriginalSize(TBitStream *bs) -{ -#ifndef BITSMODULO_BUFFER - return (bs->buf_mask + 1); -#else - return (bs->buf_mask); -#endif -} - -/* - * Returns the number of bits read. - */ -EXPORT_C uint32 BsGetBitsRead(TBitStream *bs) -{ return (bs->bits_read); } - -/* - * Increments the value that describes how many - * bits are read from the bitstream. - */ -EXPORT_C void BsSetBitsRead(TBitStream *bs, uint32 bits_read) -{ bs->bits_read += bits_read; } - -/* - * Clears the value that describes how many - * bits are read from the bitstream. - */ -EXPORT_C void BsClearBitsRead(TBitStream *bs) -{ bs->bits_read = 0; } - -/* - * Returns the number of unread elements in the bit buffer. - */ -EXPORT_C uint32 BsSlotsLeft(TBitStream *bs) -{ return ((bs->buf_len < bs->slots_read) ? 0 : bs->buf_len - bs->slots_read); } - -/* - * Resets the bitstream. - */ -EXPORT_C void BsReset(TBitStream *bs) -{ - bs->buf_index = 0; - bs->buf_writeIndex = 0; - bs->bit_counter = bs->slotBits; - bs->slots_read = 0; - bs->bits_read = 0; -} - -/* - * Updates the bitstream values according to the given input parameter. - */ -EXPORT_C void BsBufferUpdate(TBitStream *bs, int32 bytesRead) -{ - int32 diff = bs->bits_read - (bytesRead << 3); - - bs->buf_len = (bs->buf_len - bs->slots_read) + bytesRead; - bs->slots_read = 0; - - if(diff < 0) - bs->bits_read = -diff; - else - bs->bits_read = diff; -} - -/************************************************************************** - Title : BsInit - - Purpose : Initializes the bit buffer. - - Usage : BsInit(bs, bit_buffer, size) - - Input : bs - bitstream structure - bit_buffer - address of bit buffer - size - size of buffer - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C void -BsInit(TBitStream *bs, uint8 *bit_buffer, uint32 size) -{ - bs->dsp_buffer = NULL; - bs->bit_buffer = bit_buffer; - bs->mode = BIT8; -#ifndef BITSMODULO_BUFFER - bs->buf_mask = size - 1; -#else - bs->buf_mask = size; -#endif - bs->buf_len = size; - bs->slotBits = sizeof(uint8) << 3; - BsReset(bs); -} - -void -BsInit2(TBitStream *bs, DSP_BYTE *dsp_buffer, uint32 size) -{ - bs->dsp_buffer = dsp_buffer; - bs->bit_buffer = NULL; - bs->mode = BIT16; -#ifndef BITSMODULO_BUFFER - bs->buf_mask = size - 1; -#else - bs->buf_mask = size; -#endif - bs->buf_len = size; - bs->slotBits = sizeof(DSP_BYTE) << 3; - BsReset(bs); -} - -/************************************************************************** - Title : BsByteAlign - - Purpose : Byte aligns the bit counter of the buffer. - - Usage : y = BsByteAlign(bs) - - Input : bs - bitstream parameters - - Output : y - # of bits read - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C int16 -BsByteAlign(TBitStream *bs) -{ - int16 bits_to_byte_align; - - bits_to_byte_align = bs->bit_counter & 7; - if(bits_to_byte_align) - BsSkipBits(bs, bits_to_byte_align); - - return (bits_to_byte_align); -} - -/************************************************************************** - Title : BsLookAhead - - Purpose : Looks ahead for the next 'n' bits from the bit buffer and - returns the read 'n' bits. - - Usage : y = BsLookAhead(bs, n) - - Input : bs - bitstream parameters - n - number of bits to be read from the bit buffer - - Output : y - bits read - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C uint32 -BsLookAhead(TBitStream *bs, int16 n) -{ - TBitStream bs_tmp; - uint32 dword; - - /*-- Save the current state. --*/ - COPY_MEMORY(&bs_tmp, bs, sizeof(TBitStream)); - - dword = BsGetBits(bs, n); - - /*-- Restore the original state. --*/ - COPY_MEMORY(bs, &bs_tmp, sizeof(TBitStream)); - - return (dword); -} - -/************************************************************************** - Title : BsPutBits - - Purpose : Writes bits to the bit buffer. - - Usage : BsPutBits(bs, n, word); - - Input : bs - bitstream parameters - n - number of bits to write - word - bits to write - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C void -BsPutBits(TBitStream *bs, int16 n, uint32 word) -{ - int16 rbits; - - BsSetBitsRead(bs, n); - - /*-- Mask the unwanted bits to zero, just for safety. --*/ - word &= bitMask[n]; - - while(n) - { - rbits = (n > (int16)bs->slotBits) ? bs->slotBits : n; - n -= rbits; - PutBits(bs, rbits, ((word >> n) & bitMask[rbits])); - } -} - -/************************************************************************** - Title : BsPutBitsByteAlign - - Purpose : Byte aligns the write buffer. - - Usage : y = BsPutBitsByteAlign(bs) - - Input : bs - bitstream parameters - - Output : y - # of bits written - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C int16 -BsPutBitsByteAlign(TBitStream *bs) -{ - int16 bits_to_byte_align; - - bits_to_byte_align = bs->bit_counter & 7; - if(bits_to_byte_align) - BsPutBits(bs, bits_to_byte_align, 0); - - return (bits_to_byte_align); -} - -/************************************************************************** - Title : BsGetBits - - Purpose : Reads bits from the bit buffer. - - Usage : y = BsGetBits(bs, n); - - Input : bs - bitstream parameters - n - number of bits to be read - - Output : y - bits read - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C uint32 -BsGetBits(TBitStream *bs, int16 n) -{ - int16 rbits = 0; - uint32 value = 0; - - BsSetBitsRead(bs, n); - - while(n) - { - rbits = (n > (int16)bs->slotBits) ? bs->slotBits : n; - value <<= rbits; - - // modified by Ali Ahmaniemi 7.6.04 - - if (bs->mode == BIT8) - { - value |= GetBits(bs, rbits); - } - else - { - value |= GetBitsDSP(bs, rbits); - } - - //value |= GetFunc[bs->mode](bs, rbits); - n -= rbits; - } - - return (value); -} - -/************************************************************************** - Title : BsSkipBits - - Purpose : Advances the bit buffer index. - - Usage : BsSkipBits(bs, n); - - Input : bs - bitstream parameters - n - number of bits to be discarded - - Explanation : The maximum number of bits that can be discarded is 'bs->slotBits'. - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C void -BsSkipBits(TBitStream *bs, int16 n) -{ - int16 idx; - -#ifdef USE_ASSERT - MY_ASSERT(n < ((int16)bs->slotBits + 1)); -#endif - - BsSetBitsRead(bs, n); - - idx = bs->bit_counter - n; - if(idx < 0) - { - BITSASSERT(bs); - bs->bit_counter = bs->slotBits + idx; - } - else - bs->bit_counter = idx; - - if(bs->bit_counter == 0) - { - BITSASSERT(bs); - bs->bit_counter = bs->slotBits; - } -} - -/************************************************************************** - Title : BsSkipNbits - - Purpose : Same as 'BsSkipBits' with the exception that the number - of bits to be discarded can be of any value. - - Usage : BsSkipNbits(bs, n); - - Input : bs - bitstream parameters - n - number of bits to be discarded - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C void -BsSkipNBits(TBitStream *bs, int32 n) -{ - int32 slots, bits_left, scale; - -#ifdef BYTE_16bit - scale = (bs->mode == BIT8) ? 3 : 4; -#else - scale = 3; -#endif - slots = (n >> scale); - BsSetBitsRead(bs, slots << scale); - bs->buf_index += slots; - bs->buf_index = MOD_OPCODE(bs->buf_index, bs->buf_mask); - bs->slots_read += slots; - bits_left = n - (slots << scale); - if(bits_left) - BsSkipBits(bs, (int16) bits_left); -} - -/************************************************************************** - Title : BsCopyBytes - - Purpose : Copies 'bytesToCopy' bytes from the bit buffer (starting from - the current read index) to the specified output buffer. - - Usage : y = BsCopyBytes(bs, outBuf, bytesToCopy) - - Input : bs - bitstream to be copied - bytesToCopy - # of bytes to copy - - Output : y - # of bytes copied - outBuf - copied bytes - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C uint32 -BsCopyBytes(TBitStream *bs, uint8 *outBuf, uint32 bytesToCopy) -{ - uint32 i; - uint8 *buf0 = (bs->mode == BIT8) ? bs->bit_buffer : bs->dsp_buffer; - - for(i = bs->buf_index; i < (bytesToCopy + bs->buf_index); i++, outBuf++) - *outBuf = buf0[MOD_OPCODE(i, bs->buf_mask)]; - - return (i - bs->buf_index); -} - -/************************************************************************** - Title : BsCopyBits - - Purpose : Copies 'bitsToCopy' bits from the source bit buffer (starting from - the current read index) to the specified destination bit buffer. - - Usage : y = BsCopyBits(bsSrc, bsDst, bitsToCopy) - - Input : bsSrc - source bit buffer - bytesToCopy - # of bits to copy - - Output : bsDst - destination bit buffer - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C void -BsCopyBits(TBitStream *bsSrc, TBitStream *bsDst, int32 bitsToCopy) -{ - int32 i, nBytes; - - nBytes = bitsToCopy >> 3; - - for(i = 0; i < nBytes; i++) - BsPutBits(bsDst, 8, BsGetBits(bsSrc, 8)); - - i = bitsToCopy - (i << 3); - if(i > 0) BsPutBits(bsDst, (int16) i, BsGetBits(bsSrc, (uint16) i)); -} - -/************************************************************************** - Title : BsRewindNBits - - Purpose : Rewinds the bit buffer 'nBits' bits. - - Usage : BsRewindNbits(br, nBits) - - Input : br - bitstream parameters - nBits - number of bits to rewind - - Author(s) : Juha Ojanpera - *************************************************************************/ - -EXPORT_C void -BsRewindNBits(TBitStream *bs, uint32 nBits) -{ - int32 tmp; - int16 new_buf_idx, new_bit_idx; - - new_buf_idx = (int16) (nBits / bs->slotBits); - new_bit_idx = (int16) (nBits % bs->slotBits); - - tmp = bs->bit_counter + new_bit_idx; - if(tmp > (int16)bs->slotBits) - { - new_buf_idx++; - bs->bit_counter = tmp - bs->slotBits; - } - else - bs->bit_counter += new_bit_idx; - - bs->buf_index = MOD_OPCODE(bs->buf_index, bs->buf_mask); - tmp = bs->buf_index - new_buf_idx; - if(tmp > 0) - bs->buf_index = tmp; - else - bs->buf_index = MOD_OPCODE(bs->buf_len + tmp, bs->buf_mask); - - bs->bits_read -= nBits; -} - -EXPORT_C void -BsSaveBufState(TBitStream *bsSrc, TBitStream *bsDst) -{ - COPY_MEMORY(bsDst, bsSrc, sizeof(TBitStream)); -}