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