OSDN Git Service

sbc: Fixed correct handling of frame sizes in the encoder
authorChristian Hoene <hoene@ieee.org>
Mon, 5 Jan 2009 12:26:08 +0000 (13:26 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 30 Jul 2012 02:48:27 +0000 (19:48 -0700)
sbc/sbc.c
sbc/sbc.h
sbc/sbcenc.c

index 650bc2f..8fff277 100644 (file)
--- a/sbc/sbc.c
+++ b/sbc/sbc.c
@@ -69,7 +69,7 @@ struct sbc_frame {
        uint8_t subband_mode;
        uint8_t subbands;
        uint8_t bitpool;
-       uint8_t codesize;
+       uint16_t codesize;
        uint8_t length;
 
        /* bit number x set means joint stereo has been used in subband x */
@@ -1329,9 +1329,9 @@ int sbc_get_frame_duration(sbc_t *sbc)
        return (1000000 * blocks * subbands) / frequency;
 }
 
-int sbc_get_codesize(sbc_t *sbc)
+uint16_t sbc_get_codesize(sbc_t *sbc)
 {
-       uint8_t subbands, channels, blocks;
+       uint16_t subbands, channels, blocks;
        struct sbc_priv *priv;
 
        priv = sbc->priv;
index 2838b1f..8ac5930 100644 (file)
--- a/sbc/sbc.h
+++ b/sbc/sbc.h
@@ -87,7 +87,7 @@ int sbc_encode(sbc_t *sbc, void *input, int input_len, void *output,
                int output_len, int *written);
 int sbc_get_frame_length(sbc_t *sbc);
 int sbc_get_frame_duration(sbc_t *sbc);
-int sbc_get_codesize(sbc_t *sbc);
+uint16_t sbc_get_codesize(sbc_t *sbc);
 void sbc_finish(sbc_t *sbc);
 
 #ifdef __cplusplus
index 2a8066e..9cbfb87 100644 (file)
@@ -47,7 +47,7 @@ static ssize_t __read(int fd, void *buf, size_t count)
        while (count > 0) {
                len = read(fd, buf + pos, count);
                if (len <= 0)
-                       return len;
+                       return pos > len ? pos : len;
 
                count -= len;
                pos   += len;
@@ -188,6 +188,8 @@ static void encode(char *filename, int subbands, int bitpool, int joint,
 
                len = sbc_encode(&sbc, input, size,
                                        output, sizeof(output), &encoded);
+               if (len <= 0)
+                       break;
                if (len < size)
                        memmove(input, input + len, size - len);