Home | History | Annotate | Download | only in src
      1 ;//
      2 ;// Copyright (C) 2007-2008 ARM Limited
      3 ;//
      4 ;// Licensed under the Apache License, Version 2.0 (the "License");
      5 ;// you may not use this file except in compliance with the License.
      6 ;// You may obtain a copy of the License at
      7 ;//
      8 ;//      http://www.apache.org/licenses/LICENSE-2.0
      9 ;//
     10 ;// Unless required by applicable law or agreed to in writing, software
     11 ;// distributed under the License is distributed on an "AS IS" BASIS,
     12 ;// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 ;// See the License for the specific language governing permissions and
     14 ;// limitations under the License.
     15 ;//
     16 ;/**
     17 ; *
     18 ; * File Name:  armVCM4P2_DecodeVLCZigzag_AC_unsafe_s.s
     19 ; * OpenMAX DL: v1.0.2
     20 ; * Revision:   12290
     21 ; * Date:       Wednesday, April 9, 2008
     22 ; *
     23 ; *
     24 ; *
     25 ; *
     26 ; * Description:
     27 ; * Contains modules for zigzag scanning and VLC decoding
     28 ; * for inter, intra block.
     29 ; *
     30 ; *
     31 ; *
     32 ; * Function: omxVCM4P2_DecodeVLCZigzag_AC_unsafe
     33 ; *
     34 ; * Description:
     35 ; * Performs VLC decoding and inverse zigzag scan
     36 ; *
     37 ; *
     38 ; *
     39 ; *
     40 ; */
     41 
     42 
     43       INCLUDE omxtypes_s.h
     44       INCLUDE armCOMM_s.h
     45       INCLUDE armCOMM_BitDec_s.h
     46 
     47 
     48       M_VARIANTS ARM1136JS
     49 
     50 
     51 
     52 
     53 
     54      IF ARM1136JS
     55 
     56 
     57 
     58 
     59 
     60 ;//Input Arguments
     61 
     62 ppBitStream          RN 0
     63 pBitOffset           RN 1
     64 pDst                 RN 2
     65 shortVideoHeader     RN 3
     66 
     67 
     68 ;//Local Variables
     69 
     70 Return               RN 0
     71 
     72 pVlcTableL0L1        RN 4
     73 pLMAXTableL0L1       RN 4
     74 pRMAXTableL0L1       RN 4
     75 pZigzagTable         RN 4
     76 
     77 ftype                RN 0
     78 temp3                RN 4
     79 temp                 RN 5
     80 Count                RN 6
     81 Escape               RN 5
     82 
     83 ;// armVCM4P2_FillVLDBuffer
     84 zigzag               RN 0
     85 storeLevel           RN 1
     86 temp2                RN 4
     87 temp1                RN 5
     88 sign                 RN 5
     89 Last                 RN 7
     90 storeRun             RN 14
     91 
     92 
     93 packRetIndex         RN 5
     94 
     95 
     96 markerbit            RN 5
     97 
     98 ;// Scratch Registers
     99 
    100 RBitStream           RN 8
    101 RBitBuffer           RN 9
    102 RBitCount            RN 10
    103 
    104 T1                   RN 11
    105 T2                   RN 12
    106 LR                   RN 14
    107 
    108 
    109 
    110         M_ALLOC4        pppBitStream,4
    111         M_ALLOC4        ppOffset,4
    112         M_ALLOC4        pLinkRegister,4
    113 
    114         M_START armVCM4P2_DecodeVLCZigzag_AC_unsafe
    115 
    116         ;// get the table addresses from stack
    117         M_ARG           ppVlcTableL0L1,4
    118         M_ARG           ppLMAXTableL0L1,4
    119         M_ARG           ppRMAXTableL0L1,4
    120         M_ARG           ppZigzagTable,4
    121 
    122         ;// Store ALL zeros at pDst
    123 
    124         MOV             temp1,#0                                        ;// Initialize Count to zero
    125         MOV             Last,#0
    126         M_STR           LR,pLinkRegister                                ;// Store Link Register on Stack
    127         MOV             temp2,#0
    128         MOV             LR,#0
    129 
    130         ;// Initialize the Macro and Store all zeros to pDst
    131 
    132         STM             pDst!,{temp2,temp1,Last,LR}
    133         M_BD_INIT0      ppBitStream, pBitOffset, RBitStream, RBitBuffer, RBitCount
    134         STM             pDst!,{temp2,temp1,Last,LR}
    135         M_BD_INIT1      T1, T2, T2
    136         STM             pDst!,{temp2,temp1,Last,LR}
    137         M_BD_INIT2      T1, T2, T2
    138         STM             pDst!,{temp2,temp1,Last,LR}
    139         M_STR           ppBitStream,pppBitStream                        ;// Store ppBitstream on stack
    140         STM             pDst!,{temp2,temp1,Last,LR}
    141         M_STR           pBitOffset,ppOffset                             ;// Store pBitOffset on stack
    142         STM             pDst!,{temp2,temp1,Last,LR}
    143 
    144         STM             pDst!,{temp2,temp1,Last,LR}
    145         STM             pDst!,{temp2,temp1,Last,LR}
    146 
    147 
    148         SUB             pDst,pDst,#128                                  ;// Restore pDst
    149 
    150         ;// The armVCM4P2_GetVLCBits begins
    151 
    152 getVLCbits
    153 
    154         M_BD_LOOK8      Escape,7                                        ;// Load Escape Value
    155         LSR             Escape,Escape,#25
    156         CMP             Escape,#3                                       ;// check for escape mode
    157         MOVNE           ftype,#0
    158         BNE             notEscapemode                                   ;// Branch if not in Escape mode 3
    159 
    160         M_BD_VSKIP8     #7,T1
    161         CMP             shortVideoHeader,#0                             ;// Check shortVideoHeader flag to know the type of Escape mode
    162         BEQ             endFillVLD
    163 
    164         ;// Escape Mode 4
    165 
    166         M_BD_READ8      Last,1,T1
    167         M_BD_READ8      storeRun,6,T1
    168         M_BD_READ8      storeLevel,8,T1
    169 
    170 
    171         ;// Check whether the Reserved values for Level are used and Exit with an Error Message if it is so
    172 
    173         TEQ             storeLevel,#0
    174         TEQNE           storeLevel,#128
    175         BEQ             ExitError
    176 
    177         ADD             temp2,storeRun,Count
    178         CMP             temp2,#64
    179         BGE             ExitError                                       ;// error if Count+storeRun >= 64
    180 
    181 
    182         ;// Load address of zigzagTable
    183 
    184         M_LDR           pZigzagTable,ppZigzagTable                      ;// Loading the Address of Zigzag table
    185 
    186 
    187         ;// armVCM4P2_FillVLDBuffer
    188 
    189         SXTB            storeLevel,storeLevel                           ;// Sign Extend storeLevel to 32 bits
    190 
    191 
    192         ;// To Reflect Runlength
    193 
    194         ADD             Count,Count,storeRun
    195         LDRB            zigzag,[pZigzagTable,Count]
    196         ADD             Count,Count,#1
    197         STRH            storeLevel,[pDst,zigzag]                        ;// store Level
    198 
    199         B               ExitOk
    200 
    201 
    202 
    203 endFillVLD
    204 
    205 
    206         ;// Load Ftype( Escape Mode) value based on the two successive bits in the bitstream
    207 
    208         M_BD_READ8      temp1,1,T1
    209         CMP             temp1,#0
    210         MOVEQ           ftype,#1
    211         BEQ             notEscapemode
    212         M_BD_READ8      temp1,1,T1
    213         CMP             temp1,#1
    214         MOVEQ           ftype,#3
    215         MOVNE           ftype,#2
    216 
    217 
    218 notEscapemode
    219 
    220         ;// Load optimized packed VLC table with last=0 and Last=1
    221 
    222         M_LDR           pVlcTableL0L1,ppVlcTableL0L1                    ;// Load Combined VLC Table
    223 
    224 
    225         CMP             ftype,#3                                        ;// If ftype >=3 get perform Fixed Length Decoding (Escape Mode 3)
    226         BGE             EscapeMode3                                     ;// Else continue normal VLC Decoding
    227 
    228         ;// Variable lengh decoding, "armUnPackVLC32"
    229 
    230 
    231         M_BD_VLD        packRetIndex,T1,T2,pVlcTableL0L1,4,2
    232 
    233 
    234         LDR             temp3,=0xFFF
    235 
    236         CMP             packRetIndex,temp3                              ;// Check for invalid symbol
    237         BEQ             ExitError                                       ;// if invalid symbol occurs exit with an error message
    238 
    239         AND             Last,packRetIndex,#2                            ;// Get Last from packed Index
    240 
    241 
    242 
    243 
    244         LSR             storeRun,packRetIndex,#7                        ;// Get Run Value from Packed index
    245         AND             storeLevel,packRetIndex,#0x7c                   ;// storeLevel=packRetIndex[2-6],storeLevel[0-1]=0
    246 
    247 
    248         M_LDR           pLMAXTableL0L1,ppLMAXTableL0L1                  ;// Load LMAX table
    249 
    250 
    251         LSR             storeLevel,storeLevel,#2                        ;// Level value
    252 
    253         CMP             ftype,#1
    254         BNE             ftype2
    255 
    256         ;// ftype==1; Escape mode =1
    257 
    258 
    259         ADD            temp1, pLMAXTableL0L1, Last, LSL#4              ;// If the Last=1 add 32 to table address
    260         LDRB            temp1,[temp1,storeRun]
    261 
    262 
    263         ADD             storeLevel,temp1,storeLevel
    264 
    265 ftype2
    266 
    267         ;// ftype =2; Escape mode =2
    268 
    269         M_LDR           pRMAXTableL0L1,ppRMAXTableL0L1                  ;// Load RMAX Table
    270 
    271         CMP             ftype,#2
    272         BNE             FillVLDL1
    273 
    274         ADD            temp1, pRMAXTableL0L1, Last, LSL#4               ;// If Last=1 add 32 to table address
    275         SUB             temp2,storeLevel,#1
    276         LDRB            temp1,[temp1,temp2]
    277 
    278 
    279         ADD             storeRun,storeRun,#1
    280         ADD             storeRun,temp1
    281 
    282 FillVLDL1
    283 
    284 
    285         ;// armVCM4P2_FillVLDBuffer
    286 
    287         M_LDR           pZigzagTable,ppZigzagTable                     ;// Load address of zigzagTable
    288 
    289         M_BD_READ8      sign,1,T1
    290 
    291         CMP             sign,#1
    292         RSBEQ           storeLevel,storeLevel,#0
    293 
    294         ADD             temp1,storeRun,Count                           ;// Exit with an error message if Run + Count exceeds 63
    295         CMP             temp1,#64
    296         BGE             ExitError
    297 
    298 
    299 
    300 
    301 
    302 
    303         ;// To Reflect Runlenght
    304 
    305         ADD             Count,Count,storeRun
    306 
    307 storeLevelL1
    308 
    309         LDRB            zigzag,[pZigzagTable,Count]
    310         CMP             Last,#2                                         ;// Check if the Level val is Last non zero val
    311         ADD             Count,Count,#1
    312         LSR             Last,Last,#1
    313         STRH            storeLevel,[pDst,zigzag]
    314 
    315         BNE             end
    316 
    317         B               ExitOk
    318 
    319 
    320 
    321         ;// Fixed Lengh Decoding Escape Mode 3
    322 
    323 EscapeMode3
    324 
    325         M_BD_READ8      Last,1,T1
    326         M_BD_READ8      storeRun,6,T1
    327 
    328         ADD             temp2,storeRun,Count                            ;// Exit with an error message if Run + Count exceeds 63
    329         CMP             temp2,#64
    330         BGE             ExitError
    331 
    332         M_BD_READ8      markerbit,1,T1
    333         TEQ             markerbit,#0                                    ;// Exit with an error message if marker bit is zero
    334         BEQ             ExitError
    335 
    336         M_BD_READ16     storeLevel,12,T1
    337 
    338         TST             storeLevel,#0x800                               ;// test if the level is negative
    339         SUBNE           storeLevel,storeLevel,#4096
    340         CMP             storeLevel,#0
    341         CMPNE           storeLevel,#-2048
    342         BEQ             ExitError                                       ;// Exit with an error message if Level==0 or  -2048
    343 
    344         M_LDR           pZigzagTable,ppZigzagTable                      ;// Load address of zigzagTable
    345 
    346         M_BD_READ8      markerbit,1,T1
    347 
    348 
    349         ;// armVCM4P2_FillVLDBuffer ( Sign not used as storeLevel is preprocessed)
    350 
    351 
    352 
    353         ;// To Reflect Run Length
    354 
    355         ADD             Count,Count,storeRun
    356 
    357 
    358 
    359 storeLevelLast
    360 
    361         LDRB            zigzag,[pZigzagTable,Count]
    362         CMP             Last,#1
    363         ADD             Count,Count,#1
    364         STRH            storeLevel,[pDst,zigzag]
    365 
    366         BNE             end
    367 
    368         B               ExitOk
    369 
    370 end
    371 
    372         CMP             Count,#64                                       ;//Run the Loop untill Count reaches 64
    373 
    374         BLT             getVLCbits
    375 
    376 
    377 ExitOk
    378         ;// Exit When VLC Decoding is done Successfully
    379 
    380         ;// Loading ppBitStream and pBitOffset from stack
    381 
    382         CMP             Last,#1
    383         M_LDR           ppBitStream,pppBitStream
    384         M_LDR           pBitOffset,ppOffset
    385 
    386         ;//Ending the macro
    387 
    388         M_BD_FINI       ppBitStream,pBitOffset
    389 
    390         MOVEQ           Return,#OMX_Sts_NoErr
    391         MOVNE           Return,#OMX_Sts_Err
    392         M_LDR           LR,pLinkRegister                               ;// Load the Link Register Back
    393         B               exit2
    394 
    395 ExitError
    396         ;// Exit When an Error occurs
    397 
    398         M_LDR           ppBitStream,pppBitStream
    399         M_LDR           pBitOffset,ppOffset
    400         ;//Ending the macro
    401 
    402         M_BD_FINI       ppBitStream,pBitOffset
    403         M_LDR           LR,pLinkRegister
    404         MOV             Return,#OMX_Sts_Err
    405 
    406 exit2
    407 
    408 
    409         M_END
    410         ENDIF
    411 
    412         END
    413