mirror of
https://github.com/claunia/flac.git
synced 2025-12-16 18:54:26 +00:00
optimize special case in FLAC__bitwriter_write_rice_signed_block()
This commit is contained in:
@@ -556,6 +556,36 @@ FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FL
|
|||||||
|
|
||||||
msbits = uval >> parameter;
|
msbits = uval >> parameter;
|
||||||
|
|
||||||
|
#if 1 /* OPT: can remove this special case if it doesn't make up for the extra compare */
|
||||||
|
if(bw->bits + msbits + lsbits <= FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current bwword */
|
||||||
|
bw->bits = bw->bits + msbits + lsbits;
|
||||||
|
uval |= mask1; /* set stop bit */
|
||||||
|
uval &= mask2; /* mask off unused top bits */
|
||||||
|
/* NOT: bw->accum <<= msbits + lsbits because msbits+lsbits could be 32, then the shift would be a NOP */
|
||||||
|
bw->accum <<= msbits;
|
||||||
|
bw->accum <<= lsbits;
|
||||||
|
bw->accum |= uval;
|
||||||
|
if(bw->bits == FLAC__BITS_PER_WORD) {
|
||||||
|
bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum);
|
||||||
|
bw->bits = 0;
|
||||||
|
/* burying the capacity check down here means we have to grow the buffer a little if there are more vals to do */
|
||||||
|
if(bw->capacity <= bw->words && nvals > 1 && !bitwriter_grow_(bw, 1)) {
|
||||||
|
FLAC__ASSERT(bw->capacity == bw->words);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#elif 0 /*@@@@@@ OPT: try this version with MSVC6 to see if better, not much difference for gcc-4 */
|
||||||
|
if(bw->bits + msbits + lsbits < FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current bwword */
|
||||||
|
bw->bits = bw->bits + msbits + lsbits;
|
||||||
|
uval |= mask1; /* set stop bit */
|
||||||
|
uval &= mask2; /* mask off unused top bits */
|
||||||
|
bw->accum <<= msbits + lsbits;
|
||||||
|
bw->accum |= uval;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#endif
|
||||||
/* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+msbits+lsbits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */
|
/* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+msbits+lsbits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */
|
||||||
/* OPT: pessimism may cause flurry of false calls to grow_ which eat up all savings before it */
|
/* OPT: pessimism may cause flurry of false calls to grow_ which eat up all savings before it */
|
||||||
if(bw->capacity <= bw->words + bw->bits + msbits + 1/*lsbits always fit in 1 bwword*/ && !bitwriter_grow_(bw, msbits+lsbits))
|
if(bw->capacity <= bw->words + bw->bits + msbits + 1/*lsbits always fit in 1 bwword*/ && !bitwriter_grow_(bw, msbits+lsbits))
|
||||||
@@ -610,6 +640,9 @@ break1:
|
|||||||
bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum);
|
bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum);
|
||||||
bw->accum = uval;
|
bw->accum = uval;
|
||||||
}
|
}
|
||||||
|
#if 1
|
||||||
|
}
|
||||||
|
#endif
|
||||||
vals++;
|
vals++;
|
||||||
nvals--;
|
nvals--;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user