📄 hcr.c
字号:
/* process only sfb's that are due now */ ((ics->sect_start[g][i] <= sfb) && (ics->sect_end[g][i] > sfb)) ) { if ((sect_cb != ZERO_HCB) && (sect_cb != NOISE_HCB) && (sect_cb != INTENSITY_HCB) && (sect_cb != INTENSITY_HCB2)) { uint8_t inc = (sect_cb < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN; uint16_t k; uint32_t hw, lw; for (k=0; (k < (4/inc)*ics->window_group_length[g]) && ( (k+w*ics->window_group_length[g]/inc) < (ics->sect_sfb_offset[g][sfb+1] - ics->sect_sfb_offset[g][sfb])); k++) { uint16_t sp = sp_offset[g] + ics->sect_sfb_offset[g][sfb] + inc*(k+w*ics->window_group_length[g]/inc); if (!PCW_decoded) { /* if we haven't yet read until the end of the buffer, we can directly decode the so-called PCWs */ if ((BitsRead + segmentWidth( sect_cb ))<= ics->length_of_reordered_spectral_data) { Segment[ numberOfSegments ].len = segmentWidth( sect_cb ); if (segmentWidth( sect_cb ) > 32) { Segment[ numberOfSegments ].bufb = faad_showbits(ld, segmentWidth( sect_cb ) - 32); faad_flushbits(ld, segmentWidth( sect_cb) - 32); Segment[ numberOfSegments ].bufa = faad_showbits(ld, 32), faad_flushbits(ld, 32 ); } else { Segment[ numberOfSegments ].bufa = faad_showbits(ld, segmentWidth( sect_cb )); Segment[ numberOfSegments ].bufb = 0; faad_flushbits(ld, segmentWidth( sect_cb) ); } huffman_spectral_data_2(sect_cb, &Segment[ numberOfSegments ], &spectral_data[sp]); BitsRead += segmentWidth( sect_cb ); /* skip to next segment, but store left bits in new buffer */ rewind_bits( &Segment[ numberOfSegments ]); numberOfSegments++; } else { /* the last segment is extended until length_of_reordered_spectral_data */ if (BitsRead < ics->length_of_reordered_spectral_data) { uint8_t additional_bits = (ics->length_of_reordered_spectral_data - BitsRead); if ( additional_bits > 32) { hw = faad_showbits(ld, additional_bits - 32); faad_flushbits(ld, additional_bits - 32); lw = faad_showbits(ld, 32); faad_flushbits(ld, 32 ); } else { lw = faad_showbits(ld, additional_bits); hw = 0; faad_flushbits(ld, additional_bits ); } rewind_lword( &hw, &lw, additional_bits + Segment[ numberOfSegments-1 ].len ); if (Segment[ numberOfSegments-1 ].len > 32) { Segment[ numberOfSegments-1 ].bufb = hw + showbits_hcr(&Segment[ numberOfSegments-1 ], Segment[ numberOfSegments-1 ].len - 32); Segment[ numberOfSegments-1 ].bufa = lw + showbits_hcr(&Segment[ numberOfSegments-1 ], 32); } else { Segment[ numberOfSegments-1 ].bufa = lw + showbits_hcr(&Segment[ numberOfSegments-1 ], Segment[ numberOfSegments-1 ].len); Segment[ numberOfSegments-1 ].bufb = hw; } Segment[ numberOfSegments-1 ].len += additional_bits; } BitsRead = ics->length_of_reordered_spectral_data; PCW_decoded = 1; Codewords[ 0 ].sp_offset = sp; Codewords[ 0 ].cb = sect_cb; Codewords[ 0 ].decoded = 0; Codewords[ 0 ].bits.len = 0; } } else { Codewords[ NrCodeWords - numberOfSegments ].sp_offset = sp; Codewords[ NrCodeWords - numberOfSegments ].cb = sect_cb; Codewords[ NrCodeWords - numberOfSegments ].decoded = 0; Codewords[ NrCodeWords - numberOfSegments ].bits.len = 0; } /* PCW decoded */ NrCodeWords++; } /* of k */ } } } /* of i */ } /* of g */ } /* of w */ } /* of sfb */ } /* of presort */ /* Avoid divide by zero */ if (numberOfSegments == 0) return 10; /* this is not good... */ numberOfSets = NrCodeWords / numberOfSegments; /* second step: decode nonPCWs */ for (set = 1; set <= numberOfSets; set++) { uint16_t trial; for (trial = 0; trial < numberOfSegments; trial++) { uint16_t codewordBase; uint16_t set_decoded=numberOfSegments; if (set == numberOfSets) set_decoded = NrCodeWords - set*numberOfSegments; /* last set is shorter than the rest */ for (codewordBase = 0; codewordBase < numberOfSegments; codewordBase++) { uint16_t segment_index = (trial + codewordBase) % numberOfSegments; uint16_t codeword_index = codewordBase + set*numberOfSegments - numberOfSegments; if ((codeword_index + numberOfSegments) >= NrCodeWords) break; if (!Codewords[ codeword_index ].decoded) { if ( Segment[ segment_index ].len > 0) { uint8_t tmplen; if (Codewords[ codeword_index ].bits.len != 0) { /* on the first trial the data is only stored in Segment[], not in Codewords[]. On next trials first collect the data stored for this codeword and concatenate the new data from Segment[] */ concat_bits( &Codewords[ codeword_index ].bits, &Segment[ segment_index ]); /* Now everthing is stored in Segment[] */ } tmplen = Segment[ segment_index ].len; if ( huffman_spectral_data_2(Codewords[ codeword_index ].cb, &Segment[ segment_index ], &spectral_data[ Codewords[ codeword_index ].sp_offset ]) >=0) { /* CW did fit into segment */ Codewords[ codeword_index ].decoded = 1; set_decoded--; } else { /* CW did not fit, so store for later use */ Codewords[ codeword_index ].bits.len = tmplen; Codewords[ codeword_index ].bits.bufa = Segment[ segment_index ].bufa; Codewords[ codeword_index ].bits.bufb = Segment[ segment_index ].bufb; } } } } /* of codewordBase */ if (set_decoded == 0) break; /* no undecoded codewords left in this set */ } /* of trial */ /* rewind all bits in remaining segments with len>0 */ for (i=0; i < numberOfSegments; i++) rewind_bits( &Segment[ i ] ); }#if 0 { int i, r=0, c=0; for (i=0; i< numberOfSegments; i++) r += Segment[ i ].len; if (r != 0) { printf("reordered_spectral_data: %d bits remaining!\n", r); } for (i=0; i< NrCodeWords - numberOfSegments; i++) { if (Codewords[ i ].decoded == 0) { c++; } } if (c != 0) { printf("reordered_spectral_data: %d Undecoded Codewords remaining!\n",c ); } if ((r !=0) || (c!=0)) return 10; }#endif return 0;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -