diff options
author | Antoine Soulier <asoulier@google.com> | 2023-02-15 15:30:23 -0800 |
---|---|---|
committer | Antoine Soulier <asoulier@google.com> | 2023-02-15 15:30:23 -0800 |
commit | 22c2d3969ee64ac89d0de6e4300630c23c426a15 (patch) | |
tree | 1eb52e75447a8c9af78fb5fca4f70e0f505d4c96 | |
parent | f34f4654d6c319415de718f45ff6ec73135058de (diff) | |
download | liblc3-22c2d3969ee64ac89d0de6e4300630c23c426a15.tar.gz |
feature: Make encoder/decoder states relocatable
-rw-r--r-- | include/lc3_private.h | 11 | ||||
-rw-r--r-- | src/lc3.c | 66 | ||||
-rw-r--r-- | test/ctypes.h | 35 |
3 files changed, 61 insertions, 51 deletions
diff --git a/include/lc3_private.h b/include/lc3_private.h index 90bae7b..c4d6703 100644 --- a/include/lc3_private.h +++ b/include/lc3_private.h @@ -107,8 +107,8 @@ struct lc3_encoder { lc3_ltpf_analysis_t ltpf; lc3_spec_analysis_t spec; - int16_t *xt; - float *xs, *xd, s[1]; + int xt_off, xs_off, xd_off; + float x[1]; }; #define LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz) \ @@ -118,7 +118,7 @@ struct lc3_encoder { #define LC3_ENCODER_MEM_T(dt_us, sr_hz) \ struct { \ struct lc3_encoder __e; \ - float __s[LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz)-1]; \ + float __x[LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz)-1]; \ } @@ -145,7 +145,8 @@ struct lc3_decoder { lc3_ltpf_synthesis_t ltpf; lc3_plc_state_t plc; - float *xh, *xs, *xd, *xg, s[1]; + int xh_off, xs_off, xd_off, xg_off; + float x[1]; }; #define LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz) \ @@ -155,7 +156,7 @@ struct lc3_decoder { #define LC3_DECODER_MEM_T(dt_us, sr_hz) \ struct { \ struct lc3_decoder __d; \ - float __s[LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz)-1]; \ + float __x[LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz)-1]; \ } @@ -157,8 +157,8 @@ static void load_s16( enum lc3_dt dt = encoder->dt; enum lc3_srate sr = encoder->sr_pcm; - int16_t *xt = encoder->xt; - float *xs = encoder->xs; + int16_t *xt = (int16_t *)encoder->x + encoder->xt_off; + float *xs = encoder->x + encoder->xs_off; int ns = LC3_NS(dt, sr); for (int i = 0; i < ns; i++, pcm += stride) @@ -178,8 +178,8 @@ static void load_s24( enum lc3_dt dt = encoder->dt; enum lc3_srate sr = encoder->sr_pcm; - int16_t *xt = encoder->xt; - float *xs = encoder->xs; + int16_t *xt = (int16_t *)encoder->x + encoder->xt_off; + float *xs = encoder->x + encoder->xs_off; int ns = LC3_NS(dt, sr); for (int i = 0; i < ns; i++, pcm += stride) { @@ -201,8 +201,8 @@ static void load_s24_3le( enum lc3_dt dt = encoder->dt; enum lc3_srate sr = encoder->sr_pcm; - int16_t *xt = encoder->xt; - float *xs = encoder->xs; + int16_t *xt = (int16_t *)encoder->x + encoder->xt_off; + float *xs = encoder->x + encoder->xs_off; int ns = LC3_NS(dt, sr); for (int i = 0; i < ns; i++, pcm += 3*stride) { @@ -228,8 +228,8 @@ static void load_float( enum lc3_dt dt = encoder->dt; enum lc3_srate sr = encoder->sr_pcm; - int16_t *xt = encoder->xt; - float *xs = encoder->xs; + int16_t *xt = (int16_t *)encoder->x + encoder->xt_off; + float *xs = encoder->x + encoder->xs_off; int ns = LC3_NS(dt, sr); for (int i = 0; i < ns; i++, pcm += stride) { @@ -253,9 +253,9 @@ static void analyze(struct lc3_encoder *encoder, int ns = LC3_NS(dt, sr_pcm); int nt = LC3_NT(sr_pcm); - int16_t *xt = encoder->xt; - float *xs = encoder->xs; - float *xd = encoder->xd; + int16_t *xt = (int16_t *)encoder->x + encoder->xt_off; + float *xs = encoder->x + encoder->xs_off; + float *xd = encoder->x + encoder->xd_off; float *xf = xs; /* --- Temporal --- */ @@ -301,7 +301,7 @@ static void encode(struct lc3_encoder *encoder, enum lc3_dt dt = encoder->dt; enum lc3_srate sr = encoder->sr; enum lc3_bandwidth bw = side->bw; - float *xf = encoder->xs; + float *xf = encoder->x + encoder->xs_off; lc3_bits_t bits; @@ -363,12 +363,12 @@ struct lc3_encoder *lc3_setup_encoder( .dt = dt, .sr = sr, .sr_pcm = sr_pcm, - .xt = (int16_t *)encoder->s + nt, - .xs = encoder->s + (nt+ns)/2, - .xd = encoder->s + (nt+ns)/2 + ns, + .xt_off = nt, + .xs_off = (nt + ns) / 2, + .xd_off = (nt + ns) / 2 + ns, }; - memset(encoder->s, 0, + memset(encoder->x, 0, LC3_ENCODER_BUFFER_COUNT(dt_us, sr_pcm_hz) * sizeof(float)); return encoder; @@ -425,7 +425,7 @@ static void store_s16( enum lc3_dt dt = decoder->dt; enum lc3_srate sr = decoder->sr_pcm; - float *xs = decoder->xs; + float *xs = decoder->x + decoder->xs_off; int ns = LC3_NS(dt, sr); for ( ; ns > 0; ns--, xs++, pcm += stride) { @@ -447,7 +447,7 @@ static void store_s24( enum lc3_dt dt = decoder->dt; enum lc3_srate sr = decoder->sr_pcm; - float *xs = decoder->xs; + float *xs = decoder->x + decoder->xs_off; int ns = LC3_NS(dt, sr); for ( ; ns > 0; ns--, xs++, pcm += stride) { @@ -470,7 +470,7 @@ static void store_s24_3le( enum lc3_dt dt = decoder->dt; enum lc3_srate sr = decoder->sr_pcm; - float *xs = decoder->xs; + float *xs = decoder->x + decoder->xs_off; int ns = LC3_NS(dt, sr); for ( ; ns > 0; ns--, xs++, pcm += 3*stride) { @@ -497,7 +497,7 @@ static void store_float( enum lc3_dt dt = decoder->dt; enum lc3_srate sr = decoder->sr_pcm; - float *xs = decoder->xs; + float *xs = decoder->x + decoder->xs_off; int ns = LC3_NS(dt, sr); for ( ; ns > 0; ns--, xs++, pcm += stride) { @@ -519,7 +519,7 @@ static int decode(struct lc3_decoder *decoder, enum lc3_dt dt = decoder->dt; enum lc3_srate sr = decoder->sr; - float *xf = decoder->xs; + float *xf = decoder->x + decoder->xs_off; int ns = LC3_NS(dt, sr); int ne = LC3_NE(dt, sr); @@ -566,14 +566,16 @@ static void synthesize(struct lc3_decoder *decoder, enum lc3_srate sr = decoder->sr; enum lc3_srate sr_pcm = decoder->sr_pcm; - float *xf = decoder->xs; + float *xf = decoder->x + decoder->xs_off; int ns = LC3_NS(dt, sr_pcm); int ne = LC3_NE(dt, sr); - float *xg = decoder->xg; - float *xd = decoder->xd; + float *xg = decoder->x + decoder->xg_off; float *xs = xf; + float *xd = decoder->x + decoder->xd_off; + float *xh = decoder->x + decoder->xh_off; + if (side) { enum lc3_bandwidth bw = side->bw; @@ -594,7 +596,7 @@ static void synthesize(struct lc3_decoder *decoder, } lc3_ltpf_synthesize(dt, sr_pcm, nbytes, &decoder->ltpf, - side && side->pitch_present ? &side->ltpf : NULL, decoder->xh, xs); + side && side->pitch_present ? &side->ltpf : NULL, xh, xs); } /** @@ -608,8 +610,8 @@ static void complete(struct lc3_decoder *decoder) int nh = LC3_NH(dt, sr_pcm); int ns = LC3_NS(dt, sr_pcm); - decoder->xs = decoder->xs - decoder->xh < nh - ns ? - decoder->xs + ns : decoder->xh; + decoder->xs_off = decoder->xs_off - decoder->xh_off < nh - ns ? + decoder->xs_off + ns : decoder->xh_off; } /** @@ -650,15 +652,15 @@ struct lc3_decoder *lc3_setup_decoder( .dt = dt, .sr = sr, .sr_pcm = sr_pcm, - .xh = decoder->s, - .xs = decoder->s + nh-ns, - .xd = decoder->s + nh, - .xg = decoder->s + nh+nd, + .xh_off = 0, + .xs_off = nh - ns, + .xd_off = nh, + .xg_off = nh + nd, }; lc3_plc_reset(&decoder->plc); - memset(decoder->s, 0, + memset(decoder->x, 0, LC3_DECODER_BUFFER_COUNT(dt_us, sr_pcm_hz) * sizeof(float)); return decoder; diff --git a/test/ctypes.h b/test/ctypes.h index 6a39a32..2442657 100644 --- a/test/ctypes.h +++ b/test/ctypes.h @@ -726,13 +726,14 @@ static PyObject *from_encoder(PyObject *obj, const struct lc3_encoder *enc) from_spec_analysis(NULL, &enc->spec)); PyDict_SetItemString(obj, "xt", - new_1d_copy(NPY_INT16, nt+ns, enc->xt-nt)); + new_1d_copy(NPY_INT16, nt+ns, + (int16_t *)enc->x + enc->xt_off - nt)); PyDict_SetItemString(obj, "xs", - new_1d_copy(NPY_FLOAT, ns, enc->xs)); + new_1d_copy(NPY_FLOAT, ns, enc->x + enc->xs_off)); PyDict_SetItemString(obj, "xd", - new_1d_copy(NPY_FLOAT, nd, enc->xd)); + new_1d_copy(NPY_FLOAT, nd, enc->x + enc->xd_off)); return obj; } @@ -772,15 +773,18 @@ static PyObject *to_encoder(PyObject *obj, struct lc3_encoder *enc) PyDict_GetItemString(obj, "quant"), &enc->spec)); CTYPES_CHECK("encoder.xt", xt_obj = to_1d_copy( - PyDict_GetItemString(obj, "xt"), NPY_INT16, enc->xt-nt, ns+nt)); + PyDict_GetItemString(obj, "xt"), NPY_INT16, + (int16_t *)enc->x + enc->xt_off - nt, ns+nt)); PyDict_SetItemString(obj, "xt", xt_obj); CTYPES_CHECK("encoder.xs", xs_obj = to_1d_copy( - PyDict_GetItemString(obj, "xs"), NPY_FLOAT, enc->xs, ns)); + PyDict_GetItemString(obj, "xs"), NPY_FLOAT, + enc->x + enc->xs_off, ns)); PyDict_SetItemString(obj, "xs", xs_obj); CTYPES_CHECK("encoder.xd", xd_obj = to_1d_copy( - PyDict_GetItemString(obj, "xd"), NPY_FLOAT, enc->xd, nd)); + PyDict_GetItemString(obj, "xd"), NPY_FLOAT, + enc->x + enc->xd_off, nd)); PyDict_SetItemString(obj, "xd", xd_obj); return obj; @@ -791,7 +795,7 @@ static PyObject *from_decoder(PyObject *obj, const struct lc3_decoder *dec) { unsigned dt = dec->dt, sr = dec->sr; unsigned sr_pcm = dec->sr_pcm; - unsigned xs_pos = dec->xs - dec->xh; + unsigned xs_pos = dec->xs_off - dec->xh_off; int nh = LC3_NH(dt, sr); int ns = LC3_NS(dt, sr); int nd = LC3_ND(dt, sr); @@ -814,16 +818,16 @@ static PyObject *from_decoder(PyObject *obj, const struct lc3_decoder *dec) new_plc_state(&dec->plc)); PyDict_SetItemString(obj, "xh", - new_1d_copy(NPY_FLOAT, nh, dec->xh)); + new_1d_copy(NPY_FLOAT, nh, dec->x + dec->xh_off)); PyDict_SetItemString(obj, "xs_pos", new_scalar(NPY_INT, &xs_pos)); PyDict_SetItemString(obj, "xd", - new_1d_copy(NPY_FLOAT, nd, dec->xd)); + new_1d_copy(NPY_FLOAT, nd, dec->x + dec->xd_off)); PyDict_SetItemString(obj, "xg", - new_1d_copy(NPY_FLOAT, ns, dec->xg)); + new_1d_copy(NPY_FLOAT, ns, dec->x + dec->xg_off)); return obj; } @@ -860,19 +864,22 @@ static PyObject *to_decoder(PyObject *obj, struct lc3_decoder *dec) PyDict_GetItemString(obj, "plc"), &dec->plc)); CTYPES_CHECK("decoder.xh", xh_obj = to_1d_copy( - PyDict_GetItemString(obj, "xh"), NPY_FLOAT, dec->xh, nh)); + PyDict_GetItemString(obj, "xh"), NPY_FLOAT, + dec->x + dec->xh_off, nh)); PyDict_SetItemString(obj, "xh", xh_obj); CTYPES_CHECK("decoder.xs", to_scalar( PyDict_GetItemString(obj, "xs_pos"), NPY_INT, &xs_pos)); - dec->xs = dec->xh + xs_pos; + dec->xs_off = dec->xh_off + xs_pos; CTYPES_CHECK("decoder.xd", xd_obj = to_1d_copy( - PyDict_GetItemString(obj, "xd"), NPY_FLOAT, dec->xd, nd)); + PyDict_GetItemString(obj, "xd"), NPY_FLOAT, + dec->x + dec->xd_off, nd)); PyDict_SetItemString(obj, "xd", xd_obj); CTYPES_CHECK("decoder.xg", xg_obj = to_1d_copy( - PyDict_GetItemString(obj, "xg"), NPY_FLOAT, dec->xg, ns)); + PyDict_GetItemString(obj, "xg"), NPY_FLOAT, + dec->x + dec->xg_off, ns)); PyDict_SetItemString(obj, "xg", xg_obj); return obj; |