⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 idct01.s

📁 代码实现了基于ARM7的MPEG-4视频解码器
💻 S
字号:
;//************************************
;//File Name:  idct.s
;//Author:     Anna
;//Date:
;//************************************
C2  EQU  118
C4  EQU  91
C6  EQU  49
Q   EQU  69
R   EQU  167
;//quantizer EQU 1
;//q_scale EQU 1
q_2scale EQU 2
q_add EQU 1 


  AREA  IDCT,CODE,READONLY
  EXPORT  AAN_INT
  CODE32
  
AAN_INT    
    ;//vertical idct
    LDR R12,=quant_idct_matrix
    MOV R1,#8
LOOP1
    LDRSH R2,[R0] ;//dct_buf[0][j]
    LDR R11,[R12] ;//read the number_value of the matrix 
    
    B VER_IDCT
RE_VER
    LDRSH R2,[R0,#2]!  ;// the first address move to the next number
    LDR R11,[R12,#4]!  ;//the first address move to the next number
    
    SUBS R1,R1,#1
    BNE LOOP1 
    ;//horizontal idct
    MOV R1,#8
    MOV R3,#16
    SUB R0,R0,R3
LOOP2
    LDRSH R2,[R0] ;//dct_buf[j][0]
    B HOR_IDCT
RE_HOR
    LDRSH R2,[R0,#16]!
    SUBS R1,R1,#1
    BNE LOOP2
    
     MOV PC,LR    ;//return
    
VER_IDCT
    LDR R10,=q_2scale
    LDR R9,=q_add
    CMP R1,#8
    BNE ac_iquant
    MUL R2,R11,R2    ;//dc iquant
    MOV R2,R2,ASR#12 
    B read_buf1
ac_iquant
    ;//LDR R3,=q_2scale
   ;//LDR R4,=q_add
    CMP R2,#0
    BGT coef0_hi_zero
    RSB R2,R2,#0
    MLA R2,R10,R2,R9
    MUL R2,R11,R2
    MOV R2,R2,ASR#12
    RSB R2,R2,#0
    B  read_buf1
coef0_hi_zero
    MLA R2,R10,R2,R9
    MUL R2,R11,R2
    MOV R2,R2,ASR#12
        
read_buf1              
    LDRSH R3,[R0,#16]  ;//dct_buf[1][j]
    LDR R11,[R12,#32]
    ;//LDR R4,=q_2scale
    ;// LDR R5,=q_add
    CMP R3,#0
    BGT coef1_hi_zero
    RSB R3,R3,#0
    MLA R3,R10,R3,R9
    MUL R3,R11,R3
    MOV R3,R3,ASR#12
    RSB R3,R3,#0
    B read_buf2
coef1_hi_zero
    MLA R3,R10,R3,R9
    MUL R3,R11,R3
    MOV R3,R3,ASR#12
    
read_buf2        
    LDRSH R4,[R0,#32]  ;//dct_buf[2][j]
    LDR R11,[R12,#64]
   ;// LDR R5,=q_2scale
   ;// LDR R6,=q_add
    CMP R4,#0
    BGT coef2_hi_zero
    RSB R4,R4,#0
    MLA R4,R10,R4,R9
    MUL R4,R11,R4
    MOV R4,R4,ASR#12
    RSB R4,R4,#0
    B read_buf3
coef2_hi_zero
    MLA R4,R10,R4,R9
    MUL R4,R11,R4
    MOV R4,R4,ASR#12
    
read_buf3        
    LDRSH R5,[R0,#48]  ;//dct_buf[3][j]
    LDR R11,[R12,#96]
    ;//LDR R6,=q_2scale
    ;//LDR R7,=q_add
    CMP R5,#0
    BGT coef3_hi_zero
    RSB R5,R5,#0
    MLA R5,R10,R5,R9
    MUL R5,R11,R5
    MOV R5,R5,ASR#12
    RSB R5,R5,#0
    B read_buf4
coef3_hi_zero
    MLA R5,R10,R5,R9
    MUL R5,R11,R5
    MOV R5,R5,ASR#12
    
read_buf4        
    LDRSH R6,[R0,#64]  ;//dct_buf[4][j]
    LDR R11,[R12,#128]
   ;// LDR R7,=q_2scale
   ;// LDR R8,=q_add
    CMP R6,#0
    BGT coef4_hi_zero
    RSB R6,R6,#0
    MLA R6,R10,R6,R9
    MUL R6,R11,R6
    MOV R6,R6,ASR#12
    RSB R6,R6,#0
    B read_buf5
coef4_hi_zero
    MLA R6,R10,R6,R9
    MUL R6,R11,R6
    MOV R6,R6,ASR#12   

read_buf5        
    LDRSH R7,[R0,#80]  ;//dct_buf[5][j]
    LDR R11,[R12,#160]
   ;// LDR R8,=q_2scale
   ;// LDR R9,=q_add
    CMP R7,#0
    BGT coef5_hi_zero
    RSB R7,R7,#0
    MLA R7,R10,R7,R9
    MUL R7,R11,R7
    MOV R7,R7,ASR#12
    RSB R7,R7,#0
    B read_buf6
coef5_hi_zero
    MLA R7,R10,R7,R9
    MUL R7,R11,R7
    MOV R7,R7,ASR#12
    
read_buf6       
    LDRSH R8,[R0,#96]  ;//dct_buf[6][j]
    LDR R11,[R12,#192]
   ;// LDR R9,=q_2scale
   ;// LDR R10,=q_add
    CMP R8,#0
    BGT coef6_hi_zero
    RSB R8,R8,#0
    MLA R8,R10,R8,R9
    MUL R8,R11,R8
    MOV R8,R8,ASR#12
    RSB R8,R8,#0
    B read_buf7
coef6_hi_zero
    MLA R8,R10,R8,R9
    MUL R8,R11,R8
    MOV R8,R8,ASR#12
 
read_buf7        
    LDRSH R9,[R0,#112] ;//dct_buf[7][j]
   ;// LDR R11,[R12,#224]
   ;// LDR R10,=q_2scale
    LDR R11,=q_add
    CMP R9,#0
    BGT coef7_hi_zero
    RSB R9,R9,#0
    MLA R9,R10,R9,R11
    LDR R11,[R12,#224]
    MUL R9,R11,R9
    MOV R9,R9,ASR#12
    RSB R9,R9,#0
    B main_idct
coef7_hi_zero
    MLA R9,R10,R9,R11
    LDR R11,[R12,#224]
    MUL R9,R11,R9
    MOV R9,R9,ASR#12
     
main_idct    
   
    
    
    ;//step 1
    MOV R2,R2,ASR#1    ;//a0
   ;// MOV R6,R6,LSL#1    ;//a1
    SUB R4,R4,R8
    ADD R8,R4,R8,LSL#1
    ;//MOV R4,R4,LSL#1    ;//a2
   ;// MOV R8,R8,LSL#1    ;//a3
    SUB R7,R7,R5
    ADD R5,R7,R5,LSL#1
    ;//MOV R7,R7,LSL#1    ;//a4
   ;// MOV R5,R5,LSL#1    ;//temp2
    ADD R3,R3,R9
    SUB R9,R3,R9,LSL#1
   ;// MOV R3,R3,LSL#1    ;//temp1
   ;// MOV R9,R9,LSL#1    ;//a6
    SUB R3,R3,R5       ;//a5
    ADD R5,R3,R5,LSL#1 ;//a7
    LDR R10,=C6
    ADD R11,R7,R9
    MUL R10,R11,R10
    MOV R10,R10,ASR#6   ;//tmp4
    ;//step2
    LDR R11,=C4
    MUL R4,R11,R4
    MOV R4,R4,ASR#6    ;//a2
    
    MUL R3,R11,R3
    MOV R3,R3,ASR#6   ;//a5
    
    LDR R11,=Q
    MUL R7,R11,R7
    ;//MOV R7,R7,ASR#6
    ADD R7,R10,R7,ASR#6
    RSB R7,R7,#0
    ;//SUB R7,R7,R10     ;//a4
    
     LDR R11,=R
    MUL R9,R11,R9
   ;// MOV R9,R9,ASR#6
   ;// SUB R9,R9,R10    ;//a6
    RSB R9,R10,R9,ASR#6
    
    ;//step3
    SUB R10,R9,R5     ;//temp3
    MOV R9,R8         ;//a6
    SUB R4,R4,R8      ;//a2
    ADD R8,R2,R6      ;//a3
    SUB R6,R2,R6      ;//a1
    SUB R2,R10,R3     ;//a0
    MOV R3,R7         ;//a5
    MOV R7,R10        ;//a4
    ;//step4
    MOV R10,R2        ;//temp1
    MOV R11,R7        ;//temp2
    MOV R2,R5         ;//a0
    ADD R7,R8,R9      ;//a4
    SUB R9,R8,R9      ;//a6
    SUB R5,R3,R10     ;//a7
    ADD R8,R6,R4      ;//a3
    SUB R3,R6,R4      ;//a5
    MOV R4,R11        ;//a2
    MOV R6,R10        ;//a1
    ;//step5
    ADD R10,R7,R2
    STRH R10,[R0]     ;//dct_buf[0][j]
    ADD R10,R8,R4
    STRH R10,[R0,#16] ;//dct_buf[1][j]
    SUB R10,R3,R6
    STRH R10,[R0,#32]  ;//dct_buf[2][j]
    SUB R10,R9,R5
    STRH R10,[R0,#48]  ;//dct_buf[3][j]
    ADD R10,R9,R5
    STRH R10,[R0,#64]  ;//dct_buf[4][j]
    ADD R10,R3,R6
    STRH R10,[R0,#80]  ;//dct_buf[5][j]
    SUB R10,R8,R4
    STRH R10,[R0,#96]  ;//dct_buf[6][j]
    SUB R10,R7,R2
    STRH R10,[R0,#112]  ;//dct_buf[7][j]
    B RE_VER
    
    
HOR_IDCT
     LDRSH R3,[R0,#2]  ;//dct_buf[j][1]
    LDRSH R4,[R0,#4]  ;//dct_buf[j][2]
    LDRSH R5,[R0,#6]  ;//dct_buf[j][3]
    LDRSH R6,[R0,#8]  ;//dct_buf[j][4]
    LDRSH R7,[R0,#10]  ;//dct_buf[j][5]
    LDRSH R8,[R0,#12]  ;//dct_buf[j][6]
    LDRSH R9,[R0,#14] ;//dct_buf[j][7]
    ;//step 1
    MOV R2,R2,ASR#1    ;//a0
   ;// MOV R6,R6,LSL#1    ;//a1
    SUB R4,R4,R8
    ADD R8,R4,R8,LSL#1
   ;// MOV R4,R4,LSL#1    ;//a2
   ;// MOV R8,R8,LSL#1    ;//a3
    SUB R7,R7,R5
    ADD R5,R7,R5,LSL#1
   ;// MOV R7,R7,LSL#1    ;//a4
   ;// MOV R5,R5,LSL#1    ;//temp2
    ADD R3,R3,R9
    SUB R9,R3,R9,LSL#1
   ;// MOV R3,R3,LSL#1    ;//temp1
   ;// MOV R9,R9,LSL#1    ;//a6
    SUB R3,R3,R5       ;//a5
    ADD R5,R3,R5,LSL#1 ;//a7
    LDR R10,=C6
    ADD R11,R7,R9
    MUL R10,R11,R10    ;//tmp4
    MOV R10,R10,ASR#6   
    ;//step2
    LDR R11,=C4
    MUL R4,R11,R4
    MOV R4,R4,ASR#6   ;//a2
    
    MUL R3,R11,R3
    MOV R3,R3,ASR#6   ;//a5
    
    LDR R11,=Q
    MUL R7,R11,R7
    ;//MOV R7,R7,ASR#6
    ADD R7,R10,R7,ASR#6
    RSB R7,R7,#0
    ;//SUB R7,R7,R10     ;//a4
       
    LDR R11,=R
    MUL R9,R11,R9
   ;// MOV R9,R9,ASR#6
   ;// SUB R9,R9,R10    ;//a6
    RSB R9,R10,R9,ASR#6
    
    ;//step3
    SUB R10,R9,R5     ;//temp3
    MOV R9,R8         ;//a6
    SUB R4,R4,R8      ;//a2
    ADD R8,R2,R6      ;//a3
    SUB R6,R2,R6      ;//a1
    SUB R2,R10,R3     ;//a0
    MOV R3,R7         ;//a5
    MOV R7,R10        ;//a4
    ;//step4
    MOV R10,R2        ;//temp1
    MOV R11,R7        ;//temp2
    MOV R2,R5         ;//a0
    ADD R7,R8,R9      ;//a4
    SUB R9,R8,R9      ;//a6
    SUB R5,R3,R10     ;//a7
    ADD R8,R6,R4      ;//a3
    SUB R3,R6,R4      ;//a5
    MOV R4,R11        ;//a2
    MOV R6,R10        ;//a1
    ;//step5
    
    ADD R10,R7,R2
    
    ADD R10,R10,#32
    MOV R10,R10,LSR#6
    STRH R10,[R0]     ;//dct_buf[j][0]
    
    ADD R10,R8,R4
    ADD R10,R10,#32
    MOV R10,R10,LSR#6
    STRH R10,[R0,#2] ;//dct_buf[j][1]
    
    SUB R10,R3,R6
    ADD R10,R10,#32
    MOV R10,R10,LSR#6
    STRH R10,[R0,#4]  ;//dct_buf[j][2]
   
    SUB R10,R9,R5
    ADD R10,R10,#32
    MOV R10,R10,LSR#6
    STRH R10,[R0,#6]  ;//dct_buf[j][3]
    
    ADD R10,R9,R5
    ADD R10,R10,#32
    MOV R10,R10,LSR#6
    STRH R10,[R0,#8]  ;//dct_buf[j][4]
    
    ADD R10,R3,R6
    ADD R10,R10,#32
    MOV R10,R10,LSR#6
    STRH R10,[R0,#10]  ;//dct_buf[j][5]
    
    SUB R10,R8,R4
    ADD R10,R10,#32
    MOV R10,R10,LSR#6
    STRH R10,[R0,#12]  ;//dct_buf[j][6]
    
    SUB R10,R7,R2
    ADD R10,R10,#32
    MOV R10,R10,LSR#6
    STRH R10,[R0,#14]  ;//dct_buf[j][7] 
    B RE_HOR
    
quant_idct_matrix DCD 131044,90862,85749,77106,65522,51404,35476,18100
                   DCD 90862,63001,59487,53463,45431,35642,24589,12550
                   DCD 85794,59487,56169,50481,42897,33654,23226,11850
                   DCD 77106,53463,50481,45369,38553,30246,20874,10650
                   DCD 65522,45431,42897,38553,32761,25702,17738,9050
                   DCD 51404,35642,33654,30246,25702,20164,13916,7100
                   DCD 35476,24598,23226,20874,17738,13916,9604,4900
                   DCD 18100,12550,11850,10650,9050,7100,4900,2500

       
    END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -