vlc_bits.h
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:4k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * bits.h :
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 VideoLAN
  5.  * $Id: vlc_bits.h 6961 2004-03-05 17:34:23Z sam $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #ifndef _VLC_BITS_H
  24. #define _VLC_BITS_H 1
  25. typedef struct bs_s
  26. {
  27.     uint8_t *p_start;
  28.     uint8_t *p;
  29.     uint8_t *p_end;
  30.     int     i_left;    /* i_count number of available bits */
  31. } bs_t;
  32. static inline void bs_init( bs_t *s, void *p_data, int i_data )
  33. {
  34.     s->p_start = p_data;
  35.     s->p       = p_data;
  36.     s->p_end   = s->p + i_data;
  37.     s->i_left  = 8;
  38. }
  39. static inline int bs_pos( bs_t *s )
  40. {
  41.     return( 8 * ( s->p - s->p_start ) + 8 - s->i_left );
  42. }
  43. static inline int bs_eof( bs_t *s )
  44. {
  45.     return( s->p >= s->p_end ? 1: 0 );
  46. }
  47. static inline uint32_t bs_read( bs_t *s, int i_count )
  48. {
  49.      static uint32_t i_mask[33] =
  50.      {  0x00,
  51.         0x01,      0x03,      0x07,      0x0f,
  52.         0x1f,      0x3f,      0x7f,      0xff,
  53.         0x1ff,     0x3ff,     0x7ff,     0xfff,
  54.         0x1fff,    0x3fff,    0x7fff,    0xffff,
  55.         0x1ffff,   0x3ffff,   0x7ffff,   0xfffff,
  56.         0x1fffff,  0x3fffff,  0x7fffff,  0xffffff,
  57.         0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff,
  58.         0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff};
  59.     int      i_shr;
  60.     uint32_t i_result = 0;
  61.     while( i_count > 0 )
  62.     {
  63.         if( s->p >= s->p_end )
  64.         {
  65.             break;
  66.         }
  67.         if( ( i_shr = s->i_left - i_count ) >= 0 )
  68.         {
  69.             /* more in the buffer than requested */
  70.             i_result |= ( *s->p >> i_shr )&i_mask[i_count];
  71.             s->i_left -= i_count;
  72.             if( s->i_left == 0 )
  73.             {
  74.                 s->p++;
  75.                 s->i_left = 8;
  76.             }
  77.             return( i_result );
  78.         }
  79.         else
  80.         {
  81.             /* less in the buffer than requested */
  82.            i_result |= (*s->p&i_mask[s->i_left]) << -i_shr;
  83.            i_count  -= s->i_left;
  84.            s->p++;
  85.            s->i_left = 8;
  86.         }
  87.     }
  88.     return( i_result );
  89. }
  90. static inline uint32_t bs_read1( bs_t *s )
  91. {
  92.     if( s->p < s->p_end )
  93.     {
  94.         unsigned int i_result;
  95.         s->i_left--;
  96.         i_result = ( *s->p >> s->i_left )&0x01;
  97.         if( s->i_left == 0 )
  98.         {
  99.             s->p++;
  100.             s->i_left = 8;
  101.         }
  102.         return i_result;
  103.     }
  104.     return 0;
  105. }
  106. static inline uint32_t bs_show( bs_t *s, int i_count )
  107. {
  108.     bs_t     s_tmp = *s;
  109.     return bs_read( &s_tmp, i_count );
  110. }
  111. static inline void bs_skip( bs_t *s, int i_count )
  112. {
  113.     s->i_left -= i_count;
  114.     while( s->i_left <= 0 )
  115.     {
  116.         s->p++;
  117.         s->i_left += 8;
  118.     }
  119. }
  120. static inline void bs_write( bs_t *s, int i_count, uint32_t i_bits )
  121. {
  122.     while( i_count > 0 )
  123.     {
  124.         if( s->p >= s->p_end )
  125.         {
  126.             break;
  127.         }
  128.         i_count--;
  129.         if( ( i_bits >> i_count )&0x01 )
  130.         {
  131.             *s->p |= 1 << ( s->i_left - 1 );
  132.         }
  133.         else
  134.         {
  135.             *s->p &= ~( 1 << ( s->i_left - 1 ) );
  136.         }
  137.         s->i_left--;
  138.         if( s->i_left == 0 )
  139.         {
  140.             s->p++;
  141.             s->i_left = 8;
  142.         }
  143.     }
  144. }
  145. static inline void bs_align( bs_t *s )
  146. {
  147.     if( s->i_left != 8 )
  148.     {
  149.         s->i_left = 8;
  150.         s->p++;
  151.     }
  152. }
  153. static inline void bs_align_0( bs_t *s )
  154. {
  155.     if( s->i_left != 8 )
  156.     {
  157.         bs_write( s, s->i_left, 0 );
  158.     }
  159. }
  160. static inline void bs_align_1( bs_t *s )
  161. {
  162.     while( s->i_left != 8 )
  163.     {
  164.         bs_write( s, 1, 1 );
  165.     }
  166. }
  167. #endif