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

◆ UnpackSFMPEG2()

static void fl::third_party::UnpackSFMPEG2 ( BitStreamInfo * bsi,
SideInfoSub * sis,
ScaleFactorInfoSub * sfis,
int gr,
int ch,
int modeExt,
ScaleFactorJS * sfjs )
static

Definition at line 212 of file scalfact.hpp.

213{
214 (void)gr; // Unused parameter - kept for API consistency
215
216 int i, sfb, sfcIdx, btIdx, nrIdx;
217 int slen[4], nr[4];
218 int sfCompress, preFlag, intensityScale;
219
220 sfCompress = sis->sfCompress;
221 preFlag = 0;
222 intensityScale = 0;
223
224 /* stereo mode bits (1 = on): bit 1 = mid-side on/off, bit 0 = intensity on/off */
225 if (! ((modeExt & 0x01) && (ch == 1)) ) {
226 /* in other words: if ((modeExt & 0x01) == 0 || ch == 0) */
227 if (sfCompress < 400) {
228 /* max slen = floor[(399/16) / 5] = 4 */
229 slen[0] = (sfCompress >> 4) / 5;
230 slen[1]= (sfCompress >> 4) % 5;
231 slen[2]= (sfCompress & 0x0f) >> 2;
232 slen[3]= (sfCompress & 0x03);
233 sfcIdx = 0;
234 } else if (sfCompress < 500) {
235 /* max slen = floor[(99/4) / 5] = 4 */
236 sfCompress -= 400;
237 slen[0] = (sfCompress >> 2) / 5;
238 slen[1]= (sfCompress >> 2) % 5;
239 slen[2]= (sfCompress & 0x03);
240 slen[3]= 0;
241 sfcIdx = 1;
242 } else {
243 /* max slen = floor[11/3] = 3 (sfCompress = 9 bits in MPEG2) */
244 sfCompress -= 500;
245 slen[0] = sfCompress / 3;
246 slen[1] = sfCompress % 3;
247 slen[2] = slen[3] = 0;
248 if (sis->mixedBlock) {
249 /* adjust for long/short mix logic (see comment above in NRTab[] definition) */
250 slen[2] = slen[1];
251 slen[1] = slen[0];
252 }
253 preFlag = 1;
254 sfcIdx = 2;
255 }
256 } else {
257 /* intensity stereo ch = 1 (right) */
258 intensityScale = sfCompress & 0x01;
259 sfCompress >>= 1;
260 if (sfCompress < 180) {
261 /* max slen = floor[35/6] = 5 (from mod 36) */
262 slen[0] = (sfCompress / 36);
263 slen[1] = (sfCompress % 36) / 6;
264 slen[2] = (sfCompress % 36) % 6;
265 slen[3] = 0;
266 sfcIdx = 3;
267 } else if (sfCompress < 244) {
268 /* max slen = floor[63/16] = 3 */
269 sfCompress -= 180;
270 slen[0] = (sfCompress & 0x3f) >> 4;
271 slen[1] = (sfCompress & 0x0f) >> 2;
272 slen[2] = (sfCompress & 0x03);
273 slen[3] = 0;
274 sfcIdx = 4;
275 } else {
276 /* max slen = floor[11/3] = 3 (max sfCompress >> 1 = 511/2 = 255) */
277 sfCompress -= 244;
278 slen[0] = (sfCompress / 3);
279 slen[1] = (sfCompress % 3);
280 slen[2] = slen[3] = 0;
281 sfcIdx = 5;
282 }
283 }
284
285 /* set index based on block type: (0,1,3) --> 0, (2 non-mixed) --> 1, (2 mixed) ---> 2 */
286 btIdx = 0;
287 if (sis->blockType == 2)
288 btIdx = (sis->mixedBlock ? 2 : 1);
289 for (i = 0; i < 4; i++)
290 nr[i] = (int)NRTab[sfcIdx][btIdx][i];
291
292 /* save intensity stereo scale factor info */
293 if( (modeExt & 0x01) && (ch == 1) ) {
294 for (i = 0; i < 4; i++) {
295 sfjs->slen[i] = slen[i];
296 sfjs->nr[i] = nr[i];
297 }
298 sfjs->intensityScale = intensityScale;
299 }
300 sis->preFlag = preFlag;
301
302 /* short blocks */
303 if(sis->blockType == 2) {
304 if(sis->mixedBlock) {
305 /* do long block portion */
306 for (sfb=0; sfb < 6; sfb++) {
307 sfis->l[sfb] = (char)GetBits(bsi, slen[0]);
308 }
309 sfb = 3; /* start sfb for short */
310 nrIdx = 1;
311 } else {
312 /* all short blocks, so start nr, sfb at 0 */
313 sfb = 0;
314 nrIdx = 0;
315 }
316
317 /* remaining short blocks, sfb just keeps incrementing */
318 for ( ; nrIdx <= 3; nrIdx++) {
319 for (i=0; i < nr[nrIdx]; i++, sfb++) {
320 sfis->s[sfb][0] = (char)GetBits(bsi, slen[nrIdx]);
321 sfis->s[sfb][1] = (char)GetBits(bsi, slen[nrIdx]);
322 sfis->s[sfb][2] = (char)GetBits(bsi, slen[nrIdx]);
323 }
324 }
325 /* last sf band not transmitted */
326 sfis->s[12][0] = sfis->s[12][1] = sfis->s[12][2] = 0;
327 } else {
328 /* long blocks */
329 sfb = 0;
330 for (nrIdx = 0; nrIdx <= 3; nrIdx++) {
331 for(i=0; i < nr[nrIdx]; i++, sfb++) {
332 sfis->l[sfb] = (char)GetBits(bsi, slen[nrIdx]);
333 }
334 }
335 /* last sf band not transmitted */
336 sfis->l[21] = sfis->l[22] = 0;
337
338 }
339}
uint32_t GetBits(BitStreamInfo *bsi, int32_t nBits) FL_NOEXCEPT
static const char NRTab[6][3][4]
Definition scalfact.hpp:160

References FL_NOEXCEPT, GetBits(), and NRTab.

Referenced by UnpackScaleFactors().

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