FastLED 3.9.15
Loading...
Searching...
No Matches

◆ DecodeHuffman()

int fl::third_party::DecodeHuffman ( MP3DecInfo * mp3DecInfo,
const unsigned char * buf,
int * bitOffset,
int huffBlockBits,
int gr,
int ch )

Definition at line 385 of file huffman.hpp.

386{
387 int r1Start, r2Start, rEnd[4]; /* region boundaries */
388 int i, w, bitsUsed, bitsLeft;
389 const unsigned char *startBuf = buf;
390
391 FrameHeader *fh;
392 SideInfo *si;
393 SideInfoSub *sis;
394 HuffmanInfo *hi;
395
396 /* validate pointers */
397 if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || !mp3DecInfo->ScaleFactorInfoPS || !mp3DecInfo->HuffmanInfoPS)
398 return -1;
399
400 fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS));
401 si = ((SideInfo *)(mp3DecInfo->SideInfoPS));
402 sis = &si->sis[gr][ch];
403 hi = (HuffmanInfo*)(mp3DecInfo->HuffmanInfoPS);
404
405 if (huffBlockBits < 0)
406 return -1;
407
408 /* figure out region boundaries (the first 2*bigVals coefficients divided into 3 regions) */
409 if (sis->winSwitchFlag && sis->blockType == 2) {
410 if (sis->mixedBlock == 0) {
411 r1Start = fh->sfBand->s[(sis->region0Count + 1)/3] * 3;
412 } else {
413 if (fh->ver == MPEG1) {
414 r1Start = fh->sfBand->l[sis->region0Count + 1];
415 } else {
416 /* see MPEG2 spec for explanation */
417 w = fh->sfBand->s[4] - fh->sfBand->s[3];
418 r1Start = fh->sfBand->l[6] + 2*w;
419 }
420 }
421 r2Start = MAX_NSAMP; /* short blocks don't have region 2 */
422 } else {
423 r1Start = fh->sfBand->l[sis->region0Count + 1];
424 r2Start = fh->sfBand->l[sis->region0Count + 1 + sis->region1Count + 1];
425 }
426
427 /* offset rEnd index by 1 so first region = rEnd[1] - rEnd[0], etc. */
428 rEnd[3] = MIN(MAX_NSAMP, 2 * sis->nBigvals);
429 rEnd[2] = MIN(r2Start, rEnd[3]);
430 rEnd[1] = MIN(r1Start, rEnd[3]);
431 rEnd[0] = 0;
432
433 /* rounds up to first all-zero pair (we don't check last pair for (x,y) == (non-zero, zero)) */
434 hi->nonZeroBound[ch] = rEnd[3];
435
436 /* decode Huffman pairs (rEnd[i] are always even numbers) */
437 bitsLeft = huffBlockBits;
438 for (i = 0; i < 3; i++) {
439 bitsUsed = DecodeHuffmanPairs(hi->huffDecBuf[ch] + rEnd[i], rEnd[i+1] - rEnd[i], sis->tableSelect[i], bitsLeft, buf, *bitOffset);
440 if (bitsUsed < 0 || bitsUsed > bitsLeft) /* error - overran end of bitstream */
441 return -1;
442
443 /* update bitstream position */
444 buf += (bitsUsed + *bitOffset) >> 3;
445 *bitOffset = (bitsUsed + *bitOffset) & 0x07;
446 bitsLeft -= bitsUsed;
447 }
448
449 /* decode Huffman quads (if any) */
450 hi->nonZeroBound[ch] += DecodeHuffmanQuads(hi->huffDecBuf[ch] + rEnd[3], MAX_NSAMP - rEnd[3], sis->count1TableSelect, bitsLeft, buf, *bitOffset);
451
452 ASSERT(hi->nonZeroBound[ch] <= MAX_NSAMP);
453 for (i = hi->nonZeroBound[ch]; i < MAX_NSAMP; i++)
454 hi->huffDecBuf[ch][i] = 0;
455
456 /* If bits used for 576 samples < huffBlockBits, then the extras are considered
457 * to be stuffing bits (throw away, but need to return correct bitstream position)
458 */
459 buf += (bitsLeft + *bitOffset) >> 3;
460 *bitOffset = (bitsLeft + *bitOffset) & 0x07;
461
462 return (buf - startBuf);
463}
#define MIN(a, b)
Definition coder.h:64
#define ASSERT(x)
Definition coder.h:56
void * FrameHeaderPS
Definition mp3common.h:68
void * ScaleFactorInfoPS
Definition mp3common.h:70
void * SideInfoPS
Definition mp3common.h:69
void * HuffmanInfoPS
Definition mp3common.h:71
@ MPEG1
Definition mp3dec.h:83
#define MAX_NSAMP
Definition mp3dec.h:79
struct fl::third_party::_HuffmanInfo HuffmanInfo
static int DecodeHuffmanPairs(int32_t *xy, int nVals, int tabIdx, int bitsLeft, const unsigned char *buf, int bitOffset) FL_NOEXCEPT
Definition huffman.hpp:88
struct fl::third_party::_FrameHeader FrameHeader
static int DecodeHuffmanQuads(int32_t *vwxy, int nVals, int tabIdx, int bitsLeft, const unsigned char *buf, int bitOffset) FL_NOEXCEPT
Definition huffman.hpp:292
struct fl::third_party::_SideInfo SideInfo
struct fl::third_party::_SideInfoSub SideInfoSub
int32_t nonZeroBound[MAX_NCHAN]
Definition coder.h:217
int32_t huffDecBuf[MAX_NCHAN][MAX_NSAMP]
Definition coder.h:216
const SFBandTable * sfBand
Definition coder.h:175
SideInfoSub sis[MAX_NGRAN][MAX_NCHAN]
Definition coder.h:200

References ASSERT, fl::third_party::_SideInfoSub::blockType, fl::third_party::_SideInfoSub::count1TableSelect, DecodeHuffmanPairs(), DecodeHuffmanQuads(), FL_NOEXCEPT, fl::third_party::_HuffmanInfo::huffDecBuf, fl::third_party::_SFBandTable::l, MAX_NSAMP, MIN, fl::third_party::_SideInfoSub::mixedBlock, MPEG1, fl::third_party::_SideInfoSub::nBigvals, fl::third_party::_HuffmanInfo::nonZeroBound, fl::third_party::_SideInfoSub::region0Count, fl::third_party::_SideInfoSub::region1Count, fl::third_party::_SFBandTable::s, fl::third_party::_FrameHeader::sfBand, fl::third_party::_SideInfo::sis, fl::third_party::_SideInfoSub::tableSelect, fl::third_party::_FrameHeader::ver, and fl::third_party::_SideInfoSub::winSwitchFlag.

Referenced by MP3Decode().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: