;// ;// Copyright (C) 2007-2008 ARM Limited ;// ;// Licensed under the Apache License, Version 2.0 (the "License"); ;// you may not use this file except in compliance with the License. ;// You may obtain a copy of the License at ;// ;// http://www.apache.org/licenses/LICENSE-2.0 ;// ;// Unless required by applicable law or agreed to in writing, software ;// distributed under the License is distributed on an "AS IS" BASIS, ;// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ;// See the License for the specific language governing permissions and ;// limitations under the License. ;// ; ********** ; * ; * File Name: omxVCM4P2_DecodePadMV_PVOP_s.s ; * OpenMAX DL: v1.0.2 ; * Revision: 12290 ; * Date: Wednesday, April 9, 2008 ; * ; * ; * ; * ; ** ; * Function: omxVCM4P2_DecodePadMV_PVOP ; * ; * Description: ; * Decodes and pads four motion vectors of the non-intra macroblock in P-VOP. ; * The motion vector padding process is specified in subclause 7.6.1.6 of ; * ISO/IEC 14496-2. ; * ; * Remarks: ; * ; * ; * Parameters: ; * [in] ppBitStream pointer to the pointer to the current byte in ; * the bit stream buffer ; * [in] pBitOffset pointer to the bit position in the byte pointed ; * to by *ppBitStream. *pBitOffset is valid within ; * [0-7]. ; * [in] pSrcMVLeftMB pointers to the motion vector buffers of the ; * macroblocks specially at the left side of the current macroblock ; * respectively. ; * [in] pSrcMVUpperMB pointers to the motion vector buffers of the ; * macroblocks specially at the upper side of the current macroblock ; * respectively. ; * [in] pSrcMVUpperRightMB pointers to the motion vector buffers of the ; * macroblocks specially at the upper-right side of the current macroblock ; * respectively. ; * [in] fcodeForward a code equal to vop_fcode_forward in MPEG-4 ; * bit stream syntax ; * [in] MBType the type of the current macroblock. If MBType ; * is not equal to OMX_VC_INTER4V, the destination ; * motion vector buffer is still filled with the ; * same decoded vector. ; * [out] ppBitStream *ppBitStream is updated after the block is decoded, ; * so that it points to the current byte in the bit ; * stream buffer ; * [out] pBitOffset *pBitOffset is updated so that it points to the ; * current bit position in the byte pointed by ; * *ppBitStream ; * [out] pDstMVCurMB pointer to the motion vector buffer of the current ; * macroblock which contains four decoded motion vectors ; * ; * Return Value: ; * OMX_Sts_NoErr -no error ; * ; * ; * OMX_Sts_Err - status error ; * ; * INCLUDE omxtypes_s.h INCLUDE armCOMM_s.h INCLUDE armCOMM_BitDec_s.h INCLUDE omxVC_s.h M_VARIANTS ARM1136JS IF ARM1136JS ;//Input Arguments ppBitStream RN 0 pBitOffset RN 1 pSrcMVLeftMB RN 2 pSrcMVUpperMB RN 3 pSrcMVUpperRightMB RN 4 pDstMVCurMB RN 5 fcodeForward RN 6 MBType RN 7 ;//Local Variables zero RN 4 one RN 4 scaleFactor RN 1 Return RN 0 VlcMVD RN 0 index RN 4 Count RN 7 mvHorData RN 4 mvHorResidual RN 0 mvVerData RN 4 mvVerResidual RN 0 temp RN 1 temp1 RN 3 High RN 4 Low RN 2 Range RN 1 BlkCount RN 14 diffMVdx RN 0 diffMVdy RN 1 ;// Scratch Registers RBitStream RN 8 RBitCount RN 9 RBitBuffer RN 10 T1 RN 11 T2 RN 12 LR RN 14 IMPORT armVCM4P2_aVlcMVD IMPORT omxVCM4P2_FindMVpred ;// Allocate stack memory M_ALLOC4 ppDstMVCurMB,4 M_ALLOC4 pDstMVPredME,4 M_ALLOC4 pBlkCount,4 M_ALLOC4 pppBitStream,4 M_ALLOC4 ppBitOffset,4 M_ALLOC4 ppSrcMVLeftMB,4 M_ALLOC4 ppSrcMVUpperMB,4 M_ALLOC4 pdiffMVdx,4 M_ALLOC4 pdiffMVdy,4 M_ALLOC4 pHigh,4 M_START omxVCM4P2_DecodePadMV_PVOP,r11 M_ARG pSrcMVUpperRightMBonStack,4 ;// pointer to pSrcMVUpperRightMB on stack M_ARG pDstMVCurMBonStack,4 ;// pointer to pDstMVCurMB on stack M_ARG fcodeForwardonStack,4 ;// pointer to fcodeForward on stack M_ARG MBTypeonStack,4 ;// pointer to MBType on stack ;// Initializing the BitStream Macro M_BD_INIT0 ppBitStream, pBitOffset, RBitStream, RBitBuffer, RBitCount M_LDR MBType,MBTypeonStack ;// Load MBType from stack M_LDR pDstMVCurMB,pDstMVCurMBonStack ;// Load pDstMVCurMB from stack MOV zero,#0 TEQ MBType,#OMX_VC_INTRA ;// Check if MBType=OMX_VC_INTRA TEQNE MBType,#OMX_VC_INTRA_Q ;// check if MBType=OMX_VC_INTRA_Q STREQ zero,[pDstMVCurMB] M_BD_INIT1 T1, T2, T2 STREQ zero,[pDstMVCurMB,#4] M_BD_INIT2 T1, T2, T2 STREQ zero,[pDstMVCurMB,#4] MOVEQ Return,#OMX_Sts_NoErr MOV BlkCount,#0 STREQ zero,[pDstMVCurMB,#4] BEQ ExitOK TEQ MBType,#OMX_VC_INTER4V ;// Check if MBType=OMX_VC_INTER4V TEQNE MBType,#OMX_VC_INTER4V_Q ;// Check if MBType=OMX_VC_INTER4V_Q MOVEQ Count,#4 TEQ MBType,#OMX_VC_INTER ;// Check if MBType=OMX_VC_INTER TEQNE MBType,#OMX_VC_INTER_Q ;// Check if MBType=OMX_VC_INTER_Q MOVEQ Count,#1 M_LDR fcodeForward,fcodeForwardonStack ;// Load fcodeForward from stack ;// Storing the values temporarily on stack M_STR ppBitStream,pppBitStream M_STR pBitOffset,ppBitOffset SUB temp,fcodeForward,#1 ;// temp=fcodeForward-1 MOV one,#1 M_STR pSrcMVLeftMB,ppSrcMVLeftMB LSL scaleFactor,one,temp ;// scaleFactor=1<<(fcodeForward-1) M_STR pSrcMVUpperMB,ppSrcMVUpperMB LSL scaleFactor,scaleFactor,#5 M_STR scaleFactor,pHigh ;// [pHigh]=32*scaleFactor ;// VLD Decoding Loop LDR VlcMVD, =armVCM4P2_aVlcMVD ;// Load the optimized MVD VLC table ;// Horizontal Data and Residual calculation LDR temp,=0xFFF M_BD_VLD index,T1,T2,VlcMVD,3,2 ;// variable lenght decoding using the macro TEQ index,temp BEQ ExitError ;// Exit with an Error Message if the decoded symbol is an invalied symbol SUB mvHorData,index,#32 ;// mvHorData=index-32 MOV mvHorResidual,#1 ;// mvHorResidual=1 CMP fcodeForward,#1 TEQNE mvHorData,#0 MOVEQ diffMVdx,mvHorData ;// if scaleFactor=1(fcodeForward=1) or mvHorData=0 diffMVdx=mvHorData BEQ VerticalData SUB temp,fcodeForward,#1 M_BD_VREAD8 mvHorResidual,temp,T1,T2 ;// get mvHorResidual from bitstream if fcodeForward>1 and mvHorData!=0 CMP mvHorData,#0 RSBLT mvHorData,mvHorData,#0 ;// mvHorData=abs(mvHorData) SUB mvHorResidual,mvHorResidual,fcodeForward SMLABB diffMVdx,mvHorData,fcodeForward,mvHorResidual ;// diffMVdx=abs(mvHorData)*fcodeForward+mvHorResidual-fcodeForward ADD diffMVdx,diffMVdx,#1 RSBLT diffMVdx,diffMVdx,#0 ;// Vertical Data and Residual calculation VerticalData M_STR diffMVdx,pdiffMVdx ;// Store the diffMVdx on stack LDR VlcMVD, =armVCM4P2_aVlcMVD ;// Loading the address of optimized VLC tables LDR temp,=0xFFF M_BD_VLD index,T1,T2,VlcMVD,3,2 ;// VLC decoding using the macro TEQ index,temp BEQ ExitError ;// Exit with an Error Message if an Invalied Symbol occurs SUB mvVerData,index,#32 ;// mvVerData=index-32 MOV mvVerResidual,#1 CMP fcodeForward,#1 TEQNE mvVerData,#0 MOVEQ diffMVdy,mvVerData ;// diffMVdy = mvVerData if scaleFactor=1(fcodeForward=1) or mvVerData=0 BEQ FindMVPred SUB temp,fcodeForward,#1 M_BD_VREAD8 mvVerResidual,temp,T1,T2 ;// Get mvVerResidual from bit stream if fcodeForward>1 and mnVerData!=0 CMP mvVerData,#0 RSBLT mvVerData,mvVerData,#0 SUB mvVerResidual,mvVerResidual,fcodeForward SMLABB diffMVdy,mvVerData,fcodeForward,mvVerResidual ;// diffMVdy=abs(mvVerData)*fcodeForward+mvVerResidual-fcodeForward ADD diffMVdy,diffMVdy,#1 RSBLT diffMVdy,diffMVdy,#0 ;//Calling the Function omxVCM4P2_FindMVpred FindMVPred M_STR diffMVdy,pdiffMVdy ADD temp,pDstMVCurMB,BlkCount,LSL #2 ;// temp=pDstMVCurMB[BlkCount] M_STR temp,ppDstMVCurMB ;// store temp on stack for passing as an argument to FindMVPred MOV temp,#0 M_STR temp,pDstMVPredME ;// Pass pDstMVPredME=NULL as an argument M_STR BlkCount,pBlkCount ;// Passs BlkCount as Argument through stack MOV temp,pSrcMVLeftMB ;// temp (RN 1)=pSrcMVLeftMB M_LDR pSrcMVUpperRightMB,pSrcMVUpperRightMBonStack MOV pSrcMVLeftMB,pSrcMVUpperMB ;// pSrcMVLeftMB ( RN 2) = pSrcMVUpperMB MOV ppBitStream,pDstMVCurMB ;// ppBitStream ( RN 0) = pDstMVCurMB MOV pSrcMVUpperMB,pSrcMVUpperRightMB ;// pSrcMVUpperMB( RN 3) = pSrcMVUpperRightMB BL omxVCM4P2_FindMVpred ;// Branch to subroutine omxVCM4P2_FindMVpred ;// Store Horizontal Motion Vector M_LDR BlkCount,pBlkCount ;// Load BlkCount from stack M_LDR High,pHigh ;// High=32*scaleFactor LSL temp1,BlkCount,#2 ;// temp=BlkCount*4 M_LDR diffMVdx,pdiffMVdx ;// Laad diffMVdx LDRSH temp,[pDstMVCurMB,temp1] ;// temp=pDstMVCurMB[BlkCount] RSB Low,High,#0 ;// Low = -32*scaleFactor ADD diffMVdx,temp,diffMVdx ;// diffMVdx=pDstMVCurMB[BlkCount]+diffMVdx ADD Range,High,High ;// Range=64*ScaleFactor SUB High,High,#1 ;// High= 32*scaleFactor-1 CMP diffMVdx,Low ;// If diffMVdx High diffMVdx-=Range STRH diffMVdx,[pDstMVCurMB,temp1] ;// Store Vertical ADD temp1,temp1,#2 ;// temp1=4*BlkCount+2 M_LDR diffMVdx,pdiffMVdy ;// Laad diffMVdy LDRSH temp,[pDstMVCurMB,temp1] ;// temp=pDstMVCurMB[BlkCount].diffMVdy ADD BlkCount,BlkCount,#1 ;// BlkCount=BlkCount+1 ADD diffMVdx,temp,diffMVdx CMP diffMVdx,Low ADDLT diffMVdx,diffMVdx,Range ;// If diffMVdy High diffMVdy-=Range STRH diffMVdx,[pDstMVCurMB,temp1] CMP BlkCount,Count M_LDR pSrcMVLeftMB,ppSrcMVLeftMB M_LDR pSrcMVUpperMB,ppSrcMVUpperMB BLT Loop ;// If BlkCount