|  | /***************************************************************************** | 
|  | *  Copyright Statement: | 
|  | *  -------------------- | 
|  | *  This software is protected by Copyright and the information contained | 
|  | *  herein is confidential. The software may not be copied and the information | 
|  | *  contained herein may not be used or disclosed except with the written | 
|  | *  permission of MediaTek Inc. (C) 2005 | 
|  | * | 
|  | *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES | 
|  | *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") | 
|  | *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON | 
|  | *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, | 
|  | *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF | 
|  | *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. | 
|  | *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE | 
|  | *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR | 
|  | *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH | 
|  | *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO | 
|  | *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S | 
|  | *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. | 
|  | * | 
|  | *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE | 
|  | *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, | 
|  | *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, | 
|  | *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO | 
|  | *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. | 
|  | * | 
|  | *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE | 
|  | *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF | 
|  | *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND | 
|  | *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER | 
|  | *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). | 
|  | * | 
|  | *****************************************************************************/ | 
|  |  | 
|  | /***************************************************************************** | 
|  | * | 
|  | * Filename: | 
|  | * --------- | 
|  | *   bitstream.h | 
|  | * | 
|  | * Project: | 
|  | * -------- | 
|  | *   Maui_Software | 
|  | * | 
|  | * Description: | 
|  | * ------------ | 
|  | *   BitStream allows sequential reading and writing of bit fields. | 
|  | * | 
|  | * Author: | 
|  | * ------- | 
|  | * ------- | 
|  | * | 
|  | *============================================================================ | 
|  | *             HISTORY | 
|  | * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! | 
|  | *------------------------------------------------------------------------------ | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | * | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | * | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | * | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | * removed! | 
|  | *------------------------------------------------------------------------------ | 
|  | * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! | 
|  | *============================================================================ | 
|  | ****************************************************************************/ | 
|  |  | 
|  | /********************************************************************* | 
|  | (C) _____ (year of first publication) Sasken communication | 
|  | Technologies Limited, All rights reserved. | 
|  | *   This file provides a template for .c files. This space | 
|  | *   should be used to describe the file contents | 
|  | *   Component-specific prefix : xxxx | 
|  | *********************************************************************/ | 
|  |  | 
|  | #ifndef _BITSTREAM_H | 
|  | #define _BITSTREAM_H | 
|  | /*RHR*/ | 
|  | #include "kal_general_types.h" | 
|  | /*RHR*/ | 
|  | /* BitStream | 
|  | * | 
|  | *      A bit stream allows bit fields to be read and written to, | 
|  | *      just like an byte stream allows byte to be read and written | 
|  | *      to. Reading and writing of bit fields is done to an underlying | 
|  | *      byte stream, in network byte order. | 
|  | * | 
|  | *      bit_stream_init sets the underlying byte stream and the | 
|  | *      current read/write position within the byte stream. Can also | 
|  | *      be called when a seek to a new position is desired. | 
|  |  | 
|  | *      The values which are read by bit_stream_read are returned as | 
|  | *      native unsigned integers. | 
|  | * | 
|  | *      Similarly the values which are passed to bit_stream_write for | 
|  | *      writing should be passed as native unsigned integers. | 
|  | * | 
|  | *      Both bit_stream_read and bit_stream_write, increment the | 
|  | *      current position,to facilitate sequential operation. | 
|  | *      bit_stream_cur_pos returns the number of bytes, the underlying | 
|  | *      byte pointer has been moved since bit_stream_init. | 
|  | * | 
|  | */ | 
|  |  | 
|  | typedef struct bit_stream { | 
|  | kal_uint8    *byte_stream; /* Pointer to underlying byte stream. */ | 
|  | kal_uint8    *byte_stream_start; | 
|  | kal_uint8    offset;    /* Offset in bits from MSB of byte_stream */ | 
|  | } bit_stream; | 
|  |  | 
|  | /* Initialise Bit stream operations | 
|  | * | 
|  | *                                offset | 
|  | *                                | | 
|  | *                                V | 
|  | *               /-------------------------------\ | 
|  | * byte_stream-->|   |   |   |   |   |   |   |   | | 
|  | *               |---|---|---|---|---|---|---|---| | 
|  | *               |   |   |   |   |   |   |   |   | | 
|  | *               |---|---|---|---|---|---|---|---| | 
|  | *               |   |   |   |   |   |   |   |   | | 
|  | *               |---|---|---|---|---|---|---|---| | 
|  | *               | . | . | . | . | . | . | . | . | | 
|  | *                 .   .   .   .   .   .   .   . | 
|  | *                 .   .   .   .   .   .   .   . | 
|  | * | 
|  | *  If offset is more than eight then, byte_stream is incremented by | 
|  | *  offset/8 and offset is taken to be offset modulo 8. | 
|  | */ | 
|  | extern void bit_stream_init( | 
|  | bit_stream      *bs, | 
|  | kal_uint8       *byte_stream, | 
|  | unsigned int    offset); | 
|  |  | 
|  | /* Read specified number of bits from current position and return it as | 
|  | *  an unsigned integer. | 
|  | * | 
|  | *                                        offset (before) | 
|  | *                                        | | 
|  | *                                        V | 
|  | *                       /-------------------------------\ | 
|  | * byte_stream (before)->|   |   |   |   | 1 | 0 | 0 | 0 | | 
|  | *                       |---|---|---|---|---|---|---|---| | 
|  | * byte_stream (after) ->| 1 | 0 |   |   |   |   |   |   | | 
|  | *                       |---|---|---|---|---|---|---|---| | 
|  | *                       | . | . | ^ | . | . | . | . | . | | 
|  | *                                 | | 
|  | *                                 offset (after) | 
|  | * | 
|  | *      On the above stream bit_stream_read(bs, 6) will return 34 | 
|  | */ | 
|  | extern unsigned int bit_stream_read( | 
|  | bit_stream      *bs, | 
|  | unsigned int    width); | 
|  |  | 
|  |  | 
|  | /* Write specified number of bits from current position into the | 
|  | * underlying byte stream. | 
|  | * | 
|  | *              bit_stream_write(bs, 6) | 
|  | * | 
|  | *                                        offset (before) | 
|  | *                                        | | 
|  | *                                        V | 
|  | *                       /-------------------------------\ | 
|  | * byte_stream (before)->|   |   |   |   | 1 | 0 | 0 | 0 | | 
|  | *                       |---|---|---|---|---|---|---|---| | 
|  | * byte_stream (after) ->| 1 | 0 |   |   |   |   |   |   | | 
|  | *                       |---|---|---|---|---|---|---|---| | 
|  | *                       | . | . | ^ | . | . | . | . | . | | 
|  | *                                 | | 
|  | *                                 offset (after) | 
|  | * | 
|  | */ | 
|  | extern void bit_stream_write( | 
|  | bit_stream      *bs, | 
|  | unsigned int    width, | 
|  | unsigned int    value ); | 
|  |  | 
|  | /* Return the number of bits the internal pointer has moved since | 
|  | * bit_stream_init */ | 
|  | extern unsigned int bit_stream_cur_pos(bit_stream    *bs); | 
|  |  | 
|  | /* Move pointer back by given number of bits */ | 
|  | extern void bit_stream_move_back( | 
|  | bit_stream      *bs, | 
|  | unsigned int    bits); | 
|  |  | 
|  | /* Copy bits from one byte stream to another. | 
|  | * Byte stream is incremented as read operation | 
|  | * is done */ | 
|  |  | 
|  | extern void byte_stream_bit_copy( | 
|  | kal_uint8      *s, | 
|  | unsigned int   s_offset, | 
|  | unsigned int   length, | 
|  | kal_uint8      *d, | 
|  | unsigned int   d_offset); | 
|  |  | 
|  |  | 
|  | /* Read specified number of bits from the bitstream, starting | 
|  | * from a position, width bits before the current position. | 
|  |  | 
|  | * | 
|  | *                                        offset (after) | 
|  | *                                        | | 
|  | *                                        V | 
|  | *                       /-------------------------------\ | 
|  | * byte_stream (after)-> |   |   |   |   | 1 | 0 | 0 | 0 | | 
|  | *                       |---|---|---|---|---|---|---|---| | 
|  | * byte_stream (before)->| 1 | 0 |   |   |   |   |   |   | | 
|  | *                       |---|---|---|---|---|---|---|---| | 
|  | *                       | . | . | ^ | . | . | . | . | . | | 
|  | *                                 | | 
|  | *                                 offset (before) | 
|  | * | 
|  | *      On the above stream , | 
|  | *         bit_stream_read_back(bs, 6) will return 34 | 
|  | */ | 
|  |  | 
|  | extern unsigned int bit_stream_read_back( | 
|  | bit_stream    *bs, | 
|  | unsigned int  width); | 
|  |  | 
|  |  | 
|  |  | 
|  | /* Write specified number of bits to the bitstream starting | 
|  | * from a position width bits before the current position. | 
|  | * | 
|  | *     bit_stream_write_back(bs, 6, 34) will return | 
|  | * | 
|  | * | 
|  | *                                        offset (after) | 
|  | *                                        | | 
|  | *                                        V | 
|  | *                       /-------------------------------\ | 
|  | * byte_stream (after) ->|   |   |   |   | 1 | 0 | 0 | 0 | | 
|  | *                       |---|---|---|---|---|---|---|---| | 
|  | * byte_stream (before)->| 1 | 0 |   |   |   |   |   |   | | 
|  | *                       |---|---|---|---|---|---|---|---| | 
|  | *                       | . | . | ^ | . | . | . | . | . | | 
|  | *                                 | | 
|  | *                                 offset (before) | 
|  | * | 
|  | */ | 
|  | extern void bit_stream_write_back( | 
|  | bit_stream      *bs, | 
|  | unsigned int    width, | 
|  | unsigned int    value ); | 
|  | #endif /* _BITSTREAM_H */ | 
|  |  |