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