178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar/*
278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Copyright (C) 2007-2008 ARM Limited
378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * you may not use this file except in compliance with the License.
678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * You may obtain a copy of the License at
778e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
878e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
978e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
1078e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Unless required by applicable law or agreed to in writing, software
1178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
1278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * See the License for the specific language governing permissions and
1478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * limitations under the License.
1578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
1678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar */
170c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
180c1bc742181ded4930842b46e9507372f0b1b963James Dong *
190c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name:  omxVCM4P2_DecodeBlockCoef_Inter.c
200c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2
210c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision:   9641
220c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date:       Thursday, February 7, 2008
230c1bc742181ded4930842b46e9507372f0b1b963James Dong *
240c1bc742181ded4930842b46e9507372f0b1b963James Dong *
250c1bc742181ded4930842b46e9507372f0b1b963James Dong *
260c1bc742181ded4930842b46e9507372f0b1b963James Dong *
270c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
280c1bc742181ded4930842b46e9507372f0b1b963James Dong * Contains modules for inter reconstruction
290c1bc742181ded4930842b46e9507372f0b1b963James Dong *
300c1bc742181ded4930842b46e9507372f0b1b963James Dong */
310c1bc742181ded4930842b46e9507372f0b1b963James Dong
320c1bc742181ded4930842b46e9507372f0b1b963James Dong
330c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h"
340c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h"
350c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxVC.h"
360c1bc742181ded4930842b46e9507372f0b1b963James Dong
370c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h"
380c1bc742181ded4930842b46e9507372f0b1b963James Dong
390c1bc742181ded4930842b46e9507372f0b1b963James Dong
400c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
410c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: omxVCM4P2_DecodeBlockCoef_Inter
420c1bc742181ded4930842b46e9507372f0b1b963James Dong *
430c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
440c1bc742181ded4930842b46e9507372f0b1b963James Dong * Decodes the INTER block coefficients. Inverse quantization, inversely zigzag
450c1bc742181ded4930842b46e9507372f0b1b963James Dong * positioning and IDCT, with appropriate clipping on each step, are performed
460c1bc742181ded4930842b46e9507372f0b1b963James Dong * on the coefficients. The results (residuals) are placed in a contiguous array
470c1bc742181ded4930842b46e9507372f0b1b963James Dong * of 64 elements. For INTER block, the output buffer holds the residuals for
480c1bc742181ded4930842b46e9507372f0b1b963James Dong * further reconstruction.
490c1bc742181ded4930842b46e9507372f0b1b963James Dong *
500c1bc742181ded4930842b46e9507372f0b1b963James Dong * Remarks:
510c1bc742181ded4930842b46e9507372f0b1b963James Dong *
520c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
530c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	ppBitStream		pointer to the pointer to the current byte in
540c1bc742181ded4930842b46e9507372f0b1b963James Dong *								the bit stream buffer. There is no boundary
550c1bc742181ded4930842b46e9507372f0b1b963James Dong *								check for the bit stream buffer.
560c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pBitOffset		pointer to the bit position in the byte pointed
570c1bc742181ded4930842b46e9507372f0b1b963James Dong *								to by *ppBitStream. *pBitOffset is valid within
580c1bc742181ded4930842b46e9507372f0b1b963James Dong *								[0-7]
590c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	QP				quantization parameter
600c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] shortVideoHeader    a flag indicating presence of short_video_header;
610c1bc742181ded4930842b46e9507372f0b1b963James Dong *                           shortVideoHeader==1 indicates using quantization method defined in short
620c1bc742181ded4930842b46e9507372f0b1b963James Dong *                           video header mode, and shortVideoHeader==0 indicates normail quantization method.
630c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] ppBitStream 	*ppBitStream is updated after the block is decoded, so that it points to the
640c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      current byte in the bit stream buffer.
650c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] pBitOffset		*pBitOffset is updated so that it points to the current bit position in the
660c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      byte pointed by *ppBitStream
670c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] pDst			pointer to the decoded residual buffer (a contiguous array of 64 elements of
680c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      OMX_S16 data type). Must be 16-byte aligned.
690c1bc742181ded4930842b46e9507372f0b1b963James Dong *
700c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value:
710c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr - no error
720c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments
730c1bc742181ded4930842b46e9507372f0b1b963James Dong *   - At least one of the following pointers is Null: ppBitStream, *ppBitStream, pBitOffset , pDst
740c1bc742181ded4930842b46e9507372f0b1b963James Dong *   - At least one of the below case:
750c1bc742181ded4930842b46e9507372f0b1b963James Dong *   - *pBitOffset exceeds [0,7], QP <= 0;
760c1bc742181ded4930842b46e9507372f0b1b963James Dong *	 - pDst not 16-byte aligned
770c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_Err - status error
780c1bc742181ded4930842b46e9507372f0b1b963James Dong *
790c1bc742181ded4930842b46e9507372f0b1b963James Dong */
800c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult omxVCM4P2_DecodeBlockCoef_Inter(
810c1bc742181ded4930842b46e9507372f0b1b963James Dong     const OMX_U8 ** ppBitStream,
820c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_INT * pBitOffset,
830c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_S16 * pDst,
840c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_INT QP,
850c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_INT shortVideoHeader
860c1bc742181ded4930842b46e9507372f0b1b963James Dong)
870c1bc742181ded4930842b46e9507372f0b1b963James Dong{
880c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* 64 elements are needed but to align it to 16 bytes need
890c1bc742181ded4930842b46e9507372f0b1b963James Dong    15 more elements of padding */
900c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_S16 tempBuf[79];
910c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_S16 *pTempBuf1;
920c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMXResult errorCode;
930c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Aligning the local buffers */
940c1bc742181ded4930842b46e9507372f0b1b963James Dong    pTempBuf1 = armAlignTo16Bytes(tempBuf);
950c1bc742181ded4930842b46e9507372f0b1b963James Dong
960c1bc742181ded4930842b46e9507372f0b1b963James Dong
970c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* VLD and zigzag */
980c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P2_DecodeVLCZigzag_Inter(ppBitStream, pBitOffset,
990c1bc742181ded4930842b46e9507372f0b1b963James Dong                                        pTempBuf1,shortVideoHeader);
1000c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
1010c1bc742181ded4930842b46e9507372f0b1b963James Dong
1020c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Dequantization */
1030c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P2_QuantInvInter_I(
1040c1bc742181ded4930842b46e9507372f0b1b963James Dong     pTempBuf1,
1050c1bc742181ded4930842b46e9507372f0b1b963James Dong     QP);
1060c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
1070c1bc742181ded4930842b46e9507372f0b1b963James Dong
1080c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Inverse transform */
1090c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P2_IDCT8x8blk(pTempBuf1, pDst);
1100c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
1110c1bc742181ded4930842b46e9507372f0b1b963James Dong
1120c1bc742181ded4930842b46e9507372f0b1b963James Dong    return OMX_Sts_NoErr;
1130c1bc742181ded4930842b46e9507372f0b1b963James Dong}
1140c1bc742181ded4930842b46e9507372f0b1b963James Dong
1150c1bc742181ded4930842b46e9507372f0b1b963James Dong/* End of file */
1160c1bc742181ded4930842b46e9507372f0b1b963James Dong
1170c1bc742181ded4930842b46e9507372f0b1b963James Dong
118