void CPrediction::doITransformPFrame(CImage<float> * pSrc, CImage<float> * pDst, CPredictionInfoTable * pPred) { for(int k=0;k<pSrc->getComponents();k++) { int scale = 16/pSrc->getScale(k); CSize size = (*pSrc)[k].getSize(); for(int y=0; y < (*pSrc)[k].getHeight(); y+=8) { for(int x=0; x < (*pSrc)[k].getWidth(); x+=8) { prediction_info_t info = (*pPred)[y/scale][x/scale]; ITransformBlock(&(*pSrc)[k][y][x], &(*pDst)[k][y][x], CPoint(k, y, x), size, info, scale); } } } }
/***************************************************************************** * * freq2time_adapt * transform freq. domain data to time domain. * Overlap and add transform output to recreate time sequence. * Blocks composed of multiple segments (i.e. all but long) have * input spectrums interleaved. * input: see below * output: see below * local static: * timeBuff time domain data fifo * globals: none * *****************************************************************************/ void freq2time_adapt(faacDecHandle hDecoder, byte blockType, /* input: blockType 0-3 */ Wnd_Shape *wnd_shape, /* input/output */ Float *freqInPtr, /* input: interleaved spectrum */ Float *timeBuff, /* transform state needed for each channel */ Float *ftimeOutPtr) /* output: 1/2 block of new time values */ { Float *transBuff, *transBuffPtr; int i, j; Float *timeBuffPtr, *destPtr; Float *timeOutPtr; transBuff = AllocMemory(2*BLOCK_LEN_LONG*sizeof(Float)); timeOutPtr = AllocMemory(BLOCK_LEN_LONG*sizeof(Float)); if (blockType == NORM_TYPE) { unfold (freqInPtr, transBuff, BLOCK_LEN_LONG); /* Do 1 LONG transform */ ITransformBlock (hDecoder, transBuff, LONG_BLOCK, wnd_shape, timeBuff); /* ch ); */ transBuffPtr = transBuff; timeBuffPtr = timeBuff; /* [ch]; */ destPtr = timeOutPtr; /* idimkovic: reduce loop overhead by unrolling */ for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i) { *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; } /* Save second half as old data */ timeBuffPtr = timeBuff; /* [ch]; */ for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i) { *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; } } else if (blockType == SHORT_TYPE) { /* Do 8 SHORT transforms */ if (hDecoder->dolbyShortOffset_f2t) destPtr = timeBuff + 4 * BLOCK_LEN_SHORT; /* DBS */ else destPtr = timeBuff + (BLOCK_LEN_LONG - BLOCK_LEN_SHORT) / 2; /* 448 */ for (i = 0; i < 8; i++) { unfold (freqInPtr, transBuff, BLOCK_LEN_SHORT ); /*was freqinPtr++, 8 .. mfd */ freqInPtr += BLOCK_LEN_SHORT; /* added mfd */ ITransformBlock (hDecoder, transBuff, SHORT_BLOCK, wnd_shape, timeBuff); /* Add first half of short window and old data */ transBuffPtr = transBuff; for (j = BLOCK_LEN_SHORT/16-1; j >= 0; --j) { *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++; } /* Save second half of short window */ for (j = BLOCK_LEN_SHORT/16-1; j >= 0; --j) { *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; } destPtr -= BLOCK_LEN_SHORT; } /* Copy data to output buffer */ destPtr = timeOutPtr; timeBuffPtr = timeBuff; /* [ch]; */ for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i) { *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; } /* Update timeBuff fifo */ destPtr = timeBuff; /* [ch]; */ for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i) { *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++; } } else if (blockType == START_TYPE) { unfold(freqInPtr, transBuff, BLOCK_LEN_LONG); ITransformBlock (hDecoder, transBuff, START_FLAT_BLOCK, wnd_shape, timeBuff); /* Add first half and old data */ transBuffPtr = transBuff; timeBuffPtr = timeBuff; destPtr = timeOutPtr; for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i) { *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; } /* Save second half as old data */ timeBuffPtr = timeBuff; for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i) { *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; } hDecoder->dolbyShortOffset_f2t = 0; } else if (blockType == STOP_TYPE) { unfold (freqInPtr, transBuff, BLOCK_LEN_LONG); /* Do 1 LONG transforms */ ITransformBlock (hDecoder, transBuff, STOP_FLAT_BLOCK, wnd_shape, timeBuff); /* Add first half and old data */ transBuffPtr = transBuff; timeBuffPtr = timeBuff; destPtr = timeOutPtr; for (i = (BLOCK_LEN_LONG - NFLAT)/16 - 1; i>=0; --i) { *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; *destPtr++ = *transBuffPtr++ + *timeBuffPtr++; } for ( i = NFLAT/16-1; i>=0; --i) { *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++; } /* Save second half as old data */ timeBuffPtr = timeBuff; for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i ) { *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++; } } i=0; do { *(ftimeOutPtr++) = (timeOutPtr[i]); i++; *(ftimeOutPtr++) = (timeOutPtr[i]); i++; *(ftimeOutPtr++) = (timeOutPtr[i]); i++; *(ftimeOutPtr++) = (timeOutPtr[i]); i++; *(ftimeOutPtr++) = (timeOutPtr[i]); i++; *(ftimeOutPtr++) = (timeOutPtr[i]); i++; *(ftimeOutPtr++) = (timeOutPtr[i]); i++; *(ftimeOutPtr++) = (timeOutPtr[i]); i++; } while(i<BLOCK_LEN_LONG); FreeMemory(timeOutPtr); FreeMemory(transBuff); }