📄 jdphuff.txt
字号:
;;;236 entropy->bitstate.bits_left = 0;
00001a 2600 MOVS r6,#0
00001c 6188 STR r0,[r1,#0x18]
;;;237
;;;238 /* Advance past the RSTn marker */
;;;239 if (! (*cinfo->marker->read_restart_marker) (cinfo))
00001e 6126 STR r6,[r4,#0x10]
000020 f8d501b8 LDR r0,[r5,#0x1b8]
000024 6881 LDR r1,[r0,#8]
000026 4628 MOV r0,r5
000028 4788 BLX r1
00002a 2800 CMP r0,#0
00002c d013 BEQ |L6.86|
;;;240 return FALSE;
;;;241
;;;242 /* Re-initialize DC predictions to 0 */
;;;243 for (ci = 0; ci < cinfo->comps_in_scan; ci++)
00002e 2000 MOVS r0,#0
000030 e004 B |L6.60|
;;;244 entropy->saved.last_dc_val[ci] = 0;
000032 bf00 NOP
|L6.52|
000034 eb040180 ADD r1,r4,r0,LSL #2
000038 1c40 ADDS r0,r0,#1 ;243
00003a 618e STR r6,[r1,#0x18] ;243
|L6.60|
00003c f8d51148 LDR r1,[r5,#0x148] ;243
000040 4281 CMP r1,r0 ;243
000042 dcf7 BGT |L6.52|
;;;245 /* Re-init EOB run count, too */
;;;246 entropy->saved.EOBRUN = 0;
;;;247
;;;248 /* Reset restart counter */
;;;249 entropy->restarts_to_go = cinfo->restart_interval;
000044 6166 STR r6,[r4,#0x14]
000046 f8d50114 LDR r0,[r5,#0x114]
;;;250
;;;251 /* Reset out-of-data flag, unless read_restart_marker left us smack up
;;;252 * against a marker. In that case we will end up treating the next data
;;;253 * segment as empty, and we can avoid producing bogus output pixels by
;;;254 * leaving the flag set.
;;;255 */
;;;256 if (cinfo->unread_marker == 0)
00004a 62a0 STR r0,[r4,#0x28]
00004c f8d501a0 LDR r0,[r5,#0x1a0]
000050 b900 CBNZ r0,|L6.84|
;;;257 entropy->pub.insufficient_data = FALSE;
000052 60a6 STR r6,[r4,#8]
|L6.84|
;;;258
;;;259 return TRUE;
000054 2001 MOVS r0,#1
|L6.86|
;;;260 }
000056 bd70 POP {r4-r6,pc}
;;;261
ENDP
AREA ||i.start_pass_phuff_decoder||, CODE, READONLY, ALIGN=2
start_pass_phuff_decoder PROC
;;;91 METHODDEF(void)
;;;92 start_pass_phuff_decoder (j_decompress_ptr cinfo)
000000 e92d5ff0 PUSH {r4-r12,lr}
;;;93 {
;;;94 phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
;;;95 boolean is_DC_band, bad;
;;;96 int ci, coefi, tbl;
;;;97 int *coef_bit_ptr;
;;;98 jpeg_component_info * compptr;
;;;99
;;;100 is_DC_band = (cinfo->Ss == 0);
000004 f8d061bc LDR r6,[r0,#0x1bc]
000008 f8d03190 LDR r3,[r0,#0x190]
00000c 4604 MOV r4,r0 ;93
00000e 2201 MOVS r2,#1
000010 b103 CBZ r3,|L7.20|
000012 2200 MOVS r2,#0
|L7.20|
;;;101
;;;102 /* Validate scan parameters */
;;;103 bad = FALSE;
;;;104 if (is_DC_band) {
000014 f8d41194 LDR r1,[r4,#0x194]
000018 ea5f0a02 MOVS r10,r2 ;100
00001c f04f0000 MOV r0,#0 ;103
000020 d001 BEQ |L7.38|
;;;105 if (cinfo->Se != 0)
000022 b151 CBZ r1,|L7.58|
000024 e008 B |L7.56|
|L7.38|
;;;106 bad = TRUE;
;;;107 } else {
;;;108 /* need not check Ss/Se < 0 since they came from unsigned bytes */
;;;109 if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2)
000026 428b CMP r3,r1
000028 dc01 BGT |L7.46|
00002a 2940 CMP r1,#0x40
00002c db00 BLT |L7.48|
|L7.46|
;;;110 bad = TRUE;
00002e 2001 MOVS r0,#1
|L7.48|
;;;111 /* AC scans may have only one component */
;;;112 if (cinfo->comps_in_scan != 1)
000030 f8d41148 LDR r1,[r4,#0x148]
000034 2901 CMP r1,#1
000036 d000 BEQ |L7.58|
|L7.56|
;;;113 bad = TRUE;
000038 2001 MOVS r0,#1
|L7.58|
;;;114 }
;;;115 if (cinfo->Ah != 0) {
;;;116 /* Successive approximation refinement scan: must have Al = Ah-1. */
;;;117 if (cinfo->Al != cinfo->Ah-1)
00003a f8d42198 LDR r2,[r4,#0x198]
00003e f8d4119c LDR r1,[r4,#0x19c] ;115
000042 b11a CBZ r2,|L7.76|
000044 1e52 SUBS r2,r2,#1
000046 4291 CMP r1,r2
000048 d000 BEQ |L7.76|
;;;118 bad = TRUE;
00004a 2001 MOVS r0,#1
|L7.76|
;;;119 }
;;;120 if (cinfo->Al > 13) /* need not check for < 0 */
00004c 290d CMP r1,#0xd
00004e dc00 BGT |L7.82|
;;;121 bad = TRUE;
;;;122 /* Arguably the maximum Al value should be less than 13 for 8-bit precision,
;;;123 * but the spec doesn't say so, and we try to be liberal about what we
;;;124 * accept. Note: large Al values could result in out-of-range DC
;;;125 * coefficients during early scans, leading to bizarre displays due to
;;;126 * overflows in the IDCT math. But we won't crash.
;;;127 */
;;;128 if (bad)
000050 b1b0 CBZ r0,|L7.128|
|L7.82|
;;;129 ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
000052 6821 LDR r1,[r4,#0]
000054 2010 MOVS r0,#0x10
000056 6148 STR r0,[r1,#0x14]
000058 6821 LDR r1,[r4,#0]
00005a f8d40190 LDR r0,[r4,#0x190]
00005e 6188 STR r0,[r1,#0x18]
000060 6821 LDR r1,[r4,#0]
000062 f8d40194 LDR r0,[r4,#0x194]
000066 61c8 STR r0,[r1,#0x1c]
000068 6821 LDR r1,[r4,#0]
00006a f8d40198 LDR r0,[r4,#0x198]
00006e 6208 STR r0,[r1,#0x20]
000070 6821 LDR r1,[r4,#0]
000072 f8d4019c LDR r0,[r4,#0x19c]
000076 6248 STR r0,[r1,#0x24]
000078 6820 LDR r0,[r4,#0]
00007a 6801 LDR r1,[r0,#0]
00007c 4620 MOV r0,r4
00007e 4788 BLX r1
|L7.128|
;;;130 cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
;;;131 /* Update progression status, and verify that scan order is legal.
;;;132 * Note that inter-scan inconsistencies are treated as warnings
;;;133 * not fatal errors ... not clear if this is right way to behave.
;;;134 */
;;;135 for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
000080 f04f0900 MOV r9,#0
000084 46cb MOV r11,r9 ;100
000086 e044 B |L7.274|
|L7.136|
;;;136 int cindex = cinfo->cur_comp_info[ci]->component_index;
000088 eb040089 ADD r0,r4,r9,LSL #2
00008c f8d0014c LDR r0,[r0,#0x14c]
;;;137 coef_bit_ptr = & cinfo->coef_bits[cindex][0];
;;;138 if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
000090 f8d410a0 LDR r1,[r4,#0xa0]
000094 f8d08004 LDR r8,[r0,#4] ;137
000098 f1ba0f00 CMP r10,#0
00009c eb012708 ADD r7,r1,r8,LSL #8 ;137
0000a0 d111 BNE |L7.198|
0000a2 6838 LDR r0,[r7,#0]
0000a4 2800 CMP r0,#0
0000a6 da0e BGE |L7.198|
;;;139 WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
0000a8 6821 LDR r1,[r4,#0]
0000aa 2073 MOVS r0,#0x73
0000ac 6148 STR r0,[r1,#0x14]
0000ae 6821 LDR r1,[r4,#0]
0000b0 f8c18018 STR r8,[r1,#0x18]
0000b4 6821 LDR r1,[r4,#0]
0000b6 f8c1b01c STR r11,[r1,#0x1c]
0000ba 6820 LDR r0,[r4,#0]
0000bc f04f31ff MOV r1,#0xffffffff
0000c0 6842 LDR r2,[r0,#4]
0000c2 4620 MOV r0,r4
0000c4 4790 BLX r2
|L7.198|
;;;140 for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
0000c6 f8d45190 LDR r5,[r4,#0x190]
0000ca e01c B |L7.262|
|L7.204|
;;;141 int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
0000cc f8571025 LDR r1,[r7,r5,LSL #2]
0000d0 4658 MOV r0,r11
0000d2 2900 CMP r1,#0
0000d4 db00 BLT |L7.216|
0000d6 4608 MOV r0,r1
|L7.216|
;;;142 if (cinfo->Ah != expected)
0000d8 f8d41198 LDR r1,[r4,#0x198]
0000dc 4281 CMP r1,r0
0000de d00d BEQ |L7.252|
;;;143 WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);
0000e0 6821 LDR r1,[r4,#0]
0000e2 2073 MOVS r0,#0x73
0000e4 6148 STR r0,[r1,#0x14]
0000e6 6821 LDR r1,[r4,#0]
0000e8 f8c18018 STR r8,[r1,#0x18]
0000ec 6820 LDR r0,[r4,#0]
0000ee f04f31ff MOV r1,#0xffffffff
0000f2 61c5 STR r5,[r0,#0x1c]
0000f4 6820 LDR r0,[r4,#0]
0000f6 6842 LDR r2,[r0,#4]
0000f8 4620 MOV r0,r4
0000fa 4790 BLX r2
|L7.252|
;;;144 coef_bit_ptr[coefi] = cinfo->Al;
0000fc f8d4019c LDR r0,[r4,#0x19c]
000100 f8470025 STR r0,[r7,r5,LSL #2]
000104 1c6d ADDS r5,r5,#1 ;140
|L7.262|
000106 f8d40194 LDR r0,[r4,#0x194] ;140
00010a 42a8 CMP r0,r5 ;140
00010c dade BGE |L7.204|
00010e f1090901 ADD r9,r9,#1 ;135
|L7.274|
000112 f8d40148 LDR r0,[r4,#0x148] ;135
000116 4548 CMP r0,r9 ;135
000118 dcb6 BGT |L7.136|
;;;145 }
;;;146 }
;;;147
;;;148 /* Select MCU decoding routine */
;;;149 if (cinfo->Ah == 0) {
00011a f8d40198 LDR r0,[r4,#0x198]
00011e 2800 CMP r0,#0
;;;150 if (is_DC_band)
000120 4650 MOV r0,r10
000122 d104 BNE |L7.302|
000124 b108 CBZ r0,|L7.298|
;;;151 entropy->pub.decode_mcu = decode_mcu_DC_first;
000126 481f LDR r0,|L7.420|
000128 e005 B |L7.310|
|L7.298|
;;;152 else
;;;153 entropy->pub.decode_mcu = decode_mcu_AC_first;
00012a 481f LDR r0,|L7.424|
00012c e003 B |L7.310|
|L7.302|
;;;154 } else {
;;;155 if (is_DC_band)
00012e b108 CBZ r0,|L7.308|
;;;156 entropy->pub.decode_mcu = decode_mcu_DC_refine;
000130 481e LDR r0,|L7.428|
000132 e000 B |L7.310|
|L7.308|
;;;157 else
;;;158 entropy->pub.decode_mcu = decode_mcu_AC_refine;
000134 481e LDR r0,|L7.432|
|L7.310|
;;;159 }
;;;160
;;;161 for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
000136 2500 MOVS r5,#0
000138 6070 STR r0,[r6,#4]
00013a e022 B |L7.386|
|L7.316|
;;;162 compptr = cinfo->cur_comp_info[ci];
00013c eb040085 ADD r0,r4,r5,LSL #2
000140 f8d0014c LDR r0,[r0,#0x14c]
;;;163 /* Make sure requested tables are present, and compute derived tables.
;;;164 * We may build same derived table more than once, but it's not expensive.
;;;165 */
;;;166 if (is_DC_band) {
000144 f1ba0f00 CMP r10,#0
000148 d00b BEQ |L7.354|
;;;167 if (cinfo->Ah == 0) { /* DC refinement needs no table */
00014a f8d41198 LDR r1,[r4,#0x198]
00014e b999
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -