This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
fixeria gerrit-no-reply at lists.osmocom.orgfixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/gapk/+/16154 )
Change subject: procqueue/ecu: use generic ECU abstraction API
......................................................................
procqueue/ecu: use generic ECU abstraction API
Change-Id: I434a5973add38f92fc2ebe7f16125cfcb8ff9e23
---
M include/osmocom/gapk/codecs.h
M src/Makefile.am
M src/codec_fr.c
D src/ecu_fr.c
M src/pq_ecu.c
5 files changed, 80 insertions(+), 105 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/gapk refs/changes/54/16154/1
diff --git a/include/osmocom/gapk/codecs.h b/include/osmocom/gapk/codecs.h
index 33f6593..253fb14 100644
--- a/include/osmocom/gapk/codecs.h
+++ b/include/osmocom/gapk/codecs.h
@@ -73,9 +73,6 @@
/* Encoding / decoding function pointers */
osmo_gapk_codec_conv_cb_t codec_encode;
osmo_gapk_codec_conv_cb_t codec_decode;
-
- /* ECU (Error Concealment Unit) function */
- osmo_gapk_codec_conv_cb_t ecu_proc;
};
const struct osmo_gapk_codec_desc *
diff --git a/src/Makefile.am b/src/Makefile.am
index 8fdeff7..94d9356 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -46,11 +46,6 @@
pq_ecu.c \
$(NULL)
-# ECU (Error Concealment Unit) implementation
-libosmogapk_la_SOURCES += \
- ecu_fr.c \
- $(NULL)
-
# Formats implementation
libosmogapk_la_SOURCES += \
formats.c \
diff --git a/src/codec_fr.c b/src/codec_fr.c
index 75efeb7..f2ca6e6 100644
--- a/src/codec_fr.c
+++ b/src/codec_fr.c
@@ -83,9 +83,6 @@
#endif /* HAVE_LIBGSM */
-/* Forward declaration of ECU (Error Concealment Unit) function */
-int ecu_proc_fr(void *state, uint8_t *out, const uint8_t *in, unsigned int in_len);
-
const struct osmo_gapk_codec_desc codec_fr_desc = {
.type = CODEC_FR,
.name = "fr",
@@ -99,5 +96,4 @@
.codec_encode = codec_fr_encode,
.codec_decode = codec_fr_decode,
#endif
- .ecu_proc = ecu_proc_fr,
};
diff --git a/src/ecu_fr.c b/src/ecu_fr.c
deleted file mode 100644
index db55fec..0000000
--- a/src/ecu_fr.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* ECU (Error Concealment Unit) for FR */
-
-/*
- * This file is part of GAPK (GSM Audio Pocket Knife).
- *
- * (C) 2018 by Vadim Yanitskiy <axilirator at gmail.com>
- *
- * All Rights Reserved
- *
- * GAPK is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * GAPK is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GAPK. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdint.h>
-#include <string.h>
-#include <assert.h>
-#include <stdbool.h>
-
-#include <osmocom/gapk/codecs.h>
-#include <osmocom/codec/ecu.h>
-
-int
-ecu_proc_fr(void *_state, uint8_t *out, const uint8_t *in, unsigned int in_len)
-{
- struct osmo_ecu_fr_state *state = (struct osmo_ecu_fr_state *) _state;
- bool backup = false;
- bool bfi = true;
- int i, rc;
-
- assert(in_len == FR_CANON_LEN);
-
- /* Check if a frame is BFI */
- for (i = 1; i < in_len; i++) {
- if (in[i] != 0x00) {
- bfi = false;
- break;
- }
- }
-
- /* We have got a good frame, nothing to do */
- if (!bfi) {
- osmo_ecu_fr_reset(state, (uint8_t *) in);
- memcpy(out, in, in_len);
- return in_len;
- }
-
- /* Check if ECU state contains a backup frame */
- for (i = 0; i < in_len; i++) {
- if (state->frame_backup[i] != 0x00) {
- backup = true;
- break;
- }
- }
-
- /* There is no back-up frame */
- if (!backup) {
- /* Copy BFI 'as-is' */
- memcpy(out, in, in_len);
- return in_len;
- }
-
- /* Attempt to perform error concealment */
- rc = osmo_ecu_fr_conceal(state, out);
- if (rc)
- return rc;
-
- return in_len;
-}
diff --git a/src/pq_ecu.c b/src/pq_ecu.c
index fad853c..a9972b1 100644
--- a/src/pq_ecu.c
+++ b/src/pq_ecu.c
@@ -3,7 +3,7 @@
/*
* This file is part of GAPK (GSM Audio Pocket Knife).
*
- * (C) 2018 by Vadim Yanitskiy <axilirator at gmail.com>
+ * (C) 2018-2019 by Vadim Yanitskiy <axilirator at gmail.com>
*
* All Rights Reserved
*
@@ -22,20 +22,69 @@
*/
#include <stdint.h>
+#include <string.h>
#include <talloc.h>
#include <errno.h>
+#include <osmocom/codec/codec.h>
+#include <osmocom/codec/ecu.h>
+
#include <osmocom/gapk/procqueue.h>
#include <osmocom/gapk/logging.h>
#include <osmocom/gapk/formats.h>
#include <osmocom/gapk/codecs.h>
-#include <osmocom/codec/ecu.h>
+/* Empty buffer for quick memcmp() based BFI detection */
+static const uint8_t zero_buf[40] = { 0x00 };
+
+static int
+pq_cb_ecu_proc(void *state, uint8_t *out, const uint8_t *in, unsigned int in_len)
+{
+ struct osmo_ecu_state *ecu_state = state;
+ int bfi, rc;
+
+ /* Check if the input frame is BFI */
+ switch (ecu_state->codec) {
+ case OSMO_ECU_CODEC_HR:
+ bfi = !memcmp(zero_buf, in + 1, GSM_HR_BYTES);
+ break;
+ case OSMO_ECU_CODEC_FR:
+ bfi = !memcmp(zero_buf, in + 1, GSM_FR_BYTES - 1);
+ break;
+ case OSMO_ECU_CODEC_EFR:
+ bfi = !memcmp(zero_buf, in + 1, GSM_EFR_BYTES - 1);
+ break;
+ /* TODO: implement BFI detection (in[0] == AMR_NO_DATA?) */
+ case OSMO_ECU_CODEC_AMR:
+ default:
+ LOGPGAPK(LOGL_FATAL, "Unknown ECU codec\n");
+ OSMO_ASSERT(0);
+ }
+
+ rc = osmo_ecu_frame_in(state, bfi, in, in_len);
+ if (rc) {
+ LOGPGAPK(LOGL_ERROR, "osmo_ecu_frame_in() failed: rc=%d\n", rc);
+ return -EIO;
+ }
+
+ if (bfi) {
+ rc = osmo_ecu_frame_out(state, out);
+ if (rc >= 0)
+ return rc;
+ LOGPGAPK(LOGL_NOTICE, "osmo_ecu_frame_out() failed: rc=%d\n", rc);
+ /* Forward BFI 'as-is' */
+ }
+
+ /* Forward frame 'as-is' */
+ memcpy(out, in, in_len);
+ return in_len;
+}
static void
-clean_up(void *state)
+pq_cb_ecu_exit(void *state)
{
- talloc_free(state);
+ struct osmo_ecu_state *ecu_state = state;
+ osmo_ecu_destroy(ecu_state);
}
/*! Add a ECU block to the processing queue
@@ -47,23 +96,37 @@
const struct osmo_gapk_codec_desc *codec)
{
const struct osmo_gapk_format_desc *fmt;
+ struct osmo_ecu_state *ecu_state;
struct osmo_gapk_pq_item *item;
+ /* Allocate the ECU state */
+ switch (codec->type) {
+ case CODEC_HR:
+ ecu_state = osmo_ecu_init(pq, OSMO_ECU_CODEC_HR);
+ break;
+ case CODEC_FR:
+ ecu_state = osmo_ecu_init(pq, OSMO_ECU_CODEC_FR);
+ break;
+ case CODEC_EFR:
+ ecu_state = osmo_ecu_init(pq, OSMO_ECU_CODEC_EFR);
+ break;
+ /* FIXME: we need to know how to detect AMR BFI */
+ case CODEC_AMR:
+ default:
+ ecu_state = NULL;
+ break;
+ }
+
/* Make sure that a codec has corresponding ECU implementation */
- if (codec->ecu_proc == NULL) {
+ if (ecu_state == NULL) {
LOGPGAPK(LOGL_ERROR, "Codec '%s' has no ECU implementation\n", codec->name);
return -ENOTSUP;
}
/* Allocate a new item to the processing queue */
item = osmo_gapk_pq_add_item(pq);
- if (!item)
- return -ENOMEM;
-
- /* Allocate the ECU state */
- item->state = talloc_zero(item, struct osmo_ecu_fr_state);
- if (!item->state) {
- talloc_free(item);
+ if (!item) {
+ osmo_ecu_destroy(ecu_state);
return -ENOMEM;
}
@@ -72,9 +135,11 @@
item->len_in = fmt->frame_len;
item->len_out = fmt->frame_len;
- item->proc = codec->ecu_proc;
- item->exit = &clean_up;
- item->wait = NULL;
+ talloc_steal(item, ecu_state);
+ item->state = ecu_state;
+
+ item->proc = &pq_cb_ecu_proc;
+ item->exit = &pq_cb_ecu_exit;
/* Meta information */
item->type = OSMO_GAPK_ITEM_TYPE_PROC;
--
To view, visit https://gerrit.osmocom.org/c/gapk/+/16154
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: gapk
Gerrit-Branch: master
Gerrit-Change-Id: I434a5973add38f92fc2ebe7f16125cfcb8ff9e23
Gerrit-Change-Number: 16154
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <axilirator at gmail.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20191121/44e1a82d/attachment.htm>