Exemplo n.º 1
0
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);
			}
		}
	}
}
Exemplo n.º 2
0
/*****************************************************************************
*
*   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);
}