📄 jdhuff.txt
字号:
000118 5c32 LDRB r2,[r6,r0]
00011a b172 CBZ r2,|L5.314|
;;;218 /* valoffset[l] = huffval[] index of 1st symbol of code length l,
;;;219 * minus the minimum code of length l
;;;220 */
;;;221 dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p];
00011c f85b2021 LDR r2,[r11,r1,LSL #2]
000120 eb050780 ADD r7,r5,r0,LSL #2
000124 1a8a SUBS r2,r1,r2
;;;222 p += htbl->bits[l];
000126 64ba STR r2,[r7,#0x48]
000128 5c32 LDRB r2,[r6,r0]
00012a 4411 ADD r1,r1,r2
;;;223 dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */
00012c eb0b0281 ADD r2,r11,r1,LSL #2
000130 f8522c04 LDR r2,[r2,#-4]
000134 f8452020 STR r2,[r5,r0,LSL #2]
000138 e001 B |L5.318|
|L5.314|
;;;224 } else {
;;;225 dtbl->maxcode[l] = -1; /* -1 if no codes of this length */
00013a f845c020 STR r12,[r5,r0,LSL #2]
|L5.318|
00013e 1c40 ADDS r0,r0,#1 ;216
000140 2810 CMP r0,#0x10 ;216
000142 dde9 BLE |L5.280|
;;;226 }
;;;227 }
;;;228 dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */
000144 4826 LDR r0,|L5.480|
;;;229
;;;230 /* Compute lookahead tables to speed up decoding.
;;;231 * First we set all the table entries to 0, indicating "too long";
;;;232 * then we iterate through the Huffman codes that are short enough and
;;;233 * fill in all the entries that correspond to bit sequences starting
;;;234 * with that code.
;;;235 */
;;;236
;;;237 MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits));
000146 6468 STR r0,[r5,#0x44]
000148 f44f6180 MOV r1,#0x400
00014c f1050090 ADD r0,r5,#0x90
000150 f7fffffe BL __aeabi_memclr4
;;;238
;;;239 p = 0;
000154 f04f0c00 MOV r12,#0
;;;240 for (l = 1; l <= HUFF_LOOKAHEAD; l++) {
000158 f05f0001 MOVS.W r0,#1
|L5.348|
;;;241 for (i = 1; i <= (int) htbl->bits[l]; i++, p++) {
;;;242 /* l = current code's length, p = its index in huffcode[] & huffval[]. */
;;;243 /* Generate left-justified code followed by all possible bit sequences */
;;;244 lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);
00015c f1c00108 RSB r1,r0,#8
000160 f04f0801 MOV r8,#1 ;241
000164 468a MOV r10,r1
;;;245 for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) {
000166 fa08f901 LSL r9,r8,r1
00016a e018 B |L5.414|
|L5.364|
00016c f85b102c LDR r1,[r11,r12,LSL #2] ;244
000170 464a MOV r2,r9 ;244
000172 fa01f10a LSL r1,r1,r10 ;244
;;;246 dtbl->look_nbits[lookbits] = l;
;;;247 dtbl->look_sym[lookbits] = htbl->huffval[p];
000176 eb060e0c ADD lr,r6,r12
00017a e00a B |L5.402|
|L5.380|
00017c eb050381 ADD r3,r5,r1,LSL #2 ;246
000180 186f ADDS r7,r5,r1
000182 f8c30090 STR r0,[r3,#0x90]
000186 f89e3011 LDRB r3,[lr,#0x11]
;;;248 lookbits++;
00018a 1c49 ADDS r1,r1,#1
00018c f8873490 STRB r3,[r7,#0x490] ;247
000190 1e52 SUBS r2,r2,#1 ;245
|L5.402|
000192 2a00 CMP r2,#0 ;245
000194 dcf2 BGT |L5.380|
000196 f1080801 ADD r8,r8,#1 ;241
00019a f10c0c01 ADD r12,r12,#1 ;241
|L5.414|
00019e 5c31 LDRB r1,[r6,r0] ;241
0001a0 4541 CMP r1,r8 ;241
0001a2 dae3 BGE |L5.364|
0001a4 1c40 ADDS r0,r0,#1 ;240
0001a6 2808 CMP r0,#8 ;240
0001a8 ddd8 BLE |L5.348|
;;;249 }
;;;250 }
;;;251 }
;;;252
;;;253 /* Validate symbols as being reasonable.
;;;254 * For AC tables, we make no check, but accept all byte values 0..255.
;;;255 * For DC tables, we require the symbols to be in range 0..15.
;;;256 * (Tighter bounds could be applied depending on the data depth and mode,
;;;257 * but this is sufficient to ensure safe decoding.)
;;;258 */
;;;259 if (isDC) {
0001aa f8dd0510 LDR r0,[sp,#0x510]
0001ae 2800 CMP r0,#0
0001b0 d011 BEQ |L5.470|
;;;260 for (i = 0; i < numsymbols; i++) {
0001b2 2500 MOVS r5,#0
0001b4 2708 MOVS r7,#8 ;186
0001b6 e00a B |L5.462|
|L5.440|
;;;261 int sym = htbl->huffval[i];
0001b8 1970 ADDS r0,r6,r5
0001ba 7c40 LDRB r0,[r0,#0x11]
;;;262 if (sym < 0 || sym > 15)
0001bc 2810 CMP r0,#0x10
0001be d305 BCC |L5.460|
;;;263 ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
0001c0 6820 LDR r0,[r4,#0]
0001c2 6147 STR r7,[r0,#0x14]
0001c4 6820 LDR r0,[r4,#0]
0001c6 6801 LDR r1,[r0,#0]
0001c8 4620 MOV r0,r4
0001ca 4788 BLX r1
|L5.460|
0001cc 1c6d ADDS r5,r5,#1 ;260
|L5.462|
0001ce f8dd0508 LDR r0,[sp,#0x508] ;260
0001d2 4285 CMP r5,r0 ;260
0001d4 dbf0 BLT |L5.440|
|L5.470|
;;;264 }
;;;265 }
;;;266 }
0001d6 f20d5d1c ADD sp,sp,#0x51c
0001da e8bd8ff0 POP {r4-r11,pc}
;;;267
ENDP
0001de 0000 DCW 0x0000
|L5.480|
DCD 0x000fffff
AREA ||i.start_pass_huff_decoder||, CODE, READONLY, ALIGN=1
start_pass_huff_decoder PROC
;;;85 METHODDEF(void)
;;;86 start_pass_huff_decoder (j_decompress_ptr cinfo)
000000 e92d41f0 PUSH {r4-r8,lr}
;;;87 {
000004 4604 MOV r4,r0
;;;88 huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
;;;89 int ci, blkn, dctbl, actbl;
;;;90 jpeg_component_info * compptr;
;;;91
;;;92 /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
;;;93 * This ought to be an error condition, but we make it a warning because
;;;94 * there are some baseline files out there with all zeroes in these bytes.
;;;95 */
;;;96 if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||
000006 f8d051bc LDR r5,[r0,#0x1bc]
00000a f8d00190 LDR r0,[r0,#0x190]
00000e b948 CBNZ r0,|L6.36|
000010 f8d40194 LDR r0,[r4,#0x194]
000014 283f CMP r0,#0x3f
000016 d105 BNE |L6.36|
;;;97 cinfo->Ah != 0 || cinfo->Al != 0)
000018 f8d40198 LDR r0,[r4,#0x198]
00001c b910 CBNZ r0,|L6.36|
00001e f8d4019c LDR r0,[r4,#0x19c]
000022 b140 CBZ r0,|L6.54|
|L6.36|
;;;98 WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
000024 6821 LDR r1,[r4,#0]
000026 207a MOVS r0,#0x7a
000028 6148 STR r0,[r1,#0x14]
00002a 6820 LDR r0,[r4,#0]
00002c f04f31ff MOV r1,#0xffffffff
000030 6842 LDR r2,[r0,#4]
000032 4620 MOV r0,r4
000034 4790 BLX r2
|L6.54|
;;;99
;;;100 for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
000036 2600 MOVS r6,#0
000038 46b0 MOV r8,r6 ;96
00003a e019 B |L6.112|
|L6.60|
;;;101 compptr = cinfo->cur_comp_info[ci];
00003c eb040086 ADD r0,r4,r6,LSL #2
000040 f8d0014c LDR r0,[r0,#0x14c]
;;;102 dctbl = compptr->dc_tbl_no;
;;;103 actbl = compptr->ac_tbl_no;
;;;104 /* Compute derived values for Huffman tables */
;;;105 /* We may do this more than once for a table, but it's not expensive */
;;;106 jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl,
000044 2101 MOVS r1,#1
000046 e9d02705 LDRD r2,r7,[r0,#0x14]
00004a eb050382 ADD r3,r5,r2,LSL #2
00004e 3328 ADDS r3,r3,#0x28
000050 4620 MOV r0,r4
000052 f7fffffe BL jpeg_make_d_derived_tbl
;;;107 & entropy->dc_derived_tbls[dctbl]);
;;;108 jpeg_make_d_derived_tbl(cinfo, FALSE, actbl,
000056 eb050387 ADD r3,r5,r7,LSL #2
00005a 3338 ADDS r3,r3,#0x38
00005c 463a MOV r2,r7
00005e 2100 MOVS r1,#0
000060 4620 MOV r0,r4
000062 f7fffffe BL jpeg_make_d_derived_tbl
;;;109 & entropy->ac_derived_tbls[actbl]);
;;;110 /* Initialize DC predictions to 0 */
;;;111 entropy->saved.last_dc_val[ci] = 0;
000066 eb050186 ADD r1,r5,r6,LSL #2
00006a 1c76 ADDS r6,r6,#1 ;100
00006c f8c18014 STR r8,[r1,#0x14] ;100
|L6.112|
000070 f8d40148 LDR r0,[r4,#0x148] ;100
000074 42b0 CMP r0,r6 ;100
000076 dce1 BGT |L6.60|
;;;112 }
;;;113
;;;114 /* Precalculate decoding info for each block in an MCU of this scan */
;;;115 for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
000078 2300 MOVS r3,#0
00007a e025 B |L6.200|
|L6.124|
;;;116 ci = cinfo->MCU_membership[blkn];
00007c eb040083 ADD r0,r4,r3,LSL #2
000080 f8d00168 LDR r0,[r0,#0x168]
;;;117 compptr = cinfo->cur_comp_info[ci];
000084 eb040080 ADD r0,r4,r0,LSL #2
;;;118 /* Precalculate which table to use for each block */
;;;119 entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
000088 f8d0114c LDR r1,[r0,#0x14c]
00008c eb050083 ADD r0,r5,r3,LSL #2
000090 694a LDR r2,[r1,#0x14]
000092 eb050282 ADD r2,r5,r2,LSL #2
000096 6a92 LDR r2,[r2,#0x28]
;;;120 entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];
000098 6482 STR r2,[r0,#0x48]
00009a 698a LDR r2,[r1,#0x18]
00009c eb050282 ADD r2,r5,r2,LSL #2
0000a0 6b92 LDR r2,[r2,#0x38]
;;;121 /* Decide whether we really care about the coefficient values */
;;;122 if (compptr->component_needed) {
0000a2 6702 STR r2,[r0,#0x70]
0000a4 6b0a LDR r2,[r1,#0x30]
0000a6 b14a CBZ r2,|L6.188|
;;;123 entropy->dc_needed[blkn] = TRUE;
0000a8 2201 MOVS r2,#1
;;;124 /* we don't need the ACs if producing a 1/8th-size image */
;;;125 entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1);
0000aa f8c02098 STR r2,[r0,#0x98]
0000ae 6a49 LDR r1,[r1,#0x24]
0000b0 2901 CMP r1,#1
0000b2 dc00 BGT |L6.182|
0000b4 2200 MOVS r2,#0
|L6.182|
0000b6 f8c020c0 STR r2,[r0,#0xc0]
0000ba e004 B |L6.198|
|L6.188|
0000bc 3098 ADDS r0,r0,#0x98
;;;126 } else {
;;;127 entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE;
0000be f8c08028 STR r8,[r0,#0x28]
0000c2 f8c08000 STR r8,[r0,#0]
|L6.198|
0000c6 1c5b ADDS r3,r3,#1 ;115
|L6.200|
0000c8 f8d40164 LDR r0,[r4,#0x164] ;115
0000cc 4298 CMP r0,r3 ;115
0000ce dcd5 BGT |L6.124|
;;;128 }
;;;129 }
;;;130
;;;131 /* Initialize bitread state variables */
;;;132 entropy->bitstate.bits_left = 0;
;;;133 entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
0000d0 f8c58010 STR r8,[r5,#0x10]
;;;134 entropy->pub.insufficient_data = FALSE;
0000d4 f8c5800c STR r8,[r5,#0xc]
;;;135
;;;136 /* Initialize restart counter */
;;;137 entropy->restarts_to_go = cinfo->restart_interval;
0000d8 f8c58008 STR r8,[r5,#8]
0000dc f8d40114 LDR r0,[r4,#0x114]
;;;138 }
0000e0 6268 STR r0,[r5,#0x24]
0000e2 e8bd81f0 POP {r4-r8,pc}
;;;139
ENDP
AREA ||.constdata||, DATA, READONLY, ALIGN=2
extend_test
DCD 0x00000000
DCD 0x00000001
DCD 0x00000002
DCD 0x00000004
DCD 0x00000008
DCD 0x00000010
DCD 0x00000020
DCD 0x00000040
DCD 0x00000080
DCD 0x00000100
DCD 0x00000200
DCD 0x00000400
DCD 0x00000800
DCD 0x00001000
DCD 0x00002000
DCD 0x00004000
extend_offset
DCD 0x00000000
DCD 0xffffffff
DCD 0xfffffffd
DCD 0xfffffff9
DCD 0xfffffff1
DCD 0xffffffe1
DCD 0xffffffc1
DCD 0xffffff81
DCD 0xffffff01
DCD 0xfffffe01
DCD 0xfffffc01
DCD 0xfffff801
DCD 0xfffff001
DCD 0xffffe001
DCD 0xffffc001
DCD 0xffff8001
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -