prepare gapk for dealing with variable-length frames
The existing architecture was modelled around fixed-length codec frame
sizes, which of course fails with multi-rate codecs such as AMR.
diff --git a/src/fmt_racal.c b/src/fmt_racal.c
index 65f810f..1dbc61d 100644
--- a/src/fmt_racal.c
+++ b/src/fmt_racal.c
@@ -18,6 +18,7 @@
*/
#include <stdint.h>
+#include <assert.h>
#include <osmocom/codec/codec.h>
@@ -25,13 +26,18 @@
#include <gapk/formats.h>
#include <gapk/utils.h>
+#define RACAL_HR_LEN 14
+#define RACAL_FR_LEN 33
+#define RACAL_EFR_LEN 31
static int
-racal_hr_from_canon(uint8_t *dst, const uint8_t *src)
+racal_hr_from_canon(uint8_t *dst, const uint8_t *src, unsigned int src_len)
{
int i, voiced;
const uint16_t *bit_mapping;
+ assert(src_len == HR_CANON_LEN);
+
voiced = (msb_get_bit(src, 34) << 1) | msb_get_bit(src, 35);
bit_mapping = voiced ?
@@ -44,15 +50,17 @@
lsb_put_bit(dst, di, msb_get_bit(src, si));
}
- return 0;
+ return RACAL_HR_LEN;
}
static int
-racal_hr_to_canon(uint8_t *dst, const uint8_t *src)
+racal_hr_to_canon(uint8_t *dst, const uint8_t *src, unsigned int src_len)
{
int i, voiced;
const uint16_t *bit_mapping;
+ assert(src_len == HR_CANON_LEN);
+
voiced = (lsb_get_bit(src, 94) << 1) | lsb_get_bit(src, 93);
bit_mapping = voiced ?
@@ -65,7 +73,7 @@
msb_put_bit(dst, di, lsb_get_bit(src, si));
}
- return 0;
+ return RACAL_HR_LEN;
}
const struct format_desc fmt_racal_hr = {
@@ -74,17 +82,19 @@
.name = "racal-hr",
.description = "Racal HR TCH/H recording",
- .frame_len = 14,
+ .frame_len = RACAL_HR_LEN,
.conv_from_canon = racal_hr_from_canon,
.conv_to_canon = racal_hr_to_canon,
};
static int
-racal_fr_from_canon(uint8_t *dst, const uint8_t *src)
+racal_fr_from_canon(uint8_t *dst, const uint8_t *src, unsigned int src_len)
{
int i;
+ assert(src_len == FR_CANON_LEN);
+
dst[32] = 0x00; /* last nibble won't written, pre-clear it */
for (i=0; i<260; i++) {
@@ -93,14 +103,16 @@
lsb_put_bit(dst, di, msb_get_bit(src, si));
}
- return 0;
+ return RACAL_FR_LEN;
}
static int
-racal_fr_to_canon(uint8_t *dst, const uint8_t *src)
+racal_fr_to_canon(uint8_t *dst, const uint8_t *src, unsigned int src_len)
{
int i;
+ assert(src_len == RACAL_FR_LEN);
+
dst[32] = 0x00; /* last nibble won't written, pre-clear it */
for (i=0; i<260; i++) {
@@ -109,7 +121,7 @@
msb_put_bit(dst, di, lsb_get_bit(src, si));
}
- return 0;
+ return FR_CANON_LEN;
}
const struct format_desc fmt_racal_fr = {
@@ -118,36 +130,40 @@
.name = "racal-fr",
.description = "Racal FR TCH/F recording",
- .frame_len = 33,
+ .frame_len = RACAL_FR_LEN,
.conv_from_canon = racal_fr_from_canon,
.conv_to_canon = racal_fr_to_canon,
};
static int
-racal_efr_from_canon(uint8_t *dst, const uint8_t *src)
+racal_efr_from_canon(uint8_t *dst, const uint8_t *src, unsigned int src_len)
{
int i;
+ assert(src_len == EFR_CANON_LEN);
+
dst[30] = 0x00; /* last nibble won't written, pre-clear it */
for (i=0; i<244; i++)
lsb_put_bit(dst, i, msb_get_bit(src, i));
- return 0;
+ return RACAL_EFR_LEN;
}
static int
-racal_efr_to_canon(uint8_t *dst, const uint8_t *src)
+racal_efr_to_canon(uint8_t *dst, const uint8_t *src, unsigned int src_len)
{
int i;
+ assert(src_len == RACAL_EFR_LEN);
+
dst[30] = 0x00; /* last nibble won't written, pre-clear it */
for (i=0; i<244; i++)
msb_put_bit(dst, i, lsb_get_bit(src, i));
- return 0;
+ return EFR_CANON_LEN;
}
const struct format_desc fmt_racal_efr = {
@@ -156,7 +172,7 @@
.name = "racal-efr",
.description = "Racal EFR TCH/F recording",
- .frame_len = 31,
+ .frame_len = RACAL_EFR_LEN,
.conv_from_canon = racal_efr_from_canon,
.conv_to_canon = racal_efr_to_canon,
};