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

◆ UnpackSideInfo()

int fl::third_party::UnpackSideInfo ( MP3DecInfo * mp3DecInfo,
const unsigned char * buf )

Definition at line 304 of file bitstream.hpp.

305{
306 int gr, ch, bd, nBytes;
307 BitStreamInfo bitStreamInfo, *bsi;
308 FrameHeader *fh;
309 SideInfo *si;
310 SideInfoSub *sis;
311
312 /* validate pointers and sync word */
313 if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS)
314 return -1;
315
316 fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS));
317 si = ((SideInfo *)(mp3DecInfo->SideInfoPS));
318
319 bsi = &bitStreamInfo;
320 if (fh->ver == MPEG1) {
321 /* MPEG 1 */
323 SetBitstreamPointer(bsi, nBytes, buf);
324 si->mainDataBegin = GetBits(bsi, 9);
325 si->privateBits = GetBits(bsi, (fh->sMode == Mono ? 5 : 3));
326
327 for (ch = 0; ch < mp3DecInfo->nChans; ch++)
328 for (bd = 0; bd < MAX_SCFBD; bd++)
329 si->scfsi[ch][bd] = GetBits(bsi, 1);
330 } else {
331 /* MPEG 2, MPEG 2.5 */
333 SetBitstreamPointer(bsi, nBytes, buf);
334 si->mainDataBegin = GetBits(bsi, 8);
335 si->privateBits = GetBits(bsi, (fh->sMode == Mono ? 1 : 2));
336 }
337
338 for(gr =0; gr < mp3DecInfo->nGrans; gr++) {
339 for (ch = 0; ch < mp3DecInfo->nChans; ch++) {
340 sis = &si->sis[gr][ch]; /* side info subblock for this granule, channel */
341
342 sis->part23Length = GetBits(bsi, 12);
343 sis->nBigvals = GetBits(bsi, 9);
344 sis->globalGain = GetBits(bsi, 8);
345 sis->sfCompress = GetBits(bsi, (fh->ver == MPEG1 ? 4 : 9));
346 sis->winSwitchFlag = GetBits(bsi, 1);
347
348 if(sis->winSwitchFlag) {
349 /* this is a start, stop, short, or mixed block */
350 sis->blockType = GetBits(bsi, 2); /* 0 = normal, 1 = start, 2 = short, 3 = stop */
351 sis->mixedBlock = GetBits(bsi, 1); /* 0 = not mixed, 1 = mixed */
352 sis->tableSelect[0] = GetBits(bsi, 5);
353 sis->tableSelect[1] = GetBits(bsi, 5);
354 sis->tableSelect[2] = 0; /* unused */
355 sis->subBlockGain[0] = GetBits(bsi, 3);
356 sis->subBlockGain[1] = GetBits(bsi, 3);
357 sis->subBlockGain[2] = GetBits(bsi, 3);
358
359 /* TODO - check logic */
360 if (sis->blockType == 0) {
361 /* this should not be allowed, according to spec */
362 sis->nBigvals = 0;
363 sis->part23Length = 0;
364 sis->sfCompress = 0;
365 } else if (sis->blockType == 2 && sis->mixedBlock == 0) {
366 /* short block, not mixed */
367 sis->region0Count = 8;
368 } else {
369 /* start, stop, or short-mixed */
370 sis->region0Count = 7;
371 }
372 sis->region1Count = 20 - sis->region0Count;
373 } else {
374 /* this is a normal block */
375 sis->blockType = 0;
376 sis->mixedBlock = 0;
377 sis->tableSelect[0] = GetBits(bsi, 5);
378 sis->tableSelect[1] = GetBits(bsi, 5);
379 sis->tableSelect[2] = GetBits(bsi, 5);
380 sis->region0Count = GetBits(bsi, 4);
381 sis->region1Count = GetBits(bsi, 3);
382 }
383 sis->preFlag = (fh->ver == MPEG1 ? GetBits(bsi, 1) : 0);
384 sis->sfactScale = GetBits(bsi, 1);
385 sis->count1TableSelect = GetBits(bsi, 1);
386 }
387 }
388 mp3DecInfo->mainDataBegin = si->mainDataBegin; /* needed by main decode loop */
389
390 ASSERT(nBytes == CalcBitsUsed(bsi, buf, 0) >> 3);
391
392 return nBytes;
393}
@ Mono
Definition coder.h:147
#define SIBYTES_MPEG2_MONO
Definition coder.h:95
#define SIBYTES_MPEG1_MONO
Definition coder.h:93
#define SIBYTES_MPEG2_STEREO
Definition coder.h:96
#define SIBYTES_MPEG1_STEREO
Definition coder.h:94
#define ASSERT(x)
Definition coder.h:56
#define MAX_SCFBD
Definition mp3common.h:52
int mainDataBegin
Definition mp3common.h:93
void * FrameHeaderPS
Definition mp3common.h:68
void * SideInfoPS
Definition mp3common.h:69
@ MPEG1
Definition mp3dec.h:83
struct fl::third_party::_BitStreamInfo BitStreamInfo
struct fl::third_party::_FrameHeader FrameHeader
uint32_t GetBits(BitStreamInfo *bsi, int32_t nBits) FL_NOEXCEPT
void SetBitstreamPointer(BitStreamInfo *bsi, int32_t nBytes, const unsigned char *buf) FL_NOEXCEPT
Definition bitstream.hpp:65
struct fl::third_party::_SideInfo SideInfo
struct fl::third_party::_SideInfoSub SideInfoSub
int32_t CalcBitsUsed(BitStreamInfo *bsi, const unsigned char *startBuf, int32_t startOffset) FL_NOEXCEPT
SideInfoSub sis[MAX_NGRAN][MAX_NCHAN]
Definition coder.h:200
int32_t scfsi[MAX_NCHAN][MAX_SCFBD]
Definition coder.h:198

References ASSERT, fl::third_party::_SideInfoSub::blockType, CalcBitsUsed(), fl::third_party::_SideInfoSub::count1TableSelect, FL_NOEXCEPT, GetBits(), fl::third_party::_SideInfoSub::globalGain, fl::third_party::_SideInfo::mainDataBegin, MAX_SCFBD, fl::third_party::_SideInfoSub::mixedBlock, Mono, MPEG1, fl::third_party::_SideInfoSub::nBigvals, fl::third_party::_SideInfoSub::part23Length, fl::third_party::_SideInfoSub::preFlag, fl::third_party::_SideInfo::privateBits, fl::third_party::_SideInfoSub::region0Count, fl::third_party::_SideInfoSub::region1Count, fl::third_party::_SideInfo::scfsi, SetBitstreamPointer(), fl::third_party::_SideInfoSub::sfactScale, fl::third_party::_SideInfoSub::sfCompress, SIBYTES_MPEG1_MONO, SIBYTES_MPEG1_STEREO, SIBYTES_MPEG2_MONO, SIBYTES_MPEG2_STEREO, fl::third_party::_SideInfo::sis, fl::third_party::_FrameHeader::sMode, fl::third_party::_SideInfoSub::subBlockGain, 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: