summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2009-03-20 18:40:43 -0300
committerJohan Hedberg <johan.hedberg@nokia.com>2009-03-21 00:07:29 +0200
commitc9947240b9e784d0f37ca2357bb8099b2e59ee0b (patch)
tree7ae20142b0e1eeb9f0a3ebe55a3ed68b62f9b864
parent074b8ca641d2e6f51451ca71942604abbbdf2596 (diff)
Fix misuse of 'frame.joint' when estimating the frame length.
'frame.joint' is not the flag for joint stereo mode, it is a set of bits which show for which subbands channels joining was actually used.
-rw-r--r--sbc/sbc.c29
1 files changed, 12 insertions, 17 deletions
diff --git a/sbc/sbc.c b/sbc/sbc.c
index a33ed571..1510adcb 100644
--- a/sbc/sbc.c
+++ b/sbc/sbc.c
@@ -1004,7 +1004,7 @@ int sbc_decode(sbc_t *sbc, void *input, int input_len, void *output,
sbc->bitpool = priv->frame.bitpool;
priv->frame.codesize = sbc_get_codesize(sbc);
- priv->frame.length = sbc_get_frame_length(sbc);
+ priv->frame.length = framelen;
}
if (!output)
@@ -1136,30 +1136,25 @@ void sbc_finish(sbc_t *sbc)
int sbc_get_frame_length(sbc_t *sbc)
{
int ret;
- uint8_t subbands, channels, blocks, joint;
+ uint8_t subbands, channels, blocks, joint, bitpool;
struct sbc_priv *priv;
priv = sbc->priv;
- if (!priv->init) {
- subbands = sbc->subbands ? 8 : 4;
- blocks = 4 + (sbc->blocks * 4);
- channels = sbc->mode == SBC_MODE_MONO ? 1 : 2;
- joint = sbc->mode == SBC_MODE_JOINT_STEREO ? 1 : 0;
- } else {
- subbands = priv->frame.subbands;
- blocks = priv->frame.blocks;
- channels = priv->frame.channels;
- joint = priv->frame.joint;
- }
+ if (priv->init)
+ return priv->frame.length;
- ret = 4 + (4 * subbands * channels) / 8;
+ subbands = sbc->subbands ? 8 : 4;
+ blocks = 4 + (sbc->blocks * 4);
+ channels = sbc->mode == SBC_MODE_MONO ? 1 : 2;
+ joint = sbc->mode == SBC_MODE_JOINT_STEREO ? 1 : 0;
+ bitpool = sbc->bitpool;
+ ret = 4 + (4 * subbands * channels) / 8;
/* This term is not always evenly divide so we round it up */
if (channels == 1)
- ret += ((blocks * channels * sbc->bitpool) + 7) / 8;
+ ret += ((blocks * channels * bitpool) + 7) / 8;
else
- ret += (((joint ? subbands : 0) + blocks * sbc->bitpool) + 7)
- / 8;
+ ret += (((joint ? subbands : 0) + blocks * bitpool) + 7) / 8;
return ret;
}