summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hoene <hoene@ieee.org>2009-01-05 13:26:08 +0100
committerMarcel Holtmann <marcel@holtmann.org>2012-07-29 19:48:27 -0700
commite9507c9e3064695d9a36d5f46cdb7fa58a1f4d99 (patch)
tree448d5c3ba9dbddb307e224c35680c739ee425969
parent238de03b4631cea274b5324cf8ea9a0cd029c778 (diff)
sbc: Fixed correct handling of frame sizes in the encoder
-rw-r--r--sbc/sbc.c6
-rw-r--r--sbc/sbc.h2
-rw-r--r--sbc/sbcenc.c4
3 files changed, 7 insertions, 5 deletions
diff --git a/sbc/sbc.c b/sbc/sbc.c
index 650bc2f..8fff277 100644
--- 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;
diff --git a/sbc/sbc.h b/sbc/sbc.h
index 2838b1f..8ac5930 100644
--- 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
diff --git a/sbc/sbcenc.c b/sbc/sbcenc.c
index 2a8066e..9cbfb87 100644
--- a/sbc/sbcenc.c
+++ b/sbc/sbcenc.c
@@ -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);