summaryrefslogtreecommitdiff
path: root/libavcodec/flacdec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-08-21 16:17:13 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-08-21 16:17:13 +0200
commit50df56161f42da21a455204b76e17148ac3d9659 (patch)
treead524d8438b0dc82e7da4bf1aa124024fdcee971 /libavcodec/flacdec.c
parent26ec392a0e30409fbb0738a5173a9b71a9c99df0 (diff)
parent72e8d86b19c605f2173b20e56cbc42e032572e08 (diff)
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.c45
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;