xref: /third_party/libsnd/src/ALAC/alac_decoder.c (revision b815c7f3)
1/*
2 * Copyright (c) 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2012-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
4 *
5 * @APPLE_APACHE_LICENSE_HEADER_START@
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License") ;
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *	 http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * @APPLE_APACHE_LICENSE_HEADER_END@
20 */
21
22/*
23	File:		ALACDecoder.cpp
24*/
25
26#include <stdio.h>
27#include <stdlib.h>
28#include <stddef.h>
29#include <string.h>
30
31#include "alac_codec.h"
32
33#include "dplib.h"
34#include "aglib.h"
35#include "matrixlib.h"
36#include "shift.h"
37
38#include "ALACBitUtilities.h"
39#include "EndianPortable.h"
40
41typedef enum
42{	false = 0,
43	true = 1
44} bool ;
45
46// constants/data
47const uint32_t kMaxBitDepth = 32 ;			// max allowed bit depth is 32
48
49
50// prototypes
51static int32_t	alac_fill_element (struct BitBuffer * bits) ;
52static int32_t	alac_data_stream_element (struct BitBuffer * bits) ;
53
54static void Zero32 (int32_t * buffer, uint32_t numItems, uint32_t stride) ;
55
56
57/*
58	Init ()
59	- initialize the decoder with the given configuration
60*/
61int32_t
62alac_decoder_init (ALAC_DECODER *p, void * inMagicCookie, uint32_t inMagicCookieSize)
63{
64	int32_t		status = ALAC_noErr ;
65	ALACSpecificConfig theConfig ;
66	uint8_t * theActualCookie = (uint8_t *) inMagicCookie ;
67	uint32_t theCookieBytesRemaining = inMagicCookieSize ;
68
69	// For historical reasons the decoder needs to be resilient to magic cookies vended by older encoders.
70	// As specified in the ALACMagicCookieDescription.txt document, there may be additional data encapsulating
71	// the ALACSpecificConfig. This would consist of format ('frma') and 'alac' atoms which precede the
72	// ALACSpecificConfig.
73	// See ALACMagicCookieDescription.txt for additional documentation concerning the 'magic cookie'
74
75	// skip format ('frma') atom if present
76	if (theActualCookie [4] == 'f' && theActualCookie [5] == 'r' && theActualCookie [6] == 'm' && theActualCookie [7] == 'a')
77	{
78		theActualCookie += 12 ;
79		theCookieBytesRemaining -= 12 ;
80	}
81
82	// skip 'alac' atom header if present
83	if (theActualCookie [4] == 'a' && theActualCookie [5] == 'l' && theActualCookie [6] == 'a' && theActualCookie [7] == 'c')
84	{
85		theActualCookie += 12 ;
86		theCookieBytesRemaining -= 12 ;
87	}
88
89	// read the ALACSpecificConfig
90	if (theCookieBytesRemaining >= sizeof (ALACSpecificConfig))
91	{
92		theConfig.frameLength = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, frameLength)) ;
93
94		if (theConfig.frameLength > ALAC_FRAME_LENGTH)
95			return fALAC_FrameLengthError ;
96
97		theConfig.compatibleVersion = theActualCookie [offsetof (ALACSpecificConfig, compatibleVersion)] ;
98		theConfig.bitDepth = theActualCookie [offsetof (ALACSpecificConfig, bitDepth)] ;
99		theConfig.pb = theActualCookie [offsetof (ALACSpecificConfig, pb)] ;
100		theConfig.mb = theActualCookie [offsetof (ALACSpecificConfig, mb)] ;
101		theConfig.kb = theActualCookie [offsetof (ALACSpecificConfig, kb)] ;
102		theConfig.numChannels = theActualCookie [offsetof (ALACSpecificConfig, numChannels)] ;
103		theConfig.maxRun = psf_get_be16 (theActualCookie, offsetof (ALACSpecificConfig, maxRun)) ;
104		theConfig.maxFrameBytes = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, maxFrameBytes)) ;
105		theConfig.avgBitRate = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, avgBitRate)) ;
106		theConfig.sampleRate = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, sampleRate)) ;
107
108		p->mConfig = theConfig ;
109		p->mNumChannels = theConfig.numChannels ;
110
111		RequireAction (p->mConfig.compatibleVersion <= kALACVersion, return kALAC_IncompatibleVersion ;) ;
112		RequireAction ((p->mConfig.bitDepth >= 8 && p->mConfig.bitDepth <= 32), return kALAC_BadBitWidth ;) ;
113		RequireAction ((p->mMixBufferU != NULL) && (p->mMixBufferV != NULL) && (p->u.mPredictor != NULL),
114						status = kALAC_MemFullError ; goto Exit ;) ;
115	}
116	else
117	{
118		status = kALAC_BadSpecificConfigSize ;
119	}
120
121	// skip to Channel Layout Info
122	// theActualCookie += sizeof (ALACSpecificConfig) ;
123
124	// Currently, the Channel Layout Info portion of the magic cookie (as defined in the
125	// ALACMagicCookieDescription.txt document) is unused by the decoder.
126
127Exit:
128	return status ;
129}
130
131/*
132	Decode ()
133	- the decoded samples are interleaved into the output buffer in the order they arrive in
134	  the bitstream
135*/
136int32_t
137alac_decode (ALAC_DECODER *p, struct BitBuffer * bits, int32_t * sampleBuffer, uint32_t numSamples, uint32_t * outNumSamples)
138{
139	BitBuffer		shiftBits ;
140	uint32_t		bits1, bits2 ;
141	uint8_t			tag ;
142	uint8_t			elementInstanceTag ;
143	AGParamRec		agParams ;
144	uint32_t		channelIndex ;
145	int16_t			coefsU [32] ;		// max possible size is 32 although NUMCOEPAIRS is the current limit
146	int16_t			coefsV [32] ;
147	uint8_t			numU, numV ;
148	uint8_t			mixBits ;
149	int8_t			mixRes ;
150	uint16_t		unusedHeader ;
151	uint8_t			escapeFlag ;
152	uint32_t		chanBits ;
153	uint8_t			bytesShifted ;
154	uint32_t		shift ;
155	uint8_t			modeU, modeV ;
156	uint32_t		denShiftU, denShiftV ;
157	uint16_t		pbFactorU, pbFactorV ;
158	uint16_t		pb ;
159	int32_t *		out32 ;
160	uint8_t			headerByte ;
161	uint8_t			partialFrame ;
162	uint32_t		extraBits ;
163	int32_t			val ;
164	uint32_t		i, j ;
165	int32_t			status ;
166	uint32_t		numChannels = p->mNumChannels ;
167
168	RequireAction ((bits != NULL) && (sampleBuffer != NULL) && (outNumSamples != NULL), return kALAC_ParamError ;) ;
169	RequireAction (p->mNumChannels > 0, return kALAC_ZeroChannelCount ;) ;
170
171	p->mActiveElements = 0 ;
172	channelIndex	= 0 ;
173
174	status = ALAC_noErr ;
175	*outNumSamples = numSamples ;
176
177	while (status == ALAC_noErr)
178	{
179		// bail if we ran off the end of the buffer
180		RequireAction (bits->cur < bits->end, status = kALAC_ParamError ; goto Exit ;) ;
181
182		// copy global decode params for this element
183		pb = p->mConfig.pb ;
184
185		// read element tag
186		tag = BitBufferReadSmall (bits, 3) ;
187		switch (tag)
188		{
189			case ID_SCE:
190			case ID_LFE:
191			{
192				// mono/LFE channel
193				elementInstanceTag = BitBufferReadSmall (bits, 4) ;
194				p->mActiveElements |= (1u << elementInstanceTag) ;
195
196				// read the 12 unused header bits
197				unusedHeader = (uint16_t) BitBufferRead (bits, 12) ;
198				RequireAction (unusedHeader == 0, status = kALAC_ParamError ; goto Exit ;) ;
199
200				// read the 1-bit "partial frame" flag, 2-bit "shift-off" flag & 1-bit "escape" flag
201				headerByte = (uint8_t) BitBufferRead (bits, 4) ;
202
203				partialFrame = headerByte >> 3 ;
204
205				bytesShifted = (headerByte >> 1) & 0x3u ;
206				RequireAction (bytesShifted != 3, status = kALAC_ParamError ; goto Exit ;) ;
207
208				shift = bytesShifted * 8 ;
209
210				escapeFlag = headerByte & 0x1 ;
211
212				chanBits = p->mConfig.bitDepth - (bytesShifted * 8) ;
213
214				// check for partial frame to override requested numSamples
215				if (partialFrame != 0)
216				{
217					numSamples = BitBufferRead (bits, 16) << 16 ;
218					numSamples |= BitBufferRead (bits, 16) ;
219
220					RequireAction (numSamples < kALACDefaultFramesPerPacket, return kALAC_NumSamplesTooBig ;) ;
221				}
222
223				if (escapeFlag == 0)
224				{
225					// compressed frame, read rest of parameters
226					mixBits	= (uint8_t) BitBufferRead (bits, 8) ;
227					mixRes	= (int8_t) BitBufferRead (bits, 8) ;
228					//Assert ((mixBits == 0) && (mixRes == 0)) ;		// no mixing for mono
229
230					headerByte	= (uint8_t) BitBufferRead (bits, 8) ;
231					modeU		= headerByte >> 4 ;
232					denShiftU	= headerByte & 0xfu ;
233
234					headerByte	= (uint8_t) BitBufferRead (bits, 8) ;
235					pbFactorU	= headerByte >> 5 ;
236					numU		= headerByte & 0x1fu ;
237
238					for (i = 0 ; i < numU ; i++)
239						coefsU [i] = (int16_t) BitBufferRead (bits, 16) ;
240
241					// if shift active, skip the shift buffer but remember where it starts
242					if (bytesShifted != 0)
243					{
244						shiftBits = *bits ;
245						BitBufferAdvance (bits, (bytesShifted * 8) * numSamples) ;
246					}
247
248					// decompress
249					set_ag_params (&agParams, p->mConfig.mb, (pb * pbFactorU) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun) ;
250					status = dyn_decomp (&agParams, bits, p->u.mPredictor, numSamples, chanBits, &bits1) ;
251					RequireNoErr (status, goto Exit ;) ;
252
253					if (modeU == 0)
254					{
255						unpc_block (p->u.mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ;
256					}
257					else
258					{
259						// the special "numActive == 31" mode can be done in-place
260						unpc_block (p->u.mPredictor, p->u.mPredictor, numSamples, NULL, 31, chanBits, 0) ;
261						unpc_block (p->u.mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ;
262					}
263				}
264				else
265				{
266					//Assert (bytesShifted == 0) ;
267
268					// uncompressed frame, copy data into the mix buffer to use common output code
269					shift = 32 - chanBits ;
270					if (chanBits <= 16)
271					{
272						for (i = 0 ; i < numSamples ; i++)
273						{
274							val = (int32_t) BitBufferRead (bits, (uint8_t) chanBits) ;
275							val = (val << shift) >> shift ;
276							p->mMixBufferU [i] = val ;
277						}
278					}
279					else
280					{
281						// BitBufferRead () can't read more than 16 bits at a time so break up the reads
282						extraBits = chanBits - 16 ;
283						for (i = 0 ; i < numSamples ; i++)
284						{
285							val = (int32_t) BitBufferRead (bits, 16) ;
286							val = arith_shift_left (val, 16) >> shift ;
287							p->mMixBufferU [i] = val | BitBufferRead (bits, (uint8_t) extraBits) ;
288						}
289					}
290
291					mixBits = mixRes = 0 ;
292					bits1 = chanBits * numSamples ;
293					bytesShifted = 0 ;
294				}
295
296				// now read the shifted values into the shift buffer
297				if (bytesShifted != 0)
298				{
299					shift = bytesShifted * 8 ;
300					//Assert (shift <= 16) ;
301
302					for (i = 0 ; i < numSamples ; i++)
303						p->u.mShiftBuffer [i] = (uint16_t) BitBufferRead (&shiftBits, (uint8_t) shift) ;
304				}
305
306				// convert 32-bit integers into output buffer
307				switch (p->mConfig.bitDepth)
308				{
309					case 16:
310						out32 = sampleBuffer + channelIndex ;
311						for (i = 0, j = 0 ; i < numSamples ; i++, j += numChannels)
312							out32 [j] = arith_shift_left (p->mMixBufferU [i], 16) ;
313						break ;
314					case 20:
315						out32 = sampleBuffer + channelIndex ;
316						copyPredictorTo20 (p->mMixBufferU, out32, numChannels, numSamples) ;
317						break ;
318					case 24:
319						out32 = sampleBuffer + channelIndex ;
320						if (bytesShifted != 0)
321							copyPredictorTo24Shift (p->mMixBufferU, p->u.mShiftBuffer, out32, numChannels, numSamples, bytesShifted) ;
322						else
323							copyPredictorTo24 (p->mMixBufferU, out32, numChannels, numSamples) ;
324						break ;
325					case 32:
326						out32 = sampleBuffer + channelIndex ;
327						if (bytesShifted != 0)
328							copyPredictorTo32Shift (p->mMixBufferU, p->u.mShiftBuffer, out32, numChannels, numSamples, bytesShifted) ;
329						else
330							copyPredictorTo32 (p->mMixBufferU, out32, numChannels, numSamples) ;
331						break ;
332				}
333
334				channelIndex += 1 ;
335				*outNumSamples = numSamples ;
336				break ;
337			}
338
339			case ID_CPE:
340			{
341				// if decoding this pair would take us over the max channels limit, bail
342				if ((channelIndex + 2) > numChannels)
343					goto NoMoreChannels ;
344
345				// stereo channel pair
346				elementInstanceTag = BitBufferReadSmall (bits, 4) ;
347				p->mActiveElements |= (1u << elementInstanceTag) ;
348
349				// read the 12 unused header bits
350				unusedHeader = (uint16_t) BitBufferRead (bits, 12) ;
351				RequireAction (unusedHeader == 0, status = kALAC_ParamError ; goto Exit ;) ;
352
353				// read the 1-bit "partial frame" flag, 2-bit "shift-off" flag & 1-bit "escape" flag
354				headerByte = (uint8_t) BitBufferRead (bits, 4) ;
355
356				partialFrame = headerByte >> 3 ;
357
358				bytesShifted = (headerByte >> 1) & 0x3u ;
359				RequireAction (bytesShifted != 3, status = kALAC_ParamError ; goto Exit ;) ;
360
361				shift = bytesShifted * 8 ;
362
363				escapeFlag = headerByte & 0x1 ;
364
365				chanBits = p->mConfig.bitDepth - (bytesShifted * 8) + 1 ;
366
367				// check for partial frame length to override requested numSamples
368				if (partialFrame != 0)
369				{
370					numSamples = BitBufferRead (bits, 16) << 16 ;
371					numSamples |= BitBufferRead (bits, 16) ;
372
373					RequireAction (numSamples < kALACDefaultFramesPerPacket, return kALAC_NumSamplesTooBig ;) ;
374				}
375
376				if (escapeFlag == 0)
377				{
378					// compressed frame, read rest of parameters
379					mixBits		= (uint8_t) BitBufferRead (bits, 8) ;
380					mixRes		= (int8_t) BitBufferRead (bits, 8) ;
381
382					headerByte	= (uint8_t) BitBufferRead (bits, 8) ;
383					modeU		= headerByte >> 4 ;
384					denShiftU	= headerByte & 0xfu ;
385
386					headerByte	= (uint8_t) BitBufferRead (bits, 8) ;
387					pbFactorU	= headerByte >> 5 ;
388					numU		= headerByte & 0x1fu ;
389					for (i = 0 ; i < numU ; i++)
390						coefsU [i] = (int16_t) BitBufferRead (bits, 16) ;
391
392					headerByte	= (uint8_t) BitBufferRead (bits, 8) ;
393					modeV		= headerByte >> 4 ;
394					denShiftV	= headerByte & 0xfu ;
395
396					headerByte	= (uint8_t) BitBufferRead (bits, 8) ;
397					pbFactorV	= headerByte >> 5 ;
398					numV		= headerByte & 0x1fu ;
399					for (i = 0 ; i < numV ; i++)
400						coefsV [i] = (int16_t) BitBufferRead (bits, 16) ;
401
402					// if shift active, skip the interleaved shifted values but remember where they start
403					if (bytesShifted != 0)
404					{
405						shiftBits = *bits ;
406						BitBufferAdvance (bits, (bytesShifted * 8) * 2 * numSamples) ;
407					}
408
409					// decompress and run predictor for "left" channel
410					set_ag_params (&agParams, p->mConfig.mb, (pb * pbFactorU) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun) ;
411					status = dyn_decomp (&agParams, bits, p->u.mPredictor, numSamples, chanBits, &bits1) ;
412					RequireNoErr (status, goto Exit ;) ;
413
414					if (modeU == 0)
415					{
416						unpc_block (p->u.mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ;
417					}
418					else
419					{
420						// the special "numActive == 31" mode can be done in-place
421						unpc_block (p->u.mPredictor, p->u.mPredictor, numSamples, NULL, 31, chanBits, 0) ;
422						unpc_block (p->u.mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ;
423					}
424
425					// decompress and run predictor for "right" channel
426					set_ag_params (&agParams, p->mConfig.mb, (pb * pbFactorV) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun) ;
427					status = dyn_decomp (&agParams, bits, p->u.mPredictor, numSamples, chanBits, &bits2) ;
428					RequireNoErr (status, goto Exit ;) ;
429
430					if (modeV == 0)
431					{
432						unpc_block (p->u.mPredictor, p->mMixBufferV, numSamples, &coefsV [0], numV, chanBits, denShiftV) ;
433					}
434					else
435					{
436						// the special "numActive == 31" mode can be done in-place
437						unpc_block (p->u.mPredictor, p->u.mPredictor, numSamples, NULL, 31, chanBits, 0) ;
438						unpc_block (p->u.mPredictor, p->mMixBufferV, numSamples, &coefsV [0], numV, chanBits, denShiftV) ;
439					}
440				}
441				else
442				{
443					//Assert (bytesShifted == 0) ;
444
445					// uncompressed frame, copy data into the mix buffers to use common output code
446					chanBits = p->mConfig.bitDepth ;
447					shift = 32 - chanBits ;
448					if (chanBits <= 16)
449					{
450						for (i = 0 ; i < numSamples ; i++)
451						{
452							val = (int32_t) BitBufferRead (bits, (uint8_t) chanBits) ;
453							val = (val << shift) >> shift ;
454							p->mMixBufferU [i] = val ;
455
456							val = (int32_t) BitBufferRead (bits, (uint8_t) chanBits) ;
457							val = (val << shift) >> shift ;
458							p->mMixBufferV [i] = val ;
459						}
460					}
461					else
462					{
463						// BitBufferRead () can't read more than 16 bits at a time so break up the reads
464						extraBits = chanBits - 16 ;
465						for (i = 0 ; i < numSamples ; i++)
466						{
467							val = (int32_t) BitBufferRead (bits, 16) ;
468							val = (((uint32_t) val) << 16) >> shift ;
469							p->mMixBufferU [i] = val | BitBufferRead (bits, (uint8_t) extraBits) ;
470
471							val = (int32_t) BitBufferRead (bits, 16) ;
472							val = ((uint32_t) val) >> shift ;
473							p->mMixBufferV [i] = val | BitBufferRead (bits, (uint8_t) extraBits) ;
474						}
475					}
476
477					bits1 = chanBits * numSamples ;
478					bits2 = chanBits * numSamples ;
479					mixBits = mixRes = 0 ;
480					bytesShifted = 0 ;
481				}
482
483				// now read the shifted values into the shift buffer
484				if (bytesShifted != 0)
485				{
486					shift = bytesShifted * 8 ;
487					//Assert (shift <= 16) ;
488
489					for (i = 0 ; i < (numSamples * 2) ; i += 2)
490					{
491						p->u.mShiftBuffer [i + 0] = (uint16_t) BitBufferRead (&shiftBits, (uint8_t) shift) ;
492						p->u.mShiftBuffer [i + 1] = (uint16_t) BitBufferRead (&shiftBits, (uint8_t) shift) ;
493					}
494				}
495
496				// un-mix the data and convert to output format
497				// - note that mixRes = 0 means just interleave so we use that path for uncompressed frames
498				switch (p->mConfig.bitDepth)
499				{
500					case 16:
501						out32 = sampleBuffer + channelIndex ;
502						unmix16 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, mixBits, mixRes) ;
503						break ;
504					case 20:
505						out32 = sampleBuffer + channelIndex ;
506						unmix20 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, mixBits, mixRes) ;
507						break ;
508					case 24:
509						out32 = sampleBuffer + channelIndex ;
510						unmix24 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples,
511									mixBits, mixRes, p->u.mShiftBuffer, bytesShifted) ;
512						break ;
513					case 32:
514						out32 = sampleBuffer + channelIndex ;
515						unmix32 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples,
516									mixBits, mixRes, p->u.mShiftBuffer, bytesShifted) ;
517						break ;
518				}
519
520				channelIndex += 2 ;
521				*outNumSamples = numSamples ;
522				break ;
523			}
524
525			case ID_CCE:
526			case ID_PCE:
527			{
528				// unsupported element, bail
529				//AssertNoErr (tag) ;
530				status = kALAC_UnsupportedElement ;
531				break ;
532			}
533
534			case ID_DSE:
535			{
536				// data stream element -- parse but ignore
537				status = alac_data_stream_element (bits) ;
538				break ;
539			}
540
541			case ID_FIL:
542			{
543				// fill element -- parse but ignore
544				status = alac_fill_element (bits) ;
545				break ;
546			}
547
548			case ID_END:
549			{
550				// frame end, all done so byte align the frame and check for overruns
551				BitBufferByteAlign (bits, false) ;
552				//Assert (bits->cur == bits->end) ;
553				goto Exit ;
554			}
555		}
556
557#if 1 // ! DEBUG
558		// if we've decoded all of our channels, bail (but not in debug b/c we want to know if we're seeing bad bits)
559		// - this also protects us if the config does not match the bitstream or crap data bits follow the audio bits
560		if (channelIndex >= numChannels)
561			break ;
562#endif
563	}
564
565NoMoreChannels:
566
567	// if we get here and haven't decoded all of the requested channels, fill the remaining channels with zeros
568	for ( ; channelIndex < numChannels ; channelIndex++)
569	{
570		int32_t *	fill32 = sampleBuffer + channelIndex ;
571		Zero32 (fill32, numSamples, numChannels) ;
572	}
573
574Exit:
575	return status ;
576}
577
578#if PRAGMA_MARK
579#pragma mark -
580#endif
581
582/*
583	FillElement ()
584	- they're just filler so we don't need 'em
585*/
586static int32_t
587alac_fill_element (struct BitBuffer * bits)
588{
589	int16_t		count ;
590
591	// 4-bit count or (4-bit + 8-bit count) if 4-bit count == 15
592	// - plus this weird -1 thing I still don't fully understand
593	count = BitBufferReadSmall (bits, 4) ;
594	if (count == 15)
595		count += (int16_t) BitBufferReadSmall (bits, 8) - 1 ;
596
597	BitBufferAdvance (bits, count * 8) ;
598
599	RequireAction (bits->cur <= bits->end, return kALAC_ParamError ;) ;
600
601	return ALAC_noErr ;
602}
603
604/*
605	DataStreamElement ()
606	- we don't care about data stream elements so just skip them
607*/
608static int32_t
609alac_data_stream_element (struct BitBuffer * bits)
610{
611	int32_t		data_byte_align_flag ;
612	uint16_t		count ;
613
614	// the tag associates this data stream element with a given audio element
615
616	/* element_instance_tag = */ BitBufferReadSmall (bits, 4) ;
617
618	data_byte_align_flag = BitBufferReadOne (bits) ;
619
620	// 8-bit count or (8-bit + 8-bit count) if 8-bit count == 255
621	count = BitBufferReadSmall (bits, 8) ;
622	if (count == 255)
623		count += BitBufferReadSmall (bits, 8) ;
624
625	// the align flag means the bitstream should be byte-aligned before reading the following data bytes
626	if (data_byte_align_flag)
627		BitBufferByteAlign (bits, false) ;
628
629	// skip the data bytes
630	BitBufferAdvance (bits, count * 8) ;
631
632	RequireAction (bits->cur <= bits->end, return kALAC_ParamError ;) ;
633
634	return ALAC_noErr ;
635}
636
637/*
638	ZeroN ()
639	- helper routines to clear out output channel buffers when decoding fewer channels than requested
640*/
641static void Zero32 (int32_t * buffer, uint32_t numItems, uint32_t stride)
642{
643	if (stride == 1)
644	{
645		memset (buffer, 0, numItems * sizeof (int32_t)) ;
646	}
647	else
648	{
649		for (uint32_t indx = 0 ; indx < (numItems * stride) ; indx += stride)
650			buffer [indx] = 0 ;
651	}
652}
653