📄 jdphuff.txt
字号:
0001ea 4285 CMP r5,r0 ;537
0001ec f77faf42 BLE |L2.116|
|L2.496|
;;;589 }
;;;590 }
;;;591 }
;;;592
;;;593 if (EOBRUN > 0) {
0001f0 9849 LDR r0,[sp,#0x124]
0001f2 b358 CBZ r0,|L2.588|
0001f4 e024 B |L2.576|
|L2.502|
;;;594 /* Scan any remaining coefficient positions after the end-of-band
;;;595 * (the last newly nonzero coefficient, if any). Append a correction
;;;596 * bit to each already-nonzero coefficient. A correction bit is 1
;;;597 * if the absolute value of the coefficient must be increased.
;;;598 */
;;;599 for (; k <= Se; k++) {
;;;600 thiscoef = *block + jpeg_natural_order[k];
0001f6 4829 LDR r0,|L2.668|
0001f8 9948 LDR r1,[sp,#0x120]
0001fa f8500025 LDR r0,[r0,r5,LSL #2]
0001fe eb010740 ADD r7,r1,r0,LSL #1
;;;601 if (*thiscoef != 0) {
000202 8838 LDRH r0,[r7,#0]
000204 b1d8 CBZ r0,|L2.574|
;;;602 CHECK_BIT_BUFFER(br_state, 1, goto undoit);
000206 2c01 CMP r4,#1
000208 da08 BGE |L2.540|
00020a 2301 MOVS r3,#1
00020c 4622 MOV r2,r4
00020e 4631 MOV r1,r6
000210 a843 ADD r0,sp,#0x10c
000212 f7fffffe BL jpeg_fill_bit_buffer
000216 b388 CBZ r0,|L2.636|
000218 9e45 LDR r6,[sp,#0x114]
00021a 9c46 LDR r4,[sp,#0x118]
|L2.540|
;;;603 if (GET_BITS(1)) {
00021c 1e64 SUBS r4,r4,#1
00021e fa46f004 ASR r0,r6,r4
000222 07c0 LSLS r0,r0,#31
000224 d00b BEQ |L2.574|
;;;604 if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
000226 f9b70000 LDRSH r0,[r7,#0]
00022a ea100f0a TST r0,r10
00022e d106 BNE |L2.574|
;;;605 if (*thiscoef >= 0)
000230 2800 CMP r0,#0
000232 db01 BLT |L2.568|
;;;606 *thiscoef += p1;
000234 4651 MOV r1,r10
000236 e000 B |L2.570|
|L2.568|
;;;607 else
;;;608 *thiscoef += m1;
000238 994a LDR r1,[sp,#0x128]
|L2.570|
00023a 4408 ADD r0,r0,r1 ;606
00023c 8038 STRH r0,[r7,#0] ;606
|L2.574|
00023e 1c6d ADDS r5,r5,#1 ;599
|L2.576|
000240 984b LDR r0,[sp,#0x12c] ;599
000242 4285 CMP r5,r0 ;599
000244 ddd7 BLE |L2.502|
;;;609 }
;;;610 }
;;;611 }
;;;612 }
;;;613 /* Count one block completed in EOB run */
;;;614 EOBRUN--;
000246 9849 LDR r0,[sp,#0x124]
000248 1e40 SUBS r0,r0,#1
00024a 9049 STR r0,[sp,#0x124]
|L2.588|
;;;615 }
;;;616
;;;617 /* Completed MCU, so update state */
;;;618 BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
00024c f8db1018 LDR r1,[r11,#0x18]
000250 9843 LDR r0,[sp,#0x10c]
000252 6008 STR r0,[r1,#0]
000254 f8db0018 LDR r0,[r11,#0x18]
000258 9944 LDR r1,[sp,#0x110]
00025a 6041 STR r1,[r0,#4]
00025c 984c LDR r0,[sp,#0x130]
00025e 60c6 STR r6,[r0,#0xc]
000260 984c LDR r0,[sp,#0x130]
;;;619 entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
000262 6104 STR r4,[r0,#0x10]
000264 994c LDR r1,[sp,#0x130]
000266 9849 LDR r0,[sp,#0x124]
000268 6148 STR r0,[r1,#0x14]
|L2.618|
;;;620 }
;;;621
;;;622 /* Account for restart interval (no-op if not using restarts) */
;;;623 entropy->restarts_to_go--;
00026a 984c LDR r0,[sp,#0x130]
00026c 994c LDR r1,[sp,#0x130]
00026e 6a80 LDR r0,[r0,#0x28]
000270 1e40 SUBS r0,r0,#1
;;;624
;;;625 return TRUE;
000272 6288 STR r0,[r1,#0x28]
000274 2001 MOVS r0,#1
|L2.630|
;;;626
;;;627 undoit:
;;;628 /* Re-zero any output coefficients that we made newly nonzero */
;;;629 while (num_newnz > 0)
;;;630 (*block)[newnz_pos[--num_newnz]] = 0;
;;;631
;;;632 return FALSE;
;;;633 }
000276 b04d ADD sp,sp,#0x134
000278 e8bd8ff0 POP {r4-r11,pc}
|L2.636|
00027c e007 B |L2.654|
|L2.638|
00027e 1e40 SUBS r0,r0,#1 ;630
000280 9041 STR r0,[sp,#0x104] ;630
000282 f8520020 LDR r0,[r2,r0,LSL #2] ;630
000286 9b48 LDR r3,[sp,#0x120] ;630
000288 f8231010 STRH r1,[r3,r0,LSL #1] ;630
00028c e001 B |L2.658|
|L2.654|
00028e aa01 ADD r2,sp,#4 ;504
000290 2100 MOVS r1,#0 ;507
|L2.658|
000292 9841 LDR r0,[sp,#0x104] ;629
000294 2800 CMP r0,#0 ;629
000296 dcf2 BGT |L2.638|
|L2.664|
000298 2000 MOVS r0,#0 ;632
00029a e7ec B |L2.630|
;;;634
ENDP
|L2.668|
DCD jpeg_natural_order
AREA ||i.decode_mcu_DC_first||, CODE, READONLY, ALIGN=2
decode_mcu_DC_first PROC
;;;285 METHODDEF(boolean)
;;;286 decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
000000 e92d4ff3 PUSH {r0,r1,r4-r11,lr}
;;;287 {
000004 4606 MOV r6,r0
;;;288 phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
;;;289 int Al = cinfo->Al;
000006 f8d071bc LDR r7,[r0,#0x1bc]
00000a b08d SUB sp,sp,#0x34 ;287
00000c f8d0019c LDR r0,[r0,#0x19c]
000010 f8d61114 LDR r1,[r6,#0x114]
;;;290 register int s, r;
;;;291 int blkn, ci;
;;;292 JBLOCKROW block;
;;;293 BITREAD_STATE_VARS;
;;;294 savable_state state;
;;;295 d_derived_tbl * tbl;
;;;296 jpeg_component_info * compptr;
;;;297
;;;298 /* Process restart marker if needed; may have to suspend */
;;;299 if (cinfo->restart_interval) {
000014 900b STR r0,[sp,#0x2c]
000016 b131 CBZ r1,|L3.38|
;;;300 if (entropy->restarts_to_go == 0)
000018 6ab8 LDR r0,[r7,#0x28]
00001a b920 CBNZ r0,|L3.38|
;;;301 if (! process_restart(cinfo))
00001c 4630 MOV r0,r6
00001e f7fffffe BL process_restart
000022 2800 CMP r0,#0
000024 d056 BEQ |L3.212|
|L3.38|
;;;302 return FALSE;
;;;303 }
;;;304
;;;305 /* If we've run out of data, just leave the MCU set to zeroes.
;;;306 * This way, we return uniform gray for the remainder of the segment.
;;;307 */
;;;308 if (! entropy->pub.insufficient_data) {
000026 68b8 LDR r0,[r7,#8]
000028 2800 CMP r0,#0
00002a d17e BNE |L3.298|
;;;309
;;;310 /* Load up working state */
;;;311 BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
00002c 960a STR r6,[sp,#0x28]
00002e 69b0 LDR r0,[r6,#0x18]
;;;312 ASSIGN_STATE(state, entropy->saved);
000030 2214 MOVS r2,#0x14
000032 6801 LDR r1,[r0,#0] ;311
000034 9106 STR r1,[sp,#0x18] ;311
000036 6840 LDR r0,[r0,#4] ;311
000038 9007 STR r0,[sp,#0x1c] ;311
00003a e9d78403 LDRD r8,r4,[r7,#0xc]
00003e f1070114 ADD r1,r7,#0x14
000042 a801 ADD r0,sp,#4
000044 910c STR r1,[sp,#0x30]
000046 f7fffffe BL __aeabi_memcpy4
;;;313
;;;314 /* Outer loop handles each block in the MCU */
;;;315
;;;316 for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
00004a 2000 MOVS r0,#0
00004c e066 B |L3.284|
|L3.78|
;;;317 block = MCU_data[blkn];
00004e 980e LDR r0,[sp,#0x38]
;;;318 ci = cinfo->MCU_membership[blkn];
;;;319 compptr = cinfo->cur_comp_info[ci];
;;;320 tbl = entropy->derived_tbls[compptr->dc_tbl_no];
;;;321
;;;322 /* Decode a single block's worth of coefficients */
;;;323
;;;324 /* Section F.2.2.1: decode the DC coefficient difference */
;;;325 HUFF_DECODE(s, br_state, tbl, return FALSE, label1);
000050 2c08 CMP r4,#8
000052 f850b029 LDR r11,[r0,r9,LSL #2] ;317
000056 eb060089 ADD r0,r6,r9,LSL #2 ;318
00005a f8d0a168 LDR r10,[r0,#0x168] ;319
00005e eb06008a ADD r0,r6,r10,LSL #2 ;319
000062 f8d0014c LDR r0,[r0,#0x14c] ;319
000066 6940 LDR r0,[r0,#0x14] ;320
000068 eb070080 ADD r0,r7,r0,LSL #2 ;320
00006c 6ac5 LDR r5,[r0,#0x2c]
00006e da0c BGE |L3.138|
000070 2300 MOVS r3,#0
000072 4622 MOV r2,r4
000074 4641 MOV r1,r8
000076 a806 ADD r0,sp,#0x18
000078 f7fffffe BL jpeg_fill_bit_buffer
00007c b350 CBZ r0,|L3.212|
00007e e9dd8408 LDRD r8,r4,[sp,#0x20]
000082 2c08 CMP r4,#8
000084 da01 BGE |L3.138|
000086 2301 MOVS r3,#1
000088 e00f B |L3.170|
|L3.138|
00008a f1a40008 SUB r0,r4,#8
00008e fa48f100 ASR r1,r8,r0
000092 b2c8 UXTB r0,r1
000094 eb050180 ADD r1,r5,r0,LSL #2
000098 f8d11090 LDR r1,[r1,#0x90]
00009c b121 CBZ r1,|L3.168|
00009e 4428 ADD r0,r0,r5
0000a0 1a64 SUBS r4,r4,r1
0000a2 f8905490 LDRB r5,[r0,#0x490]
0000a6 e00b B |L3.192|
|L3.168|
0000a8 2309 MOVS r3,#9
|L3.170|
0000aa 9300 STR r3,[sp,#0]
0000ac 462b MOV r3,r5
0000ae 4622 MOV r2,r4
0000b0 4641 MOV r1,r8
0000b2 a806 ADD r0,sp,#0x18
0000b4 f7fffffe BL jpeg_huff_decode
0000b8 1e05 SUBS r5,r0,#0
0000ba db0b BLT |L3.212|
0000bc e9dd8408 LDRD r8,r4,[sp,#0x20]
|L3.192|
;;;326 if (s) {
0000c0 b305 CBZ r5,|L3.260|
;;;327 CHECK_BIT_BUFFER(br_state, s, return FALSE);
0000c2 42ac CMP r4,r5
0000c4 da0c BGE |L3.224|
0000c6 462b MOV r3,r5
0000c8 4622 MOV r2,r4
0000ca 4641 MOV r1,r8
0000cc a806 ADD r0,sp,#0x18
0000ce f7fffffe BL jpeg_fill_bit_buffer
0000d2 b918 CBNZ r0,|L3.220|
|L3.212|
0000d4 2000 MOVS r0,#0
|L3.214|
;;;328 r = GET_BITS(s);
;;;329 s = HUFF_EXTEND(r, s);
;;;330 }
;;;331
;;;332 /* Convert DC difference to actual value, update last_dc_val */
;;;333 s += state.last_dc_val[ci];
;;;334 state.last_dc_val[ci] = s;
;;;335 /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */
;;;336 (*block)[0] = (JCOEF) (s << Al);
;;;337 }
;;;338
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -