;//
;// 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:  armVCM4P2_SetPredDir_s.s
;// OpenMAX DL: v1.0.2
;// Revision:   9641
;// Date:       Thursday, February 7, 2008
;// 
;// 
;// 
;//

; **
; * Function: armVCM4P2_SetPredDir
; *
; * Description:
; * Performs detecting the prediction direction
; *
; * Remarks:
; *
; * Parameters:
; * [in] blockIndex  block index indicating the component type and
; *                          position as defined in subclause 6.1.3.8, of ISO/IEC
; *                          14496-2. Furthermore, indexes 6 to 9 indicate the
; *                          alpha blocks spatially corresponding to luminance
; *                          blocks 0 to 3 in the same macroblock.
; * [in] pCoefBufRow pointer to the coefficient row buffer
; * [in] pQpBuf      pointer to the quantization parameter buffer
; * [out]predQP      quantization parameter of the predictor block
; * [out]predDir     indicates the prediction direction which takes one
; *                  of the following values:
; *                  OMX_VC_HORIZONTAL    predict horizontally
; *                  OMX_VC_VERTICAL      predict vertically
; *
; * Return Value:
; * Standard OMXResult result. See enumeration for possible result codes.
; *
; */

       INCLUDE omxtypes_s.h
       INCLUDE armCOMM_s.h
       INCLUDE omxVC_s.h


       M_VARIANTS ARM1136JS


       IF ARM1136JS
 
;// Input Arguments
BlockIndex         RN 0
pCoefBufRow        RN 1
pCoefBufCol        RN 2
predDir            RN 3
predQP             RN 4
pQpBuf             RN 5

;// Local Variables

Return             RN 0
blockDCLeft        RN 6  
blockDCTop         RN 7
blockDCTopLeft     RN 8
temp1              RN 9
temp2              RN 14

       M_START    armVCM4P2_SetPredDir,r9

       M_ARG       ppredQP,4
       M_ARG       ppQpBuf,4
    
       LDRH        blockDCTopLeft,[pCoefBufRow,#-16]
       LDRH        blockDCLeft,[pCoefBufCol]
       
       TEQ         BlockIndex,#3
       LDREQH      blockDCTop,[pCoefBufCol,#-16]
       LDRNEH      blockDCTop,[pCoefBufRow]
             
       SUBS        temp1,blockDCLeft,blockDCTopLeft
       RSBLT       temp1,temp1,#0
       SUBS        temp2,blockDCTopLeft,blockDCTop
       RSBLT       temp2,temp2,#0
      
       M_LDR       pQpBuf,ppQpBuf
       M_LDR       predQP,ppredQP
       CMP         temp1,temp2
       MOV         temp2,#OMX_VC_VERTICAL
       LDRLTB      temp1,[pQpBuf,#1]
       STRLT       temp2,[predDir]
       STRLT       temp1,[predQP]
       MOV         temp2,#OMX_VC_HORIZONTAL           
       LDRGEB      temp1,[pQpBuf]
       STRGE       temp2,[predDir]
       MOV         Return,#OMX_Sts_NoErr
       STRGE       temp1,[predQP] 

         
    
       M_END
 
       ENDIF

       END    
    
