Use a single value for SNR offset in the bit allocation search rather than

the separate coarse and fine values.

Originally committed as revision 26010 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Justin Ruggles 2010-12-14 22:45:22 +00:00
parent 70fcd7ea80
commit a0d763fc88
1 changed files with 29 additions and 33 deletions

View File

@ -923,12 +923,12 @@ static int bit_alloc(AC3EncodeContext *s,
int16_t mask[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS], int16_t mask[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS],
int16_t psd[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS], int16_t psd[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
uint8_t bap[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS], uint8_t bap[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
int coarse_snr_offset, int fine_snr_offset) int snr_offset)
{ {
int blk, ch; int blk, ch;
int snr_offset, mantissa_bits; int mantissa_bits;
snr_offset = (((coarse_snr_offset - 15) << 4) + fine_snr_offset) << 2; snr_offset = (snr_offset - 240) << 2;
mantissa_bits = 0; mantissa_bits = 0;
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
@ -947,8 +947,6 @@ static int bit_alloc(AC3EncodeContext *s,
} }
#define SNR_INC1 4
/** /**
* Perform bit allocation search. * Perform bit allocation search.
* Finds the SNR offset value that maximizes quality and fits in the specified * Finds the SNR offset value that maximizes quality and fits in the specified
@ -962,7 +960,7 @@ static int compute_bit_allocation(AC3EncodeContext *s,
{ {
int ch; int ch;
int bits_left; int bits_left;
int coarse_snr_offset, fine_snr_offset; int snr_offset;
uint8_t bap1[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS]; uint8_t bap1[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS];
int16_t psd[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS]; int16_t psd[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS];
int16_t mask[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS]; int16_t mask[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS];
@ -977,42 +975,40 @@ static int compute_bit_allocation(AC3EncodeContext *s,
offset until we can pack everything in the requested frame size */ offset until we can pack everything in the requested frame size */
bits_left = 8 * s->frame_size - (s->frame_bits + s->exponent_bits); bits_left = 8 * s->frame_size - (s->frame_bits + s->exponent_bits);
coarse_snr_offset = s->coarse_snr_offset; snr_offset = s->coarse_snr_offset << 4;
while (coarse_snr_offset >= 0 && while (snr_offset >= 0 &&
bit_alloc(s, mask, psd, bap, coarse_snr_offset, 0) > bits_left) bit_alloc(s, mask, psd, bap, snr_offset) > bits_left)
coarse_snr_offset -= SNR_INC1; snr_offset -= 64;
if (coarse_snr_offset < 0) { if (snr_offset < 0) {
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
while (coarse_snr_offset + SNR_INC1 <= 63 && while (snr_offset + 64 <= 1023 &&
bit_alloc(s, mask, psd, bap1, bit_alloc(s, mask, psd, bap1,
coarse_snr_offset + SNR_INC1, 0) <= bits_left) { snr_offset + 64) <= bits_left) {
coarse_snr_offset += SNR_INC1; snr_offset += 64;
memcpy(bap, bap1, sizeof(bap1)); memcpy(bap, bap1, sizeof(bap1));
} }
while (coarse_snr_offset + 1 <= 63 && while (snr_offset + 16 <= 1023 &&
bit_alloc(s, mask, psd, bap1, coarse_snr_offset + 1, 0) <= bits_left) { bit_alloc(s, mask, psd, bap1, snr_offset + 16) <= bits_left) {
coarse_snr_offset++; snr_offset += 16;
memcpy(bap, bap1, sizeof(bap1));
}
while (snr_offset + 4 <= 1023 &&
bit_alloc(s, mask, psd, bap1,
snr_offset + 4) <= bits_left) {
snr_offset += 4;
memcpy(bap, bap1, sizeof(bap1));
}
while (snr_offset + 1 <= 1023 &&
bit_alloc(s, mask, psd, bap1,
snr_offset + 1) <= bits_left) {
snr_offset++;
memcpy(bap, bap1, sizeof(bap1)); memcpy(bap, bap1, sizeof(bap1));
} }
fine_snr_offset = 0; s->coarse_snr_offset = snr_offset >> 4;
while (fine_snr_offset + SNR_INC1 <= 15 &&
bit_alloc(s, mask, psd, bap1,
coarse_snr_offset, fine_snr_offset + SNR_INC1) <= bits_left) {
fine_snr_offset += SNR_INC1;
memcpy(bap, bap1, sizeof(bap1));
}
while (fine_snr_offset + 1 <= 15 &&
bit_alloc(s, mask, psd, bap1,
coarse_snr_offset, fine_snr_offset + 1) <= bits_left) {
fine_snr_offset++;
memcpy(bap, bap1, sizeof(bap1));
}
s->coarse_snr_offset = coarse_snr_offset;
for (ch = 0; ch < s->channels; ch++) for (ch = 0; ch < s->channels; ch++)
s->fine_snr_offset[ch] = fine_snr_offset; s->fine_snr_offset[ch] = snr_offset & 0xF;
return 0; return 0;
} }