📄 jdhuff.txt
字号:
000074 2075 MOVS r0,#0x75 ;373
000076 6148 STR r0,[r1,#0x14] ;373
000078 6830 LDR r0,[r6,#0] ;373
00007a f04f31ff MOV r1,#0xffffffff ;373
00007e 6842 LDR r2,[r0,#4] ;373
000080 4630 MOV r0,r6 ;373
000082 4790 BLX r2 ;373
000084 f8d611bc LDR r1,[r6,#0x1bc] ;374
000088 2001 MOVS r0,#1 ;374
00008a 6088 STR r0,[r1,#8] ;374
|L3.140|
00008c f1c70119 RSB r1,r7,#0x19 ;377
000090 fa09f901 LSL r9,r9,r1 ;377
000094 2719 MOVS r7,#0x19 ;378
|L3.150|
000096 e8880230 STM r8,{r4,r5,r9} ;388
00009a 2001 MOVS r0,#1 ;388
00009c f8c8700c STR r7,[r8,#0xc] ;388
0000a0 e7ce B |L3.64|
;;;390
ENDP
AREA ||i.jpeg_huff_decode||, CODE, READONLY, ALIGN=1
jpeg_huff_decode PROC
;;;397 GLOBAL(int)
;;;398 jpeg_huff_decode (bitread_working_state * state,
000000 e92d41f0 PUSH {r4-r8,lr}
;;;399 register bit_buf_type get_buffer, register int bits_left,
;;;400 d_derived_tbl * htbl, int min_bits)
;;;401 {
;;;402 register int l = min_bits;
;;;403 register INT32 code;
;;;404
;;;405 /* HUFF_DECODE has determined that the code is at least min_bits */
;;;406 /* bits long, so fetch that many bits in one swoop. */
;;;407
;;;408 CHECK_BIT_BUFFER(*state, l, return -1);
000004 9c06 LDR r4,[sp,#0x18]
000006 4605 MOV r5,r0 ;401
000008 461e MOV r6,r3 ;401
00000a f04f38ff MOV r8,#0xffffffff
00000e 42a2 CMP r2,r4
000010 da06 BGE |L4.32|
000012 4623 MOV r3,r4
000014 4628 MOV r0,r5
000016 f7fffffe BL jpeg_fill_bit_buffer
00001a b188 CBZ r0,|L4.64|
00001c e9d51202 LDRD r1,r2,[r5,#8]
|L4.32|
;;;409 code = GET_BITS(l);
000020 1b12 SUBS r2,r2,r4
000022 fa41f002 ASR r0,r1,r2
000026 2301 MOVS r3,#1
000028 40a3 LSLS r3,r3,r4
00002a 1e5b SUBS r3,r3,#1
00002c 4018 ANDS r0,r0,r3
;;;410
;;;411 /* Collect the rest of the Huffman code one bit at a time. */
;;;412 /* This is per Figure F.16 in the JPEG spec. */
;;;413
;;;414 while (code > htbl->maxcode[l]) {
00002e e013 B |L4.88|
|L4.48|
;;;415 code <<= 1;
000030 0047 LSLS r7,r0,#1
;;;416 CHECK_BIT_BUFFER(*state, 1, return -1);
000032 2a01 CMP r2,#1
000034 da09 BGE |L4.74|
000036 2301 MOVS r3,#1
000038 4628 MOV r0,r5
00003a f7fffffe BL jpeg_fill_bit_buffer
00003e b910 CBNZ r0,|L4.70|
|L4.64|
000040 4640 MOV r0,r8
|L4.66|
;;;417 code |= GET_BITS(1);
;;;418 l++;
;;;419 }
;;;420
;;;421 /* Unload the local registers */
;;;422 state->get_buffer = get_buffer;
;;;423 state->bits_left = bits_left;
;;;424
;;;425 /* With garbage input we may reach the sentinel value l = 17. */
;;;426
;;;427 if (l > 16) {
;;;428 WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE);
;;;429 return 0; /* fake a zero as the safest result */
;;;430 }
;;;431
;;;432 return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ];
;;;433 }
000042 e8bd81f0 POP {r4-r8,pc}
|L4.70|
000046 e9d51202 LDRD r1,r2,[r5,#8] ;416
|L4.74|
00004a 1e52 SUBS r2,r2,#1 ;417
00004c fa41f002 ASR r0,r1,r2 ;417
000050 f0000001 AND r0,r0,#1 ;417
000054 4338 ORRS r0,r0,r7 ;417
000056 1c64 ADDS r4,r4,#1 ;418
|L4.88|
000058 f8563024 LDR r3,[r6,r4,LSL #2] ;414
00005c 4283 CMP r3,r0 ;414
00005e dbe7 BLT |L4.48|
000060 e9c51202 STRD r1,r2,[r5,#8] ;427
000064 2c10 CMP r4,#0x10 ;427
000066 dd0a BLE |L4.126|
000068 6929 LDR r1,[r5,#0x10] ;428
00006a 2076 MOVS r0,#0x76 ;428
00006c 6809 LDR r1,[r1,#0] ;428
00006e 6148 STR r0,[r1,#0x14] ;428
000070 6928 LDR r0,[r5,#0x10] ;428
000072 6801 LDR r1,[r0,#0] ;428
000074 684a LDR r2,[r1,#4] ;428
000076 4641 MOV r1,r8 ;428
000078 4790 BLX r2 ;428
00007a 2000 MOVS r0,#0 ;429
00007c e7e1 B |L4.66|
|L4.126|
00007e eb060284 ADD r2,r6,r4,LSL #2 ;432
000082 f8d6108c LDR r1,[r6,#0x8c] ;432
000086 6c92 LDR r2,[r2,#0x48] ;432
000088 3011 ADDS r0,r0,#0x11 ;432
00008a 4411 ADD r1,r1,r2 ;432
00008c 5c08 LDRB r0,[r1,r0] ;432
00008e e7d8 B |L4.66|
;;;434
ENDP
AREA ||i.jpeg_make_d_derived_tbl||, CODE, READONLY, ALIGN=2
jpeg_make_d_derived_tbl PROC
;;;148 GLOBAL(void)
;;;149 jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,
000000 e92d4fff PUSH {r0-r11,lr}
;;;150 d_derived_tbl ** pdtbl)
;;;151 {
000004 f2ad5d0c SUB sp,sp,#0x50c
000008 4604 MOV r4,r0
00000a 4615 MOV r5,r2
00000c 461f MOV r7,r3
;;;152 JHUFF_TBL *htbl;
;;;153 d_derived_tbl *dtbl;
;;;154 int p, i, l, si, numsymbols;
;;;155 int lookbits, ctr;
;;;156 char huffsize[257];
;;;157 unsigned int huffcode[257];
;;;158 unsigned int code;
;;;159
;;;160 /* Note that huffsize[] and huffcode[] are filled in code-length order,
;;;161 * paralleling the order of the symbols themselves in htbl->huffval[].
;;;162 */
;;;163
;;;164 /* Find the input Huffman table */
;;;165 if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
;;;166 ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
00000e f04f0832 MOV r8,#0x32
000012 2a04 CMP r2,#4 ;165
000014 d308 BCC |L5.40|
000016 6821 LDR r1,[r4,#0]
000018 f8c18014 STR r8,[r1,#0x14]
00001c 6820 LDR r0,[r4,#0]
00001e 6185 STR r5,[r0,#0x18]
000020 6820 LDR r0,[r4,#0]
000022 6801 LDR r1,[r0,#0]
000024 4620 MOV r0,r4
000026 4788 BLX r1
|L5.40|
;;;167 htbl =
000028 f8dd1510 LDR r1,[sp,#0x510]
;;;168 isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
00002c eb040085 ADD r0,r4,r5,LSL #2
000030 b111 CBZ r1,|L5.56|
000032 f8d060b4 LDR r6,[r0,#0xb4]
000036 e001 B |L5.60|
|L5.56|
000038 f8d060c4 LDR r6,[r0,#0xc4]
|L5.60|
;;;169 if (htbl == NULL)
00003c b946 CBNZ r6,|L5.80|
;;;170 ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
00003e 6821 LDR r1,[r4,#0]
000040 f8c18014 STR r8,[r1,#0x14]
000044 6820 LDR r0,[r4,#0]
000046 6185 STR r5,[r0,#0x18]
000048 6820 LDR r0,[r4,#0]
00004a 6801 LDR r1,[r0,#0]
00004c 4620 MOV r0,r4
00004e 4788 BLX r1
|L5.80|
;;;171
;;;172 /* Allocate a workspace if we haven't already done so. */
;;;173 if (*pdtbl == NULL)
000050 6838 LDR r0,[r7,#0]
000052 b938 CBNZ r0,|L5.100|
;;;174 *pdtbl = (d_derived_tbl *)
000054 6860 LDR r0,[r4,#4]
000056 f44f62b2 MOV r2,#0x590
00005a 6803 LDR r3,[r0,#0]
00005c 2101 MOVS r1,#1
00005e 4620 MOV r0,r4
000060 4798 BLX r3
000062 6038 STR r0,[r7,#0]
|L5.100|
;;;175 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
;;;176 SIZEOF(d_derived_tbl));
;;;177 dtbl = *pdtbl;
000064 4605 MOV r5,r0
;;;178 dtbl->pub = htbl; /* fill in back link */
;;;179
;;;180 /* Figure C.1: make table of Huffman code length for each symbol */
;;;181
;;;182 p = 0;
000066 2700 MOVS r7,#0
;;;183 for (l = 1; l <= 16; l++) {
000068 f04f0901 MOV r9,#1
00006c f20d4a04 ADD r10,sp,#0x404 ;156
;;;184 i = (int) htbl->bits[l];
;;;185 if (i < 0 || p + i > 256) /* protect against table overrun */
;;;186 ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
000070 f04f0b08 MOV r11,#8
000074 f8c0608c STR r6,[r0,#0x8c]
|L5.120|
000078 f8168009 LDRB r8,[r6,r9] ;184
00007c f1b80f00 CMP r8,#0 ;185
000080 db04 BLT |L5.140|
000082 eb070008 ADD r0,r7,r8 ;185
000086 f5b07f80 CMP r0,#0x100 ;185
00008a dd06 BLE |L5.154|
|L5.140|
00008c 6821 LDR r1,[r4,#0]
00008e f8c1b014 STR r11,[r1,#0x14]
000092 6820 LDR r0,[r4,#0]
000094 6801 LDR r1,[r0,#0]
000096 4620 MOV r0,r4
000098 4788 BLX r1
|L5.154|
;;;187 while (i--)
;;;188 huffsize[p++] = (char) l;
00009a f00901ff AND r1,r9,#0xff
00009e 4652 MOV r2,r10 ;156
0000a0 e001 B |L5.166|
|L5.162|
0000a2 55d1 STRB r1,[r2,r7]
0000a4 1c7f ADDS r7,r7,#1
|L5.166|
0000a6 f1b80001 SUBS r0,r8,#1 ;187
0000aa 4680 MOV r8,r0 ;187
0000ac d2f9 BCS |L5.162|
0000ae f1090901 ADD r9,r9,#1 ;183
0000b2 f1b90f10 CMP r9,#0x10 ;183
0000b6 dddf BLE |L5.120|
;;;189 }
;;;190 huffsize[p] = 0;
0000b8 2100 MOVS r1,#0
0000ba f80a1007 STRB r1,[r10,r7]
;;;191 numsymbols = p;
;;;192
;;;193 /* Figure C.2: generate the codes themselves */
;;;194 /* We also validate that the counts represent a legal Huffman code tree. */
;;;195
;;;196 code = 0;
0000be f8cd7508 STR r7,[sp,#0x508]
0000c2 460f MOV r7,r1
;;;197 si = huffsize[0];
0000c4 f89d9404 LDRB r9,[sp,#0x404]
;;;198 p = 0;
0000c8 4688 MOV r8,r1
0000ca 46ea MOV r10,sp ;157
;;;199 while (huffsize[p]) {
;;;200 while (((int) huffsize[p]) == si) {
;;;201 huffcode[p++] = code;
;;;202 code++;
;;;203 }
;;;204 /* code is now 1 more than the last code used for codelength si; but
;;;205 * it must still fit in si bits, since no code is allowed to be all ones.
;;;206 */
;;;207 if (((INT32) code) >= (((INT32) 1) << si))
;;;208 ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
;;;209 code <<= 1;
;;;210 si++;
0000cc e01a B |L5.260|
0000ce bf00 NOP ;201
|L5.208|
0000d0 f8417028 STR r7,[r1,r8,LSL #2] ;201
0000d4 f1080801 ADD r8,r8,#1 ;201
0000d8 1c7f ADDS r7,r7,#1 ;202
0000da e000 B |L5.222|
|L5.220|
0000dc 4651 MOV r1,r10 ;157
|L5.222|
0000de f8102008 LDRB r2,[r0,r8] ;200
0000e2 454a CMP r2,r9 ;200
0000e4 d0f4 BEQ |L5.208|
0000e6 2001 MOVS r0,#1 ;207
0000e8 fa00f009 LSL r0,r0,r9 ;207
0000ec 42b8 CMP r0,r7 ;207
0000ee dc06 BGT |L5.254|
0000f0 6821 LDR r1,[r4,#0] ;208
0000f2 2008 MOVS r0,#8 ;208
0000f4 6148 STR r0,[r1,#0x14] ;208
0000f6 6820 LDR r0,[r4,#0] ;208
0000f8 6801 LDR r1,[r0,#0] ;208
0000fa 4620 MOV r0,r4 ;208
0000fc 4788 BLX r1 ;208
|L5.254|
0000fe 007f LSLS r7,r7,#1 ;209
000100 f1090901 ADD r9,r9,#1
|L5.260|
000104 f20d4004 ADD r0,sp,#0x404 ;199
000108 f8101008 LDRB r1,[r0,r8] ;199
00010c 2900 CMP r1,#0 ;199
00010e d1e5 BNE |L5.220|
;;;211 }
;;;212
;;;213 /* Figure F.15: generate decoding tables for bit-sequential decoding */
;;;214
;;;215 p = 0;
;;;216 for (l = 1; l <= 16; l++) {
000110 2001 MOVS r0,#1
000112 f04f3cff MOV r12,#0xffffffff ;187
000116 46d3 MOV r11,r10 ;157
|L5.280|
;;;217 if (htbl->bits[l]) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -