diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-05-28 14:17:05 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-05-28 16:18:09 +0200 |
commit | 848db7b6622261c105495efb3f3cc7e9ab78551a (patch) | |
tree | 4007c570bbcff11cbcfbe83b2fca5dabb8065385 /src | |
parent | dc3589a6be66f00730860f2b70a86a98183f885a (diff) |
Add support for RTP with GSM-HR payload according to RFC5993
This is incompatible with the ETSI TS 101 318 format!
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/fmt_rtp_hr_ietf.c | 80 | ||||
-rw-r--r-- | src/formats.c | 2 |
3 files changed, 83 insertions, 1 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index f45dcde..e0b622c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,7 +7,7 @@ AM_LDFLAGS=$(LIBOSMOCODEC_LIBS) $(LIBOSMOCORE_LIBS) \ COM_SOURCES = procqueue.c pq_file.c pq_format.c pq_codec.c pq_rtp.c pq_alsa.c \ formats.c fmt_amr.c fmt_gsm.c fmt_hr_ref.c fmt_racal.c \ fmt_amr_opencore.c \ - fmt_rtp_amr.c fmt_rtp_efr.c fmt_rtp_hr_etsi.c \ + fmt_rtp_amr.c fmt_rtp_efr.c fmt_rtp_hr_etsi.c fmt_rtp_hr_ietf.c \ fmt_rawpcm.c fmt_ti.c benchmark.c \ codecs.c codec_pcm.c codec_hr.c codec_fr.c codec_efr.c codec_amr.c diff --git a/src/fmt_rtp_hr_ietf.c b/src/fmt_rtp_hr_ietf.c new file mode 100644 index 0000000..57da9c9 --- /dev/null +++ b/src/fmt_rtp_hr_ietf.c @@ -0,0 +1,80 @@ +/* HR RTP Payload according to RFC5993. Incompatible with ETSI TS 101 318! */ +/* (C) 2017 by Harald Welte <laforge@gnumonks.org> */ + +/* + * This file is part of gapk (GSM Audio Pocket Knife). + * + * 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 <assert.h> +#include <string.h> + +#include <gapk/codecs.h> +#include <gapk/formats.h> +#include <gapk/utils.h> + +#define HR_LEN (HR_CANON_LEN+1) + +/* See Section 5.2 of RFC5993 */ +enum rtp_hr_ietf_ft { + FT_GOOD_SPEECH = 0, + FT_GOOD_SID = 2, + FT_NO_DATA = 7, +}; + +/* conversion function: RTP payload -> canonical format */ +static int +rtp_hr_ietf_from_canon(uint8_t *dst, const uint8_t *src, unsigned int src_len) +{ + enum rtp_hr_ietf_ft ft; + + /* according to RFC5993 */ + assert(src_len == HR_CANON_LEN); + + /* TODO: Determine SID frames / NO_DATA frames */ + ft = FT_GOOD_SPEECH; + /* Add ToC byte */ + dst[0] = ((ft & 0x7) << 4); + + /* copy codec payload */ + memcpy(dst+1, src, src_len); + + return HR_CANON_LEN; +} + +/* conversion function: canonical format -> RTP payload */ +static int +rtp_hr_ietf_to_canon(uint8_t *dst, const uint8_t *src, unsigned int src_len) +{ + /* according to RFC5993 */ + assert(src_len == HR_LEN); + + /* Remove ToC byte */ + memcpy(dst, src+1, HR_CANON_LEN); + + return HR_CANON_LEN; +} + +const struct format_desc fmt_rtp_hr_ietf = { + .type = FMT_RTP_HR_IETF, + .codec_type = CODEC_HR, + .name = "rtp-hr-ietf", + .description = "RTP payload for HR according to IETF RFC5993", + + .frame_len = HR_LEN, + .conv_from_canon = rtp_hr_ietf_from_canon, + .conv_to_canon = rtp_hr_ietf_to_canon, +}; diff --git a/src/formats.c b/src/formats.c index 655a7be..60182fe 100644 --- a/src/formats.c +++ b/src/formats.c @@ -38,6 +38,7 @@ extern const struct format_desc fmt_amr_opencore; extern const struct format_desc fmt_rtp_amr; extern const struct format_desc fmt_rtp_efr; extern const struct format_desc fmt_rtp_hr_etsi; +extern const struct format_desc fmt_rtp_hr_ietf; static const struct format_desc *supported_formats[_FMT_MAX] = { [FMT_INVALID] = NULL, @@ -56,6 +57,7 @@ static const struct format_desc *supported_formats[_FMT_MAX] = { [FMT_RTP_AMR] = &fmt_rtp_amr, [FMT_RTP_EFR] = &fmt_rtp_efr, [FMT_RTP_HR_ETSI] = &fmt_rtp_hr_etsi, + [FMT_RTP_HR_IETF] = &fmt_rtp_hr_ietf, }; |