OSDN Git Service

sbc: Fix misuse of 'frame.joint' when estimating the frame length.
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>
Fri, 20 Mar 2009 21:40:43 +0000 (18:40 -0300)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 30 Jul 2012 02:48:28 +0000 (19:48 -0700)
'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.

sbc/sbc.c

index a33ed57..1510adc 100644 (file)
--- 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;
 }