10c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
20c1bc742181ded4930842b46e9507372f0b1b963James Dong *
30c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name:  omxVCM4P2_DecodeBlockCoef_Inter.c
40c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2
50c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision:   9641
60c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date:       Thursday, February 7, 2008
70c1bc742181ded4930842b46e9507372f0b1b963James Dong *
80c1bc742181ded4930842b46e9507372f0b1b963James Dong * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
90c1bc742181ded4930842b46e9507372f0b1b963James Dong *
100c1bc742181ded4930842b46e9507372f0b1b963James Dong *
110c1bc742181ded4930842b46e9507372f0b1b963James Dong *
120c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
130c1bc742181ded4930842b46e9507372f0b1b963James Dong * Contains modules for inter reconstruction
140c1bc742181ded4930842b46e9507372f0b1b963James Dong *
150c1bc742181ded4930842b46e9507372f0b1b963James Dong */
160c1bc742181ded4930842b46e9507372f0b1b963James Dong
170c1bc742181ded4930842b46e9507372f0b1b963James Dong
180c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h"
190c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h"
200c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxVC.h"
210c1bc742181ded4930842b46e9507372f0b1b963James Dong
220c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h"
230c1bc742181ded4930842b46e9507372f0b1b963James Dong
240c1bc742181ded4930842b46e9507372f0b1b963James Dong
250c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
260c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: omxVCM4P2_DecodeBlockCoef_Inter
270c1bc742181ded4930842b46e9507372f0b1b963James Dong *
280c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
290c1bc742181ded4930842b46e9507372f0b1b963James Dong * Decodes the INTER block coefficients. Inverse quantization, inversely zigzag
300c1bc742181ded4930842b46e9507372f0b1b963James Dong * positioning and IDCT, with appropriate clipping on each step, are performed
310c1bc742181ded4930842b46e9507372f0b1b963James Dong * on the coefficients. The results (residuals) are placed in a contiguous array
320c1bc742181ded4930842b46e9507372f0b1b963James Dong * of 64 elements. For INTER block, the output buffer holds the residuals for
330c1bc742181ded4930842b46e9507372f0b1b963James Dong * further reconstruction.
340c1bc742181ded4930842b46e9507372f0b1b963James Dong *
350c1bc742181ded4930842b46e9507372f0b1b963James Dong * Remarks:
360c1bc742181ded4930842b46e9507372f0b1b963James Dong *
370c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
380c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	ppBitStream		pointer to the pointer to the current byte in
390c1bc742181ded4930842b46e9507372f0b1b963James Dong *								the bit stream buffer. There is no boundary
400c1bc742181ded4930842b46e9507372f0b1b963James Dong *								check for the bit stream buffer.
410c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pBitOffset		pointer to the bit position in the byte pointed
420c1bc742181ded4930842b46e9507372f0b1b963James Dong *								to by *ppBitStream. *pBitOffset is valid within
430c1bc742181ded4930842b46e9507372f0b1b963James Dong *								[0-7]
440c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	QP				quantization parameter
450c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] shortVideoHeader    a flag indicating presence of short_video_header;
460c1bc742181ded4930842b46e9507372f0b1b963James Dong *                           shortVideoHeader==1 indicates using quantization method defined in short
470c1bc742181ded4930842b46e9507372f0b1b963James Dong *                           video header mode, and shortVideoHeader==0 indicates normail quantization method.
480c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] ppBitStream 	*ppBitStream is updated after the block is decoded, so that it points to the
490c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      current byte in the bit stream buffer.
500c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] pBitOffset		*pBitOffset is updated so that it points to the current bit position in the
510c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      byte pointed by *ppBitStream
520c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] pDst			pointer to the decoded residual buffer (a contiguous array of 64 elements of
530c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      OMX_S16 data type). Must be 16-byte aligned.
540c1bc742181ded4930842b46e9507372f0b1b963James Dong *
550c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value:
560c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr - no error
570c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments
580c1bc742181ded4930842b46e9507372f0b1b963James Dong *   - At least one of the following pointers is Null: ppBitStream, *ppBitStream, pBitOffset , pDst
590c1bc742181ded4930842b46e9507372f0b1b963James Dong *   - At least one of the below case:
600c1bc742181ded4930842b46e9507372f0b1b963James Dong *   - *pBitOffset exceeds [0,7], QP <= 0;
610c1bc742181ded4930842b46e9507372f0b1b963James Dong *	 - pDst not 16-byte aligned
620c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_Err - status error
630c1bc742181ded4930842b46e9507372f0b1b963James Dong *
640c1bc742181ded4930842b46e9507372f0b1b963James Dong */
650c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult omxVCM4P2_DecodeBlockCoef_Inter(
660c1bc742181ded4930842b46e9507372f0b1b963James Dong     const OMX_U8 ** ppBitStream,
670c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_INT * pBitOffset,
680c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_S16 * pDst,
690c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_INT QP,
700c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_INT shortVideoHeader
710c1bc742181ded4930842b46e9507372f0b1b963James Dong)
720c1bc742181ded4930842b46e9507372f0b1b963James Dong{
730c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* 64 elements are needed but to align it to 16 bytes need
740c1bc742181ded4930842b46e9507372f0b1b963James Dong    15 more elements of padding */
750c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_S16 tempBuf[79];
760c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_S16 *pTempBuf1;
770c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMXResult errorCode;
780c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Aligning the local buffers */
790c1bc742181ded4930842b46e9507372f0b1b963James Dong    pTempBuf1 = armAlignTo16Bytes(tempBuf);
800c1bc742181ded4930842b46e9507372f0b1b963James Dong
810c1bc742181ded4930842b46e9507372f0b1b963James Dong
820c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* VLD and zigzag */
830c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P2_DecodeVLCZigzag_Inter(ppBitStream, pBitOffset,
840c1bc742181ded4930842b46e9507372f0b1b963James Dong                                        pTempBuf1,shortVideoHeader);
850c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
860c1bc742181ded4930842b46e9507372f0b1b963James Dong
870c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Dequantization */
880c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P2_QuantInvInter_I(
890c1bc742181ded4930842b46e9507372f0b1b963James Dong     pTempBuf1,
900c1bc742181ded4930842b46e9507372f0b1b963James Dong     QP);
910c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
920c1bc742181ded4930842b46e9507372f0b1b963James Dong
930c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Inverse transform */
940c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P2_IDCT8x8blk(pTempBuf1, pDst);
950c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
960c1bc742181ded4930842b46e9507372f0b1b963James Dong
970c1bc742181ded4930842b46e9507372f0b1b963James Dong    return OMX_Sts_NoErr;
980c1bc742181ded4930842b46e9507372f0b1b963James Dong}
990c1bc742181ded4930842b46e9507372f0b1b963James Dong
1000c1bc742181ded4930842b46e9507372f0b1b963James Dong/* End of file */
1010c1bc742181ded4930842b46e9507372f0b1b963James Dong
1020c1bc742181ded4930842b46e9507372f0b1b963James Dong
103