xref: /plan9/sys/src/games/mp3enc/bitstream.c (revision 8f5875f3e9b20916b4c52ad4336922bc8653eb7b)
1*8f5875f3SDavid du Colombier /*
2*8f5875f3SDavid du Colombier  *	MP3 bitstream Output interface for LAME
3*8f5875f3SDavid du Colombier  *
4*8f5875f3SDavid du Colombier  *	Copyright (c) 1999 Takehiro TOMINAGA
5*8f5875f3SDavid du Colombier  *
6*8f5875f3SDavid du Colombier  * This library is free software; you can redistribute it and/or
7*8f5875f3SDavid du Colombier  * modify it under the terms of the GNU Library General Public
8*8f5875f3SDavid du Colombier  * License as published by the Free Software Foundation; either
9*8f5875f3SDavid du Colombier  * version 2 of the License, or (at your option) any later version.
10*8f5875f3SDavid du Colombier  *
11*8f5875f3SDavid du Colombier  * This library is distributed in the hope that it will be useful,
12*8f5875f3SDavid du Colombier  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*8f5875f3SDavid du Colombier  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
14*8f5875f3SDavid du Colombier  * Library General Public License for more details.
15*8f5875f3SDavid du Colombier  *
16*8f5875f3SDavid du Colombier  * You should have received a copy of the GNU Library General Public
17*8f5875f3SDavid du Colombier  * License along with this library; if not, write to the
18*8f5875f3SDavid du Colombier  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19*8f5875f3SDavid du Colombier  * Boston, MA 02111-1307, USA.
20*8f5875f3SDavid du Colombier  */
21*8f5875f3SDavid du Colombier 
22*8f5875f3SDavid du Colombier 
23*8f5875f3SDavid du Colombier #ifdef HAVE_CONFIG_H
24*8f5875f3SDavid du Colombier #include <config.h>
25*8f5875f3SDavid du Colombier #endif
26*8f5875f3SDavid du Colombier 
27*8f5875f3SDavid du Colombier #include <stdlib.h>
28*8f5875f3SDavid du Colombier #include <assert.h>
29*8f5875f3SDavid du Colombier #include <stdio.h>
30*8f5875f3SDavid du Colombier #include "tables.h"
31*8f5875f3SDavid du Colombier #include "bitstream.h"
32*8f5875f3SDavid du Colombier #include "quantize.h"
33*8f5875f3SDavid du Colombier #include "quantize_pvt.h"
34*8f5875f3SDavid du Colombier #include "version.h"
35*8f5875f3SDavid du Colombier 
36*8f5875f3SDavid du Colombier #ifdef WITH_DMALLOC
37*8f5875f3SDavid du Colombier #include <dmalloc.h>
38*8f5875f3SDavid du Colombier #endif
39*8f5875f3SDavid du Colombier 
40*8f5875f3SDavid du Colombier /* This is the scfsi_band table from 2.4.2.7 of the IS */
41*8f5875f3SDavid du Colombier const int scfsi_band[5] = { 0, 6, 11, 16, 21 };
42*8f5875f3SDavid du Colombier 
43*8f5875f3SDavid du Colombier 
44*8f5875f3SDavid du Colombier /* unsigned int is at least this large:  */
45*8f5875f3SDavid du Colombier /* we work with ints, so when doing bit manipulation, we limit
46*8f5875f3SDavid du Colombier  * ourselves to MAX_LENGTH-2 just to be on the safe side */
47*8f5875f3SDavid du Colombier #define MAX_LENGTH      32
48*8f5875f3SDavid du Colombier 
49*8f5875f3SDavid du Colombier 
50*8f5875f3SDavid du Colombier 
51*8f5875f3SDavid du Colombier #ifdef DEBUG
52*8f5875f3SDavid du Colombier static int hoge, hogege;
53*8f5875f3SDavid du Colombier #endif
54*8f5875f3SDavid du Colombier 
putheader_bits(lame_internal_flags * gfc,int w_ptr)55*8f5875f3SDavid du Colombier void putheader_bits(lame_internal_flags *gfc,int w_ptr)
56*8f5875f3SDavid du Colombier {
57*8f5875f3SDavid du Colombier     Bit_stream_struc *bs;
58*8f5875f3SDavid du Colombier     bs = &gfc->bs;
59*8f5875f3SDavid du Colombier #ifdef DEBUG
60*8f5875f3SDavid du Colombier     hoge += gfc->sideinfo_len * 8;
61*8f5875f3SDavid du Colombier     hogege += gfc->sideinfo_len * 8;
62*8f5875f3SDavid du Colombier #endif
63*8f5875f3SDavid du Colombier     memcpy(&bs->buf[bs->buf_byte_idx], gfc->header[gfc->w_ptr].buf,
64*8f5875f3SDavid du Colombier 	   gfc->sideinfo_len);
65*8f5875f3SDavid du Colombier     bs->buf_byte_idx += gfc->sideinfo_len;
66*8f5875f3SDavid du Colombier     bs->totbit += gfc->sideinfo_len * 8;
67*8f5875f3SDavid du Colombier     gfc->w_ptr = (gfc->w_ptr + 1) & (MAX_HEADER_BUF - 1);
68*8f5875f3SDavid du Colombier }
69*8f5875f3SDavid du Colombier 
70*8f5875f3SDavid du Colombier /*write j bits into the bit stream */
71*8f5875f3SDavid du Colombier static void
putbits2(lame_global_flags * gfp,int val,int j)72*8f5875f3SDavid du Colombier putbits2(lame_global_flags *gfp, int val, int j)
73*8f5875f3SDavid du Colombier {
74*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
75*8f5875f3SDavid du Colombier     Bit_stream_struc *bs;
76*8f5875f3SDavid du Colombier     bs = &gfc->bs;
77*8f5875f3SDavid du Colombier 
78*8f5875f3SDavid du Colombier //	assert(j < MAX_LENGTH-2);
79*8f5875f3SDavid du Colombier 
80*8f5875f3SDavid du Colombier     while (j > 0) {
81*8f5875f3SDavid du Colombier 	int k;
82*8f5875f3SDavid du Colombier 
83*8f5875f3SDavid du Colombier 	if (bs->buf_bit_idx == 0) {
84*8f5875f3SDavid du Colombier 	    bs->buf_bit_idx = 8;
85*8f5875f3SDavid du Colombier 	    bs->buf_byte_idx++;
86*8f5875f3SDavid du Colombier //		assert(bs->buf_byte_idx < BUFFER_SIZE);
87*8f5875f3SDavid du Colombier //		assert(gfc->header[gfc->w_ptr].write_timing >= bs->totbit);
88*8f5875f3SDavid du Colombier 	    if (gfc->header[gfc->w_ptr].write_timing == bs->totbit)
89*8f5875f3SDavid du Colombier 	      putheader_bits(gfc, gfc->w_ptr);
90*8f5875f3SDavid du Colombier 	    bs->buf[bs->buf_byte_idx] = 0;
91*8f5875f3SDavid du Colombier 	}
92*8f5875f3SDavid du Colombier 
93*8f5875f3SDavid du Colombier 	k = Min(j, bs->buf_bit_idx);
94*8f5875f3SDavid du Colombier 	j -= k;
95*8f5875f3SDavid du Colombier 
96*8f5875f3SDavid du Colombier 	bs->buf_bit_idx -= k;
97*8f5875f3SDavid du Colombier 
98*8f5875f3SDavid du Colombier //	assert (j < MAX_LENGTH); /* 32 too large on 32 bit machines */
99*8f5875f3SDavid du Colombier //	assert (bs->buf_bit_idx < MAX_LENGTH);
100*8f5875f3SDavid du Colombier 
101*8f5875f3SDavid du Colombier         bs->buf[bs->buf_byte_idx] |= (val >> j) << bs->buf_bit_idx;
102*8f5875f3SDavid du Colombier 	bs->totbit += k;
103*8f5875f3SDavid du Colombier     }
104*8f5875f3SDavid du Colombier }
105*8f5875f3SDavid du Colombier 
106*8f5875f3SDavid du Colombier /*write j bits into the bit stream, ignoring frame headers */
107*8f5875f3SDavid du Colombier static void
putbits_noheaders(lame_global_flags * gfp,int val,int j)108*8f5875f3SDavid du Colombier putbits_noheaders(lame_global_flags *gfp, int val, int j)
109*8f5875f3SDavid du Colombier {
110*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
111*8f5875f3SDavid du Colombier     Bit_stream_struc *bs;
112*8f5875f3SDavid du Colombier     bs = &gfc->bs;
113*8f5875f3SDavid du Colombier 
114*8f5875f3SDavid du Colombier //	assert(j < MAX_LENGTH-2);
115*8f5875f3SDavid du Colombier 
116*8f5875f3SDavid du Colombier     while (j > 0) {
117*8f5875f3SDavid du Colombier 	int k;
118*8f5875f3SDavid du Colombier 	if (bs->buf_bit_idx == 0) {
119*8f5875f3SDavid du Colombier 	    bs->buf_bit_idx = 8;
120*8f5875f3SDavid du Colombier 	    bs->buf_byte_idx++;
121*8f5875f3SDavid du Colombier //		assert(bs->buf_byte_idx < BUFFER_SIZE);
122*8f5875f3SDavid du Colombier 	    bs->buf[bs->buf_byte_idx] = 0;
123*8f5875f3SDavid du Colombier 	}
124*8f5875f3SDavid du Colombier 
125*8f5875f3SDavid du Colombier 	k = Min(j, bs->buf_bit_idx);
126*8f5875f3SDavid du Colombier 	j -= k;
127*8f5875f3SDavid du Colombier 
128*8f5875f3SDavid du Colombier 	bs->buf_bit_idx -= k;
129*8f5875f3SDavid du Colombier 
130*8f5875f3SDavid du Colombier //	assert (j < MAX_LENGTH); /* 32 too large on 32 bit machines */
131*8f5875f3SDavid du Colombier //	assert (bs->buf_bit_idx < MAX_LENGTH);
132*8f5875f3SDavid du Colombier 
133*8f5875f3SDavid du Colombier         bs->buf[bs->buf_byte_idx] |= (val >> j) << bs->buf_bit_idx;
134*8f5875f3SDavid du Colombier 	bs->totbit += k;
135*8f5875f3SDavid du Colombier     }
136*8f5875f3SDavid du Colombier }
137*8f5875f3SDavid du Colombier 
138*8f5875f3SDavid du Colombier 
139*8f5875f3SDavid du Colombier /*
140*8f5875f3SDavid du Colombier   Some combinations of bitrate, Fs, and stereo make it impossible to stuff
141*8f5875f3SDavid du Colombier   out a frame using just main_data, due to the limited number of bits to
142*8f5875f3SDavid du Colombier   indicate main_data_length. In these situations, we put stuffing bits into
143*8f5875f3SDavid du Colombier   the ancillary data...
144*8f5875f3SDavid du Colombier */
145*8f5875f3SDavid du Colombier static void
drain_into_ancillary(lame_global_flags * gfp,int remainingBits)146*8f5875f3SDavid du Colombier drain_into_ancillary(lame_global_flags *gfp,int remainingBits)
147*8f5875f3SDavid du Colombier {
148*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
149*8f5875f3SDavid du Colombier     int i;
150*8f5875f3SDavid du Colombier     assert(remainingBits >= 0);
151*8f5875f3SDavid du Colombier 
152*8f5875f3SDavid du Colombier     if (remainingBits >= 8) {
153*8f5875f3SDavid du Colombier       putbits2(gfp,0x4c,8);
154*8f5875f3SDavid du Colombier       remainingBits -= 8;
155*8f5875f3SDavid du Colombier     }
156*8f5875f3SDavid du Colombier     if (remainingBits >= 8) {
157*8f5875f3SDavid du Colombier       putbits2(gfp,0x41,8);
158*8f5875f3SDavid du Colombier       remainingBits -= 8;
159*8f5875f3SDavid du Colombier     }
160*8f5875f3SDavid du Colombier     if (remainingBits >= 8) {
161*8f5875f3SDavid du Colombier       putbits2(gfp,0x4d,8);
162*8f5875f3SDavid du Colombier       remainingBits -= 8;
163*8f5875f3SDavid du Colombier     }
164*8f5875f3SDavid du Colombier     if (remainingBits >= 8) {
165*8f5875f3SDavid du Colombier       putbits2(gfp,0x45,8);
166*8f5875f3SDavid du Colombier       remainingBits -= 8;
167*8f5875f3SDavid du Colombier     }
168*8f5875f3SDavid du Colombier 
169*8f5875f3SDavid du Colombier     if (remainingBits >= 32) {
170*8f5875f3SDavid du Colombier       const char *version = get_lame_short_version ();
171*8f5875f3SDavid du Colombier       if (remainingBits >= 32)
172*8f5875f3SDavid du Colombier 	for (i=0; i<(int)strlen(version) && remainingBits >=8 ; ++i) {
173*8f5875f3SDavid du Colombier 	  remainingBits -= 8;
174*8f5875f3SDavid du Colombier 	  putbits2(gfp,version[i],8);
175*8f5875f3SDavid du Colombier 	}
176*8f5875f3SDavid du Colombier     }
177*8f5875f3SDavid du Colombier 
178*8f5875f3SDavid du Colombier     for (; remainingBits >= 1; remainingBits -= 1 ) {
179*8f5875f3SDavid du Colombier         putbits2 ( gfp, gfc->ancillary_flag, 1 );
180*8f5875f3SDavid du Colombier         gfc->ancillary_flag ^= 1;
181*8f5875f3SDavid du Colombier     }
182*8f5875f3SDavid du Colombier 
183*8f5875f3SDavid du Colombier     assert (remainingBits == 0);
184*8f5875f3SDavid du Colombier 
185*8f5875f3SDavid du Colombier }
186*8f5875f3SDavid du Colombier 
187*8f5875f3SDavid du Colombier /*write N bits into the header */
188*8f5875f3SDavid du Colombier inline static void
writeheader(lame_internal_flags * gfc,int val,int j)189*8f5875f3SDavid du Colombier writeheader(lame_internal_flags *gfc,int val, int j)
190*8f5875f3SDavid du Colombier {
191*8f5875f3SDavid du Colombier     int ptr = gfc->header[gfc->h_ptr].ptr;
192*8f5875f3SDavid du Colombier 
193*8f5875f3SDavid du Colombier     while (j > 0) {
194*8f5875f3SDavid du Colombier 	int k = Min(j, 8 - (ptr & 7));
195*8f5875f3SDavid du Colombier 	j -= k;
196*8f5875f3SDavid du Colombier         assert (j < MAX_LENGTH); /* >> 32  too large for 32 bit machines */
197*8f5875f3SDavid du Colombier 	gfc->header[gfc->h_ptr].buf[ptr >> 3]
198*8f5875f3SDavid du Colombier 	    |= ((val >> j)) << (8 - (ptr & 7) - k);
199*8f5875f3SDavid du Colombier 	ptr += k;
200*8f5875f3SDavid du Colombier     }
201*8f5875f3SDavid du Colombier     gfc->header[gfc->h_ptr].ptr = ptr;
202*8f5875f3SDavid du Colombier }
203*8f5875f3SDavid du Colombier 
204*8f5875f3SDavid du Colombier 
205*8f5875f3SDavid du Colombier /* (jo) this wrapper function for BF_addEntry() updates also the crc */
206*8f5875f3SDavid du Colombier static void
CRC_writeheader(lame_internal_flags * gfc,int value,int length,int * crc)207*8f5875f3SDavid du Colombier CRC_writeheader(lame_internal_flags *gfc, int value, int length,int *crc)
208*8f5875f3SDavid du Colombier {
209*8f5875f3SDavid du Colombier    int bit = 1 << length;
210*8f5875f3SDavid du Colombier 
211*8f5875f3SDavid du Colombier    assert(length < MAX_LENGTH-2);
212*8f5875f3SDavid du Colombier 
213*8f5875f3SDavid du Colombier    while((bit >>= 1)){
214*8f5875f3SDavid du Colombier       *crc <<= 1;
215*8f5875f3SDavid du Colombier       if (!(*crc & 0x10000) ^ !(value & bit))
216*8f5875f3SDavid du Colombier 	*crc ^= CRC16_POLYNOMIAL;
217*8f5875f3SDavid du Colombier    }
218*8f5875f3SDavid du Colombier    *crc &= 0xffff;
219*8f5875f3SDavid du Colombier    writeheader(gfc,value, length);
220*8f5875f3SDavid du Colombier }
221*8f5875f3SDavid du Colombier 
main_CRC_init(void)222*8f5875f3SDavid du Colombier void main_CRC_init (void) {}
223*8f5875f3SDavid du Colombier 
224*8f5875f3SDavid du Colombier 
225*8f5875f3SDavid du Colombier 
226*8f5875f3SDavid du Colombier inline static void
encodeSideInfo2(lame_global_flags * gfp,int bitsPerFrame)227*8f5875f3SDavid du Colombier encodeSideInfo2(lame_global_flags *gfp,int bitsPerFrame)
228*8f5875f3SDavid du Colombier {
229*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
230*8f5875f3SDavid du Colombier     III_side_info_t *l3_side;
231*8f5875f3SDavid du Colombier     int gr, ch;
232*8f5875f3SDavid du Colombier     int crc;
233*8f5875f3SDavid du Colombier 
234*8f5875f3SDavid du Colombier     l3_side = &gfc->l3_side;
235*8f5875f3SDavid du Colombier     gfc->header[gfc->h_ptr].ptr = 0;
236*8f5875f3SDavid du Colombier     memset(gfc->header[gfc->h_ptr].buf, 0, gfc->sideinfo_len);
237*8f5875f3SDavid du Colombier     crc = 0xffff; /* (jo) init crc16 for error_protection */
238*8f5875f3SDavid du Colombier     if (gfp->out_samplerate < 16000)
239*8f5875f3SDavid du Colombier       writeheader(gfc,0xffe,                12);
240*8f5875f3SDavid du Colombier     else
241*8f5875f3SDavid du Colombier       writeheader(gfc,0xfff,                12);
242*8f5875f3SDavid du Colombier     writeheader(gfc,(gfp->version),            1);
243*8f5875f3SDavid du Colombier     writeheader(gfc,4 - 3,                 2);
244*8f5875f3SDavid du Colombier     writeheader(gfc,(!gfp->error_protection),  1);
245*8f5875f3SDavid du Colombier     /* (jo) from now on call the CRC_writeheader() wrapper to update crc */
246*8f5875f3SDavid du Colombier     CRC_writeheader(gfc,(gfc->bitrate_index),      4,&crc);
247*8f5875f3SDavid du Colombier     CRC_writeheader(gfc,(gfc->samplerate_index),   2,&crc);
248*8f5875f3SDavid du Colombier     CRC_writeheader(gfc,(gfc->padding),            1,&crc);
249*8f5875f3SDavid du Colombier     CRC_writeheader(gfc,(gfp->extension),          1,&crc);
250*8f5875f3SDavid du Colombier     CRC_writeheader(gfc,(gfp->mode),               2,&crc);
251*8f5875f3SDavid du Colombier     CRC_writeheader(gfc,(gfc->mode_ext),           2,&crc);
252*8f5875f3SDavid du Colombier     CRC_writeheader(gfc,(gfp->copyright),          1,&crc);
253*8f5875f3SDavid du Colombier     CRC_writeheader(gfc,(gfp->original),           1,&crc);
254*8f5875f3SDavid du Colombier     CRC_writeheader(gfc,(gfp->emphasis),           2,&crc);
255*8f5875f3SDavid du Colombier     if (gfp->error_protection) {
256*8f5875f3SDavid du Colombier 	writeheader(gfc,0, 16); /* dummy */
257*8f5875f3SDavid du Colombier     }
258*8f5875f3SDavid du Colombier 
259*8f5875f3SDavid du Colombier     if (gfp->version == 1) {
260*8f5875f3SDavid du Colombier 	/* MPEG1 */
261*8f5875f3SDavid du Colombier 	assert(l3_side->main_data_begin >= 0);
262*8f5875f3SDavid du Colombier 	CRC_writeheader(gfc,(l3_side->main_data_begin), 9,&crc);
263*8f5875f3SDavid du Colombier 
264*8f5875f3SDavid du Colombier 	if (gfc->channels_out == 2)
265*8f5875f3SDavid du Colombier 	    CRC_writeheader(gfc,l3_side->private_bits, 3,&crc);
266*8f5875f3SDavid du Colombier 	else
267*8f5875f3SDavid du Colombier 	    CRC_writeheader(gfc,l3_side->private_bits, 5,&crc);
268*8f5875f3SDavid du Colombier 
269*8f5875f3SDavid du Colombier 	for (ch = 0; ch < gfc->channels_out; ch++) {
270*8f5875f3SDavid du Colombier 	    int band;
271*8f5875f3SDavid du Colombier 	    for (band = 0; band < 4; band++) {
272*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,l3_side->scfsi[ch][band], 1,&crc);
273*8f5875f3SDavid du Colombier 	    }
274*8f5875f3SDavid du Colombier 	}
275*8f5875f3SDavid du Colombier 
276*8f5875f3SDavid du Colombier 	for (gr = 0; gr < 2; gr++) {
277*8f5875f3SDavid du Colombier 	    for (ch = 0; ch < gfc->channels_out; ch++) {
278*8f5875f3SDavid du Colombier 		gr_info *gi = &l3_side->gr[gr].ch[ch].tt;
279*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->part2_3_length,       12,&crc);
280*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->big_values / 2,        9,&crc);
281*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->global_gain,           8,&crc);
282*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->scalefac_compress,     4,&crc);
283*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->window_switching_flag, 1,&crc);
284*8f5875f3SDavid du Colombier 
285*8f5875f3SDavid du Colombier 		if (gi->window_switching_flag) {
286*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->block_type,       2,&crc);
287*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->mixed_block_flag, 1,&crc);
288*8f5875f3SDavid du Colombier 
289*8f5875f3SDavid du Colombier 		    if (gi->table_select[0] == 14)
290*8f5875f3SDavid du Colombier 			gi->table_select[0] = 16;
291*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->table_select[0],  5,&crc);
292*8f5875f3SDavid du Colombier 		    if (gi->table_select[1] == 14)
293*8f5875f3SDavid du Colombier 			gi->table_select[1] = 16;
294*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->table_select[1],  5,&crc);
295*8f5875f3SDavid du Colombier 
296*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->subblock_gain[0], 3,&crc);
297*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->subblock_gain[1], 3,&crc);
298*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->subblock_gain[2], 3,&crc);
299*8f5875f3SDavid du Colombier 		} else {
300*8f5875f3SDavid du Colombier 		    assert(gi->block_type == NORM_TYPE);
301*8f5875f3SDavid du Colombier 		    if (gi->table_select[0] == 14)
302*8f5875f3SDavid du Colombier 			gi->table_select[0] = 16;
303*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->table_select[0], 5,&crc);
304*8f5875f3SDavid du Colombier 		    if (gi->table_select[1] == 14)
305*8f5875f3SDavid du Colombier 			gi->table_select[1] = 16;
306*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->table_select[1], 5,&crc);
307*8f5875f3SDavid du Colombier 		    if (gi->table_select[2] == 14)
308*8f5875f3SDavid du Colombier 			gi->table_select[2] = 16;
309*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->table_select[2], 5,&crc);
310*8f5875f3SDavid du Colombier 
311*8f5875f3SDavid du Colombier 		    assert(gi->region0_count < 16U);
312*8f5875f3SDavid du Colombier 		    assert(gi->region1_count < 8U);
313*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->region0_count, 4,&crc);
314*8f5875f3SDavid du Colombier 		    CRC_writeheader(gfc,gi->region1_count, 3,&crc);
315*8f5875f3SDavid du Colombier 		}
316*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->preflag,            1,&crc);
317*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->scalefac_scale,     1,&crc);
318*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->count1table_select, 1,&crc);
319*8f5875f3SDavid du Colombier 	    }
320*8f5875f3SDavid du Colombier 	}
321*8f5875f3SDavid du Colombier     } else {
322*8f5875f3SDavid du Colombier 	/* MPEG2 */
323*8f5875f3SDavid du Colombier 	assert(l3_side->main_data_begin >= 0);
324*8f5875f3SDavid du Colombier 	CRC_writeheader(gfc,(l3_side->main_data_begin), 8,&crc);
325*8f5875f3SDavid du Colombier 	CRC_writeheader(gfc,l3_side->private_bits, gfc->channels_out,&crc);
326*8f5875f3SDavid du Colombier 
327*8f5875f3SDavid du Colombier 	gr = 0;
328*8f5875f3SDavid du Colombier 	for (ch = 0; ch < gfc->channels_out; ch++) {
329*8f5875f3SDavid du Colombier 	    gr_info *gi = &l3_side->gr[gr].ch[ch].tt;
330*8f5875f3SDavid du Colombier 	    CRC_writeheader(gfc,gi->part2_3_length,       12,&crc);
331*8f5875f3SDavid du Colombier 	    CRC_writeheader(gfc,gi->big_values / 2,        9,&crc);
332*8f5875f3SDavid du Colombier 	    CRC_writeheader(gfc,gi->global_gain,           8,&crc);
333*8f5875f3SDavid du Colombier 	    CRC_writeheader(gfc,gi->scalefac_compress,     9,&crc);
334*8f5875f3SDavid du Colombier 	    CRC_writeheader(gfc,gi->window_switching_flag, 1,&crc);
335*8f5875f3SDavid du Colombier 
336*8f5875f3SDavid du Colombier 	    if (gi->window_switching_flag) {
337*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->block_type,       2,&crc);
338*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->mixed_block_flag, 1,&crc);
339*8f5875f3SDavid du Colombier 
340*8f5875f3SDavid du Colombier 		if (gi->table_select[0] == 14)
341*8f5875f3SDavid du Colombier 		    gi->table_select[0] = 16;
342*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->table_select[0],  5,&crc);
343*8f5875f3SDavid du Colombier 		if (gi->table_select[1] == 14)
344*8f5875f3SDavid du Colombier 		    gi->table_select[1] = 16;
345*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->table_select[1],  5,&crc);
346*8f5875f3SDavid du Colombier 
347*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->subblock_gain[0], 3,&crc);
348*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->subblock_gain[1], 3,&crc);
349*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->subblock_gain[2], 3,&crc);
350*8f5875f3SDavid du Colombier 	    } else {
351*8f5875f3SDavid du Colombier 		if (gi->table_select[0] == 14)
352*8f5875f3SDavid du Colombier 		    gi->table_select[0] = 16;
353*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->table_select[0], 5,&crc);
354*8f5875f3SDavid du Colombier 		if (gi->table_select[1] == 14)
355*8f5875f3SDavid du Colombier 		    gi->table_select[1] = 16;
356*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->table_select[1], 5,&crc);
357*8f5875f3SDavid du Colombier 		if (gi->table_select[2] == 14)
358*8f5875f3SDavid du Colombier 		    gi->table_select[2] = 16;
359*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->table_select[2], 5,&crc);
360*8f5875f3SDavid du Colombier 
361*8f5875f3SDavid du Colombier 		assert(gi->region0_count < 16U);
362*8f5875f3SDavid du Colombier 		assert(gi->region1_count < 8U);
363*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->region0_count, 4,&crc);
364*8f5875f3SDavid du Colombier 		CRC_writeheader(gfc,gi->region1_count, 3,&crc);
365*8f5875f3SDavid du Colombier 	    }
366*8f5875f3SDavid du Colombier 
367*8f5875f3SDavid du Colombier 	    CRC_writeheader(gfc,gi->scalefac_scale,     1,&crc);
368*8f5875f3SDavid du Colombier 	    CRC_writeheader(gfc,gi->count1table_select, 1,&crc);
369*8f5875f3SDavid du Colombier 	}
370*8f5875f3SDavid du Colombier     }
371*8f5875f3SDavid du Colombier 
372*8f5875f3SDavid du Colombier     if (gfp->error_protection) {
373*8f5875f3SDavid du Colombier 	/* (jo) error_protection: add crc16 information to header */
374*8f5875f3SDavid du Colombier 	gfc->header[gfc->h_ptr].buf[4] = crc >> 8;
375*8f5875f3SDavid du Colombier 	gfc->header[gfc->h_ptr].buf[5] = crc & 255;
376*8f5875f3SDavid du Colombier     }
377*8f5875f3SDavid du Colombier 
378*8f5875f3SDavid du Colombier     {
379*8f5875f3SDavid du Colombier 	int old = gfc->h_ptr;
380*8f5875f3SDavid du Colombier 	assert(gfc->header[old].ptr == gfc->sideinfo_len * 8);
381*8f5875f3SDavid du Colombier 
382*8f5875f3SDavid du Colombier 	gfc->h_ptr = (old + 1) & (MAX_HEADER_BUF - 1);
383*8f5875f3SDavid du Colombier 	gfc->header[gfc->h_ptr].write_timing =
384*8f5875f3SDavid du Colombier 	    gfc->header[old].write_timing + bitsPerFrame;
385*8f5875f3SDavid du Colombier 
386*8f5875f3SDavid du Colombier 	if (gfc->h_ptr == gfc->w_ptr) {
387*8f5875f3SDavid du Colombier 	  /* yikes! we are out of header buffer space */
388*8f5875f3SDavid du Colombier 	  ERRORF(gfc,"Error: MAX_HEADER_BUF too small in bitstream.c \n");
389*8f5875f3SDavid du Colombier 	}
390*8f5875f3SDavid du Colombier 
391*8f5875f3SDavid du Colombier     }
392*8f5875f3SDavid du Colombier }
393*8f5875f3SDavid du Colombier 
394*8f5875f3SDavid du Colombier 
395*8f5875f3SDavid du Colombier inline static int
huffman_coder_count1(lame_global_flags * gfp,int * ix,gr_info * gi)396*8f5875f3SDavid du Colombier huffman_coder_count1(lame_global_flags *gfp,int *ix, gr_info *gi)
397*8f5875f3SDavid du Colombier {
398*8f5875f3SDavid du Colombier #ifdef DEBUG
399*8f5875f3SDavid du Colombier     lame_internal_flags *gfc = gfp->internal_flags;
400*8f5875f3SDavid du Colombier #endif
401*8f5875f3SDavid du Colombier     /* Write count1 area */
402*8f5875f3SDavid du Colombier     const struct huffcodetab *h = &ht[gi->count1table_select + 32];
403*8f5875f3SDavid du Colombier     int i,bits=0;
404*8f5875f3SDavid du Colombier #ifdef DEBUG
405*8f5875f3SDavid du Colombier     int gegebo = gfc->bs.totbit;
406*8f5875f3SDavid du Colombier #endif
407*8f5875f3SDavid du Colombier 
408*8f5875f3SDavid du Colombier     ix += gi->big_values;
409*8f5875f3SDavid du Colombier     assert(gi->count1table_select < 2);
410*8f5875f3SDavid du Colombier 
411*8f5875f3SDavid du Colombier 
412*8f5875f3SDavid du Colombier     for (i = (gi->count1 - gi->big_values) / 4; i > 0; --i) {
413*8f5875f3SDavid du Colombier 	int huffbits = 0;
414*8f5875f3SDavid du Colombier 	int p = 0, v;
415*8f5875f3SDavid du Colombier 
416*8f5875f3SDavid du Colombier 	v = ix[0];
417*8f5875f3SDavid du Colombier 	if (v) {
418*8f5875f3SDavid du Colombier 	    p += 8;
419*8f5875f3SDavid du Colombier 	    if (v < 0)
420*8f5875f3SDavid du Colombier 		huffbits++;
421*8f5875f3SDavid du Colombier 	    assert(-1 <= v && v <= 1);
422*8f5875f3SDavid du Colombier 	}
423*8f5875f3SDavid du Colombier 
424*8f5875f3SDavid du Colombier 	v = ix[1];
425*8f5875f3SDavid du Colombier 	if (v) {
426*8f5875f3SDavid du Colombier 	    p += 4;
427*8f5875f3SDavid du Colombier 	    huffbits *= 2;
428*8f5875f3SDavid du Colombier 	    if (v < 0)
429*8f5875f3SDavid du Colombier 		huffbits++;
430*8f5875f3SDavid du Colombier 	    assert(-1 <= v && v <= 1);
431*8f5875f3SDavid du Colombier 	}
432*8f5875f3SDavid du Colombier 
433*8f5875f3SDavid du Colombier 	v = ix[2];
434*8f5875f3SDavid du Colombier 	if (v) {
435*8f5875f3SDavid du Colombier 	    p += 2;
436*8f5875f3SDavid du Colombier 	    huffbits *= 2;
437*8f5875f3SDavid du Colombier 	    if (v < 0)
438*8f5875f3SDavid du Colombier 		huffbits++;
439*8f5875f3SDavid du Colombier 	    assert(-1 <= v && v <= 1);
440*8f5875f3SDavid du Colombier 	}
441*8f5875f3SDavid du Colombier 
442*8f5875f3SDavid du Colombier 	v = ix[3];
443*8f5875f3SDavid du Colombier 	if (v) {
444*8f5875f3SDavid du Colombier 	    p++;
445*8f5875f3SDavid du Colombier 	    huffbits *= 2;
446*8f5875f3SDavid du Colombier 	    if (v < 0)
447*8f5875f3SDavid du Colombier 		huffbits++;
448*8f5875f3SDavid du Colombier 	    assert(-1 <= v && v <= 1);
449*8f5875f3SDavid du Colombier 	}
450*8f5875f3SDavid du Colombier 
451*8f5875f3SDavid du Colombier 	ix += 4;
452*8f5875f3SDavid du Colombier 	putbits2(gfp,huffbits + h->table[p], h->hlen[p]);
453*8f5875f3SDavid du Colombier 	bits += h->hlen[p];
454*8f5875f3SDavid du Colombier     }
455*8f5875f3SDavid du Colombier #ifdef DEBUG
456*8f5875f3SDavid du Colombier     DEBUGF("%ld %d %d %d\n",gfc->bs.totbit -gegebo, gi->count1bits, gi->big_values, gi->count1);
457*8f5875f3SDavid du Colombier #endif
458*8f5875f3SDavid du Colombier     return bits;
459*8f5875f3SDavid du Colombier }
460*8f5875f3SDavid du Colombier 
461*8f5875f3SDavid du Colombier /*
462*8f5875f3SDavid du Colombier  * Implements the pseudocode of page 98 of the IS
463*8f5875f3SDavid du Colombier  */
464*8f5875f3SDavid du Colombier static int
HuffmanCode(lame_global_flags * const gfp,int table_select,int x1,int x2)465*8f5875f3SDavid du Colombier HuffmanCode(lame_global_flags* const gfp, int table_select, int x1, int x2)
466*8f5875f3SDavid du Colombier {
467*8f5875f3SDavid du Colombier     struct huffcodetab* h = ht + table_select;
468*8f5875f3SDavid du Colombier     int  code    = 0;
469*8f5875f3SDavid du Colombier     int  cbits   = 0;
470*8f5875f3SDavid du Colombier     int  xbits   = 0;
471*8f5875f3SDavid du Colombier     int  sgn_x1  = 0;
472*8f5875f3SDavid du Colombier     int  sgn_x2  = 0;
473*8f5875f3SDavid du Colombier     int  linbits = h->xlen;
474*8f5875f3SDavid du Colombier     int  xlen    = h->xlen;
475*8f5875f3SDavid du Colombier     int  ext;
476*8f5875f3SDavid du Colombier 
477*8f5875f3SDavid du Colombier //	assert ( table_select > 0 );
478*8f5875f3SDavid du Colombier 
479*8f5875f3SDavid du Colombier     if (x1 < 0) {
480*8f5875f3SDavid du Colombier 	sgn_x1++;
481*8f5875f3SDavid du Colombier 	x1 = -x1;
482*8f5875f3SDavid du Colombier     }
483*8f5875f3SDavid du Colombier 
484*8f5875f3SDavid du Colombier     if (x2 < 0) {
485*8f5875f3SDavid du Colombier 	sgn_x2++;
486*8f5875f3SDavid du Colombier 	x2 = -x2;
487*8f5875f3SDavid du Colombier     }
488*8f5875f3SDavid du Colombier 
489*8f5875f3SDavid du Colombier     ext     = sgn_x1;
490*8f5875f3SDavid du Colombier 
491*8f5875f3SDavid du Colombier     if (table_select > 15) {
492*8f5875f3SDavid du Colombier 	/* use ESC-words */
493*8f5875f3SDavid du Colombier 	if (x1 > 14) {
494*8f5875f3SDavid du Colombier 	    int linbits_x1 = x1 - 15;
495*8f5875f3SDavid du Colombier 
496*8f5875f3SDavid du Colombier //	    assert ( linbits_x1 <= h->linmax );
497*8f5875f3SDavid du Colombier 	    ext   |= linbits_x1 << 1;
498*8f5875f3SDavid du Colombier 	    xbits  = linbits;
499*8f5875f3SDavid du Colombier 	    x1     = 15;
500*8f5875f3SDavid du Colombier 	}
501*8f5875f3SDavid du Colombier 
502*8f5875f3SDavid du Colombier 	if (x2 > 14) {
503*8f5875f3SDavid du Colombier 	    int linbits_x2 = x2 - 15;
504*8f5875f3SDavid du Colombier 
505*8f5875f3SDavid du Colombier //	    assert ( linbits_x2 <= h->linmax );
506*8f5875f3SDavid du Colombier 	    ext  <<= linbits;
507*8f5875f3SDavid du Colombier 	    ext   |= linbits_x2;
508*8f5875f3SDavid du Colombier 	    xbits += linbits;
509*8f5875f3SDavid du Colombier 	    x2     = 15;
510*8f5875f3SDavid du Colombier 	}
511*8f5875f3SDavid du Colombier 	xlen = 16;
512*8f5875f3SDavid du Colombier     }
513*8f5875f3SDavid du Colombier 
514*8f5875f3SDavid du Colombier     if (x1 != 0) {
515*8f5875f3SDavid du Colombier 	cbits--;
516*8f5875f3SDavid du Colombier     }
517*8f5875f3SDavid du Colombier 
518*8f5875f3SDavid du Colombier     if (x2 != 0) {
519*8f5875f3SDavid du Colombier 	ext <<= 1;
520*8f5875f3SDavid du Colombier 	ext  |= sgn_x2;
521*8f5875f3SDavid du Colombier 	cbits--;
522*8f5875f3SDavid du Colombier     }
523*8f5875f3SDavid du Colombier 
524*8f5875f3SDavid du Colombier     xbits -= cbits;
525*8f5875f3SDavid du Colombier 
526*8f5875f3SDavid du Colombier //	assert ( (x1|x2) < 16u );
527*8f5875f3SDavid du Colombier 
528*8f5875f3SDavid du Colombier     x1 = x1 * xlen + x2;
529*8f5875f3SDavid du Colombier 
530*8f5875f3SDavid du Colombier     code   = h->table [x1];
531*8f5875f3SDavid du Colombier     cbits += h->hlen  [x1];
532*8f5875f3SDavid du Colombier 
533*8f5875f3SDavid du Colombier //	assert ( cbits <= MAX_LENGTH );
534*8f5875f3SDavid du Colombier //	assert ( xbits <= MAX_LENGTH );
535*8f5875f3SDavid du Colombier 
536*8f5875f3SDavid du Colombier     putbits2 ( gfp, code, cbits );
537*8f5875f3SDavid du Colombier     putbits2 ( gfp, ext,  xbits );
538*8f5875f3SDavid du Colombier 
539*8f5875f3SDavid du Colombier     return cbits + xbits;
540*8f5875f3SDavid du Colombier }
541*8f5875f3SDavid du Colombier 
542*8f5875f3SDavid du Colombier static int
Huffmancodebits(lame_global_flags * gfp,int tableindex,int start,int end,int * ix)543*8f5875f3SDavid du Colombier Huffmancodebits(lame_global_flags *gfp, int tableindex, int start, int end, int *ix)
544*8f5875f3SDavid du Colombier {
545*8f5875f3SDavid du Colombier     int i,bits;
546*8f5875f3SDavid du Colombier 
547*8f5875f3SDavid du Colombier //	assert(tableindex < 32);
548*8f5875f3SDavid du Colombier     if (!tableindex) return 0;
549*8f5875f3SDavid du Colombier 
550*8f5875f3SDavid du Colombier     bits=0;
551*8f5875f3SDavid du Colombier     for (i = start; i < end; i += 2) {
552*8f5875f3SDavid du Colombier       bits += HuffmanCode(gfp,tableindex, ix[i], ix[i + 1]);
553*8f5875f3SDavid du Colombier     }
554*8f5875f3SDavid du Colombier     return bits;
555*8f5875f3SDavid du Colombier }
556*8f5875f3SDavid du Colombier 
557*8f5875f3SDavid du Colombier 
558*8f5875f3SDavid du Colombier 
559*8f5875f3SDavid du Colombier /*
560*8f5875f3SDavid du Colombier   Note the discussion of huffmancodebits() on pages 28
561*8f5875f3SDavid du Colombier   and 29 of the IS, as well as the definitions of the side
562*8f5875f3SDavid du Colombier   information on pages 26 and 27.
563*8f5875f3SDavid du Colombier   */
564*8f5875f3SDavid du Colombier static int
ShortHuffmancodebits(lame_global_flags * gfp,int * ix,gr_info * gi)565*8f5875f3SDavid du Colombier ShortHuffmancodebits(lame_global_flags *gfp,int *ix, gr_info *gi)
566*8f5875f3SDavid du Colombier {
567*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
568*8f5875f3SDavid du Colombier     int bits;
569*8f5875f3SDavid du Colombier     int region1Start;
570*8f5875f3SDavid du Colombier 
571*8f5875f3SDavid du Colombier     region1Start = 3*gfc->scalefac_band.s[3];
572*8f5875f3SDavid du Colombier     if (region1Start > gi->big_values)
573*8f5875f3SDavid du Colombier         region1Start = gi->big_values;
574*8f5875f3SDavid du Colombier 
575*8f5875f3SDavid du Colombier     /* short blocks do not have a region2 */
576*8f5875f3SDavid du Colombier     bits  = Huffmancodebits(gfp,gi->table_select[0], 0, region1Start, ix);
577*8f5875f3SDavid du Colombier     bits += Huffmancodebits(gfp,gi->table_select[1], region1Start, gi->big_values, ix);
578*8f5875f3SDavid du Colombier     return bits;
579*8f5875f3SDavid du Colombier }
580*8f5875f3SDavid du Colombier 
581*8f5875f3SDavid du Colombier static int
LongHuffmancodebits(lame_global_flags * gfp,int * ix,gr_info * gi)582*8f5875f3SDavid du Colombier LongHuffmancodebits(lame_global_flags *gfp,int *ix, gr_info *gi)
583*8f5875f3SDavid du Colombier {
584*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
585*8f5875f3SDavid du Colombier     int i, bigvalues,bits=0;
586*8f5875f3SDavid du Colombier     int region1Start, region2Start;
587*8f5875f3SDavid du Colombier 
588*8f5875f3SDavid du Colombier     bigvalues = gi->big_values;
589*8f5875f3SDavid du Colombier     assert(0 <= bigvalues && bigvalues <= 576);
590*8f5875f3SDavid du Colombier 
591*8f5875f3SDavid du Colombier     i = gi->region0_count + 1;
592*8f5875f3SDavid du Colombier     assert(i < 23);
593*8f5875f3SDavid du Colombier     region1Start = gfc->scalefac_band.l[i];
594*8f5875f3SDavid du Colombier     i += gi->region1_count + 1;
595*8f5875f3SDavid du Colombier     assert(i < 23);
596*8f5875f3SDavid du Colombier     region2Start = gfc->scalefac_band.l[i];
597*8f5875f3SDavid du Colombier 
598*8f5875f3SDavid du Colombier     if (region1Start > bigvalues)
599*8f5875f3SDavid du Colombier 	region1Start = bigvalues;
600*8f5875f3SDavid du Colombier 
601*8f5875f3SDavid du Colombier     if (region2Start > bigvalues)
602*8f5875f3SDavid du Colombier 	region2Start = bigvalues;
603*8f5875f3SDavid du Colombier 
604*8f5875f3SDavid du Colombier     bits +=Huffmancodebits(gfp,gi->table_select[0], 0, region1Start, ix);
605*8f5875f3SDavid du Colombier     bits +=Huffmancodebits(gfp,gi->table_select[1], region1Start, region2Start, ix);
606*8f5875f3SDavid du Colombier     bits +=Huffmancodebits(gfp,gi->table_select[2], region2Start, bigvalues, ix);
607*8f5875f3SDavid du Colombier     return bits;
608*8f5875f3SDavid du Colombier }
609*8f5875f3SDavid du Colombier 
610*8f5875f3SDavid du Colombier inline static int
writeMainData(lame_global_flags * const gfp,int l3_enc[2][2][576],III_scalefac_t scalefac[2][2])611*8f5875f3SDavid du Colombier writeMainData ( lame_global_flags * const gfp,
612*8f5875f3SDavid du Colombier         int              l3_enc   [2] [2] [576],
613*8f5875f3SDavid du Colombier         III_scalefac_t   scalefac [2] [2] )
614*8f5875f3SDavid du Colombier {
615*8f5875f3SDavid du Colombier     int gr, ch, sfb,data_bits,scale_bits,tot_bits=0;
616*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
617*8f5875f3SDavid du Colombier     III_side_info_t *l3_side;
618*8f5875f3SDavid du Colombier 
619*8f5875f3SDavid du Colombier     l3_side = &gfc->l3_side;
620*8f5875f3SDavid du Colombier     if (gfp->version == 1) {
621*8f5875f3SDavid du Colombier 	/* MPEG 1 */
622*8f5875f3SDavid du Colombier 	for (gr = 0; gr < 2; gr++) {
623*8f5875f3SDavid du Colombier 	    for (ch = 0; ch < gfc->channels_out; ch++) {
624*8f5875f3SDavid du Colombier 		gr_info *gi = &l3_side->gr[gr].ch[ch].tt;
625*8f5875f3SDavid du Colombier 		int slen1 = slen1_tab[gi->scalefac_compress];
626*8f5875f3SDavid du Colombier 		int slen2 = slen2_tab[gi->scalefac_compress];
627*8f5875f3SDavid du Colombier 		data_bits=0;
628*8f5875f3SDavid du Colombier 		scale_bits=0;
629*8f5875f3SDavid du Colombier 
630*8f5875f3SDavid du Colombier #ifdef DEBUG
631*8f5875f3SDavid du Colombier 		hogege = gfc->bs.totbit;
632*8f5875f3SDavid du Colombier #endif
633*8f5875f3SDavid du Colombier 		if (gi->block_type == SHORT_TYPE) {
634*8f5875f3SDavid du Colombier 		    for (sfb = 0; sfb < SBPSY_s; sfb++) {
635*8f5875f3SDavid du Colombier 			int slen = sfb < 6 ? slen1 : slen2;
636*8f5875f3SDavid du Colombier 
637*8f5875f3SDavid du Colombier 			assert(scalefac[gr][ch].s[sfb][0]>=0);
638*8f5875f3SDavid du Colombier 			assert(scalefac[gr][ch].s[sfb][1]>=0);
639*8f5875f3SDavid du Colombier 			assert(scalefac[gr][ch].s[sfb][2]>=0);
640*8f5875f3SDavid du Colombier 
641*8f5875f3SDavid du Colombier 			putbits2(gfp,scalefac[gr][ch].s[sfb][0], slen);
642*8f5875f3SDavid du Colombier 			putbits2(gfp,scalefac[gr][ch].s[sfb][1], slen);
643*8f5875f3SDavid du Colombier 			putbits2(gfp,scalefac[gr][ch].s[sfb][2], slen);
644*8f5875f3SDavid du Colombier 			scale_bits += 3*slen;
645*8f5875f3SDavid du Colombier 		    }
646*8f5875f3SDavid du Colombier 		    data_bits += ShortHuffmancodebits(gfp,l3_enc[gr][ch], gi);
647*8f5875f3SDavid du Colombier 		} else {
648*8f5875f3SDavid du Colombier 		    int i;
649*8f5875f3SDavid du Colombier 		    for (i = 0; i < sizeof(scfsi_band) / sizeof(int) - 1;
650*8f5875f3SDavid du Colombier 			 i++) {
651*8f5875f3SDavid du Colombier 			if (gr != 0 && l3_side->scfsi[ch][i])
652*8f5875f3SDavid du Colombier 			    continue;
653*8f5875f3SDavid du Colombier 
654*8f5875f3SDavid du Colombier 			for (sfb = scfsi_band[i]; sfb < scfsi_band[i + 1];
655*8f5875f3SDavid du Colombier 			     sfb++) {
656*8f5875f3SDavid du Colombier 
657*8f5875f3SDavid du Colombier 			    assert(scalefac[gr][ch].l[sfb]>=0);
658*8f5875f3SDavid du Colombier 			    putbits2(gfp,scalefac[gr][ch].l[sfb],
659*8f5875f3SDavid du Colombier 				    sfb < 11 ? slen1 : slen2);
660*8f5875f3SDavid du Colombier 			    scale_bits += sfb < 11 ? slen1 : slen2;
661*8f5875f3SDavid du Colombier 			}
662*8f5875f3SDavid du Colombier 		    }
663*8f5875f3SDavid du Colombier 		    data_bits +=LongHuffmancodebits(gfp,l3_enc[gr][ch], gi);
664*8f5875f3SDavid du Colombier 		}
665*8f5875f3SDavid du Colombier 		data_bits +=huffman_coder_count1(gfp,l3_enc[gr][ch], gi);
666*8f5875f3SDavid du Colombier #ifdef DEBUG
667*8f5875f3SDavid du Colombier 		DEBUGF("<%ld> ", gfc->bs.totbit-hogege);
668*8f5875f3SDavid du Colombier #endif
669*8f5875f3SDavid du Colombier 		/* does bitcount in quantize.c agree with actual bit count?*/
670*8f5875f3SDavid du Colombier 		assert(data_bits==gi->part2_3_length-gi->part2_length);
671*8f5875f3SDavid du Colombier 		assert(scale_bits==gi->part2_length);
672*8f5875f3SDavid du Colombier 		tot_bits += scale_bits + data_bits;
673*8f5875f3SDavid du Colombier 
674*8f5875f3SDavid du Colombier 	    } /* for ch */
675*8f5875f3SDavid du Colombier 	} /* for gr */
676*8f5875f3SDavid du Colombier     } else {
677*8f5875f3SDavid du Colombier 	/* MPEG 2 */
678*8f5875f3SDavid du Colombier 	gr = 0;
679*8f5875f3SDavid du Colombier 	for (ch = 0; ch < gfc->channels_out; ch++) {
680*8f5875f3SDavid du Colombier 	    gr_info *gi = &l3_side->gr[gr].ch[ch].tt;
681*8f5875f3SDavid du Colombier 	    int i, sfb_partition;
682*8f5875f3SDavid du Colombier 	    assert(gi->sfb_partition_table);
683*8f5875f3SDavid du Colombier 	    data_bits = 0;
684*8f5875f3SDavid du Colombier 	    scale_bits=0;
685*8f5875f3SDavid du Colombier 
686*8f5875f3SDavid du Colombier 	    sfb = 0;
687*8f5875f3SDavid du Colombier 	    sfb_partition = 0;
688*8f5875f3SDavid du Colombier 	    if (gi->block_type == SHORT_TYPE) {
689*8f5875f3SDavid du Colombier 		for (; sfb_partition < 4; sfb_partition++) {
690*8f5875f3SDavid du Colombier 		    int sfbs = gi->sfb_partition_table[sfb_partition] / 3;
691*8f5875f3SDavid du Colombier 		    int slen = gi->slen[sfb_partition];
692*8f5875f3SDavid du Colombier 		    for (i = 0; i < sfbs; i++, sfb++) {
693*8f5875f3SDavid du Colombier 			putbits2(gfp,Max(scalefac[gr][ch].s[sfb][0], 0U), slen);
694*8f5875f3SDavid du Colombier 			putbits2(gfp,Max(scalefac[gr][ch].s[sfb][1], 0U), slen);
695*8f5875f3SDavid du Colombier 			putbits2(gfp,Max(scalefac[gr][ch].s[sfb][2], 0U), slen);
696*8f5875f3SDavid du Colombier 			scale_bits += 3*slen;
697*8f5875f3SDavid du Colombier 		    }
698*8f5875f3SDavid du Colombier 		}
699*8f5875f3SDavid du Colombier 		data_bits += ShortHuffmancodebits(gfp,l3_enc[gr][ch], gi);
700*8f5875f3SDavid du Colombier 	    } else {
701*8f5875f3SDavid du Colombier 		for (; sfb_partition < 4; sfb_partition++) {
702*8f5875f3SDavid du Colombier 		    int sfbs = gi->sfb_partition_table[sfb_partition];
703*8f5875f3SDavid du Colombier 		    int slen = gi->slen[sfb_partition];
704*8f5875f3SDavid du Colombier 		    for (i = 0; i < sfbs; i++, sfb++) {
705*8f5875f3SDavid du Colombier 			putbits2(gfp,Max(scalefac[gr][ch].l[sfb], 0U), slen);
706*8f5875f3SDavid du Colombier 			scale_bits += slen;
707*8f5875f3SDavid du Colombier 		    }
708*8f5875f3SDavid du Colombier 		}
709*8f5875f3SDavid du Colombier 		data_bits +=LongHuffmancodebits(gfp,l3_enc[gr][ch], gi);
710*8f5875f3SDavid du Colombier 	    }
711*8f5875f3SDavid du Colombier 	    data_bits +=huffman_coder_count1(gfp,l3_enc[gr][ch], gi);
712*8f5875f3SDavid du Colombier 
713*8f5875f3SDavid du Colombier 	    /* does bitcount in quantize.c agree with actual bit count?*/
714*8f5875f3SDavid du Colombier 	    assert(data_bits==gi->part2_3_length-gi->part2_length);
715*8f5875f3SDavid du Colombier 	    assert(scale_bits==gi->part2_length);
716*8f5875f3SDavid du Colombier 	    tot_bits += scale_bits + data_bits;
717*8f5875f3SDavid du Colombier 	} /* for ch */
718*8f5875f3SDavid du Colombier     } /* for gf */
719*8f5875f3SDavid du Colombier     return tot_bits;
720*8f5875f3SDavid du Colombier } /* main_data */
721*8f5875f3SDavid du Colombier 
722*8f5875f3SDavid du Colombier 
723*8f5875f3SDavid du Colombier 
724*8f5875f3SDavid du Colombier 
725*8f5875f3SDavid du Colombier void
flush_bitstream(lame_global_flags * gfp)726*8f5875f3SDavid du Colombier flush_bitstream(lame_global_flags *gfp)
727*8f5875f3SDavid du Colombier {
728*8f5875f3SDavid du Colombier   lame_internal_flags *gfc=gfp->internal_flags;
729*8f5875f3SDavid du Colombier   int flushbits,remaining_headers;
730*8f5875f3SDavid du Colombier   int bitsPerFrame, mean_bits;
731*8f5875f3SDavid du Colombier   int last_ptr,first_ptr;
732*8f5875f3SDavid du Colombier   first_ptr=gfc->w_ptr;           /* first header to add to bitstream */
733*8f5875f3SDavid du Colombier   last_ptr = gfc->h_ptr - 1;   /* last header to add to bitstream */
734*8f5875f3SDavid du Colombier   if (last_ptr==-1) last_ptr=MAX_HEADER_BUF-1;
735*8f5875f3SDavid du Colombier 
736*8f5875f3SDavid du Colombier   /* add this many bits to bitstream so we can flush all headers */
737*8f5875f3SDavid du Colombier   flushbits = gfc->header[last_ptr].write_timing - gfc->bs.totbit;
738*8f5875f3SDavid du Colombier 
739*8f5875f3SDavid du Colombier   if (flushbits >= 0) {
740*8f5875f3SDavid du Colombier     /* if flushbits >= 0, some headers have not yet been written */
741*8f5875f3SDavid du Colombier     /* reduce flushbits by the size of the headers */
742*8f5875f3SDavid du Colombier     remaining_headers= 1+last_ptr - first_ptr;
743*8f5875f3SDavid du Colombier     if (last_ptr < first_ptr)
744*8f5875f3SDavid du Colombier       remaining_headers= 1+last_ptr - first_ptr + MAX_HEADER_BUF;
745*8f5875f3SDavid du Colombier     flushbits -= remaining_headers*8*gfc->sideinfo_len;
746*8f5875f3SDavid du Colombier   }
747*8f5875f3SDavid du Colombier 
748*8f5875f3SDavid du Colombier 
749*8f5875f3SDavid du Colombier   /* finally, add some bits so that the last frame is complete
750*8f5875f3SDavid du Colombier    * these bits are not necessary to decode the last frame, but
751*8f5875f3SDavid du Colombier    * some decoders will ignore last frame if these bits are missing
752*8f5875f3SDavid du Colombier    */
753*8f5875f3SDavid du Colombier   getframebits(gfp,&bitsPerFrame,&mean_bits);
754*8f5875f3SDavid du Colombier   flushbits += bitsPerFrame;
755*8f5875f3SDavid du Colombier   if (flushbits<0) {
756*8f5875f3SDavid du Colombier #if 0
757*8f5875f3SDavid du Colombier     /* if flushbits < 0, this would mean that the buffer looks like:
758*8f5875f3SDavid du Colombier      * (data...)  last_header  (data...)  (extra data that should not be here...)
759*8f5875f3SDavid du Colombier      */
760*8f5875f3SDavid du Colombier     DEBUGF("last header write_timing = %i \n",gfc->header[last_ptr].write_timing);
761*8f5875f3SDavid du Colombier     DEBUGF("first header write_timing = %i \n",gfc->header[first_ptr].write_timing);
762*8f5875f3SDavid du Colombier     DEBUGF("bs.totbit:                 %i \n",gfc->bs.totbit);
763*8f5875f3SDavid du Colombier     DEBUGF("first_ptr, last_ptr        %i %i \n",first_ptr,last_ptr);
764*8f5875f3SDavid du Colombier     DEBUGF("remaining_headers =        %i \n",remaining_headers);
765*8f5875f3SDavid du Colombier     DEBUGF("bitsperframe:              %i \n",bitsPerFrame);
766*8f5875f3SDavid du Colombier     DEBUGF("sidelen:                   %i \n",gfc->sideinfo_len);
767*8f5875f3SDavid du Colombier #endif
768*8f5875f3SDavid du Colombier     ERRORF(gfc,"strange error flushing buffer ... \n");
769*8f5875f3SDavid du Colombier   } else {
770*8f5875f3SDavid du Colombier     drain_into_ancillary(gfp,flushbits);
771*8f5875f3SDavid du Colombier   }
772*8f5875f3SDavid du Colombier 
773*8f5875f3SDavid du Colombier   assert (gfc->header[last_ptr].write_timing + bitsPerFrame  == gfc->bs.totbit);
774*8f5875f3SDavid du Colombier }
775*8f5875f3SDavid du Colombier 
776*8f5875f3SDavid du Colombier 
777*8f5875f3SDavid du Colombier 
778*8f5875f3SDavid du Colombier 
add_dummy_byte(lame_global_flags * const gfp,unsigned char val)779*8f5875f3SDavid du Colombier void  add_dummy_byte ( lame_global_flags* const gfp, unsigned char val )
780*8f5875f3SDavid du Colombier {
781*8f5875f3SDavid du Colombier   lame_internal_flags *gfc = gfp->internal_flags;
782*8f5875f3SDavid du Colombier   int i;
783*8f5875f3SDavid du Colombier 
784*8f5875f3SDavid du Colombier   putbits_noheaders(gfp,val,8);
785*8f5875f3SDavid du Colombier 
786*8f5875f3SDavid du Colombier   for (i=0 ; i< MAX_HEADER_BUF ; ++i)
787*8f5875f3SDavid du Colombier     gfc->header[i].write_timing += 8;
788*8f5875f3SDavid du Colombier }
789*8f5875f3SDavid du Colombier 
790*8f5875f3SDavid du Colombier 
791*8f5875f3SDavid du Colombier /*
792*8f5875f3SDavid du Colombier   format_bitstream()
793*8f5875f3SDavid du Colombier 
794*8f5875f3SDavid du Colombier   This is called after a frame of audio has been quantized and coded.
795*8f5875f3SDavid du Colombier   It will write the encoded audio to the bitstream. Note that
796*8f5875f3SDavid du Colombier   from a layer3 encoder's perspective the bit stream is primarily
797*8f5875f3SDavid du Colombier   a series of main_data() blocks, with header and side information
798*8f5875f3SDavid du Colombier   inserted at the proper locations to maintain framing. (See Figure A.7
799*8f5875f3SDavid du Colombier   in the IS).
800*8f5875f3SDavid du Colombier   */
801*8f5875f3SDavid du Colombier int
format_bitstream(lame_global_flags * gfp,int bitsPerFrame,int l3_enc[2][2][576],III_scalefac_t scalefac[2][2])802*8f5875f3SDavid du Colombier format_bitstream(lame_global_flags *gfp, int bitsPerFrame,
803*8f5875f3SDavid du Colombier       int              l3_enc[2][2][576],
804*8f5875f3SDavid du Colombier   	III_scalefac_t   scalefac[2][2] )
805*8f5875f3SDavid du Colombier {
806*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
807*8f5875f3SDavid du Colombier     int bits;
808*8f5875f3SDavid du Colombier     III_side_info_t *l3_side;
809*8f5875f3SDavid du Colombier     l3_side = &gfc->l3_side;
810*8f5875f3SDavid du Colombier 
811*8f5875f3SDavid du Colombier     drain_into_ancillary(gfp,l3_side->resvDrain_pre);
812*8f5875f3SDavid du Colombier 
813*8f5875f3SDavid du Colombier     encodeSideInfo2(gfp,bitsPerFrame);
814*8f5875f3SDavid du Colombier     bits = 8*gfc->sideinfo_len;
815*8f5875f3SDavid du Colombier     bits+=writeMainData(gfp,l3_enc,scalefac);
816*8f5875f3SDavid du Colombier     drain_into_ancillary(gfp,l3_side->resvDrain_post);
817*8f5875f3SDavid du Colombier     bits += l3_side->resvDrain_post;
818*8f5875f3SDavid du Colombier 
819*8f5875f3SDavid du Colombier     l3_side->main_data_begin += (bitsPerFrame-bits)/8;
820*8f5875f3SDavid du Colombier     if ((l3_side->main_data_begin * 8) != gfc->ResvSize ) {
821*8f5875f3SDavid du Colombier       ERRORF(gfc,"bit reservoir error: \n"
822*8f5875f3SDavid du Colombier              "l3_side->main_data_begin: %i \n"
823*8f5875f3SDavid du Colombier              "Resvoir size:             %i \n"
824*8f5875f3SDavid du Colombier              "resv drain (post)         %i \n"
825*8f5875f3SDavid du Colombier              "resv drain (pre)          %i \n"
826*8f5875f3SDavid du Colombier              "header and sideinfo:      %i \n"
827*8f5875f3SDavid du Colombier              "data bits:                %i \n"
828*8f5875f3SDavid du Colombier              "total bits:               %i (remainder: %i) \n"
829*8f5875f3SDavid du Colombier              "bitsperframe:             %i \n",
830*8f5875f3SDavid du Colombier 
831*8f5875f3SDavid du Colombier              8*l3_side->main_data_begin,
832*8f5875f3SDavid du Colombier              gfc->ResvSize,
833*8f5875f3SDavid du Colombier              l3_side->resvDrain_post,
834*8f5875f3SDavid du Colombier              l3_side->resvDrain_pre,
835*8f5875f3SDavid du Colombier              8*gfc->sideinfo_len,
836*8f5875f3SDavid du Colombier              bits-l3_side->resvDrain_post-8*gfc->sideinfo_len,
837*8f5875f3SDavid du Colombier              bits, bits % 8,
838*8f5875f3SDavid du Colombier              bitsPerFrame
839*8f5875f3SDavid du Colombier       );
840*8f5875f3SDavid du Colombier 
841*8f5875f3SDavid du Colombier       gfc->ResvSize = l3_side->main_data_begin*8;
842*8f5875f3SDavid du Colombier     };
843*8f5875f3SDavid du Colombier     assert(gfc->bs.totbit % 8 == 0);
844*8f5875f3SDavid du Colombier 
845*8f5875f3SDavid du Colombier     if (gfc->bs.totbit > 1000000000  ) {
846*8f5875f3SDavid du Colombier       /* to avoid totbit overflow, (at 8h encoding at 128kbs) lets reset bit counter*/
847*8f5875f3SDavid du Colombier       int i;
848*8f5875f3SDavid du Colombier       for (i=0 ; i< MAX_HEADER_BUF ; ++i)
849*8f5875f3SDavid du Colombier 	gfc->header[i].write_timing -= gfc->bs.totbit;
850*8f5875f3SDavid du Colombier       gfc->bs.totbit=0;
851*8f5875f3SDavid du Colombier     }
852*8f5875f3SDavid du Colombier     return 0;
853*8f5875f3SDavid du Colombier }
854*8f5875f3SDavid du Colombier 
855*8f5875f3SDavid du Colombier 
copy_buffer(unsigned char * buffer,int size,Bit_stream_struc * bs)856*8f5875f3SDavid du Colombier int copy_buffer(unsigned char *buffer,int size,Bit_stream_struc *bs)
857*8f5875f3SDavid du Colombier {
858*8f5875f3SDavid du Colombier   int minimum = bs->buf_byte_idx + 1;
859*8f5875f3SDavid du Colombier   if (minimum <= 0) return 0;
860*8f5875f3SDavid du Colombier   if (size!=0 && minimum>size) return -1; /* buffer is too small */
861*8f5875f3SDavid du Colombier   memcpy(buffer,bs->buf,minimum);
862*8f5875f3SDavid du Colombier   bs->buf_byte_idx = -1;
863*8f5875f3SDavid du Colombier   bs->buf_bit_idx = 0;
864*8f5875f3SDavid du Colombier   return minimum;
865*8f5875f3SDavid du Colombier }
866*8f5875f3SDavid du Colombier 
867*8f5875f3SDavid du Colombier 
init_bit_stream_w(lame_internal_flags * gfc)868*8f5875f3SDavid du Colombier void init_bit_stream_w(lame_internal_flags *gfc)
869*8f5875f3SDavid du Colombier {
870*8f5875f3SDavid du Colombier    gfc->bs.buf = (unsigned char *)       malloc(BUFFER_SIZE);
871*8f5875f3SDavid du Colombier    gfc->bs.buf_size = BUFFER_SIZE;
872*8f5875f3SDavid du Colombier 
873*8f5875f3SDavid du Colombier    gfc->h_ptr = gfc->w_ptr = 0;
874*8f5875f3SDavid du Colombier    gfc->header[gfc->h_ptr].write_timing = 0;
875*8f5875f3SDavid du Colombier    gfc->bs.buf_byte_idx = -1;
876*8f5875f3SDavid du Colombier    gfc->bs.buf_bit_idx = 0;
877*8f5875f3SDavid du Colombier    gfc->bs.totbit = 0;
878*8f5875f3SDavid du Colombier }
879*8f5875f3SDavid du Colombier 
880*8f5875f3SDavid du Colombier /* end of bitstream.c */
881