1 /* putbits.c, bit-level output */
3 /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
6 * Disclaimer of Warranty
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.
16 * This disclaimer of warranty extends to the user of these programs and user's
17 * customers, employees, agents, transferees, successors, and assigns.
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
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
34 extern FILE *outfile
; /* the only global var we need here */
37 static unsigned char outbfr
;
41 void slice_initbits(slice_engine_t
*engine
)
44 engine
->slice_size
= 0;
47 void slice_testbits(slice_engine_t
*engine
)
50 printf("slice test size %x outcnt %d outbfr %x\n", engine
->slice_size
, engine
->outcnt
, engine
->outbfr
<< engine
->outcnt
);
52 * for(i = 0; i < engine->slice_size; i++)
53 * printf("%02x ", engine->slice_buffer[i]);
54 * printf("%x\n", engine->outbfr << engine->outcnt);
58 void slice_putc(slice_engine_t
*engine
, unsigned char c
)
60 if(engine
->slice_size
>= engine
->slice_allocated
)
62 long new_allocation
= (engine
->slice_allocated
> 0) ? (engine
->slice_allocated
* 2) : 64;
63 unsigned char *new_buffer
= calloc(1, new_allocation
);
64 if(engine
->slice_buffer
)
66 memcpy(new_buffer
, engine
->slice_buffer
, engine
->slice_size
);
67 free(engine
->slice_buffer
);
69 engine
->slice_buffer
= new_buffer
;
70 engine
->slice_allocated
= new_allocation
;
72 engine
->slice_buffer
[engine
->slice_size
++] = c
;
75 void slice_putbits(slice_engine_t
*engine
, long val
, int n
)
80 mask
= 1 << (n
- 1); /* selects first (leftmost) bit */
82 for(i
= 0; i
< n
; i
++)
89 mask
>>= 1; /* select next bit */
92 if(engine
->outcnt
== 0) /* 8 bit buffer full */
94 slice_putc(engine
, engine
->outbfr
);
101 /* zero bit stuffing to next byte boundary (5.2.3, 6.2.1) */
102 void slice_alignbits(slice_engine_t
*engine
)
104 if(engine
->outcnt
!= 8)
105 slice_putbits(engine
, 0, engine
->outcnt
);
108 void slice_finishslice(slice_engine_t
*engine
)
111 slice_alignbits(engine
);
113 if(!fwrite(engine
->slice_buffer
, 1, engine
->slice_size
, outfile
))
115 perror("Write error");
117 bytecnt
+= engine
->slice_size
;
122 /* initialize buffer, call once before first putbits or alignbits */
123 void mpeg2_initbits()
130 /* write rightmost n (0<=n<=32) bits of val to outfile */
131 void mpeg2enc_putbits(val
,n
)
138 mask
= 1 << (n
-1); /* selects first (leftmost) bit */
147 mask
>>= 1; /* select next bit */
150 if (outcnt
==0) /* 8 bit buffer full */
152 putc(outbfr
,outfile
);
159 /* zero bit stuffing to next byte boundary (5.2.3, 6.2.1) */
163 mpeg2enc_putbits(0,outcnt
);
166 /* return total number of generated bits */
169 return (double)8 * bytecnt
+ (8 - outcnt
);