198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/* Copyright (C) 2002 Jean-Marc Valin */
298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/**
398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   @file speex_bits.h
498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   @brief Handles bit packing/unpacking
598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/
698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/*
798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   Redistribution and use in source and binary forms, with or without
898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   modification, are permitted provided that the following conditions
998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   are met:
1098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
1198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   - Redistributions of source code must retain the above copyright
1298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   notice, this list of conditions and the following disclaimer.
1398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
1498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   - Redistributions in binary form must reproduce the above copyright
1598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   notice, this list of conditions and the following disclaimer in the
1698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   documentation and/or other materials provided with the distribution.
1798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
1898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   - Neither the name of the Xiph.org Foundation nor the names of its
1998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   contributors may be used to endorse or promote products derived from
2098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   this software without specific prior written permission.
2198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
2298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
2698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
3498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/
3598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
3698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#ifndef BITS_H
3798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#define BITS_H
3898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** @defgroup SpeexBits SpeexBits: Bit-stream manipulations
3998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *  This is the structure that holds the bit-stream when encoding or decoding
4098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * with Speex. It allows some manipulations as well.
4198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *  @{
4298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
4398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
4498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#ifdef __cplusplus
4598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectextern "C" {
4698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#endif
4798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
4898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Bit-packing data structure representing (part of) a bit-stream. */
4998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projecttypedef struct SpeexBits {
5098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   char *chars;   /**< "raw" data */
5198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   int   nbBits;  /**< Total number of bits stored in the stream*/
5298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   int   charPtr; /**< Position of the byte "cursor" */
5398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   int   bitPtr;  /**< Position of the bit "cursor" within the current char */
5498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   int   owner;   /**< Does the struct "own" the "raw" buffer (member "chars") */
5598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   int   overflow;/**< Set to one if we try to read past the valid data */
5698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   int   buf_size;/**< Allocated size for buffer */
5798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   int   reserved1; /**< Reserved for future use */
5898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project   void *reserved2; /**< Reserved for future use */
5998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project} SpeexBits;
6098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
6198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Initializes and allocates resources for a SpeexBits struct */
6298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_init(SpeexBits *bits);
6398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
6498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Initializes SpeexBits struct using a pre-allocated buffer*/
6598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_init_buffer(SpeexBits *bits, void *buff, int buf_size);
6698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
6798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Sets the bits in a SpeexBits struct to use data from an existing buffer (for decoding without copying data) */
6898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_set_bit_buffer(SpeexBits *bits, void *buff, int buf_size);
6998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
7098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Frees all resources associated to a SpeexBits struct. Right now this does nothing since no resources are allocated, but this could change in the future.*/
7198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_destroy(SpeexBits *bits);
7298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
7398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Resets bits to initial value (just after initialization, erasing content)*/
7498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_reset(SpeexBits *bits);
7598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
7698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Rewind the bit-stream to the beginning (ready for read) without erasing the content */
7798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_rewind(SpeexBits *bits);
7898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
7998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Initializes the bit-stream from the data in an area of memory */
8098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_read_from(SpeexBits *bits, char *bytes, int len);
8198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
8298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Append bytes to the bit-stream
8398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *
8498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
8598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bytes pointer to the bytes what will be appended
8698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param len Number of bytes of append
8798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
8898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_read_whole_bytes(SpeexBits *bits, char *bytes, int len);
8998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
9098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Write the content of a bit-stream to an area of memory
9198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *
9298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
9398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bytes Memory location where to write the bits
9498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param max_len Maximum number of bytes to write (i.e. size of the "bytes" buffer)
9598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @return Number of bytes written to the "bytes" buffer
9698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/
9798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectint speex_bits_write(SpeexBits *bits, char *bytes, int max_len);
9898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
9998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Like speex_bits_write, but writes only the complete bytes in the stream. Also removes the written bytes from the stream */
10098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectint speex_bits_write_whole_bytes(SpeexBits *bits, char *bytes, int max_len);
10198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
10298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Append bits to the bit-stream
10398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
10498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param data Value to append as integer
10598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param nbBits number of bits to consider in "data"
10698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
10798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_pack(SpeexBits *bits, int data, int nbBits);
10898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
10998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Interpret the next bits in the bit-stream as a signed integer
11098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *
11198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
11298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param nbBits Number of bits to interpret
11398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @return A signed integer represented by the bits read
11498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
11598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectint speex_bits_unpack_signed(SpeexBits *bits, int nbBits);
11698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
11798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Interpret the next bits in the bit-stream as an unsigned integer
11898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *
11998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
12098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param nbBits Number of bits to interpret
12198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @return An unsigned integer represented by the bits read
12298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
12398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectunsigned int speex_bits_unpack_unsigned(SpeexBits *bits, int nbBits);
12498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
12598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Returns the number of bytes in the bit-stream, including the last one even if it is not "full"
12698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *
12798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
12898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @return Number of bytes in the stream
12998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
13098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectint speex_bits_nbytes(SpeexBits *bits);
13198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
13298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Same as speex_bits_unpack_unsigned, but without modifying the cursor position
13398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *
13498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
13598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param nbBits Number of bits to look for
13698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @return Value of the bits peeked, interpreted as unsigned
13798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
13898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectunsigned int speex_bits_peek_unsigned(SpeexBits *bits, int nbBits);
13998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
14098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Get the value of the next bit in the stream, without modifying the
14198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * "cursor" position
14298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *
14398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
14498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @return Value of the bit peeked (one bit only)
14598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
14698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectint speex_bits_peek(SpeexBits *bits);
14798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
14898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Advances the position of the "bit cursor" in the stream
14998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *
15098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
15198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param n Number of bits to advance
15298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
15398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_advance(SpeexBits *bits, int n);
15498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
15598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Returns the number of bits remaining to be read in a stream
15698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *
15798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
15898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @return Number of bits that can still be read from the stream
15998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
16098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectint speex_bits_remaining(SpeexBits *bits);
16198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
16298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Insert a terminator so that the data can be sent as a packet while auto-detecting
16398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * the number of frames in each packet
16498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project *
16598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param bits Bit-stream to operate on
16698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */
16798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_bits_insert_terminator(SpeexBits *bits);
16898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
16998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#ifdef __cplusplus
17098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project}
17198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#endif
17298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
17398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/* @} */
17498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#endif
175