diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-08-21 16:17:13 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-08-21 16:17:13 +0200 |
commit | 50df56161f42da21a455204b76e17148ac3d9659 (patch) | |
tree | ad524d8438b0dc82e7da4bf1aa124024fdcee971 /libavcodec/flacdec.c | |
parent | 26ec392a0e30409fbb0738a5173a9b71a9c99df0 (diff) | |
parent | 72e8d86b19c605f2173b20e56cbc42e032572e08 (diff) | |
download | ffmpeg-50df56161f42da21a455204b76e17148ac3d9659.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
dirac: use meaningful return values
flacdec: simplify sample buffer handling
flacdec: simplify loop in decode_residuals()
fate: make Ut Video encoder tests use bitexact swscale flags
build: amrwb: Drop redundant lsp dependency declaration
fate: fix utvideoenc tests
Conflicts:
libavcodec/dirac.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/flacdec.c')
-rw-r--r-- | libavcodec/flacdec.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c index 9563b7f9ca..61c30e8c6f 100644 --- a/libavcodec/flacdec.c +++ b/libavcodec/flacdec.c @@ -202,10 +202,11 @@ static int get_metadata_size(const uint8_t *buf, int buf_size) return buf_size - (buf_end - buf); } -static int decode_residuals(FLACContext *s, int channel, int pred_order) +static int decode_residuals(FLACContext *s, int32_t *decoded, int pred_order) { int i, tmp, partition, method_type, rice_order; - int sample = 0, samples; + int rice_bits, rice_esc; + int samples; method_type = get_bits(&s->gb, 2); if (method_type > 1) { @@ -223,17 +224,20 @@ static int decode_residuals(FLACContext *s, int channel, int pred_order) return -1; } - sample= + rice_bits = 4 + method_type; + rice_esc = (1 << rice_bits) - 1; + + decoded += pred_order; i= pred_order; for (partition = 0; partition < (1 << rice_order); partition++) { - tmp = get_bits(&s->gb, method_type == 0 ? 4 : 5); - if (tmp == (method_type == 0 ? 15 : 31)) { + tmp = get_bits(&s->gb, rice_bits); + if (tmp == rice_esc) { tmp = get_bits(&s->gb, 5); - for (; i < samples; i++, sample++) - s->decoded[channel][sample] = get_sbits_long(&s->gb, tmp); + for (; i < samples; i++) + *decoded++ = get_sbits_long(&s->gb, tmp); } else { - for (; i < samples; i++, sample++) { - s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0); + for (; i < samples; i++) { + *decoded++ = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0); } } i= 0; @@ -242,11 +246,10 @@ static int decode_residuals(FLACContext *s, int channel, int pred_order) return 0; } -static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order, - int bps) +static int decode_subframe_fixed(FLACContext *s, int32_t *decoded, + int pred_order, int bps) { const int blocksize = s->blocksize; - int32_t *decoded = s->decoded[channel]; int a, b, c, d, i; /* warm up samples */ @@ -254,7 +257,7 @@ static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order, decoded[i] = get_sbits_long(&s->gb, bps); } - if (decode_residuals(s, channel, pred_order) < 0) + if (decode_residuals(s, decoded, pred_order) < 0) return -1; if (pred_order > 0) @@ -293,13 +296,12 @@ static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order, return 0; } -static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order, +static int decode_subframe_lpc(FLACContext *s, int32_t *decoded, int pred_order, int bps) { int i; int coeff_prec, qlevel; int coeffs[32]; - int32_t *decoded = s->decoded[channel]; /* warm up samples */ for (i = 0; i < pred_order; i++) { @@ -322,7 +324,7 @@ static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order, coeffs[pred_order - i - 1] = get_sbits(&s->gb, coeff_prec); } - if (decode_residuals(s, channel, pred_order) < 0) + if (decode_residuals(s, decoded, pred_order) < 0) return -1; s->dsp.lpc(decoded, coeffs, pred_order, qlevel, s->blocksize); @@ -332,6 +334,7 @@ static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order, static inline int decode_subframe(FLACContext *s, int channel) { + int32_t *decoded = s->decoded[channel]; int type, wasted = 0; int bps = s->bps; int i, tmp; @@ -374,15 +377,15 @@ static inline int decode_subframe(FLACContext *s, int channel) if (type == 0) { tmp = get_sbits_long(&s->gb, bps); for (i = 0; i < s->blocksize; i++) - s->decoded[channel][i] = tmp; + decoded[i] = tmp; } else if (type == 1) { for (i = 0; i < s->blocksize; i++) - s->decoded[channel][i] = get_sbits_long(&s->gb, bps); + decoded[i] = get_sbits_long(&s->gb, bps); } else if ((type >= 8) && (type <= 12)) { - if (decode_subframe_fixed(s, channel, type & ~0x8, bps) < 0) + if (decode_subframe_fixed(s, decoded, type & ~0x8, bps) < 0) return -1; } else if (type >= 32) { - if (decode_subframe_lpc(s, channel, (type & ~0x20)+1, bps) < 0) + if (decode_subframe_lpc(s, decoded, (type & ~0x20)+1, bps) < 0) return -1; } else { av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n"); @@ -392,7 +395,7 @@ static inline int decode_subframe(FLACContext *s, int channel) if (wasted) { int i; for (i = 0; i < s->blocksize; i++) - s->decoded[channel][i] <<= wasted; + decoded[i] <<= wasted; } return 0; |