putbits.c
上传用户:ma_junhua
上传日期:2008-04-11
资源大小:2752k
文件大小:2k
开发平台:

C/C++

  1. /* putbits.c, bit-level output                                              */
  2. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  3. /*
  4.  * Disclaimer of Warranty
  5.  *
  6.  * These software programs are available to the user without any license fee or
  7.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  8.  * any and all warranties, whether express, implied, or statuary, including any
  9.  * implied warranties or merchantability or of fitness for a particular
  10.  * purpose.  In no event shall the copyright-holder be liable for any
  11.  * incidental, punitive, or consequential damages of any kind whatsoever
  12.  * arising from the use of these programs.
  13.  *
  14.  * This disclaimer of warranty extends to the user of these programs and user's
  15.  * customers, employees, agents, transferees, successors, and assigns.
  16.  *
  17.  * The MPEG Software Simulation Group does not represent or warrant that the
  18.  * programs furnished hereunder are free of infringement of any third-party
  19.  * patents.
  20.  *
  21.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  22.  * are subject to royalty fees to patent holders.  Many of these patents are
  23.  * general enough such that they are unavoidable regardless of implementation
  24.  * design.
  25.  *
  26.  */
  27. #include <stdio.h>
  28. #include "config.h"
  29. extern FILE *outfile; /* the only global var we need here */
  30. /* private data */
  31. static unsigned char outbfr;
  32. static int outcnt;
  33. static int bytecnt;
  34. /* initialize buffer, call once before first putbits or alignbits */
  35. void initbits()
  36. {
  37.   outcnt = 8;
  38.   bytecnt = 0;
  39. }
  40. /* write rightmost n (0<=n<=32) bits of val to outfile */
  41. void putbits(val,n)
  42. int val;
  43. int n;
  44. {
  45.   int i;
  46.   unsigned int mask;
  47.   mask = 1 << (n-1); /* selects first (leftmost) bit */
  48.   for (i=0; i<n; i++)
  49.   {
  50.     outbfr <<= 1;
  51.     if (val & mask)
  52.       outbfr|= 1;
  53.     mask >>= 1; /* select next bit */
  54.     outcnt--;
  55.     if (outcnt==0) /* 8 bit buffer full */
  56.     {
  57.       putc(outbfr,outfile);
  58.       outcnt = 8;
  59.       bytecnt++;
  60.     }
  61.   }
  62. }
  63. /* zero bit stuffing to next byte boundary (5.2.3, 6.2.1) */
  64. void alignbits()
  65. {
  66.   if (outcnt!=8)
  67.     putbits(0,outcnt);
  68. }
  69. /* return total number of generated bits */
  70. int bitcount()
  71. {
  72.   return 8*bytecnt + (8-outcnt);
  73. }